Buscar en toda la hoja un valor determinado

Ahora mismo tenemos un botón BUSCAR que a partir de un combobox seleccionamos la columna donde buscar e ingresamos un valor en textbox para buscarlo exclusivamente en esa columna de la hoja "Titulos"

Querría poder tener otro botón para realizar una búsqueda (con coincidencia exacta como en el otro botón Buscar que ya tenemos) pero de manera global, es decir que buscara ese valor en toda la hoja "Titulos", en todas las columnas y que me devolviera los registros coincidentes en el listbox... Vamos la misma metodología que con BUSCAR pero ahora la búsqueda sería global.

Evidentemente los resultados en el listbox deben comportarse de igual manera que ocurre con resultados del botón Buscar, es decir podremos eliminarlos, modificarlos, guardar los cambios, cancelar... Lo comento por si hay que tenerlo en cuenta por si hace falta retocar los códigos de los botones que ya tenemos.

1 Respuesta

Respuesta
1

 H o l a: 

¿Por "con coincidencia exacta" te refieres a que hay que usar la instrucción "Like" como lo tenemos en la otra función de buscar?

Sí me refiero a eso, a usar la misma instrucción like pero esta vez buscamos en toda las columnas, en toda la hoja.

Gracias por todo

¿Puedes ver ya también la otra pregunta "Añadir filas a un listbox vinculado a hoja"?

H o l a:

Te anexo el código para la búsqueda global

Private Sub CommandButton6_Click()
'Por.Dante Amor
    'buscar global
    Application.ScreenUpdating = False
    Set h1 = Sheets("TITULOS")
    Set h2 = Sheets("FILTRO")
    h2.Cells.Clear
    titulo = UCase(TextBox1)
    If titulo = "" Then
        FiltrarTodo h1, h2
        Exit Sub
    End If
    '
    If IsNumeric(titulo) Then titulo = Val(titulo)
    j = 2
    'col = ComboBox1.ListIndex + 1
    ucol = h1.Cells(1, Columns.Count).End(xlToLeft).Column + 1
    Set r = h1.Cells
    Set b = r.Find(titulo, lookat:=xlPart, LookIn:=xlValues)
    If Not b Is Nothing Then
        ncell = b.Address
        h1.Rows(1).Copy h2.Rows(1)
        Do
            'detalle
            htit = UCase(h1.Cells(b.Row, b.Column))
            If htit Like titulo Or _
               htit Like "* " & titulo Or _
               htit Like titulo & " *" Or _
               htit Like "* " & titulo & " *" Then
                h1.Rows(b.Row).Copy
                h2.Rows(j).PasteSpecial Paste:=xlValues
                h2.Cells(j, ucol) = b.Row
                j = j + 1
            End If
            Set b = r.FindNext(b)
        Loop While Not b Is Nothing And b.Address <> ncell
        u = h2.Range("A" & Rows.Count).End(xlUp).Row
        If u = 1 Then
            MsgBox "No se encontraron resultados"
        Else
            h2.Columns(ucol).Cut
            h2.Columns("A:A").Insert Shift:=xlToRight
            h2.[A1] = "FILA"
            h2.Cells.EntireColumn.AutoFit
            '
            ucol = h2.Cells(1, Columns.Count).End(xlToLeft).Column
            letra = Evaluate("=SUBSTITUTE(ADDRESS(1," & ucol & ",4),""1"","""")")
            cad = ""
            For i = 1 To ucol
                cad = cad & h2.Cells(1, i).Width + 1 & ";"
            Next
            ComboBox1.SetFocus
            ComboBox2.Enabled = False
            ListBox1.ColumnCount = ucol
            'ListBox1.ColumnWidths = cad
            '
            ListBox1.RowSource = h2.Name & "!A2:" & letra & u
        End If
    Else
        MsgBox "No se encontraron resultados"
    End If
    Application.ScreenUpdating = True
End Sub

Realiza todas las pruebas y me comentas

 S a l u d o s

Hola

Disculpa que no te haya contestado antes pero es que estuve fuera y sin ordenador y hasta ayer no pude conectarme.

He estado probando la búsqueda global y lo único que falla es que a la hora de buscar globalmente en toda la hoja si por ejemplo un mismo registro tiene el mismo valor en varias columnas en ese caso la búsqueda muestra el registro tantas veces como encuentre el valor en cada columna de la hoja. Sin embargo si un mismo registro tiene el valor buscado en varias columnas, en varias celdas de la fila debería mostrarse solo una vez el registro.

Es decir si busco por ejemplo como valor "poesia" me encuentra entre otros registros la fila 995 codigo R999 pero me lo muestra 2 veces (porque "poesia" está en COLUMNA TITULOS y en columna CATEGORIA) en vez de 1 sola vez. En estos casos que se repita el valor a buscar en varias partes del registro debe solo mostrarse 1 vez el registro.

Un saludo y GRACIAS de nuevo por tu ayuda

Se agregó la validación en el loop:

 Do
            'detalle
            htit = UCase(h1.Cells(b.Row, b.Column))
            If htit Like titulo Or _
               htit Like "* " & titulo Or _
               htit Like titulo & " *" Or _
               htit Like "* " & titulo & " *" Then
                If h1.Cells(b.Row, ucol) = "" And b.Row > 2 Then
                    h1.Rows(b.Row).Copy h2.Rows(j) '.PasteSpecial Paste:=xlValues
                    h2.Cells(j, ucol) = b.Row
                    j = j + 1
                    h1.Cells(b.Row, ucol) = "x"
                End If
            End If
            Set b = r.FindNext(b)
        Loop While Not b Is Nothing And b.Address <> ncell

¡Gracias! 

Funciona perfecto. Y muchas gracias también por explicarlo y detallar los cambios para así yo también poder razonarlos.

Un saludo y muchas gracias

-------------------------------------

Te he dejado otra pregunta "Añadir filas a un listbox vinculado a hoja"

La idea es añadir, insertar registros nuevos en vez de directamente en la hoja, a través del formulario...

Confírmame si puedes ver la pregunta. Si no la creo de nuevo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas