VBA – Declarar (Dim), Criar e Inicializar uma Variável de Matriz
In this Article
Este tutorial demonstrará como declarar (Dim), criar e inicializar variáveis de matriz no VBA
O Que é uma Variável de Matriz do VBA?
Uma variável de matriz do 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 matriz da mesma forma que declararia qualquer outra variável, usando a palavra-chave Dim, Static, Public ou Private.
Matrizes Estáticas
Há dois 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 é chamada de matriz fixa.
Dim intA(4) as integer
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 termos inserido 4 na matriz. Isso ocorre porque os índices de matriz começam automaticamente em zero.
Índices de matriz
Os índices de matriz começam automaticamente em zero, a menos que a Option Base 1 seja declarada na parte superior de seu módulo de código.
Se Option Base 1 for declarada, as matrizes começarão automaticamente em 1.
No entanto, acho que declarar variáveis dessa 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 da Option Base 1
Em vez disso, prefiro declarar explicitamente as posições inicial e final dos arrays:
Dim intA(2 a 5) as integer
Observe que, ao fazer isso, você pode iniciar o array em qualquer número (não apenas em 1 ou 0).
Matrizes Dinâmicas
Uma variável Matriz Dinâmica é uma matriz cujo tamanho pode ser alterado em tempo de execução. Você declara variáveis dinâmicas sem um tamanho.
Dim intA() as integer
Você pode usar a instrução ReDim para especificar o tamanho da matriz após a criação da matriz.
ReDim intA(2)
Você pode redimensionar uma matriz dinâmica a qualquer momento. Entretanto, ao usar a instrução ReDim, todos os valores existentes são apagados. Para preservar os valores de matriz existentes, use ReDim Preserve.
ReDim Preserve intA(2)
Você pode declarar uma matriz dinâmica em um procedimento, módulo ou nível global, mas só pode usar a instrução ReDim em um procedimento.
Matrizes Tipo Variant
As Matrizes tipo Variant são matrizes dinâmicas que são mais fáceis de trabalhar.
Dim varNomes()
Observe que você não precisa especificar o tipo de dados (presume-se que seja variante) nem o tamanho da matriz.
Como veremos a seguir, você pode inicializar matrizes tipo variant usando a função Array (não é necessário redimensionar as matrizes primeiro)!
Declarar Módulo e Matrizes Públicas
Como mostrado acima, as matrizes podem ser declaradas dentro de procedimentos, para uso dentro desse procedimento:
Sub MatrizEstatica()
'declarar a matriz com um valor LBound de 1 e um valor UBound de 4
Dim IntA(1 to 4) as Integer
End Sub
Mas eles também podem ser declarados em nível de módulo ou global.
Option Explicit
'declarar a matriz com um valor LBound de 1 e um valor UBound de 4
Dim IntA(1 to 4) as Integer
Sub MatrizEstatica()
End Sub
Nesse exemplo, a variável de matriz pode ser chamada em qualquer lugar dentro desse módulo de código. Em vez disso, você pode declarar uma matriz pública que pode ser usada em todo o seu projeto VBA (consulte a próxima seção).
Declaração de uma matriz pública
Você declara uma matriz estática pública da mesma forma que declararia uma variável pública.
Public strNomes(3) as String
Essa declaração precisaria ser colocada na parte superior do módulo, abaixo de Option Explicit. Em seguida, ela poderia ser usada em todo o seu projeto VBA em qualquer módulo ou procedimento.
Se você declarar a matriz na parte superior do módulo, mas com a palavra-chave Dim, o uso desse array ficará restrito a esse módulo individual. A tentativa de usar a matriz em um módulo separado resultaria em um erro.
Inicialização de Matrizes
Você pode atribuir valores a uma matriz estática da seguinte forma.
Sub MatrizEstatica()
'declarar a matriz com um valor LBound de 1 e um valor UBound de 4
Dim IntA(1 to 4) as Integer
'inicializar a matriz
IntA(1) = 10
IntA(2) = 20
IntA(3) = 30
IntA(4) = 40
'mostrar o resultado da posição 2 da matriz na janela de verificação imediata
Debug.Print IntA(2)
End Sub
Se você executar o procedimento acima, o valor de 20 será exibido na janela de verificação imediata.
Você também pode atribuir os valores a uma matriz dinâmica da mesma forma
Sub MatrizDinamica()
'declarar uma matriz dinâmica, mas omitindo os valores limites
Dim IntA() as Integer
'inicializar a matriz
ReDim IntA(1 to 4)
IntA(1) = 10
IntA(2) = 20
IntA(3) = 30
IntA(4) = 40
'mostrar o resultado da posição 2 da matriz na janela de verificação imediata
Debug.Print IntA(2)
End Sub
Função de Matriz
Entretanto, somente com a matriz tipo variant, você pode usar a função Array, que pode ser mais fácil do que usar o método padrão.
'Preencher a matriz
intA() = Array(10, 20, 30, 40)
Preencher a Matriz com Loop
Você também pode preencher matrizes fazendo um loop em um intervalo de células no Excel
Sub TestarMatrizDinamicaDoExcel()
'declarar a matriz
Dim strNomes() As String
'declarar um número inteiro para contar as linhas em um intervalo
Dim n As Integer
'declarar um número inteiro para o loop
Dim i As Integer
'contar as linhas em um intervalo
n = Range("A1", Range("A1").End(xlDown)).Rows.Count
'redimensionar a matriz para a quantidade de linhas no intervalo.
ReDim strNomes(n)
For i = 0 To n
strNomes(i) = Range("A1").Offset(i, 0)
Next i
'mostrar os valores na matriz
MsgBox Join(strNomes())
End Sub
Reinicializar Matrizes
Você pode reinicializar sua matriz em qualquer estágio do código, mas perderá o valor original contido naquela posição da matriz.
Sub MatrizEstatica()
'declarar a matriz com um valor LBound de 1 e um valor UBound de 4
Dim IntA(1 to 4) as Integer
'inicializar a matriz
IntA(1) = 10
IntA(2) = 20
IntA(3) = 30
IntA(4) = 40
'mostre o resultado da posição 2 da matriz na janela imediata
Debug.Print IntA(2)
'inicializar a matriz novamente
intA(2)= 200
Debug.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 será alterado para 200.
Uso do ReDim
Se você estiver usando uma matriz dinâmica, a instrução ReDim será usada para definir o tamanho da matriz. Você pode usar a instrução ReDim posteriormente em seu código para alterar o tamanho da matriz quantas vezes forem necessárias. A linha de código abaixo reinicializará a matriz intA para ter um tamanho de 2 (lembre-se: um índice de matriz começa em 0!)
ReDim intA(1) as Integer
Portanto, o código que inclui a instrução ReDim seria parecido com o exemplo abaixo.
Sub TestarMatrizDinamica()
'declarar a matriz
Dim intA() As Integer
ReDim intA(2)
'preencher a matriz com números
intA(0) = 2
intA(1) = 5
intA(2) = 9
'mostrar o número na posição 1
Debug.Print intA(1)
'redimensionar a matriz para alterar o tamanho
ReDim intA(3)
intA(0) = 6
intA(1) = 8
'mostrar o número na posição 1 desta vez
Debug.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 que redimensionarmos a matriz usando ReDim e a preenchermos novamente. Entretanto, como não preenchemos IntA(2) e não usamos ReDim Preserve, o valor nessa posição da matriz será removido e as posições 3 e 4 da matriz serão zero.
Uso de ReDim Preserve
Se usarmos ReDim Preserve, ele manterá os valores originais contidos na matriz.
Sub TestarMatrizDinamica()
'declarar a matriz
Dim intA() As Integer
ReDim intA(2)
'preencher a matriz com números
intA(0) = 2
intA(1) = 5
intA(2) = 9
'mostrar o número na posição 2
Debug.Print intA(2)
'redimensionar a matriz
ReDim Preserve intA(3)
intA(0) = 6
intA(1) = 8
'mostrar o número na posição 2 novamente
Debug.Print intA(2)
End Sub
Em ambas as caixas de mensagem exibidas acima, o número 9 aparecerá porque a instrução ReDim Preserve manteve esse valor nessa posição.