Cómo hacer una búsqueda en una macro de Excel con VBA (Visual BASIC for Applications)

Hoy recibí una pregunta interesante de parte de Jesús Reyes. ¿Cómo puedo hacer un VLOOKUP en VBA?

Aquí les anexo el código. Cuando lo intenté por primera vez me volvía loco porque trataba de usar Application.Worksheetfunction.Vlookup y si no lo encontraba, el programa tronaba y se iba al editor. La solución es usar Application.Vlookup (no importa el idioma en que tengan Excel, se usa VLOOKUP), guardar el resultado en una variable de tipo variante, y revisar si hay error antes de procesarlo.

Espero que les sirva. Esto es equivalente a:

=vlookup(buscar, a1:a5, 2, 0)

 

Share
Acerca de

Armando Franco tiene amplia experiencia en las áreas de sistemas, compras y proyectos. Cuenta con una Maestría en Administración de Tecnologías de Información, y las certificaciones Certified Purchasing Manager, Microsoft Office 2010 Specialist, Expert y Master.

37 Comentarios en “Cómo hacer una búsqueda en una macro de Excel con VBA (Visual BASIC for Applications)
  1. OTTNEIBER PEÑA dice:

    hOLA TENGO UN PROBLEMA AL BUSCAR EN UNA CELDA EN OTRA HOJA, PERO ESTA CELDA TIENES VARIOS VALORES EJ. (454612/64849/134579/134546/54263)
    DEBO BUSCAR QUE EXISTA UNO DE ESOS VALORES Y TRAERME OTRO.
    hE PROBADO CON BUSCARV, COINCIDIR, COINCIDIR +INIDCE Y NO ME DA, INCLUSO CON HALLAR. lE AGRADECERIA MUCHO, TODOS ME DAN ERROR. MI CORREO ES OTTNEIBER@GMAIL.COM Y OTTNEIBER.PENA@AGUSTINAMARKET.CL

    • Necesitas una fórmula matricial que use INDEX, SEARCH. Un problema que puedes tener es que esto te encontraría 4546 o 648 dentro de otro número. Tendrías que usar siempre el mismo número de dígitos para evitar este problema. 0000648, 064849, 454612 en vez de 648, 64849, 454612. Estoy muy saturado pero en una chanza hago un video.

  2. Sebastian Castañeda dice:

    Hola Buenas, te cuento que tengo una macro para buscar un valor en una tabla que tiene valores repetidos, ingreso los valores repetidos a un combobox como valores unicos y a partir de esos quiero cargar todos los datos relacionados a esos valores repetidos a otro combobox, mi problemas es que con la funcion vlookup solo ingresa el primer dato que encuentra, y yo quiero ingresarlos todos, este es mi codigo:

    Mi macro es super simple, son dos combobox, el primero de nombre Rajo y el segundo de Nombre Fase y la tabla de la que sale la informacion es, el encabezado que esta en la celda A1 es el Rajo, que tiene TESORO TESORO ESPERANZA TESORO y el segundo encabezado de nombre Fase en B2 tiene 2204 2264 2164 2563 en ese mismo orden

    Private Sub cbxRajo_Change()
    On Error Resume Next
    Dim celdaActual As Range

    valor = Application.WorksheetFunction.VLookup(Me.cbxRajo.Value, Sheets(«Hoja2»).Range(«A:B»), 2, 0)
    cbxFase.Clear
    Me.cbxFase.AddItem valor

    End Sub

    y este es el del primer combobox:

    Private Sub UserForm_Initialize()
    ‘Cargar datos en el combobox sin repetir
    Dim ValorUnico As Collection
    Dim rng As Range
    Dim Cell As Range
    Dim sh As Worksheet
    Dim vNum As Variant

    Set sh = ThisWorkbook.Worksheets(«Hoja2»)

    Set rng = sh.Range(«A2», sh.Range(«A2»).End(xlDown))

    Set ValorUnico = New Collection

    On Error Resume Next
    For Each Cell In rng.Cells

    ValorUnico.Add Cell.Value, CStr(Cell.Value)

    Next Cell

    On Error GoTo 0
    For Each vNum In ValorUnico
    Me.cbxRajo.AddItem vNum
    Next vNum
    End Sub

    Espero puedas ayudarme, gracias!

    • Con este código puedes buscar un valor todas las veces que aparezca. Pero VLOOKUP se queda corto. Por eso usé INDEX y MATCH.

      Lo que hace es que si tienes datos de A1 hasta B4, primero busca de A1 hasta B4, si encuentra un valor en el renglón 2, busca de A3 a B4, y así va moviendo el rango de búsqueda.

      Sub buscar()
      Dim buscado, encontrado, lugar, inicio, ÚltimoRenglón
      ÚltimoRenglón = ActiveCell.SpecialCells(xlCellTypeLastCell).Row

      buscado = InputBox("¿cuál busco?")
      inicio = 1
      Do
      lugar = Application.Match(buscado, Range(Cells(inicio, 1), _
      Cells(ÚltimoRenglón, 1)), 0)
      If Not IsError(lugar) Then
      Debug.Print "Lugar " & lugar & " Inicio " & inicio & " fin " & ÚltimoRenglón
      encontrado = Application.Index(Columns("B:B"), lugar + inicio - 1)
      inicio = inicio + lugar
      MsgBox encontrado
      End If
      Loop Until IsError(lugar) Or inicio > ÚltimoRenglón
      End Sub

  3. RENE PRIETO dice:

    BUENAS TARDES QUIERO INGRESAR UNA MACRO PARA BUSCAR UN VALOR EN VARIAS HOJAS DEL LIBRO

  4. Olmedo dice:

    Buenas tardes, tengo una consulta, tengo un formulario donde hace una búsqueda de un dato, pero al no encontrar el dato me sale un error para depurar o finalizar, pero quisiera que me salga un mensaje que diga Dato no encontrado, pero no me sale, aquí le paso mi pequeña programación…

    If CMBGRADO = «1pri» Then
    TXTALUMNO.Value = WorksheetFunction.VLookup(TXTCODIGO.Text, Sheets(1).Range(«A2:B1000»), 2, False)
    TXTASIST = «A»
    Else
    If CMBGRADO = «2pri» Then
    TXTALUMNO.Value = WorksheetFunction.VLookup(TXTCODIGO.Text, Sheets(2).Range(«A2:B1000»), 2, False)
    TXTASIST = «A»
    Else
    MsgBox «Selecciona un Grado»
    end if
    enf id

    • Podría ser algo como:
      IF ISERROR(WorksheetFunction.VLookup(TXTCODIGO.Text, Sheets(2).Range(«A2:B1000»), 2, False)) THEN
      TXTALUMNO = «NO ENCONTRADO»
      ELSE
      TXTALUMNO = WorksheetFunction.VLookup(TXTCODIGO.Text, Sheets(2).Range(«A2:B1000»), 2, False)
      ENDIF

  5. Alexis Q. dice:

    Armando; buenas tardes

    Quisiera saber si me puedes ayudar con una macro que ponga en mi listado de asistencias una marca,en donde la hoja uno contendrá el botón que marcará una «x» en una celda de la hoja 2, en la que la primer columna corresponde a un código único de estudiante y en la fila 1 están las fechas de la clase.
    aclaro que ya en la hoja 1 tengo una celda en donde escribo el codigo del estudiante que es la A1 y en B1 las fechas correspondientes a la clase, en esta misma tengo buscarv para un resumen de los datos y al lado el boton que quiero que lleve la macro que registrara la asistencia teniendo en cuenta las dos variables A1 y B1.
    muchas gracias.

    • En la hoja 1 tienes que usar una columna antes de la A que sea =A1&B1.

      En la hoja 2 haces un vlookup así, suponiendo que tienes la fecha en el renglón 1 y los alumnos en la columna A:

      =if(isna(vlookup($a2&b$1,hoja1!A:A,1,0)),»»,»x»)
      =si(esnod(buscarv($a2&b$1,hoja1!A:A,1,0)),»»,»x»)

  6. Alejandro dice:

    Buenas Tardes,necesito ayuda, tengo una planilla con DNI, Apellido y Código, y necesito copiar el código de cada uno de los dni y pagarlos en otra matriz general, se puede hacer una macro??

  7. Mauricio dice:

    Hola, muy buenas tardes Armando, mi nombre es Mauricio, una consulta, tengo una matriz en la cual se le han asignado en la columna A identificadores como D0001, D0002 y así consecutivamente, y a estos le siguen datos (para el ejemplo) usaremos A, B, etc en la columna B, el problema que tengo es que no logro dar con la forma de usar VLOOKUP, FOR o cualquier otra sentencia que salte de celda en celda buscando los identificadores en A y los datos en B para que sean copiados en otra hoja, en donde los identificadores no son concecutivos.

    Agradecería tu ayuda. Saludos

  8. Luis Fernandez dice:

    Hola Armando, soy nuevo en macros y necesito tu ayuda.
    Tengo una tabla desde V1(DNI), W1(CLASE), X1(APELLIDO), Y1(NOMBRES).
    En la celda B5 ingreso el dni y necesito que me busque en V$ y cargue el apellido & nombres en la celda C5, y así sucesivamente en las demás b$ y c$.
    Todo tiene que ser en tiempo real, creería que es con Private Sub Worksheet_Change(ByVal Target As Range)
    Desde ya, muchísimas gracias.

    • Hola.

      ¿Por qué necesitas una macro? Me parece que ese es el comportamiento normal del VLOOKUP / BUSCARV.

      En C5 escribes la fórmula siguiente:
      = iferror(vlookup(b5,V:Y,4,0) & » » & vlookup(b5,V:Y,3,0),»»)
      = SI.ERROR(BUSCARV(b5,V:Y,4,0)& » » & BUSCARV(b5,V:Y,3,0),»»)

      Los símbolos que aparecen como » deben ser comillas dobles. Me aparece a mí como otro símbolo.

  9. dani dice:

    Buenas soy nueva en hacer macros pero voy a intentarlo, lo que pasa es que tengo una base de datos con libros donde tengo ahi casillas como: editorial, referencia, nombre del libro, autor, precio colombiano, y cuantos hay en existencia. en otra hoja tengo las ordenes de pedido con casillas como: numero de orden de pedido, fecha de requisicion, correo electrónico, dirección, celular, estudiante, descuento por ser adulto mayor, o descuento por ser estudiante, nombre del libro, y total con descuento, lo que yo quiero hacer es que cuando yo coloque el nombre del libro me lleve a la base de datos , mire la existencia y me vaya descontando el numero de libros a medida que yo hago el pedido, me coja la referencia y me la traiga a mi hoja numero dos de pedidos, y el nombre de autor. como podría hacer?

    • Hola Dani.

      ¿Tienes Access? Te pregunto porque si en Access eliges Nueva – Base de datos te aparece un modelo de biblioteca de préstamos. Este ejemplo incluye una base de datos completa que me parece que hace lo que necesitas y más.

      Es más sencillo hacerlo ahí que en Excel.

      Saludos.
      Armando.

  10. Montserrat Flores dice:

    Hola!
    Me podrías ayudar, quiero jalar datos de un archivo a otro, pero ponerlos en la fila que de el folio que corresponde…Como le hago?

    Gracias!!

  11. RAYMUNDO VALENZUELA dice:

    COMO PUEDO ENCONTRAR EL ULTIMO REGISTRO DE UN TRABAJADOR PERO QUE EN LA COLUMNA DE RECIBOS NO ESTE CANCELADO.

    • ¡Qué buena pregunta! Se puede hacer con fórmulas matriciales.

      Supongamos que tienes una tabla llamada «Recibos». Esta tabla tiene tres columnas: Clave (del trabajador), Estatus y Recibo. Puede tener más columnas pero no nos interesan.

      Usarías esta fórmula:

      =INDICE(recibos[Recibo],MAX(SI((recibos[Clave]=F2)*(recibos[Estatus] <> "cancelado"),FILA(recibos[Estatus]))))

      o en inglés:

      =INDEX(recibos[Recibo],MAX(IF((recibos[Clave]=F2)*(recibos[Estatus] <> "cancelado"),ROW(recibos[Estatus]))))

      Regresará el valor del Recibo que esté en el último renglón que coincida con el número de empleado que escribas en F2 y que no diga «Cancelado» en la columna de Estatus.

      Saludos.
      Armando

  12. Karina Torrez dice:

    Hola me gustaría un poco de ayuda tengo una base de datos que cuenta con los siguientes campos, Id Empleado, Apellido, Nombre, Sección, facultad, Cargo, Salario, Fecha Comienzo y Fecha Nacimiento, quiero hace una macro que realiza las consultas cuando elegía el código del empleado y que me mande a mostrar sus datos luego otra macro que me genere un informe o reporte de los datos encontrados

  13. usuario excel dice:

    quice decir en la hoja1 el consecutivo inicia con (0001) con los ceros izquierda en este momento son iguales hoja1(0050) hoja2(0050) el problema es que si lo elimino hoja2 no se como hacer para que en ambas se vea (0049) si grabo un nuevo registro debe ser (0050) de nuevo ambas hojas gracias de nuevo.

  14. usuario excel dice:

    Hola Senor Armando estoy viendo su blog con algunos ejemplos desearía que me ayudara lo siguiente:

    Hoja1 celda B2 tengo consecutivo (0001), y en la hoja2 tengo varios registros desde B2 hasta P50, en la hoja2 el consecutivo se graba a partir de la celda B2, va en 0050 (001-002-003- hasta llegar a 0050) quiero realizar una macro que si borro un registro o consecutivo de la hoja2 (ejemplo l consecutivo 0010) en la hoja1 el consecutivo se devuelva a 49 por que se elimino 1, es decir el consecutivo en ambos hojas debe ser igual muchas gracias…

    espero lo publique aquí en su blog

    • Hola Carlos.

      Normalmente, si fueran empleados de una compañía, si sale el empleado 23 no quiero que el empleado 24 tenga el número 23, porque esto me traería problemas.

      ¿Cuál es el uso de esta aplicación?

  15. Cali dice:

    Hola Armando
    yo tengo un problema con la busqueda de datos me sale este error que a continuacion te muestro, no soy experto en el tema ojala me pudieran ayudar los campos que manejo son:
    N° DE ORDEN PARTIDA N° NOMBRES APELLIDOS FECHA DE NACIMIENTO FOLIO TOMO

    Sheets(«REG NAC»).Range(«A1:G5000»).AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Range(«BUSCAR!Criteria»), CopyToRange:=Range( _
    «BUSCAR!Extract»), Unique:=False

  16. Mauricio Pulgarin dice:

    Cordial saludo,
    Buscarv o ConsultarV o vhlookup realizan una búsqueda en una matriz basándose en un dato ingresado el cual por defecto lo busca en una matriz en su primer columna, ¿qué pasa si no tengo el valor de la primer columna sino de la 2a o 3ra?… ejemplo

    columna1 colmna2 columna3 columna4
    nombre apellido edad color
    JUAN PEREZ 40 VERDE
    MARIA RAMIREZ 30 BLANCO
    LUIS PEREZ 50 NEGRO

    Si quiero que me traiga el nombre que pertenzca a los apellidos PEREZ como lo busco…la idea es que sea en código vba y no en fórmulas como «desref coincidir»

    agradezco de antemano tu atención.
    Saludos

    • Hola Mauricio.

      Una manera de hacerlo es grabar una macro y usar CTRL-F (en inglés) o CTRL-B (en español) para buscar.

      Eso generará la instrucción:

      Cells.Find(What:=»lo que buscas«, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
      :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
      False, SearchFormat:=False).Activate

      y se puede modificar para que encuentre lo que se necesita.

      Saludos.

  17. Reyes Loren dice:

    Hola buenas noches.
    Disculpa si tienes una gran cantidad de información de números de partes y cada uno tiene sus características ninguna tienen las mismas dimensiones pero quieres hacer que cuando selecciones un numero de parte te aparezca solo las dimensiones de ese numero de parte sin que aparezcan las demás columnas.
    Como se puede hacer ?????

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.