TOP

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

Matrizes (Arrays) são frequentemente usadas em programação, inclusive em Excel VBA.

Uma matriz é essencialmente uma única variável com muitas células para armazenar valores, enquanto uma variável típica possui apenas uma célula de armazenamento na qual pode armazenar apenas um valor.

Um array pode ser acessado como um todo se você quiser se referir a todos os valores que ele contém, ou pode se referir a seus elementos individuais.

Você pode declarar um array para funcionar com um conjunto de valores do mesmo tipo de dados. Já abordamos isso em VBA-Lição 6.2. Datatypes Mas vamos nos aprofundar ainda mais agora...

Por que matrizes são usadas?

Imagine que você está tentando escrever um procedimento no qual precisa armazenar até 500 valores. Se você tiver que criar 500 variáveis separadas, será muito difícil. No meio do array, armazenar e trabalhar com esses valores será muito mais fácil.

A segunda razão para usar arrays é a velocidade. A leitura de dados de matrizes leva significativamente menos tempo do que de tabelas (feitas de células) na planilha Excel.


Um exemplo de uso de matrizes

Então aqui está um exemplo que mostrará a vantagem óbvia de usar arrays VBA em Excel.

A primeira planilha (“DS”) possui um conjunto de dados: 5.000 linhas por 3 colunas:

Na segunda planilha, você encontrará uma tabela resumo que leva em consideração todas as respostas “Sim” (“YES”) por ano e cliente:

Nesse caso, o procedimento usará um loop para processar o conjunto de dados e registrar o número de respostas “Sim” para cada ano e cada número de cliente e, em seguida, inserir esses dados nas células apropriadas.

Sem usar arrays, Excel levaria 131,44 segundos para executar este procedimento:

Mas primeiro salvar os dados em uma matriz (da planilha "DS") e depois realizar os mesmos cálculos (usando as matrizes em vez do conjunto de dados da planilha "DS") levará apenas 1,74 segundos:

Se decidirmos otimizar nosso procedimento armazenando apenas os dados que contêm respostas "YES" no array (que é cerca de 3/4 do total de dados), levaria apenas 1,02 segundos:

Este é um bom exemplo de como o uso de arrays permite realizar um procedimento 128 vezes mais rápido. O resultado da nossa otimização seria ainda melhor se trabalhássemos com muitos conjuntos de dados ao mesmo tempo.

Voltaremos aos detalhes do nosso exemplo no final da lição.

Declarando matrizes

Abaixo estão alguns exemplos de declaração de arrays em VBA (se os dois primeiros exemplos não estiverem claros para você, leia):

 'Um exemplo de declaração de um array unidimensional
 Dim array1(4)

 'Um exemplo de declaração de um array bidimensional
 Dim array2(6, 1)

 'Um exemplo de declaração de um array dinâmico
 Dim array3()

Se você não puder inserir valores fixos ao declarar arrays (porque eles dependem, por exemplo, do tamanho do conjunto de dados), deixe os parênteses vazios.

Você não precisa declarar um tipo de dados (string, long, etc.), embora em muitos casos isso desacelere a execução do seu procedimento.

Armazenamento de dados em um array

Vamos tentar armazenar alguns dados em um array:

Queremos armazenar valores 11x1 neste caso, então precisamos criar um array unidimensional:

 'Declaração
 Dim array_example(10)

Não se esqueça que a numeração dos elementos do array começa com 0 (isso é padrão na programação, então vale a pena adquirir esse hábito imediatamente, embora, na verdade, você possa alterar essa abordagem em VBA).

Cada elemento do array agora receberá seu valor:

 'Salvando valores em um array
 array_example(0)  = Range("A2")
 array_example(1)  = Range("A3")
 array_example(2)  = Range("A4")
 array_example(3)  = Range("A5")
 array_example(4)  = Range("A6")
 array_example(5)  = Range("A7")
 array_example(6)  = Range("A8")
 array_example(7)  = Range("A9")
 array_example(8)  = Range("A10")
 array_example(9)  = Range("A11")
 array_example(10) = Range("A12")

Você pode operar ou modificar cada elemento do array como se fosse uma variável normal.

A seguir está um exemplo onde usamos array_example(8):

Sub example()
     'Declaração
     Dim array_example(10)
     
     'Salvando valores em um array
     array_example(0)  = Range("A2")
     array_example(1)  = Range("A3")
     array_example(2)  = Range("A4")
     array_example(3)  = Range("A5")
     array_example(4)  = Range("A6")
     array_example(5)  = Range("A7")
     array_example(6)  = Range("A8")
     array_example(7)  = Range("A9")
     array_example(8)  = Range("A10")
     array_example(9)  = Range("A11")
     array_example(10) = Range("A12")
     
     'Teste 1
     MsgBox array_example(8) '=> retorno: 02/04/2016
    
     'Alterando um dos valores
     array_example(8) = Year(array_example(8))
     
     'Teste 2
     MsgBox array_example(8) '=> retornos: 2016
End Sub

Um loop For seria a melhor opção para salvar o array mais rapidamente:

 'Declaração
 Dim array_example(10)

 'Salvando valores em um array
 For i = 0 To 10
    array_example(i) = Range("A" & i + 2)
 Next