sql 聚合函数 多行数据合并一行_Excel多表数据合并解法总结(函数、VBA、PQ、SQL...)...

a6234f3905a46bf13e24cf1d1c23ec4e.png 每天一篇Excel技术图文 微信公众号:Excel星球 NO.673-多表数据查询 作者:看见星光  微博:EXCELers / 知识星球:Excel

HI~大家好,我是星光。今天给大家分享一下Excel合并多工作表数据的多种方法,涵盖了函数、VBA、PQ、SQL等……。

打个响指,举个例子。

d6594be36c2e454f6e3f4081e78b3aaa.png

如上图所示▲,一张工作簿包含了多张工作表,现在需要将一部门、二部门、三部门、四部门和后勤部等5张工作表的数据合并到一张表中......

7bcaedfe1c0d5f58e62f404974adda67.png

01 | 函数解


正像我们在INDIRECT函数教程里所讲的……

不相信函数也可以合并多表数据?其实是可以的,只是相比VBA等方式,效率不高,操作难度却很高,这就好比星光这家伙,长的不帅,却总爱照镜子,所以通常只建议私下里没人时摆酷,不建议在工作中使用。

A1单元格输入公式向下复制填充
代码如看不全 可以左右拖动..▼

=INDIRECT(LOOKUP(ROW(A1)-1,MMULT(N(ROW($1:$5)>COLUMN(A:E)),COUNTIF(INDIRECT({"一部门";"二部门";"三部门";"四部门";"后勤部"}&"!a:a"),"<>")),{"一部门";"二部门";"三部门";"四部门";"后勤部"})&"!R"&ROW(A1)-LOOKUP(ROW(A1)-1,MMULT(N(ROW($1:$5)>COLUMN(A:E)),COUNTIF(INDIRECT({"一部门";"二部门";"三部门";"四部门";"后勤部"}&"!a:a"),"<>")))&"C",0)&""


可参考函数教程第39章:说来你不信,INDIRECT函数其实是个快递员 02 | VBA


by:Excel星球姐妹

代码解析见注释
代码如看不全,可以左右拖动..▼

Sub ByVBA()    Dim strFindSht As String, sht As Worksheet, k As Long    Dim m As Long, aData    Application.ScreenUpdating = False    strFindSht = ",一部门,二部门,三部门,四部门,后勤部,"    Worksheets("VBA").Select    Cells.ClearContents    Cells.NumberFormatLocal = "@" '设置文本格式,避免工号变形    k = 1    For Each sht In Worksheets '遍历工作表        If InStr(strFindSht, "," & sht.Name & ",") Then '判断工作表名称是否符合条件            k = k + m  '放置数据的开始行            If k = 1 Then                aData = sht.UsedRange            Else                aData = sht.UsedRange.Offset(1) '扣掉标题行            End If            m = UBound(aData) + (k > 1) '注意在VBA中True等于-1            Cells(k, 1).Resize(m) = sht.Name '工作表名称            Cells(k, 2).Resize(m, UBound(aData, 2)) = aData '数据        End If    Next    Cells(1, 1) = "工作表名称"    Application.ScreenUpdating = TrueEnd Sub
03 | PowerQuery
by:Excel星球兄弟 aa69b4c65fedafe7af07c07d6a08d146.png A2单元格使用以下公式获取当前工作簿的完整路径。
=CELL("filename",A1)

将上图所示的表1,以"从表格"的形式加载到PowerQuery, 假设该表格名称为表2 。在高级编辑器编写代码如下。 代码如看不全,可以左右拖动..▼
let    文件路径 = Excel.CurrentWorkbook(){[Name="表2"]}[Content],    整理路径 = Text.Replace(Text.BeforeDelimiter(文件路径[当前文件路径]{0},"]",{0,RelativePosition.FromEnd}),"[",""),    获取文件 =  Excel.Workbook(File.Contents(整理路径), true, true),    目标表 = "一部门,二部门,三部门,四部门,后勤部",    筛选表 = Table.SelectRows(获取文件,each Text.Contains(目标表,[Item])),    合并 = Table.Combine(                List.Transform({0..Table.RowCount(筛选表)-1},                        (a)=>Table.AddColumn(筛选表[Data]{a},"表名",each 筛选表[Name]{a})                            )                        )    //合并并添加工作表名称in    合并
04 | SQL


by:Excel星球大叔大婶

不想多打字,所以使用了VBA+ADO+SQL的形式,借助VBA循环语句简化SQL语句(你这打字不是更多吗?不!除了SQL部分,其它都是SQL系列教程里复制的)

代码如看不全,可以左右拖动..▼
Sub bySQL()    Dim cnADO As Object    Dim rsADO As Object    Dim strSQL As String    Dim i As Long, strShtName, aShtName    Set cnADO = CreateObject("ADODB.Connection")    Set rsADO = CreateObject("ADODB.Recordset")    cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _        & "Extended Properties=Excel 12.0;" _        & "Data Source=" & ThisWorkbook.FullName    aShtName = Split("一部门,二部门,三部门,四部门,后勤部", ",")    For Each strShtName In aShtName '多表合并语句        strSQL = strSQL & "SELECT 姓名,工号 ,'" & strShtName & " ' AS 工作表名称 FROM [" & strShtName & "$]  UNION ALL "    Next    Set rsADO = cnADO.Execute(Left(strSQL, Len(strSQL) - 10))    Cells.ClearContents    For i = 0 To rsADO.Fields.Count - 1        Cells(1, i + 1) = rsADO.Fields(i).Name    Next i    Range("a2").CopyFromRecordset rsADO    rsADO.Close    cnADO.Close    Set cnADO = Nothing    Set rsADO = NothingEnd Sub
后台回复SQL即可获取SQL in Excel系列教程。
……

木了,打完收工,下期再见。

文件下载百度网盘..▼ https://pan.baidu.com/s/15mtMdSdZSuAZSU4YU7lYUg
提取码: nfx8 ▎全方位系统学习Excel
推荐加入我的Excel社群 ▎
  点击图片可获取相关推文..▼ 2ea1abb20b331d4a809ad509f3783357.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值