乐于分享
好东西不私藏

Excel VBA数组+Filter函数:比找对象还简单的数据筛选神器,看完你也能装X

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的方式,别忘了点赞、转发!

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » Excel VBA数组+Filter函数:比找对象还简单的数据筛选神器,看完你也能装X

猜你喜欢

  • 暂无文章