Buscar con FIND un valor con 2 condiciones

Necesito buscar un valor en una hoja y copiarlo a otra teniendo en cuenta dos condiciones, que son dos valores coincidentes en las dos hojas. Me explico...

En la hoja Incidencias tengo estos valores

NOMBRE                       PERIODO            ORDEN TRABAJO

Jose Luis Garcia           201701             110011

Jose Maria Ruiz            201701             110012

Jose Luis Garcia           201702             110015

Y así sucesivamente. Y ahora en la hoja Desglose tengo los campos Nombre y Periodo y necesito buscar que coincidan con la otra hoja y me busque el dato Orden de trabajo. Por ejemplo:

NOMBRE                      PERIODO             ORDEN DE TRABAJO

Jose Luis Garcia 201701 (este es el dato que necesito buscar)

Y en el caso que no lo encuentre en toda la hoja que me avise con un msgbox por ejemplo.

2 respuestas

Respuesta
2

Si en la hoja "desglose" solamente tienes un nombre.

Con el método Find( ) , busca en la columna "A" la primer coincidencia del nombre, revisa en la columna B el periodo y si coincide el periodo termina el ciclo; si no coincide el periodo, sigue buscando con FindNext( ), hasta encontrar la coincidencia con el periodo, si al final no encontró un registro que cumpla con las 2 coincidencias, te envía el mensaje.

Sub Buscar_Orden()
'Por.Dante Amor
    Set h = Sheets("Incidencias")
    Set r = h.Columns("A")
    Set b = r.Find(Range("A2"), LookAt:=xlWhole)
    existe = False
    If Not b Is Nothing Then
        celda = b.Address
        Do
            If h.Cells(b.Row, "B") = Range("B2") Then
                existe = True
                Range("C2") = h.Cells(b.Row, "C")
            End If
            Set b = r.FindNext(b)
        Loop While Not b Is Nothing And b.Address <> celda
    End If
    If existe = False Then MsgBox "El nombre y periodo no existen"
End Sub

Si en la hoja "desglose" tienes varios nombres, entonces utiliza la siguiente macro, es el mismo principio que la macro anterior, pero en la hoja desglose puedes poner nombres y periodos desde la fila 2.

'
Sub Buscar_Orden2()
'Por.Dante Amor
    Set h = Sheets("Incidencias")
    Set r = h.Columns("A")
    For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
        nombre = Cells(i, "A")
        periodo = Cells(i, "B")
        Set b = r.Find(nombre, LookAt:=xlWhole)
        existe = False
        If Not b Is Nothing Then
            celda = b.Address
            Do
                If h.Cells(b.Row, "B") = periodo Then
                    existe = True
                    Cells(i, "C") = h.Cells(b.Row, "C")
                End If
                Set b = r.FindNext(b)
            Loop While Not b Is Nothing And b.Address <> celda
        End If
        If existe = False Then Cells(i, "C") = "El nombre y periodo no existen"
    Next
End Sub

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

Buenos días.

Primero de todo darte las gracias.

He probado macro segunda y me ocurre algo "raro". Lo hace bien pero se deja por buscar las ultimas 3 filas. La hoja desglose tiene 116 filas y los datos comienzan en la fila 2 y la hoja Incidencias tiene 1058 filas comenzando los datos en la fila 2. Pero como te digo de la fila 114 a 116 de la hoja desglose aparecen en blanco. Te reenvío la macro adaptada a las celdas donde están los datos, ya que lo que te envié como ejemplo los puse en la A, B, C para hacerlo mas fácil de entender. Ya me contarás.

Sub Buscar_Orden()
'Por.Dante Amor
Set h = Sheets("Incidencias")
Set r = h.Columns("E")
For i = 3 To Range("E" & Rows.Count).End(xlUp).Row
nombre = Cells(i, "AE")
periodo = Cells(i, "AQ")
Set b = r.Find(nombre, LookAt:=xlWhole)
existe = False
If Not b Is Nothing Then
celda = b.Address
Do
If h.Cells(b.Row, "A") = periodo Then
existe = True
Cells(i, "AP") = h.Cells(b.Row, "N")
End If
Set b = r.FindNext(b)
Loop While Not b Is Nothing And b.Address <> celda
End If
If existe = False Then Cells(i, "AP") = "El nombre y periodo no existen"
Next
End Sub

Si lo hago con IF THEN, utilizando varios bucles, lo hace bien, aunque tarda bastante más que con FIND. Por eso quería hacerlo con FIND porque cada mes se añaden nuevas filas a la hoja Incidencias y con el tiempo hacerlo con IF THEN se puede convertir en un calvario.

Te envío el código que utilizo con IF THEN por si te sirve de ayuda a entender porque no acaba de funcionar bien le de FIND.

Sub MatriculasOTPeriodo()
'buscamos cada conductor en su OT segun el periodo
periodo1 = Sheets("PanelPrincipal").Range("C2")
Dim busco As Object
filas = Sheets("MATR_DISP").Range("AD65536").End(xlUp).Row 'ultima fila de la hoja MATR_DISP de vehiculos del mes "AD"
linea = Sheets("Incidencias").Range("A65536").End(xlUp).Row
Sheets("MATR_DISP").Range("AP3:AQ" & filas).ClearContents
For cont = 3 To filas
Sheets("MATR_DISP").Range("AQ" & cont) = periodo1
nombre1 = Sheets("MATR_DISP").Range("AE" & cont)
For cont1 = 2 To linea
nombre2 = Sheets("Incidencias").Range("E" & cont1)
periodo2 = Sheets("Incidencias").Range("A" & cont1)
If nombre1 = nombre2 And periodo1 = periodo2 Then
OT1 = (Sheets("Incidencias").Range("N" & cont1))
Sheets("MATR_DISP").Range("AP" & cont) = OT1
Else
End If
If Sheets("MATR_DISP").Range("AP" & cont) = "" Then
Sheets("MATR_DISP").Range("AP" & cont) = "Sin OT"
Else
End If
Next
Next
End Sub

Para entender la lógica del código, te explico el significado de estas líneas:

    Set r = h.Columns("A")

Se establece en el objeto "r" la columna "A", significa que la búsqueda se va a realizar en la columna "A".


    For i = 2 To Range("A" & Rows.Count).End(xlUp).Row

Inicia el ciclo en la fila 2 y termina en la última celda con datos de la columna "A"

La columna "A" de este ciclo, no tiene nada que ver con la columna "A" de búsqueda.


Si tus columnas son diferentes, y así puedo observar, entonces tienes que hacer los siguientes cambios, por los cambios que hiciste en mi macro, los nombres están en la columna "AE"

Set r = h.Columns("E")
For i = 3 To Range("AE" & Rows.Count).End(xlUp).Row
   Nombre = Cells(i, "AE")

Entonces la última fila con datos la debes calcular en base a la columna "AE" y no a la columna "E".


.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

La última fila con datos la estás calculando en base a la columna "E"

For i = 3 To Range("E" & Rows.Count).End(xlUp).Row
nombre = Cells(i, "AE")

Y debes calcularla en base a la columna "AE", ya que los nombres están en la columna "AE", entonces debe quedar así:

For i = 3 To Range("AE" & Rows.Count).End(xlUp).Row
nombre = Cells(i, "AE")

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

¡Gracias! 

Ahora he entendido mejor el código. El error era evidente, pero no lo veía.

Muchas gracias, por la explicación y por la solución.

Ahora funciona perfectamente.

Un abrazo!

Respuesta
2

Prueba esta macro solo adapta el b2 por la celda donde comiencen tus datos

Sub busqueda()
Set hi = Worksheets("incidencias")
Set hd = Worksheets("desglose")
Set Funcion = WorksheetFunction
Set datos = hi.Range("b2").CurrentRegion
Set datos2 = hd.Range("b2").CurrentRegion
With datos2
    .Sort key1:=hd.Range(.Columns(1).Address), order1:=xlAscending, Header:=True
End With
With datos
    .Sort key1:=hi.Range(.Columns(1).Address), order1:=xlAscending, Header:=True
    nombre = InputBox("Teclea el nombre a buscar")
    periodo = InputBox("teclea el periodo")
    If periodo = Empty Or nombre = Empty Then End
    cuenta = Funcion.CountIf(.Columns(1), nombre)
    If cuenta = 0 Then MsgBox ("no existe este registro"): End
    fila = Funcion.Match(nombre, .Columns(1), 0)
    Set empleado = .Rows(fila).Resize(cuenta)
    fila2 = Funcion.Match(Val(periodo), empleado.Columns(2), 0)
    orden = empleado.Cells(fila2, 3)
    MsgBox ("orden de trabajo " & orden), vbInformation, "AVISO"
End With
End Sub

Hola, no consigo hacer que funcione. Mira, en la hoja Incidencias, el dato nombre se encuentra en la columna"E" y el periodo en la columna "A", el dato que quiero sacar de esta hoja la OT se encuentra en la columna "N". Y en la hoja desglose los datos estan en la columna "AE" el nombre, en la columna AQ el periodo y esta vacío el campo que busco, la OT, en la columna AP.

La hoja desglose puede tener muchas filas y en la hoja Incidencias hay más de 1000 filas e iran aumentando mes a mes. 

De todos modos muchas gracias por tan pronta respuesta.

Nada de lo que mencionas es problema la macro esta diseñada para trabajar lo mismo con un solo registro que con un millón añades o quites la macro lo contempla, solo que para hacer que funcione puedes poner una pantalla de la estructura de tus datos esto para adaptar la macro a tu información, cuando programe esta macro lo hice basado en la información que pusiste asumiendo yo las ubicaciones. Solo publica lo que te pedí para hacer las modificaciones a la macro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas