VBA筛选AutoFilter用法
在面对大量数据时,我们可以使用Excel的筛选功能,滤出我们需要的信息。在本文中,我们先从Excel中的“筛选”命令谈起。
如下图所示的工作表,将活动单元格置于任一数据单元格中,单击功能区中的“排序和筛选”中的“筛选”命令,可以看到表头单元格中出现了筛选下拉箭头。
上述操作录制的VBA代码如下:
Sub Macro1()
'
' Macro1 Macro
''Selection.AutoFilter
End Sub
接着操作。单击内容为“语文”的下拉箭头(即表头第3列),选择“数字筛选——大于(G)…”,在“自定义自动筛选方式”对话框的“显示行”中,第一个组合框左侧选择“大于或等于”,右侧输入“80”,第二个组合框左侧选择“小于”,右侧输入“90”,即筛选语文分数大于或等于80且小于90的数据,结果如下图所示。
录制的代码如下:
Sub Macro2()
'
' Macro2 Macro
''Selection.AutoFilterActiveSheet.Range('$A$1:$F$19').AutoFilter Field:=3,Criteria1:='>=80', _Operator:=xlAnd,Criteria2:='<90'
End Sub
观察上面录制的代码,可以看出,Excel VBA使用AutoFilter方法来实现“筛选”功能,并提供了一系列可选的参数来进一步执行筛选操作。
AutoFilter方法的语法及说明
下面是Range对象的AutoFilter方法的语法:
Range对象.AutoFilter(Field,Criterial1,Operator,Criteria2,VisibleDropDown)
说明:
1. 参数Field,指定想要基于筛选的字段的整数偏移量。从列表的左侧算起,最左侧的字段是字段一。
2. 参数Criterial1,指定判断条件(为字符串)。使用“=”查找空字段,或者使用“<>”查找非空字段。如果忽略该参数,那么判断是全部。如果参数Operator是xlTop10Items,那么参数Criterial1指定项目的数量。
3. 参数Operator,指定筛选的类型,为XlAutoFilterOperator常量之一:
xlAnd:值为1。Criteria1和Criteria2的逻辑与。
xlOr:值2。Criteria1或Criteria2的逻辑或。
xlTop10Items:值3。显示最大值的项(在Criteria1中指定项目数)。
xlBottom10Items:值4。显示最小值的项(在Criteria1中指定项目数)。
xlTop10Percent:值5。显示最大值的项(在Criteria1中指定百分比)。
xlBottom10Percent:值6。显示最小值的项(在Criteria1中指定百分比)。
xlFilterValues:值7。筛选值。
xlFilterCellColor:值8。单元格的颜色。
xlFilterFontColor:值9。字体颜色。
xlFilterIcon:值10。筛选图标。
xlFilterDynamic:值11。动态筛选。
参数Criteria2,指定第二个判断条件(字符串),使用Criterial1和Operator构建复合判断条件。
参数VisibleDropDown,设置为True则显示所筛选字段的自动筛选下拉箭头;设置为False则隐藏所筛选字段的自动筛选下拉箭头。默认为True。
如果忽略所有参数,那么AutoFilter方法简单地切换指定区域的自动筛选下拉箭头的显示。
示例1:移除自动筛选提供的下拉箭头
在Excel中使用自动筛选时,会在每列顶部都添加一个下拉箭头以获取相应的筛选项。有时,我们只需要使用其中某些字段的下拉箭头,不需要其它字段带有下拉箭头,以免误操作这些字段。例如,上面的示例中,我们只需要代表科目的语文、数学、英语、历史字段有下拉箭头,而移除列A、列B中的下拉箭头。代码如下:
Sub testAutoFilter1()Range('A1').AutoFilter Field:=1,VisibleDropDown:=FalseRange('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 ThenActiveSheet.AutoFilterMode = FalseEnd If'筛选列A中内容为0的单元rng.AutoFilter Field:=1,Criteria1:='0''删除筛选出来的行With rng.Offset(1).Resize(.Rows.Count -1).SpecialCells(xlCellTypeVisible).Delete Shift:=xlShiftUp'关闭筛选模式.Worksheet.AutoFilterMode = FalseEnd With
End Sub
您可能注意到代码中出现了一些我们前面的文章中没有提到的新属性和方法,下面来作些解释。
AutoFilterMode属性属于Worksheet对象(后续文章中我们将会详细讲解Worksheet对象的属性和方法),用来获取工作表中用户是否使用了自动筛选,或者用来设置工作表中使用自动筛选。如果其值为True,那么表明工作表中当前显示有自动筛选下拉箭头,即使用了自动筛选功能。如果设置其值为False,则取消工作表中的自动筛选,即移除自动筛选的下拉箭头。
Delete方法用来删除单元格区域,使用参数Shift来移动单元格已取替被删除的单元格。将该参数值设置为xlShiftUp指明将单元格往上移来替换被删除的单元格。
从代码运行中我们发现,进行自动筛选后,使用Rows.Count统计时仍然会统计隐藏的行。
代码运行后的结果如下图。
也可以参照下面的视频来加深理解。
示例5:根据当前单元格内容筛选数据
如下图所示的工作表,我们要筛选出和当前单元格内容相同的单元格所在的数据行。
例如,当前单元格为单元格B7,当运行程序后,会筛选出与单元格B7中的内容(即“一班”)相同的单元格所在的数据行,所需效果如下图:
代码如下:
Sub testAutoFilter5()Dim lngColNum As Long'计算当前单元格在区域中的列号lngColNum = ActiveCell.Column -(ActiveCell.CurrentRegion.Column - 1)'筛选Selection.AutoFilter Field:=lngColNum,Criteria1:=ActiveCellEnd Sub
注意到本代码中使用了一个技巧,即代码:
lngColNum = ActiveCell.Column -(ActiveCell.CurrentRegion.Column - 1)
当单元格区域不是以列A为第1列时,可以准确地计算出当前单元格在所处区域中的列号,从而将其运用到接下来的AutoFilter方法的参数Field中。
示例6:根据当前单元格内容实时筛选数据并将数据粘贴到指定位置
本示例将示例3和示例5结合,实时筛选与当前单元格内容相同的数据并将数据复制到指定位置。
仍以示例5的工作表为例。当活动单元格处于A2:C9中时,能够实时对数据进行筛选,并将筛选出来的数据复制到以单元格A13开头的单元格区域中。
要实时筛选数据,必须结合工作表事件代码。即,我们的代码放置在了工作表模块的Worksheet_SelectionChange事件(将在Worksheet对象中介绍其详细用法)中:
Private SubWorksheet_SelectionChange(ByVal Target As Range)Dim lngColNum As LongDim lngLastRow As LongDim rng As Range'如果开启了筛选模式则关闭该模式If ActiveSheet.AutoFilterMode = True ThenActiveSheet.AutoFilterMode = FalseEnd If'设置当前单元格与单元格区域A2:C9相重合的单元格Set rng = Intersect(Target,Range('A2:C9'))'找到工作表中数据所在的最后行lngLastRow = Range('A' &Rows.Count).End(xlUp).Row'如果工作表中第9行外还有数据则清除If lngLastRow > 9 ThenRange('A13:C' &lngLastRow).Value = ''End IfIf Not rng Is Nothing Then'计算当前单元格在区域中的列号lngColNum = ActiveCell.Column -(ActiveCell.CurrentRegion.Column - 1)'筛选Selection.AutoFilter Field:=lngColNum,Criteria1:=ActiveCell'关闭事件响应Application.EnableEvents = FalseRange('A2:C9').CopyRange('A13')End If'关闭筛选模式ActiveSheet.AutoFilterMode = False'开启事件响应Application.EnableEvents = True
End Sub
注意,上述代码必须放置在数据所在工作表模块中。此时,当活动单元格处于该工作表A2:C3区域中时,会自动筛选与活动单元格内容相同的单元格数据,并复制粘贴到以单元格A3开始的区域中。
下面是一段简短的演示视频:
在代码中,我们使用了语句:
Application.EnableEvents = False
来关闭事件响应。因为我们的代码是靠事件实时响应来达到动态选择复制的效果,如果在复制前不关闭事件响应,那么复制操作将会引发SelectionChange事件,会达不到我们想要的结果,因此,先关闭事件响应,复制完后再开启,以实现我们再次选择单元格时数据的变化。我们会在Application对象中详细讲解关于EnableEvents属性的内容。
转自:http://www.360doc.com/content/17/0624/23/44723068_666296316.shtml
VBA筛选AutoFilter用法相关推荐
- wps excel 多列数据同时筛选即高级筛选的用法
wps excel 多列数据同时筛选即高级筛选的用法 最近在使用excel时,多了个希望可以多列数据同时筛选数据的需求,研究了一下,写下笔记记录一下,方便自己以后查看. 主要操作方法如下: 这是我的e ...
- vba中dir用法_VBA中DIR用法举例.doc
VBA中DIR用法举例 VBA中DIR函数用法讲解 1.dir代码演示 先上一段代码,作用是获取某个文件夹下子文件夹和文件的名称 没加注释的代码 Sub 获取文件夹和文件名() Dim str1 As ...
- excel vba筛选
excel 中有两个筛选 1.筛选,vba 代码为 set rg=range("a1:a100") rg.AutoFilter Field:=1, Criteria1:=" ...
- 拍案叫绝的VBA MID函数用法
看到这个标题,有的同学肯定认为,这篇博客就是一个"标题党",MID函数可以说是VBA入门级别的函数,但凡学习过几天的小白用户都会用,那么各位客官不要着急,我说说你听听,如果大家都知 ...
- VBA dictionary的用法
1.VBA中创建字典. dictionary是保存数据键和项目对的对象. 下面代码示范如何创建 Dictionary 对象: Dim myd As Object Set myd = CreateObj ...
- vba筛选出满足条件的数据_大数据筛选出可疑账户!工商银行济源分行助力警方侦破一“地下钱庄”案件...
大河报·大河客户端记者李岩 崔峰 通讯员 樊梦琦 近日,工商银行济源分行收到了来自济源产城融合示范区公安局的一封表扬信.信中除了对该行一直以来对公安机关的支持和帮助表达了感谢,同时对该行反洗钱工作和在 ...
- VBA激活Activate用法
在重复动作时可能需要不同工作薄工作表执行相同动作,下面就展示几个基础实例: VBA Activate用于激活工作簿.工作表或窗口.具体用法和实例如下:1.激活工作簿 Workbooks("W ...
- vba中dir用法_VBA编程知识点(10)——Dir函数
VBA编程知识点(10)--Dir函数 学习自杨洋老师<全民一起VBA> 1. 在VBA中,dir函数可以返回一个文件夹下一个文件的名字(包含后缀). 示例代码: filename = D ...
- vba中dir用法_利用Dir函数遍历某文件夹下的所有文件 | VBA实例教程
今天介绍利用Excel VBA的Dir方法来遍历某文件夹下的所有excel文件.还是直接来看例子,假设在D盘有一个叫工作日志的文件夹,里面放着每日的工作记录,都是excel 2007表格,现在由于工作 ...
最新文章
- xshell 安装yum_Xshell上面简单安装docker
- 第13章 集成学习和随机森林
- 1024程序员节获奖通知
- 空字符串字符串不为空_当字符串为空但不为空时
- 保持windows2003域控制器的安全
- express 设置handlebars模板引擎
- 【bzoj2118】 墨墨的等式
- Springmvc返回中文字符乱码问题
- Oracle数据库学习笔记(十五)--自连接
- meta标签属性及其功能
- Flink大声说,丢数据这个锅,我们不背!
- Honey Badger BFT(异步共识算法)笔记
- 找出程序耗费 CPU 的函数
- Java中Scanner的用法
- correl函数_教你利用Correl函数返回相关系数并确定属性关系
- android 监听手机屏幕唤醒和睡眠广播
- 论测试猿如何优雅的甩锅
- 第二章、视频压缩技术与原理
- 屏幕录像专家 V7.5 Build 20080112 简体中文绿色特别版
- 高斯光强matlab,光强分布MATLAB