分享

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

 JT_man 2011-04-25

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
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多