Problemas con métodos de búsqueda

Siempre se me a complicado mucho los métodos de búsqueda ya sea Find o VlookUp y similares. Les adjuntare un Word (o un enlace para descargarlo más precisamente) en el que escribí lo que debe hacer la macro, disculpen que no lo escribí acá, pero me excedía del número máximo de caracteres. Espero que me puedan ayudar y agradezco cualquier ayuda que me puedan ofrecer.

Explicación de la Macro

Este es el código que llevo hasta ahora y agradezco cualquier ayuda. Saludos

Private Sub cmdgres_Click()
'Se apaga el Update de la Pantalla
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'On Error Resume Next
'variables
Dim myfile, mybook, myfile2, mybook2, a, b, c As String
Ruta = ActiveWorkbook.Path
ChDir Ruta
'Explorador de Archivos para buscar el archivo de nombre variable
myfile = Application.GetOpenFilename("Archivos Excel (*.xlsm), *.xlsm*", , "Seleccione el archivo de Calculo de cantidades")
If VarType(myfile) = vbBoolean Then
    MsgBox ("Operación Cancelada"), vbCritical, "AVISO"
    Exit Sub
End If
'Se guarda la ubicación del archivo de nombre variable
mybook = ActiveWorkbook.Name
Workbooks.Open Filename:=myfile, UpdateLinks:=0
FullName = Split(myfile, Application.PathSeparator)
a = FullName(UBound(FullName))
'Se aplica el filtro
Set HF = Sheets("ITEMS")
    HF.UsedRange.AutoFilter Field:=2, Criteria1:=">=1", _
        Operator:=xlOr
'Se guarda en una variable el numero de filas luego del filtro
Dim cantf As Integer
    cantf = 0
    uf = Sheets("ITEMS").Range("B" & Rows.Count).End(xlUp).Row
For i = 2 To uf
  If Sheets("ITEMS").Cells(i, 1) <> Empty Then
  cantf = cantf + 1
  End If
Next i
'Explorador de archivos para buscar el archivo de APU
myfile2 = Application.GetOpenFilename("Archivos Excel (*.xlsm), *.xlsm*", , "Seleccione el archivo de APU")
If VarType(myfile) = vbBoolean Then
    MsgBox ("Operación Cancelada"), vbCritical, "AVISO"
    Exit Sub
End If
'se guarda la ubicacion del archivo de APU en otra variable
mybook2 = ActiveWorkbook.Name
Workbooks.Open Filename:=myfile2, UpdateLinks:=0
FullName = Split(myfile, Application.PathSeparator)
b = FullName(UBound(FullName))
'Se ubica en el primer celda de la lista resultante del filtro
Workbooks(a).Sheets("ITEMS").Activate
    ActiveSheet.Range("C6").Select
    Selection.End(xlDown).Select
'Guarda el código en una variable, después de asegurarse de que la celda no este vacia
'For i = 6 To cantf 'Con este ciclo lo que quiero hacer es que cuando termine la busqueda de un código regrese aca para leer y buscar el código siguiente, pero solo he logrado hacer un ciclo infinito :v
If ActiveCell = Empty Then
    Selection.Offset(1, 0).Select
End If
cd = ActiveCell.Value
MsgBox "El Código es: " & cd
'Hasta acá todo funciona bien  
'''''''
'-- --'
' --- '
'''''''
'A partir de acá es donde hará la búsqueda del paso 4
Workbooks("b").Sheets("APU").Activate
    u = b.Range("B" & Rows.Count).End(xlUp).Row
Set bc = b.Range("B:B" & u).Find(cd, lookat:=xlWhole, LookIn:=xlValues)
If Not bc Is Nothing Then
    MsgBox "No se que: " & bc
End If
'Next i
End Sub

1 respuesta

Respuesta
2

Te anexo la macro completa.

Tuve que crear la macro nueva, para tener un orden de archivos y hojas. Al inicio de la macro se establecen los libros que se van a utilizar; después se solicita que se abra el libro variable.

De preferencia mantén abierto tu libro APU, de esa forma es menos complicado.

En la macro van unos comentarios para mayor comprensión.

Observa como establezco en los objetos h1, h2 y h3 las hojas que voy a utilizar; posteriormente, durante el proceso de la macro, solamente hago referencia al objeto: h1. H2. Y h3.


Sub Proceso()
'Por Dante Amor
    Application.ScreenUpdating = False
    Set l1 = ThisWorkbook                                   'libro 1, libro con la macro
    Set l2 = Workbooks("APU.xlsx")                          'libro 2, libro APU, debe estar abierto
    Set h1 = l1.Sheets("Resumen APU")                       'hoja1 del libro 1
    Set h2 = l2.Sheets("APU")                               'hoja2 del libro 2
    '
    'Abrir el libro variable
    archivo = Application.GetOpenFilename("Archivos Excel (*.xlsm), *.xlsm*", , "Seleccione el archivo de Calculo de cantidades")
    If VarType(archivo) = vbBoolean Then
        MsgBox ("Operación Cancelada"), vbCritical, "AVISO"
        Exit Sub
    End If
    Set l3 = Workbooks.Open(archivo)                        'libro 3, libro variable
    Set h3 = l3.Sheets("ITEMS")                             'hoja 3, del libro 3
    '
    For i = 7 To h3.Range("C" & Rows.Count).End(xlUp).Row   'recorre hoja3
        cod = h3.Cells(i, "C").Value
        If cod <> "" Then
            'BUSCAR el código en libro2, hoja2 (APU)
            Set b = h2.Columns("B").Find(cod, lookat:=xlWhole)
            If Not b Is Nothing Then
                'SI LO ENCUENTRA. MARCAR la fila en h2
                uc = h2.Cells(b.Row, Columns.Count).End(xlToLeft).Column
                h2.Range("B" & b.Row, h2.Cells(b.Row, uc)).Interior.ColorIndex = 6
                'COPIAR filas de h2 (APU) a h1 (Resumen)
                ini = b.Row
                fin = ini
                For j = b.Row + 1 To h2.Range("B" & Rows.Count).End(xlUp).Row
                    If Len(h2.Cells(j, "B").Value) < 7 Then
                        h2.Range("B" & j, h2.Cells(j, uc)).Interior.ColorIndex = 6
                        fin = j
                    Else
                        Exit For
                    End If
                Next
                u1 = h1.Range("A" & Rows.Count).End(xlUp).Row + 1
                h2.Range(h2.Cells(ini, "B"), h2.Cells(fin, uc)).Copy
                h1.Range("A" & u1).PasteSpecial xlValues
            Else
                'NO ENCONTRADO. LO AGREGA EN HOJA1
                u1 = h1.Range("A" & Rows.Count).End(xlUp).Row + 1
                h1.Range("A" & u1).Value = cod
                h1.Rows(u1).Interior.ColorIndex = 6
            End If
        End If
    Next
    Application.ScreenUpdating = True
    l3.Close False
    MsgBox "Fin"
End Sub

'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 
'.[Avísame cualquier duda

Hola Dante, muchas gracias por tu respuesta. Tengo 2 dudas y problemilla, la primer duda es:

  • Ya que has creado la macro de nuevo imagino que debo reemplazar el 100% de mi macro con la tuya, estoy en lo correcto?.
  • La segunda duda es: La macro ignora los filtros?, es decir, si hipotéticamente fueran 100 datos, pero yo lo tengo filtrado para que solo se muestren 25, la macro de igual forma hará el proceso con los 100 datos??
  • Y el problemilla (el cual esta relacionado con la duda #2 y posiblemente sea mi culpa al no explicarme bien) es que veo que no incluiste el proceso donde se hace el filtro, este paso es importante ya que la hoja de nombre variable tiene miles de códigos (8873 para ser más precisa)  y al no hacer el filtro esta macro buscara todos esos códigos. Pero al incluir el filtro trabajara solo con los códigos que en su misma fila y en la columna B tengan un número, me explico:
    Sin filtro se trabajaría con un total de 124 datos:

Pero al hacer el filtro se trabaja con un total de 79 datos:


El filtro consiste simplemente en que en la Columna B no se vean las filas vacías

Quiero explicar un detalle que probablemente te confunda, primero dije que hay un total de 8873 datos y luego dije que hay 124, esto se debe a que antes de que esta macro se ejecute se hará un proceso previo, proceso que una vez finalizado dejara la hoja de nombre variable con un filtro en la columna "N" el cual oculta las filas vacías dando como resultado un total de 124 filas, espero que me hiciera entender

Eeeehhhh, ¿ya probaste la macro?


Te respondo tus dudas:

  • Ya que has creado la macro de nuevo imagino que debo reemplazar el 100% de mi macro con la tuya, ¿estoy en lo correcto?.

Correcto. Debes reemplazar tu macro.

  • La segunda duda es: ¿La macro ignora los filtros?, es decir, si hipotéticamente fueran 100 datos, pero yo lo tengo filtrado para que solo se muestren 25, ¿la macro de igual forma hará el proceso con los 100 datos?

Efectivamente no puse filtros. El proceso lee todos los registros, pero tiene un if para ignorar las celdas que están en blanco.

  • Y el problemilla (el cual esta relacionado con la duda #2 y posiblemente sea mi culpa al no explicarme bien) es que veo que no incluiste el proceso donde se hace el filtro, este paso es importante ya que la hoja de nombre variable tiene miles de códigos (8873 para ser más precisa) y al no hacer el filtro esta macro buscara todos esos códigos. Pero al incluir el filtro trabajara solo con los códigos que en su misma fila y en la columna B tengan un número

La macro revisa todos los registros, pero es muy rápida, por eso te recomiendo que pruebes mi macro.


Si después de tu prueba, la macro es lenta, te prometo que le pongo los filtros. Y realizo la mejora en el For - Next, para que solamente lea los registros filtrados. O mejor aún, me llevo los registros filtrados a una nueva hoja y de esa forma solamente leerá los registros filtrados, esto sería más rápido.

Pero primero prueba la macro y dime si cumple con lo que solicitas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas