打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【跟我学Excel VBA】第六课:将多个工作表瞬间汇总的绝招

眼看就年底了,如果你是联锁企业,如果你是集团公司总部,如果... 那么你一定会有很多同样类型的报表需要汇总。在这个时候,我们即时推出了这么一课,在巩固学习我们的循环的同时,也能解决我们工作上的问题。





请看下图,“学生”表是一张空表,从第2张表开始,结构都是一样的,也就是说,后面所有表的列的个数、名称、顺序,跟我们现在看到的“考古学98”班是一样的,只不过数据不同而已。


记住以上说的,Excel不是万能的,VBA也不是万能的。如果你想保证你的汇总结果的准确性,请保证每个表格的格式一样。




现在,我们需要把这所有班级的学生信息全部合并到“学生”表里。




问题1:这里到底有几张班级表呢?


我们来创建一个名叫“工作表基础”的sub程序,输入一行代码,可以动态输出当前工作簿中工作表的个数。



解析:

1)Worksheets.Count:表示工作簿中的工作表总个数;

2)Debug.Print:该语句作用是在“立即窗口”中输入一句话。打开立即窗口可以使用组合键Ctrl G。

所以,上面这一行代码的意思就是:在立即窗口中,输出工作表的总个数。看到了吗?输出了一个13。说明我的当前工作簿中目前有13张工作表。




问题2:如何表示每张工作表呢?


当我们要做多表合并时,必然需要拿到每张表,才能进行逐个的合并。所以,如何拿到每一张表,是必然要掌握的一个点。

我们来看看,同样表示“旅游文化1班”,有哪些表示方法。



解析:通过“工作表.Name”可以输出一张工作表的名称(这个名称就是我们平常看到的工作表标签那个名称)

Worksheets('旅游文化1班'):这种表示方法很简单,就是在括号里直接使用工作表名称,就可以表示该工作表了;

Worksheets(3):这种表示方法,数字3表示的是该工作表在本工作簿中的序号。由于“旅游文化1班”现在处于第3的位置,所以Worksheets(3)就表示它。

我们可以再加一行代码,可以看到Worksheets(2).Name输出了第2张工作表的名称“考古学98班”,这么讲,您应该懂了吧?



如果您自认为懂了Worksheets(n)这种工作表的表示方法的话,那么能否帮我解释一下为什么Worksheets(Worksheets.Count)表示的是“最后一张工作表”?

Sheet4:这种表示方法只能在VBA代码环境中才看得到。请一定要区分开划横线的部分使我们说的Sheet4,它叫CodeName,括号里是我们平常熟知的“工作表名称”,不要搞混了哟。


OK,知道了如何表示一张工作表后,大家不妨略微思考一些:如何表示“会计1班”这种表??


问题3:到底应该如何将这若干张工作表合并到一起?


我写了一个核心思路,来给大家分析分析。




解析:

基本思想其实很简单,就是每取一张工作表,就拿一张表的数据到“学生”表去。所以,请看上面这段代码,绿色部分就是需要重复的一个操作。

1)i = 2 To Worksheets.Count:意思是从第2张表开始,一直取到最后一张,因为第1张是“学生”表,用来存放合并结果的;

2)当i=2时,把Worksheets(2)(也就是第2张工作表)的数据拿到“学生”表,当i=3时,把Worksheets(3)(也就是第3张工作表)的数据拿到“学生”表,以此类推。


稍加完善,代码如下:



解析:

1)iRows = Worksheets(i).Range('A1').CurrentRegion.Rows.Count

如果把每一个小圆点(.)理解为“的”的话。这行代码可以这么来写:“iRows = 第i张工作表  的   A1单元格   的     连续区域    的     所有行   的     数目”。其实就是,当i每取一个值的时候,先获得第i张表有效数据的总行数,存入iRows;

2)k = Worksheets('学生').Range('A1').CurrentRegion.Rows.Count 1

理解了上面那个iRows的意思,这个k自然就很清楚了,它表示“学生表中A1单元格连续区域的总行数 1”,意思就是把学生表的有效行数 1,这是为何呢?




看“学生”表。还没有往里面拿进数据时,它只有一个标题,这时候如果要把第1张表数据拿进来,是不是应该从第2行开始放数据?

再看,如果已经在“学生”表里放入一些数据了,比如现在10行,那么下一张表的数据是不是应该从第11行开始放?




所以,每次复制一张工作表数据到“学生”表的时候,都必须先获取“学生”表中当前已有数据的总行数,然后从这个总行数的下一行开始放数据,所以 1。

3)Worksheets('学生').Range('A' & k).Resize(iRows, 6).Value = _

        Worksheets(i).Range('A1').CurrentRegion.Offset(1, 0).Value

这2行代码其实是1行代码,由于实在太长,在=后面加入一个'下划线'作为续行。意思就是告诉电脑,这行还没写完,要在下一行继续写。

Worksheets('学生').Range('A' & k).Resize(iRows, 6).Value,来看看这行代码。意思是“学生表的A列第k个单元格扩展为iRows行6列”。

看下图,假如现在“学生”表里已经有10行数据,这时候需要把“旅游文化1班”数据拿过来,假设“旅游文化1班”一共有3行数据,那么通过前面学习知道k=11,iRows=4(包含标题行),这行代码意思就是“把学生表A11单元格扩展为4行6列”,如下图选中区域的样子。用这片区域来接收新数据。



扩展效果:




Worksheets(i).Range('A1').CurrentRegion.Offset(1, 0).Value,这行代码同样用两张图来解释。

Worksheets(i).Range('A1').CurrentRegion:表示A1的连续区域,假如i=3,就表示第3张表的A1的连续区域,假设第3张表有6行,这行代码表示的含义就是选中区域。




Offset(1, 0):意思是“向下偏移1行、列不偏移”,偏移效果如下:




这样做的目的是为了只取数据,不要标题行,您想想最后我们需要的样子就明白为什么这么做了。


最后,合并多表的完整代码如下:


前面已经将最核心、最难的代码一一解释,这里没有解释的部分,通过单引号(')做了注释,也就是代码中的绿色文字部分。

如果您只是满足于手指拨动翻一下,我估计您是无法学会VBA的,趁早放弃。您不动手把代码敲到计算机里运行一下,您永远不知道会出现什么错误,您永远不知道我在说什么。




本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Range对象应用大全(3)—CurrentRegion属性详解
VBA简单入门13:Worksheet对象的UsedRange属性
在VBA代码中引用工作表单元格区域的方式小结
VBA实战技巧01: 在代码中引用动态调整单元格区域的5种方法
Excel VBA 7.55按照数据区域拆分工作表,报表拆分玩出新花样
将多个工作表的数据合并到一个工作表中
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服