Saltar al contenido

Recorrer todas las ocurrencias de un registro muy muy lento


Recommended Posts

publicado

Hola a todos! como estan? 

recientemente me he sumando al foro, aunque lo he seguido hace mucho, son siempre mi referencia para cualquier duda o consulta asi que feliz de poder sumarme...

Ahora tengo un problema que me esta rompiendo la cabeza hace dos semanas, y me atasque.

Tengo una base de registros con mas de 170000 filas, cada registro puede tener mas de una fila, la base esta en la hoja 1.

Luego en la hoja dos tengo dos tablas, una a la izquierda que tiene esos mismos registros y su codigo U (ubicacion), sin duplicados.  Otra tabla mas a la derecha que agrupa los Codigo de Usos de cada  registros segun la categoria sea  Seccional, Division o Central.

 

Lo que necesito hacer es que por cada num de registro y cod U, busque en la hoja 1, si en alguna fila tiene un codigo de uso que este agrupado en seccion, division o central, y si es asi, que marque con una X la columna con el categoria.

hoja2 a modo de ejemplo

image.thumb.png.81aaab0ee7d2b9c2188c586521731579.png

ejemplo para el registro 298796 de SAN NIC.  si busco ese registro en la hoja 1 encuentro que sola una categoria tiene, que es la Division, pero para eso tuve que recorrer todas las ocurrencias de este registro que coincidan con la ubicacion san nic. y chequear cada categoria.

 

 

Probe de mil formas pero todas son lentisimas.  mas de diez minutos de ejecucion.

Sabiendo que son mas de 170 mil y que por cada uno tengo que recorrer todas las ocurrencias, hay alguna forma de hacerlo mas rapido?
 

Agradezco por favor si alguien me ayuda a salir de este punto... que me tiene mal.

 

subo archivo de ejemplo... 

test (1).zip vba.txt

publicado

Sube un archivo con un ejemplo de lo que tienes y de lo que quieres, no hace falta que la muestra sea muy extensa.

publicado

Hola Antoni! perdon me olvide de subir el archivo, aca va el codigo por un lado y el excel con nada casi por otro

queria que queden varios registros de distintas Cod U, y fue imposible... no se si sirvan de ejemplo asi tan tan resumido

vba.txt test (1).zip

publicado

Probé combinando Bubles de recorrido y Loop, , pero es un doble recorrido, por un lado recorrer la hoja uno para encontrar el numero de registro y el Cod U, que coincida, y luego hacer un find next, para buscar todas las ocurrencias de ese registro en ese codigo de U, e ir marcando cuando encuentre alguno de los codigos de uso que esta en la hoja 2, y luego recien saltar a la siguiente fila de la hoja 2...

las ultima vez que me anduvo tardo 11 min solo en hacer eso ?

publicado

El archivo .zip da error al intentar descomprimirlo.

Súbelo como .xlsx o súbelo a la nube (Mega, OneDrive, DropBox,......) y adjunta el enlace público

publicado

test xls.rar Antoni, ahi he probado de nuevo, simplificando en una hoja la base de datos, y al costado la tabla que deberia ser resultado , y junto a ella la tabla con los criterios a buscar por cada registro, el xls por mas que deje 5 filas no me lo sube, va de nuevo comprimido, y sino tmb por las dudas ? AQUI

 

Miles de gracias

publicado

No he podido probar la macro porqué al archivo que has subido le falta la hoja CoCo, aunque la he revisado y no parece tener excesivos problemas más allá del volumen de información.

En cualquier caso, añadiendo Application.ScreenUpdating=False al principio de la macro, el rendimiento debería mejorar bastante .

publicado
hace 25 minutos , Antoni dijo:

No he podido probar la macro porqué al archivo que has subido le falta la hoja CoCo, aunque la he revisado y no parece tener excesivos problemas más allá del volumen de información.

En cualquier caso, añadiendo Application.ScreenUpdating=False al principio de la macro, el rendimiento debería mejorar bastante .

Gracias Antoni, por tomarte el tiempo de revisarlo...pero con la limitante que no me deja subir casi nada, tuve que eliminar hoy y eliminar cientos dy miles de registros, para poder subir el ejemplo... 

Application.ScreenUpdating=False ya lo he agregado porque ese codigo se ejecuta dentro de otro, asi que esto esta activo, pero corriendo solo la parte que comparti me demora mas de 10 minutos... y sigo dando vueltas sin encontrar alguna otra forma, teniendo en cuenta que son mas de 170 mil

Estoy totalmente perdida, probe combinar match index etc, y no me funciona nada. asi como esta funciona pero excesivamente lento, se que tiene que a ver algo que lo optimice, pero sigo sin encontrarlo, no puedo avanzar de ahi ?

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Hola, veo que tienes 365, así que esta forma funcionará   Almacen.xlsx
    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.