【Excel VBA 基础编程】第31讲:深入掌握这10个核心数组函数,让代码更优秀

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

Array

Array函数是创建数组最直接的方式,并且数组元素可以是不同类型。需要注意的是Array函数只能创建一维常量数组

示例1:创建同类型的元素


    Dim myNumbers As Variant
    myNumbers = 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 Variant
arrVertical = Evaluate("{1;2;3;4;5}")

示例5:创建二维数组


    Dim arr2D As Variant
    arr2D = Evaluate("{""张振"",25,""男"";""王琳"",30,""女""}")

以上代码会创建两行三列数组,以下是结构示例:

行号

第1列 (姓名)

第2列 (年龄)

第3列 (性别)

第1行

张振

25

第2行

王琳

30

代码中数组存储结构如下:

 IsArray

IsArray函数用于判断一个变量是否为数组,它能帮助我们编写更灵活、安全的代码,特别是在处理可能包含数组的Variant变量时

基本语法:IsArray(varname)

参数varname是任何需要检查的变量名

返回值为Boolean类型(布尔值)。如果变量是数组,返回True;否则返回False

假如我们想根据变量arr2D是否是数组,然后选择执行不同的操作,可以参考如下代码:

示例6:


   If IsArray(arr2D) Then
        Debug.Print "是数组"
   Else
        Debug.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 String
    words = Split("This is a good idea")

拆分后结果如下:

示例8:使用自定义分隔符,如逗号


    Dim words() As String
    words = Split("苹果,香蕉,橙子,葡萄", ",")

拆分后结果如下:

Join

Join函数可用于连接数组中的所有子字符串从而创建一个新的字符串,可随意指定分隔符,其语法如下:

Join(sourcearray[, delimiter])

其中参数sourcearray代表数组,参数代表分隔符,如果忽略分隔符,则默认采用空格作为分隔符

示例9:将数组中元素按照符号”-“链接在一起


    Dim words() As Variant
    Dim strResult As String
    words = Array("苹果", "橙子", "香蕉", "葡萄")
    strResult = Join(words, "-")
    Debug.Print strResult

执行后结果如下:

Filter

根据条件筛选一维数组,返回新数组

示例10:单条件包含筛选


    Dim arrOriginal As Variant
    Dim arrFiltered As Variant
    ' 原始数组
    arrOriginal = Array("张三", "李四", "张五", "王五", "张伟")
    ' 筛选所有包含"张"的姓名
    arrFiltered = Filter(arrOriginal, "张", True)

执行后arrFiltered内容如下:

示例11: 排除筛选


    Dim arrOriginal As Variant
    Dim arrFiltered As Variant
    ' 原始数组
    arrOriginal = Array("张三", "李四", "张五", "王五", "张伟")
    ' 筛选所有非"张"的姓名
    arrFiltered = Filter(arrOriginal, "张", False)

执行后arrFiltered内容如下:

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

WorksheetFunction.Index

WorksheetFunction.Index 方法在 VBA 中非常实用,它能让我们从数组中精确提取所需的数据

示例12:从arrData数组中获取某一行/一列的数据


    Dim arrData As Variant
    Dim rowData As Variant, colData As Variant
    arrData = 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 Variant
    Dim arrVertical As Variant
    ' 创建一个一维横向数组
    arrHorizontal = Array("苹果", "香蕉", "橙子", "葡萄")
    arrVertical = Application.WorksheetFunction.Transpose(arrHorizontal)

执行后结果如下:

示例14:二维数组转置


    Dim arrHorizontal As Variant
    Dim 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技能

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容