今天我们带大家一起来实现一下VBA多表汇总,逐句讲解+分析思路,如果你是0基础,听完起码知道如何修改代码,也就非常奈斯了!
我们说的是多表指的是多工作表(WorkSheet或者Sheet)
需求:汇总1-3月数据到汇总表
需求分析:
我们程序做的其实就是模仿人工做的,把人工处理的逻辑转成程序可以认识的语句,所以我们首先要分析一下人工是如何处理的!
人工处理非常简单,分两步:
步骤01 :复制数据
复制数据,我们人工复制非常简单,因为你知道什么地方是有效数据区域,开始和结束位置,你是怎么判断的呢?你说有内容的最后一行就是结束位置呀,那么这个就要转成Excel能认识的VBA语句!
步骤02 :粘贴数据
粘贴数据,我们人工粘贴也是无感的,反正就是贴,但是你贴的时候也不是随意贴的,你接着上次粘贴内容的最后一行空白行粘贴的,这个最后一行有内容的行号的下一个空白,我们要转成语句,问题也就解决了!
本文由“壹伴编辑器”提供技术支持
根据我们分析人工操作下来,我们核心就是要知道如何表示数据的最后一行!
这个VBA有自己的规则:
Cells(Rows.Count,1).End(xlup).Row
以上表示,从A列(其他列把1修改成对应的列即可)的最后一个单元格往上找,找到首个有内容的单元格,并获取行号(ROW),这个跟我们自己手动啊
知识点:
Cells(行,列) - 单元格的一种表示方法,列可以使用字母表示
Cells(1,2) 和 Cells(1,"B") 都表示第一行第二列交叉的单元格-B1
虽然这些都有了,但是我一个小白,还是不知道怎么做呀?
这个是否,就要说Excel做的好的地方了,录制宏!
动画演示:如何录制宏
如果没有看到开发工具,按下面步骤操作一下即可。
【文件】 - 【选项】- 【自定义功能区】 - 【开发工具】 勾上 确定即可!
动画演示:查看录制的宏
查看宏的方式有很多,除了上面的点击【Visual Basic】 还可以 右击任意工作表名称,选择 【查看代码】 或者按下 ALT+F11 查看!
我们来看一下录制宏的代码:
Sub 多表汇总()
'
' 多表汇总 宏
'
'
Range("A1:G10").Select
Selection.Copy
Sheets("汇总表").Select
Range("A1").Select
ActiveSheet.Paste
Columns("B:B").EntireColumn.AutoFit
Range("D6").Select
End Sub
知识点:
1、如何在VBA中做一些说明注释
单引号的部分(' 多表汇总 宏),表示注释,也就是对程序或者内容做一些补充说明,对程序本身没有影响
2、VBA中如何表示单元格
我们的每个动作都被录制下来,后续还可以反复运行!
出现比较多的就是单元格的操作,那么单元格怎么表示呢?
单元格表示:Range("单元格地址")
这个是单元格的一种表示方式,但是不是唯一的,以后大家会慢慢接触到其他表示方式!Select 就是因为意思,选择!Copy就是复制,上面就是选择了A1:G10,然后复制,最后粘贴到,粘贴我们要切换报,这里就会涉及到VBA中如何表示工作表?
3、VBA中工作表的表示方式
这个 Sheets("汇总表").Select 就表示选择了名称为汇总表的工作表,那么你也应该可以猜出表示方式了!
工作表表示方式:Sheets("工作表名称")
4、常用的几个单词
- Range:表示单元格
- Sheets:表示工作表
- Copy:复制
- Select:选择
- Paste:粘贴
有了上面的基础,下面我们就来看看如何修改代码
本文由“壹伴编辑器”提供技术支持
如何修改代码,实现多表汇总?
1、指定复制的是哪个表,使用Sheets,A1:G10 这个10不是固定的,我们要使用 cells(rows.count,1).End(xlup).row 的方式来处理一下!
比如我们要复制1月份的数据,那么应该是这样的
Sheets("1月").Range("A1:G"&Sheets("1月").Cells(Rows.count,1).End(xlup).row)
Sheets("1月").Cells(Rows.count,1).End(xlup).Row:表示根据1月份A列从下往上找到首个有内容的单元格的行号!
你会发现上面写得太长了,这个是否,我们可以找个东西,帮我们存储一下,给这个东西起个简短的名字,以后就可以使用这个来代替这串长的内容了
其实这个东西就叫做 变量,以后慢慢来学习
这样我们就解决了如何准确地复制内容,下面是确定每次粘贴的位置,第一次可能直接粘贴到A1,第二次呢?上次粘贴后一行空白行?
这个同样可以使用Cells(Rows.count,1).End(xlup).Row 来处理!
我们MaxRow,来表示汇总表中有数据的下一个空白行
MaxRow = Sheets("汇总表").Cells(Rows.Count, 1).End(xlUp).Row+1
这样我们就完成了一次复制粘贴,下面要解决的就是多次复制粘贴问题
当然你可以复制上面的内容,反复粘贴,但是显然那样是毫无意义的!
这个事情,是不是循环在处理,在VBA中,我们使用
For 变量 = 开始 to 结束
干点啥
Next
来表示循环执行
工作表不仅可以通过名称来表示,也可以按照顺序表示,比如Sheets(1)就表示第一张表!还有就是Excel大部分Select选择的代码都可以去掉,直接对象.操作即可
所以我们的代码可以修改为
好像差不多了,我们好像还没说怎么运行?
其实很简单,在代码窗口,按一下F5即可,当然也有界面操作,【运行】 - 【运行子过程】
▼ 动画演示-如何执行代码
虽有瑕疵,但是我们成功地把3个月的数据合并到汇总表中了!这些瑕疵,随着我们不断深入地去学习,慢慢都会解决!
下面不是本次的重点,上面学会就挺好的了!
1、修复标题粘贴问题
首次粘贴的位置为A1,且粘贴标题,其他都从第二行复制内容粘贴
2、复制粘贴内容可以一句完成
以上我们就需要使用判断语句IF来处理,今天我们适当看一下,知道这么回事即可!
这样我们就做出一个完全可以实现多表汇总的宏了!
有的同学说了,你这里就3个表,实现情况并不是这样,我可能有多个,具体几个我不知道,那怎么办呢? 一来你知道个数可以直接修改
i = 2 To 4(修改为实际的表个数)
当然这个不够智能,所以我们需要一个方法来获取工作做的数量,这个简单
共有多少个工作表:Sheets.Count
简单修改一下,我们可以应付任意多个表合并了!
Sub 多表汇总()
' 多表汇总 宏
'从第2行表到第4张表(1月-3月)
For i = 2 To Sheets.Count
If i = 2 Then
iStartRow = 1 '首次从A1复制
MaxRow = 1 '首次粘贴到汇总表A1
Else
iStartRow = 2 '否则从跳过标题,从第二行开始
'汇总表中有数据的下一行
MaxRow = Sheets("汇总表").Cells(Rows.Count, 1).End(xlUp).Row + 1
End If
'用IROW 代码这一串内容
iRow = Sheets(i).Cells(Rows.Count, 1).End(xlUp).Row
Sheets(i).Range("A" & iStartRow & ":G" & iRow).Copy _
Sheets("汇总表").Range("A" & MaxRow)
Next
End Sub
▼ 修改后的代码汇总演示
这样你就自己制作了一个可以实现多表汇总的VBA宏啦!
使用控件等方式运行代码推荐阅读:Excel中运行VBA(宏)代码的方法!
功能虽然简单实现了,但是还是有些东西没有考虑,还可以慢慢完善,比如:
1、每次汇总前删除汇总表数据,确保数据最新!
2、我要汇总的表,并不是第二个开始的全部
3、我要汇总的是指定表名的多个或者按照名称规则等等
4、汇总好,能不能给个提示,告诉我汇总了几个,是否都汇总了等等
5、为了简洁,上面的变量都没有申明等等问题!
VBA的东西很多,非一篇文章可以说尽,如果你感兴趣,那就就学起来吧!
Excel办公实战 分享与Excel相关的知识,以实战为主; 函数、VBA、图表、Power Query、技巧、Python爬虫等 667篇原创内容
最新评论