行数据转堆叠列数据:多列姓名合并为单列的技术需求
批量将多列姓名转换为单列对应机构编号的方法
问题场景
你有一份包含1866个唯一机构编号的表格,每个机构的姓名已被拆分到多列中,需要把这些多列姓名堆叠成单列,同时对应重复的机构编号,最终得到「机构编号+单个姓名」的一行一条数据格式。
原始示例数据
| 机构编号(Est No) | 姓名及角色(Names and roles) |
|---|---|
| 4 | KAIROUZ, TONY - 高级管理及肉类授权签字人; LAUBSCH, ASHLEY - 运营管理及肉类授权签字人 |
| 7 | ALLEN, CHRIS - 运营管理及肉类授权签字人; BADMAN, MICHAEL - 质量管理及肉类授权签字人; BAKER, ALAN - 仅联系人-已备案机构; BROOKS, STEWART - 运营管理、RFP及肉类授权签字人 |
| 8 | FANG, JENNY - 运营管理; LI, DAJIAN - 高级管理 |
当前进度(已拆分多列)
| 机构编号(Est No) | 姓名(Name) | 姓名(Name) | 姓名(Name) |
|---|---|---|---|
| 4 | TONY KAIROUZ | ASHLEY LAUBSCH | |
| 7 | CHRIS ALLEN | MICHAEL BADMAN | ALAN BAKER |
目标格式
| 机构编号(Est No) | 姓名(Name) |
|---|---|
| 4 | TONY KAIROUZ |
| 4 | ASHLEY LAUBSCH |
| 7 | CHRIS ALLEN |
| 7 | MICHAEL BADMAN |
| 7 | ALAN BAKER |
| 7 | STEWART BROOKS |
| 8 | JENNY FANG |
| 8 | DAJIAN LI |
解决方案
方法一:Excel Power Query(推荐,适合大量数据)
这是处理批量数据最高效的方式:
- 选中你的数据区域(包含机构编号列和所有姓名列)
- 点击顶部「数据」选项卡 → 「从表格/区域」(旧版Excel找「Power Query」选项卡)
- 在Power Query编辑器里,选中所有姓名列(不要选机构编号列)
- 点击「转换」选项卡 → 「逆透视列」→ 「逆透视其他列」
- 此时会生成「属性」和「值」两列,删掉「属性」列,把「值」列重命名为「姓名(Name)」
- 筛选掉「值」列里的空单元格
- 点击「关闭并上载」,直接得到目标格式的表格
方法二:Excel公式法(适合小量数据或不想用Power Query)
假设机构编号在A列,姓名列从B到Z列:
- 在空白列(比如AA列)输入公式,生成重复的机构编号:
=INDEX($A:$A,INT((ROW()-ROW(AA1))/COUNTA($B$1:$Z$1))+1)
注:COUNTA($B$1:$Z$1)替换成你实际的姓名列表头范围 - 在AB列输入公式,依次提取多列里的姓名:
=INDEX($B:$Z,INT((ROW()-ROW(AB1))/COUNTA($B$1:$Z$1))+1,MOD(ROW()-ROW(AB1),COUNTA($B$1:$Z$1))+1) - 下拉这两列的公式直到出现空值,最后筛选掉AB列的空单元格即可
方法三:VBA脚本(自动化批量处理)
适合需要重复操作的场景,步骤如下:
- 打开Excel,按
Alt+F11打开VBA编辑器 - 右键点击左侧工作表 → 插入 → 模块
- 粘贴以下代码:
Sub UnstackNames() Dim wsSource As Worksheet, wsDest As Worksheet Dim lastRow As Long, lastCol As Long, i As Long, j As Long, destRow As Long Set wsSource = ActiveSheet Set wsDest = ThisWorkbook.Sheets.Add destRow = 1 '写入表头 wsDest.Cells(destRow, 1) = "机构编号(Est No)" wsDest.Cells(destRow, 2) = "姓名(Name)" destRow = destRow + 1 lastRow = wsSource.Cells(Rows.Count, 1).End(xlUp).Row lastCol = wsSource.Cells(1, Columns.Count).End(xlToLeft).Column For i = 2 To lastRow For j = 2 To lastCol If wsSource.Cells(i, j).Value <> "" Then wsDest.Cells(destRow, 1) = wsSource.Cells(i, 1).Value wsDest.Cells(destRow, 2) = wsSource.Cells(i, j).Value destRow = destRow + 1 End If Next j Next i '自动调整列宽 wsDest.Columns.AutoFit End Sub
- 点击工具栏的「运行」按钮(绿色三角),脚本会自动新建工作表并生成目标格式数据
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

