文/黄波艺
相信在工作中,很多时候会涉及多张工作表合并。特点是每张工作表的字段(标题)一致,但是数据不一样。例如各地的销售报表,各个部门的财务报表等等。如果是三两张表,怎么合并都问题不大。但是如果有几十上百张表呢?怎么处理?
方法不限于以下三个:
一. Ctrl + C, Ctrl + V
数据的搬运工,理论上也是没有问题的。可是当你在苦逼苦逼地复制粘贴,挑灯夜战,头发冒烟的时候,可曾想妹子/暖男早跑光了呢?
二. VBA for Excel
对VBA有一定了解的话,也不难。基本逻辑是:选取工作表的数据区域—复制—粘贴到汇总表—循环所有工作表。同样是复制粘贴,不过前者自己动手,后者让机器动手。但是单纯为了合并几十张表专门学VBA的话,恐怕不一定所有人都有这兴趣和耐心。
干脆顺便把代码也贴出来,有兴趣的朋友可以看看。
<code>
Sub collectAll()
Dim i As Integer
'如果在03-07版本运行,行数只有65535行,请把1048576改为65536.
Sheets(1).Range("a2:h1048576").ClearContents
For i = 2 To Sheets.Count
Sheets(i).Range("a2",”Sheets(i).Range("a2").End(xlToRight).End(xlDown)).Copy (Sheets(1).Range("a1048576").End(xlUp).Offset(1, 0))
Next
End Sub
</code>
无论什么时候工作表的记录发生增删修改(包括增加字段),运行以上代码均可即时刷新汇总数据。
三. 用数据整理利器PowerQuery
前面我说了这么多,显然就是为就是为今天的主角--PowerQuery做铺垫的。
“查询增强版(PowerQuery)是一个Excel插件,是Power BI(商业智能)的一个组件。
使用PowerQuery,您可以:
从你所需要的数据来源提取数据(如关系型数据库、Excel、文本和XML文件,OData提要、web页面、Hadoop的HDFS,等等)
使用搜索功能,从内部和外部发现相关的数据功能。
把不同来源的数据源整合在一起,建立好数据模型,为用Excel、Power Pivot、Power View、Power Map进行进一步的数据分析做好准备。
与他人分享您所创建的查询,让他们可以很容易地通过搜索找到它。”
--摘自微软官方
简单点说,PowerQuery就是PowerBI(商业智能)的一个组件,在Office2016版和Office365版本中,直接嵌入到了Excel(如果是旧版本,可以到微软官方网站下载插件安装)。它是一个数据查询,整理,清洗的工具。而整理数组的目的主要就是为了对下一步PowerPivot的数据建模和分析做准备。不过就算我们不需要进行数据建模和制作仪表盘,也可以利用PowerQuery进行数据处理。
言归正传,在PowerQuery合并多个工作表那就简单多了。因为是对象化操作,操作界面友好,不需要写代码(当然PowerQuery还是可以利用M代码进行更高级的操作,比如如果要合并多个工作簿的话就需要修改一下操作步骤的代码)。
以下演示基于Excel2016专业增强版(不同版本的操作面板可能有差异,但核心的操作命令是一样的)。
第一阶段:
从数据选项卡进入PowerQuery查询;
当我们进入PowerQuery之后,发现共有31个工作表,其中每个工作表中有一个表。常规做法是建立31个查询,然后通过“追加查询”(Union all)的方式汇总所有数据。
但是,这样做有两个问题:
- 建立31个查询的速度比建立1个查询的速度慢的可不止31倍;
- 需要一个个地把所有表添加到“追加查询”的列表中,如果有几百个表呢?(都用上PowerQuery了,难道我还会做这些这么没技术含量的重复动作吗?)
所以,不要选择多个,选择建立任意一个查询就好了。
第二阶段:
其实我们并非要这一张表的数据,而是要通过这张表向上追溯它的源头。所以,建立查询后,把“源”之后的应用步骤都删掉。然后我们就可以看到“源”数据的真面目了:工作簿里包含的所有表,位于data字段,正是我们要合并的数据。我们只要保留data字段就好了。接着把data字段里的所有table的所有字段都扩展出来。
至此为止,此工作簿中的所有表已经被合并。然而,工作还未完成。
第三阶段:
虽然所有表已经被合并,但是我们还需要设置好字段:把首行提升到字段。另外,因为每个表的表头都被合并了过来,所以我们还需要通过筛选去除每个表的表头。
最后一步,保存并上载到Excel。Mission Complete!
如果光看文字,可能会觉得复杂,但是实际操作起来就是几分钟的事。而且建立了链接后,任何时候只要刷新汇总表就能得到最新的数据—真正意义上的一键刷新(甚至还可以写一小段VBA代码实现当每次工作表被激活(Activate)时就自动刷新。爽翻了!)。
这个小小的功能,对于PowerQuery而言仅仅是冰山一角罢了。有时候,PowerQuery能轻易地做到一些些在Excel中很费力气的工作。尤其在面对海量数据的时候,Excel函数的运行效率会表现出一定的局限性。
个人之言,PowerQuery确实是查询,整理数据的利器,还有更多好玩的东西可以让大家发掘。有兴趣的朋友可以研究研究。