【Excel VBA 基础编程】第29讲:数组初相识,数组维度与索引全解析

在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 Integer
    Dim i As Integer, j As Integer
    Dim Items As Integer
    Items = 1
    For i = 1 To 2
        For j = 1 To 3
            arr(i, j) = Items
            Items = Items + 1
        Next j
    Next 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 Variant
    myArray = Array("苹果", "香蕉", "橙子", "西瓜")
    Debug.Print "数组下界(LBound): "; LBound(myArray)
    Debug.Print "数组上界(UBound): "; UBound(myArray)

执行结果如下,索引起始值为0

2.5 使用 [{ }] 常量创建

使用 [{ }] 常量语法创建数组时,其索引值默认从1开始。举例说明:


    Dim varray As Variant
    varray = [{1, "苹果"; 2, "香蕉"; 3, "橙子"}] '分号 (;) 分隔行,逗号 (,) 分隔列
    Debug.Print "第一维(行)下界 (LBound): "; LBound(varray, 1)
    Debug.Print "第二维(列)下界 (LBound): "; LBound(varray, 2)

执行后结果如下:

结束语

今天的知识点比较多,大家要勤加练习慢慢消化哈!

好了,今天的分享到此结束了,咱么下期继续

公众号同时也在不间断地分享免费的编程案例,如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想提升自我,都可以关注我的公众号“努力鸭是黑色的”,解锁更多的VBA技能

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
欸我毛衣呢的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容