VBA数组 Redim 动态数组

1 动态数组需求说明

先回顾数组声明语法中:

Dim 数组变量名称(最大下标) As 元素数据类型

最大下标不能为变量,只能为常量或常量表达式。


示例:

Sub array7()
  '动态数组需求
  Dim i As Integer
  i = 10
  Dim arr1(i) As Integer '运行报错:要求常数表达式
End Sub

普通数组为固定数组,也称为静态数组。

声明变量时,最大(小)下标为变量的数组,则称为动态数组,需要通过Redim实现。


2 动态数组声明语法

ReDim 数组变量名称(变量) As 元素数据类型

下标为变量。


示例:

Sub array8()
  Dim i As Integer
  i = 10
  'Redim声明动态数组,下标可以为变量
  ReDim arr1(i) As Integer
  
  arr1(0) = 100
  arr1(10) = 1000
  Debug.Print arr1(0) & "," & arr1(10) 

  i = 100

  '再次执行Redim,重新分配大小。所有数据会自动清空。
  ReDim arr1(i) As Integer
   arr1(100) = 9999
   Debug.Print arr1(0) & "," & arr1(100)  

End Sub

运行结果:

100,1000
0,9999

第1次Redim后:第1个元素的值原先为100;

第2次Redim后:第1个元素的值被清空为0。


3 Preserve保留原有数据

默认情况,再次Redim会自动清空已有数据,如果需要保留,可使用Preserve关键字。

语法

ReDim Preserve 数组变量名称(变量) As 元素数据类型

示例代码:

Sub array9()
  Dim i As Integer
  i = 10

  ReDim arr1(i) As Integer

  arr1(0) = 100
  arr1(10) = 1000
  Debug.Print arr1(0) & "," & arr1(10)

  i = 100
  ' Preserve已有数据会保留。
  ReDim Preserve arr1(i) As Integer
   arr1(100) = 9999
   Debug.Print arr1(0) & "," & arr1(100)

End Sub

运行结果:

100,1000
100,9999

第1次Redim后:第1个元素的值原先为100;

第2次Redim后:仍然保留值100。