Excel多工作表合并:将列转换为唯一行的方案咨询
Excel多工作表数据合并及品牌列转行解决方案
方法一:Power Query(推荐,操作高效无公式)
- 打开Excel,点击「数据」选项卡 → 「获取数据」→ 「自文件」→ 「自工作簿」,选中当前Excel文件
- 在导航器窗口按住Ctrl选中所有DATA类工作表,点击「转换数据」进入查询编辑器
- 选中所有导入的工作表查询,右键选择「合并查询」→ 「将查询追加为新查询」,选择「将所有查询追加为新查询」,得到合并后的全量数据
- 选中「Brand」列和「Value」列,切换到「转换」选项卡,点击「透视列」,值列选择「Value」,高级选项选「不要聚合」(若有重复数据可按需选求和/平均值等)
- 调整列顺序,把「Date」「Product」移到最前面,点击「关闭并上载」,生成的新工作表就是你要的统一报表样式
方法二:公式组合(适合轻量数据场景)
- 先合并所有工作表数据:新建「合并数据」工作表,在A2单元格输入
=VSTACK(DATA1!A2:D100, DATA2!A2:D100, DATA3!A2:D100)(替换DATA1/DATA2为实际工作表名,调整行号覆盖全量数据),回车后自动合并所有数据 - 提取唯一的日期+产品组合:新建「最终报表」工作表,在A2单元格输入
=UNIQUE(合并数据!A2:A&"|"&合并数据!B2:B),回车后得到唯一组合;再用=LEFT(A2,FIND("|",A2)-1)提取日期到A列,=RIGHT(A2,LEN(A2)-FIND("|",A2))提取产品到B列 - 填充各品牌值:在C2(Brand A)输入
=XLOOKUP(A2&"|"&B2&"|"&"Brand A",合并数据!A2:A&"|"&合并数据!B2:B&"|"&合并数据!C2:C,合并数据!D2:D,"",0),下拉填充;同理D列(Brand B)、E列(Brand C)替换公式里的品牌名称即可
方法三:VBA脚本(适合批量自动化处理)
- 按
Alt+F11打开VBA编辑器,右键当前工作簿 → 「插入」→ 「模块」,粘贴以下代码:
Sub MergeAndPivotBrands() Dim ws As Worksheet, mergeWs As Worksheet, pivotWs As Worksheet Dim lastRow As Long, i As Long, j As Long Dim uniqueDict As Object, key As Variant ' 创建/获取合并数据工作表 On Error Resume Next Set mergeWs = ThisWorkbook.Sheets("合并数据") If Err.Number <> 0 Then Set mergeWs = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) mergeWs.Name = "合并数据" End If On Error GoTo 0 mergeWs.Cells.Clear ' 合并所有DATA开头的工作表数据 For Each ws In ThisWorkbook.Sheets If Left(ws.Name, 4) = "DATA" Then ' 可根据实际工作表名规则修改 lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row ws.Range("A2:D" & lastRow).Copy mergeWs.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next ws ' 创建/获取最终报表工作表 On Error Resume Next Set pivotWs = ThisWorkbook.Sheets("最终报表") If Err.Number <> 0 Then Set pivotWs = ThisWorkbook.Sheets.Add(After:=mergeWs) pivotWs.Name = "最终报表" End If On Error GoTo 0 ' 提取唯一的日期+产品组合 Set uniqueDict = CreateObject("Scripting.Dictionary") lastRow = mergeWs.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To lastRow key = mergeWs.Cells(i, 1).Value & "|" & mergeWs.Cells(i, 2).Value If Not uniqueDict.Exists(key) Then uniqueDict.Add key, Array(mergeWs.Cells(i, 1).Value, mergeWs.Cells(i, 2).Value) End If Next i ' 写入表头 pivotWs.Range("A1:E1") = Array("Date", "Product", "Brand A", "Brand B", "Brand C") ' 填充各品牌对应值 j = 2 For Each key In uniqueDict.Keys pivotWs.Cells(j, 1).Value = uniqueDict(key)(0) pivotWs.Cells(j, 2).Value = uniqueDict(key)(1) ' 匹配Brand A值 pivotWs.Cells(j, 3).Value = Application.IfError(Application.VLookup( _ uniqueDict(key)(0) & "|" & uniqueDict(key)(1) & "|" & "Brand A", _ mergeWs.Range("A:D"), 4, False), "") ' 匹配Brand B值 pivotWs.Cells(j, 4).Value = Application.IfError(Application.VLookup( _ uniqueDict(key)(0) & "|" & uniqueDict(key)(1) & "|" & "Brand B", _ mergeWs.Range("A:D"), 4, False), "") ' 匹配Brand C值 pivotWs.Cells(j, 5).Value = Application.IfError(Application.VLookup( _ uniqueDict(key)(0) & "|" & uniqueDict(key)(1) & "|" & "Brand C", _ mergeWs.Range("A:D"), 4, False), "") j = j + 1 Next key MsgBox "合并完成,已生成最终报表!" End Sub
- 根据实际工作表名修改代码中
Left(ws.Name, 4) = "DATA"的判断规则,确保只合并目标工作表 - 按F5运行宏,自动完成数据合并和品牌列转行
内容的提问来源于stack exchange,提问作者Ahmed Aljabry
相关产品推荐
相关产品推荐

