Excel中按人员类型分组转换数据格式的实现方式咨询
Excel中按人员类型分组转换数据格式的实现方式咨询
当然可以实现啦!不管是用Excel自带的工具,还是写自定义宏都能搞定,我给你分两种情况详细说说:
一、用Excel内置工具(无需写宏)
方法1:Power Query(推荐,适合批量处理)
这是Excel自带的强大数据转换工具,操作可视化,适合数据量较大的情况:
- 选中你的原始数据区域(包含item id、person type、person id三列),点击顶部「数据」选项卡 → 「从表格/区域」(旧版Excel找「获取和转换」组里的「从表格」),确认数据有表头后进入Power Query编辑器。
- 在编辑器里选中
person type列,点击「转换」选项卡 → 「透视列」。 - 在弹出的设置窗口中,「值列」选择
person id,然后点击「聚合函数」旁边的「高级」,选择「自定义」,输入Text.Combine(_, ", ")(这是Power Query的M语言,用来合并多个id为逗号分隔的字符串),点击确定。 - 完成透视后,点击「关闭并上载」,就能得到你想要的格式:每行对应一个item id,各人员类型列里是逗号分隔的person id列表。
方法2:TEXTJOIN+IF公式(适合小数据量)
如果你的数据量不大,用公式就能快速搞定:
- 先提取所有唯一的item id:可以用
UNIQUE(A:A)函数(Excel 365/2021及以上版本),或者用「数据」选项卡的「高级筛选」来提取不重复值,把这些唯一id放在新的列(比如E列)。 - 假设你要生成
avocats列(F列),在F2单元格输入公式:
注:如果是旧版Excel,输入后需要按=TEXTJOIN(", ", TRUE, IF(($A$2:$A$100=E2)*($B$2:$B$100="avocats"), $C$2:$C$100, ""))Ctrl+Shift+Enter作为数组公式执行;新版直接按回车就行。 - 把公式复制到其他人员类型列,只需要把公式里的
"avocats"换成对应的类型(比如"juristes")即可。
二、自定义VBA宏(适合频繁重复操作或超大数据量)
如果需要经常做这个转换,或者数据量特别大,写个宏会更高效。这里给你一个简单的示例宏,你可以根据自己的实际人员类型调整:
Sub TransformPersonData() Dim wsSource As Worksheet, wsTarget As Worksheet Dim lastRow As Long, i As Long, targetRow As Long Dim itemID As String, personType As String, personID As String Dim dataDict As Object ' 替换成你的原始数据工作表名称 Set wsSource = ThisWorkbook.Sheets("原始数据") ' 创建新工作表存放结果 Set wsTarget = ThisWorkbook.Sheets.Add Set dataDict = CreateObject("Scripting.Dictionary") ' 设置结果表头,根据你的5种人员类型补充后续列 wsTarget.Range("A1").Value = "item id" wsTarget.Range("B1").Value = "avocats" wsTarget.Range("C1").Value = "juristes" ' wsTarget.Range("D1").Value = "其他类型1" ' ...继续添加剩下的类型 ' 获取原始数据最后一行 lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row ' 遍历原始数据,用字典存储每个item对应的各类型id列表 For i = 2 To lastRow itemID = wsSource.Cells(i, "A").Value personType = wsSource.Cells(i, "B").Value personID = wsSource.Cells(i, "C").Value ' 如果字典里没有这个item,初始化空列表 If Not dataDict.Exists(itemID) Then ' 数组长度对应你的人员类型数量,这里先写2个,自己补充到5个 dataDict(itemID) = Array("", "") End If ' 根据人员类型把id追加到对应位置 Select Case personType Case "avocats" dataDict(itemID)(0) = dataDict(itemID)(0) & IIf(dataDict(itemID)(0) <> "", ", ", "") & personID Case "juristes" dataDict(itemID)(1) = dataDict(itemID)(1) & IIf(dataDict(itemID)(1) <> "", ", ", "") & personID ' Case "其他类型1" ' dataDict(itemID)(2) = ... ' 继续添加剩下的人员类型判断 End Select Next i ' 把字典里的数据输出到结果工作表 targetRow = 2 For Each key In dataDict.Keys wsTarget.Cells(targetRow, "A").Value = key wsTarget.Cells(targetRow, "B").Value = dataDict(key)(0) wsTarget.Cells(targetRow, "C").Value = dataDict(key)(1) ' 对应补充其他列的输出 targetRow = targetRow + 1 Next key MsgBox "数据转换完成!" End Sub
使用时记得先开启开发工具选项卡,把宏粘贴到VBA编辑器里,调整好工作表名称和人员类型后运行即可。
备注:内容来源于stack exchange,提问作者serge
相关产品推荐
相关产品推荐

