VBA想要对一个数组筛选或剔除其中某些指定的数组元素时,可以使用Filter函数。

比如想要剔除一维数组arr【"番茄", "香蕉", "番茄", "提子"】其中所有的“番茄”数组元素,可以使用arr=VBA.Filter(arr, "番茄", False),得到的数组就是【"香蕉", "提子"】。

但是如果数组里含有“小番茄”数组元素,也是就数组是arr【"番茄", "香蕉", "小番茄", "提子"】时,使用arr=VBA.Filter(arr, "番茄", False),得到的结果就不是【"香蕉", "小番茄", "提子"】,而还是【"香蕉", "提子"】,也就是以上Filter函数会把“番茄”和“小番茄”两种数组元素都剔除了。

这是因为Filter函数的筛选是非精确查找,类似like,只要筛选的数组元素里含有“番茄”两字,那该数组元素就会被剔除,也就是Filter函数只能进行模糊筛选,不能进行精准匹配。

如果想要用Filter函数实现完全匹配来精准剔除,可以借助辅助字符给数组元素加“保护”,比如以下代码:

Sub Filter精确匹配筛选与剔除数组元素()
arr = Array("番茄", "香蕉", "小番茄", "西瓜", "番茄", "提子")
element = "番茄" '要剔除的数组元素名
aa = "@" '第一种特殊字符【该特殊字符必须是在数组元素中没有的符号】
bb = "#" '第二种特殊字符【该特殊字符必须是在数组元素中没有的符号】
merge_string = bb & Join(arr, bb & aa & bb) & bb  '所有元素之间放“#@#”,前放“#”,后放“#”,合并成字符串
split_arr = Split(merge_string, aa)    '根据“@”拆分成新数组
  arr = VBA.Filter(split_arr, bb & element & bb, False)    '数组剔除所有名称为“#番茄#”的数组元素
arr = Split(Replace(Join(arr, aa), "#", ""), aa) '剔除所有数组元素中的“#”
MsgBox Join(arr, ",")    '用“,”串联数组所有元素查看结果
End Sub

以上代码的原理是给所有数组元素前后都加上特殊字符“#”后,再使用Filter函数剔除名称为“#番茄#”的数组元素,最后再对所有数组元素撤销前面添加的特殊字符恢复原来的名称(该去除数组元素中特殊字符的原理详见我的文章【 VBA去除数组元素中的特定字符串 】)。在剔除过程中,原本的数组元素“小番茄”,就会因为被套上保护变成“#小番茄#”,与“#番茄#”不同而不会被Filter函数去除。

需要注意的是,选择的两种特殊字符必须是在数组元素中没有出现的符号。

以上Filter精确匹配剔除数组元素的方法同理也可用在Filter精确匹配筛选上。

以上内容对您有帮助可以分享或转藏,避免以后找不到。想要了解更多VBA相关知识,欢迎到http://moqingyan.360doc.com我的个人图书馆查看。

  •