Excel如何将重复主键行数据转换为唯一键对应多列格式?
方案1:Power Query 高效处理(推荐,适配2万+大数据集)
你之前用了合并追加但没找对核心功能,正确步骤如下:
- 合并多工作表数据:
- 「数据」选项卡 → 获取数据 → 自文件 → 自工作簿 → 选择目标文件 → 导航器中按住Ctrl选中所有需处理的工作表 → 点击「转换数据」
- Power Query编辑器内,点击「追加查询」→ 追加多个查询,将所有工作表数据合并为一个查询
- 清洗数据:删除无关列,明确主键列(如「ID」)和需转列的字段(如「属性值」)
- 分组生成多列:
- 选中主键列 → 「转换」选项卡 → 分组依据 → 设置:新列名填「属性列表」,操作选「所有行」,确定后得到主键+对应所有行的表格
- 添加自定义列提取多值:
- 「添加列」→ 自定义列,公式写
List.Range([属性列表][属性值],0,1){0},命名为「属性1」(提取第1个值) - 同理,第2列公式写
List.Range([属性列表][属性值],1,1){0},命名「属性2」,直到覆盖最多重复行数(可先加列List.Count([属性列表][属性值])查看最大值)
- 「添加列」→ 自定义列,公式写
- 删除「属性列表」列,关闭并上载到新工作表
方案2:动态数组公式优化(适配Excel 365/2021)
旧公式效率低,改用动态数组更适合大数据:
- 提取唯一主键:新工作表A2单元格输入
=UNIQUE(合并数据表!A:A)(多表先合并:=VSTACK(Sheet1!A:C,Sheet2!A:C)生成辅助合并表) - 提取横向多列: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
相关产品推荐
相关产品推荐

