jueves, 13 de junio de 2019

BUSCAR información mediante VBA

Siguiendo con el tema de las búsquedas ya comentadas en entradas del mes de Febrero 2019 vamos a desarrollar 2 tipos de búsquedas simples, es decir con datos únicos.
NOTA: En una búsqueda siempre se debe contemplar la posibilidad de que no se encuentre el dato buscado.

1 - Con método FIND: 
Contamos con una hoja donde se encuentran 2 tablas semestrales (Hoja2). La intención es volcar datos de esas tablas a otra hoja (Hoja1) donde se encuentra el resumen anual.
En este ejemplo solo se tendrá 1 registro o contrato por cada mes.



La macro colocada en un módulo será la siguiente y se ejecutará desde la Hoja1 (hoja resumen anual).
Sub macroBusca()
'x Elsamatilde
'recorre la col A de hoja1... hoja activa
Sheets("Hoja1").Select
fini = Range("A" & Rows.Count).End(xlUp).Row
'tomo el rango desde fila 2 hasta la última con datos (fini) ....AJUSTAR
For i = 2 To fini
    dato = Range("A" & i)
   Set busco = Sheets("Hoja2").Range("B:H").Find(dato, LookIn:=xlValues,  lookat:=xlWhole)
        'si lo encuentra vuelca el resultado en col B y C de hoja 1
    If Not busco Is Nothing Then
        Range("B" & i) = busco.Offset(0, 1)   'devuelve info a derecha
        Range("C" & i) = busco.Offset(0, 2)
    Else
        'opcional: dejar un texto en celdas B y C
        Range("B" & i) = "Sin datos": Range("C" & i) = "Sin datos"
    End If
'sigue con la otra fila
Next i
MsgBox "Fin de la búsqueda"
End Sub

Con el método FIND programado de este modo (con control de dato encontrado o no - ver aclaraciones en entrada de Febrero 2019) le indicamos qué resultado debe volcar en caso de no encontrar algún registro o mes en este caso.

2- Con resultado de la función BUSCARV:
Para este caso, contaremos con una tabla de datos de varias columnas, de las que solo necesitaremos obtener el resultado de dos de ellas. La tabla resumen será igual a la anterior.

Suponiendo que en nuestra tabla de resumen no queremos colocar fórmulas sino solamente el valor encontrado, la macro a utilizar sería la siguiente:
Sub macroFormulaControlada()
'x Elsamatilde
Sheets("Hoja1").Select
'recorre la col A de la hoja activa hasta la última celda con datos.
fini = Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To fini
    dato = Range("A" & i)
    'el control de error nos permite devolver otro valor o texto en caso de dato no encontrado
    On Error Resume Next
    Range("B" & i) = Application.WorksheetFunction.VLookup(dato, Sheets("Hoja2").Range("B:D"), 2, False)
    'si la función devolvió error se coloca un texto aclaratorio
    If Err.Number > 0 Then Range("B" & i) = "Sin datos"
    Range("C" & i) = Application.WorksheetFunction.VLookup(dato, Sheets("Hoja2").Range("B:D"), 3, False)
    If Err.Number > 0 Then Range("C" & i) = "Sin datos"
Next i
                     End Sub

Aquí se contempla si la función devuelve un número de error (Err.Number > 0) . Sería como cuando la función BuscarV nos devuelve el valor #N/A . Y en ese caso colocaremos otro resultado.

Descargar ejemplo desde aquí

                                   Ver VIDEO N° 25.

No hay comentarios.:

Publicar un comentario