Excel VBA 编程基础 -- 结构化数据类型(二)- 数组类型(一)
- 2026-11-05 04:04:43
Excel VBA 编程基础 -- 结构化数据类型(二)- 数组类型(一)前面我们讲过用户定义数据类型 UDT,从今天开始讨论数组。 数组类型(array type)是一种由多个相同数据类型的元素组成的新类型,组成数组的元素类型(element type)可以是各种 VBA 的基本类型。组成数组的每一个元素都有一个唯一的索引(index),也就是说,数组是由一组顺序索引元素(sequentially indexed elements)组成的。 由以上定义可以得出如下结论: 下面来看几个例子。 例1. 整数数组 以上代码声明 MyArray 是一个数组类型,含有 10 个元素,其元素类型是 Integer。也就是说,MyArray 是一个包含 10 个整数的数组。 注意:这里我们说 MyArray(9) 是一个含有 10 个元素的数组类型,是因为 VBA 默认数组的下界(即第一个元素的索引)是 0,而 MyArray(9) 中的 9 是数组的上界,因此,MyArray 的元素索引从 0 开始,一直到 9,共有 10 个元素。 VBA 默认数组的下界是 0,这个默认值是可以改的,由 Option Base 控制: VBA 的默认设置是 Option Base 0,你如果需要 VBA 的数组下界是 1 的话,就使用 Option Base 1 来设置,如下: 与 VBA 的其他 Option 设置一样,Option Base 也需要位于文件的起始位置。 如上设置之后,需要要声明 MyArray 是一个含有 10 个 Integer 类型元素的数组类型,则必须声明为 MyArray(10)。这时元素的索引是从 1 到 10。 其中的 For ... Next 循环是对 MyArray 的元素赋值。从这里可以看出,数组的赋值是对数组元素分别赋值。因为数组元素虽然都是同一类型,但可以有不同的值,因此要分别对元素赋值,而且改变某个元素的值并不影响其他元素的值。 例2. 字符串数组 在这个例子中,字符串数组 Names 到底含有多少个元素,由 Option Base 的设置决定。如果没有设定,则 Names 的元素索引从 0 开始,因此 Names 含有 31 个元素。如果使用了 Option Base 1 设定,则 Names 的元素索引从 1 开始,因此 Names 含有 30 个元素。 如果不能肯定数组的下界和上界,则使用 LBound 和 UBound 两个函数来获取数组的下界和上界: 知道了数组的下界和上界,就可以计算出数组的元素个数: 数组的元素个数 n 可以由 UBound 和 LBound 函数计算出来,而不管数组的下界和上界到底是多少。 数组的下界除了由 Option Base 控制之外,还可以在数组声明时指定,从而不受 Option Base 设置的影响。 例3. 自指定下界的数组声明 在这个声明中,MyArray(3 to 5) 表示:数组 MyArray 的下界是 3,上界是 5。从而数组 MyArray 的元素索引为: 3, 4, 5。这个声明不受 Option Base 设置的影响,也就是说,不管 Option Base 如何设置,MyArray 的下界总是 3,上界总是 5。 从这个例子再一次看出,使用 LBound 和 UBound 指定数组的界限,比使用具体的数值,要方便得多。 注意:上面我们多次称呼数组的下界和上界,严格说来,是指数组元素索引的下界和上界。因为数组元素的索引是一个区间,因此存在着下界和上界,也就是数组元素索引从哪个值(下界)开始(标志着数组的第一个元素),到哪个值(上界)结束(标志着数组的最后一个元素)。 相关阅读 Excel VBA 编程基础 -- 结构化数据类型(一)
数组由多个元素组成 数组的每个元素都有相同的数据类型 数组的每个元素都有一个唯一的索引,这个索引就是元素在数组中的相对位置 数组元素的索引是顺序的,也就是说,以第 1 个元素的索引 i1 作为基点: 第 2 个元素的索引 i2 = i1 + 1 第 3 个元素的索引 i3 = i2 + 1 …… 第 n 个元素的索引 i(n) = i(n-1) + 1
由此,一个数组的所有元素的索引组成了一个连续的整数区间 [ i1, ..., i(n) ]。
Dim MyArray(9) As IntegerDim i As IntegerFor i = 0 To 9MyArray(i) = iNext i
Option Base { 0 | 1 }Option Base 1 ' 在文件的起始位置设置...Dim MyArray(10) As IntegerDim i As IntegerFor i = 1 To 10MyArray(i) = iNext i
Dim Names(30) As StringDim i As IntegerFor i = LBound(Names) To UBound(Names)Names(i) = "Hello " + CStr(i)Next i
LBound(Names):返回数组 Names 的下界 UBound(Names):返回数组 Names 的上界
n = UBound(Names) - LBound(Names) + 1Dim MyArray(3 to 5) As IntegerDim i As IntegerFor i = LBound(MyArray) To UBound(MyArray)MyArray(i) = i * iNext i
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。