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

Excel如何将重复主键行数据转换为唯一键对应多列格式?

方案1:Power Query 高效处理(推荐,适配2万+大数据集)

你之前用了合并追加但没找对核心功能,正确步骤如下:

  1. 合并多工作表数据:
    • 「数据」选项卡 → 获取数据 → 自文件 → 自工作簿 → 选择目标文件 → 导航器中按住Ctrl选中所有需处理的工作表 → 点击「转换数据」
    • Power Query编辑器内,点击「追加查询」→ 追加多个查询,将所有工作表数据合并为一个查询
  2. 清洗数据:删除无关列,明确主键列(如「ID」)和需转列的字段(如「属性值」)
  3. 分组生成多列:
    • 选中主键列 → 「转换」选项卡 → 分组依据 → 设置:新列名填「属性列表」,操作选「所有行」,确定后得到主键+对应所有行的表格
    • 添加自定义列提取多值:
      • 「添加列」→ 自定义列,公式写 List.Range([属性列表][属性值],0,1){0},命名为「属性1」(提取第1个值)
      • 同理,第2列公式写 List.Range([属性列表][属性值],1,1){0},命名「属性2」,直到覆盖最多重复行数(可先加列List.Count([属性列表][属性值])查看最大值)
    • 删除「属性列表」列,关闭并上载到新工作表
方案2:动态数组公式优化(适配Excel 365/2021)

旧公式效率低,改用动态数组更适合大数据:

  1. 提取唯一主键:新工作表A2单元格输入 =UNIQUE(合并数据表!A:A)(多表先合并:=VSTACK(Sheet1!A:C,Sheet2!A:C)生成辅助合并表)
  2. 提取横向多列:B2单元格输入 =TRANSPOSE(FILTER(合并数据表!B:B,合并数据表!A:A=A2)),下拉填充即可自动将同一主键的所有值转为横向列
  • 若用旧版Excel,用数组公式:INDEX(合并数据表!B:B,SMALL(IF(合并数据表!A:A=$A2,ROW(合并数据表!A:A)),COLUMN(A1))),按Ctrl+Shift+Enter回车后向右向下填充
方案3:简易VBA脚本(复制即可用)

按Alt+F11打开VBA编辑器,插入模块后粘贴以下代码:

Sub ConvertDuplicateKeys()
    Dim wsSource As Worksheet, wsTarget As Worksheet
    Dim lastRow As Long, targetRow As Long, i As Long, j As Long
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' 替换为你的合并数据表名称
    Set wsSource = ThisWorkbook.Sheets("合并数据")
    ' 创建输出工作表
    Set wsTarget = ThisWorkbook.Sheets.Add(After:=wsSource)
    wsTarget.Name = "输出结果"
    
    ' 用字典存储主键对应所有值
    lastRow = wsSource.Cells(Rows.Count, 1).End(xlUp).Row
    For i = 2 To lastRow
        key = wsSource.Cells(i, 1).Value
        value = wsSource.Cells(i, 2).Value
        If dict.Exists(key) Then
            dict(key) = dict(key) & "," & value
        Else
            dict(key) = value
        End If
    Next i
    
    ' 写入输出表
    targetRow = 1
    wsTarget.Cells(targetRow, 1).Value = "主键"
    ' 计算最大列数
    Dim maxCols As Integer
    maxCols = 0
    For Each key In dict.Keys
        cols = UBound(Split(dict(key), ",")) + 1
        If cols > maxCols Then maxCols = cols
    Next key
    ' 写入表头
    For j = 1 To maxCols
        wsTarget.Cells(targetRow, j + 1).Value = "属性" & j
    Next j
    ' 写入数据
    targetRow = 2
    For Each key In dict.Keys
        wsTarget.Cells(targetRow, 1).Value = key
        values = Split(dict(key), ",")
        For j = 0 To UBound(values)
            wsTarget.Cells(targetRow, j + 2).Value = values(j)
        Next j
        targetRow = targetRow + 1
    Next key
End Sub

先将所有工作表数据合并到名为「合并数据」的工作表(或修改代码中wsSource的指向),运行宏即可自动生成结果表。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:52:37