VBA – Procurar (Localizar) Valor em uma Matriz

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

Daniel Caramello

Last updated on July 20, 2023

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”.

resultado nomes encontrados

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.

opcao comparar texto

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
vba-free-addin

Exemplos de Add-ins de Códigos VBA

Acesse facilmente todos os exemplos de código que se encontram em nosso site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(Nenhuma instalação necessária!)

Baixe de Graça

Retornar aos Exemplos de Códigos VBA