AutoFilter方法的语法及说明

 
下面是Range对象的AutoFilter方法的语法:
     Range对象.AutoFilter(Field,Criterial1,Operator,Criteria2,VisibleDropDown)
 
说明:
1.参数Field,指定想要基于筛选的字段的整数偏移量。从列表的左侧算起,最左侧的字段是字段一。
2.参数Criterial1,指定判断条件(为字符串)。使用“=”查找空字段,或者使用“<>”查找非空字段。如果忽略该参数,那么判断是全部。如果参数Operator是xlTop10Items,那么参数Criterial1指定项目的数量。
3.参数Operator,指定筛选的类型,为XlAutoFilterOperator常量之一:
lxlAnd:值为1。Criteria1和Criteria2的逻辑与。
lxlOr:值2。Criteria1或Criteria2的逻辑或。
lxlTop10Items:值3。显示最大值的项(在Criteria1中指定项目数)。
lxlBottom10Items:值4。显示最小值的项(在Criteria1中指定项目数)。
lxlTop10Percent:值5。显示最大值的项(在Criteria1中指定百分比)。
lxlBottom10Percent:值6。显示最小值的项(在Criteria1中指定百分比)。
lxlFilterValues:值7。筛选值。
lxlFilterCellColor:值8。单元格的颜色。
lxlFilterFontColor:值9。字体颜色。
lxlFilterIcon:值10。筛选图标。
lxlFilterDynamic:值11。动态筛选。
4.参数Criteria2,指定第二个判断条件(字符串),使用Criterial1和Operator构建复合判断条件。
5.参数VisibleDropDown,设置为True则显示所筛选字段的自动筛选下拉箭头;设置为False则隐藏所筛选字段的自动筛选下拉箭头。默认为True。
6.如果忽略所有参数,那么AutoFilter方法简单地切换指定区域的自动筛选下拉箭头的显示。
 
示例1:移除自动筛选提供的下拉箭头
     在Excel中使用自动筛选时,会在每列顶部都添加一个下拉箭头以获取相应的筛选项。有时,我们只需要使用其中某些字段的下拉箭头,不需要其它字段带有下拉箭头,以免误操作这些字段。例如,上面的示例中,我们只需要代表科目的语文、数学、英语、历史字段有下拉箭头,而移除列A、列B中的下拉箭头。代码如下:
 
Sub testAutoFilter1()
    Range("A1").AutoFilter Field:=1,VisibleDropDown:=False
    Range("A1").AutoFilter Field:=2,VisibleDropDown:=False
End Sub
 
即,将相应列字段的参数VisibleDropDown设置为False。
 
示例2:一次执行多个列字段的筛选
 
仍以本文开头的工作表为例,要求得到语文成绩大于等于80的男生的数据记录。代码如下:
Sub testAutoFilter2()
    Range("A1").AutoFilter Field:=2,Criteria1:="=男"
    Range("A1").AutoFilter Field:=3,Criteria1:=">=80"
End Sub
 
示例3:复制筛选结果
 
将示例2中得到的结果复制到以单元格H21开头的区域中。代码如下:
Sub testAutoFilter3()
Dim lngLastRow As Long
'找到工作表中最后一行
lngLastRow = Range("A" &Rows.Count).End(xlUp).Row
'按条件执行自动筛选
Range("A1").AutoFilter Field:=2,Criteria1:="=男"
Range("A1").AutoFilter Field:=3,Criteria1:=">=80"
'将筛选后的结果复制到指定位置
Range("A1:F" &lngLastRow).Copy Range("H21")
End Sub
可以看出,Copy方法仅复制可见单元格中的内容。
 
示例4:删除筛选出的数据
 
如下图所示的工作表,我们要删除列A中单元格内容为“0”的数据行。
此时,我们可以使用AutoFilter方法筛选出这些行,然后进行删除。代码如下:
 
Sub testAutoFilter4()
Dim rng As Range
'设置筛选区域
Set rng = Range("A1:B10")
'如果开启了筛选模式则关闭该模式
If ActiveSheet.AutoFilterMode = True Then
ActiveSheet.AutoFilterMode = False
End If
'筛选列A中内容为0的单元
rng.AutoFilter Field:=1,Criteria1:="0"
'删除筛选出来的行
With rng
.Offset(1).Resize(.Rows.Count -1).SpecialCells(xlCellTypeVisible).Delete Shift:=xlShiftUp
'关闭筛选模式
.Worksheet.AutoFilterMode = False
End With
End Sub
您可能注意到代码中出现了一些我们前面的文章中没有提到的新属性和方法,下面来作些解释。
 
lAutoFilterMode属性属于Worksheet对象(后续文章中我们将会详细讲解Worksheet对象的属性和方法),用来获取工作表中用户是否使用了自动筛选,或者用来设置工作表中使用自动筛选。如果其值为True,那么表明工作表中当前显示有自动筛选下拉箭头,即使用了自动筛选功能。如果设置其值为False,则取消工作表中的自动筛选,即移除自动筛选的下拉箭头。
l从代码运行中我们发现,进行自动筛选后,使用Rows.Count统计时仍然会统计隐藏的行。
 
示例5:根据当前单元格内容筛选数据
 
如下图所示的工作表,我们要筛选出和当前单元格内容相同的单元格所在的数据行。
 
lDelete方法用来删除单元格区域,使用参数Shift来移动单元格已取替被删除的单元格。将该参数值设置为xlShiftUp指明将单元格往上移来替换被删除的单元格。
例如,当前单元格为单元格B7,当运行程序后,会筛选出与单元格B7中的内容(即“一班”)相同的单元格所在的数据行。
 
代码如下:
Sub testAutoFilter5()
Dim lngColNum As Long
'计算当前单元格在区域中的列号
lngColNum = ActiveCell.Column -(ActiveCell.CurrentRegion.Column - 1)
'筛选
Selection.AutoFilter Field:=lngColNum,Criteria1:=ActiveCell
End Sub
注意到本代码中使用了一个技巧,即代码:
lngColNum = ActiveCell.Column - (ActiveCell.CurrentRegion.Column- 1)
当单元格区域不是以列A为第1列时,可以准确地计算出当前单元格在所处区域中的列号,从而将其运用到接下来的AutoFilter方法的参数Field中。
 
示例6:根据当前单元格内容实时筛选数据并将数据粘贴到指定位置
 
本示例将示例3和示例5结合,实时筛选与当前单元格内容相同的数据并将数据复制到指定位置。
 
仍以示例5的工作表为例。当活动单元格处于A2:C9中时,能够实时对数据进行筛选,并将筛选出来的数据复制到以单元格A13开头的单元格区域中。
要实时筛选数据,必须结合工作表事件代码。即,我们的代码放置在了工作表模块的Worksheet_SelectionChange事件(将在Worksheet对象中介绍其详细用法)中:
Private Sub  Worksheet_SelectionChange(ByVal Target As Range)
Dim lngColNum As Long
Dim lngLastRow As Long
Dim rng As Range
'如果开启了筛选模式则关闭该模式
If ActiveSheet.AutoFilterMode = True Then
ActiveSheet.AutoFilterMode = False
End If
'设置当前单元格与单元格区域A2:C9相重合的单元格
Set rng = Intersect(Target,Range("A2:C9"))
'找到工作表中数据所在的最后行
lngLastRow = Range("A" &Rows.Count).End(xlUp).Row
'如果工作表中第9行外还有数据则清除
If lngLastRow > 9 Then
Range("A13:C" &lngLastRow).Value = ""
End If
If Not rng Is Nothing Then
'计算当前单元格在区域中的列号
lngColNum = ActiveCell.Column -(ActiveCell.CurrentRegion.Column - 1)
'筛选
Selection.AutoFilter Field:=lngColNum,Criteria1:=ActiveCell
'关闭事件响应
Application.EnableEvents = False
Range("A2:C9").CopyRange("A13")
End If
'关闭筛选模式
ActiveSheet.AutoFilterMode = False
'开启事件响应
Application.EnableEvents = True
End Sub
 
注意,上述代码必须放置在数据所在工作表模块中。此时,当活动单元格处于该工作表A2:C3区域中时,会自动筛选与活动单元格内容相同的单元格数据,并复制粘贴到以单元格A3开始的区域中。
 
在代码中,我们使用了语句:
 
Application.EnableEvents = False
 
来关闭事件响应。因为我们的代码是靠事件实时响应来达到动态选择复制的效果,如果在复制前不关闭事件响应,那么复制操作将会引发SelectionChange事件,会达不到我们想要的结果,因此,先关闭事件响应,复制完后再开启,以实现我们再次选择单元格时数据的变化。我们会在Application对象中详细讲解关于EnableEvents属性的内容。

【转载】EXCEL VBA 自动筛选—AutoFilter方法的更多相关文章

  1. excel取消自动超链接的方法:还原和自动更正取消自动超链接

    默认设置下,我们在excel表格中输入网址,一般excel都会自动将我们输入的网址自动更正为超链接.当单击该网址,就会打开相应的网页. 如果我们不想要自动添加超链接,请看下面的excel取消自动超链接 ...

  2. 设置Excel的自动筛选功能

    单元格数字格式的问题 NPOI向Excel文件中插入数值时,可能会出现数字当作文本的情况(即左上角有个绿色三角),这样单元格的值就无法参与运算.这是因为在SetCellValue设置单元格值的时候使用 ...

  3. Excel VBA: 自动生成巡检报表并通过邮件定时发送

    目录 环境说明逻辑结构效果说明及截图①.安装SecureCRT②. 自动巡检脚本③. 数据检索并FTP传送④. 安装Excel 2013⑤. 安装Serv-U⑥. 自动生成图表并邮件发送 环境说明 系 ...

  4. Excel VBA自动添加证书(二)

    继续上次没有写完的随笔,本来是很想一次性写完的,但是到中午一点了还没有吃东西,其实饿的不行了,还好写博客时会自动保存,中间电脑实然蓝屏,花了二个多小时写的没有点击保存,吓我一下,以为会全没了. 前面讲 ...

  5. Excel VBA自动添加证书

    ---恢复内容开始--- 在说这个话题之前,我先解释一下为什么要加数字证书签名,它有什么作用,后面再解释如何添加.首先解释下证书添加的位置,如下图所示: 1.单击左上角的Office 按钮,选择右下角 ...

  6. NPOI之Excel——自动筛选、数字格式

    设置Excel的自动筛选功能 最新导出数据需要使用Excel的筛选功能,网上多方查找,终于在一个繁体的网站上找到了方法,呃,这个网站还是Java的,讲的是POI,不过.NET的NPOI也就一样用了. ...

  7. EXCEL快速自动填充方法集锦

    EXCEL快速自动填充方法集锦 原文地址,转载请注明:http://www.cnblogs.com/croso/p/5396841.html 方法一: 名称框输入a1:a1000回车,1, ctrl+ ...

  8. Excel VBA解读(54):排序——Sort方法

    Excel VBA解读(54):排序——Sort方法 看看下面的Excel界面截图,“排序”和“筛选”往往在一起,这大概是很多数据需要先排序后筛选吧  首先以“性别”作为排序字段,升序排列,并且第一行 ...

  9. Excel VBA中写SQL,这些问题的方法你一定要牢记

    小爬之前的文章 [Excel VBA中写SQL,这些问题你一定为此头痛过]中详细讲诉了一些常见的VBA 中使用SQL遇到的问题,这里再补充两个常见的问题场景及对应的解决方案,希望你们看了后能够思路开阔 ...

随机推荐

  1. 微信小程序发布与支付

    一.小程序的发布流程 小程序协同工作和发布官网链接 1.背景 小程序的平台里,开发者完成开发之后,需要在开发者工具提交小程序的代码包,然后在小程序后台发布小程序. 2.流程 上传代码 代码管理服务器上 ...

  2. day09-2视图和用户权限

    视图和用户权限 1.视图(view) 看一个需求 emp表的列信息很多,有些信息是个人重要信息(比如:sal.comm.mgr.hiredate),如果我们希望某个用户只能查询emp表的empno.e ...

  3. hibernate validation 手动参数校验 不经过spring

    /** * 校验工具类 * @author wdmcygah * */ public class ValidationUtils { private static Validator validato ...

  4. FluentValidation 验证(二):WebApi 中使用 注入服务

    比如你要验证用户的时候判断一下这个用户名称在数据库是否已经存在了,这时候FluentValidation 就需要注入查询数据库 只需要注入一下就可以了 public class Login3Reque ...

  5. HTTPS实现原理分析

    概述 在上一节中介绍了两种加密方法 对称加密 非对称加密 其中对称加密性能高,但是有泄露密钥的风险,而非对称加密相反,加密性能较差,但是密钥不易泄露,那么能不能把他们进行一下结合呢? HTTPS采用混 ...

  6. `<jsp:getProperty>`动作和`<jsp:setProperty>`动作的使用在一个静态页面填写图书的基本信息,页面信息提交给其他页面,并且在其页面显示。要去将表单元素的值赋值给Java

    <jsp:getProperty>动作和<jsp:setProperty>动作的使用 1.<jsp:getProperty>动作 语法格式: <jsp:get ...

  7. C语言------选择结构

    仅供借鉴.仅供借鉴.仅供借鉴(整理了一下大一C语言每个章节的练习题.没得题目.只有程序了) 文章目录 1 .实训名称 2 .实训目的及要求 3 .源代码及运行截图 4.小结 1 .实训名称 实训4:选 ...

  8. 现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法

    欢迎大家加入我的社区:http://t.csdn.cn/Q52km 社区中不定时发红包 文章目录 1.UML类图 2.源码: 3.优缺点分析 1.UML类图 2.源码: package com.bac ...

  9. 七、docker镜像私有仓库

    在Docker中,当我们执行 docker pull xxx 的时候 ,它实际上是从 hub.docker.com 这个地址去查找,这就是 Docker 公司为我们提供的公共仓库.在工作中,我们不可能 ...

  10. 第一百零七篇:基本数据类型(undefined,null,boolean类型)

    好家伙, 本篇内容为<JS高级程序设计>第三章学习笔记 1.数据类型 ECMAScript有6种简单数据类型(称为原始类型): Undefined, Null, Boolean, Numb ...