Filter函数根据源数组中的元素是否与指定字符串相匹配,从而产生一个与指定字符串相匹配的数组。
Filter函数语法
Filter函数返回一个字符串型数组,该数组由传递给该函数的数组根据指定的条件筛选而成。其语法为:
Filter(Sourcearray,FilterString[, Switch[, Compare]])
其中:
参数sourcearray必需,为String型或Variant型数组,包含要筛选的数据。如果该参数指定一个String型数组,Filter函数将忽略零长字符串;如果该参数指定一个Variant型数组,Filter函数将忽略空元素。
参数FilterString必需,为String型,指定要在sourcearray中查找的字符串。
参数Switch可选,为Boolean型。如果为True,则返回所有匹配的值;如果为False,则返回所有不匹配的值。默认为True。
参数compare可选,指定比较的方法,为vbCompareMethod常数:vbBinaryCompare、vbTextCompare或者vbDatabaseCompare。默认为vbBinaryCompare,即区分大小写。
无论Option Base如何设置,返回的数组的下限基数总是0。
Filter函数返回值所赋给的数组必须声明为一维的String或Variant动态数组。
不能要求Filter函数仅查找完全匹配的元素项,因为该函数总是返回包含匹配字符串的所有的元素。
编程技巧
1. Filter函数不仅可用于处理字符串数组,而且可用于处理数值数组。此时,应将参数Sourcearray指定的数组指定为Variant型。
下面的过程筛选数组vSource中含有“1”的元素,并将结果赋值给数组vResult。
Sub testFilter()
Dim vSource As Variant, vResult As Variant
Dim strFilter As String
Dim i As Integer, str
strFilter = CStr(1)
vSource = Array(10, 15, 21, 22, 30, 36, 51)
vResult = Filter(vSource, strFilter, True,vbBinaryCompare)
For i = LBound(vResult) To UBound(vResult)
str = str & vResult(i) &' '
Next
MsgBox str
End Sub
代码运行后的结果如图1所示。
2. Filter函数与Dictionary对象配合使用。例如,下面的代码查找出字典对象键中指定的内容并显示。
SubFilterAndDictionary()
Dim iCount As Integer
Dim strKeys() As Variant
Dim strFiltered() As String
Dim strMatch As String
Dim blnSwitch As Boolean
Dim objDict As Dictionary
Dim str As String
Set objDict = New Dictionary
'填充字典对象
objDict.Add 'excelperfect','完美Excel'
objDict.Add 'excelsoft', 'MSExcel'
objDict.Add 'Excellent', '优秀Excel专家'
objDict.Add 'office', 'MSOffice'
'字典对象的键组成的数组
strKeys = objDict.Keys
strMatch = 'excel'
blnSwitch = True
'查找包括字符串excel(不区分大小写)的所有键
strFiltered() = Filter(strKeys, strMatch,blnSwitch, vbTextCompare)
'显示已找到的字典内容
For iCount = 0 To UBound(strFiltered)
str = str & strFiltered(iCount)& ' | ' & _
objDict.Item(strFiltered(iCount)) & vbCr
Next iCount
MsgBox '键' & '| ' & '内容' & vbCr & str
End Sub
运行代码后的结果如图2所示。
示例
示例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
运行的结果如图3所示。
示例2:下面的代码过程演示如何仅获取完全匹配的元素
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
运行后的结果如图4所示。
相关链接:
VBA进阶 | 数组基础01: 用最浅显的介绍来帮助你认识数组
VBA进阶 | 数组基础06: 与数组相关的函数——Array函数与IsArray函数
VBA进阶 | 数组基础07: 与数组相关的函数——Split函数与Join函数
本文属原创文章,转载请注明出处。
欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。
联系客服