Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2128|回复: 4

[已解决]多条件筛选求助!怎么修改?请老师指教,谢谢!

[复制链接]
发表于 2017-7-4 20:55 | 显示全部楼层 |阅读模式
本帖最后由 大熊123 于 2017-7-6 19:38 编辑

Sub 多条件筛选()
  Dim ar, br, d As Object, i&, j&, flag As Boolean
  Set d = VBA.CreateObject("scripting.dictionary")
  ar = Array("强力", "中力", "小力")
  With ActiveSheet.AutoFilter.Range
  br = Intersect([E:E], .Offset(0, 0))
  For i = 1 To UBound(br)
     For j = 0 To UBound(ar)
        If InStr(br(i, 1), ar(j)) Then flag = True: Exit For
     Next j
    If Not flag Then
       If Not d.exists(br(i, 1)) Then d(br(i, 1)) = ""
    End If
    flag = False
  Next i
.AutoFilter Field:=5, Criteria1:=d.keys, Operator:=xlFilterValues
End With
Set d = Nothing
End Sub

尊敬的老师:上面这个VBA代码是我在论坛里抄来的,可以多条件筛选掉包含("强力", "中力", "小力")的数据,但是我想要的是筛选结果是只留下含有("强力", "中力", "小力")这几个关键字的数据行,而不是不含。请问,该怎么改代码呢?请给予帮助,我是个菜鸟不懂,谢谢!


最佳答案
2017-7-4 22:38
Sub 多条件筛选()
  Dim ar, br, d As Object, i&, j&, flag As Boolean
  Set d = VBA.CreateObject("scripting.dictionary")
  ar = Array("强力", "中力", "小力")
  With ActiveSheet.AutoFilter.Range
  br = Intersect([E:E], .Offset(0, 0))
  For i = 1 To UBound(br)
     For j = 0 To UBound(ar)
        If InStr(br(i, 1), ar(j)) Then flag = True: Exit For
     Next j
    If flag Then'not去了就反过来了
       If Not d.exists(br(i, 1)) Then d(br(i, 1)) = ""
    End If
    flag = False
  Next i
.AutoFilter Field:=5, Criteria1:=d.keys, Operator:=xlFilterValues
End With
Set d = Nothing
End Sub

多条件筛选求助.zip

16 KB, 下载次数: 14

多条件筛选

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2017-7-4 21:27 | 显示全部楼层
    Selection.AutoFilter Field:=5, Criteria1:=Array( _
        "*强力牌*", "*小力牌*", "*中力牌*"), Operator:=xlFilterValues

这样为什么不能把含有这几个关键字的数据行筛选出来呢?
回复

使用道具 举报

发表于 2017-7-4 22:38 | 显示全部楼层    本楼为最佳答案   
Sub 多条件筛选()
  Dim ar, br, d As Object, i&, j&, flag As Boolean
  Set d = VBA.CreateObject("scripting.dictionary")
  ar = Array("强力", "中力", "小力")
  With ActiveSheet.AutoFilter.Range
  br = Intersect([E:E], .Offset(0, 0))
  For i = 1 To UBound(br)
     For j = 0 To UBound(ar)
        If InStr(br(i, 1), ar(j)) Then flag = True: Exit For
     Next j
    If flag Then'not去了就反过来了
       If Not d.exists(br(i, 1)) Then d(br(i, 1)) = ""
    End If
    flag = False
  Next i
.AutoFilter Field:=5, Criteria1:=d.keys, Operator:=xlFilterValues
End With
Set d = Nothing
End Sub
回复

使用道具 举报

 楼主| 发表于 2017-7-5 09:51 | 显示全部楼层
苏子龙 发表于 2017-7-4 22:38
Sub 多条件筛选()
  Dim ar, br, d As Object, i&, j&, flag As Boolean
  Set d = VBA.CreateObject("sc ...

老师就是老师,一下就解决问题了!太感谢了!
回复

使用道具 举报

发表于 2019-3-28 01:33 | 显示全部楼层
苏子龙 发表于 2017-7-4 22:38
Sub 多条件筛选()
  Dim ar, br, d As Object, i&, j&, flag As Boolean
  Set d = VBA.CreateObject("sc ...

老师你好,想问下为什么我的Array里超过两个筛选项就不行,这里  ar = Array("强力", "中力", "小力")里面有三个筛选项为什么可以呢? 我的筛选项是模糊项,只要包含"P111","P222","P333","P444" 这样的就筛选出来。我把几个条件用这样的形式"*"&"P123"写在了Array里,但是运行出错。请问是什么原因呢?谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 11:39 , Processed in 0.137253 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表