FUNCION BUSCARV EN VBA

Hola todos!!

Siento la demora en las actualizaciones del blog, el motivo de todo este tiempo sin publicar nada se debe básicamente a dos motivos:

Primero y más importante, en poco tiempo voy a ser papá y además de ser la mejor noticia de mi vida y sentirme afortunado y feliz, es algo que desde el minuto uno exige plena dedicación. Y en eso me encuentro últimamente.

Segundo, a nivel laboral he estado bastante ocupado con varios proyectos que no han dejado mucho tiempo para dedicárselo al blog.

Pero hoy estoy con tiempo suficiente como para centrarme y poder escribir algo que os resulte interesante y práctico. Hace unos mese realicé una explicación sencilla de cómo trabajar con la función “Buscarv” en excel, de hecho incluí varios post donde además la combinaba con otras funciones como “Coincidir”, “Si” o “Eserror”. En esta ocasión quiero hablar de la misma función pero no en su uso en la hoja de cálculo como función sino dentro del editor de visual basic.

Os propongo el siguiente ejemplo, imaginad que tenéis una tabla con una serie de personas, todas ellas unidas a un número como identificador único y con el detalle del último título que tiene y si sabe o no inglés, esta es la tabla:

BUSCARV EN VBA_1

A continuación os entregan otra tabla en la que únicamente aparece una columna con una serie de identificadores desordenados y donde algunos coincidirán o no con los de la primera tabla, y lo que debéis hacer es rellenar las tres columnas siguientes con “Nombre“, “Estudios” e “Inglés“.

BUSCARV EN VBA_2

Esto lo podéis hacer con una fórmula de forma manual o también en VBA con una macro que automatice el proceso: Esta es la macro que vamos a utilizar:

Sub BUSCARV()
'Seleccionamos la hoja listado y limpiamos las celdas que tengan contenido
Worksheets("LISTADO").Select
limpiardatos = Application.CountA(Worksheets("LISTADO").Range("a:a"))
Sheets("LISTADO").Range("C2:D" & limpiardatos).ClearContents
'Determinamos la longitud del rango de los datos con un contarA
fin = Application.CountA(Worksheets("LISTADO").Range("a:a"))
'Aplicamos la función buscarv para buscar el nombre y si no está que el resultado sea vacío, situamos el resultado en el rango B2 en adelante
With Worksheets("LISTADO").Range("B2:B" & fin)
.Formula = "=IF(ISERROR(VLOOKUP(RC[-1],DATOS!R2C1:R32C4,2,FALSE)),"""",VLOOKUP(RC[-1],DATOS!R2C1:R32C4,2,FALSE))"
.Formula = .Value
End With
'Aplicamos la función buscarv para buscar los estudios y si no están que el resultado sea vacío, situamos el resultado en el rango C2 en adelante
With Worksheets("LISTADO").Range("C2:C" & fin)
.Formula = "=IF(ISERROR(VLOOKUP(RC[-2],DATOS!R2C1:R32C4,3,FALSE)),"""",VLOOKUP(RC[-2],DATOS!R2C1:R32C4,3,FALSE))"
.Formula = .Value
End With
'Aplicamos la función buscarv para buscar si sabe o no inglés y si no está que el resultado sea vacío, situamos el resultado en el rango D2 en adelante
With Worksheets("LISTADO").Range("D2:D" & fin)
.Formula = "=IF(ISERROR(VLOOKUP(RC[-3],DATOS!R2C1:R32C4,4,FALSE)),"""",VLOOKUP(RC[-3],DATOS!R2C1:R32C4,4,FALSE))"
.Formula = .Value
End With
'Nombramos el encabezado de cada columna
With Worksheets("LISTADO")
.Range("B1") = ("NOMBRE")
.Range("C1") = ("ESTUDIOS")
.Range("D1") = ("INGLES")
End With
'Coloreamos el encabezado de cada columna (elijo el rojo)
With Worksheets("LISTADO")
.Range("B1").Interior.Color = vbRed
.Range("C1").Interior.Color = vbRed
.Range("D1").Interior.Color = vbRed
End With
End Sub

Como podéis ver no se trata de una macro excesivamente compleja, en verde comento para que sirve cada línea de código y simplemente tenéis que pegar en un nuevo módulo dentro de vuestro proyecto.

A continuación podéis colocar un botón en la hoja “Listado” para ejecutar la macro, de forma que el resultado os quedaría así:

BUSCARV EN VBA_3

Ahora podéis apreciar la potencia y rapidez de VBA para realizar el trabajo. Realmente es útil para casos estandarizados en los que temporalmente tengáis que actualizar la misma información una y otra vez.

Si todo va como espero, la semana que viene voy a escribir sobre la posibilidad de utilizar en Excel SQL de la misma forma que se utiliza en Access, estoy seguro que os encantará.

Y ahora, como siempre os dejo el archivo para podáis tener el ejemplo práctico.

Descarga el archivo de ejemplo pulsando en: BUSCARV EN VBA

Anuncios

13 pensamientos en “FUNCION BUSCARV EN VBA

  1. hola muy buenas noches de veras aprecio y te felicito por tan excelente aporte , tengo una duda con respecto a esta macro

    supongamos que el identificador no quiero que este en la columna a si no en la e por ejemplo ¡donde tendria que inducarle que me tome esa columna he estado examinando pero no logro saber donde creo que tiene que ver con esta linea
    fin = Application.CountA(Worksheets(“LISTADO”).Range(“a:a”))

    pero la cambio y no logro obtener resultados

    a espera de tus comentarios

    saludos

    Me gusta

    • Hola Abel,

      Y estás en lo cierto, supongamos que en el ejemplo, en la pestaña “listados” tenemos los datos que queremos buscar en la columna “E”, para hacer la prueba puedes copia y pagar los datos de la columna A en la E y la fórmula sería esta:

      With Worksheets(“LISTADO”).Range(“F2:F” & fin)
      .Formula = “=IF(ISERROR(VLOOKUP(RC[-1],DATOS!R2C1:R32C4,2,FALSE)),””””,VLOOKUP(RC[-1],DATOS!R2C1:R32C4,2,FALSE))”
      .Formula = .Value
      End With

      Como puedes ver, hacemos referencia a la columna “F” (que es donde vamos a insertar el resultado de la búsqueda), dado que la fórmula buscaremos en la columna “E”, determinamos con VLOOKUP(RC[-1] donde [-1] quiere decir que se busque en la columna anterior, (donde tenemos los datos).

      Gracias por comentar y participar.

      Me gusta

  2. Hola, muchas gracias por el aporte, es justo lo que necesitaba!! Tengo un problema parecido al de Abel, el identificador lo modificaría a la columna E y añadiría un fila en la parte superior, empezando a trabajar la macro en la fila 3. El código sería este:

    Sub BUSCARV()
    ‘Seleccionamos la hoja listado y limpiamos las celdas que tengan contenido
    Worksheets(“LISTADO”).Select
    limpiardatos = Application.CountA(Worksheets(“LISTADO”).Range(“a:a”))
    Sheets(“LISTADO”).Range(“F2:H” & limpiardatos).ClearContents

    ‘Determinamos la longitud del rango de los datos con un contarA
    fin = Application.CountA(Worksheets(“LISTADO”).Range(“a:a”))

    ‘Aplicamos la función buscarv para buscar el nombre y si no está que el resultado sea vacío, situamos el resultado en el rango
    ‘B2 en adelante
    With Worksheets(“LISTADO”).Range(“F3:F” & fin)
    .Formula = “=IF(ISERROR(VLOOKUP(RC[-1],DATOS!R2C1:R32C4,2,FALSE)),””””,VLOOKUP(RC[-1],DATOS!R2C1:R32C4,2,FALSE))”
    .Formula = .Value
    End With

    ‘Aplicamos la función buscarv para buscar los estudios y si no están que el resultado sea vacío, situamos el resultado en el rango
    ‘C2 en adelante
    With Worksheets(“LISTADO”).Range(“G3:G” & fin)
    .Formula = “=IF(ISERROR(VLOOKUP(RC[-2],DATOS!R2C1:R32C4,3,FALSE)),””””,VLOOKUP(RC[-2],DATOS!R2C1:R32C4,3,FALSE))”
    .Formula = .Value
    End With

    ‘Aplicamos la función buscarv para buscar si sabe o no inglés y si no está que el resultado sea vacío, situamos el resultado en el rango
    ‘D2 en adelante
    With Worksheets(“LISTADO”).Range(“H3:H” & fin)
    .Formula = “=IF(ISERROR(VLOOKUP(RC[-3],DATOS!R2C1:R32C4,4,FALSE)),””””,VLOOKUP(RC[-3],DATOS!R2C1:R32C4,4,FALSE))”
    .Formula = .Value
    End With

    ‘Nombramos el encabezado de cada columna
    With Worksheets(“LISTADO”)
    .Range(“F2”) = (“NOMBRE”)
    .Range(“G2”) = (“ESTUDIOS”)
    .Range(“H2”) = (“INGLES”)
    End With

    ‘Coloreamos el encabezado de cada columna (elijo el rojo)
    With Worksheets(“LISTADO”)
    .Range(“F2”).Interior.Color = vbRed
    .Range(“G2”).Interior.Color = vbRed
    .Range(“G2”).Interior.Color = vbRed
    End With
    End Sub

    El problema es que me da error en limpiar dato:

    limpiardatos = Application.CountA(Worksheets(“LISTADO”).Range(“a:a”))
    Sheets(“LISTADO”).Range(“F2:H” & limpiardatos).ClearContents

    ¿Cual sería el error? mil gracias por adelantado

    Me gusta

        • Hola Francisco:

          Ya he visto el archivo:

          Debes modificar la variable “limpiardatos”, el rango es la columna “E” y si la primera fila está en blanco debes sumarle +1

          limpiardatos = Application.CountA(Worksheets(“LISTADO”).Range(“E:E”)) + 1

          Por otra parte, también debes modificar en la macro la variable “fin”, dado que los datos empiezan en la columna “E”. y como tienes una fila en blanco al principio, debes sumarle +1

          fin = Application.CountA(Worksheets(“LISTADO”).Range(“E:E”)) + 1

          Si incluyes estos cambios en la macro, te funcionará perfectamente.

          Saludos.

          Me gusta

          • Hola Segu,

            La macro modificada funciona perfectamente con las correcciones que indicas.

            Muchas gracias por tu ayuda, ademas de la gran calidad de las entradas de la web, cuando se te pide ayuda con adaptaciones que hacemos das un soporte exquisito!!

            Son ya varios años los que llevo leyendo tu web y espero que puedan seguir siendo muchos más.

            De nuevo muchas gracias.

            Le gusta a 1 persona

¿Te ha gustado?. Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s