Excel精英培训网

 找回密码
 注册
查看: 8500|回复: 1

一些有用的在VBA中处理数组的函数

[复制链接]
发表于 2012-3-29 10:02 | 显示全部楼层 |阅读模式
Array函数
Array函数是一种使用值创建和填充数组的方法。将所有的值作为参数传递给该函数,返回一个使用这些值作为元素的一维数组,数组值的顺序和传递给函数的数值的顺序相同。第一个元素的索引值总是0,不依赖任何Option Base设置。

Sub TestArray()
    Dim myArray() As Variant

    '从逗号分隔的字符串列表中创建数组
    myArray = Array("One", "Two", "Three")
    '显示数组元素
    MsgBox myArray(0) & vbCr & myArray(1) & vbCr & myArray(2)
    '也可以使用数值作为参数
    myArray = Array(10, 20, 30)
    '显示数组元素
    MsgBox myArray(0) & vbCr & myArray(1) & vbCr & myArray(2)
End Sub
Array函数总是返回Variant类型的数组,但元素的数据类型可以不同,取决于传递给该函数的数值的类型。
例如,Array(“One”, 2, 3.4)返回的数组,第一个元素是String类型,第二个元素是Integer型,最后一个元素是Double型。
如果没有传递参数给Array函数,那么将返回一个空数组。此时,数组的上界为-1,小于下界(总为0)。例如,

UBound(Array())
将返回-1。
更多内容参见:Array函数。

Split函数
如果所有的值都不是分开的,而是在一个字符串中,那么可以使用Split函数分开它们并创建一个一维字符串数组。同样,结果数组的索引值总是以0开始。
可以指定字符串中分离值的分隔符,例如,逗号或分号。如果没有指定分隔符,那么将通过空格分离字符串。
如果将一个空字符串传递给Split函数,那么将返回一个空数组。与Array函数一样,如果为空则返回的数组上界为-1。
当给Split函数传递一个字符串且没有包含分隔符时,不会获得一个空数组。此时,返回的数组包含一个元素,就是字符串本身。
Split函数功能相对的函数是Join函数。该函数接受一组字符串作为参数,并返回包含数组所有元素所组成的字符串。可以指定分隔符,这样将在每个值之间添加该分隔符。
如果给Join函数传递一个空数组,那么将返回一个空字符串。

Sub TestSplitJoin()
    Dim myStr As String
    Dim myArray() As String

    '由逗号分隔的字符
    myStr = "A1,B2,C3"
    '将字符串分成一组子字符串
    myArray = Split(myStr, ",")
    '显示数组元素
    MsgBox myArray(0) & vbCr & myArray(1) & vbCr & myArray(2)
    '将数组的所有元素合成一个字符串
    '使用 " and " 连接
    myStr = Join(myArray, " and ")
    '显示字符串
    MsgBox myStr
End Sub
Filter函数
如果想检查是否某项存在于一组字符串中,则可以遍历所有项并和匹配的字符串相比较,但此时也可以使用Filter函数。

Filter(myArray, myMatch, myInclude)

接受myArray,并将其元素中的每一项与myMatch中的字符串相比较,取决于myInclude是True(缺省的)或False,返回一个数组,包含myArray中包含myMatch的所有元素,或者不包含myMatch的所有元素。
查找是区分大小写的,因此如果myMatch是小写,那么不会查找包含该字母大写形式的元素,反之亦然。
由于该函数返回一个包含所找到的元素的新数组,不能够在查找到的数组里获得元素的索引值。该函数仅告诉你元素是否存在,即包含/不包含匹配字符串,是哪个而不是在哪儿。
如果没有找到匹配的元素,那么Filter函数返回一个没有元素的数组,其上界值是-1。
Filter函数的另一个限制是不能要求它仅查找完全匹配项,它总是返回包含匹配字符串的所有的元素,换句话说,比较而不是检查。
这个函数总是比较字符串,因此如果你筛选一个数值数组,那么它将数值转换成字符串,然后检查它们。因为它不会仅查找完全匹配项,所以查找一个数值将不仅返回等于该匹配的元素,而且也包含将该数值作为一部分的元素,例如:

Filter(Array(1, 10, 210), 1)
将返回该数组中的所有元素,因为每个数值里面都有1。
测试Filter函数的示例:

Sub TestFilter()
    Dim myArray() As Variant
    Dim myFilteredArray As Variant

    '创建数组
    myArray = Array("One", "Two", "Three")

    '筛选数组中包含"T"的元素
    myFilteredArray = Filter(myArray, "T", True)
    '显示结果
    MsgBox "在数组(""One"", ""Two"", ""Three"")中 " & _
         "筛选含有 ""T"" 的元素将返回" & _
         vbCr & Join(myFilteredArray, vbCr)
    '筛选数组中不包含 "T" 的元素
    myFilteredArray = Filter(myArray, "T", False)
    '显示结果
    MsgBox "在数组(""One"", ""Two"", ""Three"")中 " & _
         "筛选不含有 ""T"" 的元素将返回" & _
         vbCr & Join(myFilteredArray, vbCr)
    '筛选数组中含有 "t" 的元素
    myFilteredArray = Filter(myArray, "t", True)
    '显示结果
    MsgBox "在数组(""One"", ""Two"", ""Three"")中 " & _
         "筛选含有 ""t"" 的元素将返回" & _
         vbCr & Join(myFilteredArray, vbCr)
    '在数值数组中筛选数字 "1"
    myArray = Array(1, 2, 3, 10)
    myFilteredArray = Filter(myArray, 1)
    '显示结果
    MsgBox "在数值数组(1, 2, 3, 10)中 " & _
         "筛选含有 1 的数组元素返回" & _
         vbCr & Join(myFilteredArray, vbCr)
End Sub
下面的代码示例展示如何仅获取完全匹配的元素:

Sub FilterExactly()
    Const myMarker As String = "!"
    Const myDelimiter As String = ","
    Dim myArray() As Variant
    Dim mySearchArray As Variant
    Dim myFilteredArray As Variant

    '创建数组
    myArray = Array(1, 2, 3, 10)
    '预先在数组中筛选包含1的元素
    myFilteredArray = Filter(myArray, 1)

    If UBound(myFilteredArray) > -1 Then
        '标记每个找到的元素的开始和结束
        'myMarker和myDelimiter必须是字符
        '且该字符不会出现在数组的任何元素中!
        mySearchArray = Split(myMarker & Join(myFilteredArray, myMarker & _
                    myDelimiter & myMarker) & myMarker, myDelimiter)
        '下面筛选修改后的数组
        myFilteredArray = Filter(mySearchArray, _
                      myMarker & "1" & myMarker)
        '从结果中移除标记
        myFilteredArray = Split(Replace(Join(myFilteredArray, _
                      myDelimiter), myMarker, ""), myDelimiter)
    End If
    '显示结果
    MsgBox "筛选数组(" & Join(myArray, ", ") & _
         ") 以获得含有1的完全匹配的元素将返回:" & _
         vbCr & Join(myFilteredArray, vbCr)
End Sub
发表于 2017-10-6 16:39 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 13:09 , Processed in 0.371262 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表