学习Excel技术,关注微信公众号:
excelperfect
数组是一种常用的数据结构,可用来存储一组相同类型的数据,你可以将一个数组变量视为一个迷你的电子表格,通过引用数组中的位置来存储或者获取数据。
下图1所示的示例是一个名为MyArray的一维数组,包含有6个元素。注意,数组的索引通常从0开始。

图1
下图2所示的示例是一个名为MyArray的3×4二维数组,包含有12个元素,像不像一个电子表格。注意,其行列的基准值都是从0开始的。

图2
当然,还可以使用三维甚至更高维度的数组,但我们最常使用的是一维数组或二维数组。如果你想详细学习数组的相关知识,可参阅相关文章:
Excel VBA解读|进阶篇(152):数据结构——谈谈数组
Excel VBA解读|进阶篇(153):数据结构——基本的数组操作
Excel VBA解读|进阶篇(154):数据结构——数组常用操作示例代码
Excel VBA解读|进阶篇(155):数据结构——数组相关的函数
VBA进阶|数组基础01:用最浅显的介绍来帮你认识数组
VBA进阶|数组基础02:简单的数组操作
……等等系列文章
快速了解数组后,我们来讲解在存储数据时动态调整数组大小的一些方法。
方法1:预先调整数组大小
在数组中存储数据之前,将数组大小调整为所要存储的数据数量。这非常适合事先知道需要存储的数据有多少的情形。
Sub PopulateArray1()
Dim MyArray() As Variant
Dim rngData As Range
Dim rng As Range
Dim i As Long
'确定要存储的数据
Set rngData = ActiveSheet.UsedRange
'在存储数据前调整数组大小
ReDim MyArray(rngData.Cells.Count)
'遍历单元格并在数组中存储数据
For Each rng In rngData.Cells
MyArray(i) = rng.Value
i = i + 1
Next rng
End Sub方法2:随时调整数组大小
VBA在调整数组大小时,会清除掉原先存储的数据。如果调整数组大小的同时,想要保留之前存储在数组中的数据,则需要使用Preserve关键字,告诉VBA在增加数组存储容量时,保留原来存储在数组中的数据。
Sub PopulateArray2()
Dim MyArray() As Variant
Dim rngData As Range
Dim rng As Range
Dim i As Long
'确定要存储的数据
Set rngData = ActiveSheet.UsedRange
'遍历单元格区域并在数组中存储数据
For Each rng In rngData.Cells
ReDim Preserve MyArray(i)
MyArray(i) = rng.Value
i = i + 1
Next rng
End Sub方法3:从带有分隔符的字符串中创建数组
分隔符是用于分隔数值的指定字符,例如CSV文件就是由逗号分隔的值组成的文件,我们可以将由分隔符组成的字符串拆分成数组。例如,下面的代码首先将数值转换成由“;|;”分隔成的字符串,然后将该字符串转换成数组。
Sub PopulateArray3()
Dim MyArray As Variant
Dim myString As String
Dim rngData As Range
Dim rng As Range
'确定要存储的数据
Set rngData =ActiveSheet.Range("C1:C100")
'遍历单元格区域并以指定的分隔符连接数值
'并将其存储在字符串中
For Each rng In rngData.Cells
myString = myString &";|;" & rng.Value
Next rng
'移除字符串末尾的分隔符(;|;)
myString = Right(myString, Len(myString) - 3)
'使用Split函数创建数组
MyArray = Split(myString, ";|;")
End Sub如果已经有一个带分隔符的字符串,那么可以使用代码很方便地将其拆分成数组:
Sub PopulateArray4()
Dim MyArray As Variant
Dim myString As String
'使用分隔符的字符串
myString = "一年级;|;二年级;|;三年级;|;四年级;|;五年级;|;六年级"
'使用Split函数创建数组
MyArray = Split(myString, ";|;")
End Sub方法4:直接赋值
可以直接将单元格区域赋值给数组变量来创建数组:
Sub PopulateArray5-1()
Dim MyArray() As Variant
'创建数组
MyArray =Application.Transpose(Range("A1:A6"))
End Sub还可以创建二维数组:
Sub PopulateArray5-2()
Dim MyArray() As Variant
'创建数组
MyArray = Range("A1:D3")
End Sub方法5:从表中提取数据直接创建数组
这个方法在表中的数据变化时,代码仍正常运行,也就是说,表使数组也具有了自动扩展功能。
Sub PopulateArray6()
Dim MyArray() As Variant
Dim myTable As ListObject
'设置表变量
SetmyTable = ActiveSheet.ListObjects("表1")
'创建数组
MyArray =Application.Transpose(myTable.DataBodyRange.Columns(1))
End Sub注意,方法4和方法5创建的数组其索引从1开始。