Excel VBA 7.35针对所有工作表进行筛选取数,你只能一个个筛选粘贴?太低效了!
一起学习,一起进步~~
之前有小伙伴表示,自己在日常的工作中,经常需要针对同个工作薄内所有的工作表的数据进行筛选,将满足条件的数据最终全部汇总在一个工作表中,因为工作表的数量很多,一个个的筛选之后再去复制粘贴非常的慢,希望能够通过VBA实现自动化的效果,今天我们就来看看这个功能要如何实现
场景简介
首先我们准备一个数据源,是我们之前曾今使用过的一个案例,各学科考试成绩表的案例
我们现在需要将这个工作薄中所有英语成绩大于110的学生的成绩提取出来,放在一个新的工作表里面,其实方法有很多种,可以选择使用数组,因为我们没有分享过关于筛选的方法的使用,所以今天我们就采用筛选的方式来进行,扩展下大家的知识面
至于数组的方法嘛,大家可以自己尝试下,算是小练习吧
代码区
Sub TEST()
Dim rng As Range, trng As Range, sthn As Worksheet
Set rng = Application.InputBox("请选择表头所在的区域", "表头位置的确定", , , , , , 8)
Set trng = Application.InputBox("请选择要筛选的列", "筛选列的确定", , , , , , 8)
Worksheets.Add after:=Worksheets(Worksheets.Count)
Set sthn = ActiveSheet
sthn.Name = "最终筛选结果"
NumR = rng.Rows.Count
NumC = trng.Column
For Each sth In Worksheets
If sth.Name <> "最终筛选结果" Then
sth.Activate
l = sthn.Cells(Rows.Count, 1).End(xlUp).Row
With sth.UsedRange
Rows(NumR).AutoFilter Field:=NumC, Criteria1:=">100"
With sth.AutoFilter.Range.Offset(1, 0)
.SpecialCells(xlCellTypeVisible).Copy sthn.Cells(l, 1)
End With
End With
End If
Next sth
End Sub
代码并不算是很复杂,我们主要是学习如何通过VBA实现筛选和筛选之后区域的选择
首先我们需要确定两个区域,一个是表头区域
一个是我们要进行筛选的列
之后就可以等待程序运行的结果了。
最终所有的英语成绩大于110的数据就全部被独立筛选出来l
我们来验证下,第三个表C开头的姓名中,英语成绩大于110的,有7人,而总表中也是7个,那就说明我们的数据筛选结果是正确的的
代码分析
我们来看看代码是如何实现我们的需求的
首先我们已经通过表头和筛选列的位置得到了表头总共有多少行
NumR = rng.Rows.Count
筛选列是第几列
NumC = trng.Column
之所以想要得到这两个数据,是因为在VBA中,代替筛选的方法是需要这两个数据的。
然后我们遍历进入每一个工作表,首先启动筛选,我们在表头所在行进行启动筛选
然后进行自定义筛选,需要做的鼠标操作比较的多,在VBA中这两个工作合并在一起,用一句话就可以实现
Rows(NumR).AutoFilter Field:=NumC, Criteria1:=">110"
粗暴的翻译过来就是在第几行开启筛选,选择第几列的数据中的条件是什么
执行了上面这一步之后,结果就已经出来了。 那么我们需要做的就是讲这个筛选结果复制到汇总表中,这里又有一个知识点
就是如何针对筛选的结果复制。
With sth.AutoFilter.Range.Offset(1, 0)
.SpecialCells(xlCellTypeVisible).Copy sthn.Cells(l, 1)
End With
非常简单的一个with语句
.SpecialCells(xlCellTypeVisible).Copy 是特殊查找的意思,查找什么?所有可见单元格,就是结果的可见区域
不可见,就是不符合条件的区域是不在这个范围内的,所以刚好将这个区域复制过来就是可以了。
最后加上统一的表头,数据就完美了。
最后再说明一点,这个方法并不唯一,上面的案例主要是和大家分享用VBA实现筛选和筛选之后可见区域的选择的方法
================================================
好了~明晚21:00,准时再见。