多表合并(Power Query 、SQL、函数与公式、VBA四种方法)

sunnynie

工作中有时候需要将多张工作表合并到一张工作表,本文总结了四种方法:Power Query 工具、SQL、函数与公式、VBA,四种方法难度依次递增。

有N多个以月份命名的excel工作表(为演示方便以6个为例),每张表字段名相同,现需要把表格全部合并到一个表中去。

工作表名:


图 1

每张表字段名:


图 2

 方法一:借助Power Query工具

Power Query是Excel 2016标配的功能。下面我们看看怎么利用这个工具实现多表合并。

操作步骤如下:

Step1:点击菜单数据→新建查询→从文件→从工作簿,找到当前文件的位置并导入;


图 3


图 4

Step2:在打开的导航器,选择要合并的多个工作表,再点击“编辑”;


图 5

Step3:在打开的“查询编辑器”中点击“追加查询”,选择要合并的工作表,点击“确定”;


图 6

Step4:点击“关闭并上载”,瞬间生成了6张工作表,sheet1就是把6个月的报表合并后的汇总表,sheet2到sheet6是多余无用的表,点击sheet2,按住shift键选中sheet2到sheet6工作表,右键“删除”。


图 7


图 8


图 9

方法二:SQL

Step1:打开多表合并后需要存放的工作表,点击菜单数据→现有连接→浏览更多,找到需要合并的文件,点击“打开”:


图 10

Step2: 在选择表格页面点击“确定”,进入“导入数据”,点击“属性”,


图 11


图 12

Step3:在连接属性→定义→命令文本处输入SQL语句:

select "1月" as 月份, * from [1月$] union all

select "2月" as 月份, * from [2月$] union all

select "3月" as 月份, * from [3月$] union all

select "4月" as 月份, * from [4月$] union all

select "5月" as 月份, * from [5月$] union all

select "6月" as 月份, * from [6月$]


图 13

点击“确定”,返回图12界面,再点击“确定”,瞬间即把6张表汇总到一张表,

并且增加一个字段月份,部分数据截图如图:

 

图 14

如果不需要增加字段月份,SQL语句修改为:

select * from [1月$] union all

select * from [2月$] union all

select * from [3月$] union all

select * from [4月$] union all

select * from [5月$] union all

select * from [6月$]

如果月份更多,SQL语句可以在Excel中录入,录入1月的SQL语句,点击单元格右下角的黑色+,用鼠标往下拖动自动生成其他月份的SQL语句,删掉最后一个union all,再复制粘帖到记事本。

方法三:函数与公式

Step1:在汇总表输入字段名,A2单元格手工输入第一张工作表1月,点击单元格右下角+往下拖动到A7,如图15:


图 15

Step2:在B2单元格输入公式=INDIRECT($A2&"!"&ADDRESS(INT(ROW(A1)-1)/6+2,COLUMN(A1))),向右拖动公式,再向下拖动公式,得到


图 16

公式说明:

把/6中数字6修改为要合并的工作表实际个数。$A2是工作表名称所在列(本例是A列)

INT((ROW(A1)-1)/6)+2:目的是生成2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4..序列

ADDRESS():动态生成引用的单元格地址

Step3: 复制A:D列区域(如果有100张表就选取A2:D101),然后选取下面的空行粘贴即可完成全部数据提取。

如果工作表名称没规律怎么办?答案是用宏表函数,我的EXCEL书中第117招介绍了用宏表函数提取工作表名称。

方法四:VBA

打开汇总表,点击开发工具→查看代码,输入以下代码:

Option Explicit

Sub Test() '多工作表合并

   Dim Ws As Worksheet, k%, SumWs As Worksheet, 最后&

   Set SumWs = Sheets("汇总表")

   For Each Ws In Sheets

       If Ws.Name <> "汇总表" Then

           k = k + 1

           If k = 1 Then

                '复制表头

               Ws.Range("A1").CurrentRegion.Copy SumWs.[A1]

           Else

                '不复制表头

                最后 =SumWs.Cells(Rows.Count, 1).End(xlUp).Row + 1

               Ws.Range("A1").CurrentRegion.Offset(1, 0).Copy SumWs.Cells(最后, 1)

           End If

       End If

   Next Ws

End Sub

 



图 17


图 18

按快捷键F5执行代码,瞬间完成多表合并。


扫一扫二维码,关注我的微信公众帐号,不断免费学习各种excel技巧。