基于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
相关产品推荐
相关产品推荐

