Excel VBA数组+Filter函数:比找对象还简单的数据筛选神器,看完你也能装X
大家好,我是你们的老朋友——一个秃头但依旧热爱Excel的小牛牛。
今天要跟大家聊一聊Excel VBA里的数组和Filter函数。别走!别走!我知道看到“VBA”三个字母,很多人就已经开始头疼了。
但是!
今天我要用最直接的方式,教你最实用的技能。保证让你看完之后,不仅能装X,还能真正提高工作效率。
01 什么是数组?就是Excel界的“群租房”
想象一下,你有一堆数据要处理。
普通人做法:一个个单元格处理,就像给每个数据都租了个单间。
高手做法:把数据全部塞进数组,就像让它们住进了群租房。
数组是什么? 就是一个可以存放多个数据的“大柜子”。
打个比方:
变量就像你的女朋友,一次只能陪你一个人
数组就像你的后宫,可以同时装下好多个
代码长这样:
Dim arr(1 To 10) As String ‘创建一个能装10个人的后宫
02 Filter函数:数组里的“筛选神器”
好了,现在你有了一个装满了数据的数组。问题来了:怎么从中快速找到你想要的数据?
这时候,我们的主角——Filter函数闪亮登场!
Filter函数是干啥的? 它就像相亲网站上的筛选功能,你想要什么样的对象,它就帮你筛选出什么样的人。
基本语法:
新数组 = Filter(原数组, 要查找的字符串, 是否包含, 比较方式)
看不懂?没关系,我给你翻译一下:
原数组:你的相亲对象池
要查找的字符串:你的择偶标准,比如“有房”
是否包含:True表示包含符合条件的人,False表示排除符合条件的人
比较方式:0表示严格匹配(处女座模式),1表示模糊匹配(佛系模式)
03 实战案例:筛选出所有姓“张”的员工
假设你有一份员工名单,现在要把所有姓“张”的员工找出来。
传统方法:循环+判断,写一堆代码,看着都累。
Filter方法:
Sub 筛选姓张的员工()
Dim 原始名单 As Variant
Dim 筛选结果 As Variant
Dim i As Integer
‘准备数据
原始名单 = Array(“张三”, “李四”, “王五”, “张飞”, “关羽”, “张无忌”, “赵六”)
‘使用Filter筛选姓“张”的员工
筛选结果 = Filter(原始名单, “张”, True, vbTextCompare)
‘输出结果
For i = 0 To UBound(筛选结果)
Debug.Print 筛选结果(i)
Next i
End Sub
运行结果:
text
张三
张飞
张无忌
看到了吗?三行代码搞定筛选!不需要写循环判断,不需要考虑数组下标,Filter函数帮你搞定一切!
04 Filter函数的骚操作:排除法
Filter函数的第三个参数设为True是筛选包含的,设为False呢?那就是排除法!
比如你想知道哪些员工不姓“张”:
筛选结果 = Filter(原始名单, “张”, False, vbTextCompare)
运行结果:
text
李四
王五
关羽
赵六
这就是传说中的反向筛选,一招制敌!
05 模糊匹配 vs 精确匹配
Filter函数的第四个参数决定了你的匹配精度:
vbBinaryCompare (0):精确匹配,区分大小写(相亲必须精确到星座血型)
vbTextCompare (1):模糊匹配,不区分大小写(佛系相亲,差不多就行)
‘处女座模式:必须完全匹配
结果1 = Filter(数组, “张”, True, vbBinaryCompare)
‘佛系模式:差不多就行
结果2 = Filter(数组, “张”, True, vbTextCompare)
06 实战案例:处理Excel表格数据
理论讲完了,来点实战。
假设你有一张Excel表格,A列是员工信息,现在要把包含“经理”两个字的记录全部筛选出来并复制到另一张表。
Sub 筛选经理()
Dim 原始数据 As Variant
Dim 结果数据 As Variant
Dim 最后一行 As Long
Dim i As Long
Dim 目标行 As Long
With Sheet1
‘获取最后一行
最后一行 = .Cells(.Rows.Count, “A”).End(xlUp).Row
‘将A列数据装入数组
原始数据 = .Range(“A1:A” & 最后一行).Value
‘使用Application.Transpose将二维数组转为一维
原始数据 = Application.Transpose(原始数据)
‘筛选包含“经理”的数据
结果数据 = Filter(原始数据, “经理”, True, vbTextCompare)
‘将结果写入Sheet2
目标行 = 1
For i = 0 To UBound(结果数据)
Sheet2.Cells(目标行, 1).Value = 结果数据(i)
目标行 = 目标行 + 1
Next i
End With
MsgBox “筛选完成,共找到 ” & UBound(结果数据) + 1 & ” 条记录”
End Sub
这段代码看起来长,其实核心就一句话:Filter(原始数据, “经理”, True, vbTextCompare)
所有复杂的筛选逻辑,Filter函数一句搞定!
07 Filter函数的局限性和解决方案
世上没有完美的函数,Filter也有它的缺点:
缺点1:只能进行一维数组筛选
解决方案:先把二维数组转成一维
‘将二维数组转为一维
一维数组 = Application.Transpose(二维数组)
‘然后使用Filter
结果 = Filter(一维数组, “关键词”, True, vbTextCompare)
缺点2:只能进行包含匹配,不能进行大小于比较
解决方案:配合循环使用
For i = 0 To UBound(数组)
If 数组(i) > 100 Then ‘筛选大于100的值
‘处理逻辑
End If
Next i
08 装X进阶:Filter + Join函数组合拳
想要更骚的操作?把Filter和Join函数结合起来:
Sub 筛选并连接()
Dim arr As Variant
Dim 结果 As String
arr = Array(“苹果”, “香蕉”, “橙子”, “苹果派”, “苹果汁”)
‘筛选包含“苹果”的数据,并用逗号连接
结果 = Join(Filter(arr, “苹果”, True, vbTextCompare), “、”)
Debug.Print 结果 ‘输出:苹果、苹果派、苹果汁
End Sub
一招鲜,吃遍天!
09 实战案例:快速统计关键词出现次数
想知道某个关键词在数据中出现了多少次?
Function 统计关键词(数据区域 As Range, 关键词 As String) As Long
Dim arr As Variant
Dim 结果 As Variant
Dim 错误处理 As Variant
‘将数据区域装入数组
arr = 数据区域.Value
‘转为一维数组
On Error Resume Next
arr = Application.Transpose(arr)
On Error GoTo 0
‘使用Filter筛选
结果 = Filter(arr, 关键词, True, vbTextCompare)
‘返回数量
统计关键词 = UBound(结果) + 1
End Function
调用方式:
Debug.Print 统计关键词(Range(“A1:A1000”), “Excel”) ‘输出Excel出现的次数
10 避坑指南:Filter常见错误及解决方法
错误1:类型不匹配
原因:Filter只能处理字符串数组,不能直接处理数值数组
解决方法:
‘错误做法
数值数组 = Array(1, 2, 3, 11, 22)
结果 = Filter(数值数组, 1, True) ‘报错!
‘正确做法
数值数组 = Array(“1”, “2”, “3”, “11”, “22”) ‘先转成字符串
结果 = Filter(数值数组, “1”, True)
错误2:找不到匹配项
如果找不到匹配项,Filter函数会返回空数组,这时使用UBound会报错
解决方法:
On Error Resume Next
结果 = Filter(数组, “不存在的内容”, True)
If Err.Number <> 0 Then
MsgBox “没有找到匹配项”
Else
‘处理结果
End If
On Error GoTo 0
11 总结:Filter函数的适用场景
通过今天的分享,相信大家已经明白了Filter函数的强大之处。
什么时候用Filter?
需要在一维数组中筛选包含某个关键词的数据
想做快速的数据筛选,不想写复杂的循环
想让自己看起来像个VBA高手
什么时候别用Filter?
需要进行数值比较(大于、小于)
需要进行多条件复杂筛选
数据量超大(超过10万条)时,Filter可能不如字典快
结尾
好了,今天的分享就到这里。
看完这篇文章,你是不是觉得VBA也没那么可怕了?数组也没那么难懂了?Filter函数也没那么神秘了?
其实Excel VBA里还有很多这样的小神器,等着我们去发掘。它们就像隐藏在角落里的扫地僧,平时不起眼,关键时刻却能爆发出惊人的能量。
如果你喜欢这种轻松学Excel的方式,别忘了点赞、转发!
夜雨聆风