Excel - Buscar articulos con fechas de expiracion

 
Vista:
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Buscar articulos con fechas de expiracion

Publicado por Juan (184 intervenciones) el 29/03/2021 11:59:08
Hola estimados, tengo un código que extrae de una tabla base (Inv QAD) el stock de artículos que tengan el mismo almacén (200 o 200VR) con estatus Stock liberado y los coloca en una hoja (Refrigerado) donde coincidan los códigos con sus respectivas fechas de expiración. La macro trabaja bien, el problema es que el proceso corre muy lento. ¿Hay alguna forma de mejorar el bucle del código para sea más rápido el proceso?? Les estoy enviando el archivo para mejor evaluación.

Este es el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Private Sub CommandButton1_Click()
Dim old&, FilaB&, FilaC&, FilaA&, ColumnaD&
Dim WS1 As Worksheet
Dim WS2 As Worksheet
Dim Origen, FechExP, AlmacenInv, ArticuloInventario, EstatusInv
Dim Sumar, Numeracion, Ref, Col, Fila
Dim QAD As Range
Dim Expiracion As Range
Worksheets("Refrigerado").Range("C6:DC68").Value = Empty
 
With Application
.ScreenUpdating = False
old = .Calculation
.Calculation = xlCalculationManual
.EnableEvents = False
End With
 
Set WS1 = Worksheets("Inv QAD")
Set WS2 = Worksheets("Refrigerado")
 
FilaA = 2
While WS1.Cells(FilaA, 1).Value <> ""
      FilaA = FilaA + 1
Wend
 
ColumnaD = 3
While WS2.Cells(4, ColumnaD).Value <> ""
     ColumnaD = ColumnaD + 1
Wend
 
FilaC = 6
While WS2.Cells(FilaC, 2).Value <> ""
     FilaC = FilaC + 1
Wend
 
For Col = 3 To ColumnaD
 
For Fila = 6 To FilaC
Sumar = 0#
For Each QAD In WS1.Range("A2:A" & FilaA - 1)
    AlmacenInv = QAD.Offset(, 0).Value
    ArticuloInventario = QAD.Offset(, 2).Value
    EstatusInv = QAD.Offset(, 15).Value
    Origen = QAD.Offset(, 13).Value
    FechExP = QAD.Offset(, 8).Value
        If (AlmacenInv = 200 Or UCase(AlmacenInv) = "200VR") And UCase(EstatusInv) = "STOCK LIB" And _
            UCase(Origen) = "PLF" And WS2.Cells(4, Col).Value = ArticuloInventario Then
                   If WS2.Cells(Fila, 2).Value = FechExP Then
                      Sumar = Sumar + QAD.Offset(, 6).Value
                      WS2.Cells(Fila, Col).Value = Sumar
                   End If
            End If
        Next
    Next Fila
Next Col
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Buscar articulos con fechas de expiracion

Publicado por Antoni Masana (2477 intervenciones) el 29/03/2021 19:10:50
He intentado entender que hace la macro y creo que tengo una pequeña idea.

Para cada elemento (Artículo) de la HOJA 1 (Inv QAD) recorres las 100 columna de la HOJA2 y para cara columna la 69 filas.
Esto me da un total de 2.918.700 bucles.

Vamos a hacerlo más rápido que no es mas sencillo.

Paso 1
- Cuentas la columnas de la hoja 2 y creas una tabla de Numero de columnas x 2 ( Ejem: Tabla_1(nc,2) )
- Rellenas el primer elemento de la tablas con el valor de la celda de la fila 4 y el segundo con el numero de columna.
- Ordenas la tabla por el nombre


Paso 2
- Cuentas la Filas de la hoja 2 y creas una tabla de Numero de filas x 2 ( Ejem: Tabla_2(nf,2) )
- Rellenas el primer elemento de la tablas con el valor de la celda de la Columna 2 y el segundo con el numero de fila.
- Ordenas la tabla por el nombre.

Paso 3
Creas una tabla con el numero de filas y columnas de los pasos anteriores.

Paso 4
Recorres la filas de la hoja 1 y a la hora de comparar el artículo usas la tabla1 y a la hora de comparar la fecha usas la tabla2.
Con las referencias de la tabla1 y tabla2 guardas suma en la tabla3

Paso 5
Escribes la la tabla 3 en la hoja 2 (los indices de la tabla debe corresponder la las referencias de la celda, Fila - Columna

OBSERVACION:
¿Te preguntaras para que hemos ordenado las tablas 1 y 2? Pues para buscar de forma más rápida y eficaz. Y esto se hace programando un poco.

Te explico el método, hay más pero no los se todos.
El facil es buscar mientras sea menor o igual y cuando lo encuentra finaliza.
El más complejo es buscar en la mitad y a partir de ahí saltar de mitad en mitad. Me explico:

Tenemos 512 elemento
- Busco en el 265 justo la mitad.
- Si es mayor sumo 126 y si es menor resto 126.
- Si es mayor sumo 64 y si es menor resto 64.
- Si es mayor sumo 32 y si es menor resto 32.
- Si es mayor sumo 16 y si es menor resto 16.
- Si es mayor sumo 8 y si es menor resto 8.

y así hasta sumar 1 o que encuentre la coincidencia.

Es más complejo de programar pero más rápido buscando y con solo 9 comparaciones como máximo encuentro el elemento esté donde esté.

Esto parece muy complicado de programar pero se en lugar de 400 artículos son 9000 y en la segunda hoja en vez de 100 hay 500 el tiempo de cálculo aumenta exponencialmente.

Quitando lo de ordenar las tablas y consultar las tablas en lugar de la hoja ya ganas bastante tiempo.

Te adjunto un libro con la estructura de búsqueda, para pocos elementos y pocas veces no se nota la diferencia pero si tienes que buscar 1 millón de veces en una tabla de un millón de elementos la diferencia es brutal.

Ya me contaras.


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Buscar articulos con fechas de expiracion

Publicado por Juan (184 intervenciones) el 30/03/2021 10:40:05
Hola Estimado Antoni, Lo veo muy engorroso la estructura por favor me gustaria que sea mas especifico, la idea lo puede plasmar en el archivo que envie? se lo agradeceria.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Buscar articulos con fechas de expiracion

Publicado por Antoni Masana (2477 intervenciones) el 30/03/2021 16:12:23
Te adjunto dos versiones.

La V1 es la macro más sencilla, tu macro me tardaba 39 segundos, esta me tarda 0,14 segundos.
La V2 es la más sencilla y sin macros, usando las Tablas Dinámicas, he puesto tres ejemplos de presentación de tabla.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Buscar articulos con fechas de expiracion

Publicado por Juan (184 intervenciones) el 31/03/2021 01:11:21
Hola Antoni Masana,
La version 2 con tablas dinamicas es muy buena idea y al inicio lo habia pensado. Pero finalmente lo que se quiere es que se mantenga el formato original del reporte porque despues quiero agregarle mas cosas.

La version 1 es la que mas se podria acercar a lo que se quiere pero todavía mantiene errores el reporte. Revisando solo los articulos 310101-310102-310103-401011 en el reporte Refrigerados no se muestra ninguna caja, sin embargo en la tabla base (Inv QAD) se reportan varias cantidades. te adjunto ambas imágenes para que lo revises por favor.

Otro apunte adicional, la idea es que la tabla base (Inv QAD) se mantenga el reporte original, con todos los Almacenes: 200 y 200VR, 300 y 300VR 400 y 400VR 500 y 500VR.

Articulo-310101-310102-310103-401011
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Buscar articulos con fechas de expiracion

Publicado por Antoni Masana (2477 intervenciones) el 30/03/2021 23:31:31
No entiendo el propósito del video.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 30/03/2021 20:57:20
Hola, estimado Juan, en el video solo se muestra el video de la hoja (Refrigerado), no se observa el codigo. Por favor, enviar la parte del codigo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 40
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Jua Carlos (54 intervenciones) el 30/03/2021 21:20:25
Con este IF:
1
2
3
4
5
6
7
8
If (AlmacenInv = 200 Or UCase(AlmacenInv) = "200VR") And UCase(EstatusInv) = "STOCK LIB" And _
    UCase(Origen) = "PLF" And WS2.Cells(4, Col).Value = ArticuloInventario Then
           If WS2.Cells(Fila, 2).Value = FechExP Then
              Sumar = Sumar + QAD.Offset(, 6).Value
              WS2.Cells(Fila, Col).Value = Sumar
           End If
    End If
Next

Estas comparaciones se repiten muchas veces:
1
2
AlmacenInv = 200 Or UCase(AlmacenInv) = "200VR") And UCase(EstatusInv) = "STOCK LIB" And _
            UCase(Origen) = "PLF"
Reduciendo la cantidad de comparaciones, consigues reducir el tiempo de todo el proceso
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 30/03/2021 23:29:58
Estimado, Juan Carlos, pero cual es la corrección de código ? no observo ningun codigo modificado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 40
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Jua Carlos (54 intervenciones) el 30/03/2021 23:55:49
Si necesitas el codigo vba puedes escribirme a mi correo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 31/03/2021 00:39:43
Estimado Antoni, la version 3 no trabaja bien. porque revisando solo el articulo 411429 solo carga la cantidad 31cajas con fecha de expiración 03-06-2017, sin embargo en la tabla base (Inv QAD) se reportan mas cantidades. te adjunto ambas imágenes para que lo revises por favor.
Ademas veo que filtraste la tabla base solo Almacenes 200 y 200VR, no era la idea porque utilizare el mismo reporte para para otros almacenes como: 300, 300VR-400,400VR-500,500VR.

En el comand button "Stock por Fechas" coloque Call Macro, para que cargue el código desarrollado.


Articulo-411429
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 31/03/2021 17:29:52
He creado un libro con tres hojas de resultado (Refrigerado) y las tres macros y voy a investigar que es lo que falla, las tres deben dar el mismo resultado.

Cuando funcionen bien te contesto.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 31/03/2021 19:02:57
Ya lo tengo arreglado

Te adjunto un libro con las tres macros y tres hoja Refrigerado para comparar los resultados.
Cada macro escribe en su hoja.
Además he puesto un mensaje cuando termina la macro que dice cuanto tiempo tarda.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 01/04/2021 11:27:24
Hola Antoni, recien adapte los codigos que me enviaste, pero voy a revisar por lo menos unos 20 registros por cada modelo de codigo para asegurarme que esta rescatando al 100%, luego confirmo.
Mas bien queria hacerte una consulta, la tabla base (Inv QAD) tiene 2,000 registros aprox. pero que estos podrían triplicarse o mas en algun momento, como haria la busqueda ingresando el codigo de articulo en un texbox y que me rescate los articulos que tengan stock liberados con su respectiva ubicacion y sus cantidades. Yo no tengo problemas en realizar el código, pero el problema es que todavía me falta obtener la velocidad mas rapida para que rescate esos registros.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 01/04/2021 15:30:49
No entiendo que quieres decir con: me rescate los artículos que tengan stock liberados con su respectiva ubicación y sus cantidades
Independientemente de lo que sea puedes usar los autofiltros

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 01/04/2021 17:51:54
Me refiero ingresando en dos texbox el almacén y la ubicación me rescate en una nueva hoja los registros asociados a el, y al final de ese registro me envie el total de cajas. asi como esta en la imagen. La idea es que sea un codigo que su proceso sea rápido porque la tabla base (Inv QAD) a futuro puede triplicar o aumentar aun mas sus registros
400-SMU
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 01/04/2021 20:01:24
Se puede hacer de muchas formas.
Rápido es el Autofiltro (no da total), el Filtro Avanzado (no da total) o las Tablas Dinámicas (si da total).

NOTA: Cuando digo macro me refiero a formulario con sus TextBox y Botón.

Se puede hacer una macro que oculte las filas que no cumplen y ponga el total en la primera fila vacía (En rojo para destacar)
Se puede hacer una macro que copie las filas que cumplen en otra hoja ponga el total en la primera fila vacía (En rojo para destacar)

Y para el primer caso una macro para mostrar todo y borrar total.
Y para el segundo caso antes de copiar limpia la hoja.

Se puede hacer siempre en la misma hoja o crear hoja nueva para cada consulta diferente.
Me explico:

Consulta 1: Almacén 400 - Ubicación: SMU - Crea la hoja "400-SMU"
Consulta 2: Almacén 200 - Ubicación: SISA - Crea la hoja "200-SISA"
Consulta 3: Almacén 400 - Ubicación: SMU - Usa la hoja "400-SMU", limpia los datos anteriores antes de copiar.

Todo depende de las necesidades de cada uno. Y seguro que hay más formas de hacerlo pero no se me ocurren.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 02/04/2021 00:00:25
Antoni, de los ultimos codigos VO que me enviaste es posible adaptarlo para el segundo caso antes de copiar limpia la hoja, osea usar una nueva hoja para todas las consultas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 02/04/2021 11:21:28
Hola estimado Antoni, estoy adaptando los códigos que me enviaste, estoy colocando el total de cajas por Artículo. Ya me resultó.

Pero quede trabado en una parte donde quiero sumar todas las cajas que corresponden a cada estatus: TRANSITO, RESERVA y RETENIDO y colocarlo en las filas finales. Porfa necesito que me orientes donde tengo que modificar el código o cual es el código que tengo que adicionar.


Codigo-para-estatus
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 02/04/2021 18:00:49
Te pongo la macro que he modificado y marco los cambios:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
Sub Abarrotes_2CD500()
    Dim WS1 As Worksheet, a As Integer, old As Integer
    Dim WS2 As Worksheet, b As Integer
 
    Dim Fil As Integer, Fila As Long, _
        Col As Integer
 
    Dim Tabla_Col() As Long, Ini As Single
    Dim Tabla_Fil() As String
    Dim Tabla_DAT() As Long, Inicio As Single
    
    Dim Tabla_Transit() As Long
    Dim Tabla_Reserva() As Long
    Dim Tabla_Retenid() As Long
 
    Inicio = Timer
 
    ' ---&--- Limpia la Hoja
 
    Worksheets("Abarrotes_2").Range("C6:DC68").Value = Empty
 
    With Application
        .ScreenUpdating = False
        old = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
 
    Set WS1 = Worksheets("Inv QAD")
    Set WS2 = Worksheets("Abarrotes_2")
 
    ' ---&--- Carga los datos en las tablas
 
    With WS2
        ' ---&--- Tabla Columnas
 
        Col = 3
        While .Cells(5, Col).Value <> ""
            ReDim Preserve Tabla_Col(Col)
            ReDim Preserve Tabla_Transit(Col)
            ReDim Preserve Tabla_Reserva(Col)
            ReDim Preserve Tabla_Retenid(Col)
            Tabla_Col(Col) = Val(.Cells(4, Col))
            Col = Col + 1
        Wend
 
        ' ---&--- Tabla Filas
 
        Fil = 6
        While .Cells(Fil, 2).Value <> ""
            ReDim Preserve Tabla_Fil(Fil)
 
            Tabla_Fil(Fil) = Format(.Cells(Fil, 2), "yyyy.mm.dd")
            Fil = Fil + 1
        Wend
    End With
 
    ' ---&---  Tabla de datos de las Columnas
 
    For a = 1 To UBound(Tabla_Col) - 1
        For b = a To UBound(Tabla_Col)
            If Tabla_Col(a) > Tabla_Col(b) Then
               Tabla_Col(0) = Tabla_Col(a)
               Tabla_Col(a) = Tabla_Col(b)
               Tabla_Col(b) = Tabla_Col(0)
 
               Tabla_Transit(0) = Tabla_Transit(a)
               Tabla_Transit(a) = Tabla_Transit(b)
               Tabla_Transit(b) = Tabla_Transit(0)
 
               Tabla_Reserva(0) = Tabla_Reserva(a)
               Tabla_Reserva(a) = Tabla_Reserva(b)
               Tabla_Reserva(b) = Tabla_Reserva(0)
 
               Tabla_Retenid(0) = Tabla_Retenid(a)
               Tabla_Retenid(a) = Tabla_Retenid(b)
               Tabla_Retenid(b) = Tabla_Retenid(0)
            End If
        Next
    Next
 
    ' ---&---  Tabla de datos de las Filas
 
    For a = 1 To UBound(Tabla_Fil) - 1
        For b = a To UBound(Tabla_Fil)
            If Tabla_Fil(a) > Tabla_Fil(b) Then
               Tabla_Fil(0) = Tabla_Fil(a)
               Tabla_Fil(a) = Tabla_Fil(b)
               Tabla_Fil(b) = Tabla_Fil(0)
            End If
        Next
    Next
 
    ' ---&---  Tabla de datos
 
    ReDim Tabla_DAT(Fil, Col)
 
    ' ---&---  Lee la hoja de datos
 
    With WS1
        Fila = 2
        While .Cells(Fila, "A") <> ""
 
            If (UCase(.Cells(Fila, "A")) = "500VR" Or .Cells(Fila, "A") = 500) And _
                UCase(.Cells(Fila, "N")) = "UHT" Then
 
                Col = Buscar_2(.Cells(Fila, "C"), Tabla_Col)
                Fil = Buscar_2(Format(.Cells(Fila, "I"), "yyyy.mm.dd"), Tabla_Fil)
 
                Select Case UCase(.Cells(Fila, "P"))
                    Case "STOCK LIB": Tabla_DAT(Fil, Col) = Tabla_DAT(Fil, Col) + .Cells(Fila, "G")
                    Case "TRANSITO":  Tabla_Transit(Col) = Tabla_Transit(Col) + .Cells(Fila, "G")
                    Case "RESERVA":   Tabla_Reserva(Col) = Tabla_Reserva(Col) + .Cells(Fila, "G")
                    Case "RETENIDO":  Tabla_Retenid(Col) = Tabla_Retenid(Col) + .Cells(Fila, "G")
                End Select
            End If
 
            Fila = Fila + 1
        Wend
    End With
 
    ' ---&--- Escribe los datos en la hoja Refrigerado
 
    With WS2
        For Col = 3 To UBound(Tabla_Col)
            For Fil = 6 To UBound(Tabla_Fil)
                If Tabla_DAT(Fil, Col) <> 0 Then
                    .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                End If
            Next
 
            If Tabla_Transit(Col) <> 0 Then .Cells(72, Col) = Tabla_Transit(Col)
            If Tabla_Reserva(Col) <> 0 Then .Cells(73, Col) = Tabla_Reserva(Col)
            If Tabla_Retenid(Col) <> 0 Then .Cells(74, Col) = Tabla_Retenid(Col)
        Next
    End With
    MsgBox "Fin de la Macro Ver. 2.00." & vbCrLf & "Tiempo: " & Timer - Inicio
End Sub

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 02/04/2021 19:00:17
Muchas Gracias Antoni.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 02/04/2021 19:11:00
Antoni, ya implemente con 4 texbox y un command button una búsqueda de registro, ingresando almacén y la ubicación, y como opción adicional el código de articulo y la ubicación me rescate en una nueva hoja (Inv-Ubicación) los registros asociados a el, y al final de ese registro me envie el total de cajas.

hay alguna forma de reducir este código y hacer que el bucle sea más rápido.??

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Private Sub CommandButton1_Click()
Dim n&, m&, uFO&, FechaExp As Date, SKU&, nSuma#, Fila As Range, Columna As Range, t#, nSumaTR#, nSumaRV#, nSumaRT#
Dim Almacen, Ubicacion, DescripcionSKU, Lote, Origen, Familia, Estatus, Familia1
Dim WS1 As Worksheet
Dim WS2 As Worksheet
Worksheets("Inv-Ubicacion").Range("A2:L5000").Value = Empty
Set WS1 = Worksheets("Inv QAD")
Set WS2 = Worksheets("Inv-Ubicacion")
 
t = Timer
    uFO = WS1.Range("A" & Rows.Count).End(xlUp).Row
    FilaA = 2
     nSuma = 0
 
    For n = 2 To uFO
 
        If (WS1.Cells(n, "A") = TextBox1.Text Or UCase(WS1.Cells(n, "A")) = UCase(TextBox1.Text)) And _
            UCase(WS1.Cells(n, "P")) = UCase(TextBox2.Text) And TextBox3.Text = "" And UCase(TextBox4.Text) = "" Then
 
            WS2.Cells(FilaA, 8).Value = WS1.Cells(n, "I")
            WS2.Cells(FilaA, 3).Value = WS1.Cells(n, "C")
            WS2.Cells(FilaA, 1).Value = WS1.Cells(n, "A")
            WS2.Cells(FilaA, 2).Value = WS1.Cells(n, "B")
            WS2.Cells(FilaA, 4).Value = WS1.Cells(n, "D")
            WS2.Cells(FilaA, 5).Value = WS1.Cells(n, "E")
            WS2.Cells(FilaA, 6).Value = WS1.Cells(n, "G")
            WS2.Cells(FilaA, 7).Value = WS1.Cells(n, "H")
            WS2.Cells(FilaA, 9).Value = WS1.Cells(n, "N")
            WS2.Cells(FilaA, 10).Value = WS1.Cells(n, "O")
            WS2.Cells(FilaA, 11).Value = WS1.Cells(n, "P")
            WS2.Cells(FilaA, 12).Value = WS1.Cells(n, "Q")
            nSuma = nSuma + WS1.Cells(n, "G")
            FilaA = FilaA + 1
            ElseIf (WS1.Cells(n, "A") = TextBox1.Text Or UCase(WS1.Cells(n, "A")) = UCase(TextBox1.Text)) And _
                UCase(WS1.Cells(n, "P")) = UCase(TextBox2.Text) And TextBox3.Text = "" And _
                UCase(WS1.Cells(n, "B")) = UCase(TextBox4.Text) Then
 
            WS2.Cells(FilaA, 8).Value = WS1.Cells(n, "I")
            WS2.Cells(FilaA, 3).Value = WS1.Cells(n, "C")
            WS2.Cells(FilaA, 1).Value = WS1.Cells(n, "A")
            WS2.Cells(FilaA, 2).Value = WS1.Cells(n, "B")
            WS2.Cells(FilaA, 4).Value = WS1.Cells(n, "D")
            WS2.Cells(FilaA, 5).Value = WS1.Cells(n, "E")
            WS2.Cells(FilaA, 6).Value = WS1.Cells(n, "G")
            WS2.Cells(FilaA, 7).Value = WS1.Cells(n, "H")
            WS2.Cells(FilaA, 9).Value = WS1.Cells(n, "N")
            WS2.Cells(FilaA, 10).Value = WS1.Cells(n, "O")
            WS2.Cells(FilaA, 11).Value = WS1.Cells(n, "P")
            WS2.Cells(FilaA, 12).Value = WS1.Cells(n, "Q")
            nSuma = nSuma + WS1.Cells(n, "G")
            FilaA = FilaA + 1
            ElseIf (WS1.Cells(n, "A") = TextBox1.Text Or UCase(WS1.Cells(n, "A")) = UCase(TextBox1.Text)) And _
                    UCase(WS1.Cells(n, "P")) = UCase(TextBox2.Text) And WS1.Cells(n, "C") = TextBox3.Text And _
                    UCase(TextBox4.Text) = "" Then
 
            WS2.Cells(FilaA, 8).Value = WS1.Cells(n, "I")
            WS2.Cells(FilaA, 3).Value = WS1.Cells(n, "C")
            WS2.Cells(FilaA, 1).Value = WS1.Cells(n, "A")
            WS2.Cells(FilaA, 2).Value = WS1.Cells(n, "B")
            WS2.Cells(FilaA, 4).Value = WS1.Cells(n, "D")
            WS2.Cells(FilaA, 5).Value = WS1.Cells(n, "E")
            WS2.Cells(FilaA, 6).Value = WS1.Cells(n, "G")
            WS2.Cells(FilaA, 7).Value = WS1.Cells(n, "H")
            WS2.Cells(FilaA, 9).Value = WS1.Cells(n, "N")
            WS2.Cells(FilaA, 10).Value = WS1.Cells(n, "O")
            WS2.Cells(FilaA, 11).Value = WS1.Cells(n, "P")
            WS2.Cells(FilaA, 12).Value = WS1.Cells(n, "Q")
            nSuma = nSuma + WS1.Cells(n, "G")
            FilaA = FilaA + 1
          End If
     Next n
     WS2.Cells(FilaA + 1, 6) = nSuma
     WS2.Cells(FilaA + 1, 5) = "Total Cajas"
 
     MsgBox Timer - t
    TextBox1.SetFocus
End Sub


Inv-Ubicacion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 02/04/2021 22:19:07
Hay una forma de hacerlo mas corto, más rápido quizás también, tendría que probarlo.

Esta línea no me gusta:

1
uFO = WS1.Range("A" & Rows.Count).End(xlUp).Row

En mi caso el problema es el siguiente: en una hoja copio 200 filas de datos cada día y al final de año tengo 50.000 filas.
A principio de año hago una copia y borro los 9 primero meses y dejo unos 60 días que son unas 12.000 filas.
Pues este comando e incluso pulsando Ctrl-Fin me sigue diciendo que tengo 50.000 filas

Voy a hacer pruebas y te comento.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Private Sub CommandButton1_Click()
    Dim n&, m&, uFO&, FechaExp As Date, SKU&, nSuma#, _
        Fila As Range, Columna As Range, t#, nSumaTR#, nSumaRV#, nSumaRT#
    Dim Almacen, Ubicacion, DescripcionSKU, Lote, Origen, Familia, _
        Estatus, Familia1
    Dim WS1 As Worksheet
    Dim WS2 As Worksheet
 
    Worksheets("Inv-Ubicacion").Range("A2:L5000").Value = Empty
 
    Set WS1 = Worksheets("Inv QAD")
    Set WS2 = Worksheets("Inv-Ubicacion")
 
    t = Timer
    uFO = WS1.Range("A" & Rows.Count).End(xlUp).Row
    FilaA = 2
    nSuma = 0
 
    For n = 2 To uFO
        Graba = False
 
        If (      WS1.Cells(n, "A")  =       TextBox1.Text       Or _
            UCase(WS1.Cells(n, "A")) = UCase(TextBox1.Text))     And _
            UCase(WS1.Cells(n, "P")) = UCase(TextBox2.Text)      And _
                                             TextBox3.Text = ""  And _
                                             TextBox4.Text = ""  Then Graba = True
 
        If (      WS1.Cells(n, "A")  = TextBox1.Text             Or _
            UCase(WS1.Cells(n, "A")) = UCase(TextBox1.Text))     And _
            UCase(WS1.Cells(n, "P")) = UCase(TextBox2.Text)      And _
                                             TextBox3.Text = ""  And _
            UCase(WS1.Cells(n, "B")) = UCase(TextBox4.Text)      Then Graba = True
 
        If (      WS1.Cells(n, "A")  =       TextBox1.Text       Or _
            UCase(WS1.Cells(n, "A")) = UCase(TextBox1.Text))     And _
            UCase(WS1.Cells(n, "P")) = UCase(TextBox2.Text)      And
                  WS1.Cells(n, "C") =        TextBox3.Text       And _
                                       UCase(TextBox4.Text) = "" Then Graba = True
 
        If Graba Then
            WS2.Cells(FilaA, "A").Value = WS1.Cells(n, "A")
            WS2.Cells(FilaA, "B").Value = WS1.Cells(n, "B")
            WS2.Cells(FilaA, "C").Value = WS1.Cells(n, "C")
            WS2.Cells(FilaA, "D").Value = WS1.Cells(n, "D")
            WS2.Cells(FilaA, "E").Value = WS1.Cells(n, "E")
            WS2.Cells(FilaA, "F").Value = WS1.Cells(n, "G")
            WS2.Cells(FilaA, "G").Value = WS1.Cells(n, "H")
            WS2.Cells(FilaA, "H").Value = WS1.Cells(n, "I")
            WS2.Cells(FilaA, "I").Value = WS1.Cells(n, "N")
            WS2.Cells(FilaA, "J").Value = WS1.Cells(n, "O")
            WS2.Cells(FilaA, "K").Value = WS1.Cells(n, "P")
            WS2.Cells(FilaA, "L").Value = WS1.Cells(n, "Q")
 
            nSuma = nSuma + WS1.Cells(n, "G")
            FilaA = FilaA + 1
        End If
    Next n
    WS2.Cells(FilaA + 1, 6) = nSuma
    WS2.Cells(FilaA + 1, 5) = "Total Cajas"
 
    MsgBox Timer - t
    TextBox1.SetFocus
End Sub

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 02/04/2021 23:05:03
Antoni, en el caso que la cantidad de filas de fecha Expiración del reporte fuera dinamico osea dependiendo de circunstancias éstas pueden aumentar o disminuir, y quiero que los totales de cajas y los Estatus: TRANSITO, RESERVA y RETENIDO aparezcan inmediatamente 2 filas después, cómo se modifica el código ??


Inv-Ubicacion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 03/04/2021 11:57:33
Pongo solo los cambios o añadidos para esta ultima consulta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sub Abarrotes_2CD200()
    Dim WS1 As Worksheet, a As Integer, old As Integer
    Dim WS2 As Worksheet, b As Integer
   ....
 
   ' ---&--- Escribe los datos en la hoja Refrigerado
 
    With WS2
        For Col = 3 To UBound(Tabla_Col)
            For Fil = 6 To UBound(Tabla_Fil)
                If Tabla_DAT(Fil, Col) <> 0 Then
                    .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                End If
            Next
 
            If Col = 3 Then
                .Cells(Fil + 2, "A") = "Transito"
                .Cells(Fil + 3, "A") = "Reserva"
                .Cells(Fil + 4, "A") = "Retenido"
            End If
 
            If Tabla_Transit(Col) <> 0 Then .Cells(Fil + 2, Col) = Tabla_Transit(Col)
            If Tabla_Reserva(Col) <> 0 Then .Cells(Fil + 3, Col) = Tabla_Reserva(Col)
            If Tabla_Retenid(Col) <> 0 Then .Cells(Fil + 4, Col) = Tabla_Retenid(Col)
        Next
    End With
    MsgBox "Fin de la Macro Ver. 2.00." & vbCrLf & "Tiempo: " & Timer - Inicio
End Sub

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 03/04/2021 13:11:26
Hola Antoni, porque dices que está línea no te gusta.
1
uFO = WS1.Range("A" & Rows.Count).End(xlUp).Row

Hay una mejor que esa que haga el bucle más rápido??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 03/04/2021 14:24:06
Por lo que explicaba más arriba, el problema con esta línea es si eliminas filas.

Por ejemplo en tu caso tienes una hoja de refrigerados con 60 fechas mas la cabecera y los totales pongamos que en total son 70 filas.
Esta instrucción dice que la ultima fila de datos es la 70.
Ahora copias la hoja y dejas 10 fechas, es decir has borrado 50 filas.
Y esperas que esta instrucción te diga que la última fila es la 20, pues te equivocas, dice que la ultima es la 70.

¿Y porque pasa esto? pues que para Excel en esta segunda hoja la fila 71 esta vacía (es virgen, inmaculada) y la fila 70 tiene un valor nulo y no es lo mismo una celda vacía que una celda con un valor nulo, aunque conceptualmente es lo mismo, para Excel no.

Has la prueba. También pasa pulsando Ctrl+Fin.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 03/04/2021 14:56:37
Quiere decir que con esa instrucción me eliminara información?

Por ejemplo esta es mejor.?

1
2
3
4
5
FilaC = 2
While WS2.Cells(FilaC, 3).Value <> ""
      FilaC = FilaC + 1
Wend
For Each Celda In WS2.Range("A2:A" & FilaC - 1)


O me sugieres otra instrucción mejor?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 03/04/2021 15:15:23
Estimado Antoni, estoy que me rompo la cabeza con esta idea, quiero colocar en una tabla reporte (“Inv-PedRefrigerado”) artículos pedidos vs inventario existente y el resultado de artículos asignados, por ejemplos:

Inventario(Inv)=100Cajas, Pedido(Ordn) =15Cajas por lo tanto asignado(Asig)=15Cajas
Inventario(Inv)=15Cajas, Pedido(Ordn) =15Cajas por lo tanto asignado(Asig)=15Cajas
Inventario(Inv)=10Cajas, Pedido(Ordn) =15Cajas por lo tanto asignado(Asig)=10Cajas
Inventario(Inv)=0Cajas, Pedido(Ordn) =15Cajas por lo tanto asignado(Asig)=0Cajas

Los criterios siempre serán STOCK LIBERADO, ARTICULO Y LA FECHA DE EXPIRACION Y REF

El criterio de la fecha de Expiración del pedido vs el inventario es: Fecha de Expiración de hoja (“Pedidos”) es igual o mayor a la fecha de Expiración de hoja (“Inv QAD”), con se criterio se ubica en la fila del reporte (“Inv-PedRefrigerado”).
Porque se entiende que el cliente compro un artículo con una fecha de expiración determinada, por lo tanto, el proveedor tiene que entregar el articulo con esa fecha de Expiración o una mejor fecha de Expiración.



Inv-PedRefrigerado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 03/04/2021 15:57:11
Corrijo el parrafo

El criterio de la fecha de Expiración del pedido vs el inventario es: Fecha de Expiración de hoja (“Inv QAD”) es igual o mayor a la fecha de Expiración de hoja (“Pedidos”), con se criterio se ubica en la fila del reporte (“Inv-PedRefrigerado”).
Porque se entiende que el cliente compro un artículo con una fecha de expiración determinada, por lo tanto, el proveedor tiene que entregar el articulo con esa fecha de Expiración o una mejor fecha de Expiración.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 04/04/2021 22:58:58
Sobre el primer tema While o For te paso un fragmento de una de una pagina que explica 14 formas de acelerar las macros

8. Evitar loops FOR EACH

Tener que ir celda por celda consume mucho tiempo
Se puede resolver el problema de forma más directa!

Ejecución leeenta…
For Each cell In Range(«A1:A10000»)
If cell = Empty Then cell = 0
Next cell

* Los loops siempre son leeentos
* En este caso recorre 10.000 celdas!

Ejecución rápida!
Existen diversas formas de evitar los loops. La solución dependerá del caso concreto en cuestión. Generalmente se usan algunas de estas técnicas: agrupar, ir a especial, filtros, filtros avanzados. La idea es poder realizar la acción sobre todos los elementos al mismo tiempo, en lugar de tener que ir uno a uno!

https://www.todoexcel.com/14-formas-de-acelerar-y-optimizar-tus-macros-excel/

Con el segundo tema no acabo de entender donde tienes el problema y en que te puedo ayudar.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 05/04/2021 00:10:30
Antoni, te Explico, tengo tres hojas:
Tabla de Inventarios Hoja1 (“Inv QAD”)
Tabla de Pedidos Hoja2 (“Pedidos”)
Reporte de total cajas de inventario y cajas ordenadas Hoja3 (“Inv-PedRefrigerado”).

En Pedidos hoja2(“Pedidos”): sumar el total de cajas del campo Cnt!Ord con criterios que sean el mismo artículo, almacén y el Origen sea PLF, la FechaExpiracion Pedido debe ser igual o menor a lo reportado en la hoja3 (“Inv-PedRefrigerado”).

En Inventario hoja1(“Inv QAD”): sumar el total de cajas del campo Cnt en Exist con criterios que sean el mismo artículo, almacén, Estatus: Stock Lib y el Origen sea PLF, la misma FechaExpiracion Inv y debe ser reportado en la hoja3 (“Inv-PedRefrigerado”).

En el reporte de la Hoja3 (“Inv-PedRefrigerado”). hay tres columnas, Columna Invent es para cada artículo donde se deben ubicar la cantidad de cajas Inventario ubicado en su respectiva Fecha de Expiración. La cantidad de cajas ordenado ubicados en la Columna Orden en la misma fecha de expiración sino hay igual que se ubique en la fecha de Expiración más cercana. En una tercera Columna Asigna se debe ubicar las cajas asignadas bajo este criterio:
Si Cajas Inventario es mayor a ordenado, entonces Asignado es igual a Ordenado. Si Cajas Inventario es igual a Ordenado entonces Asignado es igual a Ordenado. Si Cajas Inventario es menor a Ordenado entonces Asignado es igual a Inventario, Coloco ejemplos:

Inventario(Invent)=100Cajas, Pedido(Orden) =15Cajas por lo tanto asignado(Asigna)=15Cajas
Inventario(Invent)=15Cajas, Pedido(Orden) =15Cajas por lo tanto asignado(Asigna)=15Cajas
Inventario(Invent)=10Cajas, Pedido(Orden) =15Cajas por lo tanto asignado(Asigna)=10Cajas
Inventario(Invent)=0Cajas, Pedido(Orden) =15Cajas por lo tanto asignado(Asigna)=0Cajas

Las tres columnas para cada Articulo de hoja3 (“Inv-PedRefrigerado”) estan en celdas combinadas. En la imagen se observa cómo debe quedar el reporte:

Espero haber sido claro.



Inv-PedRefrigerado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 06/04/2021 16:32:52
Dale un vistazo a estas dos macros, si las entiendes podrás entender como rellenar la tabla

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub macro()
    Col = 3
    MsgBox Cells(4, Col)
    Col = Col + 3
    MsgBox Cells(4, Col)
End Sub
 
 
Sub Macro2()
    Col = 3
    While Cells(4, Col) <> ""
        For Fil = 6 To 18
            Cells(Fil, Col + 0) = (Fil * 100) + Col
            Cells(Fil, Col + 1) = (Fil * 100) + Col + 1
            Cells(Fil, Col + 2) = (Fil * 100) + Col + 2
        Next
        Col = Col + 3
    Wend
    MsgBox "Primera columna vacía: " & Col
End Sub

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 06/04/2021 17:48:27
Hola Antoni, si las entiendo, esas macros son para el recorrido por columnas para las CELDAS COMBINADAS.
Esas macros adaptándola al código que me enviaste anteriormente deberían funcionar ??

Habria que agregarle en la parte donde dice ' ---&--- Escribe los datos en la hoja Refrigerado ?

A este código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
Option Explicit
 
Sub Refrigerado_1CD200()
Dim WS1 As Worksheet, old As Integer
    Dim WS2 As Worksheet
 
    Dim Fil As Integer, Fila As Long, _
        Col As Integer, _
        Total As Long
    Dim Tabla_Col() As Long, Ini As Single
    Dim Tabla_Fil() As String
    Dim Tabla_DAT() As Long, Inicio As Single
 
    Dim Tabla_Transit() As Long
    Dim Tabla_Reserva() As Long
    Dim Tabla_Retenid() As Long
 
    Inicio = Timer
 
    ' ---&--- Limpia la Hoja
 
    Worksheets("Refrigerado").Range("C6:DC76").Value = Empty
 
    With Application
        .ScreenUpdating = False
        old = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
 
    Set WS1 = Worksheets("Inv QAD")
    Set WS2 = Worksheets("Refrigerado")
 
    ' ---&--- Carga los datos en las tablas
 
    With WS2
        ' ---&--- Tabla Columnas
 
        Col = 3
        While .Cells(5, Col).Value <> ""
            ReDim Preserve Tabla_Col(Col)
 
            ReDim Preserve Tabla_Transit(Col)
            ReDim Preserve Tabla_Reserva(Col)
            ReDim Preserve Tabla_Retenid(Col)
 
            Tabla_Col(Col) = Val(.Cells(4, Col))
            Col = Col + 1
        Wend
 
        ' ---&--- Tabla Filas
 
        Fil = 6
        While .Cells(Fil, 2).Value <> ""
            ReDim Preserve Tabla_Fil(Fil)
 
            Tabla_Fil(Fil) = Format(.Cells(Fil, 2), "yyyy.mm.dd")
            Fil = Fil + 1
        Wend
    End With
 
    ' ---&---  Tabla de datos
 
    ReDim Tabla_DAT(Fil, Col)
 
    ' ---&---  Lee la hoja de datos
 
    With WS1
        Fila = 2
        While .Cells(Fila, "A") <> ""
 
            If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And _
                UCase(.Cells(Fila, "N")) = "PLF" Then
 
                Col = Buscar_1(Val(.Cells(Fila, "C")), Tabla_Col)
                Fil = Buscar_1(Format(.Cells(Fila, "I"), "yyyy.mm.dd"), Tabla_Fil)
 
                Select Case UCase(.Cells(Fila, "P"))
                    Case "STOCK LIB": Tabla_DAT(Fil, Col) = Tabla_DAT(Fil, Col) + .Cells(Fila, "G")
                    Case "TRANSITO":  Tabla_Transit(Col) = Tabla_Transit(Col) + .Cells(Fila, "G")
                    Case "RESERVA":   Tabla_Reserva(Col) = Tabla_Reserva(Col) + .Cells(Fila, "G")
                    Case "RETENIDO":  Tabla_Retenid(Col) = Tabla_Retenid(Col) + .Cells(Fila, "G")
                End Select
 
                  'Tabla_DAT(Fil, Col) = Tabla_DAT(Fil, Col) + .Cells(Fila, "G")
            End If
            Fila = Fila + 1
        Wend
    End With
 
    ' ---&--- Escribe los datos en la hoja Refrigerado
 
    With WS2
        For Col = 3 To UBound(Tabla_Col)
            For Fil = 6 To UBound(Tabla_Fil)
                If Tabla_DAT(Fil, Col) <> 0 Then
                   .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                   Total = Total + Tabla_DAT(Fil, Col)
                End If
            Next
            If Col = 3 Then
                .Cells(Fil + 3, "B") = "Transito"
                .Cells(Fil + 4, "B") = "Reserva"
                .Cells(Fil + 5, "B") = "Retenido"
                .Cells(Fil + 1, "B") = "Total Cajas"
            End If
 
            If Tabla_Transit(Col) <> 0 Then .Cells(Fil + 3, Col) = Tabla_Transit(Col)
            If Tabla_Reserva(Col) <> 0 Then .Cells(Fil + 4, Col) = Tabla_Reserva(Col)
            If Tabla_Retenid(Col) <> 0 Then .Cells(Fil + 5, Col) = Tabla_Retenid(Col)
                                            .Cells(Fil + 1, Col) = Total
                                             Total = 0#
        Next
    End With
    WS2.Cells(1, 8) = "INFORME DE REF CD SANTIAGO"
    MsgBox "Fin de la Macro Ver. 1.00" & vbCrLf & "Tiempo: " & Timer - Inicio
End Sub
 
Function Buscar_1(Text, Tabla)
    Dim a As Long
    For a = 1 To UBound(Tabla)
        If Text = Tabla(a) Then Buscar_1 = a: Exit For
    Next
End Function
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 07/04/2021 10:12:57
Hola, Antoni, las macros que enviaste si las entiendo son para recorrer las celdas combinadas. Pero Igual me esta costando mucho adaptarlas al codigo que te menciones ayer, no me resulta aun. Prefiero que sea tu codigo porque es más rápido el proceso. Haber si me das mas ayuda por favor.

Igual te doy un alcance más claro de lo que quiero hacer.

Tabla Hoja (“Inv QAD”)
Criterios:
Columna “A”
Columna “O”
Columna “N”
Columna “C” : Articulo debe coincidir con las Columnas a partir de “C4” en reporte Hoja ((“Inv-PedRefrigerado”). Cuyas celdas son combinadas

Columna “I” : => Fecha debe coincidir con las filas de la Columna “B6” en reporte Hoja ((“Inv-PedRefrigerado”)

Columna “G” : => Cantidad de cajas que se cargaran a partir de la Columna “C6” solo en campo Invent en reporte Hoja ((“Inv-PedRefrigerado”)




Tabla Hoja(“Pedidos”)
Criterios:
Columna “A”
Columna “AJ”
Columna “I” : Articulo debe coincidir con las Columnas a partir de “C4” en reporte Hoja ((“Inv-PedRefrigerado”). Cuyas celdas son combinadas

Columna “AS” : => Fecha debe coincidir con las filas de la Columna “B6” en reporte Hoja ((“Inv-PedRefrigerado”)

Columna “AQ” : => Cantidad de cajas que se cargaran a partir de la Columna “D6” solo en campo Orden en reporte Hoja ((“Inv-PedRefrigerado”)



Reporte Hoja (“Inv-PedRefrigerado”)
Además de tener cantidades de inventario y pedidos en los campos Invent y Orden
En campo Asigna a partir de “D6”se deben colocar las cantidades de cajas asignadas. Ese dato puede salir de la diferencia de las Columnas “G” - “P” de la tabla Hoja (“Inv-QAD”)

Informacion:
En Columna “G”: están cajas de inventario inicial
En Columna “P”: están cajas de inventario ya descontado por el Pedido. Por tanto se asume que la diferencia de ambos es lo que corresponde al ASIGNA


En conclusión lo que se hizo con respecto a la Tabla Hoja(“Inv QAD”) es bastante similar a Tabla Hoja(“Pedidos”).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 08/04/2021 11:37:51
Hola Antoni, ya me esta resultando las modificaciones que estoy haciendo, ya lo tengo casi listo. Cualquier duda te vuelvo a consultar al respecto.
Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 08/04/2021 11:56:40
Antoni, Esta interesante el filtro avanzado con macros para acelerar los procesos, sin embargo sino me equivoco es muy util pero está acotado solo a criterios de búsqueda todo lo que sea igual. Pero cuando se combina varios criterios entre dos hojas como: EL VALOR BUSCADO SEA IGUAL, QUE SEA MAYOR Y DISTINTO o Viceversa ahi se complica mas. No se si estare equivocado al respecto, por ejemplo yo tengo una macro que necesariamente estoy obligado a usar Bucles por la variedad de criterios de búsqueda entre dos hojas, El proceso de carga es demasiado lento demora como 4 minutos en cargar.
No se si me puedes orientar modificando el código para que sea más rápido.

Lo que hace la macro es: de la tabla Hoja ("Pedidos") la cantidad ordenada lo busca en el inventario de la Hoja ("Inventario") y descuenta cantidades considerándolo como asignado y lo ubica en la Columna AQ y también considera la fecha de de expiración en Columna AS de la Hoja ("Pedidos"). En la Hoja ("Inventario") se coloca las cantidades que se van rebajando del inventario en Columna O.

Adjunto Archivo.

Este es el código.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
Private Sub Informe_Click()
Dim ORD#, Asig#, AsigPend#, PICK#, InvAsig#, Inv#, RebajaInv#, FILAA&, FILA1&, old&, FilaB&, FilaC&
Dim WS1 As Worksheet
Dim WS2 As Worksheet
Dim Max, AlmacenP, CodigoArticuloP, VencCorteP, AlmacenInv, CodigoArticuloInv, ExpiracionArtInv, StatusInv
Dim Almacen, Articulo, StockAsig
Dim Cell As Range
Dim Celda As Range
'Descontar en inventario la demanda de Articulos Asignados
Worksheets("Pedidos").Range("AQ2:AQ9000").Value = Empty
Worksheets("Pedidos").Range("AR2:AR9000").Value = Empty
Worksheets("Pedidos").Range("AS2:AS9000").Value = Empty
Worksheets("Inventario").Range("O2:O9000").Value = Empty
With Application
.ScreenUpdating = False
old = .Calculation
.Calculation = xlCalculationManual
.EnableEvents = False
End With
 
MaxDiaCorte
Application.Calculation = xlAutomatic
Set WS1 = Worksheets("Pedidos")
Set WS2 = Worksheets("Inventario")
 
FilaB = 2
While WS1.Cells(FilaB, 9).Value <> ""
      FilaB = FilaB + 1
Wend
FilaC = 2
While WS2.Cells(FilaC, 3).Value <> ""
      FilaC = FilaC + 1
Wend
 
For Each Celda In WS2.Range("A2:A" & FilaC - 1)
Celda.Offset(, 14).Value = Celda.Offset(, 6).Value
Next
 
Inv = 0#
RebajaInv = 0#
Asig = 0#
AsigPend = 0#
For Each Cell In WS1.Range("A2:A" & FilaB - 1)
 
   AlmacenP = Cell.Offset(, 0).Value
   CodigoArticuloP = Cell.Offset(, 8).Value
   VencCorteP = Cell.Offset(, 10).Value + Cell.Offset(, 3).Value
   For Each Celda In WS2.Range("A2:A" & FilaC - 1)
        AlmacenInv = Celda.Offset(, 0).Value
        CodigoArticuloInv = Celda.Offset(, 2).Value
        ExpiracionArtInv = Celda.Offset(, 8).Value
        StatusInv = Celda.Offset(, 13).Value
 
        If AlmacenP = AlmacenInv And CodigoArticuloP = CodigoArticuloInv And _
           VencCorteP <= ExpiracionArtInv And StatusInv = "STock Lib" Then
           Cell.Offset(, 43).Value = VencCorteP
           Cell.Offset(, 44).Value = ExpiracionArtInv
           If Cell.Offset(, 11).Value <= Celda.Offset(, 14).Value And Cell.Offset(, 42).Value = Empty Then
 
              Inv = Celda.Offset(, 14).Value
              Asig = Cell.Offset(, 11).Value
              RebajaInv = Inv - Asig
              Celda.Offset(, 14).Value = RebajaInv
              Cell.Offset(, 42).Value = Asig
              Exit For
 
          ElseIf Celda.Offset(, 14).Value > 0 And Cell.Offset(, 11).Value > Celda.Offset(, 14).Value And _
                 Cell.Offset(, 42).Value = Empty Then
 
                 Inv = Celda.Offset(, 14).Value
                 Asig = Inv
                 RebajaInv = Inv - Asig
                 Celda.Offset(, 14).Value = RebajaInv
                 Cell.Offset(, 42).Value = Asig
 
          ElseIf Celda.Offset(, 14).Value > 0 And Cell.Offset(, 11).Value > Cell.Offset(, 42).Value And _
                 Celda.Offset(, 14).Value <= (Cell.Offset(, 11).Value - Cell.Offset(, 42).Value) And _
                 Cell.Offset(, 42).Value <> Empty Then
 
                 Inv = Celda.Offset(, 14).Value
                 AsigPend = Cell.Offset(, 11).Value - Cell.Offset(, 42).Value
                 Asig = (AsigPend + Inv) - AsigPend
                 RebajaInv = Asig - Inv
                 Celda.Offset(, 14).Value = RebajaInv
                 Cell.Offset(, 42).Value = Cell.Offset(, 42).Value + Asig
 
                 If Cell.Offset(, 11).Value = Cell.Offset(, 42).Value Then
                    Exit For
                 End If
 
          ElseIf Celda.Offset(, 14).Value > 0 And Cell.Offset(, 11).Value > Cell.Offset(, 42).Value And _
                 Celda.Offset(, 14).Value > (Cell.Offset(, 11).Value - Cell.Offset(, 42).Value) And _
                 Cell.Offset(, 42).Value <> Empty Then
 
                 Inv = Celda.Offset(, 14).Value
                 AsigPend = Cell.Offset(, 11).Value - Cell.Offset(, 42).Value
                 Asig = (AsigPend + Inv) - Inv
                 RebajaInv = Inv - Asig
                 Celda.Offset(, 14).Value = RebajaInv
                 Cell.Offset(, 42).Value = Cell.Offset(, 42).Value + Asig
 
                 If Cell.Offset(, 11).Value = Cell.Offset(, 42).Value Then
                    Exit For
                 End If
          End If
          RebajaInv = 0#
          Inv = 0#
          Asig = 0#
          AsigPend = 0#
       End If
   Next
Next
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 09/04/2021 17:24:42
Buenas Juan,

Te he tenido un poco olvidado y lo siento, he estado de vacaciones y un poco malo.

Le voy a dar un vistazo a esta última macro para ver si se puede hacer que tarde menos tiempo.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 09/04/2021 19:08:24
No te preocupes Antoni, más bien agradecido por tu ayuda porque me está ayudando y estoy aprendiendo mucho..

Tu función Buscar_1 y Buscar_2 es bastante útil porque acelera los procesos. Esas funciones se pueden usar para el último código que envie? O al menos algo similar.?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 09/04/2021 19:08:59
Le he dado un vistazo y tengo varias sugerencias y como ya dije antes escribir menos en un programa no lo hace más rapido, bueno y si no lo dije lo digo ahora.

La macro se lee un poco mejor asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
Private Sub Informe_Click()
    Dim ORD#, Asig#, AsigPend#, PICK#, InvAsig#, Inv#, RebajaInv#, FILAA&, FILA1&, old&, FilaB&, FilaC&
    Dim WS1 As Worksheet
    Dim WS2 As Worksheet
    Dim Max, AlmacenP, CodigoArticuloP, VencCorteP, AlmacenInv, CodigoArticuloInv, ExpiracionArtInv, StatusInv
    Dim Almacen, Articulo, StockAsig
    Dim Celda_Pedid As Range
    Dim Celda_Inven As Range
 
    'Descontar en inventario la demanda de Articulos Asignados
 
    Worksheets("Pedidos").Range("AQ2:AQ9000").Value = Empty
    Worksheets("Pedidos").Range("AR2:AR9000").Value = Empty
    Worksheets("Pedidos").Range("AS2:AS9000").Value = Empty
    Worksheets("Inventario").Range("O2:O9000").Value = Empty
 
    With Application
        .ScreenUpdating = False
        old = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
 
    MaxDiaCorte
    Application.Calculation = xlAutomatic
 
    Set WS1 = Worksheets("Pedidos")
    Set WS2 = Worksheets("Inventario")
 
    FilaB = 2
    While WS1.Cells(FilaB, 9).Value <> ""
          FilaB = FilaB + 1
    Wend
 
    FilaC = 2
    While WS2.Cells(FilaC, 3).Value <> ""
          FilaC = FilaC + 1
    Wend
 
    For Each Celda_Inven In WS2.Range("A2:A" & FilaC - 1)
        Celda_Inven.Offset(, 14).Value = Celda_Inven.Offset(, 6).Value
    Next
 
    Inv = 0#
    RebajaInv = 0#
    Asig = 0#
    AsigPend = 0#
 
    For Each Celda_Pedid In WS1.Range("A2:A" & FilaB - 1)
 
        AlmacenP = Celda_Pedid.Offset(, 0).Value
        CodigoArticuloP = Celda_Pedid.Offset(, 8).Value
        VencCorteP = Celda_Pedid.Offset(, 10).Value + Celda_Pedid.Offset(, 3).Value
        DoEvents
 
        For Each Celda_Inven In WS2.Range("A2:A" & FilaC - 1)
 
            AlmacenInv = Celda_Inven.Offset(, 0).Value        'A
            CodigoArticuloInv = Celda_Inven.Offset(, 2).Value 'C
            ExpiracionArtInv = Celda_Inven.Offset(, 8).Value  'I
            StatusInv = Celda_Inven.Offset(, 13).Value        'N
 
 
            If AlmacenP = AlmacenInv And _
               CodigoArticuloP = CodigoArticuloInv And _
                VencCorteP <= ExpiracionArtInv And _
                StatusInv = "STock Lib" Then
 
                Celda_Pedid.Offset(, 43).Value = VencCorteP
                Celda_Pedid.Offset(, 44).Value = ExpiracionArtInv
 
                If Celda_Pedid.Offset(, 11).Value <= Celda_Inven.Offset(, 14).Value And Celda_Pedid.Offset(, 42).Value = Empty Then
 
                    Inv = Celda_Inven.Offset(, 14).Value
                    Asig = Celda_Pedid.Offset(, 11).Value
                    RebajaInv = Inv - Asig
                    Celda_Inven.Offset(, 14).Value = RebajaInv
                    Celda_Pedid.Offset(, 42).Value = Asig
                    Exit For
 
                ElseIf Celda_Inven.Offset(, 14).Value > 0 And _
                       Celda_Pedid.Offset(, 11).Value > Celda_Inven.Offset(, 14).Value And _
                       Celda_Pedid.Offset(, 42).Value = Empty Then
 
                    Inv = Celda_Inven.Offset(, 14).Value
                    Asig = Inv
                    RebajaInv = Inv - Asig
                    Celda_Inven.Offset(, 14).Value = RebajaInv
                    Celda_Pedid.Offset(, 42).Value = Asig
 
                ElseIf Celda_Inven.Offset(, 14).Value > 0 And _
                       Celda_Pedid.Offset(, 11).Value > Celda_Pedid.Offset(, 42).Value And _
                       Celda_Inven.Offset(, 14).Value <= (Celda_Pedid.Offset(, 11).Value - Celda_Pedid.Offset(, 42).Value) And _
                       Celda_Pedid.Offset(, 42).Value <> Empty Then
 
                    Inv = Celda_Inven.Offset(, 14).Value
                    AsigPend = Celda_Pedid.Offset(, 11).Value - Celda_Pedid.Offset(, 42).Value
                    Asig = (AsigPend + Inv) - AsigPend
                    RebajaInv = Asig - Inv
                    Celda_Inven.Offset(, 14).Value = RebajaInv
                    Celda_Pedid.Offset(, 42).Value = Celda_Pedid.Offset(, 42).Value + Asig
 
                    If Celda_Pedid.Offset(, 11).Value = Celda_Pedid.Offset(, 42).Value Then
                       Exit For
                    End If
 
                ElseIf Celda_Inven.Offset(, 14).Value > 0 And _
                       Celda_Pedid.Offset(, 11).Value > Celda_Pedid.Offset(, 42).Value And _
                       Celda_Inven.Offset(, 14).Value > (Celda_Pedid.Offset(, 11).Value - Celda_Pedid.Offset(, 42).Value) And _
                       Celda_Pedid.Offset(, 42).Value <> Empty Then
 
                    Inv = Celda_Inven.Offset(, 14).Value
                    AsigPend = Celda_Pedid.Offset(, 11).Value - Celda_Pedid.Offset(, 42).Value
                    Asig = (AsigPend + Inv) - Inv
                    RebajaInv = Inv - Asig
                    Celda_Inven.Offset(, 14).Value = RebajaInv
                    Celda_Pedid.Offset(, 42).Value = Celda_Pedid.Offset(, 42).Value + Asig
 
                    If Celda_Pedid.Offset(, 11).Value = Celda_Pedid.Offset(, 42).Value Then
                       Exit For
                    End If
                End If
                RebajaInv = 0#
                Inv = 0#
                Asig = 0#
                AsigPend = 0#
             End If
        Next
    Next
End Sub

Con los Offset no se exactamente en qué columna estás haciendo referencia pero lo mismo pasa con Cell() cuando se le pone un número en lugar de una letra.

Cosas para que tarde menos

El primer IF que hay dentro de los FOR se ejecuta 4.441.310
Hay que reducir este número

Veo que el procedimiento es leer la hoja Pedidos y buscar coincidencias en la hoja Inventario. Se me ocurren varias opciones.

Puedes ordenar la hoja inventario por Almacén + Status (Si quieres dejarlo en el orden que está crea una columna a la derecha y la numeras del 1 al final, te servirá para dejarlo el orden original)
Ahora cuando recorras el por primera vez la hoja para contar las líneas G y O y apuntas en una tabla donde empieza cada almacén que su estatus es Stock Lib.
Cuando leas en la hoja pedido si el almacén no está en la tabla lo saltas y si está empiezas en la lìnea donde empieza el almacén.
Al final ordenas por la columna añadida y la borras.

OTRA OPCIÓN

Creas una columna en la hoja inventario en la que tendrán que ir los cuatro campos del primer IF Almacen + Articulo + Fecha + Status.
Y ahora utilizas la función COINCIDIR para buscar la fila que es más rápido que recorrer toda la tabla.
Para usar esta función desde una macro tiene truco.

Otros opciones es usar un combinado de las otras dos.

En recorrer la hoja de pedidos tarda menos de un segundo, en lo que tarda mas es en recorrer todos los registros que no son validos de la segunda tabla.

Por ahora lo dejo, ya me contaras.

Saludos.
\\//_

Post data Dando un último repaso veo que el primer IF se confirma 13010 veces, si se puede reducir a este número de accesos tendrás una macro super rapida.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 10/04/2021 07:18:41
Hola Antoni, tengo tres consultas:

1._ En el reporte Hoja(“Inv-PedRefrigerado_1”) estoy llenando el encabezado de Artículos y sus asociados (Columnas) y fechas Expiración(Filas) en forma automática mediante código. Lo estoy cargando por separado, es decir un bucle For (Columnas) para Artículos y otro For (Filas) para fechas de Expiración. La idea sería hacer el bucle combinado una sola vez para filas y Columnas para que carguen Artículos y fechas a la misma vez. He probado varias formas, pero no lo consigo.

Este es el código que tengo el archivo trabajando.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
Option Explicit
'Reporte de Inventario Refrigerado
Sub Santiago()
Dim Inventario#, old&, FilaB&, FilaC&, FilaA&, ColumnaD&
Dim WS1 As Worksheet
Dim WS2 As Worksheet
Dim AlmacenP, Origen, FechExP, ArticuloAnalisis, AlmacenInv, ArticuloInventario, EstatusInv
Dim Demanda, PUnitario, Numeracion, Ref, Col
Dim Inventario_QAD As Range
Dim Expiracion As Range
Worksheets("Inv-PedRefrigerado_1").Range("D3:KN76").Value = Empty
Worksheets("Inv-PedRefrigerado_1").Range("B6:C76").Value = Empty
 
With Application
.ScreenUpdating = False
old = .Calculation
.Calculation = xlCalculationManual
.EnableEvents = False
End With
 
Call FechaExpiracionAscendente
Application.Calculation = xlAutomatic
 
Set WS1 = Worksheets("Inventario")
Set WS2 = Worksheets("Inv-PedRefrigerado_1")
 
FilaA = 2
While WS1.Cells(FilaA, 1).Value <> ""
      FilaA = FilaA + 1
Wend
 
FilaB = 2
While WS2.Cells(FilaB, 2).Value <> ""
      FilaB = FilaB + 1
Wend
 
'Items y Fechas de Expiracion
Ref = 6
Numeracion = 0
For Each Inventario_QAD In WS1.Range("A2:A" & FilaA - 1)
         AlmacenInv = Inventario_QAD.Offset(, 0).Value   '"A"
         EstatusInv = Inventario_QAD.Offset(, 13).Value  '"N"
         Origen = Inventario_QAD.Offset(, 14).Value      '"O"
         FechExP = Inventario_QAD.Offset(, 8).Value      '"I"
 
         If UCase(EstatusInv) = "STOCK LIB" And UCase(Origen) = "PLF" Then
 
            If FechExP <> Inventario_QAD.Offset(-1, 8).Value Then
               WS2.Cells(Ref, 3).Value = FechExP
               Numeracion = Numeracion + 1
               WS2.Cells(Ref, 2).Value = Numeracion
               Ref = Ref + 1
            End If
         End If
Next
 
Call SkuAscendente
Application.Calculation = xlAutomatic
 
'Sku por su descripcion, origen y familia
Ref = 4
For Each Inventario_QAD In WS1.Range("A2:A" & FilaA - 1)
         AlmacenInv = Inventario_QAD.Offset(, 0).Value  '"A"
         EstatusInv = Inventario_QAD.Offset(, 13).Value '"N"
         Origen = Inventario_QAD.Offset(, 14).Value     '"O"
         FechExP = Inventario_QAD.Offset(, 8).Value     '"I"
 
         If (AlmacenInv = 200 Or UCase(AlmacenInv) = "200VR") And (UCase(EstatusInv) = "STOCK LIB" Or _
             UCase(EstatusInv) = "RESERVA" Or UCase(EstatusInv) = "TRANSITO" Or UCase(EstatusInv) = "RETENIDO") And _
             UCase(Origen) = "PLF" Then
 
             If WS2.Cells(4, Ref - 3).Value <> Inventario_QAD.Offset(, 2).Value Then
                WS2.Cells(3, Ref).Value = Inventario_QAD.Offset(, 15).Value '"P"
                WS2.Cells(4, Ref).Value = Inventario_QAD.Offset(, 2).Value  '"C"
                WS2.Cells(5, Ref).Value = Inventario_QAD.Offset(, 3).Value  '"D"
                Ref = Ref + 3
             End If
 
        End If
Next
With Application
.ScreenUpdating = True
.Calculation = old
.EnableEvents = True
End With
 
WS2.Cells(1, 11).Value = "INFORME DE PLF CD SANTIAGO"
End Sub

2._ En la Hoja(“Inv-PedRefrigerado_1”) logre adaptar tu código Sub Refrigerado_1CD200() para que trabaje para cargar cantidades del Inventario, Ordenado y Asignado, además de hacer el recorrido en las columnas con celdas combinadas. Pero no consigo adaptar tu otro código Sub Abarrotes_2CD200() podrías mencionarme donde estaría la modificacion?
Ambos códigos están en el Archivo.


3._ Hasta ahora en la Hoja(“Inv-PedRefrigerado_1”) teniendo como encabezado fijo Sku Artículos en columnas y Fechas Expiración en Filas, se han cargado el reporte con cantidades haciendo las consultas con un criterio para columnas y otro criterio para filas. Mi pregunta es cómo sería el código si en columnas consideramos 2 criterios por ejemplos: los criterios sean Sku Articulo (“D4”) y Familia (“D3”). ¿Como habría que modificar el código?


Criterios-por-Columnas-y-Filas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 11/04/2021 17:07:47
Como te comente en mi último mensaje (09/04/2021 19:08:59) Estoy intentando hacer una macro más rápida partiendo de que la hoja Inventario esta ordenada por Almacen + Status.

Me he encontrado con varios problemas:
- El 1º que no se que quieres que haga la macro.
- El 2º pero el más importante es que no se puede leer e interpretar bien

Te aclaro este punto, cuando haces un programa sabes lo que haces porque en tu cabeza esta la estructura de lo que haces y por qué lo haces y lo puedes leer porque en realidad no lo lees sino que te guias por la imagen mental que tienes de la estructura. Si la imagen mental y es plasmarlo en el código es correcto el programa funciona bién.

El problema viene cuando retomas el proyecto un año después para hacer un ajuste y la estructura del programa ya no esta en tu cabeza, a menos que tengas una memoria excepcional que puede que no sea el caso, o tiene que retomar el asunto otra persona que para mas inri desconoce o no participo en el proyecto inicial. Es muy difícil saber que hace un programa si no hay comentarios, las referencias a las hojas son WS1 y WS2 por que te lo tienes que mirar 20 veces para recordar de cual es cada hoja, Cell Celda para lo mismo y los offset().

Por ejemplo en el primer caso en lugar de SW1 y WS2 utilizo WS_Pedi y WS_Inve que son un poco mas intuitivas de entender.
Para la variable del puntero de filas utilizo Filas_Deri y Filas_Inve y seguro que sabe a que hoja apunta cara una y no FilaB.

Y todo esto viene a cuento de los cambio que he realizado en la nueva macro, que aun no funciona, para que le des un vistazo.
Esta en una hoja que se llama MACRO. He marcado en color varias zonas para que me explique la condición y la asignación de cada caso.

Te aseguro que el primero me a dejado patidifuso:

1
2
3
4
5
Inv = Celda.Offset(, 14).Value
Asig = Inv
RebajaInv = Inv - Asig
Celda.Offset(, 14).Value = RebajaInv
Cell.Offset(, 42).Value = Asig

No es mas Sencillo y se interpreta mejor, aunque esta cojo.

1
2
Celda.Offset(, 14).Value = 0
Cell.Offset(, 42).Value = Celda.Offset(, 14).Value

Y este es el sencillo entros Campos que Sumas, Restas y vuelves a Sumar varias veces el mismo campo ¿Para qué?

Espero tus comentarios

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 11/04/2021 18:00:32
Hola Antoni, espero que te encuentres bien.

En los tres casos son escenarios planteados distintos al planteado en mi penúltimo mensaje, por eso te envíe un archivo distinto.
el Archivo PreAsignación es un caso distinto al Archivo PreAsignación e Inventario CDs.

Si revisas el Archivo PreAsignación e Inventario CDs. veras que es otro escenario diferente planteado y te darás cuenta de las tres consultas que realice.

1° consulta esta en el modulo 10

2° Consulta: esta en el modulo 2 tu codigo Sub Refrigerado_1CD200() que adapte para que carque Tres cantidades diferentes Inventario, Ordenado y Asignado y esta funcionando. Lo que no consigo adaptar para lo mismo es tu otro codigo Sub Abarrotes_2CD200() que esta en el modulo 3

3° Consulta: es un hipotético caso si es que tengo que hacer la consulta en la Hoja(“Inv-PedRefrigerado_1”) por columnas con dos criterios Sku Articulo y Familia. La consulta por Fecha Expiracion en filas se mantiene.
¿como seria el desarrollo del codigo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 11/04/2021 19:22:44
Volviendo a la aclaración que me sugeriste del Archivo PreAsignacion_V0

La idea es que en la columna (Hoja “Inventario” Col “O”) ahí mismo se vayan restando las cantidades del inventario. En la columna (Hoja “Pedidos” Col “AQ”) se colocan las cantidades que se descuentan del inventario (Hoja “Inventario” Col “O”), esos descuentos son solicitados por cantidades ordenadas (Hoja “Pedidos” Col “L”). En la columna (Hoja “Pedidos” Col “AS”) se colocan las Fechas de Expiración (Hoja “Inventario” Col “I”) que correspondan a las cantidades descontadas de (Hoja “Inventario” Col “O”)

Color Amarillo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
If CantOrd_Ped (Hoja “Pedidos” Col “L”) <= Vaciado_Inv (Hoja “Inventario” Col “O”) And  _
     CantAsg_Ped (Hoja “Pedidos” Col “AQ”) = Empty Then
 
WS_Inve.Cells(Fila_Inve, "O") = Vaciado_Inv (Hoja “Inventario” Col “O”) - CantOrd_Ped (Hoja “Pedidos” Col “L”)
WS_Pedi.Cells(Fila_Pedi, "AQ") = CantOrd_Ped (Hoja “Pedidos” Col “L”)
Salir = True
__________ ._________________________
 
Color verde
ElseIf Vaciado_Inv (Hoja “Inventario” Col “O”) > 0 And _
CantOrd_Ped (Hoja “Pedidos” Col “L”) > Vaciado_Inv (Hoja “Inventario” Col “O”) And _
CantAsg_Ped (Hoja “Pedidos” Col “AQ”) = Empty Then
 
WS_Inve.Cells(Fila_Inve, "O") = 0
WS_Pedi.Cells(Fila_Pedi, "AQ") = Vaciado_Inv (Hoja “Inventario” Col “O”)
________________________.____________
 
Color celeste
ElseIf Vaciado_Inv (Hoja “Inventario” Col “O”) > 0 And _
CantOrd_Ped (Hoja “Pedidos” Col “L”) > CantAsg_Ped (Hoja “Pedidos” Col “AQ”) And _
Vaciado_Inv (Hoja “Inventario” Col “O”) <= Asignad_Ped And _
CantAsg_Ped (Hoja “Pedidos” Col “AQ”) <> Empty Then
 
Inv = Vaciado_Inv(Hoja “Inventario” Col “O”)
AsigPend = CantOrd_Ped (Hoja “Pedidos” Col “L”)  - CantAsg_Ped (Hoja “Pedidos” Col “AQ”)
Asig = (AsigPend + Vaciado_Inv(Hoja “Inventario” Col “O”)) - (CantOrd_Ped (Hoja “Pedidos” Col “L”) - CantAsg_Ped(Hoja “Pedidos” Col “AQ”))
 
RebajaInv = (AsigPend + Vaciado_Inv (Hoja “Inventario” Col “O”)) - (CantOrd_Ped (Hoja “Pedidos” Col “L”)  - CantAsg_Ped (Hoja “Pedidos” Col “AQ”)) - Vaciado_Inv(Hoja “Inventario” Col “O”)
 
WS_Inve.Cells(Fila_Inve, "O") =  CantOrd_Ped (Hoja “Pedidos” Col “L”) - CantAsg_Ped (Hoja “Pedidos” Col “AQ”)  - CantOrd_Ped (Hoja “Pedidos” Col “L”) + CantAsg_Ped (Hoja “Pedidos” Col “AQ”)
 
WS_Pedi.Cells(Fila_Pedi, "AQ") = CantAsg_Ped (Hoja “Pedidos” Col “AQ”) + CantOrd_Ped(Hoja “Pedidos” Col “L”)  - CantAsg_Ped (Hoja “Pedidos” Col “AQ”)  + Vaciado_Inv (Hoja “Inventario” Col “O”) – AsigPend
 
If CantOrd_Ped (Hoja “Pedidos” Col “L”)  = CantAsg_Ped (Hoja “Pedidos” Col “AQ”) Then
Salir = True
End If
_____________________.__________________
 
Color Rosado
ElseIf Vaciado_Inv (Hoja “Inventario” Col “O”)> 0 And _
CantOrd_Ped (Hoja “Pedidos” Col “L”)> CantAsg_Ped (Hoja “Pedidos” Col “AQ”) And _
Vaciado_Inv (Hoja “Inventario” Col “O”)> Asignad_Ped And _
CantAsg_Ped (Hoja “Pedidos” Col “AQ”) <> Empty Then
 
Inv = Vaciado_Inv (Hoja “Inventario” Col “O”)
AsigPend = CantOrd_Ped (Hoja “Pedidos” Col “L”) - CantAsg_Ped (Hoja “Pedidos” Col “AQ”)
Asig = (AsigPend + Inv) - Vaciado_Inv (Hoja “Inventario” Col “O”)
RebajaInv = Vaciado_Inv (Hoja “Inventario” Col “O”) – Asig
WS_Inve.Cells(Fila_Inve, "O") = RebajaInv
WS_Pedi.Cells(Fila_Pedi, "AQ") = CantAsg_Ped (Hoja “Pedidos” Col “AQ”) + Asig
 
If CantOrd_Ped (Hoja “Pedidos” Col “L”)= CantAsg_Ped (Hoja “Pedidos” Col “AQ”) Then
  Salir = True
End If
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 11/04/2021 23:59:10
Gracias por responder.
Seguiré trabajando en las macros.

De todas formas no entiendo la complicación de los cálculos.
En algunos sumas y restas la misma variable que siempre da resultado 0. (Caso del color Rosado)

Y hacer esto:

C = A - B - D + B

Es hacer perder tiempo al procesador.
Si tarda 1 micra de segundo (0,000001 seg.) de mas en hacer este calculo que en hacer este:

C = A - D

y lo tiene que hacer 10.000.000 veces pierdes innecesariamente 10 segundos, cuanto menos tonterías de estas tenga el programa más rápido será y más fácil de entender.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 12/04/2021 05:20:42
Si, revise el archivo original y tiene varias redundancias que las corregi y funcionan bien. Te envio el codigo del archivo original corregido.
También modifique en el archivo que enviaste ver Imagen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
Private Sub Informe_Click()
Dim ORD#, Asig#, AsigPend#, PICK#, InvAsig#, Inv#, RebajaInv#, FILAA&, FILA1&, old&, FilaB&, FilaC&
    Dim WS1 As Worksheet
    Dim WS2 As Worksheet
    Dim Max, AlmacenP, CodigoArticuloP, VencCorteP, AlmacenInv, CodigoArticuloInv, ExpiracionArtInv, StatusInv
    Dim Almacen, Articulo, StockAsig
    Dim Celda_Pedid As Range
    Dim Celda_Inven As Range
 
    'Descontar en inventario la demanda de Articulos Asignados
 
    Worksheets("Pedidos").Range("AQ2:AQ9000").Value = Empty
    Worksheets("Pedidos").Range("AR2:AR9000").Value = Empty
    Worksheets("Pedidos").Range("AS2:AS9000").Value = Empty
    Worksheets("Inventario").Range("O2:O9000").Value = Empty
 
    With Application
        .ScreenUpdating = False
        old = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
 
    MaxDiaCorte
    'Application.Calculation = xlAutomatic
 
    Set WS1 = Worksheets("Pedidos")
    Set WS2 = Worksheets("Inventario")
 
    FilaB = 2
    While WS1.Cells(FilaB, 9).Value <> ""
          FilaB = FilaB + 1
    Wend
 
    FilaC = 2
    While WS2.Cells(FilaC, 3).Value <> ""
          FilaC = FilaC + 1
    Wend
 
    For Each Celda_Inven In WS2.Range("A2:A" & FilaC - 1)
        Celda_Inven.Offset(, 14).Value = Celda_Inven.Offset(, 6).Value
    Next
 
    Inv = 0#
    RebajaInv = 0#
    Asig = 0#
    AsigPend = 0#
 
    For Each Celda_Pedid In WS1.Range("A2:A" & FilaB - 1)
 
        AlmacenP = Celda_Pedid.Offset(, 0).Value
        CodigoArticuloP = Celda_Pedid.Offset(, 8).Value
        VencCorteP = Celda_Pedid.Offset(, 10).Value + Celda_Pedid.Offset(, 3).Value
        'DoEvents
 
        For Each Celda_Inven In WS2.Range("A2:A" & FilaC - 1)
 
            AlmacenInv = Celda_Inven.Offset(, 0).Value        'A
            CodigoArticuloInv = Celda_Inven.Offset(, 2).Value 'C
            ExpiracionArtInv = Celda_Inven.Offset(, 8).Value  'I
            StatusInv = Celda_Inven.Offset(, 13).Value        'N
 
 
            If AlmacenP = AlmacenInv And _
               CodigoArticuloP = CodigoArticuloInv And _
                VencCorteP <= ExpiracionArtInv And _
                StatusInv = "STock Lib" Then
 
                Celda_Pedid.Offset(, 43).Value = VencCorteP
                Celda_Pedid.Offset(, 44).Value = ExpiracionArtInv
 
                If Celda_Pedid.Offset(, 11).Value <= Celda_Inven.Offset(, 14).Value And Celda_Pedid.Offset(, 42).Value = Empty Then
 
                    Inv = Celda_Inven.Offset(, 14).Value
                    Asig = Celda_Pedid.Offset(, 11).Value
                    RebajaInv = Inv - Asig
                    Celda_Inven.Offset(, 14).Value = RebajaInv
                    Celda_Pedid.Offset(, 42).Value = Asig
                    Exit For
 
                ElseIf Celda_Inven.Offset(, 14).Value > 0 And _
                       Celda_Pedid.Offset(, 11).Value > Celda_Inven.Offset(, 14).Value And _
                       Celda_Pedid.Offset(, 42).Value = Empty Then
 
                    Inv = Celda_Inven.Offset(, 14).Value
                    Asig = Inv
                    RebajaInv = 0
                    'RebajaInv = Inv - Asig
                    Celda_Inven.Offset(, 14).Value = RebajaInv
                    Celda_Pedid.Offset(, 42).Value = Asig
 
                ElseIf Celda_Inven.Offset(, 14).Value > 0 And _
                       Celda_Pedid.Offset(, 11).Value > Celda_Pedid.Offset(, 42).Value And _
                       Celda_Inven.Offset(, 14).Value <= (Celda_Pedid.Offset(, 11).Value - Celda_Pedid.Offset(, 42).Value) And _
                       Celda_Pedid.Offset(, 42).Value <> Empty Then
 
                    Inv = Celda_Inven.Offset(, 14).Value
                    AsigPend = Celda_Pedid.Offset(, 11).Value - Celda_Pedid.Offset(, 42).Value
                    Asig = Inv
                    'Asig = (AsigPend + Inv) - AsigPend
                    RebajaInv = 0
                    'RebajaInv = Asig - Inv
                    Celda_Inven.Offset(, 14).Value = RebajaInv
                    Celda_Pedid.Offset(, 42).Value = Celda_Pedid.Offset(, 42).Value + Asig
 
                    If Celda_Pedid.Offset(, 11).Value = Celda_Pedid.Offset(, 42).Value Then
                       Exit For
                    End If
 
                ElseIf Celda_Inven.Offset(, 14).Value > 0 And _
                       Celda_Pedid.Offset(, 11).Value > Celda_Pedid.Offset(, 42).Value And _
                       Celda_Inven.Offset(, 14).Value > (Celda_Pedid.Offset(, 11).Value - Celda_Pedid.Offset(, 42).Value) And _
                       Celda_Pedid.Offset(, 42).Value <> Empty Then
 
                    Inv = Celda_Inven.Offset(, 14).Value
                    AsigPend = Celda_Pedid.Offset(, 11).Value - Celda_Pedid.Offset(, 42).Value
                    Asig = AsigPend
                    'Asig = (AsigPend + Inv) - Inv
                    RebajaInv = Inv - Asig
                    Celda_Inven.Offset(, 14).Value = RebajaInv
                    Celda_Pedid.Offset(, 42).Value = Celda_Pedid.Offset(, 42).Value + Asig
 
                    If Celda_Pedid.Offset(, 11).Value = Celda_Pedid.Offset(, 42).Value Then
                       Exit For
                    End If
                End If
                RebajaInv = 0#
                Inv = 0#
                Asig = 0#
                AsigPend = 0#
             End If
        Next
    Next
    With Application
.ScreenUpdating = True
.Calculation = old
.EnableEvents = True
End With
End Sub




Codigo-Modificado-PreAsignado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 13/04/2021 12:23:39
Antoni, estoy tratando de adaptar su código para el archivo PreAsignación, aun me marca errores. No se si estoy en la vía correcta.

Esto es lo que modifique.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
Option Explicit
 
Sub Refrigerado_1CD200()
Dim WS1_Inv As Worksheet, old As Integer
    Dim WS2_Ped As Worksheet
    Dim Celda_Inven As Range
    Dim Inv, Asig, RebajaInv, AsigPend As Long
    Dim Fil, Fil1, Fil2, Fil3 As Integer, Fila As Long, _
        Col, FilaC As Integer, _
        Total As Long
    Dim Tabla_Col() As Long, Ini As Single
    Dim Tabla_Fil_FechaInventario_Pedido() As Date
    Dim Tabla_Fil_FechaCorte_Pedido() As Date
    Dim Tabla_Fil_AlmacenPedido() As Variant
    Dim Tabla_Fil_PreAsignado_Pedido() As Long
    Dim Tabla_Fil_VencCorte_Pedido() As Date
    Dim Tabla_Fil_Ordenado_Pedido() As Long
    Dim Tabla_Fil_Almacen_Sku_Pedido() As Variant
 
    Inicio = Timer
 
    ' ---&--- Limpia la Hoja
    Worksheets("Pedidos").Range("AQ2:AQ9000").Value = Empty
    Worksheets("Pedidos").Range("AR2:AR9000").Value = Empty
    Worksheets("Pedidos").Range("AS2:AS9000").Value = Empty
    Worksheets("Inventario").Range("O2:O9000").Value = Empty
 
    With Application
        .ScreenUpdating = False
        old = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
 
    Set WS1_Inv = Worksheets("Inventario")
    Set WS2_Ped = Worksheets("Pedidos")
 
    FilaC = 2
    While WS1_Inv.Cells(FilaC, 3).Value <> ""
          FilaC = FilaC + 1
    Wend
 
    For Each Celda_Inven In WS1_Inv.Range("A2:A" & FilaC - 1)
        Celda_Inven.Offset(, 14).Value = Celda_Inven.Offset(, 6).Value
    Next
 
    ' ---&--- Carga los datos en las tablas
 
    With WS2_Ped
 
        ' ---&--- Tabla Filas
        Fil = 2
        While .Cells(Fil, 2).Value <> ""
            ReDim Preserve Tabla_Fil_FechaInventario_Pedido(Fil)
            ReDim Preserve Tabla_Fil_FechaCorte_Pedido(Fil)
            ReDim Preserve Tabla_Fil_PreAsignado_Pedido(Fil)
            ReDim Preserve Tabla_Fil_VencCorte_Pedido(Fil)
            ReDim Preserve Tabla_Fil_Almacen_Sku_Pedido(Fil)
            ReDim Preserve Tabla_Fil_Ordenado_Pedido(Fil)
 
            Tabla_Fil_Almacen_Sku_Pedido(Fil) = .Cells(Fil, 1) & Val(.Cells(Fil, 9))
 
            Tabla_Fil_Ordenado_Pedido(Fil) = Val(.Cells(Fil, 12))
            Tabla_Fil_VencCorte_Pedido(Fil) = Format(.Cells(Fil, 4), "yyyy.mm.dd") + Val(.Cells(Fil, 11))
            Fil = Fil + 1
        Wend
 
 
    End With
 
With WS1_Inv
Fila = 2
     While .Cells(Fila, "A") <> ""
 
          If UCase(.Cells(Fila, "N")) = "STOCK LIB" And Val(.Cells(Fila, "O")) > 0 Then
             Fil = Buscar_1(.Cells(Fila, "A") & Val(.Cells(Fila, "C")), Tabla_Fil_Almacen_Sku_Pedido)
 
             If Tabla_Fil_VencCorte_Pedido(Fil) <= .Cells(Fila, "I") Then
                Tabla_Fil_FechaInventario_Pedido(Fil) = Format(.Cells(Fila, "I"), "yyyy.mm.dd")
 
 
                If Tabla_Fil_Ordenado_Pedido(Fil) <= .Cells(Fila, "O") And Tabla_Fil_PreAsignado_Pedido(Fil) = Empty Then
 
                   Inv = .Cells(Fila, "O")
                   Asig = Tabla_Fil_Ordenado_Pedido(Fil)
                   RebajaInv = Inv - Asig
                  .Cells(Fila, "O") = RebajaInv
                   Tabla_Fil_PreAsignado_Pedido(Fil) = Asig
                   Exit Sub
 
                   ElseIf .Cells(Fila, "O") > 0 And Tabla_Fil_Ordenado_Pedido(Fil) > .Cells(Fila, "O") And _
                          Tabla_Fil_PreAsignado_Pedido(Fil) = Empty Then
 
                          Inv = .Cells(Fila, "O")
                          Asig = Inv
                          RebajaInv = Inv - Asig
                         .Cells(Fila, "O") = RebajaInv
                          Tabla_Fil_PreAsignado_Pedido(Fil) = Asig
 
                          ElseIf .Cells(Fila, "O") > 0 And Tabla_Fil_Ordenado_Pedido(Fil) > Tabla_Fil_PreAsignado_Pedido(Fil) And _
                                 .Cells(Fila, "O") <= (Tabla_Fil_Ordenado_Pedido(Fil) - Tabla_Fil_PreAsignado_Pedido(Fil)) _
                                  And Tabla_Fil_PreAsignado_Pedido(Fil) <> Empty Then
 
                                  Inv = .Cells(Fila, "O")
                                  AsigPend = Tabla_Fil_Ordenado_Pedido(Fil) - Tabla_Fil_PreAsignado_Pedido(Fil)
                                  Asig = (AsigPend + Inv) - AsigPend
                                  RebajaInv = Asig - Inv
                                 .Cells(Fila, "O") = RebajaInv
                                  Tabla_Fil_PreAsignado_Pedido(Fil) = Tabla_Fil_PreAsignado_Pedido(Fil) + Asig
 
                                  If Tabla_Fil_Ordenado_Pedido(Fil) = Tabla_Fil_PreAsignado_Pedido(Fil) Then
                                     Exit Sub
                                  End If
 
                                  ElseIf .Cells(Fila, "O") > 0 And Tabla_Fil_Ordenado_Pedido(Fil) > _
                                          Tabla_Fil_PreAsignado_Pedido(Fil) And .Cells(Fila, "O") > _
                                          (Tabla_Fil_Ordenado_Pedido(Fil) - Tabla_Fil_PreAsignado_Pedido(Fil)) And _
                                          Tabla_Fil_PreAsignado_Pedido(Fil) <> Empty Then
 
                                          Inv = .Cells(Fila, "O")
                                          AsigPend = Tabla_Fil_Ordenado_Pedido(Fil) - Tabla_Fil_PreAsignado_Pedido(Fil)
                                          Asig = (AsigPend + Inv) - Inv
                                          RebajaInv = Inv - Asig
                                          .Cells(Fila, "O") = RebajaInv
                                          Tabla_Fil_PreAsignado_Pedido(Fil) = Tabla_Fil_PreAsignado_Pedido(Fil) + Asig
 
                                          If Tabla_Fil_Ordenado_Pedido(Fil) = Tabla_Fil_PreAsignado_Pedido(Fil) Then
                                             Exit Sub
                                          End If
                End If
                RebajaInv = 0#
                Inv = 0#
                Asig = 0#
                AsigPend = 0#
       End If
    End If
    Fila = Fila + 1
  Wend
End With
 
    ' ---&--- Escribe los datos en la hoja Refrigerado
 
    With WS2_Ped
            For Fil = 2 To UBound(Tabla_Fil_Almacen_Sku_Pedido)
                If Tabla_Fil_PreAsignado_Pedido(Fil, 43) <> 0 Then
 
                    .Cells(Fil, 43) = Tabla_Fil_PreAsignado_Pedido(Fil, 43)
                    .Cells(Fil, 45) = Tabla_Fil_FechaInventario_Pedido(Fil, 45)
 
                End If
            Next
    End With
 
    MsgBox "Fin de la Macro Ver. 1.00" & vbCrLf & "Tiempo: " & Timer - Inicio
End Sub
 
Function Buscar_1(Text, Tabla)
    Dim a As Long
    For a = 1 To UBound(Tabla)
        If Text = Tabla(a) Then Buscar_1 = a: Exit For
    Next
End Function
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 14/04/2021 19:49:59
Esta es la macro que utiliza la hoja de Pedidos y la de Inventario para hacer las asignaciones. Ver fichero Adjunto.

Es bastante más rápida, tarda unos 90 segundos, pero tiene una pega necesita la hoja de inventario ordenada por:

Almacen (A) + Status (N) + Articulo (C) + Expira(I)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
Private Sub Informe_Click()
    Dim Almacen_Ped As String, Articul_Ped As Long, VencCor_Ped As Date, _
        CantOrd_Ped As Long, CantAsg_Ped As Long, Codigo As String, _
        Asignad_Ped As Long
 
    Dim Almacen_Inv As String, Articul_Inv As Long, Expirac_Inv As Date, _
        StatusI_Inv As String, Vaciado_Inv As Long, Asignar As Long
 
    Dim Fila_Pedi As Long, Total_Pedi As Long, Almacen As String, _
        Fila_Inve As Long, Total_Inve As Long, Puntero As Long
 
    Dim Tab_Alm() As String, Tab_Reg() As Long, a As Long, Num As Byte, _
        Registro As String
 
    Dim WS_Pedi As Worksheet, _
        WS_Inve As Worksheet, Inicio As Single, Old As Integer
 
    Inicio = Timer
 
    ' ---&--- Limpieza
 
    Set WS_Pedi = Worksheets("Pedidos")
    Set WS_Inve = Worksheets("Inventario")
 
    WS_Pedi.Range("AQ2:AQ9000") = Empty
    WS_Pedi.Range("AR2:AR9000") = Empty
    WS_Pedi.Range("AS2:AS9000") = Empty
    WS_Inve.Range("O2:O9000") = Empty
 
    With Application
        .ScreenUpdating = False
        Old = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
 
'    Call MaxDiaCorte
    Application.Calculation = xlAutomatic
 
    ' ---&--- Cuenta las lines - Rellena la Columna P - Asigna Col 'G' a la 'O'
 
    With WS_Inve
        Total_Inve = 2
        While .Cells(Total_Inve, "A") <> ""
              .Cells(Total_Inve, "O") = .Cells(Total_Inve, "G")
 
            Total_Inve = Total_Inve + 1
        Wend
        DoEvents
    End With
 
    ' ---&--- Busca el primer registro de cada almacen
 
    Num = 0
    Registro = "^"
    For a = 2 To Total_Inve
        If WS_Inve.Cells(a, "N") = "STock Lib" Then
            If IsNumeric(WS_Inve.Cells(a, "A")) Then
                Almacen = Str(WS_Inve.Cells(a, "A"))
            Else
                Almacen = WS_Inve.Cells(a, "A")
            End If
 
            If InStr(Registro, UCase(Almacen)) = 0 Then
                Num = Num + 1
                ReDim Preserve Tab_Alm(Num): Tab_Alm(Num) = UCase(Almacen)
                ReDim Preserve Tab_Reg(Num): Tab_Reg(Num) = a
                Registro = Registro & UCase(Almacen) & "^"
            End If
        End If
        DoEvents
    Next
 
    ' ---&--- Cuenta las filas de PEDIDOS
 
    Total_Pedi = 2
    While WS_Pedi.Cells(Total_Pedi, 9) <> ""
        Total_Pedi = Total_Pedi + 1
        DoEvents
    Wend
 
    ' -----------------------------------------------------------------------
    ' ---&--- Proceso principal ---------------------------------------------
    ' -----------------------------------------------------------------------
 
   For Fila_Pedi = 2 To Total_Pedi
        With WS_Pedi
            Almacen_Ped = .Cells(Fila_Pedi, "A")
            Articul_Ped = .Cells(Fila_Pedi, "I")
            VencCor_Ped = .Cells(Fila_Pedi, "K") + .Cells(Fila_Pedi, "D")
 
            CantOrd_Ped = .Cells(Fila_Pedi, "L")
            CantAsg_Ped = .Cells(Fila_Pedi, "AQ")
 
            Asignad_Ped = CantOrd_Ped - CantAsg_Ped
 
            ' ---&--- Prepado el codigo de almacen para buscar en la tabla
 
            If IsNumeric(.Cells(Fila_Pedi, "A")) Then
               Codigo = Str(.Cells(Fila_Pedi, "A"))
            Else
               Codigo = .Cells(Fila_Pedi, "A")
            End If
        End With
        DoEvents
 
        ' ---&--- Si no esta en el registro no lo busca en el inventario
 
        If InStr(Registro, "^" & UCase(Codigo) & "^") > 0 Then
 
            ' ---&--- Busca la posición 1er registro inventario
 
            For a = 1 To Num
                If UCase(Codigo) = Tab_Alm(a) Then Puntero = Tab_Reg(a): Exit For
            Next
 
            ' ---&--- Lee la hoja de Inventario
 
            For Fila_Inve = Puntero To Total_Inve
                With WS_Inve
                    Almacen_Inv = .Cells(Fila_Inve, "A")    '0
                    Articul_Inv = .Cells(Fila_Inve, "C")    '2
                    Expirac_Inv = .Cells(Fila_Inve, "I")    '8
                    StatusI_Inv = .Cells(Fila_Inve, "N")    '13
                    Vaciado_Inv = .Cells(Fila_Inve, "O")    '14
                End With
 
                ' ---&--- Finaliza si cambia de almacen _
                                   El articulo es mayor que el que busco _
                                   Si no es STock Lib
 
                If Almacen_Ped <> Almacen_Inv Then Exit For
                If Articul_Ped < Articul_Inv Then Exit For
                If StatusI_Inv <> "STock Lib" Then Exit For
                ' --- Esta deltro de los rango
 
                If Almacen_Ped = Almacen_Inv And _
                   Articul_Ped = Articul_Inv And VencCor_Ped <= Expirac_Inv And _
                   StatusI_Inv = "STock Lib" Then
 
                    WS_Pedi.Cells(Fila_Pedi, "AR") = VencCor_Ped
                    WS_Pedi.Cells(Fila_Pedi, "AS") = Expirac_Inv
 
                    ' ---&--- Realiza la asignación si hay stock
 
                    If Vaciado_Inv > 0 Then
                        If Vaciado_Inv >= CantOrd_Ped - CantAsg_Ped Then
                            Asignar = CantOrd_Ped - CantAsg_Ped
 
                            WS_Inve.Cells(Fila_Inve, "O") = Vaciado_Inv - Asignar
                            WS_Pedi.Cells(Fila_Pedi, "AQ") = CantAsg_Ped + Asignar
                        Else
                            WS_Inve.Cells(Fila_Inve, "O") = 0
                            WS_Pedi.Cells(Fila_Pedi, "AQ") = CantAsg_Ped + Vaciado_Inv
                        End If
                        CantAsg_Ped = WS_Pedi.Cells(Fila_Pedi, "AQ")
 
                        If WS_Pedi.Cells(Fila_Pedi, "L") = WS_Pedi.Cells(Fila_Pedi, "AQ") Then
                           Exit For
                        End If
                    End If
 
                End If
                DoEvents
            Next
        End If
    Next
    MsgBox "Fin.  " & Timer - Inicio
End Sub

Si la hoja ha de tener un orden diferente tengo otra versión que la ordena para sus necesidades y la vuelve a dejar en el orden original:
El tiempo de ejecucion puede ser unos pocos segundos más.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
Private Sub Informe_Click()
    Dim Almacen_Ped As String, Articul_Ped As Long, VencCor_Ped As Date, _
        CantOrd_Ped As Long, CantAsg_Ped As Long, Codigo As String, _
        Asignad_Ped As Long
 
    Dim Almacen_Inv As String, Articul_Inv As Long, Expirac_Inv As Date, _
        StatusI_Inv As String, Vaciado_Inv As Long, Asignar As Long
 
    Dim Fila_Pedi As Long, Total_Pedi As Long, Almacen As String, _
        Fila_Inve As Long, Total_Inve As Long, Puntero As Long
 
    Dim Tab_Alm() As String, Tab_Reg() As Long, a As Long, Num As Byte, _
        Registro As String
 
    Dim WS_Pedi As Worksheet, _
        WS_Inve As Worksheet, Inicio As Single, Old As Integer
 
    Inicio = Timer
 
    ' ---&--- Limpieza
 
    Set WS_Pedi = Worksheets("Pedidos")
    Set WS_Inve = Worksheets("Inventario")
 
    WS_Pedi.Range("AQ2:AQ9000") = Empty
    WS_Pedi.Range("AR2:AR9000") = Empty
    WS_Pedi.Range("AS2:AS9000") = Empty
    WS_Inve.Range("O2:O9000") = Empty
 
    With Application
        .ScreenUpdating = False
        Old = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
 
'    Call MaxDiaCorte
    Application.Calculation = xlAutomatic
 
    ' ---&--- Cuenta las lines - Rellena la Columna P - Asigna Col 'G' a la 'O'
 
    With WS_Inve
        Total_Inve = 2
        While .Cells(Total_Inve, "A") <> ""
              .Cells(Total_Inve, "O") = .Cells(Total_Inve, "G")
              .Cells(Total_Inve, "P") = Total_Inve
 
            Total_Inve = Total_Inve + 1
        Wend
        DoEvents
    End With
 
    ' ---&--- Ordena por:  Almacen + Status + Articulo +Expira
 
    Sheets("Inventario").Select
    With ActiveWorkbook.Worksheets("Inventario").Sort.SortFields
        .Clear
        .Add2 Key:=Range("A2:A" & Total_Inve), SortOn:=xlSortOnValues, _
                                               Order:=xlAscending, _
                                               DataOption:=xlSortNormal
 
        .Add2 Key:=Range("N2:N" & Total_Inve), SortOn:=xlSortOnValues, _
                                               Order:=xlAscending, _
                                               DataOption:=xlSortNormal
 
        .Add2 Key:=Range("C2:C" & Total_Inve), SortOn:=xlSortOnValues, _
                                               Order:=xlAscending, _
                                               DataOption:=xlSortNormal
 
        .Add2 Key:=Range("I2:I" & Total_Inve), SortOn:=xlSortOnValues, _
                                               Order:=xlAscending, _
                                               DataOption:=xlSortNormal
    End With
 
    With ActiveWorkbook.Worksheets("Inventario").Sort
        .SetRange Range("A1:P" & Total_Inve)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
 
    ' ---&--- Busca el primer registro de cada almacen
 
    Num = 0
    Registro = "^"
    For a = 2 To Total_Inve
        If WS_Inve.Cells(a, "N") = "STock Lib" Then
            If IsNumeric(WS_Inve.Cells(a, "A")) Then
                Almacen = Str(WS_Inve.Cells(a, "A"))
            Else
                Almacen = WS_Inve.Cells(a, "A")
            End If
 
            If InStr(Registro, UCase(Almacen)) = 0 Then
                Num = Num + 1
                ReDim Preserve Tab_Alm(Num): Tab_Alm(Num) = UCase(Almacen)
                ReDim Preserve Tab_Reg(Num): Tab_Reg(Num) = a
                Registro = Registro & UCase(Almacen) & "^"
            End If
        End If
        DoEvents
    Next
 
    ' ---&--- Cuenta las filas de PEDIDOS
 
    Total_Pedi = 2
    While WS_Pedi.Cells(Total_Pedi, 9) <> ""
        Total_Pedi = Total_Pedi + 1
        DoEvents
    Wend
 
    ' -----------------------------------------------------------------------
    ' ---&--- Proceso principal ---------------------------------------------
    ' -----------------------------------------------------------------------
 
   For Fila_Pedi = 2 To Total_Pedi
        With WS_Pedi
            Almacen_Ped = .Cells(Fila_Pedi, "A")
            Articul_Ped = .Cells(Fila_Pedi, "I")
            VencCor_Ped = .Cells(Fila_Pedi, "K") + .Cells(Fila_Pedi, "D")
 
            CantOrd_Ped = .Cells(Fila_Pedi, "L")
            CantAsg_Ped = .Cells(Fila_Pedi, "AQ")
 
            Asignad_Ped = CantOrd_Ped - CantAsg_Ped
 
            ' ---&--- Prepado el codigo de almacen para buscar en la tabla
 
            If IsNumeric(.Cells(Fila_Pedi, "A")) Then
               Codigo = Str(.Cells(Fila_Pedi, "A"))
            Else
               Codigo = .Cells(Fila_Pedi, "A")
            End If
        End With
        DoEvents
 
        ' ---&--- Si no esta en el registro no lo busca en el inventario
 
        If InStr(Registro, "^" & UCase(Codigo) & "^") > 0 Then
 
            ' ---&--- Busca la posición 1er registro inventario
 
            For a = 1 To Num
                If UCase(Codigo) = Tab_Alm(a) Then Puntero = Tab_Reg(a): Exit For
            Next
 
            ' ---&--- Lee la hoja de Inventario
 
            For Fila_Inve = Puntero To Total_Inve
                With WS_Inve
                    Almacen_Inv = .Cells(Fila_Inve, "A")    '0
                    Articul_Inv = .Cells(Fila_Inve, "C")    '2
                    Expirac_Inv = .Cells(Fila_Inve, "I")    '8
                    StatusI_Inv = .Cells(Fila_Inve, "N")    '13
                    Vaciado_Inv = .Cells(Fila_Inve, "O")    '14
                End With
 
                ' ---&--- Finaliza si cambia de almacen _
                                   El articulo es mayor que el que busco _
                                   Si no es STock Lib
 
                If Almacen_Ped <> Almacen_Inv Then Exit For
                If Articul_Ped < Articul_Inv Then Exit For
                If StatusI_Inv <> "STock Lib" Then Exit For
 
                ' --- Esta deltro de los rango
 
                If Almacen_Ped = Almacen_Inv And _
                   Articul_Ped = Articul_Inv And VencCor_Ped <= Expirac_Inv And _
                   StatusI_Inv = "STock Lib" Then
 
                    WS_Pedi.Cells(Fila_Pedi, "AR") = VencCor_Ped
                    WS_Pedi.Cells(Fila_Pedi, "AS") = Expirac_Inv
 
                    ' ---&--- Realiza la asignación si hay stock
 
                    If Vaciado_Inv > 0 Then
                        If Vaciado_Inv >= CantOrd_Ped - CantAsg_Ped Then
                            Asignar = CantOrd_Ped - CantAsg_Ped
 
                            WS_Inve.Cells(Fila_Inve, "O") = Vaciado_Inv - Asignar
                            WS_Pedi.Cells(Fila_Pedi, "AQ") = CantAsg_Ped + Asignar
                        Else
                            WS_Inve.Cells(Fila_Inve, "O") = 0
                            WS_Pedi.Cells(Fila_Pedi, "AQ") = CantAsg_Ped + Vaciado_Inv
                        End If
                        CantAsg_Ped = WS_Pedi.Cells(Fila_Pedi, "AQ")
 
                        If WS_Pedi.Cells(Fila_Pedi, "L") = WS_Pedi.Cells(Fila_Pedi, "AQ") Then
                           Exit For
                        End If
                    End If
 
                End If
                DoEvents
            Next
        End If
    Next
 
    ' ---&--- Restaura el orden Anterior
 
    Sheets("Inventario").Select
    With ActiveWorkbook.Worksheets("Inventario").Sort.SortFields
        .Clear
        .Add2 Key:=Range("P2:P" & Total_Inve), SortOn:=xlSortOnValues, _
                                               Order:=xlAscending, _
                                               DataOption:=xlSortNormal
    End With
 
    With ActiveWorkbook.Worksheets("Inventario").Sort
        .SetRange Range("A1:P" & Total_Inve)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
 
    WS_Inve.Columns("P:P").Select
    Selection.Delete Shift:=xlToLeft
    WS_Inve.Range("A2").Select
 
    MsgBox "Fin.  " & Timer - Inicio
End Sub

Y ahora vamos a la parte más importante que no hace que la macro corra mucho más deprisa pero la hace más clara y fácil de leer, esta es la parte marcada en negrita en este ultimo código.

Fijate que toda la parte de IF y ElseIf que tenias con todas las posibles combinaciones se simplifica muchisimo.
Es así de simple:

1
2
3
4
5
SI la remesa tiene stock calculo                '---- Par artículo + Fecha Expira
    SI el Stock >= lo que queda pendiente de asignar  ' --- Fijate que lo pendiente puede ser todo o parte
        Tomo la parte que queda pendiente de asignar
    Else                                              ' -- El Stock es menor que lo pendiente de asignar
        Toma todo el Stock

Y así de simple es el calculo.

Y para salir del bucle tenemos 2 opciones

1ª que lo asignado y lo pedido sea igual
2ª que no queden mas remesas y eso ocurre si:
--- El siguiente código de articulo es mayor que el del pedido.
--- Cambio de álmacen
--- Se han acabado los registros "STock Lib"

Como están ordenados si se cumple una de estas tres no hace falta que siga buscando.

seguro que se puede hacer más rápido, pero por ahora ya es sufciente.

Saludos.
\\//_


PD.: Mañana sigo con la otra macro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 15/04/2021 08:21:50
Hola estimado Antoni,
El libro PreAsignacion_V3 que me enviaste tiene errores en las fórmulas de la Hoja Inventario. Por eso los códigos que enviaste los probé en el libro que te envié antes PreAsignación.

Código N° 1

Grabe en un módulo un ordenamiento en la hoja Inventario por los campos: Almacén (“A”) – Status Invent (“N”) - Sku Articulo (“C”) – Expira (“I”) y lo coloque en el Primer código que enviaste, funciona bien pero el proceso demora 253 segundos (más de 4 minutos).

Código N° 2

Este segundo Código me marca error al realizar el proceso:
“el objeto no admite esta propiedad o metodo”

Aquí se presenta el error.

.Add2 Key:=Range("A2:A" & Total_Inve), SortOn:=xlSortOnValues, _
Order:=xlAscending, _
DataOption:=xlSortNormal



Te estoy enviando dos archivos, uno para cada codigo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 15/04/2021 17:25:33
El error puede ser por la diferencia de versión. para arreglarlo quita el 2 del .add2.

Mi idea es que el bucle FOR de Pedidos - Inventario sea más rápido. Pega, que hay que tener la hoja inventario ordenada y lo que se gana por un sitio se pierde por otro.

Si fuese una Base de Datos se crearía una tabla de índices y las búsquedas serían inmediatas.

¿Que pasa con la busqueda secuencial? En el almacén 200 tenemos el artículo 100103 con 32 pedidos, en los dos primeros se asigna todo el stock y los otros 30 se han de leer todo el inventario para saber que no hay más stock, eso significa recorrer los 1804 registros del inventario 30 veces.

Ese el problema que tenias, yo intentaba simplificarlo pero no me ha dado el resultado que esperaba.

¿Has probado tener la tabla ordenada por Almacén + Status + Artículo + Expira y utilizar la primera macro?

Olvida las ultimas macros que te envia ayer y prueba esta

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
Sub Informe_Click()
    Dim Almacen_Ped As String, Articul_Ped As Long, VencCor_Ped As Date, _
        CantOrd_Ped As Long, CantAsg_Ped As Long, Codigo As String, _
        Asignad_Ped As Long
 
    Dim Almacen_Inv As String, Articul_Inv As Long, Expirac_Inv As Date, _
        StatusI_Inv As String, Vaciado_Inv As Long, Asignar As Long
 
    Dim Fila_Pedi As Long, Total_Pedi As Long, _
        Fila_Inve As Long, Total_Inve As Long
 
    Dim Tabla_Almac() As String, Num_Alma As Integer, Almacen As Integer, _
        Tabla_Artic() As Long, Num_Arti As Long, Articulo As Long, _
        Tabla_Desde() As Long, _
        Tabla_Hasta() As Long, a As Long, Existe As Long
 
    Dim WS_Pedi As Worksheet, _
        WS_Inve As Worksheet, Inicio As Single, Old As Integer
 
    Inicio = Timer
 
    ' ---&--- Limpieza
 
    Set WS_Pedi = Worksheets("Pedidos")
    Set WS_Inve = Worksheets("Inventario")
 
    WS_Pedi.Range("AQ2:AQ9000") = Empty
    WS_Pedi.Range("AR2:AR9000") = Empty
    WS_Pedi.Range("AS2:AS9000") = Empty
    WS_Inve.Range("O2:O9000") = Empty
 
'   Call Ord_Almacen_Status_SkuArt_FechExpira
 
    With Application
        .ScreenUpdating = False
        Old = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
 
'    Call MaxDiaCorte
    'Application.Calculation = xlAutomatic
 
    ' ---&--- Cuenta las lines - Rellena la Columna P - Asigna Col 'G' a la 'O'
 
    With WS_Inve
        Total_Inve = 2
        Num_Alma = 0
        Num_Arti = 0
        While .Cells(Total_Inve, "A") <> ""
 
            .Cells(Total_Inve, "O") = .Cells(Total_Inve, "G")
 
            If .Cells(Total_Inve, "N") = "STock Lib" Then
 
                Almacen = 0
                For a = 1 To Num_Alma
                    If Tabla_Almac(a) = .Cells(Total_Inve, "A") Then Almacen = a: Exit For
                Next
 
                If Almacen = 0 Then
                   Num_Alma = Num_Alma + 1
                   ReDim Preserve Tabla_Almac(Num_Alma)
                   Tabla_Almac(Num_Alma) = .Cells(Total_Inve, "A")
                   Almacen = Num_Alma
                End If
 
                Articulo = (Almacen * 1000000) + .Cells(Total_Inve, "C")
 
                Existe = 0
                For a = 1 To Num_Arti
                    If Tabla_Artic(a) = Articulo Then Existe = a
                Next
 
                If Existe = 0 Then
                    Num_Arti = Num_Arti + 1
 
                    ReDim Preserve Tabla_Artic(Num_Arti)
                    ReDim Preserve Tabla_Desde(Num_Arti)
                    ReDim Preserve Tabla_Hasta(Num_Arti)
 
                    Tabla_Artic(Num_Arti) = Articulo
                    Tabla_Desde(Num_Arti) = Total_Inve
                    Tabla_Hasta(Num_Arti) = Total_Inve
                Else
                    Tabla_Hasta(Existe) = Total_Inve
                End If
            End If
 
            Total_Inve = Total_Inve + 1
        Wend
    End With
 
    ' ---&--- Cuenta las filas de PEDIDOS
 
    Total_Pedi = 2
    While WS_Pedi.Cells(Total_Pedi, 9) <> ""
        Total_Pedi = Total_Pedi + 1
        DoEvents
    Wend
 
    ' -----------------------------------------------------------------------
    ' ---&--- Proceso principal ---------------------------------------------
    ' -----------------------------------------------------------------------
 
   Almacen_Ant = ""
 
   For Fila_Pedi = 2 To Total_Pedi
        With WS_Pedi
            Almacen_Ped = .Cells(Fila_Pedi, "A")
            Articul_Ped = .Cells(Fila_Pedi, "I")
            VencCor_Ped = .Cells(Fila_Pedi, "K") + .Cells(Fila_Pedi, "D")
 
            CantOrd_Ped = .Cells(Fila_Pedi, "L")
            CantAsg_Ped = .Cells(Fila_Pedi, "AQ")
 
            Asignad_Ped = CantOrd_Ped - CantAsg_Ped
        End With
        DoEvents
 
        ' ---&--- Si no esta en el registro no lo busca en el inventario
 
        If Almacen_Ant <> Almacen_Ped Then
            Almacen_Ant = Almacen_Ped
            Almacen = 0
            For a = 1 To Num_Alma
                If Tabla_Almac(a) = Almacen_Ped Then Almacen = a: Exit For
            Next
        End If
 
        If Almacen > 0 Then
           Existe = 0
           Articulo = (Almacen * 1000000) + Articul_Ped
           For a = 1 To Num_Artic
               If Tabla_Artic(a) = Articulo Then Existe = a: Exit For
           Next
 
           If Existe > 0 Then
 
                WS_Pedi.Cells(Fila_Pedi, "AU") = Tabla_Desde(Existe)
                WS_Pedi.Cells(Fila_Pedi, "AV") = Tabla_Desde(Existe)
 
                For Fila_Inve = Tabla_Desde(Existe) To Tabla_Hasta(Existe)
                    With WS_Inve
                        Almacen_Inv = .Cells(Fila_Inve, "A")    '0
                        Articul_Inv = .Cells(Fila_Inve, "C")    '2
                        Expirac_Inv = .Cells(Fila_Inve, "I")    '8
                        StatusI_Inv = .Cells(Fila_Inve, "N")    '13
                        Vaciado_Inv = .Cells(Fila_Inve, "O")    '14
                    End With
 
                    ' ---&--- Finaliza si cambia de almacen _
                                       El articulo es mayor que el que busco _
                                       Si no es STock Lib
 
                    If Almacen_Ped <> Almacen_Inv Or _
                       Articul_Ped < Articul_Inv Or _
                       StatusI_Inv <> "STock Lib" Then
                        WS_Pedi.Cells(Fila_Pedi, "AX") = Fila_Inve
                        Exit For
                    End If
 
                    ' --- Esta deltro de los rango
 
                    If Almacen_Ped = Almacen_Inv And _
                       Articul_Ped = Articul_Inv And VencCor_Ped <= Expirac_Inv And _
                       StatusI_Inv = "STock Lib" Then
 
                        WS_Pedi.Cells(Fila_Pedi, "AR") = VencCor_Ped
                        WS_Pedi.Cells(Fila_Pedi, "AS") = Expirac_Inv
 
                        ' ---&--- Realiza la asignación si hay stock
 
                        If Vaciado_Inv > 0 Then
                            If Vaciado_Inv >= CantOrd_Ped - CantAsg_Ped Then
                                Asignar = CantOrd_Ped - CantAsg_Ped
 
                                WS_Inve.Cells(Fila_Inve, "O") = Vaciado_Inv - Asignar
                                WS_Pedi.Cells(Fila_Pedi, "AQ") = CantAsg_Ped + Asignar
                            Else
                                WS_Inve.Cells(Fila_Inve, "O") = 0
                                WS_Pedi.Cells(Fila_Pedi, "AQ") = CantAsg_Ped + Vaciado_Inv
                            End If
                            CantAsg_Ped = WS_Pedi.Cells(Fila_Pedi, "AQ")
 
                            If WS_Pedi.Cells(Fila_Pedi, "L") = WS_Pedi.Cells(Fila_Pedi, "AQ") Then
                               WS_Pedi.Cells(Fila_Pedi, "AW") = Fila_Inve
                               Exit For
                            End If
                        End If
 
                    End If
                    DoEvents
                Next
            End If ' Existe
            WS_Pedi.Cells(Fila_Pedi, "AZ") = Fila_Inve
        End If ' Almacen
    Next
 
    With Application
        .ScreenUpdating = True
        .Calculation = Old
        .EnableEvents = True
    End With
    MsgBox "Fin.  " & Timer - Inicio
End Sub

Con esta macro no es necesario ordenar la hoja de inventario y va super rapida.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 15/04/2021 17:44:37
En mi prueba ha tardado 3 segundos.

Si quieres saber como lo hace es muy simple:

Busca todos registros de la hoja inventario y tiene en cuenta solo los que tienen el Status "STock Lib"
Guarda en una tabla el almacén sin repetir
Guarda en una tabla el código de articulo + almacen
En una tercera el primer registro de este articulo + almacen
En una cuarta el último registro de este articulo + almacen

Y en el segundo FOR solo recorro desde el primer registro de este articulo + almacen hasta último registro de este articulo + almacen.

Y ahorra muchisimos acceso a la hoja que esto penaliza mucho en tiempo.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 15/04/2021 18:06:49
Hola Estimado Antoni.

Código N° 1

Grabe en un módulo un ordenamiento en la hoja Inventario por los campos: Almacén (“A”) – Status Invent (“N”) - Sku Articulo (“C”) – Expira (“I”) y lo coloque en el Primer código que enviaste, funciona bien pero el proceso demora 253 segundos (más de 4 minutos).

Código N° 2

Le quite el 2 en los ordenamientos, ahora corre el proceso pero demora mucho mas que el codigo N° 1. 517 segundos (mas de 8 minutos).

El último código N° 3 que enviaste no funciona. Te envio el libro y la imagen como debe salir el resultado.


Resultado-Final-PreAsignado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 15/04/2021 18:35:49
Tenia una variable mal. Para estas cosas sirve la primera línea del código.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
Option Explicit
 
Sub Informe_Click()
    Dim Almacen_Ped As String, Articul_Ped As Long, VencCor_Ped As Date, _
        Almacen_Ant As String, CantOrd_Ped As Long, CantAsg_Ped As Long, _
        Codigo As String, Asignad_Ped As Long
 
    Dim Almacen_Inv As String, Articul_Inv As Long, Expirac_Inv As Date, _
        StatusI_Inv As String, Vaciado_Inv As Long, Asignar As Long
 
    Dim Fila_Pedi As Long, Total_Pedi As Long, _
        Fila_Inve As Long, Total_Inve As Long
 
    Dim Tabla_Almac() As String, Num_Alma As Integer, Almacen As Integer, _
        Tabla_Artic() As Long, Num_Arti As Long, Articulo As Long, _
        Tabla_Desde() As Long, _
        Tabla_Hasta() As Long, a As Long, Existe As Long
 
    Dim WS_Pedi As Worksheet, _
        WS_Inve As Worksheet, Inicio As Single, Old As Integer
 
    Inicio = Timer
 
    ' ---&--- Limpieza
 
    Set WS_Pedi = Worksheets("Pedidos")
    Set WS_Inve = Worksheets("Inventario")
 
    WS_Pedi.Range("AQ2:AQ9000") = Empty
    WS_Pedi.Range("AR2:AR9000") = Empty
    WS_Pedi.Range("AS2:AS9000") = Empty
    WS_Inve.Range("O2:O9000") = Empty
 
'   Call Ord_Almacen_Status_SkuArt_FechExpira
 
    With Application
        .ScreenUpdating = False
        Old = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
 
'    Call MaxDiaCorte
    'Application.Calculation = xlAutomatic
 
    ' ---&--- Cuenta las lines - Rellena la Columna P - Asigna Col 'G' a la 'O'
 
    With WS_Inve
        Total_Inve = 2
        Num_Alma = 0
        Num_Arti = 0
        While .Cells(Total_Inve, "A") <> ""
 
            .Cells(Total_Inve, "O") = .Cells(Total_Inve, "G")
 
            If .Cells(Total_Inve, "N") = "STock Lib" Then
 
                Almacen = 0
                For a = 1 To Num_Alma
                    If Tabla_Almac(a) = .Cells(Total_Inve, "A") Then Almacen = a: Exit For
                Next
 
                If Almacen = 0 Then
                   Num_Alma = Num_Alma + 1
                   ReDim Preserve Tabla_Almac(Num_Alma)
                   Tabla_Almac(Num_Alma) = .Cells(Total_Inve, "A")
                   Almacen = Num_Alma
                End If
 
                Articulo = (Almacen * 1000000) + .Cells(Total_Inve, "C")
 
                Existe = 0
                For a = 1 To Num_Arti
                    If Tabla_Artic(a) = Articulo Then Existe = a
                Next
 
                If Existe = 0 Then
                    Num_Arti = Num_Arti + 1
 
                    ReDim Preserve Tabla_Artic(Num_Arti)
                    ReDim Preserve Tabla_Desde(Num_Arti)
                    ReDim Preserve Tabla_Hasta(Num_Arti)
 
                    Tabla_Artic(Num_Arti) = Articulo
                    Tabla_Desde(Num_Arti) = Total_Inve
                    Tabla_Hasta(Num_Arti) = Total_Inve
                Else
                    Tabla_Hasta(Existe) = Total_Inve
                End If
            End If
 
            Total_Inve = Total_Inve + 1
        Wend
    End With
 
    ' ---&--- Cuenta las filas de PEDIDOS
 
    Total_Pedi = 2
    While WS_Pedi.Cells(Total_Pedi, 9) <> ""
        Total_Pedi = Total_Pedi + 1
        DoEvents
    Wend
 
    ' -----------------------------------------------------------------------
    ' ---&--- Proceso principal ---------------------------------------------
    ' -----------------------------------------------------------------------
 
   Almacen_Ant = ""
 
   For Fila_Pedi = 2 To Total_Pedi
        With WS_Pedi
            Almacen_Ped = .Cells(Fila_Pedi, "A")
            Articul_Ped = .Cells(Fila_Pedi, "I")
            VencCor_Ped = .Cells(Fila_Pedi, "K") + .Cells(Fila_Pedi, "D")
 
            CantOrd_Ped = .Cells(Fila_Pedi, "L")
            CantAsg_Ped = .Cells(Fila_Pedi, "AQ")
 
            Asignad_Ped = CantOrd_Ped - CantAsg_Ped
        End With
        DoEvents
 
        ' ---&--- Si no esta en el registro no lo busca en el inventario
 
        If Almacen_Ant <> Almacen_Ped Then
            Almacen_Ant = Almacen_Ped
            Almacen = 0
            For a = 1 To Num_Alma
                If Tabla_Almac(a) = Almacen_Ped Then Almacen = a: Exit For
            Next
        End If
 
        ' ---&--- Hay pedidos para este almacen
 
        If Almacen > 0 Then
            Existe = 0
            Articulo = (Almacen * 1000000) + Articul_Ped
            For a = 1 To Num_Arti
                If Tabla_Artic(a) = Articulo Then Existe = a: Exit For
            Next
 
            ' ---&--- Este articulo esta en el inventario
 
            If Existe > 0 Then
 
                For Fila_Inve = Tabla_Desde(Existe) To Tabla_Hasta(Existe)
                    With WS_Inve
                        Almacen_Inv = .Cells(Fila_Inve, "A")    '0
                        Articul_Inv = .Cells(Fila_Inve, "C")    '2
                        Expirac_Inv = .Cells(Fila_Inve, "I")    '8
                        StatusI_Inv = .Cells(Fila_Inve, "N")    '13
                        Vaciado_Inv = .Cells(Fila_Inve, "O")    '14
                    End With
 
                    ' ---&--- Finaliza si cambia de almacen _
                                       El articulo es mayor que el que busco _
                                       Si no es STock Lib
 
                    If Almacen_Ped <> Almacen_Inv Or _
                       Articul_Ped < Articul_Inv Or _
                       StatusI_Inv <> "STock Lib" Then
                        Exit For
                    End If
 
                    ' --- Esta deltro de los rango
 
                    If Almacen_Ped = Almacen_Inv And _
                       Articul_Ped = Articul_Inv And VencCor_Ped <= Expirac_Inv And _
                       StatusI_Inv = "STock Lib" Then
 
                        WS_Pedi.Cells(Fila_Pedi, "AR") = VencCor_Ped
                        WS_Pedi.Cells(Fila_Pedi, "AS") = Expirac_Inv
 
                        ' ---&--- Realiza la asignación si hay stock
 
                        If Vaciado_Inv > 0 Then
                            If Vaciado_Inv >= CantOrd_Ped - CantAsg_Ped Then
                                Asignar = CantOrd_Ped - CantAsg_Ped
 
                                WS_Inve.Cells(Fila_Inve, "O") = Vaciado_Inv - Asignar
                                WS_Pedi.Cells(Fila_Pedi, "AQ") = CantAsg_Ped + Asignar
                            Else
                                WS_Inve.Cells(Fila_Inve, "O") = 0
                                WS_Pedi.Cells(Fila_Pedi, "AQ") = CantAsg_Ped + Vaciado_Inv
                            End If
                            CantAsg_Ped = WS_Pedi.Cells(Fila_Pedi, "AQ")
 
                            If WS_Pedi.Cells(Fila_Pedi, "L") = WS_Pedi.Cells(Fila_Pedi, "AQ") Then
                               Exit For
                            End If
                        End If
 
                    End If
                    DoEvents
                Next
            End If ' Existe
        End If ' Almacen
    Next
 
    With Application
        .ScreenUpdating = True
        .Calculation = Old
        .EnableEvents = True
    End With
    MsgBox "Fin.  " & Timer - Inicio
End Sub

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 15/04/2021 18:49:28
Esta si demora 9 segundos. mas tarde lo probare al detalle. Muchas Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 15/04/2021 19:10:02
Le recuerdo, hace algunos días le hice estas 3 consultas sobre este caso, Libro PreAsignacion e Inventario CDs

1._ En el reporte Hoja(“Inv-PedRefrigerado_1”) estoy llenando el encabezado de Artículos y sus asociados (Columnas) y fechas Expiración(Filas) en forma automática mediante código. Lo estoy cargando por separado, es decir un bucle For (Columnas) para Artículos y otro For (Filas) para fechas de Expiración. La idea sería hacer el bucle combinado una sola vez para filas y Columnas para que carguen Artículos y fechas a la misma vez. He probado varias formas, pero no lo consigo.

Este es el código que tengo el archivo trabajando.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
Option Explicit
'Reporte de Inventario Refrigerado
Sub Santiago()
Dim Inventario#, old&, FilaB&, FilaC&, FilaA&, ColumnaD&
Dim WS1 As Worksheet
Dim WS2 As Worksheet
Dim AlmacenP, Origen, FechExP, ArticuloAnalisis, AlmacenInv, ArticuloInventario, EstatusInv
Dim Demanda, PUnitario, Numeracion, Ref, Col
Dim Inventario_QAD As Range
Dim Expiracion As Range
Worksheets("Inv-PedRefrigerado_1").Range("D3:KN76").Value = Empty
Worksheets("Inv-PedRefrigerado_1").Range("B6:C76").Value = Empty
 
With Application
.ScreenUpdating = False
old = .Calculation
.Calculation = xlCalculationManual
.EnableEvents = False
End With
 
Call FechaExpiracionAscendente
Application.Calculation = xlAutomatic
 
Set WS1 = Worksheets("Inventario")
Set WS2 = Worksheets("Inv-PedRefrigerado_1")
 
FilaA = 2
While WS1.Cells(FilaA, 1).Value <> ""
      FilaA = FilaA + 1
Wend
 
FilaB = 2
While WS2.Cells(FilaB, 2).Value <> ""
      FilaB = FilaB + 1
Wend
 
'Items y Fechas de Expiracion
Ref = 6
Numeracion = 0
For Each Inventario_QAD In WS1.Range("A2:A" & FilaA - 1)
         AlmacenInv = Inventario_QAD.Offset(, 0).Value   '"A"
         EstatusInv = Inventario_QAD.Offset(, 13).Value  '"N"
         Origen = Inventario_QAD.Offset(, 14).Value      '"O"
         FechExP = Inventario_QAD.Offset(, 8).Value      '"I"
 
         If UCase(EstatusInv) = "STOCK LIB" And UCase(Origen) = "PLF" Then
 
            If FechExP <> Inventario_QAD.Offset(-1, 8).Value Then
               WS2.Cells(Ref, 3).Value = FechExP
               Numeracion = Numeracion + 1
               WS2.Cells(Ref, 2).Value = Numeracion
               Ref = Ref + 1
            End If
         End If
Next
 
Call SkuAscendente
Application.Calculation = xlAutomatic
 
'Sku por su descripcion, origen y familia
Ref = 4
For Each Inventario_QAD In WS1.Range("A2:A" & FilaA - 1)
         AlmacenInv = Inventario_QAD.Offset(, 0).Value  '"A"
         EstatusInv = Inventario_QAD.Offset(, 13).Value '"N"
         Origen = Inventario_QAD.Offset(, 14).Value     '"O"
         FechExP = Inventario_QAD.Offset(, 8).Value     '"I"
 
         If (AlmacenInv = 200 Or UCase(AlmacenInv) = "200VR") And (UCase(EstatusInv) = "STOCK LIB" Or _
             UCase(EstatusInv) = "RESERVA" Or UCase(EstatusInv) = "TRANSITO" Or UCase(EstatusInv) = "RETENIDO") And _
             UCase(Origen) = "PLF" Then
 
             If WS2.Cells(4, Ref - 3).Value <> Inventario_QAD.Offset(, 2).Value Then
                WS2.Cells(3, Ref).Value = Inventario_QAD.Offset(, 15).Value '"P"
                WS2.Cells(4, Ref).Value = Inventario_QAD.Offset(, 2).Value  '"C"
                WS2.Cells(5, Ref).Value = Inventario_QAD.Offset(, 3).Value  '"D"
                Ref = Ref + 3
             End If
 
        End If
Next
With Application
.ScreenUpdating = True
.Calculation = old
.EnableEvents = True
End With
 
WS2.Cells(1, 11).Value = "INFORME DE PLF CD SANTIAGO"
End Sub


2._ En la Hoja(“Inv-PedRefrigerado_1”) conseguí adaptar tu código Sub Refrigerado_1CD200() para que trabaje para cargar cantidades del Inventario, Ordenado y Asignado, además de hacer el recorrido en las columnas con celdas combinadas. Pero no consigo adaptar tu otro código Sub Abarrotes_2CD200(), podrías mencionarme donde debería hacer la modificación?

Ambos códigos están en el Archivo.



3._ Hasta ahora en la Hoja(“Inv-PedRefrigerado_1”) teniendo como encabezado fijo Sku Artículos en columnas y Fechas Expiración en Filas, se han cargado el reporte con cantidades haciendo las consultas con un criterio para columnas y otro criterio para filas. Mi pregunta es cómo sería la modificación del código si en columnas consideramos 2 criterios por ejemplos: los criterios sean Sku Articulo (“D4”) y Familia (“D3”). ¿Cómo habría que modificar el código?



Criterios-por-Columnas-y-Filas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 15/04/2021 19:43:23
Me pongo con este ultimo.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 16/04/2021 16:56:43
No entiendo que son ni que quieres hacer en las hojas Inv-PedRefrigerado_1 y Inv-PedRefrigerado_2.

Me esta empezando a dar dolor de cabeza intentar adivinar que hacen las macros y para qué son las hojas.

En respuesta a la primera macro, la Santiago, hay una forma de hacerla más rápida, bueno quizás hay más pero es la que se me ocurre.

Necesitas 3 FOR y no hace falta ordenar la hoja.
1º FOR Lee de una pasada la hoja de inventario y guarda los datos de la cabecera y las fechas en tablas.
-- Ordena las tablas
2º FOR escribe las cabeceras.
3º FOR escribe las fechas.

Antes de añadir un elemento en la tabla se verifica que no exista como hacia en la tabla de almacen.

Y sobre las hojas anteriores si me explicas para que son y que se quiere hacer puede que encuentre una forma de hacerlo más optima.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 16/04/2021 17:52:49
Caso 2
Recuerdas que la semana pasada me enviaste 2 tipos de códigos _1CD200() y _2CD200() para cargar en una hoja Inv-PedRefrigerado_1 cantidades de inventario por Artículos (columnas) y fechas de expiración (Filas) desde una hoja de inventario?
Pues bien, El código Sub Refrigerado_1CD200() logre adaptarlo para que también cargue cantidades de Ordenado y Asignado desde una Hoja Pedidos. Finalmente, el reporte Hoja Inv-PedRefrigerado_1 tiene tres cantidades: Invent-Orden-Asigna. Eso ya está OK. En el Libro PreAsignacion e Inventario CDs el código está en el módulo 2 que se activa en el CommandButton ASG REF CD-200

Eso mismo quiero hacer con tu otro código Sub Abarrotes_2CD200() pero aún no lo logro, es por eso que quiero que me ayudes en implementar ese mismo funcionamiento con este código. En el libro el código está en el módulo 3 que se activa en el CommandButton ASG ABA CD-200
Este es el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
Sub Abarrotes_2CD200()
    Dim WS1 As Worksheet, a As Integer, old As Integer
    Dim WS2 As Worksheet, b As Integer
 
    Dim Fil As Integer, Fila As Long, _
        Col As Integer, Total As Long
 
    Dim Tabla_Col() As Long, Ini As Single
    Dim Tabla_Fil() As String
    Dim Tabla_DAT() As Long, Inicio As Single
 
    Dim Tabla_Transit() As Long
    Dim Tabla_Reserva() As Long
    Dim Tabla_Retenid() As Long
 
    Inicio = Timer
 
    ' ---&--- Limpia la Hoja
 
    Worksheets("Inv-PedAbarrotes_2").Range("D6:EM75").Value = Empty
 
    With Application
        .ScreenUpdating = False
        old = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
 
    Set WS1 = Worksheets("Inventario")
    Set WS2 = Worksheets("Inv-PedAbarrotes_2")
 
    ' ---&--- Carga los datos en las tablas
 
    With WS2
        ' ---&--- Tabla Columnas
 
        Col = 4
        While .Cells(5, Col).Value <> ""
            ReDim Preserve Tabla_Col(Col)
            ReDim Preserve Tabla_Transit(Col)
            ReDim Preserve Tabla_Reserva(Col)
            ReDim Preserve Tabla_Retenid(Col)
            Tabla_Col(Col) = Val(.Cells(4, Col))
            Col = Col + 3
        Wend
 
        ' ---&--- Tabla Filas
 
        Fil = 6
        While .Cells(Fil, 3).Value <> ""
            ReDim Preserve Tabla_Fil(Fil)
 
            Tabla_Fil(Fil) = Format(.Cells(Fil, 3), "yyyy.mm.dd")
            Fil = Fil + 1
        Wend
    End With
 
    ' ---&---  Tabla de datos de las Columnas
 
    For a = 1 To UBound(Tabla_Col) - 1
        For b = a To UBound(Tabla_Col)
            If Tabla_Col(a) > Tabla_Col(b) Then
               Tabla_Col(0) = Tabla_Col(a)
               Tabla_Col(a) = Tabla_Col(b)
               Tabla_Col(b) = Tabla_Col(0)
 
               Tabla_Transit(0) = Tabla_Transit(a)
               Tabla_Transit(a) = Tabla_Transit(b)
               Tabla_Transit(b) = Tabla_Transit(0)
 
               Tabla_Reserva(0) = Tabla_Reserva(a)
               Tabla_Reserva(a) = Tabla_Reserva(b)
               Tabla_Reserva(b) = Tabla_Reserva(0)
 
               Tabla_Retenid(0) = Tabla_Retenid(a)
               Tabla_Retenid(a) = Tabla_Retenid(b)
               Tabla_Retenid(b) = Tabla_Retenid(0)
            End If
        Next
    Next
 
    ' ---&---  Tabla de datos de las Filas
 
    For a = 1 To UBound(Tabla_Fil) - 1
        For b = a To UBound(Tabla_Fil)
            If Tabla_Fil(a) > Tabla_Fil(b) Then
               Tabla_Fil(0) = Tabla_Fil(a)
               Tabla_Fil(a) = Tabla_Fil(b)
               Tabla_Fil(b) = Tabla_Fil(0)
            End If
        Next
    Next
 
    ' ---&---  Tabla de datos
 
    ReDim Tabla_DAT(Fil, Col)
 
    ' ---&---  Lee la hoja de datos
 
    With WS1
        Fila = 2
        While .Cells(Fila, "A") <> ""
 
            If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And _
                UCase(.Cells(Fila, "O")) = "PLF" Then
 
                Col = Buscar_2(.Cells(Fila, "C"), Tabla_Col)
                Fil = Buscar_2(Format(.Cells(Fila, "I"), "yyyy.mm.dd"), Tabla_Fil)
 
                Select Case UCase(.Cells(Fila, "P"))
                    Case "STOCK LIB": Tabla_DAT(Fil, Col) = Tabla_DAT(Fil, Col) + .Cells(Fila, "G")
                    Case "TRANSITO":  Tabla_Transit(Col) = Tabla_Transit(Col) + .Cells(Fila, "G")
                    Case "RESERVA":   Tabla_Reserva(Col) = Tabla_Reserva(Col) + .Cells(Fila, "G")
                    Case "RETENIDO":  Tabla_Retenid(Col) = Tabla_Retenid(Col) + .Cells(Fila, "G")
                End Select
            End If
 
            Fila = Fila + 1
        Wend
    End With
 
    ' ---&--- Escribe los datos en la hoja Refrigerado
 
    With WS2
        For Col = 4 To UBound(Tabla_Col)
            For Fil = 6 To UBound(Tabla_Fil)
                If Tabla_DAT(Fil, Col) <> 0 Then
                    .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                     Total = Total + Tabla_DAT(Fil, Col)
                End If
            Next
 
            If Col = 4 Then
                .Cells(Fil + 3, "B") = "Transito"
                .Cells(Fil + 4, "B") = "Reserva"
                .Cells(Fil + 5, "B") = "Retenido"
                .Cells(Fil + 1, "B") = "Total Cajas"
            End If
 
            If Tabla_Transit(Col) <> 0 Then .Cells(Fil + 3, Col) = Tabla_Transit(Col)
            If Tabla_Reserva(Col) <> 0 Then .Cells(Fil + 4, Col) = Tabla_Reserva(Col)
            If Tabla_Retenid(Col) <> 0 Then .Cells(Fil + 5, Col) = Tabla_Retenid(Col)
                                            .Cells(Fil + 1, Col) = Total
                                             Total = 0#
        Next
    End With
    WS2.Cells(1, 12) = "INFORME DE ABA CD SANTIAGO"
    MsgBox "Fin de la Macro Ver. 2.00." & vbCrLf & "Tiempo: " & Timer - Inicio
 
End Sub
 
Function Buscar_2(Texto, Tabla)
    Dim Maxim As Integer, Punte As Integer, Mitad As Single, Tipo As String
 
    Maxim = UBound(Tabla)
    Punte = 2 ^ Int((Log(Maxim) / Log(2)) + 0.99)
    Mitad = Punte
 
    While Mitad > 0.5
        Mitad = Mitad / 2
        If Punte > Maxim Then
            Tipo = "MAYOR"
        Else
            If Tabla(Punte) = Texto Then Tipo = "IGUAL"
            If Tabla(Punte) < Texto Then Tipo = "MENOR"
            If Tabla(Punte) > Texto Then Tipo = "MAYOR"
        End If
 
        Select Case Tipo
            Case "IGUAL"
                Buscar_2 = Punte
                Mitad = 0
            Case "MENOR"
                Punte = Punte + Mitad
 
            Case "MAYOR"
                Punte = Punte - Mitad
 
        End Select
    Wend
End Function
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 16/04/2021 18:19:31
Caso 3
Los códigos que implementaste _1CD200() y _2CD200() siempre fueron para trabajar con 2 criterios, un criterio Artículos (Columnas) y otro criterio para Fechas de Expiración (Filas) para cargar cantidades de inventario en el reporte Hoja (“Inv-PedRefrigerado”)

Mi consulta era como sería el código modificado si en columnas tuviera 2 criterios: Artículo y Familia, y en filas se mantiene el criterio Fechas de Expiración. En total serian 3 criterios.

Por favor, ojala me envíes la modificación en tus 2 tipos de código Sub Refrigerado_1CD200() y Sub Refrigerado_2CD200()



Criterios-por-Columnas-y-Filas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 20/04/2021 09:30:57
Hola Antoni, como estas.

Por favor me puedes explicar al detalle como trabajan o que funcion realizan las lineas de codigo que están en negrita.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
Sub Abarrotes_2CD200()
    Dim WS1 As Worksheet, a As Integer, old As Integer
    Dim WS2 As Worksheet, b As Integer
 
    Dim Fil As Integer, Fila As Long, _
        Col As Integer, Total As Long
 
    Dim Tabla_Col() As Long, Ini As Single
    Dim Tabla_Fil() As String
    Dim Tabla_DAT() As Long, Inicio As Single
 
    Dim Tabla_Transit() As Long
    Dim Tabla_Reserva() As Long
    Dim Tabla_Retenid() As Long
 
    Inicio = Timer
 
    ' ---&--- Limpia la Hoja
 
    Worksheets("Inv-PedAbarrotes_2").Range("D6:EM75").Value = Empty
 
    With Application
        .ScreenUpdating = False
        old = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
 
    Set WS1 = Worksheets("Inventario")
    Set WS2 = Worksheets("Inv-PedAbarrotes_2")
 
    ' ---&--- Carga los datos en las tablas
 
    With WS2
        ' ---&--- Tabla Columnas
 
        Col = 4
        While .Cells(5, Col).Value <> ""
            ReDim Preserve Tabla_Col(Col)
            ReDim Preserve Tabla_Transit(Col)
            ReDim Preserve Tabla_Reserva(Col)
            ReDim Preserve Tabla_Retenid(Col)
            Tabla_Col(Col) = Val(.Cells(4, Col))
            Col = Col + 3
        Wend
 
        ' ---&--- Tabla Filas
 
        Fil = 6
        While .Cells(Fil, 3).Value <> ""
            ReDim Preserve Tabla_Fil(Fil)
 
            Tabla_Fil(Fil) = Format(.Cells(Fil, 3), "yyyy.mm.dd")
            Fil = Fil + 1
        Wend
    End With
 
    ' ---&---  Tabla de datos de las Columnas
 
    For a = 1 To UBound(Tabla_Col) - 1
        For b = a To UBound(Tabla_Col)
            If Tabla_Col(a) > Tabla_Col(b) Then
               Tabla_Col(0) = Tabla_Col(a)
               Tabla_Col(a) = Tabla_Col(b)
               Tabla_Col(b) = Tabla_Col(0)
 
               Tabla_Transit(0) = Tabla_Transit(a)
               Tabla_Transit(a) = Tabla_Transit(b)
               Tabla_Transit(b) = Tabla_Transit(0)
 
               Tabla_Reserva(0) = Tabla_Reserva(a)
               Tabla_Reserva(a) = Tabla_Reserva(b)
               Tabla_Reserva(b) = Tabla_Reserva(0)
 
               Tabla_Retenid(0) = Tabla_Retenid(a)
               Tabla_Retenid(a) = Tabla_Retenid(b)
               Tabla_Retenid(b) = Tabla_Retenid(0)
            End If
        Next
    Next
 
    ' ---&---  Tabla de datos de las Filas
 
    For a = 1 To UBound(Tabla_Fil) - 1
        For b = a To UBound(Tabla_Fil)
            If Tabla_Fil(a) > Tabla_Fil(b) Then
               Tabla_Fil(0) = Tabla_Fil(a)
               Tabla_Fil(a) = Tabla_Fil(b)
               Tabla_Fil(b) = Tabla_Fil(0)
            End If
        Next
    Next
 
    ' ---&---  Tabla de datos
 
    ReDim Tabla_DAT(Fil, Col)
 
    ' ---&---  Lee la hoja de datos
 
    With WS1
        Fila = 2
        While .Cells(Fila, "A") <> ""
 
            If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And _
                UCase(.Cells(Fila, "O")) = "PLF" Then
 
                Col = Buscar_2(.Cells(Fila, "C"), Tabla_Col)
                Fil = Buscar_2(Format(.Cells(Fila, "I"), "yyyy.mm.dd"), Tabla_Fil)
 
                Select Case UCase(.Cells(Fila, "P"))
                    Case "STOCK LIB": Tabla_DAT(Fil, Col) = Tabla_DAT(Fil, Col) + .Cells(Fila, "G")
                    Case "TRANSITO":  Tabla_Transit(Col) = Tabla_Transit(Col) + .Cells(Fila, "G")
                    Case "RESERVA":   Tabla_Reserva(Col) = Tabla_Reserva(Col) + .Cells(Fila, "G")
                    Case "RETENIDO":  Tabla_Retenid(Col) = Tabla_Retenid(Col) + .Cells(Fila, "G")
                End Select
            End If
 
            Fila = Fila + 1
        Wend
    End With
 
    ' ---&--- Escribe los datos en la hoja Refrigerado
 
    With WS2
        For Col = 4 To UBound(Tabla_Col)
            For Fil = 6 To UBound(Tabla_Fil)
                If Tabla_DAT(Fil, Col) <> 0 Then
                    .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                     Total = Total + Tabla_DAT(Fil, Col)
                End If
            Next
 
            If Col = 4 Then
                .Cells(Fil + 3, "B") = "Transito"
                .Cells(Fil + 4, "B") = "Reserva"
                .Cells(Fil + 5, "B") = "Retenido"
                .Cells(Fil + 1, "B") = "Total Cajas"
            End If
 
            If Tabla_Transit(Col) <> 0 Then .Cells(Fil + 3, Col) = Tabla_Transit(Col)
            If Tabla_Reserva(Col) <> 0 Then .Cells(Fil + 4, Col) = Tabla_Reserva(Col)
            If Tabla_Retenid(Col) <> 0 Then .Cells(Fil + 5, Col) = Tabla_Retenid(Col)
                                            .Cells(Fil + 1, Col) = Total
                                             Total = 0#
        Next
    End With
    WS2.Cells(1, 12) = "INFORME DE ABA CD SANTIAGO"
    MsgBox "Fin de la Macro Ver. 2.00." & vbCrLf & "Tiempo: " & Timer - Inicio
 
End Sub
 
Function Buscar_2(Texto, Tabla)
    Dim Maxim As Integer, Punte As Integer, Mitad As Single, Tipo As String
 
    Maxim = UBound(Tabla)
    Punte = 2 ^ Int((Log(Maxim) / Log(2)) + 0.99)
    Mitad = Punte
 
    While Mitad > 0.5
        Mitad = Mitad / 2
        If Punte > Maxim Then
            Tipo = "MAYOR"
        Else
            If Tabla(Punte) = Texto Then Tipo = "IGUAL"
            If Tabla(Punte) < Texto Then Tipo = "MENOR"
            If Tabla(Punte) > Texto Then Tipo = "MAYOR"
        End If
 
        Select Case Tipo
            Case "IGUAL"
                Buscar_2 = Punte
                Mitad = 0
            Case "MENOR"
                Punte = Punte + Mitad
 
            Case "MAYOR"
                Punte = Punte - Mitad
 
        End Select
    Wend
End Function
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 20/04/2021 18:12:32
Hola Antoni,

Me das a entender que solo modificando esta parte del código ya debería trabajar para celdas combinadas, sin embargo no me funciona por eso quiero entender el código. No sé en qué parte del código hay que hacer más modificacion para que funcione para CELDAS COMBINADAS

1
2
3
4
5
6
7
8
9
Col = 4
While .Cells(5, Col).Value <> ""
    ReDim Preserve Tabla_Col(Col)
    ReDim Preserve Tabla_Transit(Col)
    ReDim Preserve Tabla_Reserva(Col)
    ReDim Preserve Tabla_Retenid(Col)
    Tabla_Col(Col) = Val(.Cells(4, Col))
    Col = Col + 3
Wend

En el libro PreAsignacion e Inventario CDs el código Sub Abarrotes_2CD200() está en el módulo 3 que se activa en el CommandButton ASG ABA CD-200
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 20/04/2021 23:34:42
He realizado algunos cambios en la macro Sub Abarrotes_2CD200()

Ahora funciona pero como no se exactamente que debe hacer y no se que datos puede poner.

Ya me contaras.

Siento no haber contestado antes, he estado algo liado.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 21/04/2021 09:54:39
Colocar en Columna Invent Hoja ("Inv-PedAbarrotes_2") el Total de Cajas de la Columna "G", según criterio Artículo "C" y Fecha Expira "I" de la Hoja ("Inventario")

Colocar en Columna Orden Hoja ("Inv-PedAbarrotes_2") el Total de Cajas de la Columna "L", según criterio Artículo "I" y Fecha Expirac "AN" de la Hoja ("Pedidos")

Colocar en Columna Asigna Hoja ("Inv-PedAbarrotes_2") el Total de Cajas de la Columna "AL", según criterio Artículo "I" y Fecha Expirac "AN" de la Hoja ("Pedidos")

Adjunto Imágenes para mayor detalle.


Nota: Estuve revisando la carga en Invent y esta al 99.9%, hay una cantidad 690 cajas del Artículo 123041 que no se reporta en Hoja ("Inv-PedAbarrotes_2"), y cuatro filas mas abajo se observa una cantidad 252 que no corresponde a Status:Tránsito, Reserva y Retenido




Inventario-Pedidos-Cantidad-vs-FechExpiracion


Inv-PedAbarrotes_2-Invent-Orden-Asigna
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 22/04/2021 10:16:47
Hola Antoni,

El codigo que me enviaste está reportando datos erróneos en Hoja ("Inv-PedAbarrotes_2"), me da la impresión que le falta los criterios:

If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And UCase(.Cells(Fila, "O")) = "UHT" Then 'Inventario

If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And UCase(.Cells(Fila, "AE")) = "UHT" Then 'Pedidos

Trate de adaptarlo pero aún se manifiestan algunos errores.

Te adjunto imágenes de los datos erróneos y datos correctos (como debería manifestarse el reporte), te envio ejemplos de dos Artículos: 120644-123041. También esta la imagen de la Hoja ("Inventario")
No coloque la imagen de la Hoja ("Pedidos") porque es muy extenso.

Diferencia-de-datos-Inv-PedAbarrotes_2



También el total de artículos de: Transito - Reserva - Retenido estan erroneos.

Ejemplo: Artículos 100103-100553-100554



Transito-Reserva-Retenido
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 22/04/2021 16:36:53
El codigo que me enviaste sigue reportando datos erróneos en Hoja ("Inv-PedAbarrotes_2"), me da la impresión que no esta considerando la Fecha de Expiración 06-12-17 y 07-12-17.en todo Invent-Orden-Asigna

En el Codigo With WS_Inven le faltaria el criterio: Case "STOCK LIB": Tabla_DAT(Fil, Col) = Tabla_DAT(Fil, Col) + .Cells(Fila, "G")


Artículo 100553 en Hoja ("Inv-PedAbarrotes_2") no tiene nada. Sin embargo en Hoja ("Pedidos") tienen:

Cnt!Ord 340 cajas Fech Expira 07-12-17
Cnt!PreAsignado 25 cajas Fech Expira 07-12-17

Artículo 140565 en Hoja ("Inv-PedAbarrotes_2") no tiene nada. Sin embargo en Hoja ("Pedidos") tienen:

Cnt!Ord 173 cajas Fech Expira 07-12-17
Cnt!PreAsignado 10 cajas Fech Expira 07-12-17


Adjunto imagen de ("Hoja Inventario") donde artículos 100553-123041-140565 no coinciden las cantidades en Hoja ("Inv-PedAbarrotes_2"),




Inventario-100553-123041-140565



Por favor me puede explicar como funciona esta parte del codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Total_Col = 4
 
    While .Cells(5, Total_Col).Value <> ""
        ReDim Preserve Tabla_Col((Total_Col - 1) / 3)
 
        ReDim Preserve Tabla_Transit(Total_Col)
        ReDim Preserve Tabla_Reserva(Total_Col)
        ReDim Preserve Tabla_Retenid(Total_Col)
 
        Tabla_Col((Total_Col - 1) / 3) = Val(.Cells(4, Total_Col))
        Total_Col = Total_Col + 3
    Wend
 
With WS_Inven
    Fila = 2
    While .Cells(Fila, "A") <> ""
        If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And _
            UCase(.Cells(Fila, "O")) = "UHT" Then
 
            Col = Buscar_2(.Cells(Fila, "C"), Tabla_Col)  ' --- Busca el articulo
            Pos = (Col * 3) + 1
 
            If Col > 0 Then
                Fil = Buscar_2(Format(.Cells(Fila, "I"), "yyyy.mm.dd"), Tabla_Fil)   ' --- Busca la fecha
                If Fil > 0 Then
                    Tabla_DAT(Fil, Pos + 0) = Tabla_DAT(Fil, Pos + 0) + .Cells(Fila, "G")
                End If
 
                Select Case UCase(.Cells(Fila, "N"))
                    Case "TRANSITO": Tabla_Transit(Pos) = Tabla_Transit(Pos) + .Cells(Fila, "G")
                    Case "RESERVA":  Tabla_Reserva(Pos) = Tabla_Reserva(Pos) + .Cells(Fila, "G")
                    Case "RETENIDO": Tabla_Retenid(Pos) = Tabla_Retenid(Pos) + .Cells(Fila, "G")
                End Select
            End If
        End If
        Fila = Fila + 1
    Wend
End With
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 22/04/2021 18:31:46
El codigo que me enviaste sigue reportando datos erróneos en Hoja ("Inv-PedAbarrotes_2"), me da la impresión que no esta considerando la Fecha de Expiración 06-12-17 y 07-12-17.en todo Invent-Orden-Asigna

R: Tiene razón se saltaba estas dos fechas por que había un error en el programa e ignoraba las dos ultimas fechas

1
2
3
Total_Fil = 6
While .Cells(Total_Fil - 2, "C").Value <> ""
    ReDim Preserve Tabla_Fil(Total_Fil)

Adjunto documento Word con la explicación.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 22/04/2021 21:02:30
Antoni, parece que falta este detalle:

En el Codigo With WS_Inven le faltaria el criterio: Case "STOCK LIB": Tabla_DAT(Fil, Col) = Tabla_DAT(Fil, Col) + .Cells(Fila, "G")

Porque en Articulo 140565 esta repitiendo la cantidad 252 con Fecha de Expiración 16-07-17, esa cantidad solo debe aparecer como Reserva


140565
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 22/04/2021 22:51:21
Estimado, Antoni gracias por tu paciencia para atender mis requerimientos.

Solo me queda dos temas pendientes para cerrar este tema de BUSCAR ARTÍCULOS CON FECHA DE EXPIRACIÓN.
Espero hacértelo llegar para mañana y asi cerrar el tema, desde ya muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 23/04/2021 09:18:56
Hola Estimado Antoni, usando el mismo archivo y código te planteo una situación.

Caso 1

Hasta ahora para reportar cantidades se han usado 2 criterios de la Hoja (“Inv-PedAbarrotes_2”), Artículo (Fila 4) y Fechas de Expiración (Columna “C”).
Como sería el código si se usan 3 criterios de la Hoja (“Inv-PedAbarrotes_2”); Familia (Fila 3), Artículo (Fila 4) y Fecha de Expiración (Columna “C”).

Te planteo esta situación porque más adelante es casi seguro que me tocara un caso usando 3 criterios.

Gracias de antemano por tu Apoyo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 27/04/2021 07:44:03
Hola Estimado Antoni,

Caso 2

Conseguí un código para hallar el Máximo valor usando 3 criterios: el máximo valor de días de todos los registros que tengan el mismo ALMACÉN, ARTICULO Y STOCK.
Está programado con Option Base 1. Adjunto el Archivo

Te pido dos cosas:
• Me ha costado entender el código. Me podrías explicar cómo funciona ese código con Option Base 1
• Si es posible que lo puedas programar el código, pero sin usar Option Base 1


Muchas Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 27/04/2021 15:05:39
La respuesta a la pregunta es SI

Pongo un texto sacado de una web

https://excelyvba.com/option-base-1-un-pequeno-truco/

Option Base 1, un pequeño truco
por Quique Arranz

Todos nos hemos encontrado en VBA con un asunto de lo más molesto para los que nos enseñaron a contar sólo a partir del 1.

Esto es, básicamente, que determinados elementos en VBA comienzan su numeración en 0. Este es el caso de los Array, los ListBox…

Esto es especialmente incómodo cuando estamos acostumbrados a pensar en el primer elemento de una cadena como el número 1 y no el 0. Tiene fácil solución pero esta pequeña opción nos ahorrará tener que poner los ojos bizcos cuando queremos pensar en el primer elemento de un Array y le llamamos 0.

Para poder comenzar en el número que nosotros queramos, normalmente el 1, simplemente tenemos que escribir al comienzo del módulo lo siguiente:

Option Base 1

Pongo un ejemplo:

1
Dim Tabla(3)

Tengo una tabla de 4 elementos, el 0, el 1, el 2 y el 3

1
2
Option Base 1
Dim Tabla(3)

Tengo una tabla de 3 elementos, el 1, el 2 y el 3


Otra instrucción muy interesante es Option Explicit Obliga a declarar todas las variables. No declararlas es causa común de errores.

Hay más pero yo no he llegado a utilizar y no se las ventajas o desventajas que tienen

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 27/04/2021 15:14:53
Con respecto al caso 1.? Mi penúltimo mensaje.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 27/04/2021 16:07:46
Con respecto al caso 1.? Mi penúltimo mensaje.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 27/04/2021 18:01:58
La pregunta es ¿Puede haber un artículo que el mismo código este en dos familias? En las hojas que me has enviado no se da el caso.
En el libro hay 189 códigos de artículos, las descripciones son únicas en cada artículo y no hay un solo código de artículo con dos o más familias. Con lo que filtrar por la familia es una redundancia.

Si tiene un caso muéstramelo y lo estudio.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 27/04/2021 22:09:24
Cuando menciono 3 criterios de la Hoja (“Inv-PedAbarrotes_2”); Familia (Fila 3), Articulo (Fila 4) y Fecha de Expiración (Columna “C”). lo hice solo para tomar un ejemplo más cercano al código que desarrollaste. Sin embargo, te voy a pasar un caso real donde es necesario usar 3 criterios.

Campo Lot/Ser Hoja (“Inventario”):

Lot/Ser: es una serie que identifica la fecha de elaboración del Articulo, maquina, encargado del Laboratorio, etc..
Esto adquiere gran relevancia para identificar cuando hay un lote de elaboración que sufrió alguna contaminación de bacterias es necesario saber que día se elaboró, en que maquina se preparó y quien estuvo a cargo, además cuantas cajas se despachó de ese lote, etc. En conclusión, para este caso el Lot/Ser adquiere una importancia tan igual que la fecha de expiración

Bajo ese escenario te planteo los Criterios:
3 criterios de la Hoja (“Inv-PedAbarrotes_2”); Lot/Ser (Fila 3), Articulo (Fila 4) y Fecha de Expiración (Columna “C”).

Te estoy enviando el mismo Archivo, solo que en vez de Familia ahora tiene Lot/Ser
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 27/04/2021 23:43:35
Pongo la macro y resalto los cambio.
También adjunto el libro.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
Option Explicit
 
Sub Abarrotes_2CD200()
    Dim WS_Pedid As Worksheet
    Dim WS_Inven As Worksheet, a As Integer, old As Integer
    Dim WS_PedAb As Worksheet, b As Integer
 
    Dim Fil As Integer, Total_Fil As Integer, Fila As Long, _
        Col As Integer, Total_Col As Integer, Total As Long, _
        Pos As Integer
 
    Dim Tabla_Col_Inv() As String, Ini As Single, Texto As String
    Dim Tabla_Col_Ped() As Long
    Dim Tabla_Fil() As String
    Dim Tabla_DAT() As Long, Inicio As Single
 
    Dim Tabla_Transit() As Long
    Dim Tabla_Reserva() As Long
    Dim Tabla_Retenid() As Long
 
    Inicio = Timer
 
    ' ---&--- Limpia la Hoja
 
    Worksheets("Inv-PedAbarrotes_2").Range("D6:EM75").Value = Empty
 
    With Application
        .ScreenUpdating = False
        old = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
 
    Set WS_Pedid = Worksheets("Pedidos")
    Set WS_Inven = Worksheets("Inventario")
    Set WS_PedAb = Worksheets("Inv-PedAbarrotes_2")
 
    ' ---&--- Carga los datos en las tablas
 
    With WS_PedAb
 
        ' ---&--- Tabla Columnas
 
        Total_Col = 4
 
        While .Cells(5, Total_Col).Value <> ""
            ReDim Preserve Tabla_Col_Inv((Total_Col - 1) / 3)
            ReDim Preserve Tabla_Col_Ped((Total_Col - 1) / 3)
 
            ReDim Preserve Tabla_Transit(Total_Col)
            ReDim Preserve Tabla_Reserva(Total_Col)
            ReDim Preserve Tabla_Retenid(Total_Col)
 
            Tabla_Col_Inv((Total_Col - 1) / 3) = Val(.Cells(4, Total_Col)) & "·" & .Cells(3, Total_Col)
            Tabla_Col_Ped((Total_Col - 1) / 3) = Val(.Cells(4, Total_Col))
 
            Total_Col = Total_Col + 3
        Wend
 
        ' ---&--- Tabla Filas
 
        Total_Fil = 6
        While .Cells(Total_Fil, "C").Value <> ""
            ReDim Preserve Tabla_Fil(Total_Fil)
 
            Tabla_Fil(Total_Fil) = Format(.Cells(Total_Fil, 3), "yyyy.mm.dd")
            Total_Fil = Total_Fil + 1
        Wend
    End With
 
    ' ---&--- Añadfo las columnas Orden y Asigna del ultimo articulo
 
    Total_Col = Total_Col + 2
 
    ReDim Preserve Tabla_Transit(Total_Col)
    ReDim Preserve Tabla_Reserva(Total_Col)
    ReDim Preserve Tabla_Retenid(Total_Col)
 
    ' ---&---  Tabla de datos
 
    ReDim Tabla_DAT(Total_Fil, Total_Col)
 
    ' </> ------------------------------------------------------------- </>
    ' </> ---&---  Lee la hoja de datos de INVENTARIO
    ' </> ------------------------------------------------------------- </>
 
    With WS_Inven
        Fila = 2
        While .Cells(Fila, "A") <> ""
            If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And _
                UCase(.Cells(Fila, "O")) = "UHT" Then
 
                Texto = .Cells(Fila, "C") & "·" & .Cells(Fila, "E")
                Col = Buscar_1(Texto, Tabla_Col_Inv)  ' --- Busca el articulo
                Pos = (Col * 3) + 1
 
                If Col > 0 Then
                    Fil = Buscar_2(Format(.Cells(Fila, "I"), "yyyy.mm.dd"), Tabla_Fil)   ' --- Busca la fecha
                    If Fil > 0 Then
                        If UCase(.Cells(Fila, "N")) = "STOCK LIB" Then
                            Tabla_DAT(Fil, Pos + 0) = Tabla_DAT(Fil, Pos + 0) + .Cells(Fila, "G")
                        End If
                    End If
 
                    Select Case UCase(.Cells(Fila, "N"))
                        Case "TRANSITO": Tabla_Transit(Pos) = Tabla_Transit(Pos) + .Cells(Fila, "G")
                        Case "RESERVA":  Tabla_Reserva(Pos) = Tabla_Reserva(Pos) + .Cells(Fila, "G")
                        Case "RETENIDO": Tabla_Retenid(Pos) = Tabla_Retenid(Pos) + .Cells(Fila, "G")
                    End Select
                End If
            End If
            Fila = Fila + 1
        Wend
    End With
 
    ' </> ------------------------------------------------------------- </>
    ' </> ---&---  Lee la hoja de datos de Pedidos
    ' </> ------------------------------------------------------------- </>
 
    With WS_Pedid
        Fila = 2
        While .Cells(Fila, "A") <> ""
            If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And _
                UCase(.Cells(Fila, "AE")) = "UHT" Then
 
                Col = Buscar_2(.Cells(Fila, "I"), Tabla_Col_Ped)
                If Col > 0 Then
                    Fil = Buscar_2(Format(.Cells(Fila, "AN"), "yyyy.mm.dd"), Tabla_Fil)
                    If Col > 0 Then
                        Pos = (Col * 3) + 1
 
                        Tabla_DAT(Fil, Pos + 1) = Tabla_DAT(Fil, Pos + 1) + .Cells(Fila, "L")
                        Tabla_DAT(Fil, Pos + 2) = Tabla_DAT(Fil, Pos + 2) + .Cells(Fila, "AL")
                    End If
                End If
            End If
            Fila = Fila + 1
        Wend
    End With
 
    ' ---&--- Escribe los datos en la hoja Refrigerado
 
    With WS_PedAb
        For Col = 4 To Total_Col - 2
            For Fil = 6 To Total_Fil
                If Tabla_DAT(Fil, Col) <> 0 Then
                    .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                     Total = Total + Tabla_DAT(Fil, Col)
                End If
            Next
 
                                            .Cells(Total_Fil + 1, Col) = Total
            If Tabla_Transit(Col) <> 0 Then .Cells(Total_Fil + 3, Col) = Tabla_Transit(Col)
            If Tabla_Reserva(Col) <> 0 Then .Cells(Total_Fil + 4, Col) = Tabla_Reserva(Col)
            If Tabla_Retenid(Col) <> 0 Then .Cells(Total_Fil + 5, Col) = Tabla_Retenid(Col)
                                             Total = 0#
        Next
    End With
 
    WS_PedAb.Cells(1, 12) = "INFORME DE ABA CD SANTIAGO"
 
    MsgBox "Fin de la Macro Ver. 2.00." & _
            vbCrLf & _
            vbCrLf & _
           "Tiempo: " & Format(Timer - Inicio, "##0.## seg.")
 
End Sub
 
Function Buscar_1(Texto, Tabla)
    Dim a As Integer
 
    For a = 1 To UBound(Tabla)
        If Texto = Tabla(a) Then Buscar_1 = a: Exit For
    Next
End Function
 
Function Buscar_2(Texto, Tabla)
    Dim Maxim As Integer, Punte As Integer, Mitad As Single, Tipo As String
 
    Maxim = UBound(Tabla)
    Punte = 2 ^ Int((Log(Maxim) / Log(2)) + 0.99)
    Mitad = Punte
 
    While Mitad > 0.5
        Mitad = Mitad / 2
        If Punte > Maxim Then
            Tipo = "MAYOR"
        Else
            If Tabla(Punte) = Texto Then Tipo = "IGUAL"
            If Tabla(Punte) < Texto Then Tipo = "MENOR"
            If Tabla(Punte) > Texto Then Tipo = "MAYOR"
        End If
 
        Select Case Tipo
            Case "IGUAL"
                Buscar_2 = Punte
                Mitad = 0
            Case "MENOR"
                Punte = Punte + Mitad
 
            Case "MAYOR"
                Punte = Punte - Mitad
 
        End Select
    Wend
End Function

La Tabla de columnas para el inventario no esta ordenada.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 28/04/2021 10:32:15
No carga la Hoja ("Inv-PedAbarrotes_2"). No carga Datos en columna Invent

Adjunto imágenes como debería cargar con los artículos: 100103-100553.




3-CRITERIOS-LOTE-100103
3-CRITERIOS-LOTE-100553
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 28/04/2021 16:58:41
El problema estaba en que el texto de la cabecera de la hoja Inv-PedAbarrotes_2 esta en mayúsculas y en las hoja de Pedido e inventario en minúsculas.

Arreglado.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 28/04/2021 22:19:15
Faltan que se reporten los: Orden y Asigna. Se supone que las cantidades deben aparecer donde se reportan que hay inventario,
Ejemplos: 100103-100553



3-CRITERIOS-LOTE-100103-Orden-Asign


3-CRITERIOS-LOTE-100553-Orden-Asign
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 28/04/2021 23:55:52
En el Inventario primero busco la columna (Articulo + Lot/Ser) y si esta busco la fila.
En el Pedido no tengo Lot/Ser y en las columnas tengo varias veces el mismo artículo. ¿Cuál escoger?
La solución es primero la fecha y cuando se la fila busca la columna que tenga el artículo y tenga valor mayor a 0 en la columna del Inventario.
Y solucionado.

Adjunto libro modificado.

NOTA: Veras que cada vez que hago una modificación cambio el número, es para llevar un control de las versiones, por que trabajo en dos puestos distintos y si no lo hago así no sabría cual el último y es una buena practica.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 29/04/2021 00:14:46
Estimado Antoni, sigue sin reportarse las cantidades de Orden y Asigna. Se supone que deben aparecer al costado de la celda donde Invent es mayor a 0.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 29/04/2021 00:33:45
Dime cual es el que esta mal.

Ahora me voy a dormir que en España son las 00:33 horas. Mañana miro tu respuesta.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 04/05/2021 06:50:36
Hola antoni como estas,

La cantidad de Invent esta bien, pero no se reportan las cantidades de Orden y Asigna

Te envio ejemplos de los códigos 100103 - 123041


Faltan-Cant-Orden-Asigna-100103
Faltan-Cant-Orden-Asigna-123041
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 04/05/2021 10:13:20
No veo cual es el problema en la primera imagen.
En la segunda veo que para el artículo 123041 las cantidades de Orden y Asigna se reparten en dos columnas.
Veo que este artículo en el pedido solo tiene tres cantidades de Orden y tres cantidades de Asigna y no 6 como parece en la imagen.
También veo que en el libro no salen en la hoja Inv-PedAbarrotes_2.
En el articulo 123041 no se deberían repartir l las cantidades de Orden y Asigna 2 y 2 en el lote 71216 y 1 y 1 en el lote 141215X1 ¿Es correcto?
Ya he encontrado los fallos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 04/05/2021 17:42:24
Hola Antoni, todavía sale error. Envío imágenes de dos ejemplos de Artículos: 100553 - 120623

Para hacerlo mas practico creo que seria mejor agregar una columna mas en la Hoja ("Pedidos"), en vez de columna N° 41 Corte reemplazarlo por una Lote Asignado. La columna Corte no tiene importancia.






Error-100553
Error-120623
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 04/05/2021 18:04:56
Estimado Antoni.

Para hacerlo mas practico la solucion creo que seria mejor agregar una columna mas en la Hoja ("Pedidos"), en columna N° 41 Corte reemplazarlo por una Lote Asignado. La columna Corte no tiene importancia.

El Lote Asignado seria solo con Staus Stock Lib de Hoja ("Inventario")
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 04/05/2021 21:20:04
No entiendo los criterios que utilizas para poner el Orden y Asigna

Por Ejemplo el artículo 123041 tiene dos columnas con cantidad en Invent, valores 2 y 1.
En pedidos hay las cantidades 3 en orden y tres en Asigna ¿En que columna se tienen que poner? ¿En la DU y DV? ¿En la DX y DY? ¿En las cuatro? ¿Y que cantidad de Orden en DU y en DX? ¿Y qué cantidad de Asigna en DV y DY?

En el caso del Artículo 100553
en la columna de Orden ¿Se tienen que poner la suma que es 340?
en la columna de Asigna ¿Se tienen que poner la suma que es 25?

En esta versión esta arreglado lo del 100553 pero lo del 123041 lo pone en la primera columna, sobre este ya me contaras.

No entiendo lo del último mensaje:

Para hacerlo mas practico la solucion creo que seria mejor agregar una columna mas en la Hoja ("Pedidos"), en columna N° 41 Corte reemplazarlo por una Lote Asignado. La columna Corte no tiene importancia.

El Lote Asignado seria solo con Staus Stock Lib de Hoja ("Inventario")


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 04/05/2021 23:49:52
El Archivo esta trabajando mal, se quedo pegado en el bucle Articulo - Lote. Pruébalo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 05/05/2021 08:10:28
Hola Antoni, no carga ninguna cantidad de Orden y Asigna
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 05/05/2021 10:55:03
Ya esta arreglado.

Había copiado el trozo de código del Inventario y no había cambiado la columna del articulo en la búsqueda de la fecha.
Además cuando limpia la pantalla no llegaba al final y eso me ha engañado.

Otra cosa que he visto es los botones para llamar a la macro.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub CommandButton1_Click()
    Call Abarrotes_2CD200
End Sub
 
Private Sub CommandButton2_Click()
    Call Abarrotes_1CD300
End Sub
 
Private Sub CommandButton3_Click()
    Call Abarrotes_1CD400
End Sub
 
Private Sub CommandButton4_Click()
    Call Abarrotes_1CD500
End Sub

Si estas cuatro macros tienen que hacer exactamento lo mismo pero varia los filtros su puede utilizar la misma pasando como parámetro el almacén,

La cosa quedaría así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub CommandButton1_Click()
    Call Abarrotes_2CD200("200VR", 200)
End Sub
 
Private Sub CommandButton2_Click()
    Call Abarrotes_2CD200("300VR", 300)
End Sub
 
Private Sub CommandButton3_Click()
    Call Abarrotes_2CD200("400VR", 500)
End Sub
 
Private Sub CommandButton4_Click()
    Call Abarrotes_2CD200("500VR", 500)
End Sub

Y la rutina principal asi.

1
2
3
4
5
6
7
8
9
10
Sub Abarrotes_2CD200(Almacen_1, Almacen_2)
    Dim WS_Pedid As Worksheet
    Dim WS_Inven As Worksheet, a As Integer, old As Integer
    Dim WS_PedAb As Worksheet, b As Integer
    ...
    With WS_Inven
        Fila = 2
        While .Cells(Fila, "A") <> ""
            If (UCase(.Cells(Fila, "A")) = Almacen_1 Or .Cells(Fila, "A") = Almacen_2) And _
                UCase(.Cells(Fila, "O")) = "UHT" Then

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 05/05/2021 11:49:06
Estoy pensando en la finalidad de la hoja Inv-PedAbarrotes_2 y aún no entiendo para que sirve ni que se pretende hacer, de hecho no entiendo nada de lo que haces ni que sentido tiene, no me es necesario saberlo para poder ayudarte pero quizás podría haber sugerido un formato mas cómodo de tratar y de leer.
A mi esta estructura de datos no me parece nada optima y me resulta incomoda de leer, con demasiadas zonas vacías que no aportan ningún tipo de información.
Creo que con otro formato y unas Tablas Dinámicas seria más fácil de tratar.
Pero bueno es una opinión.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 05/05/2021 12:22:45
Si, Antoni te entiendo, aparentemente es confuso, pero es así como lo quieren ver el reporte otras personas y no me queda otra opcion. Con una Tabla dinámica se observaría diferente, por ejemplo: Transito, Retenido y Reserva no se veria debajo del Total de Cajas.


Volviendo al caso del Archivo, el Total de Cajas, se puede colocar dos filas después del último registro de Cajas. Ademas, Transito-Reserva-Retenido se pueden colocar una fila después del Total de Cajas. Me refiero a que no estén fijos. Asi como la Imagen.


Transito-Retenido-Reserva-Dinamico
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 05/05/2021 16:54:32
No entiendo lo que me pides.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 05/05/2021 19:13:34
El resultado de Total de Cajas, Tránsito, Reserva y Retenido no estén en filas fijas, sino dos filas después del último resultado de cantidad Invent-Orden-Asigna.

En el ejemplo de la imagen: en vez de estar en filas fijas 56, 58, 59 y 60, se reporten dos fila después del último registro de Invent-Orden-Asigna. Porque puede que en próximos reportes Fecha 07-12-2017 no sea el último registro de cantidad, puede que sea mayor o menor a esa fecha
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 05/05/2021 19:53:24
Antoni, no me hagas caso, el código si trabaja muy bien asi como esta.

Por ultimo, por favor explicame el funcionamiento del código

Muchas gracias Antoni, por todo el apoyo que me brindaste, reitero muchas gracias!!

Espero contar contigo en próximas colaboraciones.

Muchas Gracias Estimado Antoni!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 05/05/2021 21:11:34
Esta semana te hare un documento explicando paso a paso que hace la macro.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 08/05/2021 12:27:43
Lo he intentado pero se me hace muy complicado explicar todo lo que hace la macro paso a paso. No se me da muy bien lo de escribir.
Si tienes cualquier pregunta te podre contestar pero no se ni por donde empezar a explicar.
Seguro que resultara mas fácil si respondo a cosas concretas que explica la idea en general.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 08/05/2021 23:44:51
Hola Antoni como estas, te envio partes del codigo para su explicación.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
With WS_PedAb
 
    ' ---&--- Tabla Columnas
 
    Total_Col = 4
 
    While .Cells(5, Total_Col).Value <> ""
        ReDim Preserve Tabla_Col_Inv((Total_Col - 1) / 3)
        ReDim Preserve Tabla_Col_Ped((Total_Col - 1) / 3)
 
        ReDim Preserve Tabla_Transit(Total_Col)
        ReDim Preserve Tabla_Reserva(Total_Col)
        ReDim Preserve Tabla_Retenid(Total_Col)
 
        Tabla_Col_Inv((Total_Col - 1) / 3) = Val(.Cells(4, Total_Col)) & "·" & UCase(.Cells(3, Total_Col))
        Tabla_Col_Ped((Total_Col - 1) / 3) = Val(.Cells(4, Total_Col))
 
        Total_Col = Total_Col + 3
    Wend
 
 
 
' ---&--- Añadfo las columnas Orden y Asigna del ultimo articulo
 
Total_Col = Total_Col + 2
 
ReDim Preserve Tabla_Transit(Total_Col)
ReDim Preserve Tabla_Reserva(Total_Col)
ReDim Preserve Tabla_Retenid(Total_Col)
 
' ---&---  Tabla de datos
 
ReDim Tabla_DAT(Total_Fil, Total_Col)
 
 
 
' </> ------------------------------------------------------------- </>
' </> ---&---  Lee la hoja de datos de INVENTARIO
' </> ------------------------------------------------------------- </>
 
With WS_Inven
    Fila = 2
    While .Cells(Fila, "A") <> ""
        If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And _
            UCase(.Cells(Fila, "O")) = "UHT" Then
 
            Texto = .Cells(Fila, "C") & "·" & UCase(.Cells(Fila, "E"))
 
            Col = Buscar_Col_Inv(Texto, Tabla_Col_Inv)  ' --- Busca el articulo
            Pos = (Col * 3) + 1
 
            If Col > 0 Then
                Fil = Buscar_Fecha(Format(.Cells(Fila, "I"), "yyyy.mm.dd"), Tabla_Fil)   ' --- Busca la fecha
                If Fil > 0 Then
                    If UCase(.Cells(Fila, "N")) = "STOCK LIB" Then
                        Tabla_DAT(Fil, Pos + 0) = Tabla_DAT(Fil, Pos + 0) + .Cells(Fila, "G")
                    End If
                End If
 
                Select Case UCase(.Cells(Fila, "N"))
                    Case "TRANSITO": Tabla_Transit(Pos) = Tabla_Transit(Pos) + .Cells(Fila, "G")
                    Case "RESERVA":  Tabla_Reserva(Pos) = Tabla_Reserva(Pos) + .Cells(Fila, "G")
                    Case "RETENIDO": Tabla_Retenid(Pos) = Tabla_Retenid(Pos) + .Cells(Fila, "G")
                End Select
            End If
        End If
        Fila = Fila + 1
    Wend
End With
 
' </> ------------------------------------------------------------- </>
' </> ---&---  Lee la hoja de datos de Pedidos
' </> ------------------------------------------------------------- </>
 
With WS_Pedid
    Fila = 2
    While .Cells(Fila, "A") <> ""
        If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And _
            UCase(.Cells(Fila, "AE")) = "UHT" Then
 
            Texto = .Cells(Fila, "I") & "·" & UCase(.Cells(Fila, "AO"))
 
            Col = Buscar_Col_Inv(Texto, Tabla_Col_Inv)  ' --- Busca el articulo
            Pos = (Col * 3) + 1
 
            If Col > 0 Then
                Fil = Buscar_Fecha(Format(.Cells(Fila, "AN"), "yyyy.mm.dd"), Tabla_Fil)   ' --- Busca la fecha
                If Fil > 0 Then
 
                    Tabla_DAT(Fil, Pos + 1) = Tabla_DAT(Fil, Pos + 1) + .Cells(Fila, "L")
                    Tabla_DAT(Fil, Pos + 2) = Tabla_DAT(Fil, Pos + 2) + .Cells(Fila, "AL")
                End If
            End If
        End If
        Fila = Fila + 1
    Wend
End With
 
' ---&--- Escribe los datos en la hoja Refrigerado
 
With WS_PedAb
    For Col = 4 To Total_Col - 2
        For Fil = 6 To Total_Fil
            If Tabla_DAT(Fil, Col) <> 0 Then
                .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                 Total = Total + Tabla_DAT(Fil, Col)
            End If
        Next
 
                                        .Cells(Total_Fil + 1, Col) = Total
        If Tabla_Transit(Col) <> 0 Then .Cells(Total_Fil + 3, Col) = Tabla_Transit(Col)
        If Tabla_Reserva(Col) <> 0 Then .Cells(Total_Fil + 4, Col) = Tabla_Reserva(Col)
        If Tabla_Retenid(Col) <> 0 Then .Cells(Total_Fil + 5, Col) = Tabla_Retenid(Col)
                                         Total = 0#
    Next
End With
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 11/05/2021 09:10:43
Hola Antoni, aqui algunas observaciones:



Entonces aquí como debiera ser el código. Si se modifica esas líneas también debería modificarse algunas partes mas del codigo

Duda-2


Aquí también debería modificarse.

Duda-1


Y así el resto del código debería modificarse.


Duda-3



Por favor, podrias hacer la modificación completa en el código para ver su presentacion integra.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
With WS_PedAb
 
    ' ---&--- Tabla Columnas
 
    Total_Col = 4
 
    While .Cells(5, Total_Col).Value <> ""
        ReDim Preserve Tabla_Col_Inv((Total_Col - 1) / 3)
        ReDim Preserve Tabla_Col_Ped((Total_Col - 1) / 3)
 
        ReDim Preserve Tabla_Transit(Total_Col)
        ReDim Preserve Tabla_Reserva(Total_Col)
        ReDim Preserve Tabla_Retenid(Total_Col)
 
        Tabla_Col_Inv((Total_Col - 1) / 3) = Val(.Cells(4, Total_Col)) & "·" & UCase(.Cells(3, Total_Col))
        Tabla_Col_Ped((Total_Col - 1) / 3) = Val(.Cells(4, Total_Col))
 
        Total_Col = Total_Col + 3
    Wend
 
 
 
' ---&--- Añadfo las columnas Orden y Asigna del ultimo articulo
 
Total_Col = Total_Col + 2
 
ReDim Preserve Tabla_Transit(Total_Col)
ReDim Preserve Tabla_Reserva(Total_Col)
ReDim Preserve Tabla_Retenid(Total_Col)
 
' ---&---  Tabla de datos
 
ReDim Tabla_DAT(Total_Fil, Total_Col)
 
 
 
' </> ------------------------------------------------------------- </>
' </> ---&---  Lee la hoja de datos de INVENTARIO
' </> ------------------------------------------------------------- </>
 
With WS_Inven
    Fila = 2
    While .Cells(Fila, "A") <> ""
        If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And _
            UCase(.Cells(Fila, "O")) = "UHT" Then
 
            Texto = .Cells(Fila, "C") & "·" & UCase(.Cells(Fila, "E"))
 
            Col = Buscar_Col_Inv(Texto, Tabla_Col_Inv)  ' --- Busca el articulo
            Pos = (Col * 3) + 1
 
            If Col > 0 Then
                Fil = Buscar_Fecha(Format(.Cells(Fila, "I"), "yyyy.mm.dd"), Tabla_Fil)   ' --- Busca la fecha
                If Fil > 0 Then
                    If UCase(.Cells(Fila, "N")) = "STOCK LIB" Then
                        Tabla_DAT(Fil, Pos + 0) = Tabla_DAT(Fil, Pos + 0) + .Cells(Fila, "G")
                    End If
                End If
 
                Select Case UCase(.Cells(Fila, "N"))
                    Case "TRANSITO": Tabla_Transit(Pos) = Tabla_Transit(Pos) + .Cells(Fila, "G")
                    Case "RESERVA":  Tabla_Reserva(Pos) = Tabla_Reserva(Pos) + .Cells(Fila, "G")
                    Case "RETENIDO": Tabla_Retenid(Pos) = Tabla_Retenid(Pos) + .Cells(Fila, "G")
                End Select
            End If
        End If
        Fila = Fila + 1
    Wend
End With
 
' </> ------------------------------------------------------------- </>
' </> ---&---  Lee la hoja de datos de Pedidos
' </> ------------------------------------------------------------- </>
 
With WS_Pedid
    Fila = 2
    While .Cells(Fila, "A") <> ""
        If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And _
            UCase(.Cells(Fila, "AE")) = "UHT" Then
 
            Texto = .Cells(Fila, "I") & "·" & UCase(.Cells(Fila, "AO"))
 
            Col = Buscar_Col_Inv(Texto, Tabla_Col_Inv)  ' --- Busca el articulo
            Pos = (Col * 3) + 1
 
            If Col > 0 Then
                Fil = Buscar_Fecha(Format(.Cells(Fila, "AN"), "yyyy.mm.dd"), Tabla_Fil)   ' --- Busca la fecha
                If Fil > 0 Then
 
                    Tabla_DAT(Fil, Pos + 1) = Tabla_DAT(Fil, Pos + 1) + .Cells(Fila, "L")
                    Tabla_DAT(Fil, Pos + 2) = Tabla_DAT(Fil, Pos + 2) + .Cells(Fila, "AL")
                End If
            End If
        End If
        Fila = Fila + 1
    Wend
End With
 
' ---&--- Escribe los datos en la hoja Refrigerado
 
With WS_PedAb
    For Col = 4 To Total_Col - 2
        For Fil = 6 To Total_Fil
            If Tabla_DAT(Fil, Col) <> 0 Then
                .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                 Total = Total + Tabla_DAT(Fil, Col)
            End If
        Next
 
                                        .Cells(Total_Fil + 1, Col) = Total
        If Tabla_Transit(Col) <> 0 Then .Cells(Total_Fil + 3, Col) = Tabla_Transit(Col)
        If Tabla_Reserva(Col) <> 0 Then .Cells(Total_Fil + 4, Col) = Tabla_Reserva(Col)
        If Tabla_Retenid(Col) <> 0 Then .Cells(Total_Fil + 5, Col) = Tabla_Retenid(Col)
                                         Total = 0#
    Next
End With
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 11/05/2021 10:13:31
Te pongo el código con los cambios y sin las líneas de código que no eran necesarias:

Marco los cambios en NEGRITA:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
Sub Abarrotes_2CD200()
    Dim WS_Pedid As Worksheet
    Dim WS_Inven As Worksheet, a As Integer, old As Integer
    Dim WS_PedAb As Worksheet, b As Integer
 
    Dim Fil As Integer, Total_Fil As Integer, Fila As Long, _
        Col As Integer, Total_Col As Integer, Total As Long, _
        Pos As Integer
 
    Dim Tabla_Col_Inv() As String, Ini As Single, Texto As String
    Dim Tabla_Col_Ped() As Long
    Dim Tabla_Fil() As String
    Dim Tabla_DAT() As Long, Inicio As Single
 
    Dim Tabla_Transit() As Long
    Dim Tabla_Reserva() As Long
    Dim Tabla_Retenid() As Long
 
    Inicio = Timer
 
    ' ---&--- Limpia la Hoja
 
    Worksheets("Inv-PedAbarrotes_2").Range("D6:HT75").Value = Empty
 
    With Application
        .ScreenUpdating = False
        old = .Calculation
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
 
    Set WS_Pedid = Worksheets("Pedidos")
    Set WS_Inven = Worksheets("Inventario")
    Set WS_PedAb = Worksheets("Inv-PedAbarrotes_2")
 
    ' ---&--- Carga los datos en las tablas
 
    With WS_PedAb
 
        ' ---&--- Tabla Columnas
 
        Total_Col = 4
 
        While .Cells(5, Total_Col).Value <> ""
            ReDim Preserve Tabla_Col_Inv((Total_Col - 1) / 3)
 
            ReDim Preserve Tabla_Transit((Total_Col - 1) / 3)
            ReDim Preserve Tabla_Reserva((Total_Col - 1) / 3)
            ReDim Preserve Tabla_Retenid((Total_Col - 1) / 3)
 
            Tabla_Col_Inv((Total_Col - 1) / 3) = Val(.Cells(4, Total_Col)) & "·" & UCase(.Cells(3, Total_Col))
 
            Total_Col = Total_Col + 3
        Wend
 
        ' ---&--- Tabla Filas
 
        Total_Fil = 6
        While .Cells(Total_Fil, "C").Value <> ""
            ReDim Preserve Tabla_Fil(Total_Fil)
 
            Tabla_Fil(Total_Fil) = Format(.Cells(Total_Fil, 3), "yyyy.mm.dd")
            Total_Fil = Total_Fil + 1
        Wend
    End With
 
    ' ---&---  Tabla de datos
 
    ReDim Tabla_DAT(Total_Fil, Total_Col)
 
    ' </> ------------------------------------------------------------- </>
    ' </> ---&---  Lee la hoja de datos de INVENTARIO
    ' </> ------------------------------------------------------------- </>
 
    With WS_Inven
        Fila = 2
        While .Cells(Fila, "A") <> ""
            If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And _
                UCase(.Cells(Fila, "O")) = "UHT" Then
 
                Texto = .Cells(Fila, "C") & "·" & UCase(.Cells(Fila, "E"))
 
                Col = Buscar_Col_Inv(Texto, Tabla_Col_Inv)  ' --- Busca el articulo
                Pos = (Col * 3) + 1
 
                If Col > 0 Then
                    Fil = Buscar_Fecha(Format(.Cells(Fila, "I"), "yyyy.mm.dd"), Tabla_Fil)   ' --- Busca la fecha
                    If Fil > 0 Then
                        If UCase(.Cells(Fila, "N")) = "STOCK LIB" Then
                            Tabla_DAT(Fil, Pos + 0) = Tabla_DAT(Fil, Pos + 0) + .Cells(Fila, "G")
                        End If
                    End If
 
                    Select Case UCase(.Cells(Fila, "N"))
                        Case "TRANSITO": Tabla_Transit(Col) = Tabla_Transit(Col) + .Cells(Fila, "G")
                        Case "RESERVA":  Tabla_Reserva(Col) = Tabla_Reserva(Col) + .Cells(Fila, "G")
                        Case "RETENIDO": Tabla_Retenid(Col) = Tabla_Retenid(Col) + .Cells(Fila, "G")
                    End Select
                End If
            End If
            Fila = Fila + 1
        Wend
    End With
 
    ' </> ------------------------------------------------------------- </>
    ' </> ---&---  Lee la hoja de datos de Pedidos
    ' </> ------------------------------------------------------------- </>
 
    With WS_Pedid
        Fila = 2
        While .Cells(Fila, "A") <> ""
            If (UCase(.Cells(Fila, "A")) = "200VR" Or .Cells(Fila, "A") = 200) And _
                UCase(.Cells(Fila, "AE")) = "UHT" Then
 
                Texto = .Cells(Fila, "I") & "·" & UCase(.Cells(Fila, "AO"))
 
                Col = Buscar_Col_Inv(Texto, Tabla_Col_Inv)  ' --- Busca el articulo
                Pos = (Col * 3) + 1
 
                If Col > 0 Then
                    Fil = Buscar_Fecha(Format(.Cells(Fila, "AN"), "yyyy.mm.dd"), Tabla_Fil)   ' --- Busca la fecha
                    If Fil > 0 Then
 
                        Tabla_DAT(Fil, Pos + 1) = Tabla_DAT(Fil, Pos + 1) + .Cells(Fila, "L")
                        Tabla_DAT(Fil, Pos + 2) = Tabla_DAT(Fil, Pos + 2) + .Cells(Fila, "AL")
                    End If
                End If
            End If
            Fila = Fila + 1
        Wend
    End With
 
    ' ---&--- Escribe los datos en la hoja Refrigerado
 
    With WS_PedAb
        For Col = 4 To Total_Col - 2
            For Fil = 6 To Total_Fil
                If Tabla_DAT(Fil, Col) <> 0 Then
                    .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                     Total = Total + Tabla_DAT(Fil, Col)
                End If
            Next
            .Cells(Total_Fil + 1, Col) = Total
                                         Total = 0#
            If (Col - 1) Mod 3 = 0 Then
                Pos = Int((Col - 1) / 3)
                If Tabla_Transit(Pos) <> 0 Then .Cells(Total_Fil + 3, Col) = Tabla_Transit(Pos)
                If Tabla_Reserva(Pos) <> 0 Then .Cells(Total_Fil + 4, Col) = Tabla_Reserva(Pos)
                If Tabla_Retenid(Pos) <> 0 Then .Cells(Total_Fil + 5, Col) = Tabla_Retenid(Pos)
            End If
        Next
    End With
 
    WS_PedAb.Cells(1, 12) = "INFORME DE ABA CD SANTIAGO"
 
    MsgBox "Fin de la Macro Ver. 2.00." & _
            vbCrLf & _
            vbCrLf & _
           "Tiempo: " & Format(Timer - Inicio, "##0.## seg.")
End Sub

Funciona igual y es igual de rápida pero consume los recursos necesarios.
Si necesito una tabla de 100 elementos crearla para 100.000 es innecesario aunque tengamos memoria de sobra, hay que programar bien y a veces cuando haces muchos cambios en un programa puede pasar que te dejes cosas que ya no son necesarias pero a la larga ayudan a confundir al que se mira el programa.

Adjunto libro con los cambios en la macro.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 11/05/2021 13:24:25
Hola Antoni,

Que explica la instrucción que esta con negrita.

1
2
3
4
5
6
7
' ---&--- Escribe los datos en la hoja Refrigerado
If (Col - 1) Mod 3 = 0 Then
Pos = Int((Col - 1) / 3)
    If Tabla_Transit(Pos) <> 0 Then .Cells(Total_Fil + 3, Col) = Tabla_Transit(Pos)
    If Tabla_Reserva(Pos) <> 0 Then .Cells(Total_Fil + 4, Col) = Tabla_Reserva(Pos)
    If Tabla_Retenid(Pos) <> 0 Then .Cells(Total_Fil + 5, Col) = Tabla_Retenid(Pos)
End If

Hay una pequeña diferencia entre la información del Archivo PreAsignacion e Inventario CDs_V9.2 vs PreAsignacion e Inventario CDs_V9.3

Ver Imagen (Articulo 124002 marcado con recuadro verde)


V9.2-vs-V9.3
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 11/05/2021 16:15:55
Arreglado.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Sub Abarrotes_2CD200()
    ...
 
    ' ---&--- Escribe los datos en la hoja Refrigerado
 
    With WS_PedAb
        For Col = 4 To Total_Col - 1   '--- Aqui esta el error de que no escribiese en la ultima columna
            For Fil = 6 To Total_Fil
                If Tabla_DAT(Fil, Col) <> 0 Then
                    .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                     Total = Total + Tabla_DAT(Fil, Col)
                End If
            Next
            .Cells(Total_Fil + 1, Col) = Total
                                         Total = 0#
            If (Col - 1) Mod 3 = 0 Then
                Pos = Int((Col - 1) / 3)
                If Tabla_Transit(Pos) <> 0 Then .Cells(Total_Fil + 3, Col) = Tabla_Transit(Pos)
                If Tabla_Reserva(Pos) <> 0 Then .Cells(Total_Fil + 4, Col) = Tabla_Reserva(Pos)
                If Tabla_Retenid(Pos) <> 0 Then .Cells(Total_Fil + 5, Col) = Tabla_Retenid(Pos)
            End If
        Next
    End With
 
    WS_PedAb.Cells(1, 12) = "INFORME DE ABA CD SANTIAGO"
 
    MsgBox "Fin de la Macro Ver. 2.00." & _
            vbCrLf & _
            vbCrLf & _
           "Tiempo: " & Format(Timer - Inicio, "##0.## seg.")
End Sub

Para entender esta dos líneas hay entender como funciona las tablas, me explico.

La tabla Tabla_DAT tiene dos dimensiones la primera corresponde a las columnas de la hoja done tenemos que poner datos que va del 1 al 222 y la segunda corresponde a las filas que va de la 1 a la 54.

En las tablas de los códigos de Artículo, Transito, Reserva y Retenido solo utilizan 74 de las 222 columnas porque van en columna salteadas de tres en tres por esto se realiza estos cálculos.

Pongo un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
Columna  ======= IF =======   Cálculo    Tablas
   4     ( 4 - 1) MOD 3 = 0   ( 4-1)/3 =   1
   5     ( 5 - 1) MOD 3 = 1
   6     ( 6 - 1) MOD 3 = 2
   7     ( 7 - 1) MOD 3 = 0   ( 7-1)/3 =   2
   8     ( 8 - 1) MOD 3 = 1
   9     ( 9 - 1) MOD 3 = 2
  10     (10 - 1) MOD 3 = 0   (10-1)/3 =   3
  11     (11 - 1) MOD 3 = 1
  12     (12 - 1) MOD 3 = 2
 
Nota: MOD  Devuelve el resto de la división.

En la tabla de Artículos era interesante eliminar los elementos vacíos por que reduce el tiempo de búsqueda, en cambio en las tablas de Transito, Reserva y Retenido era indiferente por que hablamos de 222 elementos y no de 22.000.000 que en este caso el consumo de memoria si es un tema a tener en cuenta.

Adjunto el libro corregido.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 12/05/2021 08:49:12
Muchas Gracias Antoni, se le vuelve a agradecer su buena colaboración durante estas semanas. Gracias por tu paciencia!!



Consulta, tengo publicado en este foro otro tema, solo me falta un detalle por afinar. Si puedes ayudarme el tema publicado es "Crear Gráficos en UserForm"

Atte.

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 14/05/2021 14:49:55
Hola Antoni, me salto una duda.

Porque las diferencias entres estos códigos, sin embargo envían los mismos resultados? explicame por favor.

PreAsignacion e Inventario CDs_V9.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
' ---&--- Escribe los datos en la hoja Refrigerado
 
With WS_PedAb
    For Col = 4 To Total_Col - 2
        For Fil = 6 To Total_Fil
            If Tabla_DAT(Fil, Col) <> 0 Then
                .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                 Total = Total + Tabla_DAT(Fil, Col)
            End If
        Next
 
                                        .Cells(Total_Fil + 1, Col) = Total
        If Tabla_Transit(Col) <> 0 Then .Cells(Total_Fil + 3, Col) = Tabla_Transit(Col)
        If Tabla_Reserva(Col) <> 0 Then .Cells(Total_Fil + 4, Col) = Tabla_Reserva(Col)
        If Tabla_Retenid(Col) <> 0 Then .Cells(Total_Fil + 5, Col) = Tabla_Retenid(Col)
                                         Total = 0#
    Next
End With


PreAsignacion e Inventario CDs_V9.4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
' ---&--- Escribe los datos en la hoja Refrigerado
 
With WS_PedAb
    For Col = 4 To Total_Col - 1
        For Fil = 6 To Total_Fil
            If Tabla_DAT(Fil, Col) <> 0 Then
                .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                 Total = Total + Tabla_DAT(Fil, Col)
            End If
        Next
        .Cells(Total_Fil + 1, Col) = Total
                                     Total = 0#
        If (Col - 1) Mod 3 = 0 Then
            Pos = Int((Col - 1) / 3)
            If Tabla_Transit(Pos) <> 0 Then .Cells(Total_Fil + 3, Col) = Tabla_Transit(Pos)
            If Tabla_Reserva(Pos) <> 0 Then .Cells(Total_Fil + 4, Col) = Tabla_Reserva(Pos)
            If Tabla_Retenid(Pos) <> 0 Then .Cells(Total_Fil + 5, Col) = Tabla_Retenid(Pos)
        End If
    Next
End With
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Antoni Masana (2477 intervenciones) el 14/05/2021 16:55:56
PreAsignacion e Inventario CDs_V9.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
' ---&--- Escribe los datos en la hoja Refrigerado
 
With WS_PedAb
    For Col = 4 To Total_Col - 2  ' <-- Esto es un error porque no pone la ultima cloumna
        For Fil = 6 To Total_Fil
            If Tabla_DAT(Fil, Col) <> 0 Then
                .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                Total = Total + Tabla_DAT(Fil, Col)
            End If
        Next
 
                                        .Cells(Total_Fil + 1, Col) = Total
        If Tabla_Transit(Col) <> 0 Then .Cells(Total_Fil + 3, Col) = Tabla_Transit(Col)
        If Tabla_Reserva(Col) <> 0 Then .Cells(Total_Fil + 4, Col) = Tabla_Reserva(Col)
        If Tabla_Retenid(Col) <> 0 Then .Cells(Total_Fil + 5, Col) = Tabla_Retenid(Col)
        Total = 0#  ' <-- Contabiliza el total de la columna y despues de escribirlo se pone la variable a CERO
    Next
End With

PreAsignacion e Inventario CDs_V9.4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
' ---&--- Escribe los datos en la hoja Refrigerado
 
With WS_PedAb
    For Col = 4 To Total_Col - 1
        For Fil = 6 To Total_Fil
            If Tabla_DAT(Fil, Col) <> 0 Then
                .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                Total = Total + Tabla_DAT(Fil, Col)
            End If
        Next
        .Cells(Total_Fil + 1, Col) = Total
        Total = 0#  ' <-- Igual que el anterior pero aquí lo pongo a cero después de escribir el dato
                    '       por que no afecta a resto de código
 
        If (Col - 1) Mod 3 = 0 Then
            Pos = Int((Col - 1) / 3)
            If Tabla_Transit(Pos) <> 0 Then .Cells(Total_Fil + 3, Col) = Tabla_Transit(Pos)
            If Tabla_Reserva(Pos) <> 0 Then .Cells(Total_Fil + 4, Col) = Tabla_Reserva(Pos)
            If Tabla_Retenid(Pos) <> 0 Then .Cells(Total_Fil + 5, Col) = Tabla_Retenid(Pos)
        End If
    Next
End With


En la primer código las tablas Transit Reserva y Retenid tiene 223 elementos y cada uno corresponde a una columna y solo tiene datos una de cada tres.
En el segundo código la tablas solo tiene tantos elementos como artículos hay en la hoja con lo que tiene un tercio de elementos y por esto hay la formula Pos = Int((Col - 1) / 3) para calcular que el elemento 1 de la tabla le corresponde la columna 4, el elemento 2 le corresponde la columna 7, etc.

No es más rápido uno que el otro para la cantidad de elementos que se tratan, ni el tamaño de memoria afecta significativamente, lo cambie para ver diferentes formas de hacerlo.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 257
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Solución (Buscar articulos con fechas de expiracion)

Publicado por Juan (184 intervenciones) el 17/05/2021 09:23:51
Hola Antoni,
He revisado los códigos y modifique en el archivo PreAsignacion e Inventario CDs_V9.2 For Col = 4 To Total_Col - 2 por
For Col = 4 To Total_Col - 1 sin embargo arrojan el mismo resultado correcto. Se supone que si cambio -2 por -1 debería reportarse distinto el resultado.

En cambio en el Archivo PreAsignacion e Inventario CDs_V9.4. cambiando -2 por -1 ahi se observa diferencia en la última columna del reporte.

PreAsignacion e Inventario CDs_V9.2

1
2
3
4
5
6
7
8
9
10
' ---&--- Escribe los datos en la hoja Refrigerado
 
    With WS_PedAb
For Col = 4 To Total_Col - 2 
            For Fil = 6 To Total_Fil
                If Tabla_DAT(Fil, Col) <> 0 Then
                    .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                     Total = Total + Tabla_DAT(Fil, Col)
                End If
            Next


PreAsignacion e Inventario CDs_V9.4

1
2
3
4
5
6
7
8
9
10
11
12
' ---&--- Escribe los datos en la hoja Refrigerado
 
    With WS_PedAb
        For Col = 4 To Total_Col - 1
            For Fil = 6 To Total_Fil
                If Tabla_DAT(Fil, Col) <> 0 Then
                    .Cells(Fil, Col) = Tabla_DAT(Fil, Col)
                     Total = Total + Tabla_DAT(Fil, Col)
                End If
            Next
            .Cells(Total_Fil + 1, Col) = Total
                                         Total = 0#

Me interesaria saber porque no se produce diferencia en el reporte PreAsignacion e Inventario CDs_V9.2 si,
For Col = 4 To Total_Col - 2 'se lee desde la cuarta columna hasta la penúltima columna.
For Col = 4 To Total_Col - 1 'se lee desde la cuarta columna hasta la última columna



Adjunto los dos archivos para su comparación.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar