VBA Buscar (Encontrar) valor en una Matriz
In this Article
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».
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.
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