You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过逆透视表头行在Excel中将多列数据转置为两列?

Hey there! 针对你这个100列Excel转置的需求,我给你整理了3种高效且不容易出错的方法,比手动复制粘贴靠谱多了,咱们一个个来看:

先明确你的需求场景(结合示例)

原表格示例:

货架A-1层货架B-2层货架C-3层
ITEM001ITEM003ITEM005
ITEM002ITEM004ITEM006

期望效果示例:

物料编号位置
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):

  1. 在新工作表的A2单元格输入公式(获取物料编号):
    =INDEX($A$2:$CV$100,INT((ROW()-2)/100)+1,MOD(ROW()-2,100)+1)
    
  2. 在B2单元格输入公式(获取对应位置):
    =INDEX($A$1:$CV$1,1,MOD(ROW()-2,100)+1)
    
  3. 选中A2和B2单元格,下拉填充直到出现错误值为止(说明所有数据都已转置完成)

公式解释ROW()-2计算当前行的偏移量,INT((ROW()-2)/100)+1定位原数据的行号,MOD(ROW()-2,100)+1定位原数据的列号(这里的100是你原表格的列数,要是列数变了记得修改)


方法3:VBA宏(适合频繁重复操作的场景)

要是你经常需要做这类转置,可以写个VBA宏,一键完成:

  1. Alt+F11打开VBA编辑器
  2. 右键点击左侧的工作簿名称 → 「插入」 → 「模块」
  3. 粘贴以下代码(记得把"原数据"改成你实际的原工作表名称):
    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
    
  4. F5运行宏,就能得到转置后的表格了

内容的提问来源于stack exchange,提问作者Danconia

火山引擎 最新活动