PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)

单簿合并多表,起始招数分两派 - <直接查询> 和 <建立表后在查询>

********一种是直接从工作簿建立查询************

1.不建立表,直接新建空白查询 - 导入工作簿 - 完成合并

数据/查询/文件/从工作簿

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第1张图片

2.查询界面打开, 如要合并全部表, 直接 右键选编辑(Edit). 

  若是只合并若干表,则勾选 多选(Select multiple items),再勾选待合并表后选编辑(Edit)

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第2张图片

3. 编辑界面打开后, 在右侧的步骤点击源(Source)

    再转到公示栏, 先在 = 号后添加 Table.Combine(  然后在结尾处添加 )[Data] 完成后回车

* = #shared 可查询M用法

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第3张图片

4.现在只需要做些整理,就能就可以上传合并后的表去Excel里面了

转换/使用第一行做标题 

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第4张图片

点击筛选,反选 bb, 只保留数值

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第5张图片

5, Home 下面选 关闭且上传至表(Close & Load)

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第6张图片

6. 完成~ *** 支持增加新表后自动加入查询结果.***

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第7张图片

***或者用合并多工作薄的方式合并单簿多表

将要合并的工作薄单独存放在一个文件夹中,然后 建立查询: 数据/查询/文件/从文件夹

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第8张图片
PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第9张图片

在打开的查询界面选着 添加自定义列(Add Custom Column), 自定义公示栏中输入 =Excel.Workbook([Content],true) 回车

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第10张图片

选中结果中的 Name 和 Custom列, 管理列/删除其他列 , 然后点击Custom列的展开, 接着点 Data 继续展开

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第11张图片
PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第12张图片

得到下表, 删除多余列上传Excel即为所得. 

**PS:如果往这个文件夹中添加工作薄, 或者在这个工作薄中添加工作表,会被自动添加到查询结果.

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第13张图片

********另一种是先建立表,在查询************

先建立表:可以手动建表(Ctrl+T/L),或者VBA(文末分享代码) - 纯点击 / 或者 M 代码完成合并

1. 所有需要合并的工作表都分别建立成格式表, (Ctrl + T/L)

Ctrl+F3, 在名称管理器中,查看你所要合并的表, 带特征码重命名之(方便之后合并时做时筛选), 或者将不要合并的表重命名(增加新表时不用特意特征命名,直接刷新)

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第14张图片

2. 步骤

-- 2.1数据/从表 建立查询

-- 2.2 右侧步骤/删除其他步骤 

-- 2.3 点击 源(Source) 

-- 2.4 点击公示栏, 修改公式为:= Excel.CurrentWorkbook() 后回车

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第15张图片

3. 点击筛选,  过滤 为 只显示 不包含 "_不合并"的表

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第16张图片

4, ,反选下框, 将结果的列名不使用原列名为前缀, 点击 Expand

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第17张图片

5. 之后上传excel

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第18张图片

6. 完成.  *** 支持增加新表后自动加入查询结果.***

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第19张图片

添加新表后刷新,自动加入查询结果:

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第20张图片

****先建立表: 用M 代码完成合并

1.先将所有待合并表建立成格式表(Table)

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第21张图片

2.  数据/ 从表格 建立查询

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第22张图片

3.  删除步骤,只保留 源(Source), 选择 合并/追加 (只是为了帮助理解M,可省略步骤)

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第23张图片

3. 追加 本身 (只是为了帮助理解M,可省略步骤)

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第24张图片

4. 查看/高级编辑 打开后可看见M

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第25张图片

此处代码为高级编辑 打开


  let

    Source = Excel.CurrentWorkbook(){[Name=”tblNorth”]}[Content],

    #”Appended Query” = Table.Combine({Source, Source})

  in

    #”Appended Query”

显然, Table.Combine 语句是把前一句 定义的 源(Source)  进行了自我合并.

于是简单了, let 后面把所有需要合并的表定义加进去, 再用Table.Combine 合并起来就完成了.

**当然, 有新表加入的时候,只能手动编辑了.

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第26张图片

此处代码:

let

    Source1 = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],

    Source2 = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],

    Source3 = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],

    Source4 = Excel.CurrentWorkbook(){[Name="Table4"]}[Content],

    #"Appended Query" = Table.Combine({Source1,Source2,Source3,Source4})

in

    #"Appended Query"

PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询)_第27张图片

******************VBA建立格式表(Convert Range To Table in all worksheets in one workbook)*************

Sub CreatTableRenameAll() '#1 Creat Table and Rename as sheet for All sheets '


Dim wrksht As Worksheet

Dim objTable As ListObject

Application.ScreenUpdating = False


    For i = 2 To 25  '表2到表25,Excel窗口里的排序,不是VBE中顺序

        'or ActiveWorkbook.Worksheets.Count ' 或者,最大工作表数


        Set sh = ActiveWorkbook.Worksheets(i)


        If sh.Index > 0 Then 'Conditions for traversal 'For i = 1 To ActiveWorkbook.Worksheets.Count

            Debug.Print sh.Index


            TName = sh.Name


            sh.Activate


            sh.Range("A27:F39").Select  '固定区域建立为表

    'or sh.range("A1").CurrentRegion.select '或者, A1 所在数据区域建立成表

            'ActiveCell.CurrentRegion.Select '或者,当前激活的单元格所在区域建立表

            'sh.ListObjects.Add(xlSrcRange, Selection, , xlYes).Name = "a" 'Creat Table,Rename Table as sheet name '另一种建表方式

            Set objTable = sh.ListObjects.Add(xlSrcRange, Selection, , xlYes) 'Creat Table

                objTable.Name = TName

                objTable.TableStyle = None '表格式为 无格式 可选TalbeStyleLight1 等等


        End If

    Next

Application.ScreenUpdating = Ture

End Sub

*********VBA取消格式表(Convert Table to Range in all worksheets in one workbook)********

Sub UnlistTableAll() '#1 Convert Table to range for All sheets  '多表取消table


Dim wrksht As Worksheet

Dim objListObj As ListObject

Dim rList As Range

    Application.ScreenUpdating = False

    For i = 1 To ActiveWorkbook.Worksheets.Count

        Set wrksht = ActiveWorkbook.Worksheets(i)

        Set objListObj = wrksht.ListObjects(1) 'the No.1 Tabel in current worksheet

        Set rList = objListObj.Range



    'objTable.TableStyle = None '先将表格式设为无, 再转换成区域,可将区域恢复建表前的默认格式. 同时可省略下面语句:重设所有格式

      objListObj.Unlist  'Convert Table to range '取消表,转化为区域



        With rList          'Reset Table format 重设所有格式. 建表前如有格式被重设.

        .Interior.ColorIndex = xlColorIndexNone

        .Font.ColorIndex = xlColorIndexAutomatic

        .Borders.LineStyle = xlLineStyleNone

        End With


    Next


    Application.ScreenUpdating = Ture

End Sub

用时2小时.......

你可能感兴趣的:(PowerQuery 合并单簿内的多表(合并方式:直接查询/VBA建表后查询/建表后用M查询))