楼主 kevinchengcw |
对于格式相同的工作表汇总有很多方法,这里我演示一种引值的汇总方式,即目标区数据=源数据区数据值的方式,以及汇总后设置成动态序列号的方法,代码如下:- Sub test()
- Dim Ws As Worksheet
- Dim M, N, I As Long
- Application.ScreenUpdating = False '关闭屏幕刷新
- For Each Ws In Worksheets '列举当前工作簿中的全部工作表
- If Ws.Name <> ActiveSheet.Name And Ws.Name <> "資料表" And Ws.Cells(3, 3) <> "" Then '如果工作表名不等于不需要汇总的表名,且工作表的需汇总区域存在数据,则
- I = Ws.Cells(Ws.Rows.Count, 3).End(3).Row '判断需汇总区域的最后一行位置
- With ActiveSheet
- .Cells(.Cells(Rows.Count, 3).End(3).Row + 1, 2).Resize(I - 2, 11) = Ws.Cells(3, 2).Resize(I - 2, 11).Value '将要汇总的工作表的汇总数据区域的值直接引用到汇总表数据末尾的相同大小的区域(注意相关数值获取方法,本例未引用序列列,因汇总表中需重新编号)
- End With
- End If
- Next Ws
- ActiveSheet.Range(Cells(3, 1), Cells(Cells(Rows.Count, 3).End(3).Row, 1)).Formula = "=row()-2" '将序列号列设置成公式,便于适应调整
- Application.ScreenUpdating = True
- End Sub
这样对于格式相同的工作表的操作速度远快于复制粘贴的方式。 如果您不怕看得头晕的话,可进一步简化成下列代码:- Sub test2()
- Dim Ws As Worksheet
- Dim M, N, I As Long
- Application.ScreenUpdating = False '关闭屏幕刷新
- For Each Ws In Worksheets '列举当前工作簿中的全部工作表
- If Ws.Name <> ActiveSheet.Name And Ws.Name <> "資料表" And Ws.Cells(3, 3) <> "" Then _
- ActiveSheet.Cells(ActiveSheet.Cells(Rows.Count, 3).End(3).Row + 1, 2).Resize(Ws.Cells(Ws.Rows.Count, 3).End(3).Row - 2, 11) = Ws.Cells(3, 2).Resize(Ws.Cells(Ws.Rows.Count, 3).End(3).Row - 2, 11).Value '如果工作表名不等于不需要汇总的表名,且工作表的需汇总区域存在数据,则将要汇总的工作表的汇总数据区域的值直接引用到汇总表数据末尾的相同大小的区域(注意相关数值获取方法,本例未引用序列列,因汇总表中需重新编号)
- Next Ws
- ActiveSheet.Range(Cells(3, 1), Cells(Cells(Rows.Count, 3).End(3).Row, 1)).Formula = "=row()-2" '将序列号列设置成公式,便于适应调整
- Application.ScreenUpdating = True
- End Sub
附示例文件。
引值方式汇总相同格式工作表.rar |