VBA - Verificar se existe um valor em uma variável matriz

Fevereiro 2017

Para verificar se uma tabela variável contém os dados necessários, podemos percorrer todos os elementos dessa matriz. A outra solução é utilizar a função de INDEX(), nativa no Excel e, no caso de matrizes bidimensionais, a combinação INDEX/MATCH. No entanto, se o valor requerido não for encontrado, Application.Match retornará um erro. Lógico, como faria o INDEX. Devemos levar em conta todas as possibilidades de erro e o número de dimensões da nossa variável matriz.


Usando a função Match

Function EstDans(palavra As String, Tabl) As Boolean
Dim Dimension As Byte, j As Integer

On Error Resume Next
If IsError(UBound(Tabl, 2)) Then Dimension = 1 Else Dimension = 2
On Error GoTo 0

Select Case Dimension
    Case 1
        On Error Resume Next
        EstDans = Application.Match(palavra, Tabela, 0)
        On Error GoTo 0
    Case 2
        For j = 1 To UBound(Tabl, 2)
            On Error Resume Next
            EstDans = Application.Match(palavra, Application.Index(Tabela, , j), 0)
            On Error GoTo 0
            If EstDans = True Then Exit For
        Next
End Select
End Function

Procedimento de chamada

Sub test()
Dim Tb(), i As Integer

'tb 2 dimensions:
Tb = Range("A2:C16").Value
Debug.Print EstDans(MeuValor, Tb)
Erase Tb
'tb 1 dimension:
ReDim Preserve Tb(15)
For i = 0 To 14
    Tb(i) = Cells(i + 2, 1)
Next
Debug.Print EstDans(MaValeur, Tb)
End Sub

Usando a função Loop

A estrutura desta função é similar àquela com Match.
Function LoopNaTabela(mot As String, Tb)
Dim Dimension As Byte, i As Long, j As LongOn Error Resume Next
If IsError(UBound(Tb, 2)) Then Dimension = 1 Else Dimension = 2
On Error GoTo 0

Select Case Dimension
    Case 1
        For j = LBound(Tb) To UBound(Tb)
            If Tb(j) = palavra Then LoopNaTabela = True: Exit Function
        Next
    Case 2
        For i = LBound(Tb, 1) To UBound(Tb, 1)
            For j = LBound(Tb, 2) To UBound(Tb, 2)
                If Tb(i, j) = palavra Then LoopNaTabela = True: Exit Function
            Next j
        Next i
End Select
End Function

Desempenhos

Contra todas as probabilidades, Application.Match em tabelas grandes é muito menos eficiente do que o loop. Em testes:

Variável matriz de 2 dimensões:
Range("A1: Y20002")
Com Match: 8.300781 segundos
Com loop: 0,4375 segundo.
Variável matriz unidimensional:
Com Match: instantânea.
Loop: 0.015625 segundos

Em pequenas variáveis de tabela, ou em variáveis matrizes unidimensionais, a função com Application.Match é mais "elegante" e, às vezes, até mais rápida...
Portanto, você deve considerar, em primeiro lugar, os dados a serem analisados
Foto: © Excel.

Veja também

Artigo original publicado por . Tradução feita por ninha25. Última modificação: 6 de dezembro de 2016 às 13:40 por pintuda.
Este documento, intitulado 'VBA - Verificar se existe um valor em uma variável matriz ', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (br.ccm.net) ao utilizar este artigo.