Excel VBA 7.35针对所有工作表进行筛选取数,你只能一个个筛选粘贴?太低效了!

一起学习,一起进步~~

之前有小伙伴表示,自己在日常的工作中,经常需要针对同个工作薄内所有的工作表的数据进行筛选,将满足条件的数据最终全部汇总在一个工作表中,因为工作表的数量很多,一个个的筛选之后再去复制粘贴非常的慢,希望能够通过VBA实现自动化的效果,今天我们就来看看这个功能要如何实现

场景简介

首先我们准备一个数据源,是我们之前曾今使用过的一个案例,各学科考试成绩表的案例

我们现在需要将这个工作薄中所有英语成绩大于110的学生的成绩提取出来,放在一个新的工作表里面,其实方法有很多种,可以选择使用数组,因为我们没有分享过关于筛选的方法的使用,所以今天我们就采用筛选的方式来进行,扩展下大家的知识面

至于数组的方法嘛,大家可以自己尝试下,算是小练习吧

代码区

Sub TEST()Dim rng As Range, trng As Range, sthn As WorksheetSet rng = Application.InputBox("请选择表头所在的区域", "表头位置的确定", , , , , , 8)Set trng = Application.InputBox("请选择要筛选的列", "筛选列的确定", , , , , , 8)Worksheets.Add after:=Worksheets(Worksheets.Count)Set sthn = ActiveSheetsthn.Name = "最终筛选结果"NumR = rng.Rows.CountNumC = trng.ColumnFor Each sth In WorksheetsIf 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 WithEnd IfNext sthEnd 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,准时再见。

(0)

相关推荐