VBA – Declarar (Dim), Criar e Inicializar uma Variável de Matriz

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

Daniel Caramello

Last updated on July 28, 2023

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.

option base um

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.

exemplo matriz publica

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.

declarando com dim

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.

resultado janela verificacao

 

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.

vba-free-addin

Exemplos de Add-ins de Códigos VBA

Acesse facilmente todos os exemplos de código que se encontram em nosso site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(Nenhuma instalação necessária!)

Baixe de Graça

Retornar aos Exemplos de Códigos VBA