如何实现Excel跨行列表格格式转换?Index-Match与SUMIFS尝试失败
解决Excel宽表转长表(多字段拆分)问题
针对你提到的宽表(含Year/Country/Category/Month/Export/Import)转长表(Year/Month/Partner/Category/Type/Value)的需求,以下是三种实用解决方案:
方法一:Power Query(推荐,无公式)
这是最简便的批量转换方式,无需复杂函数:
- 选中源数据区域,点击「数据」选项卡 → 「从表格/区域」(Excel 2016+;旧版找「Power Query」选项卡)
- 在Power Query编辑器中,选中Export、Import两列,点击「转换」→「逆透视列」→「逆透视仅选中列」
- 将自动生成的「属性」列重命名为
Type,「值」列重命名为Value - 把「Country」列重命名为
Partner - 调整列顺序为Year → Month → Partner → Category → Type → Value
- 点击「关闭并上载」,直接得到目标长表
方法二:数组公式(适合不使用Power Query的场景)
假设源表数据在A1:F100(A=Year、B=Country、C=Category、D=Month、E=Export、F=Import),目标表从H1开始:
- 先手动输入目标表头:
H1=Year、I1=Month、J1=Partner、K1=Category、L1=Type、M1=Value - 在H2输入数组公式(按Ctrl+Shift+Enter确认,不能直接回车):
=INDEX($A$2:$A$100, INT((ROW()-2)/2)+1) - I2公式:
=INDEX($D$2:$D$100, INT((ROW()-2)/2)+1) - J2公式:
=INDEX($B$2:$B$100, INT((ROW()-2)/2)+1) - K2公式:
=INDEX($C$2:$C$100, INT((ROW()-2)/2)+1) - L2公式:
=INDEX({"Export","Import"}, MOD(ROW()-2,2)+1) - M2公式:
=INDEX($E$2:$F$100, INT((ROW()-2)/2)+1, MOD(ROW()-2,2)+1) - 选中H2:M2,下拉填充到出现错误值为止,即可完成转换。
方法三:VBA宏(适合重复批量处理)
如果需要频繁做这类转换,写个宏一键搞定:
按Alt+F11打开VBA编辑器,插入模块,粘贴以下代码(记得替换源表名称):
Sub WideToLong() Dim srcWs As Worksheet, destWs As Worksheet Dim srcLastRow As Long, destRow As Long Dim i As Long Set srcWs = ThisWorkbook.Sheets("源表") '替换为你的源表实际名称 Set destWs = ThisWorkbook.Sheets.Add destWs.Name = "目标表" '写入目标表头 destWs.Range("A1:F1") = Array("Year", "Month", "Partner", "Category", "Type", "Value") destRow = 2 srcLastRow = srcWs.Cells(srcWs.Rows.Count, "A").End(xlUp).Row '遍历源表每行,拆分Export/Import为两行 For i = 2 To srcLastRow 'Export行 destWs.Cells(destRow, "A") = srcWs.Cells(i, "A") destWs.Cells(destRow, "B") = srcWs.Cells(i, "D") destWs.Cells(destRow, "C") = srcWs.Cells(i, "B") destWs.Cells(destRow, "D") = srcWs.Cells(i, "C") destWs.Cells(destRow, "E") = "Export" destWs.Cells(destRow, "F") = srcWs.Cells(i, "E") destRow = destRow + 1 'Import行 destWs.Cells(destRow, "A") = srcWs.Cells(i, "A") destWs.Cells(destRow, "B") = srcWs.Cells(i, "D") destWs.Cells(destRow, "C") = srcWs.Cells(i, "B") destWs.Cells(destRow, "D") = srcWs.Cells(i, "C") destWs.Cells(destRow, "E") = "Import" destWs.Cells(destRow, "F") = srcWs.Cells(i, "F") destRow = destRow + 1 Next i End Sub
运行宏后,会自动生成包含目标结构的新工作表。
内容的提问来源于stack exchange,提问作者Meh Mech
相关产品推荐
相关产品推荐

