Ajustar macro para realizar buscar con más coincidencia excel vba

Ajusté la macro a mi necesidad y funciona, solo un pequeño retoque faltaría.


Tengo en la columna código"B" y apellidos y nombres en "C".

Realizo la búsqueda por ejemplo ortiz y en la base de existe

Ortiz saldaña, xxx

Ortiz sanchez, xx

¿Y la macro solo me arroja un resultado por que será?



Private Sub CommandButton1_Click()
''Por DAM
    Set h1 = Sheets("PRINCIPAL")
    Set h2 = Sheets("Temp")
    '
    If Me.txtFiltro1.Value = "" Then Exit Sub
    '
    h2.Cells.Clear
    ListBox1.RowSource = ""
    h1.Rows(2).Copy h2.Rows(1)
    '
    n = 2
    '
    For i = 3 To h1.Range("A3").CurrentRegion.Rows.Count
     cad = h1.Cells(i, "C") & UCase(h1.Cells(i, "C")) & h1.Cells(i, "B") ' bucar por nombre y DNI
        If cad Like "*" & UCase(txtFiltro1) & "*" Then
            h1.Rows(i).Copy h2.Rows(n)
            n = n + 1
        End If
    Next i
    u = h2.Range("A" & Rows.Count).End(xlUp).Row
    If u = 1 Then
        MsgBox "No existen registros con ese filtro", vbExclamation, "FILTRO"
        Exit Sub
    End If
    ListBox1.RowSource = h2.Name & "!B3:N" & u
End Sub

2 Respuestas

Respuesta
2

¿Qué tienes en la columna A?

En la siguiente instrucción de la macro. Le dices que vaya desde la fila 3, hasta el número de filas de la región actual, empezando en la celda A3, pero si en la columna A tienes celdas vacías, entonces el contador puede que no sea igual al número de filas con datos de la columna C.

For i = 3 To h1.Range("A3").CurrentRegion.Rows.Count

Lo recomendable es, si vas a evaluar la columna C, entonces obtengas la última fila de la columna C, por ejemplo:

u = h1.Range("C" & Rows. Count).End(xlUp). Row

Si vas a evaluar varias columnas, entonces en lugar de currentregion, puedes utilizar usedrange:

u = h1. UsedRange. Rows(h1. UsedRange. Rows. Count). Row

Prueba de esta forma, utiliza usedrange, tanto para el ciclo for, como para cargar el listbox:

Private Sub CommandButton1_Click()
''Por DAM
    Set h1 = Sheets("PRINCIPAL")
    Set h2 = Sheets("Temp")
    '
    If Me.txtFiltro1.Value = "" Then Exit Sub
    '
    h2.Cells.Clear
    ListBox1.RowSource = ""
    h1.Rows(2).Copy h2.Rows(1)
    '
    n = 2
    '
    u = h1.UsedRange.Rows(h1.UsedRange.Rows.Count).Row
    For i = 3 To u
        cad = UCase(h1.Cells(i, "C")) & h1.Cells(i, "B") ' bucar por nombre y DNI
        If cad Like "*" & UCase(txtFiltro1) & "*" Then
            h1.Rows(i).Copy h2.Rows(n)
            n = n + 1
        End If
    Next i
    u = h2.UsedRange.Rows(h2.UsedRange.Rows.Count).Row
    If u = 1 Then
        MsgBox "No existen registros con ese filtro", vbExclamation, "FILTRO"
        Exit Sub
    End If
    ListBox1.RowSource = h2.Name & "!B2:N" & u
End Sub

Prueba y me comentas.

Muchas gracias Dante ésta sugerencia me funcionó: " utiliza usedrange, tanto para el ciclo for, como para cargar el listbox:" 

Respuesta
2

Observa en la instrucción cad = que estás buscando también por DNI y ese dato es único.

Probalo de este modo:

cad = h1.Cells(i, "C") & UCase(h1.Cells(i, "C")) ' buscar por col C

Sdos.

Elsa

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas