Este tutorial demonstrará como declarar (Dim), criar e inicializar variáveis de matriz em VBA
O que é uma variável de matriz VBA?
Uma variável de matriz VBA pode ser considerada um grupo de variáveis, armazenadas com o mesmo nome e com o mesmo tipo de dados. Uma matriz pode armazenar texto, números ou objetos.
Você se refere a um elemento em uma matriz usando seu número de índice.
Você pode declarar uma variável de array da mesma forma que declararia qualquer outra variável usando a palavra-chave Dim, Static, Public ou Private.
Matrizes estáticas
Existem 2 tipos de matrizes - Estática e Dinâmica. Uma matriz estática é declarada com seu tamanho especificado quando você declara a matriz inicialmente. Também é chamado de array fixo.
1 | Dim intA (4) como inteiro |
A matriz acima é declarada usando a instrução Dim em um nível de procedimento ou módulo, e o tamanho da matriz é 5, pois não declaramos o valor LBound da matriz.
Não, isso não é um erro de digitação! O tamanho da matriz é 5, apesar de inserir 4 na matriz. Isso ocorre porque os índices de array começam automaticamente em zero.
Índices de matriz
Os índices de matriz começam automaticamente em zero, a menos que Opção Base 1 é declarado no topo do seu módulo de código.
Se Opção Base 1 for declarado, então os arrays iniciarão automaticamente em 1.
No entanto, acho que declarar variáveis de tal forma é problemático. Os revisores de código podem não estar cientes de que as matrizes começam em zero ou da declaração de Opção Base 1
Em vez disso, prefiro declarar explicitamente as posições inicial e final das matrizes:
1 | Dim intA (2 a 5) como inteiro |
Observe que, ao fazer isso, você pode iniciar a matriz em qualquer número (não apenas 1 ou 0).
Matrizes Dinâmicas
Uma variável Dynamic Array é um array cujo tamanho pode ser alterado em tempo de execução. Você declara variáveis dinâmicas sem um tamanho.
1 | Dim intA () como inteiro |
Você pode usar a instrução ReDim para especificar o tamanho da matriz após a sua criação.
1 | ReDim intA (2) |
Você pode redimensionar uma matriz dinâmica a qualquer momento. No entanto, ao usar a instrução ReDim, todos os valores existentes são apagados. Para preservar os valores da matriz existente, use ReDim Preserve em vez de.
1 | ReDim Preserve intA (2) |
Você pode declarar uma matriz dinâmica em um procedimento, módulo ou nível global, mas você só pode usar a instrução ReDim dentro de um procedimento.
Variant Arrays
Arrays variantes são arrays dinâmicos com os quais é mais fácil trabalhar.
1 | Dim varNames () |
Observe que você não precisa especificar o tipo de dados (presume-se que seja uma variante) ou o tamanho da matriz.
Como veremos abaixo, você pode inicializar matrizes variantes usando a função Array (não há necessidade de redimensionar matrizes primeiro)!
Declare Módulo e Matrizes Públicas
Conforme mostrado acima, os arrays podem ser declarados dentro de procedimentos, para uso dentro desse procedimento:
1234 | Sub StaticArray ()'declara a matriz com um valor LBound de 1 e um valor UBound de 4Dim IntA (1 a 4) como inteiroEnd Sub |
Mas eles também podem ser declarados no nível do Módulo ou Global.
1234567 | Opção Explícita'declara a matriz com um valor LBound de 1 e um valor UBound de 4Dim IntA (1 a 4) como inteiroSub StaticArray ()End Sub |
Neste exemplo, a variável de matriz pode ser chamada em qualquer lugar dentro deste módulo de código. Em vez disso, você pode declarar um array público que pode ser usado em todo o seu projeto VBA (consulte a próxima seção).
Declarando uma matriz pública
Você declara uma matriz pública estática da mesma forma que declararia uma variável pública.
1 | StrNames públicos (3) como String |
Essa declaração precisaria ir no topo do seu módulo, abaixo de Option Explicit. Ele pode então ser usado em todo o projeto VBA em qualquer módulo ou procedimento.
Se você declarar o Array na parte superior do módulo, mas com a palavra-chave Dim, o uso desse array é restrito a esse módulo individual. Tentar usar o Array em um módulo separado resultaria em erro.
Inicializar matrizes
Você pode atribuir valores a uma matriz estática da seguinte maneira.
1234567891011 | Sub StaticArray ()'declara a matriz com um valor LBound de 1 e um valor UBound de 4Dim IntA (1 a 4) como inteiro'inicializar a matrizIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'mostra o resultado da posição 2 da matriz na janela imediataDebug.Print IntA (2)End Sub |
Se você executar o procedimento acima, o valor de 20 será exibido na janela imediata.
Você também pode atribuir os valores a um Dynamic Array da mesma maneira
12345678910111213 | Sub DynamicArray ()'declara uma matriz dinâmica, mas omite os valores vinculadosDim IntA () como inteiro'inicializar a matrizReDim IntA (1 a 4)IntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'mostra o resultado da posição 2 da matriz na janela imediataDebug.PrintIntA (2)End Sub |
Função Array
Contudo, com a matriz variante apenas, você pode usar a função Array, que pode ser mais fácil do que usar o método padrão.
12 | 'preencher a matrizintA () = Matriz (10, 20, 30, 40) |
Preencher Array com Loop
Você também pode preencher matrizes percorrendo um intervalo de células no Excel
1234567891011121314151617 | Sub TestDynamicArrayFromExcel ()'declara o arrayDim strNames () As String'declara um inteiro para contar as linhas em um intervaloDim n As Integer'declara um inteiro para o loopDim i As Integer'contar as linhas em um intervalon = Intervalo ("A1", Intervalo ("A1"). Fim (xlDown)). Linhas.Contagem'redim a matriz para a quantidade de linhas no intervalo.ReDim strNames (n)Para i = 0 para nstrNames (i) = Intervalo ("A1"). Offset (i + 1, 0)Proximo eu'mostra os valores na matrizMsgBox Join (strNames ())End Sub |
Reinicializar matrizes
Você pode reinicializar seu array em qualquer estágio de seu código, mas então perderá o valor original contido naquela posição em seu array.
1234567891011121314 | Sub StaticArray ()'declara a matriz com um valor LBound de 1 e um valor UBound de 4Dim IntA (1 a 4) como Inteiro'inicializar a matrizIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'mostra o resultado da posição 2 da matriz na janela imediataDebug.Print IntA (2)'inicializar o array novamenteintA (2) = 200Debug.Print IntA (2)End Sub |
No exemplo acima, a matriz estática manterá todos os valores, exceto o valor na posição 2 - esse valor mudará para 200.
Usando ReDim
Se você estiver usando um array dinâmico, a instrução ReDim é usada para definir o tamanho do seu array. Você pode usar a instrução ReDim posteriormente em seu código para alterar o tamanho do Array quantas vezes você precisar. A linha de código abaixo irá reinicializar o Array intA para ter um tamanho de 2 (Lembre-se - um índice de Array começa em 0!)
1 | ReDim intA (1) como inteiro |
Portanto, o código que inclui a instrução ReDim seria semelhante ao exemplo abaixo.
1234567891011121314151617 | Sub TestDynamicArray ()'declara o arrayDim intA () como inteiroReDim intA (2)'preencher a matriz com númerosintA (0) = 2intA (1) = 5intA (2) = 9'mostra o número na posição 1Debug.Print intA (1)'redim o array para mudar o tamanhoReDim intA (3)intA (0) = 6intA (1) = 8'mostra o número na posição 1 desta vezDebug.Print intA (1)End Sub |
Se você executar o procedimento acima, o valor de 5 será exibido na janela imediata e, em seguida, um valor de 8 será exibido depois de redimensionar a matriz usando ReDim e preenchê-la novamente. No entanto, como não populamos IntA (2) e não usamos Re-Dim Preserve, o valor nessa posição na matriz será removido e as posições 3 e 4 na matriz serão zero.
Usando ReDim Preserve
Se usarmos ReDim Preserve, ele manterá os valores originais contidos na matriz.
1234567891011121314151617 | Sub TestDynamicArray ()'declara o arrayDim intA () como inteiroReDim intA (2)'preencher a matriz com númerosintA (0) = 2intA (1) = 5intA (2) = 9'mostra o número na posição 2Debug.Print intA (2)'redim a matrizReDim intA (3)intA (0) = 6intA (1) = 8'mostrar o número na posição 2 novamenteDebug.Print intA (2)End Sub |
Em ambas as caixas de mensagem exibidas acima, o número 9 aparecerá, pois a instrução ReDim Preserve manteve esse valor naquela posição.