打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VBA进阶 | 数组基础08: 与数组相关的函数——Filter函数
userphoto

2017.10.26 广西

关注

 

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常数:vbBinaryComparevbTextCompare或者vbDatabaseCompare。默认为vbBinaryCompare,即区分大小写。

  • 无论Option Base如何设置,返回的数组的下限基数总是0

  • Filter函数返回值所赋给的数组必须声明为一维的StringVariant动态数组。

  • 不能要求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所示。

 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所示。

 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所示。

 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

        '标记每个找到的元素的开始和结束

        'myMarkermyDelimiter必须是字符

        '且该字符不会出现在数组的任何元素中!

        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所示。

 4

 


 

相关链接:

VBA进阶 | 数组基础01: 用最浅显的介绍来帮助你认识数组

VBA进阶 | 数组基础02: 简单的数组操作

VBA进阶 | 数组基础03: 二维数组

VBA进阶 | 数组基础04: 运用数组处理工作表数据

VBA进阶 | 数组基础05: 动态数组

VBA进阶 | 数组基础06: 与数组相关的函数——Array函数与IsArray函数

VBA进阶 | 数组基础07: 与数组相关的函数——Split函数与Join函数

 


 

本文属原创文章,转载请注明出处。

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
一些有用的在VBA中处理数组的函数
VBA进阶 | 数组基础06: 与数组相关的函数——Array函数与IsArray函数
数组函数UBound 函数/LBound 函数
第8章 数组
asp?vbscript?数组的使用
asp数组的使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服