VBA – Procurar (Localizar) Valor em uma Matriz
In this Article
Este tutorial demonstrará como pesquisar (localizar) um valor em uma matriz no VBA
Há várias maneiras de pesquisar uma string em uma matriz, dependendo se a matriz é unidimensional ou multidimensional.
Pesquisa em uma Matriz Unidimensional
Para pesquisar um valor em uma matriz unidimensional, você pode usar a função Filter.
Dim z As Variant
'filtrar a matriz original
z = Filter(Array, String, True, vbCompareBinary)
A sintaxe da opção Filter é a seguinte
Filter(Source Array, Match as String, [Include as Boolean], [Compare as vbCompareMethod])
O Source Array e o Match as String são obrigatórios, enquanto o Include as Boolean e o Compare as vbCompareMethod são opcionais. Se eles não forem incluídos, serão definidos como True e vbCompareBinary, respectivamente.
Encontrar Valores que Correspondam ao Filtro
Sub EncontrarBob()
'Criar a Matriz
Dim strNome() As Variant
strNome() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
'declarar uma variante para armazenar os dados do filtro
Dim strSubNomes As Variant
'filtrar a matriz original
strSubNomes = Filter(strNome, "Bob")
'Se o valor UBound for maior que -1, então o valor foi encontrado
If UBound(strSubNomes ) > -1 Then MsgBox ("Eu encontrei Bob")
End Sub
A segunda matriz conterá os valores encontrados pelo filtro. Se os valores UBound não forem -1, então a matriz conseguiu encontrar o valor que você estava procurando.
Você também pode ver quantas vezes o texto aparece na matriz original.
Sub ContarNomes()
'Criar Matriz
Dim strNome() As Variant
strNome() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
'declarar uma matriz para armazenar os dados do filtro
Dim strSubNomes As Variant
'filtrar a matriz original
strSubNomes = Filter(strNome, "Bob")
'Se você adicionar 1 ao valor UBound, obterá o número de vezes que o texto aparece
Msgbox UBound(strSubNomes) + 1 & " nomes encontrados."
End Sub
Localizar Valores que NÃO Correspondem ao Filtro
A opção [Include as Boolean] permite que você descubra quantos valores em sua matriz NÃO correspondem ao filtro
Sub ContarNomesExtra()
'Criar Matriz
Dim strNome() As Variant
strNome() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
'declarar uma matriz para armazenar os dados do filtro
Dim strSubNomes As Variant
'filtrar a matriz original
strSubNomes = Filter(strNome, "Bob", False)
'Se você adicionar 1 ao valor UBound, obterá o número de vezes que o texto aparece
Msgbox UBound(strSubNomes) + 1 & " nomes encontrados."
End Sub
portanto, alteramos essa linha:
strSubNomes = Filter(strNome, "Bob")
com esta linha:
strSubNomes = Filter(strNome, "Bob", False)
O uso dessa linha no código retornaria todos os nomes que NÃO correspondem a “Bob”.
Filtros que Diferenciam Maiúsculas de Minúsculas
Você verá que, por padrão, o filtro diferencia maiúsculas de minúsculas. Isso se aplica a todas as funções do VBA. Se quiser pesquisar um texto que não diferencie maiúsculas de minúsculas, será necessário alterar um pouco o código.
z = Filter(strNome, "bob",, vbTextCompare)
A adição de vbTextCompare à linha do filtro permitirá que o código encontre “bob” ou “Bob”. Se isso for omitido, o VBA usará, por padrão, vbBinaryCompare, que só procurará dados que sejam uma correspondência EXATA. Observe que, no exemplo acima, deixamos de fora o argumento [Include as Boolean], de modo que True é assumido.
Option Compare Text (Opção Comparar Texto)
Como alternativa, você pode adicionar o texto Option Compare Text na parte superior do módulo – isso fará com que todas as funções que você escrever nesse módulo específico não diferenciem maiúsculas de minúsculas.
Uso de um Loop para Pesquisar em uma Matriz
Usar um loop é um pouco mais complicado do que usar a função Filter. Podemos criar uma função que fará um loop por todos os valores da matriz.
Sub LoopAtravesMatriz()
'criar matriz
Dim strNome() As Variant
strNome() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
Dim strEncontrar as string
strEncontrar = "Bob"
Dim i As Long
'percorrer a matriz
For i = LBound(strNome, 1) To UBound(strNome, 1)
If InStr(strNome(i), strEncontrar) > 0 Then
MsgBox "Bob foi encontrado!"
Exit For
End If
Next i
End Sub
Para encontrar uma parte da string de texto, ou seja, “Bob” em vez de “Bob Smith” ou “Bob Williams”, precisamos usar a função Instr na declaração If. Essa função procurou no texto retornado pelo loop da matriz para ver se “Bob” estava na lá e, como estava na cadeia de caracteres, ela retorna uma caixa de mensagem e sai do loop.
Pesquisa em uma Matriz Multidimensional
Também usamos o loop para pesquisar em uma matriz multidimensional. Mais uma vez, precisamos criar uma função que nos permita percorrer todos os valores da matriz, mas, dessa vez, também precisamos percorrer cada dimensão da matriz.
Function LoopAtravesMatriz()
Dim varMatriz() As Variant
Dim strEncontrar As String
strEncontrar = "Doutor"
'declarar o tamanho da matriz
ReDim varMatriz(1, 2)
'inicializar a matriz
varMatriz(0, 0) = "Mel Smith"
varMatriz(0, 1) = "Fred Buckle"
varMatriz(0, 2) = "Jane Eyre"
varMatriz(1, 0) = "Contador"
varMatriz(1, 1) = "Secretário"
varMatriz(1, 2) = "Doutor"
'declarar variáveis para o loop
Dim i As Long, j As Long
'loop para a primeira dimensão
For i = LBound(varMatriz, 1) To UBound(varMatriz, 1)
'loop para a segunda dimensão
For j = LBound(varMatriz, 2) To UBound(varMatriz, 2)
'Se encontrarmos o valor, então a msgbox informará que temos o valor e encerraremos a função
If varMatriz(i, j) = strEncontrar Then
MsgBox "Doutor foi encontrado!"
Exit Function
End If
Next j
Next i
End Function