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