VBA Buscar (Buscar) valor en la matriz

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

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

Búsqueda en una matriz unidimensional

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

123 Dim z como variante'filtrar la matriz originalz = Filtro (Matriz, Cadena, Verdadero, vbCompareBinary)

La sintaxis de la opción de filtro es la siguiente

Filtro (Matriz de origen, Coincidir como cadena, [Incluir como booleano], [Comparar como vbCompareMethod])

los Matriz de origen y el Coincidir como cadena son necesarios mientras que Incluir como booleano y el Comparar como vbCompareMethod son opcionales. Si no se incluyen, se establecen en Cierto y vbCompareBinary respectivamente.

Encuentre valores que coincidan con el filtro

1234567891011121314 Sub FindBob ()'Crear matrizDim strName () como variantestrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'declarar una variante para almacenar los datos del filtro enDim strSubNames como variante'filtrar la matriz originalstrSubNames = Filtro (strName, "Bob")'si su valor LBound es mayor que -1, entonces se ha encontrado el valorSi LBound (strSubNames)> -1 Entonces MsgBox ("Encontré a Bob")End Sub

La segunda matriz contendrá los valores encontrados por el filtro. Si sus valores LBound y UBound no son -1, entonces la matriz ha logrado encontrar el valor que estaba buscando.

También puede ver cuántas veces aparece el texto en la matriz original.

1234567891011121314 Sub CountNames ()'Crear matrizDim strName () como variantestrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'declara una matriz para almacenar los datos del filtro enDim strSubNames como variante'filtrar la matriz originalstrSubNames = Filtro (strName, "Bob")'si menos el LBound de los valores de UBound, y agrega 1, obtendremos el número de veces que aparece el textoMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "nombres encontrados".End Sub

Encuentre valores que NO coincidan con el filtro

los [Incluir como booleano] La opción le permite encontrar cuántos valores en su matriz NO coincidir con su filtro

1234567891011121314 Sub CountExtraNames ()'crear matrizDim strName () como variantestrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'declara una matriz para almacenar los datos del filtro enDim strSubNames como variante'filtrar la matriz originalstrSubNames = Filter (strName, "Bob", False)'si menos el LBound de los valores de UBound, y agrega 1, obtendremos el número de veces que aparece el textoMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "nombres encontrados".End Sub

por lo tanto, hemos modificado esta línea:

1 strSubNames = Filtro (strName, "Bob")

con esta línea:

1 strSubNames = Filter (strName, "Bob", False)

El uso de esta línea en el código devolvería todos los nombres que NO coinciden con "Bob".

Filtros sensibles a mayúsculas y minúsculas

Verá que el filtro distingue entre mayúsculas y minúsculas de forma predeterminada. Esto es cierto para todas las funciones de VBA. Si desea buscar texto que no distinga entre mayúsculas y minúsculas, debe modificar ligeramente su código.

1 z = Filter (strName, "bob" ,, vbTextCompare)

Añadiendo vbTextCompare a su línea de filtro permitirá que su código encuentre "bob" o "Bob". Si esto se omite, VBA usa por defecto vbBinaryCompare que solo buscará datos que sean EXACTO fósforo. Observe que en el ejemplo anterior, hemos omitido el [Incluir como booleano] argumento por lo que se asume True.

Opción Comparar texto

Alternativamente, puede agregar el texto Opción Comparar texto en la parte superior 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.

Usar un bucle para buscar a través de una matriz

Usar un bucle es un poco más complicado que usar la función de filtro. Podemos crear una función que recorra todos los valores de la matriz.

1234567891011121314151617 Sub LoopThroughArray ()'crear matrizDim strName () como variantestrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Dim strFind como cadenastrFind = "Bob"Dim i tan largo'recorrer la matrizPara i = LBound (strName, 1) a UBound (strName, 1)Si InStr (strName (i), strFind)> 0 EntoncesMsgBox "¡Se ha encontrado a Bob!"Salir paraTerminara siSiguiente yoEnd Sub

Para encontrar una parte de la cadena de texto, es decir, "Bob" en lugar de "Bob Smith" o "Bob Williams", necesitábamos utilizar la función Instr en la declaración If. Esto miró en la cadena devuelta por el bucle de la matriz para ver si "Bob" estaba en la cadena, y como estaba en la cadena, devolvería un cuadro de mensaje y luego Salir del bucle.

Búsqueda en una matriz multidimensional

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

123456789101112131415161718192021222324252627 Función LoopThroughArray ()Dim varArray () como varianteDim strFind como cadenastrFind = "Doctor"'declarar el tamaño de la matrizReDim varArray (1, 2)'inicializa la matrizvarArray (0, 0) = "Mel Smith"varArray (0, 1) = "Fred Buckle"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "Contador"varArray (1, 1) = "Secretario"varArray (1, 2) = "Doctor"'declarar variables para el bucleDim i tan largo, j tan largo'bucle para la primera dimensiónPara i = LBound (varArray, 1) a UBound (varArray, 1)'bucle para la segunda dimensiónPara j = LBound (varArray, 2) a UBound (varArray, 2)'si encontramos el valor, entonces msgbox para decir que tenemos el valor y salir de la funciónSi varArray (i, j) = strFind ThenMsgBox "¡Se ha encontrado al doctor!"Función de salidaTerminara siSiguiente jSiguiente yoFunción final
wave wave wave wave wave