楼主的意思可能是如上图所示。 将同一条件的单元格对应的所有内容全部合并到一个单元格内并用分隔符号分开(合并)。 【方法1:函数辅助列】 在Excel2016或365中,有最新的函数TextJoin处理。 但在旧版本中,函数就比较难处理此种问题。特别是条件在无序的情况下。 所幸,我们可以使用函数辅助列。 1、添加辅助列,公式如下: =IF(COUNTIF(A$2:A2,A2)=1,B2,LOOKUP(1,0/(A$1:A1=A2),C$1:C1)&','&B2) 公式解释:以小乔为例子。 1、COUNTIF(A$2:A2,A2)=1,每个条件的第一个内容不处理,直接显示为原内容。 比如,小乔,第一个内容显示为法师。 2、LOOKUP(1,0/(A$1:A1=A2),C$1:C1)&','&B2) Lookup函数返回单元格区域中小乔最后一个内容。 注意的是这里使用的错位的单元格。A$1:A1=A2以及C$1:C1,条件所在的单元格以上的数据区域。 当查询到第2个小乔的时候,LOOKUP(1,0/(A$1:A4=A5),C$1:C4)返回的结果是C2单元格的内容:法师。(注意单元格错位) 然后将其余B5单元格用 & 逗号 合并内容,生成一个新的字符串。 结果如下图红勾处: 这样就确保,最后1个条件合并了该条件的所有内容为一个字符串。 查询公式继续使用Lookup函数提取该条件的最后一个内容。 公式为: =LOOKUP(1,0/($A$2:$A$8=E2),$C$2:$C$8) 此法比较遗憾的地方是,重复的内容并没有去重。 比如,小乔对应的两个内容都是法师。 若要去重复处理,亦可以更改辅助列公式,公式如下: =IF(COUNTIF(A$2:A2,A2)=1,B2,IF(COUNTIFS(A$2:A2,A2,B$2:B2,B2)=1,LOOKUP(1,0/(A$1:A1=A2),D$1:D1) &','&B2,LOOKUP(1,0/(A$1:A1=A2),D$1:D1))) 公式解释:基本原理和上述的公式讲解一样。关键是用Countifs函数判断条件 内容是否第一次出现,如果是第一次出现,则合并内容,否则就返回改条件错位区域的最后内容。 此为函数辅助列解法,比较通用。在本人的此前发表的文章中也有简述。 见下面文章链接,喜欢可以看看: https://www.toutiao.com/i6557487064474976772/ 【方法2:powerquery的Text.Combine函数】 代码如下: let 源 = Excel.CurrentWorkbook(){[Name='表1']}[Content], 更改的类型 = Table.TransformColumnTypes(源,{{'条件', type text}, {'内容', type text}}), 删除的副本 = Table.Distinct(更改的类型), 分组的行 = Table.Group(删除的副本, {'条件'}, {{'计数', each Text.Combine([内容],',')}}) in 分组的行 具体操作见下面的GIF: 上面的详细的操作,读者在用powerquery处理时,可将代码直接使用即可得出结果,见下面的gif: 【方法3:VBA方法】 参考代码如下: Sub g1g() Dim arr arr = [a1].CurrentRegion '将数据写入数组 Set d = CreateObject('scripting.dictionary') '创建字典 For i = 2 To UBound(arr) '遍历数据 If Not d.exists(arr(i, 1)) Then '如果英雄姓名不存在字典中 d(arr(i, 1)) = arr(i, 2) '则将第一条数据放进字典 Else '如果英雄姓名已经在字典里 If InStr(d(arr(i, 1)), arr(i, 2)) = 0 Then '去重复处理 d(arr(i, 1)) = d(arr(i, 1)) & ',' & arr(i, 2) '将英雄姓名对应的内容用逗号合并成一个字符串 End If End If Next '//输出字典数据 [e2].Resize(d.Count, 2) = Application.Transpose(Array(d.keys, d.items)) End Sub 最后提供一个自定义函数txtjoin,方便大家处理。 该函数详细的使用方法和代码解释,请点击文章链接: https://www.toutiao.com/i6573449136505356804/ 文章内附有百度网盘的Excel文件下载链接。 欢迎关注套路Excel! |
|
来自: 东东85nuh7gdm8 > 《2、Word 及EXCEI》