如何通过逆透视表头行在Excel中将多列数据转置为两列?
Hey there! 针对你这个100列Excel转置的需求,我给你整理了3种高效且不容易出错的方法,比手动复制粘贴靠谱多了,咱们一个个来看:
先明确你的需求场景(结合示例)
原表格示例:
货架A-1层 货架B-2层 货架C-3层 ITEM001 ITEM003 ITEM005 ITEM002 ITEM004 ITEM006
期望效果示例:
物料编号 位置 ITEM001 货架A-1层 ITEM002 货架A-1层 ITEM003 货架B-2层 ITEM004 货架B-2层 ITEM005 货架C-3层 ITEM006 货架C-3层
方法1:用Power Query(最推荐,零代码)
这个方法是Excel内置的工具,完全不用写代码,操作几步就能搞定,还能重复使用:
- 选中你的所有数据区域(包括100个表头和列内的物料条目)
- 点击顶部菜单栏的「数据」选项卡 → 选择「从表格/区域」(如果弹出提示“表包含标题”,勾选上确认)
- 进入Power Query编辑器后,选中所有列(点击第一列标题,按住
Shift点最后一列标题) - 点击「转换」选项卡 → 「逆透视列」 → 选择「逆透视其他列」(因为我们要转所有列,这个选项最快捷)
- 现在你会看到两列:
属性(对应原表头的位置信息)和值(对应物料编号),右键点击列名可以重命名为「位置」和「物料编号」 - 最后点击「关闭并上载」,Excel会自动生成一个新的工作表,里面就是你要的两列表格
方法2:公式法(适合熟悉Excel函数的用户)
如果不想用Power Query,也可以用函数组合实现,假设你的原数据在A1:CV100(100列,从A到CV):
- 在新工作表的A2单元格输入公式(获取物料编号):
=INDEX($A$2:$CV$100,INT((ROW()-2)/100)+1,MOD(ROW()-2,100)+1) - 在B2单元格输入公式(获取对应位置):
=INDEX($A$1:$CV$1,1,MOD(ROW()-2,100)+1) - 选中A2和B2单元格,下拉填充直到出现错误值为止(说明所有数据都已转置完成)
公式解释:ROW()-2计算当前行的偏移量,INT((ROW()-2)/100)+1定位原数据的行号,MOD(ROW()-2,100)+1定位原数据的列号(这里的100是你原表格的列数,要是列数变了记得修改)
方法3:VBA宏(适合频繁重复操作的场景)
要是你经常需要做这类转置,可以写个VBA宏,一键完成:
- 按
Alt+F11打开VBA编辑器 - 右键点击左侧的工作簿名称 → 「插入」 → 「模块」
- 粘贴以下代码(记得把
"原数据"改成你实际的原工作表名称):Sub TransposeItems() Dim srcSheet As Worksheet, destSheet As Worksheet Dim lastCol As Long, lastRow As Long, i As Long, j As Long, k As Long Set srcSheet = ThisWorkbook.Sheets("原数据") ' 替换成你的原表名称 Set destSheet = ThisWorkbook.Sheets.Add ' 新建工作表存结果 ' 设置结果表表头 destSheet.Cells(1, 1).Value = "物料编号" destSheet.Cells(1, 2).Value = "位置" lastCol = srcSheet.Cells(1, srcSheet.Columns.Count).End(xlToLeft).Column k = 2 ' 结果表的起始行 ' 遍历每一列(位置),再遍历列内的每个物料 For i = 1 To lastCol lastRow = srcSheet.Cells(srcSheet.Rows.Count, i).End(xlUp).Row For j = 2 To lastRow destSheet.Cells(k, 1).Value = srcSheet.Cells(j, i).Value destSheet.Cells(k, 2).Value = srcSheet.Cells(1, i).Value k = k + 1 Next j Next i ' 自动调整列宽 destSheet.Columns("A:B").AutoFit MsgBox "转换完成!" End Sub - 按
F5运行宏,就能得到转置后的表格了
内容的提问来源于stack exchange,提问作者Danconia




