《VBA经典应用69例》(版权10178981),是我推出的第九套教程,教程是专门针对初级、中级学员在学习VBA过程中可能遇到的案例展开,这套教程案例众多,紧贴“实战”,并做“战术总结”,以便大家能很好的应用。教程的目的是要求大家在实际工作中要利用好VBA。本套教程共三册六十九个专题,今日内容:VBA经典应用69例:基于文本条件的一般筛选及条件OR筛选
【分享成果,随喜正能量】感恩入怀,一种平和的情愫在血液中缓缓流淌,云卷云舒,去留无意,花开花落,不再黯然神伤。如此境界,仿似置身于云水禅心之境,一念清幽,何惧风雨,细细品味时光的静好,不言山高水远,只念风过留香。。
大家好,我们这个专题讲解VBA中的自动筛选(Autofilter),一般情况下,我们学习VBA之前都比较熟悉了Excel的利用,为了进一步提高效率,才学习VBA,把VBA宏派上用场。在Excel工作表中,我们可以轻松地根据标准功能,使用"数据"菜单内的"筛选"功能,完成多种多样的筛选以处理各式各样的信息。我们这讲的内容是利用VBA完成自动筛选。
对于应用而言,从小数据集合中过滤掉必要的信息可以使用"筛选"功能。但是,如果你希望根据多个标准和条件过滤大量数据,利用VBA自动过滤器功能可以更轻松。它可以为你节省大量的时间和精力。例如,假设你希望筛选下拉列表中的某些信息(基于多个标准),然后将结果复制/粘贴到其他工作表中。如果手动完成,这似乎是一项非常耗时的任务。在这种情况下,VBA可以帮助你自动化完成这个过程。
我们看下面的工作表:
让我们来研究一下上图中给出的数据集。假设我们希望根据"性别"列筛选上述数据集。要实现此筛选,并得到“性别=男”的数据,我们将以以下方式编写代码:
Sub mynzA()
'清空数据
Sheets("SHEET1").Select
Cells.ClearContents
With Sheets("Sheet2").Range("A1")
'筛选需要的数据
.AutoFilter Field:=3, Criteria1:="男", VisibleDropDown:=False
'将筛选后的数据复制到指定位置
.SpecialCells(xlCellTypeVisible).Copy Sheets("SHEET1").Range("A1")
'去掉筛选
.AutoFilter
End With
End Sub
代码截图:
代码的解读:
① With Sheets("Sheet2").Range("A1")
.AutoFilter Field:=3, Criteria1:="男", VisibleDropDown:=False
以上代码是以相对于“A1”开始,从左侧字段开始的第三个字段设为筛选字段。查找的是此字段的值为“男”的数据
② '将筛选后的数据复制到指定位置
.SpecialCells(xlCellTypeVisible).Copy Sheets("SHEET1").Range("A1")
以上代码将筛选后的数据复制到Sheets("SHEET1").Range("A1")。其中
Range.SpecialCells方法返回一个Range对象, 该对象代表与指定类型和值匹配的所有单元格。
语法:expression.SpecialCells (Type, Value)
其中expression 一个表示 Range 对象的变量。
参数:
a Type 必需 XlCellType 要包含的单元格。
b Value 可选 Variant 如果Type为xlCellTypeConstants或xlCellTypeFormulas, 则此参数用于确定要在结果中包含哪些类型的单元格。将这些值相加可返回多种类型的单元格。默认情况下,将选择所有常量或公式,无论类型如何。
XlCellType 枚举值:
1) xlCellTypeAllFormatConditions -4172 任意格式的单元格。
2) xlCellTypeAllValidation -4174 含有验证条件的单元格。
3) xlCellTypeBlanks 4 空单元格。
4) xlCellTypeComments -4144 含有注释的单元格。
5) xlCellTypeConstants 2 含有常量的单元格。
6) xlCellTypeFormulas -4123 含有公式的单元格。
7) xlCellTypeLastCell 11 所用区域中的最后一个单元格。
8) xlCellTypeSameFormatConditions -4173 格式相同的单元格。
9) xlCellTypeSameValidation -4175 验证条件相同的单元格。
10)xlCellTypeVisible 12 所有可见单元格。
SpecialCells(xlCellTypeVisible).Copy 是指可以复制所有可见的单元格
③ '去掉筛选
.AutoFilter
在原数据中去除筛选格式。
最后我们看代码的运行结果:
仍是上表中的数据:
我们要取得年龄为12和8的数据,利用VBA该如何得到呢?
看我给出的代码:
Sub mynzB()
'清空数据
Sheets("SHEET1").Select
Cells.ClearContents
With Sheets("Sheet2").Range("A1")
'筛选需要的数据
.AutoFilter Field:=2, Criteria1:=12, Operator:=xlOr, Criteria2:=8, VisibleDropDown:=False
'将筛选后的数据复制到指定位置
.SpecialCells(xlCellTypeVisible).Copy Sheets("SHEET1").Range("A1")
'去掉筛选
.AutoFilter
End With
End Sub
代码截图:
代码解读:
① '筛选需要的数据
.AutoFilter Field:=2, Criteria1:=12, Operator:=xlOr, Criteria2:=8, VisibleDropDown:=False
以上代码是取得Criteria1 Or Criteria2的值。
代码的运行效果:
本讲内容参考程序文件:应用003.xlsm
我20多年的VBA实践经验,全部浓缩在下面的各个教程中: