Este tutorial demonstrará como pesquisar (encontrar) um valor em uma matriz no VBA
Existem várias maneiras de pesquisar uma string em uma matriz - dependendo se a matriz é unidimensional ou multidimensional.
Pesquisando em uma matriz unidimensional
Para pesquisar um valor em uma matriz unidimensional, você pode usar a Função de Filtro.
123 | Dim z como variante'filtrar a matriz originalz = Filter (Array, String, True, vbCompareBinary) |
A sintaxe da opção de filtro é a seguinte
Filter (Source Array, Match as String, [Include as Boolean], [Compare as vbCompareMethod])
o Matriz de Origem e a Match as String são necessários enquanto o Incluir como booleano e a Compare como vbCompareMethod são opcionais. Se eles não estiverem incluídos, eles serão definidos como Verdade e vbCompareBinary respectivamente.
Encontre valores que correspondam ao Filtro
1234567891011121314 | Sub FindBob ()'Criar MatrizDim strNome () como variantestrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'declara uma variante para armazenar os dados do filtro emDim strSubNames como variante'filtrar a matriz originalstrSubNames = Filtro (strName, "Bob")'se seu valor LBound for maior que -1, então o valor foi encontradoIf LBound (strSubNames)> -1 Then MsgBox ("Encontrei Bob")End Sub |
O segundo array conterá os valores encontrados pelo filtro. Se os valores LBound e UBound não forem -1, o array conseguiu encontrar o valor que você estava procurando.
Você também pode ver quantas vezes o texto aparece na matriz original.
1234567891011121314 | Sub CountNames ()'Criar matrizDim strNome () como variantestrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'declara uma matriz para armazenar os dados do filtro emDim strSubNames como variante'filtrar a matriz originalstrSubNames = Filtro (strName, "Bob")'se você menos o LBound dos valores UBound e adicionar 1, obteremos o número de vezes que o texto apareceMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "nomes encontrados."End Sub |
Encontre valores que NÃO correspondam ao filtro
o [Incluir como booleano] opção permite que você encontre quantos valores em sua matriz que NÃO combine seu filtro
1234567891011121314 | Sub CountExtraNames ()'criar matrizDim strNome () como variantestrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'declara uma matriz para armazenar os dados do filtro emDim strSubNames como variante'filtrar a matriz originalstrSubNames = Filtro (strName, "Bob", False)'se você menos o LBound dos valores UBound e adicionar 1, obteremos o número de vezes que o texto apareceMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "nomes encontrados."End Sub |
portanto, alteramos esta linha:
1 | strSubNames = Filtro (strName, "Bob") |
com esta linha:
1 | strSubNames = Filtro (strName, "Bob", False) |
Usando esta linha no código, retornaria todos os nomes que NÃO correspondem a “Bob”.
Filtros que diferenciam maiúsculas de minúsculas
Você descobrirá que o filtro diferencia maiúsculas de minúsculas por padrão. Isso é verdadeiro para todas as funções do VBA. Se você quiser pesquisar um texto que não faça distinção entre maiúsculas e minúsculas, será necessário alterar um pouco seu código.
1 | z = Filter (strName, "bob" ,, vbTextCompare) |
Adicionando vbTextCompare à sua linha de filtro permitirá que seu código encontre “bob” ou “Bob”. Se for omitido, o VBA por padrão usa vbBinaryCompare que só procurará dados que sejam um EXATO partida. Observe no exemplo acima, deixamos de fora o [Incluir como booleano] argumento então True é assumido.
Texto de comparação de opções
Alternativamente, você pode adicionar o texto Texto de comparação de opções na parte superior do seu módulo - isso fará com que todas as funções que você escreve naquele módulo em particular não façam distinção entre maiúsculas e minúsculas.
Usando 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 percorrerá todos os valores do array.
1234567891011121314151617 | Sub LoopThroughArray ()'criar matrizDim strNome () como variantestrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Dim str Encontrar como stringstrFind = "Bob"Dim i enquanto'percorrer a matrizPara i = LBound (strName, 1) Para UBound (strName, 1)Se InStr (strNome (i), strFind)> 0 EntãoMsgBox "Bob foi encontrado!"Sair paraFim seProximo euEnd 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 instrução If. Isso olhou na string retornada pelo loop do Array para ver se “Bob” estava na string, e como estava na string, ele retornaria uma caixa de mensagem e então Saia do Loop.
Pesquisando em uma matriz multidimensional
Também usamos o loop para pesquisar uma matriz multidimensional. Mais uma vez, precisamos criar uma função que nos permita fazer um loop por todos os valores do array, mas, desta vez, também precisamos fazer um loop por cada dimensão do array.
123456789101112131415161718192021222324252627 | Função LoopThroughArray ()Dim varArray () como varianteDim strFind As StringstrFind = "Doutor"'declara o tamanho da matrizReDim varArray (1, 2)'inicializar a matrizvarArray (0, 0) = "Mel Smith"varArray (0, 1) = "Fred Buckle"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "Contador"varArray (1, 1) = "Secretário"varArray (1, 2) = "Doutor"'declara variáveis para o loopDim i As Long, j As Long'loop para a primeira dimensãoPara i = LBound (varArray, 1) Para UBound (varArray, 1)'loop para a segunda dimensãoPara j = LBound (varArray, 2) Para UBound (varArray, 2)'se encontrarmos o valor, então msgbox para dizer que temos o valor e sair da funçãoSe varArray (i, j) = strFind ThenMsgBox "O médico foi encontrado!"Função de saídaFim sePróximo jProximo euFunção Final |