ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 390|回复: 17

A列相同,B列去重跟A列用逗号合并输出到C列(B列里面同一个单元格有多个水果也分开...

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-2 17:32 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 宏初学者 于 2024-9-2 17:33 编辑

如何用vba实现:A列相同,B列去重跟A列用逗号合并输出到C列(B列里面同一个单元格有多个水果也分开合并)。。最后在E列汇总去重

由于数据很大,列举一小部分数据

工作簿2.rar

8.05 KB, 下载次数: 20

TA的精华主题

TA的得分主题

发表于 2024-9-2 17:48 | 显示全部楼层
嵌套函数。
=A2&","&TEXTJOIN(",",,UNIQUE(TEXTSPLIT(TEXTJOIN("-",,FILTER(B:B,A:A=A2)),,"-")))
image.png

工作簿2.zip

7.86 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2024-9-2 17:54 | 显示全部楼层
用公式就能解决。。。。。。。。。。。



捕获.JPG

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-2 18:02 | 显示全部楼层
limonet 发表于 2024-9-2 17:48
嵌套函数。
=A2&","&TEXTJOIN(",",,UNIQUE(TEXTSPLIT(TEXTJOIN("-",,FILTER(B:B,A:A=A2)),,"-")))

哈哈,是的,就是数据太大了,只列一部分,用公式卡死好几次了,所以想用vba看看

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-2 18:03 | 显示全部楼层
cnmlgb9998 发表于 2024-9-2 17:54
用公式就能解决。。。。。。。。。。。

就是数据太大了,用公式会卡住

TA的精华主题

TA的得分主题

发表于 2024-9-2 18:20 | 显示全部楼层
VBA,去重一步到位就行了,没必要生成C列数据

附件供参考。。。

工作簿2.zip

16.33 KB, 下载次数: 12

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-2 18:21 | 显示全部楼层
参与一下。。。

  1. Sub ykcbf()   '//2024.9.2   去重
  2.     Set d = CreateObject("Scripting.Dictionary")
  3.     On Error Resume Next
  4.     With Sheets("Sheet1")
  5.         r = .Cells(Rows.Count, 1).End(3).Row
  6.         arr = .[a1].Resize(r, 2)
  7.         ReDim brr(1 To r, 1 To 1)
  8.         For i = 2 To UBound(arr)
  9.             s = arr(i, 1)
  10.             b = Split(arr(i, 2), "-")
  11.             st = Join(b, ",")
  12.             If Not d.exists(s) Then
  13.                 m = m + 1
  14.                 d(s) = m
  15.                 brr(m, 1) = s & "," & st
  16.             Else
  17.                 r = d(s)
  18.                 For x = 0 To UBound(b)
  19.                     brr(r, 1) = IIf(InStr(brr(r, 1), b(x)), brr(r, 1), brr(r, 1) & "," & b(x))
  20.                 Next
  21.             End If
  22.         Next
  23.         .[e2:e1000] = ""
  24.         .[e2].Resize(m, 1) = brr
  25.     End With
  26.     Application.ScreenUpdating = True
  27.     MsgBox "OK!"
  28. End Sub

复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-2 19:07 | 显示全部楼层
Option Explicit
Sub TEST9()
    Dim ar, br, i&, j&, r&, dic As Object, vKey
   
    Application.ScreenUpdating = False
    Set dic = CreateObject("Scripting.Dictionary")
   
    ar = [A1].CurrentRegion.Value
    For i = 2 To UBound(ar)
        If Not dic.exists(ar(i, 1)) Then
            Set dic(ar(i, 1)) = CreateObject("Scripting.Dictionary")
        End If
        dic(ar(i, 1))(ar(i, 2)) = Empty
    Next i
   
    ReDim ar(dic.Count, 0)
    ar(0, 0) = "汇总"
    For Each vKey In dic.keys
        r = r + 1
        ar(r, 0) = vKey & " ," & Join(dic(vKey).keys, " ,")
    Next
   
    [E1].CurrentRegion.Clear
    [E1].Resize(UBound(ar) + 1) = ar
    Set dic = Nothing
    Application.ScreenUpdating = True
End Sub

   

TA的精华主题

TA的得分主题

发表于 2024-9-2 19:08 | 显示全部楼层
...............

工作簿2.rar

15.73 KB, 下载次数: 9

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-2 19:14 | 显示全部楼层
  1. Sub test()
  2. Dim Dic As Object, reGxp As Object, Arr, i&, j&, tmPobj As Object, tmPsubobj As Object
  3. Set Dic = CreateObject("scripting.dictionary")
  4. Set reGxp = CreateObject("vbscript.reGexp")
  5. reGxp.Global = True
  6. reGxp.Pattern = "([^\-]+)"
  7. With Sheet1
  8.     i = .Cells(.Rows.Count, "A").End(3).Row
  9.     Arr = .[a1].Resize(i, 3)
  10.     For i = 2 To UBound(Arr, 1)
  11.     If Not Dic.exists(Arr(i, 1)) Then Set Dic(Arr(i, 1)) = CreateObject("scripting.dictionary")
  12.         Set tmPobj = reGxp.Execute(Arr(i, 2))
  13.         For Each tmPsubobj In tmPobj
  14.             Dic(Arr(i, 1))(tmPsubobj.submatches(0) & "") = ""
  15.         Next
  16.     Next i
  17.     For i = 2 To UBound(Arr, 1)
  18.         Arr(i, 3) = Arr(i, 1) & "," & Join(Dic(Arr(i, 1)).keys, ",")
  19.     Next i
  20.     .[a1].Resize(UBound(Arr, 1), 3) = Arr
  21.    
  22.     ReDim Brr(1 To Dic.Count + 1, 1 To 1)
  23.     Brr(1, 1) = "汇总"
  24.     i = 1
  25.     For Each d In Dic.keys
  26.         i = i + 1
  27.         Brr(i, 1) = d & "," & Join(Dic(d).keys, ",")
  28.     Next d
  29.     .[e1].Resize(UBound(Brr, 1), 1) = Brr
  30. End With

  31. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 19:53 , Processed in 0.041856 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表