VBA中的数组函数能帮我们高效处理数据,接下来整理了10种常用函数及其用途,供大家参考使用

Array
Array函数是创建数组最直接的方式,并且数组元素可以是不同类型。需要注意的是Array函数只能创建一维常量数组
示例1:创建同类型的元素
Dim myNumbers As VariantmyNumbers = Array(10, 20, 30, 40)
提醒:使用Array函数创建数组时,须使用Variant类型的变量来接收结果。这是因为Array函数的设计初衷就是返回一个包含数组的特殊Variant
示例2:创建不同类型的数组元素
Dim myArray As Variant' 创建包含数字、文本、日期等不同数据类型的数组myArray = Array(100, "小明", Date, 3.14)
结果:

VBA的Array函数提供的这种“异构”数组,打破了对数组必须类型一致的常规认知。它通过Variant这个万能容器实现了灵活性,非常适用于数据来源多样、需要快速组装的场景。虽然会牺牲一些性能,但在合适的场景下,它能极大地提高代码的编写效率

Evaluate
Evaluate函数比Array函数强大得多,既可以创建一维常量数组,也可以创建二维常量数组。基本语法是 Evaluate(Name),其中 Name 参数是一个字符串,其表示规则:
一维横向数组:元素间使用逗号分隔
一维纵向数组:元素间使用分号分隔
二维数组:同行元素用逗号,不同行用分号
文本元素:需要用两个半角双引号包围
示例3:创建一维横向数组
Dim arrHorizontal As Variant' 创建一维横向数组(数字)arrHorizontal = Evaluate("{1,2,3,4,5}")
当然,Evaluate函数还有一种简洁的方括号 [] 写法,因此上述代码也可以改成:
Dim arrHorizontal As Variant' 创建一维横向数组(数字)arrHorizontal = [{1,2,3,4,5}]
示例4:创建一维纵向数组
Dim arrVertical As VariantarrVertical = Evaluate("{1;2;3;4;5}")
示例5:创建二维数组
Dim arr2D As Variantarr2D = Evaluate("{""张振"",25,""男"";""王琳"",30,""女""}")
以上代码会创建两行三列数组,以下是结构示例:
|
行号 |
第1列 (姓名) |
第2列 (年龄) |
第3列 (性别) |
|
第1行 |
张振 |
25 |
男 |
|
第2行 |
王琳 |
30 |
女 |
代码中数组存储结构如下:


IsArray
IsArray函数用于判断一个变量是否为数组,它能帮助我们编写更灵活、安全的代码,特别是在处理可能包含数组的Variant变量时
基本语法:IsArray(varname)
参数varname是任何需要检查的变量名
返回值为Boolean类型(布尔值)。如果变量是数组,返回True;否则返回False
假如我们想根据变量arr2D是否是数组,然后选择执行不同的操作,可以参考如下代码:
示例6:
If IsArray(arr2D) ThenDebug.Print "是数组"ElseDebug.Print "不是数组"End If

Split
Split函数可以将字符串按指定的分隔符转换成下标为0的一维数组。它的语法如下:
Split(expression[, delimiter[, limit[, compare]]])
其中:
Expression被拆分的字符串,为必需参数。如果为空字符串””,则返回一个包含一个空字符串的数组
Delimiter分隔符,非必需参数。用于指示在何处拆分字符串。如果省略,则使用空格作为分隔符
Limit指定返回的子字符串最大数量,非必需参数。默认值 -1 表示返回所有子字符串
Compare指定字符串比较方式,非必需参数。vbBinaryCompare(0,区分大小写)或 vbTextCompare(1,不区分大小写),默认值vbBinaryCompare
示例7:使用默认分隔符(空格)
Dim words() As Stringwords = Split("This is a good idea")
拆分后结果如下:

示例8:使用自定义分隔符,如逗号
Dim words() As Stringwords = Split("苹果,香蕉,橙子,葡萄", ",")
拆分后结果如下:


Join
Join函数可用于连接数组中的所有子字符串从而创建一个新的字符串,可随意指定分隔符,其语法如下:
Join(sourcearray[, delimiter])
其中参数sourcearray代表数组,参数代表分隔符,如果忽略分隔符,则默认采用空格作为分隔符
示例9:将数组中元素按照符号”-“链接在一起
Dim words() As VariantDim strResult As Stringwords = Array("苹果", "橙子", "香蕉", "葡萄")strResult = Join(words, "-")Debug.Print strResult
执行后结果如下:


Filter
根据条件筛选一维数组,返回新数组
示例10:单条件包含筛选
Dim arrOriginal As VariantDim arrFiltered As Variant' 原始数组arrOriginal = Array("张三", "李四", "张五", "王五", "张伟")' 筛选所有包含"张"的姓名arrFiltered = Filter(arrOriginal, "张", True)
执行后arrFiltered内容如下:

示例11: 排除筛选
Dim arrOriginal As VariantDim arrFiltered As Variant' 原始数组arrOriginal = Array("张三", "李四", "张五", "王五", "张伟")' 筛选所有非"张"的姓名arrFiltered = Filter(arrOriginal, "张", False)
执行后arrFiltered内容如下:

总之,第三个参数值为True返回包含匹配项的数组;False则返回不包含匹配项的数组

WorksheetFunction.Index
WorksheetFunction.Index 方法在 VBA 中非常实用,它能让我们从数组中精确提取所需的数据
示例12:从arrData数组中获取某一行/一列的数据
Dim arrData As VariantDim rowData As Variant, colData As VariantarrData = Evaluate("{""张振"",25,""男"";""王琳"",30,""女""}")' 获取第2行的所有数据(返回一维数组)rowData = Application.WorksheetFunction.Index(arrData, 2, 0)' 获取第2列的所有数据(返回二维数组)colData = Application.WorksheetFunction.Index(arrData, 0, 2)
执行后结果如下:


WorksheetFunction.Transpose
WorksheetFunction.Transpose 函数的核心功能是将数组的行和列互换
示例13:一维横向数组转纵向
Dim arrHorizontal As VariantDim arrVertical As Variant' 创建一个一维横向数组arrHorizontal = Array("苹果", "香蕉", "橙子", "葡萄")arrVertical = Application.WorksheetFunction.Transpose(arrHorizontal)
执行后结果如下:

示例14:二维数组转置
Dim arrHorizontal As VariantDim arrVertical As Variant' 创建一个二维数组arrHorizontal = Evaluate("{""张振"",25,""男"";""王琳"",30,""女""}")arrVertical = Application.WorksheetFunction.Transpose(arrHorizontal)
执行后结果如下:


LBound / UBound
LBound和UBound函数是处理数组时非常重要的工具,用于确定数组各维度的下界(起始索引)和上界(结束索引)
示例15:计算一维数组 元素总数
MyArray
UBound(MyArray) - LBound(MyArray) + 1
示例16:获取多维数组中第二维上、下界
Lower = LBound(arrData, 2)Upper = UBound(arrData, 2)
因此,在 For 循环中使用 LBound 和 UBound 来控制循环范围,这样无论数组的下界如何设置,代码都能正确运行,增强了程序的健壮性
好了,今天的分享到此结束了,咱么下期继续
公众号同时也在不间断地分享免费的编程案例,如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想提升自我,都可以关注我的公众号“努力鸭是黑色的”,解锁更多的VBA技能






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










暂无评论内容