一些有用的在VBA中处理数组的函数
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是Tr
ue(缺省的)或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)vba 字符串转数组
'筛选数组中不包含 "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, _

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。