TOP

VBA-Lição 13.2. Usando matrizes (Arrays) (continuação)


Para armazenar mais de uma coluna de dados, precisamos de uma dimensão diferente do array. Exemplo:

Salvando dados em uma matriz bidimensional:

 'Declaração
 Dim array_example(10, 2) 'Matriz "definida" 11 x 3

 'Salvando dados em um array
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

Aqui estão alguns exemplos de como trabalhar com esses valores:

MsgBox array_example(0, 0)  '=> retorno: 11/03/2026
MsgBox array_example(0, 1)  '=> retorna: 24
MsgBox array_example(9, 2)  '=> retorna: NO
MsgBox array_example(10, 2) '=> retorna: SIM

Matriz dinâmica

Vamos imaginar por um momento que precisamos atualizar os dados do nosso array regularmente e, portanto, não podemos atribuir valores fixos no momento da declaração...

Para saber o número da linha da última célula não vazia, ou seja, da última linha do nosso banco de dados, usaremos a seguinte fórmula:

last_row = Range("A1").End(xlDown).Row

Excel não aceita variáveis na declaração.

Em vez disso, declare um array dinâmico (usando parênteses vazios) e defina seu tamanho usando Redim:

Dim array_example()
ReDim array_example(last_row - 2, 2)

Usando o procedimento a seguir, você pode armazenar todas as linhas do seu conjunto de dados (tabela) em nosso array:

Dim array_example()
ReDim array_example(last_row - 2, 2)

Ubound

No exemplo anterior, o último número do nosso array foi last_row - 2:

For i = 0 To last_row - 2

Outra forma de determinar o último número do nosso array poderia ser usando Ubound:

For i = 0 To UBound(array_example)

Esta função retorna o maior número na matriz para a dimensão selecionada (a primeira dimensão é o padrão).

Aqui estão alguns exemplos que tornarão isso mais claro:

Sub example()
     Dim array_example(10, 2)
     
     MsgBox UBound(array_example)    '=> retorna: 10
     MsgBox UBound(array_example, 1) '=> retorna: 10
     MsgBox UBound(array_example, 2) '=> retorna: 2
End Sub

Salvando dados em vários elementos do array

É possível preencher um array com valores de um intervalo de células de uma planilha sem sequer usar um loop:

 'Declaração
 Dim array_example(10, 2) 'Matriz "definida" 11 x 3

 'Salvando dados em um array
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

O código anterior pode ser efetivamente substituído por este:

 'Declaração
 Dim array_example()

 'Salvando dados em um array
 array_example = Range("A2:C12").Value

Embora o segundo método pareça mais atraente que o primeiro, tenha em atenção que na maioria dos casos a sua implementação pode custar mais tempo do que o primeiro.

Se você armazenar os dados em seu array desta forma, o primeiro número será 1 em vez de 0, o que pode causar confusão...

Posteriormente, no processo de aumento do código, se você decidir armazenar apenas dados que correspondam a determinados critérios de pesquisa no array (ou realizar uma operação completamente diferente), você terá que reescrever completamente o código usando uma função de loop diferente...

Mas este segundo método é bastante útil se você precisar salvar todo o conteúdo de um grande conjunto de dados, porque é mais rápido que o loop (economizando cerca de 0,2 segundos para cada 15.000 registros).

Matriz (Array)

Mas se precisar criar um array que tenha conteúdo "fixo".

Uma solução poderia ser gravar os valores fita por fita:

Dim en(5)

en(0) = "IF"
en(1) = "VLOOKUP"
en(2) = "SUM"
en(3) = "COUNT"
en(4) = "ISNUMBER"
en(5) = "MID"

Felizmente, você pode simplificar esse código usando um array (Array):

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")

Aqui está uma demonstração do uso da função Replace (isso ajudará você a entender o exemplo a seguir):

Sub replace_example()
     Dim var_translate As String

     'Faixa de texto para este exemplo
     var_translate = "Hello World !"
     
     'Substitua “World” por “you” na faixa de texto
     var_translate = Replace(var_translate, "World", "you")

     'Fita após substituição
     MsgBox var_translate '=> retorna "Olá!"
End Sub

Agora, se quisermos substituir uma série de valores por outro conjunto de dados, usar arrays e a função Array será extremamente útil:

Sub translate() 'Um exemplo simplificado de tradução de fórmulas do inglês para o francês
     Dim var_translate As String

     'Faixa de texto para este exemplo
     var_translate = "Formula to translate : SUM(IF(ISNUMBER(A1:E1),A1:E1,0))"
     
     'Dois conjuntos de valores
     en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
     fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")
     
     'Substitua "SI" por "IF", "RECHERVEV" por "VLOOKUP", etc.
     For i = 0 To UBound(en)
         var_translate = Replace(var_translate, en(i), fr(i))
     Next

     'Fita após substituição
     MsgBox var_translate '=> retorna "Formula para traduzir: SOMME(SI(ESTNUM(A1:E1),A1:E1,0))"
End Sub

Converter texto em array (VBA Split)

A função Split nos permite dividir a sequência de caracteres em partes e escrever os valores resultantes em um array.

Para converter uma faixa de opções em uma matriz, faça o seguinte:

variable = "IF/VLOOKUP/SUM/COUNT/ISNUMBER/MID"

Use a função VBA Split e especifique o separador:

en = Split(variable, "/")

A matriz "en" retornará os seguintes valores:

MsgBox en(0) '=> retorna: IF
MsgBox en(1) '=> retorna: PROCV
MsgBox en(2) '=> retorna: SOMA
MsgBox en(3) '=> retorna: CONTAGEM
MsgBox en(4) '=> retorna: ISNUMBER
MsgBox en(5) '=> retorna: MID

As três matrizes a seguir também retornarão os mesmos valores:

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
en = Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")
en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")

O exemplo a seguir retorna o terceiro valor da string:

MsgBox Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")(2) '=> retorna: SOMA

O inverso de Split é a função VBA Join.

Esta função coleta os valores de um array em uma string.

MsgBox Join(Array(1, 2, 3, 4, 5), "") '=> retorna: 12345