Macros de búsqueda en libro

Hola a todos, soy nuevo por estos lados.
Estoy empezando a trabajar con excel.
Tengo un archivo excel con aproximadamente 37 hojas, lo que necesito es realizar una búsqueda de un código que se encuentre dentro de este archivo. Ahora tengo dos ideas acerca de la búsqueda, uno es que al ingresar el código, me entregue como resultado la posición de este; y la otra forma es que una vez ingresado el código me lleve a la hoja donde se encuentra este, y que se enmarque la celda.
Por lo que he ido leyendo, esto se podría hacer con una macros, el detalle es que he visto algunas pero solo para unas pocas hojas no para tantas como este.
si alguien pudiera ayudarme con el codigo para la macros.me seria de gran ayuda =)
Saludos
Camilo
Respuesta
1
Esta mavro considera que los códigos están en la columna A y que no hay celdas de código vacías, ya que al encontrar la primera celda vacía, asume que ya no quedan más códigos en la hoja.
Recorre cada fila en cada hoja de forma secuencial, por tanto, mientras más códigos sean más podría tardar en encontrarlo.
Espero que te sirva...
Saludos.
Sub buscar()
    Éxito = False 'indica éxito en la búsqueda para romper el ciclo
    'Recorrer todas la hojas en busca del código
    For i = 1 To ActiveWorkbook.Sheets.Count
        j = 1 'Inicializar en fila 1
        'Recorrer la columna hasta que encuentre un campo vacío o

'se encuentre el código buscado
        While (ActiveWorkbook.Sheets(i).Cells(j, "A") <> "" And exito = False)
            'Verificar si la celda contiene al código buscado
            If ActiveWorkbook.Sheets(i).Cells(j, "A") = codigo Then
                'Activar la hoja que contiene al codigo
                ActiveWorkbook.Sheets(i).Activate
                'Seleccionar celda que contiene el codigo
                Range(ActiveSheet.Cells(j, "A").Address).Select
                exito = True 'Marcar el éxito
            End If
            j = j + 1 'indice de la siguiente fila
        Wend
        'Si se ha encontrado el código, romper el ciclo
        If exito Then Exit For
    Next
End Sub
Hola, por un parte gracias por responder, pero no es exactamente lo que necesito, ya que los código pueden estar en cualquier columna... y otra duda, ese código busca en todo el libro, ¿o solo en la hoja en la que activa?
Busca en todo el libro (le puse comentarios)
'Recorrer todas la hojas en busca del codigo
 For i = 1 To ActiveWorkbook.Sheets.Count

Aquí te dejo el código que recorre cada una de las celdas del rango que está ocupado en cada una de las hojas en el libro. Las celdas son recorridas de forma secuencial, así que si el código anterior se demoraba, este se va a demorar bastante más.
A la variable código le tienes que asignar el valor desde algún lado
Sub buscar2()
    exito = False 'indica exito en la busqueda para romper el ciclo
    numeroHojas = ActiveWorkbook.Sheets.Count 'Extraer numero de hojas   
    'Recorrer todas la hojas en busca del codigo
    For i = 1 To numeroHojas
        Set hojaBusq = ActiveWorkbook.Sheets(i) 'Hoja sobre la que se realiza la busqueda
        'Fila de inicio y fin del rango ocupado
        filaIni = hojaBusq.UsedRange.Row
        filaFin = hojaBusq.UsedRange.Row + hojaBusq.UsedRange.Rows.Count - 1
        'Columna de inicio y fin
        colIni = hojaBusq.UsedRange.Column
        colFin = hojaBusq.UsedRange.Column + hojaBusq.UsedRange.Columns.Count - 1
        'Recorrer cada columna
        For j = colIni To colFin
            'Recorrer cada fila
            For k = filaIni To filaFin
                'Verificar si la celda contiene al código buscado
                If hojaBusq.Cells(k, j) = codigo Then
                    'Activar la hoja que contiene al codigo
                    hojaBusq.Activate
                    'Seleccionar celda que contiene el codigo
                    Range(ActiveSheet.Cells(k, j).Address).Select
                    exito = True 'Marcar el éxito
                    GoTo fin
                End If
            Next
        Next
    Next
fin:
End Sub
Aquí te dejo un código que reduce considerablemente el tiempo de búsqueda, ya que hace el recorrido por todas la hojas y busca columna a columna en lugar de celda a celda.
(Como máximo puedes ocupar 65535 filas, ya que necesita por lo menos una fila libre para poner la fórmula :P)
No olvides que debes asignar de alguna forma el valor a la variable código
Sub buscar3()
    exito = False 'indica exito en la busqueda para romper el ciclo
    numeroHojas = ActiveWorkbook.Sheets.Count 'Extraer numero de hojas
    'Recorrer todas la hojas en busca del código
    For i = 1 To numeroHojas
        Set hojaBusq = ActiveWorkbook.Sheets(i) 'Hoja sobre la que se realiza la busqueda
        'Fila fin del rango ocupado
        filaFin = hojaBusq.UsedRange.Row + hojaBusq.UsedRange.Rows.Count - 1
        'Columna de inicio y fin
        colIni = hojaBusq.UsedRange.Column
        colFin = hojaBusq.UsedRange.Column + hojaBusq.UsedRange.Columns.Count - 1
        'Recorrer cada columna
        For j = colIni To colFin
            'Averiguar si la columna contiene el valor buscado
            If IsNumeric(codigo) Then 'Si el codigo es numérico
                'Asignar formula
                hojaBusq.Cells(filaFin + 1, j).FormulaR1C1 = _
                    "=MATCH(" & codigo & ",R[-" & CStr(filaFin) & "]C:R[-1]C,0)"
            Else                      'Si el código no es numérico
                'Asignar formula
                hojaBusq.Cells(filaFin + 1, j).FormulaR1C1 = _
                    "=MATCH(""" & codigo
& """,R[-" & CStr(filaFin) & "]C:R[-1]C,0)"
            End If
            'Extraer el valor arrojado por la fórmula
            fila = hojaBusq.Cells(filaFin + 1, j)
            'Limpiar el contenido de la celda en que se puso la fórmula
            hojaBusq.Cells(filaFin + 1, j) = ""
            'Verificar si el valor es numérico, lo que implica
            'que el valor buscado sí está en la columna
            If IsNumeric(fila) Then
                'Activar la hoja que contiene al código
                HojaBusq. Activate
                'Seleccionar celda que contiene el código
                Range(ActiveSheet.Cells(fila, j).Address).Select
                GoTo fin
            End If
        Next
    Next
fin:
End Sub

Me notificas si te ha servido. ;)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas