前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA自动筛选完全指南(下)

VBA自动筛选完全指南(下)

作者头像
fanjy
发布2022-11-16 13:51:08
3.5K0
发布2022-11-16 13:51:08
举报
文章被收录于专栏:完美Excel

标签:VBA,自动筛选,Autofilter方法

本文前面的内容参见:VBA自动筛选完全指南(上)

示例:使用AutoFilter方法筛选前10条记录

数据集同上。下面的代码提供前10条记录(基于“数量”列):

代码语言:javascript
复制
Sub FilterRowsTop10()
    ActiveSheet.Range("A1").AutoFilter Field:=4, _
      Criteria1:="10", _
      Operator:=xlTop10Items
End Sub

如果想获取前5条记录,只需要将Criteria1:=”10”中的10修改为5。

因此,获取前5条记录的代码为:

代码语言:javascript
复制
Sub FilterRowsTop5()
    ActiveSheet.Range("A1").AutoFilter Field:=4, _
      Criteria1:="5", _
      Operator:=xlTop10Items
End Sub

这可能看起来很奇怪,但无论想要多少个前面的条目,运算符值始终为xlTop10Items。

相似地,下面的代码获取后10条记录:

代码语言:javascript
复制
Sub FilterRowsBottom10()
    ActiveSheet.Range("A1").AutoFilter Field:=4, _
      Criteria1:="10", _
      Operator:=xlBottom10Items
End Sub

如果想要获取后5条记录,只需将上述代码Criteria1:="10"中的10修改为5。

示例:使用AutoFilter方法筛选前10%

数据集同上。下面的代码将提供前10%的记录(基于“数量”列):

代码语言:javascript
复制
Sub FilterRowsTop10Percent()
    ActiveSheet.Range("A1").AutoFilter Field:=4, _
      Criteria1:="10", _
      Operator:=xlTop10Percent
End Sub

在我们的数据集中,由于只有16条记录,它将返回前2条记录(约占总记录的10%)。

示例:在自动筛选中使用通配符

数据集同上。假设想要筛选文本中包含有“机”的所有记录,可使用下面的代码:

代码语言:javascript
复制
Sub FilterRowsWildcard()
    Worksheets("Sheet1").Range("A1").AutoFilter Field:=2, _
    Criteria1:="*机"
End Sub
星号(*)可以表示任意数量的字符。因此,这将筛选出任何包含“机”的项目。

示例:复制筛选出的行到新工作表

如果不仅要根据条件筛选记录,而且要复制筛选的行,那么可以使用下面的宏。它复制筛选的行,添加新工作表,然后将这些复制的行粘贴到新工作表中。

代码语言:javascript
复制
Sub CopyFilteredRows()
    Dim rng As Range
    Dim wks As Worksheet
    If Worksheets("Sheet1").AutoFilterMode = False Then
        MsgBox "没有筛选行"
        Exit Sub
    End If
    Set rng = Worksheets("Sheet1").AutoFilter.Range
    Set wks = Worksheets.Add
    rng.Copy Range("A1")
End Sub

上面的代码检查工作表Sheet1中是否有筛选。如果没有筛选行,显示一条消息并退出程序。如果有筛选行,则复制筛选的数据,插入新工作表,然后粘贴这些数据到新插入的工作表中。

示例:基于单元格值筛选数据

VBA自动筛选与下拉列表配合,当从下拉列表中选择项目时,会自动筛选该项目的所有记录,如下图3所示。

图3

在数据集所在的工作表代码模块中,输入下面的事件代码:

代码语言:javascript
复制
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$B$2" Then
        If Range("B2") = "全部" Then
            Range("A5").AutoFilter
        Else
        Range("A5").AutoFilter Field:=2, Criteria1:=Range("B2")
        End If
    End If
End Sub

使用VBA打开/关闭自动筛选

在应用自动筛选时,可能已经存在筛选了。使用下面的代码关闭任何先前已应用的自动筛选:

代码语言:javascript
复制
Sub TurnOffAutoFilter()
    Worksheets("Sheet1").AutoFilterMode = False
End Sub

这段代码检查整个工作表,删除已经应用的任何筛选。

如果不想关闭整个工作表中的筛选,只想关闭特定数据集中的筛选,可以使用下面的代码:

代码语言:javascript
复制
Sub TurnOffAutoFilter1()
    If Worksheets("Sheet1").Range("A1").AutoFilter Then
        Worksheets("Sheet1").Range("A1").AutoFilter
    End If
End Sub

上面的代码检查是否已经存在筛选。如果筛选已经应用,它会删除它,否则它什么也不做。

类似地,如果要启用自动筛选,使用以下代码:

代码语言:javascript
复制
Sub TurnOnAutoFilter()
    If Not Worksheets("Sheet1").Range("A4").AutoFilter Then
        Worksheets("Sheet1").Range("A1").AutoFilter
    End If
End Sub

实际上,上述代码会自动开关自动筛选,也就是说,当已经应用了自动筛选时会删除,而没有应用时会应用自动筛选。

检查是否已应用自动筛选

如果有一个包含多个数据集的工作表,并且希望确保知道没有筛选已经就位,则可以使用以下代码:

代码语言:javascript
复制
Sub CheckforFilters()
    If ActiveSheet.AutoFilterMode = True Then
        MsgBox "已经应用自动筛选"
    Else
        MsgBox "还没有应用筛选"
    End If
End Sub

显示所有数据

如果已将筛选应用于数据集,并且希望显示所有数据,使用以下代码:

代码语言:javascript
复制
Sub ShowAllData()
    If ActiveSheet.FilterMode Then
        ActiveSheet.ShowAllData
    End If
End Sub

上面的代码检查FilterMode属性是否为TRUE或FALSE。如果为TRUE,则表示已应用筛选,并使用ShowAllData方法显示所有数据。注意,这不会删除筛选,筛选图标仍然可用。

在受保护的工作表中使用自动筛选

默认情况下,当工作表受保护时,不能应用筛选。然而,如果已经设置了筛选,则可以启用自动筛选,以确保即使在受保护的工作表上也可以使用。

要执行此操作,选中“在保护工作表时使用自动筛选”选项,如下图4所示。

图4

虽然这在已设置了筛选时有效,但如果尝试使用VBA代码添加自动筛选,它将不起作用。由于工作表受到保护,因此不允许运行任何宏并对自动筛选进行更改。因此,需要使用代码来保护工作表,并确保在其中启用了自动筛选。这在创建动态筛选时是有用的。

下面的代码保护工作表,同时允许在其中使用筛选和VBA宏。

代码语言:javascript
复制
Private Sub Workbook_Open()
    With Worksheets("Sheet1")
        .EnableAutoFilter = True
        .Protect Password:="123", Contents:=True, _
        UserInterfaceOnly:=True
    End With
End Sub

注意,这段代码放置在ThisWorkbook代码模块中,因此当工作簿打开时就会自动执行。

代码指定“EnableAutoFilter=True”,意味着筛选也将在受保护的工作表中工作。此外,它将“UserInterfaceOnly”参数设置为“True”,意味着当工作表受到保护时,VBA宏代码将继续工作。

结语

自动筛选功能非常简单,使用内置筛选功能可轻松完成。然而,为什么需要使用VBA代码来执行此操作?因为将其与其它代码结合起来,可以创建更加强大的自动化工作。

注:本文学习整理自trumpexcel.com,略有修改。

文章中所使用的示例数据和代码可到知识星球App完美Excel社群下载。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档