在Excel VBA编程中,数组是数据处理的核心工具。理解其维度与索引范围,是编写高效、健壮代码的关键

数组维度
数组支持一维到六十维,不过常用的是一维数组和二维数组
1.1 一维线性结构
一维数组是编程中最基础的数据结构之一,它就像一排连续排列的盒子,每个盒子可以放一个数据,并且它们都有一个唯一的编号(称为索引或下标)。具有以下特点:
结构线性排列的元素序列,类似于一排座位、一列火车车厢
元素每个位置存放一个数据,这些数据的类型通常相同
索引用于访问数组元素的位置编号,通常从0或1开始
存储在内存中占据一块连续的空间
为了更直观地理解,我们可以用图形来表示一维数组。假设有一个名为 Scores 的一维数组,它存储了5位学生的成绩:67, 89, 97, 50, 71
我们使用基本的方块图表示,这种表示方式非常直观地体现了数组在内存中连续存储的特性,并清晰地展示了数组的索引和每个位置对应的值:

这么看来,是不是很像工作表中一行或是一列区域数据了呢?总之,一维数组的核心就是“一个索引,一串数据,连续存储”。图形化的表示方法,都能帮助我们更好地理解和分析数组中的数据
1.2 二维表格布局
二维数组就像一个“数据表格”,有行有列,特别适合存放像Excel表格、棋盘、数字图像这类规整的数据。其数据特点是:
逻辑结构是表格,物理存储是线性的:我们虽然可以把二维数组想象成一个表格,但在计算机内存中,它的所有元素是连续存放的。大多数语言采用行优先(Row-Major)存储,即先存完第一行,再存第二行,以此类推
可以看作“数组的数组”:一个二维数组本质上是由多个一维数组组成的。例如,一个3行4列的数组,可以理解为它包含了3个元素,每个元素本身都是一个长度为4的一维数组
默认情况下,二维表格布局及位置可参考如下简图:

关于VBA中二维是否行优先(Row-Major)存储,我们可以通过以下代码加以验证:
Dim arr(1 To 2, 1 To 3) As IntegerDim i As Integer, j As IntegerDim Items As IntegerItems = 1For i = 1 To 2For j = 1 To 3arr(i, j) = ItemsItems = Items + 1Next jNext i
执行后arr数组内容:

转换成表格布局显示如下:

此时,大家有没有发现一个问题:二维表中首个元素的位置是(1,1),而不是(0,0)。这就牵扯到另一个知识点“索引及范围的定义”

索引范围
VBA 中数组的索引(下标)起始值并非一成不变的,接下来总结了5种影响数组索引起始值变化的场景
2.1 常规声明
一维数组声明的基本语法如下:
Dim 数组名([下界 To ]上界) As 数据类型
二维数组声明的基本语法如下:
Dim 数组名([下界1 To] 上界1, [下界2 To] 上界2) As 数据类型
因此声明数组时有”显式指定上下界”和”仅指定上界”这两种方法,接下来以二维数组为例加以说明:
显式指定上下界这种方式非常直观,可以避免默认下界引起的混淆。使用 下界 To 上界 的格式,可以精确控制索引的起始位置。例如,创建一个名为matrix的5行3列的Double类型的数组,索引均从1开始:
Dim matrix(1 To 5, 1 To 3) As Double ' 声明5行3列的Double数组
如果只给出索引的上界,VBA会使用默认的下界。默认下界通常为0。而以下语句声明的是一个 4行8列 的整形数组(索引范围:行 0 to 3,列 0 to 7),索引均从0开始:
Dim myArray(3, 7) As Integer
此时,我们就能轻松解答二维数组arr索引起始值的问题了
2.2 使用 Option Base 1 声明
Option Base 1 语句用于将数组的默认起始索引(下界)从0改为1,这尤其适合习惯从1开始计数的场景。需要注意Option Base 1 必须放在VBA模块顶部进行声明
以Dim myArray(3, 7) As Integer为例加以说明,使用Option Base 1的结果如下,默认从1开始,是3行7列

注释/去掉Option Base 1之后的结果如下,默认从0开始,因此是4行8列

2.3 从 Excel 单元格区域赋值
当我们将Excel单元格区域的值直接赋值给一个Variant变量时,所生成的数组其索引的默认下界(起始值)是1,而不是VBA中通常默认的0
举例说明:
Dim varArray As Variant
varArray = ActiveSheet.Range("A1:C5").value '赋值
Debug.Print "第一维(行)的索引范围:"; LBound(varArray, 1); " To "; UBound(varArray, 1)
Debug.Print "第二维(列)的索引范围:"; LBound(varArray, 2); " To "; UBound(varArray, 2)
执行后结果:

2.4 使用 Array 函数创建
使用 Array 函数创建的数组,其默认索引起始值(下界)是 0。举例说明:
Dim myArray As VariantmyArray = Array("苹果", "香蕉", "橙子", "西瓜")Debug.Print "数组下界(LBound): "; LBound(myArray)Debug.Print "数组上界(UBound): "; UBound(myArray)
执行结果如下,索引起始值为0

2.5 使用 [{ }] 常量创建
使用 [{ }] 常量语法创建数组时,其索引值默认从1开始。举例说明:
Dim varray As Variantvarray = [{1, "苹果"; 2, "香蕉"; 3, "橙子"}] '分号 (;) 分隔行,逗号 (,) 分隔列Debug.Print "第一维(行)下界 (LBound): "; LBound(varray, 1)Debug.Print "第二维(列)下界 (LBound): "; LBound(varray, 2)
执行后结果如下:


结束语
今天的知识点比较多,大家要勤加练习慢慢消化哈!
好了,今天的分享到此结束了,咱么下期继续
公众号同时也在不间断地分享免费的编程案例,如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想提升自我,都可以关注我的公众号“努力鸭是黑色的”,解锁更多的VBA技能





![[C++探索之旅] 第一部分第十一课:小练习,猜单词 - 鹿快](https://img.lukuai.com/blogimg/20251015/da217e2245754101b3d2ef80869e9de2.jpg)










暂无评论内容