Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5094|回复: 10

[已解决]如何删除单元格中以逗号分隔的重复数据,相同的数据只保留一个?

[复制链接]
发表于 2015-10-29 15:36 | 显示全部楼层 |阅读模式
本帖最后由 arcticstar 于 2015-10-29 15:39 编辑

如何删除单元格中以逗号分隔的重复数据,相同的数据只保留一个?效果如附件所示。不用考虑排序
最佳答案
2015-10-29 16:25
  1. Sub tt()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     arr = Range("b1:c" & [b65536].End(3).Row)
  4.     For i = 2 To UBound(arr)
  5.         xrr = Split(arr(i, 1), ",")
  6.         For k = 0 To UBound(xrr)
  7.             d(xrr(k)) = ""
  8.         Next
  9.         arr(i, 2) = Join(d.keys, ",")
  10.         d.RemoveAll
  11.     Next
  12.     [b1].Resize(UBound(arr), UBound(arr, 2)) = arr
  13. End Sub
复制代码

工作簿2.zip

8.91 KB, 下载次数: 28

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-10-29 16:02 | 显示全部楼层
  1. Sub tt()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     arr = [a1].CurrentRegion
  4.     For i = 2 To UBound(arr)
  5.         xrr = Split(arr(i, 1), ",")
  6.         For k = 0 To UBound(xrr)
  7.             d(xrr(k)) = ""
  8.         Next
  9.         arr(i, 2) = Join(d.keys, ",")
  10.         d.RemoveAll
  11.     Next
  12.     [a1].CurrentRegion = arr
  13. End Sub
复制代码
回复

使用道具 举报

发表于 2015-10-29 16:02 | 显示全部楼层
请看附件。

工作簿2.rar

11.5 KB, 下载次数: 20

回复

使用道具 举报

 楼主| 发表于 2015-10-29 16:07 | 显示全部楼层
本帖最后由 arcticstar 于 2015-10-29 16:09 编辑
grf1973 发表于 2015-10-29 16:02
请看附件。

谢谢,请问如果原始数据放在第2列,结果放在第3列的话,代码应该怎么改?
回复

使用道具 举报

发表于 2015-10-29 16:20 | 显示全部楼层
arr(i,1)改成arr(i,2),arr(i,2)改成arr(i,3)
回复

使用道具 举报

 楼主| 发表于 2015-10-29 16:21 | 显示全部楼层
grf1973 发表于 2015-10-29 16:20
arr(i,1)改成arr(i,2),arr(i,2)改成arr(i,3)

实测实际数据中有空行的情况,这个条件不能判断空行的情况,更正后的数据见附件,请再帮指教下。谢谢

工作簿2有空行.zip

11.76 KB, 下载次数: 8

回复

使用道具 举报

发表于 2015-10-29 16:24 | 显示全部楼层
本帖最后由 金樽空对月 于 2015-10-29 16:27 编辑
arcticstar 发表于 2015-10-29 16:07
谢谢,请问如果原始数据放在第2列,结果放在第3列的话,代码应该怎么改?
抱歉,回错帖了。

回复

使用道具 举报

发表于 2015-10-29 16:25 | 显示全部楼层    本楼为最佳答案   
  1. Sub tt()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     arr = Range("b1:c" & [b65536].End(3).Row)
  4.     For i = 2 To UBound(arr)
  5.         xrr = Split(arr(i, 1), ",")
  6.         For k = 0 To UBound(xrr)
  7.             d(xrr(k)) = ""
  8.         Next
  9.         arr(i, 2) = Join(d.keys, ",")
  10.         d.RemoveAll
  11.     Next
  12.     [b1].Resize(UBound(arr), UBound(arr, 2)) = arr
  13. End Sub
复制代码

工作簿2.rar

11.91 KB, 下载次数: 19

回复

使用道具 举报

 楼主| 发表于 2015-10-29 16:54 | 显示全部楼层
本帖最后由 arcticstar 于 2015-10-29 17:01 编辑
grf1973 发表于 2015-10-29 16:25

谢谢,如果对删除重复数据后的C列新数据做排序处理,放在D列,应如何处理?
排序规则:按字母从a-z,数字0-9排序,字母优先,若C列数据与B列相同,则不进行排序(即仅排序有重复数据的单元格)。

在D列排序.zip

12.39 KB, 下载次数: 7

回复

使用道具 举报

发表于 2015-10-30 09:34 | 显示全部楼层
  1. Sub tt()     '提取字符串中不重复值,并排序
  2.     Set d = CreateObject("scripting.dictionary")
  3.     arr = Range("b1:c" & [b65536].End(3).Row)
  4.     For i = 2 To UBound(arr)
  5.         xrr = Split(arr(i, 1), ",")
  6.         For k = 0 To UBound(xrr)
  7.             d(xrr(k)) = ""
  8.         Next
  9.         arr(i, 2) = Join(d.keys, ",")
  10.         If arr(i, 1) <> arr(i, 2) Then
  11.             [h1].Resize(d.Count, 1) = Application.Transpose(d.keys)
  12.             [h1].Resize(d.Count, 1).Sort key1:=[h1]
  13.             arr(i, 2) = Join(Application.Transpose([h1].Resize(d.Count, 1)), ",")
  14.         End If
  15.         d.RemoveAll
  16.     Next
  17.     [h:h].ClearContents
  18.     [b1].Resize(UBound(arr), 2) = arr
  19. End Sub
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 04:20 , Processed in 0.369847 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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