ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 怎么用数组或字典去除重复并归类.

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-3-11 19:51 | 显示全部楼层 |阅读模式
请教老师,怎么用数组或字典去除重复并归类.
主料次料1次料2次料3次料4次料5次料6次料7次料8
AAAAAA2AA3AA4AA5AA6AA7AA8
BBBBBB2BB3BB4BB5AA2
CCCCCC2CC3EE3EE40
CCCCCC4CC6CC8
EEEEEE2EE3EE40
GGGGGG8GG10
GGGGGG1GG2GG3GG4
AAAAAA4AA9AA10AA2AA6
BBBBBB10BB11BB1BB2

1.在A列找出相同数据并把A列后面的数据合并到一行,并去除此行的重复.最终结果是A列没有重复的.
2.因为把A列重复的合并成一行了,那空行要删除.
3.将每行中的单元格与其它行的单元格对比,如果有相同的就归为一类.如BB行中有AA2这个值是和AA行有相同单元格所以是一类.


因为自己写了代码但没有数组和字典,运行很慢,求助老师看看怎么处理...

去重与归类.rar

10.95 KB, 下载次数: 19

TA的精华主题

TA的得分主题

发表于 2019-3-11 20:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
第三步 有逻辑错误!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-11 20:40 | 显示全部楼层
duquancai 发表于 2019-3-11 20:07
第三步 有逻辑错误!!!

没有错误,数据是测试数据,我取名AA/BB/CC/DD/AA1/AA3....实际是很长不相同不相似的数据.

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-11 20:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub a依主料合并()
  2. Dim rng1, rng2 As Range, addr$, adr$
  3. Dim i As Long, j As Byte, k As Byte

  4. Application.ScreenUpdating = False
  5. For i = 2 To Range("A1048576").End(xlUp).Row
  6.     If Cells(i, 1) <> "" Then
  7.         Set rng1 = Range("a:a").Find(Cells(i, 1).Value, lookat:=xlWhole)
  8.         addr = rng1.Address                     '第一个地址是addr
  9.         
  10.         Do
  11.             Set rng1 = Range("a:a").FindNext(rng1)
  12.             adr = rng1.Address                  '下一个的地址是adr
  13.             
  14.             If adr <> addr Then
  15.                 For j = 1 To 10
  16.                     k = Application.WorksheetFunction.CountIf(Range(Cells(i, 1), Cells(i, Cells(i, 16384).End(xlToLeft).Column)), Cells(rng1.Row, j))
  17.                     If Cells(rng1.Row, j) = "" Then
  18.                     
  19.                     Else
  20.                         If k > 0 Then
  21.                             Cells(rng1.Row, j).Clear
  22.                         Else
  23.                             Cells(i, Cells(i, 16384).End(xlToLeft).Column + 1) = Cells(rng1.Row, j)
  24.                             Cells(i, Cells(i, 16384).End(xlToLeft).Column).Interior.ColorIndex = 3
  25.                             Cells(rng1.Row, j).Clear
  26.                            
  27.                         End If
  28.                     End If
  29.                 Next j
  30.             End If
  31.         Loop Until adr = addr
  32.     End If
  33. Next i
  34. Application.ScreenUpdating = True
  35.     MsgBox "完成"
  36. End Sub
  37. Sub b去空行()
  38. Dim i As Long
  39. Application.ScreenUpdating = False
  40.     For i = Range("A1048576").End(xlUp).Row To 2 Step -1
  41.          If Cells(i, 1) = "" Then
  42.             Rows(i).Delete shift:=xlUp
  43.         End If
  44.     Next i
  45. Application.ScreenUpdating = True
  46.     MsgBox "完成"
  47. End Sub
  48. Sub c开始分类()
  49. Dim rng1 As Range, addr As String, adr As String
  50. Dim i As Long, j As Byte, n As Integer, k As Byte
  51. n = 1
  52. k = Columns(InputBox("最后一个次料列标是:")).Column
  53. Application.ScreenUpdating = False
  54.     For i = 2 To Range("A1048576").End(xlUp).Row
  55.         For j = 1 To k
  56.             If Cells(i, j) <> "" Then
  57.                 Set rng1 = Range(Cells(2, 1), Cells(Range("A1048576").End(xlUp).Row, k)).Find(Cells(i, j).Value, lookat:=xlWhole)
  58.                 addr = rng1.Address
  59.                 If Cells(rng1.Row, k + 1) = "" Then
  60.                     Cells(rng1.Row, k + 1) = n
  61.                     n = n + 1
  62.                 End If
  63.                
  64.                 Do
  65.                     Set rng1 = Range(Cells(2, 1), Cells(Range("A1048576").End(xlUp).Row, k)).FindNext(rng1)
  66.                     adr = rng1.Address
  67.                     If adr <> addr Then
  68.                         If Cells(rng1.Row, k + 1) = "" Then
  69.                             Cells(rng1.Row, k + 1) = Cells(Range(addr).Row, k + 1)
  70.                         Else
  71.                             If Cells(rng1.Row, k + 1) <> Cells(Range(addr).Row, k + 1) Then
  72.                                 Cells(rng1.Row, k + 1).Interior.ColorIndex = 3
  73.                                 MsgBox "可能是多方,已标记红底色!"
  74.                             End If
  75.                         End If
  76.                     End If
  77.                 Loop Until addr = adr
  78.             End If
  79.         Next j
  80.     Next i
  81. Application.ScreenUpdating = True
  82. End Sub
复制代码

这是原来写的代码,但数据量大时运行过慢,所以求数组或字典的解决办法,供参考逻辑.

TA的精华主题

TA的得分主题

发表于 2019-3-11 20:45 | 显示全部楼层
tigertc 发表于 2019-3-11 20:40
没有错误,数据是测试数据,我取名AA/BB/CC/DD/AA1/AA3....实际是很长不相同不相似的数据.

好的,等待后面大神吧!

TA的精华主题

TA的得分主题

发表于 2019-3-11 21:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Set d = CreateObject("scripting.dictionary")
  6.   Set d1 = CreateObject("scripting.dictionary")
  7.   With Worksheets("原数据")
  8.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  9.     c = .Cells(1, .Columns.Count).End(xlToLeft).Column
  10.     arr = .Range("a2").Resize(r - 1, c)
  11.   End With
  12.   For i = 1 To UBound(arr)
  13.     If Not d.exists(arr(i, 1)) Then
  14.       Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
  15.     End If
  16.     For j = 2 To UBound(arr, 2)
  17.       If Len(arr(i, j)) <> 0 Then
  18.         d(arr(i, 1))(arr(i, j)) = ""
  19.       End If
  20.     Next
  21.   Next
  22.   kk = d.keys
  23.   k = 0
  24.   For i = 0 To UBound(kk)
  25.     If Not d1.exists(kk(i)) Then
  26.       k = k + 1
  27.       d1(kk(i)) = k
  28.       For j = i + 1 To UBound(kk)
  29.         If Not d1.exists(d(kk(j))) Then
  30.           For Each bb In d(kk(j)).keys
  31.             If d(kk(i)).exists(bb) Then
  32.               d1(kk(j)) = k
  33.               Exit For
  34.             End If
  35.           Next
  36.         End If
  37.       Next
  38.     End If
  39.   Next
  40.   s = 0
  41.   For Each aa In d.keys
  42.     If s < d(aa).Count Then
  43.       s = d(aa).Count
  44.     End If
  45.   Next
  46.   With Worksheets("结果")
  47.     .Cells.Clear
  48.     .Cells(1, 1) = "主料"
  49.     For j = 1 To s
  50.       .Cells(1, j + 1) = "次料" & j
  51.     Next
  52.     .Cells(1, s + 2) = "编码"
  53.     m = 2
  54.     For Each aa In d.keys
  55.       .Cells(m, 1) = aa
  56.       .Cells(m, 2).Resize(1, d(aa).Count) = d(aa).keys
  57.       .Cells(m, s + 2) = d1(aa)
  58.       m = m + 1
  59.     Next
  60.   End With
  61. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-3-11 21:25 | 显示全部楼层
以前没有做过这样的题目,练练手。

去重与归类.rar

23.38 KB, 下载次数: 47

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-11 21:32 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-3-11 22:38 | 显示全部楼层
用得最多的就是 循环和字典,只是第三部的编码没搞懂是从数据源的什么地方来的………………
  1. Sub 去重组合()
  2.   Set d = CreateObject("scripting.dictionary")
  3.   Set ds = CreateObject("scripting.dictionary")
  4.   arr = Sheet1.[A1].CurrentRegion
  5.   For i = 2 To UBound(arr)
  6.     If d.exists(arr(i, 1)) Then cl = d(arr(i, 1)) Else cl = ""
  7.     For j = 2 To UBound(arr, 2)
  8.       If arr(i, j) <> "" _
  9.       Then If cl = "" Then cl = arr(i, j) _
  10.       Else cl = cl & "," & arr(i, j)
  11.     Next j: d(arr(i, 1)) = cl
  12.   Next i
  13.   For Each da In d: arr = Split(d(da), ",")
  14.     For i = 0 To UBound(arr)
  15.       If Not ds.exists(arr(i)) Then ds(arr(i)) = arr(i)
  16.     Next i
  17.     d(da) = Application.Index(ds.Items, 0): ds.RemoveAll
  18.   Next da
  19.   For Each sh In Sheets
  20.     If sh.Name = "返回结果" Then shz = "存在": Exit For
  21.   Next sh
  22.   If shz <> "存在" _
  23.   Then Sheets.Add after:=Sheets(Sheets.Count): Sheets(Sheets.Count).Name = "返回结果" _
  24.   Else Sheets("返回结果").[A1].CurrentRegion.ClearContents
  25.   With Sheets("返回结果"):
  26.     For Each da In d: n = n + 1
  27.       If m < UBound(d(da)) Then m = UBound(d(da))
  28.       .Cells(n + 1, 1) = da
  29.       .Cells(n + 1, 2).Resize(1, UBound(d(da))) = d(da)
  30.     Next da
  31.     .[A1] = "材料": For j = 2 To m + 1: .Cells(1, j) = "材料" & j - 1: Next j
  32.   End With
  33. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2019-3-12 10:15 | 显示全部楼层
供参考。

tigertc_去重与归类.rar

22.91 KB, 下载次数: 193

tigertc_主次料归类.rar

162.1 KB, 下载次数: 72

修改13楼附件

评分

1

查看全部评分

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

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 23:16 , Processed in 0.045751 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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