VBA Buscar (Encontrar) valor en una Matriz

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

Dennis Madrid

Last updated on febrero 22, 2022

Este tutorial demostrará cómo buscar (encontrar) un valor en una matriz en VBA

Hay varias maneras de buscar una cadena en una matriz – dependiendo de si la matriz es unidimensional o multidimensional.

Buscar en una matriz unidimensional

Para buscar un valor en una matriz unidimensional, puedes utilizar la función de filtro.

Dim z As Variant
'Filtrar la matriz original
  z = Filter(matriz, cadena, True, vbCompareBinary)

La sintaxis de la opción Filter es la siguiente Filter(Matriz Origen, Coincidencia como Cadena, [Include como Boolean], [Compare como vbCompareMethod])

La matriz de origen y la coincidencia como cadena son obligatorias, mientras que la inclusión como booleano y la comparación como vbCompareMethod son opcionales. Si no se incluyen, se establecen como True y vbCompareBinary respectivamente.

Encontrar los valores que coinciden con el filtro

Sub encontrarBob()
   'Crear matriz
   Dim strNombre() As Variant
   strNombre() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
  
   'declarar la variable para almacenar los datos filtrados.
   Dim strSubNombres  As Variant
 
  'filtrar la matriz original
   strSubNombres = Filter(strNombre, "Bob")
 
   'Si el resultado de LBound es mayor que -1, entonces el valor fue encontrado
   If LBound(strSubNombres) > -1 Then MsgBox ("Bob encontrado")
End Sub

El segundo array contendrá los valores encontrados por el filtro. Si sus valores LBound y UBound no son -1, entonces el array ha conseguido encontrar el valor que buscaba. También puedes ver cuántas veces aparece el texto en el array original.

Sub contarNombres()
   'Crear matriz
   Dim strNombre() As Variant
   strNombre() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
 
  'Declarar matriz para almacenar los datos filtrados
   Dim strSubNombres As Variant
 
   'Filtrar la matriz original
   strSubNombres = Filter(strNombre, "Bob")
 
   'si se resta el resultado de LBound de UBound, y se añade 1,
   'obtendremos el número de veces que aparece el texto
   MsgBox UBound(strSubNombres) - LBound(strSubNombres) + 1 & " Nombres found."
End Sub

Encontrar los valores que NO coinciden con el filtro

La opción [Include as Boolean] le permite encontrar cuántos valores de su array NO coinciden con su filtro

Sub ContarNombresExtra()
  'Crear la matriz
  Dim strNombre() As Variant
  strNombre() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
 
  'Declarar una matriz para almacenar los datos filtrados
  Dim strSubNombres As Variant
 
  'Filtrar la matriz original.
  strSubNombres = Filter(strNombre, "Bob", False)
 
  'si se resta el LBound de los valores UBound, y se añade 1,
  'obtendremos el número de veces que aparece el texto
  MsgBox UBound(strSubNombres) - LBound(strSubNombres) + 1 & " Nombres found."
End Sub

por lo tanto, hemos modificado esta línea:

strSubNames = Filter(strNombre, "Bob")

con esta línea

strSubNames = Filter(strNombre, "Bob", False)

Utilizando esta línea en el código, devolvería todos los nombres que NO coinciden con «Bob».

Matrices Contar Nombres Extra

Filtros que distinguen entre mayúsculas y minúsculas

Encontrará que el filtro distingue entre mayúsculas y minúsculas por defecto. Esto es cierto para todas las funciones VBA. Si desea buscar un texto que no distinga entre mayúsculas y minúsculas, deberá modificar ligeramente su código.

strSubNames = Filter(strName, "Bob")

Si añade vbTextCompare a su línea de filtro, su código podrá encontrar «bob» o «Bob». Si se omite, VBA utiliza por defecto vbBinaryCompare, que sólo buscará datos que coincidan EXACTAMENTE. Observe que en el ejemplo anterior, hemos omitido el argumento [Incluir como booleano ] para que se asuma que es Verdadero.

Opción de texto de comparación

Alternativamente, puede añadir el texto Option Compare Text al principio de su módulo – esto hará que todas las funciones que escriba en ese módulo en particular no distingan entre mayúsculas y minúsculas.

vba find array option compare text

Utilizar un bucle para buscar en una matriz

Usar un bucle es un poco más complicado que usar la función Filtro. Podemos crear una función que recorra todos los valores del array.

Sub BucleRecorrerMatriz()
  'Crear una matriz
  Dim strNombre() As Variant
  strNombre() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
 
Dim cadenaBuscar As String
cadenaBuscar = "Bob"
 
Dim i As Long
'Bucle para recorrer a través de la matriz
   For i = LBound(strNombre, 1) To UBound(strNombre, 1)
       If InStr(strNombre(i), cadenaBuscar) > 0 Then
          MsgBox "Bob ha sido encontrado!"
          Exit For
       End If
    Next i
End Sub

Para encontrar una parte de la cadena de texto, es decir, «Bob» en lugar de «Bob Smith» o «Bob Williams», necesitamos utilizar la función Instr en la declaración If. Esto buscó en la cadena devuelta por el bucle del Array para ver si «Bob» estaba en la cadena, y como estaba en la cadena, devolvía un cuadro de mensaje y luego Salía del Bucle.

Buscando en una matriz multidimensional

También utilizamos el bucle para buscar en una matriz multidimensional. Una vez más, necesitamos crear una función que nos permita hacer un bucle a través de todos los valores de la matriz, pero esta vez, también necesitamos hacer un bucle a través de cada dimensión de la matriz.

Sub LoopThroughArray()
   Dim matriz() As Variant
   Dim cadenaBuscar As String
   cadenaBuscar = "Doctor"
'Declarar el tamaño de la matriz
   ReDim matriz(1, 2)
'Inicializar la matriz
   matriz(0, 0) = "Comerciante"
   matriz(0, 1) = "Panadero"
   matriz(0, 2) = "Joyero"
   matriz(1, 0) = "Contador"
   matriz(1, 1) = "Secretaria"
   matriz(1, 2) = "Doctor"
'Declarar las variables de los bucles/ciclos
   Dim i As Long, j As Long
'Recorrer la primera dimensión
   For i = LBound(matriz, 1) To UBound(matriz, 1)
'Recorrer la segunda dimensión.
      For j = LBound(matriz, 2) To UBound(matriz, 2)
'si encontramos el valor, entonces msgbox
'para decir que tenemos el valor y salir de la función
         If matriz(i, j) = cadenaBuscar Then
            MsgBox "Doctor ha sido encontrado!"
            Exit Sub
         End If
      Next j
   Next i
End Sub
vba-free-addin

Complemento de Ejemplos de Código de VBA

Acceda fácilmente a todos los ejemplos de código que se encuentran en nuestro sitio.

Simplemente navegue al menú, haga clic y el código se insertará directamente en su módulo. Complemento .xlam.

(¡No se requiere instalación!)

Descarga gratuita

Return to VBA Code Examples