VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表 | 您所在的位置:网站首页 › 多张工作表汇总 › VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表 |
VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表
需求:现有3个班级的成绩表,需要筛选出成绩>=90分的成绩及科目。
找数据的第一个空行,最好使用range(“a1048576”).end(xlup).offset(1,0) 或者range(“a1048675”).end(xlup)(2,1) ------------------------------20220425更新--------------------------- 筛选多列同时满足某条件的数据,并汇总到某个工作表中如图有多个班级的同学成绩,需要将每门课程成绩都>=65分的同学筛选出来
方法1:先定义固定长度的数组arr1(会有很多空值,因为只有部分满足条件),再将arr1中不为空的数据复制给arr2,再将arr2粘贴到数据表中。 注意:如果数组中有空值,则无法复制到数据表!!! Sub 多表筛选2() Dim arr Dim arr1() '定义一个可变长度的数组,与dim preserve一起使用,必须要() Dim sht As Worksheet Dim nr%, nc%, m% Application.DisplayAlerts = False '关闭提醒 For Each sht In ThisWorkbook.Worksheets '如果原始表中有“各科均不低于65分”,则删除 If sht.Name = "各科均不低于65分" Then sht.Delete End If Next sht Application.DisplayAlerts = True '打开提醒 n = 1 '用于计算存储满足条件的数据的列数,因为要增加一个字段为班级,所以初始设置为1 For Each sht In ThisWorkbook.Worksheets '开始循环 arr = sht.Range("a1").CurrentRegion arr = Application.Transpose(arr) '把数据转置 For nr = 2 To UBound(arr, 2) '从第二列开始循环每一列 For nc = 2 To UBound(arr) '从每一列的第二行开始循环 If arr(nc, nr) >= 65 Then '如果值>=65则 m = m + 1 'm用来存储当列>=65的个数,从而判断是否每一个数据都>=65 End If Next nc If m = UBound(arr) - 1 Then '如果每列>=65的个数=行数-1(1为姓名所在的行) n = n + 1 '新的数组长度扩1 ReDim Preserve arr1(1 To UBound(arr) + 1, 1 To n) '重新定义数组的长度 arr1(1, n) = sht.Name '1行n列的名字均为班级 For nc = 1 To UBound(arr) '将原表的数组数据赋值到新数组 arr1(nc + 1, n) = arr(nc, nr) Next nc End If m = 0 Next nr Next sht arr1 = Application.Transpose(arr1) '转置回来 arr = Application.Transpose(arr) arr1(1, 1) = "班级" '重新定义新数组的第一行第一列 For nc = 1 To UBound(arr, 2) '定义第一行的每一列 arr1(1, nc + 1) = arr(1, nc) Next nc Worksheets.Add(before:=Worksheets(1)).Name = "各科均不低于65分" '建表 Worksheets("各科均不低于65分").Range("a1").Resize(n, UBound(arr, 2) + 1) = arr1 '复制 End Sub方法2:使用 dim preserve 数组名(新的长度),注意dim preserve 只能重新定义最后一维数据的长度,所以需要先将数转置,从而扩充列的长度。 Sub 多表筛选() Dim arr Dim arr1(1 To 999, 1 To 999) '先固定长度,长度要足够大 Dim arr2 '用来存储没有空值的arr1 Dim sht As Worksheet Dim nr%, nc%, m% Application.DisplayAlerts = False For Each sht In ThisWorkbook.Worksheets If sht.Name = "各科均不低于65分" Then sht.Delete End If Next sht Application.DisplayAlerts = True n = 1 For Each sht In ThisWorkbook.Worksheets arr = sht.Range("a1").CurrentRegion For nr = 2 To UBound(arr) For nc = 2 To UBound(arr, 2) If arr(nr, nc) >= 65 Then m = m + 1 End If Next nc If m = UBound(arr, 2) - 1 Then n = n + 1 arr1(n, 1) = sht.Name For nc = 1 To UBound(arr, 2) arr1(n, nc + 1) = arr(nr, nc) Next nc End If m = 0 Next nr Next sht arr1(1, 1) = "班级" For nc = 1 To UBound(arr, 2) arr1(1, nc + 1) = arr(1, nc) Next nc Worksheets.Add(before:=Worksheets(1)).Name = "各科均不低于65分" ReDim arr2(1 To n, 1 To UBound(arr, 2)) '重新定义arr2的长度 For nr = 1 To n For nc = 1 To UBound(arr, 2) arr2(nr, nc) = arr1(nr, nc) Next nc Next nr Worksheets("各科均不低于65分").Range("a1").Resize(n, UBound(arr, 2)) = arr2 End Sub |
CopyRight 2018-2019 实验室设备网 版权所有 |