You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于ID字段转置Excel表格:将列转为各ID对应的行

嘿,我完全懂你要做的事儿——把横向的Excel表格按ID转置,把原来的列名变成属性名,对应单元格内容变成属性值,而且不用SQL对吧?这事儿在Excel里完全能搞定,给你准备了两种方案,按需挑就行~

方案一:用Excel公式实现(适合没法用VBA的场景)

假设你的原始数据是这样的:ID列在A列,从A2开始;表头(也就是属性名)在第1行,从B1到E1;数据区域是A2:E4。

步骤1:提取唯一ID列表

在空白列(比如G列)的G2单元格输入公式:

=UNIQUE(A2:A4)

这个公式会自动提取A列里的所有唯一ID,Excel 365/2021及以后版本支持;要是用的旧版本,可以通过「数据」选项卡的高级筛选来提取唯一值。

步骤2:生成重复的ID和循环的属性名

  • 在H2(属性名列)输入公式:
=INDEX($B$1:$E$1,MOD(ROW()-ROW($H$2),COLUMNS($B$1:$E$1))+1)

下拉这个公式,它会循环重复你的表头属性名。

  • 在I2(ID列)输入公式:
=INDEX($G$2:$G$4,INT((ROW()-ROW($H$2))/COLUMNS($B$1:$E$1))+1)

下拉后,每个ID会重复对应属性的次数(比如有4个属性,每个ID就重复4次)。

步骤3:匹配对应的属性值

在J2(属性值列)输入公式:

=XLOOKUP($I2&$H2,$A$2:$A$4&$B$1:$E$1,$B$2:$E$4,"")

这个公式会通过「ID+属性名」的组合,精准匹配到原始数据里对应的值,下拉即可填充所有结果。

提示:如果是Excel 2019及以前版本,没有XLOOKUP的话,可以用INDEX+MATCH组合替代:

=INDEX($B$2:$E$4,MATCH($I2,$A$2:$A$4,0),MATCH($H2,$B$1:$E$1,0))
方案二:用VBA宏实现(适合批量处理,效率更高)

如果你的数据量很大,或者需要经常做这个操作,写个VBA宏会更省心。按Alt+F11打开VBA编辑器,插入一个新模块,粘贴下面的代码:

Sub TransposeByID()
    Dim srcWS As Worksheet, destWS As Worksheet
    Dim lastRow As Long, lastCol As Long
    Dim idRange As Range, headerRange As Range
    Dim i As Long, j As Long, destRow As Long
    
    ' 替换成你的源工作表名称
    Set srcWS = ThisWorkbook.Worksheets("Sheet1")
    ' 创建新工作表存放结果
    Set destWS = ThisWorkbook.Worksheets.Add
    destWS.Name = "转置结果"
    
    ' 获取源数据的最后一行和最后一列
    lastRow = srcWS.Cells(srcWS.Rows.Count, "A").End(xlUp).Row
    lastCol = srcWS.Cells(1, srcWS.Columns.Count).End(xlToLeft).Column
    
    ' 定义ID列和表头属性列的范围
    Set idRange = srcWS.Range("A2:A" & lastRow)
    Set headerRange = srcWS.Range("B1:" & srcWS.Cells(1, lastCol).Address)
    
    ' 写入结果表的表头
    destWS.Range("A1:C1").Value = Array("ID", "属性名", "属性值")
    destRow = 2 ' 从第2行开始写数据
    
    ' 遍历每个ID,再遍历每个属性,写入对应值
    For i = 1 To idRange.Rows.Count
        For j = 1 To headerRange.Columns.Count
            destWS.Cells(destRow, "A").Value = idRange.Cells(i, 1).Value
            destWS.Cells(destRow, "B").Value = headerRange.Cells(1, j).Value
            destWS.Cells(destRow, "C").Value = srcWS.Cells(i + 1, j + 1).Value
            destRow = destRow + 1
        Next j
    Next i
    
    ' 自动调整结果列的宽度
    destWS.Columns("A:C").AutoFit
    MsgBox "转置完成啦!结果在「转置结果」工作表里~"
End Sub

运行这个宏前,记得把代码里的"Sheet1"改成你实际的源工作表名称,点击运行就能一键生成转置后的结果了。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:35:40