Buscador con vba macro excel

Acabo de crear el siguiente código para un userform con un cuadro de texto, un botón y dos listbox en el que quiero su objetivo sea el de realizar búsquedas en aproximadamente 29 hojas y que la búsqueda se proyecte en dos listbox (Debido a que tengo 19 columnas de información, quise probar dividirlas en un listbox de 10 columnas y otra de 9)..::

Private Sub btn_buscar_Click()
Dim valor As String
valor = txt_Buscar.Value
Sheets("Hoja1").Select
    Cells.Find(what:=valor, after:=ActiveCell, LookIn:=xlValues, lookat _
        :=xlPart, searchorder:=xlByColumns, searchdirection:=xlNext, MatchCase:= _
        True, searchformat:=False).Activate
        Cells.FindNext(after:=ActiveCell).Activate
ListBox1.ColumnCount = 10 
ListBox1.AddItem
ListBox1.List(ListBox1.ListCount - 1, 0) = ActiveCell.Value 
ListBox1.List(ListBox1.ListCount - 1, 1) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 2) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 3) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 4) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 5) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 6) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 7) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 8) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 9) = ActiveCell.Value
ActiveCell.Offset(0, -9).Select 
ListBox2.ColumnCount = 9 
ListBox2.AddItem
ListBox2.List(ListBox1.ListCount - 1, 10) = ActiveCell.Value 
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 11) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 12) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 13) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 14) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 15) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 16) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 17) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 18) = ActiveCell.Value
ActiveCell.Offset(0, -18).Select 
Cells.FindNext(after:=ActiveCell).Activate
End Sub

Me suceden dos cosas, la primera es que se marca

"ListBox2.List(ListBox1.ListCount - 1, 10) = ActiveCell.Value 'Repetir esta y la siguiente linea para cada columna que se desee tener." arrojando error nº 380 en tiempo de ejecución.

la segunda (Si elimino la informacion del litbox2) es que se marca

 "Cells.Find(what:=valor, after:=ActiveCell, LookIn:=xlValues, lookat _
        :=xlPart, searchorder:=xlByColumns, searchdirection:=xlNext, MatchCase:= _
        True, searchformat:=False).Activate"

Arrojando un error 91 en tiempo de ejecución cuando intento por ejemplo usar "Sheets(Array("hoja1",..."

¿Cómo hago para que realice la busqueda en todas las hojas y que la informacion se muestre debidamente en el listbox? ¿Qué es eso de error 91? ¿Qué comando o codigo debo utilizar para que se realice la busqueda en varias hojas? Agradecido!

1 respuesta

Respuesta
1

1- El primer error se debe a que declaraste 1 segundo listbox de 9 columnas. (En tu consulta anterior tenías uno de 19)... entonces debes enviar la información a partir de la col 0 no 10.

ListBox2. AddItem
ListBox2. List(ListBox1.ListCount - 1, 10) = ActiveCell.Value 

Y a partir de esta línea irás incrementando en 1, 2 hasta 8.

2- La búsqueda estaba bien en macro anterior, quizás te esté faltando seleccionar alguna celda al activar cada hoja.

sh.Select
    [A1].Select

En la macro que dejas sería: 

Sheets("Hoja1").Select
[A1].select

Por supuesto que para seleccionarla deberá estar desbloqueada si la hoja está protegida.

Si fuese un array seleccionarás la hoja del array y luego la celda.

Si te quedan dudas escribime nuevamente o enviame tu libro a mi correo, se encuentra en el sitio que dejo al pie.

Hola! Sigo con el mismo problema de la listbox2. Yo lo que hice fue que al tener las 19 columnas, dividí la información en dos listbox de forma que 10 columnas de información aparezcan en el listbox1 y las otras 9 columnas de información en el listbox2. Las primeras 10 columnas se reflejan perfectamente, el error está en las ultimas 9 del listbox2, si hago esto:

ListBox1.ColumnCount = 10 
ListBox1.AddItem
ListBox1.List(ListBox1.ListCount - 1, 0) = ActiveCell.Value 
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 1) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 2) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 3) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 4) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 5) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 6) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 7) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 8) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox1.List(ListBox1.ListCount - 1, 9) = ActiveCell.Value
ActiveCell.Offset(0, -9).Select 
ListBox2.ColumnCount = 9 
ListBox2.AddItem
ListBox2.List(ListBox1.ListCount - 1, 0) = ActiveCell.Value 
ListBox2.List(ListBox1.ListCount - 1, 1) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 2) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 3) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 4) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 5) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 6) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 7) = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ListBox2.List(ListBox1.ListCount - 1, 8) = ActiveCell.Value
ActiveCell.Offset(0, -8).Select 

funciona pero se repite la misma informacion que aparece en el listbox1 ya que le estoy definiendo las mismas columnas y la idea es que salga la informacion a partir de la columna 11 hasta llegar a la 19, por eso empece a contar a partir de 10, pero esto me arroja dicho error.
^*Estoy acomodando la segunda pregunta^* Agradecido nuevamente!

no me funcionó la segunda pregunta, me sigue saliendo error 91

Creo que estás confundiendo el nro de col del listbox con el de la hoja.

Con esta instrucción, correcta, le estás enviando información a la col o (o sea a la 1ra) del listbox. Si colocás 10 te dará error porque el control solo tiene 9 col.

ListBox2. List(ListBox1.ListCount - 1, 0) = ActiveCell.Value 

Lo que no tenés que hacer es cambiar el foco a las celdas. Con esta instrucción te estás posicionando nuevamente al inicio de la tabla y por eso te carga la información que ya tenés.

ActiveCell.Offset(0, -9).Select 

Tenés que seguir con 

ActiveCell.Offset(0, 1).Select

* Aquí el modo correcto no es seleccionar cada celda antes de enviar la información sino utilizar Offset. Se te reducirá considerablemente el código:

ListBox1.List(ListBox1.ListCount - 1, 0) = ActiveCell.Value 
ListBox1. List(ListBox1.ListCount - 1, 1) = ActiveCell.Offset(0,1).Value
ListBox1. List(ListBox1.ListCount - 1, 2) = ActiveCell.Offset(0,2).Value

Y así hasta completar las 19 columnas, sin cambiar la selección.

Para el primer dato del ListBox2 sería:

Listbox2. List(ListBox2.ListCount -1,0) = ActiveCell. Offset(0,11)

Sdos!

Enviame el libro para ver qué te sucede con la instrucción Find.

Sdos!

Listo, enviado a los correos que aparecen en la descripción de su página web :)
¿Dice usted de la siguiente manera?

ListBox1.ColumnCount = 10
ListBox1.AddItem
ListBox1.List(ListBox1.ListCount - 1, 0) = ActiveCell
ListBox1.List(ListBox1.ListCount - 1, 1) = ActiveCell.Offset(0, 1).Value
ListBox1.List(ListBox1.ListCount - 1, 2) = ActiveCell.Offset(0, 2).Value
ListBox1.List(ListBox1.ListCount - 1, 3) = ActiveCell.Offset(0, 3).Value
ListBox1.List(ListBox1.ListCount - 1, 4) = ActiveCell.Offset(0, 4).Value
ListBox1.List(ListBox1.ListCount - 1, 5) = ActiveCell.Offset(0, 5).Value
ListBox1.List(ListBox1.ListCount - 1, 6) = ActiveCell.Offset(0, 6).Value
ListBox1.List(ListBox1.ListCount - 1, 7) = ActiveCell.Offset(0, 7).Value
ListBox1.List(ListBox1.ListCount - 1, 8) = ActiveCell.Offset(0, 8).Value
ListBox1.List(ListBox1.ListCount - 1, 9) = ActiveCell.Offset(0, 9).Value
ListBox1.ColumnCount = 9
ListBox2.AddItem
ListBox2.List(ListBox2.ListCount - 1, 0) = ActiveCell.Offset(0, 11).Value
ListBox2.List(ListBox2.ListCount - 1, 1) = ActiveCell.Offset(0, 12).Value
ListBox2.List(ListBox2.ListCount - 1, 2) = ActiveCell.Offset(0, 13).Value
ListBox2.List(ListBox2.ListCount - 1, 3) = ActiveCell.Offset(0, 14).Value
ListBox2.List(ListBox2.ListCount - 1, 4) = ActiveCell.Offset(0, 15).Value
ListBox2.List(ListBox2.ListCount - 1, 5) = ActiveCell.Offset(0, 16).Value
ListBox2.List(ListBox2.ListCount - 1, 6) = ActiveCell.Offset(0, 17).Value
ListBox2.List(ListBox2.ListCount - 1, 7) = ActiveCell.Offset(0, 18).Value
ListBox2.List(ListBox2.ListCount - 1, 9) = ActiveCell.Offset(0, 19).Value

Te está faltando una columna.

El ListBox2 debiera empezar con su columna 0 tomando datos del Offset(0,10):

ListBox2. List(ListBox2.ListCount - 1, 0) = ActiveCell. Offset(0, 10).Value

Y al final colocaste 9 pero es 8 (de 0 a 8 son 9 columnas). Los Listbox comienzan a numerarse en 0 para la col 1.

Sdos y no olvides valorar la respuesta (Excelente o Buena) si el tema queda resuelto.

Elsa

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas