Hacer una búsqueda en una hoja especifica de un libro excel

Quisiera saber como puedo modificar parte de una macro para que realice la búsqueda en una sola hoja por ejemplo hoja datos, y no en todo el libro. O bien ingresar la hoja a buscar mediante un inputBox.

Sub ejemplo()

Sheets("buscador").Select
Dim Ufil, Ucol, Fila As Integer
For Each hoja In ActiveWorkbook.Sheets If LCase(hoja.Name) = "buscador" Then
Ufil = hoja.Range("A" & Cells.Rows.Count).End(xlUp).Row
Ucol = hoja.Cells(1, Cells.Columns.Count).End(xlToLeft).Column
If Ufil < 2 Then Ufil = 2 hoja.Range(Cells(2, 1), Cells(Ufil, Ucol)).ClearContents
End If
Next dato = InputBox("INGRESA LA BÚSQUEDA??")
If dato = "" Then Exit Sub dato = UCase(dato)
Fila = 2
Application.ScreenUpdating = False
For x = 1 To Sheets.Count Sheets(x).Select For Each celda In ActiveSheet.UsedRange
If UCase(celda) Like "*" & dato & "*" Then
Sheets("buscador").Cells(Fila, 1).Value = Sheets(x).Name
Sheets("buscador").Cells(Fila, 2).Value = celda.Address(False, False)
Sheets("buscador").Cells(Fila, 3).Value = celda.Value
Sheets("buscador").Cells(Fila, 4).Value = celda.Offset(0, 1).Value
Sheets("buscador").Cells(Fila, 5).Value = celda.Offset(0, 2).Value
Sheets("buscador").Cells(Fila, 6).Value = celda.Offset(0, 3).Value
Sheets("buscador").Cells(Fila, 7).Value = celda.Offset(0, 4).Value Fila = Fila + 1 End If
next
Next
Sheets("buscador").Select
ActiveSheet.Columns("a:f").EntireColumn.AutoFit
Range("A1").Select
Application.ScreenUpdating = True
MsgBox "los encuentros están anotados en la hoja buscador"
End Sub

Respuesta
1

Ya de paso he arreglado lo de que pueda ejecutarse la macro desde cualquier hoja que estés. Y luego he hecho lo que pides. Te pedirá el nombre pero por defecto llevará escrito "DATOS", crea esa hoja si quieres usarla o modifica en la macro el nombre "DATOS" por el de la hoja que quieras usar por defecto.

Te voy a escribir aquí la macro y tú la copias toda en el libro en lugar de la que había. Si no te saliese me dices que te mande el libro con la macro. Es que es un libro muy grande y me quita bastante espacio del que dispongo en la cuenta de correo.

Sub ejemplo()
'por luismondelo y ValeroASM
Dim Ufil, Ucol, Fila As Integer
Dim ExisteHoja As Boolean
Dim dato, NombreHoja As String
'Cambia el sistema y no son necesarias algunas líneas de intercepción de errores
For Each Hoja In ActiveWorkbook.Sheets
   If LCase(Hoja.Name) = "buscador" Then
   'En vez de eliminar la hoja borramos el contenido
   Ufil = Hoja.Range("A" & Hoja.Cells.Rows.Count).End(xlUp).Row
   Ucol = Hoja.Cells(1, Hoja.Cells.Columns.Count).End(xlToLeft).Column
   If Ufil < 2 Then Ufil = 2
      Hoja.Range(Hoja.Cells(2, 1), Hoja.Cells(Ufil, Ucol)).ClearContents
   End If
Next
dato = InputBox("INGRESA LA BUSQUEDA??")
If dato = "" Then Exit Sub
dato = UCase(dato)
Do
   ExisteHoja = False
   NombreHoja = LCase(InputBox("INGRESA LA HOJA DONDE BUSCAR??", "HOJA DONDE SE BUSCA", "DATOS"))
   If NombreHoja = "buscador" Then
      Respuesta = MsgBox("No se puede buscar en la hoja Buscador", vbInformation + vbOKOnly, "Búsqueda no permitida")
   ElseIf NombreHoja <> "" Then
      For Each Hoja In ActiveWorkbook.Sheets
         If LCase(Hoja.Name) = NombreHoja Then
            ExisteHoja = True
            Exit For
         End If
      Next
      If Not ExisteHoja Then 
         Respuesta = MsgBox("No existe la hoja " & NombreHoja, vbCritical + vbOKOnly, "NO existe la hoja.")
      End If
   End If
Loop Until ExisteHoja Or NombreHoja = ""
If NombreHoja = "" Then Exit Sub
Fila = 2
'Lo siguiente es para que no se vean parpadeos
Application.ScreenUpdating = False
Hoja.Select
For Each celda In ActiveSheet.UsedRange
   If UCase(celda) Like "*" & dato & "*" Then
      Sheets("buscador").Cells(Fila, 1).Value = Hoja.Name
      Sheets("buscador").Cells(Fila, 2).Value = celda.Address(False, False)
      Sheets("buscador").Cells(Fila, 3).Value = celda.Value
      Sheets("buscador").Cells(Fila, 4).Value = celda.Offset(0, 1).Value
      Sheets("buscador").Cells(Fila, 5).Value = celda.Offset(0, 2).Value
      Sheets("buscador").Cells(Fila, 6).Value = celda.Offset(0, 3).Value
      Sheets("buscador").Cells(Fila, 7).Value = celda.Offset(0, 4).Value
      Fila = Fila + 1
   End If
Next
Sheets("buscador").Select
ActiveSheet.Columns("a:g").EntireColumn.AutoFit
Range("A1").Select
Application.ScreenUpdating = True
MsgBox "los encuentros están anotados en la hoja buscador"
End Sub

Y esto es todo.

Gracias funciona muy bien solo una ultima duda habra forma que admita cierto grado de error en la búsqueda de hoja, como lo hace en la búsqueda de datos, ya que si no es exacta la palabra ya no realiza la búsqueda.

Si, puede hacerse escribiendo unas cuantas letras seguidas del nombre de la hoja, pero tú deberás saber cuántas y cuáles deben ser porque tomará la primera hoja que tenga ese texto en su nombre y si la querías es posterior no la tomará.

Entonces basta sustituir la línea que pone

If LCase(Hoja.Name) = NombreHoja Then

por esta

If instr(LCase(Hoja.Name), NombreHoja) > 0 Then

Con eso es suficiente si eliges bien el texto d ela hoja a buscar.

Cosas más sofisticadas se podrían hacer con formularios o incluso con simples Inputbox pero con modificaciones mayores. Eso ya tendría que ser objeto de una pregunta nueva.

Si realmente buen trabajo, realmente un experto y si como dices con la modificación es suficiente. realmente quedo mejor de lo que esperaba. gracias a luismondelo y ValeroASM. y a todo el equipo de todoexpertos, doy por finalizado el tema gracias por el tiempo y esfuerzo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas