09 数组¶
在 VBA 编程中,数组(Array)是非常重要的基础数据结构。一旦数据量稍大,或者涉及批量处理、性能优化,数组几乎是绕不开的。一句话总结数组的价值:能用数组解决的问题,就尽量不要逐个单元格操作。(耗时又繁琐)
一、什么是数组?¶
数组是一组 按索引顺序存储的数据集合,可以理解为:一维数组就是一排数据,而二维数组就是一个表格,我们可以通过以下方式生成数组:
(1)使用 Array 函数
(2)从单元格区域直接读入数组
(3)通过直接的括号定义数组
-
一维数组声明:
Dim arr(1 To 5) As Integer,表示一个长度为 5 的数组,下标从 1 到 5。 -
不指定下标声明:
Dim arr(5) As Integer,表示一个长度为 6 的数组,默认下标是从0到5,这个特别注意 -
声明二维数组:
dim arr(1 to 3,1 to 4),比如这样就声明了一个3行4列的数组,强烈建议把上下界写清楚
二、数组的上下界和动态数组¶
定义了数组之后,我们就可以通过LBound(arr)来获取数组的下界,通过UBound(arr)来获取上界,如要遍历则写作:
如果怕搞错数组的维度,记住 永远不要假设数组从 0 或 1 开始,而是用 LBound / UBound,同样很多时候数据的大小并不是固定的,因此我们不能在程序一开始就给定数组的大小,因为如果少了,则数据一多就放不下,多了的话,就会浪费很多的内存,因此 动态数组 的重要性就体现出来了,它支持根据数据多少动态变化数组大小,比如程序一开始我们定义:
Redim分配空间,如下分配了10个数据的位置:
如果要保留源数据,我们需要使用 ReDim Preserve,如下这样既开拓了区域,也保留了原来的内容
另外需要注意的是:
Redim支持变量和常量:比如Redim arr(1 to 3)和Redim arr(1 to n)都是可以的(这里n是变量)Dim只支持常量:Dim arr(1 to n)的写法就是错误的,即使你已经定义了n=3,但Dim还是不支持- 如果想要清空数组,可以使用
Erase arr实现,这样表格的大小还存在,但是其内容全部被清空
三、详谈二维数组¶
由于在表格中我们对二维数组的使用更多,因此这里单开一节,着重讲一下二维数组的使用方法,我们通过以下方式声明一个3行4列的二维数组:Dim arr(1 To 3, 1 To 4) As Variant,根据行索引和列索引我们可以访问每个元素并赋值:
Lbound(arr,n) 这里的第二个值代表的是第几维的意思
Resize方法,来实现动态填入,例如:
四、数组中常用的 Split / Filter / Join 方法¶
在 VBA 中,数组并不只是用来“存数据”,很多时候它承担的是 字符串批量处理 的角色。其中最常用、也最值得掌握的三个方法就是:Split(拆分) / Filter(筛选) / Join(拼接)
1、Split —— 字符串拆分成数组¶
Split 用于 按指定分隔符,将字符串拆分成数组。返回值是一个下标从0开始的 一维 Variant 数组。其基本语法为:
Split(
expression,delimiter,limit,compare)
expression:字符串表达式delimiter:分隔符号limit:最多返回的个数,比如“a,b,c,d”按逗号分隔,如limit=3,则拆分为a,b和c,d三个部分,最后一个不拆分compare:表示拆分符号是否区分大小写,vbBinaryCompare(0)表示区分,vbTextCompare(1)表示不区分
常用的只有前两个参数,比如我们看一个最基础示例:
结果:arr(0) = "A",arr(1) = "B",arr(2) = "C"
2、Filter —— 从数组中筛选符合条件的元素¶
Filter 用于 从一维字符串数组中筛选包含指定内容的元素,只能用于 一维字符串数组。语法结构如下:
Filter(
sourcearray,match,include,compare)
sourcearray:表示待筛选的数组(1维)match:表示要匹配的子字符串include:为True(包含),为False(不包含), 默认是筛选包含的compare:表示是否区分大小写,vbBinaryCompare(0)表示区分,vbTextCompare(1)表示不区分
来看一个最简单的师范,如下代码,得到的结果是:result(0) = "上海",只有一个符合条件:
而如果是排除匹配项,使用 result = Filter(arr, "上", False),则 筛选不包含“上”的元素
3、Join —— 将数组拼接成字符串¶
Join 用于 将一维字符串数组合并成一个字符串。其基本语法为:
Join(
sourcearray,delimiter)
sourcearray:一个一维的字符串数组,注意必须是一维的delimiter:连接符号,可以不填,默认是空格
看一个最简单的示例,以下这段代码返回结果 A,B,C:
本期给大家总结了VBA中数组的常见属性和方法,以供参考