Buscar títulos concretos e indicar número de fila

Tengo una hoja de excel con 1500 títulos de libros y lo que desearía es poder buscar los nombres por aproximación, es decir que al escribir por ejemplo "poesía" me devolviera todos los títulos que contuvieran "poesía" como palabra independiente es decir "* poesía *" y que me la encontrara tanto si la escribo con acento como sin acento en todos los títulos que contuvieran "poesía" o "poesia"

Necesitaría también que se indicara qué número de fila contiene ese valor.

La columna con los títulos es la A y lleva encabezado. Querría hacerlo con código vba.

1 respuesta

Respuesta
1

H o l a:

¿Y el resultado dónde lo quieres?

Si el resultado lo quieres en otra hoja, deberás detallar los nombres de las 2 hojas (origen y destino), qué datos quieres de la hoja origen, en dónde están en la hoja origen, dónde los quieres en la hoja destino.

En dónde vas a capturar la palabra, por ejemplo: ¿Poesia? ¿En hoja origen o en la hoja destino?

Espero tus comentarios. Si puedes poner los ejemplos con imágenes.

S a l u d o s

Hola

Había pensado realizar las búsquedas a través de un botón que al pulsarlo me abriera un inputbox donde poner el valor a buscar y que me devolviera los resultados en otra hoja que constaría de dos columnas, la columna A indicando el número de fila y la columna B con los títulos de los libros que contienen ese valor.

Te especifico cosas:

La hoja origen se llama "TITULOS" y los valores a buscar estarían en la columna A cuyo encabezado sería "Libros". El rango es desde A2:A30000. Aquí están los títulos de los libros.

La hoja destino se llamaría "BUSQUEDAS" y en la columna A aparecerían como valores la numeración de las filas donde están los títulos y en la columna B los títulos que contienen esa palabra a buscar.

Las palabras a buscar se capturarían de la hoja origen de nombre "TITULOS"

Muchas gracias por ayudarme

Te anexo la macro, la puedes poner en cualquiera de las 2 hojas:

Sub Buscar()
'Por.Dante Amor
    Set h1 = Sheets("titulos")
    Set h2 = Sheets("busquedas")
    u = h2.Range("A" & Rows.Count).End(xlUp).Row
    If u < 2 Then u = 2
    h2.Range("A2:B" & u).ClearContents
    '
    titulo = InputBox("Escribe la palabra a buscar")
    If titulo = "" Then Exit Sub
    '
    j = 2
    Set r = h1.Columns("A")
    Set b = r.Find(titulo, lookat:=xlPart)
    If Not b Is Nothing Then
        ncell = b.Address
        Do
            'detalle
            h2.Cells(j, "A") = b.Row
            h2.Cells(j, "B") = b.Value
            j = j + 1
            Set b = r.FindNext(b)
        Loop While Not b Is Nothing And b.Address <> ncell
    End If
End Sub

Para encontrar palabras con el acento o sin acento, en lugar de escribir "poesía", tendrás que escribir "poes", o bien, puedes escribir "poes*a", o también, puedes escribir "poes?a"

Hola Dante Amor

Ante todo muchas gracias por tu ayuda

La macro funciona muy bien salvo algunos detalles. La he insertado en un botón ....

Lo único que como ya te comenté querría que buscara palabras enteras es decir que si busco por ejemplo "luna" me refiero a "luna" como palabra y no como parte de una.

Ahora mismo si busco "luna" me devuelve:

la luna amarilla

el lunar de julia

lunatico

lunas

y sólo quiero que me devuelva en este caso de ejemplo "la luna amarilla" vamos que solo devuelva los resultados con esa palabra en cualquier posición de la cadena, al principio, en medio o al final del título.

Tendría que devolver solo estas opciones:

"luna", "* luna *", "luna *", "* luna" (los asteriscos son comodines)

Otro detalle es que cuando inserto el valor en el inputbox y pulso aceptar me gustaría que automáticamente se me abriera la hoja destino "busquedas" y que si modifico los titulos en la hoja "busquedas" se modificaran también automáticamente en la hoja origen "titulos" o sea que se actualizaran.

Muchas gracias de antemano por todo

Para que te encuentre luna, tendrías que escribir

" Luna "

Es decir, tendrías que poner un espacio antes y un espacio después.

Tendrías que jugar con esos elementos, el buscador no es un diccionario, no sabría si estás poniendo una palabra correcta o una parte de una palabra, si pones "lun" te va a traes todos los títulos que tengan "lun" por ejemplo: "luna", "lunes", "alunizar", etc; si quieres en específico: "luna", entonces escribe "luna " (con el espacio).


Para que abra la hoja destino, solamente pon tu botón en la hoja destino.

Si quieres tener el botón en la hoja "títulos", entonces utiliza esta macro:

Sub Buscar()
'Por.Dante Amor
    Set h1 = Sheets("titulos")
    Set h2 = Sheets("busquedas")
    u = h2.Range("A" & Rows.Count).End(xlUp).Row
    If u < 2 Then u = 2
    h2.Range("A2:B" & u).ClearContents
    '
    titulo = InputBox("Escribe la palabra a buscar")
    If titulo = "" Then Exit Sub
    '
    j = 2
    Set r = h1.Columns("A")
    Set b = r.Find(titulo, lookat:=xlPart)
    If Not b Is Nothing Then
        ncell = b.Address
        Do
            'detalle
            h2.Cells(j, "A") = b.Row
            h2.Cells(j, "B") = b.Value
            j = j + 1
            Set b = r.FindNext(b)
        Loop While Not b Is Nothing And b.Address <> ncell
    End If
    h2.Select
End Sub

Para lo de los títulos, puedes poner una fórmula en la hoja "busquedas". Por ejemplo en la celda A1 de la hoja "busquedas" pon esta fórmula:

=titulos! A1

Si modificas el dato de la celda A1 de "titulos" en automático la celda A1 de "busquedas" se acutalizará.


Ah, ya te entendí esta parte:

"y que si modifico los titulos en la hoja "busquedas" se modificaran también automáticamente en la hoja origen "titulos" o sea que se actualizaran"

Eso tendría que ser con otra macro. Valora esta respuesta y crea una nueva pregunta con la petición, en el desarrollo de la pregunta describe cómo quieres hacer el cambio, por ejemplo, se me ocurre: en la columna C de la hoja "busquedas", escribir el nuevo texto y que una macro actualice la hoja "titulos".

S a l u d o s

ok te expongo la duda de las modificaciones de título en otra pregunta.

Lo único,  que con lo de las palabras a buscar como "luna" me comentas que para buscar eso específico ponga "luna " pero entonces si tengo títulos como "luna" o "de la Tierra a la luna" no los encontraría el buscador, solo encontrarí "luna de ..." etc.

Y ... no se puede hacer con vba un filtro en la macro que me expones algo como...

dim palabra as string

dim mifiltro as string

palabra= inputbox

mifiltro= mifiltro like '"  & palabra & "'

mifiltro= mifiltro like '* "  & palabra & " *' or

mifiltro= mifiltro like '* "  & palabra & "' or

mifiltro= mifiltro like '"  & palabra & " *'

Sé que esto está mal pero por si te da alguna idea para buscar coincidencias exactas en los titulos.

Perdona por insistir en esto pero es que para mí es muy importante pero si lo que te indico no te da alguna idea pues nada, cierro el tema y te puntúo por supuesto con la mejor nota posible y muy agradecido Dante Amor.

Listo!

Sub Buscar()
'Por.Dante Amor
    Set h1 = Sheets("titulos")
    Set h2 = Sheets("busquedas")
    u = h2.Range("A" & Rows.Count).End(xlUp).Row
    If u < 2 Then u = 2
    h2.Range("A2:B" & u).ClearContents
    '
    titulo = InputBox("Escribe la palabra a buscar")
    If titulo = "" Then Exit Sub
    '
    j = 2
    Set r = h1.Columns("A")
    Set b = r.Find(titulo, lookat:=xlPart)
    If Not b Is Nothing Then
        ncell = b.Address
        Do
            'detalle
            If h1.Cells(b.Row, "A") Like titulo Or _
               h1.Cells(b.Row, "A") Like "* " & titulo Or _
               h1.Cells(b.Row, "A") Like titulo & " *" Or _
               h1.Cells(b.Row, "A") Like "* " & titulo & " *" Then
                h2.Cells(j, "A") = b.Row
                h2.Cells(j, "B") = b.Value
                j = j + 1
            End If
            Set b = r.FindNext(b)
        Loop While Not b Is Nothing And b.Address <> ncell
    End If
    h2.Select
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas