ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 如何用字典同时提取两组数据的相同值和不同值及各自不同的数据?

如何用字典同时提取两组数据的相同值和不同值及各自不同的数据?

作者:绿色风 分类: 时间:2022-08-18 浏览:139
楼主
kevinchengcw
Q:如何用字典同时提取两组数据的相同值和不同值及各自不同的数据?
A:两组数据间可以方便的用字典提取相同或不同数据,但是如何用字典同时提取相同和不同数据呢,下面给出一个处理的例子,我们将在例子中处理两种数据的相同处、不同处和各自对应的不同处数据内容。
代码如下:
  1. Sub test()
  2. Dim Dic, Arr
  3. Dim M, N, I As Long
  4. Set Dic = CreateObject("scripting.dictionary")  '创建字典
  5. For M = 4 To Cells(Rows.Count, 2).End(3).Row  '列举各数据行
  6.     Cells(M, 14).Resize(1, 24).ClearContents  '先清空统计区的数据
  7.     For N = 2 To 7  '循环A队区的数据
  8.         If Not Dic.exists(Cells(M, N).Value) Then Dic.Add Cells(M, N).Value, "A"  '如果字典中还没有就添加,并用"A"作为Item项
  9.     Next N
  10.     For N = 8 To 13  '循环B队区的数据
  11.         If Dic.exists(Cells(M, N).Value) Then  '如果字典里已经有了
  12.             If Dic(Cells(M, N).Value) <> "AB" And Dic(Cells(M, N).Value) <> "B" Then Dic(Cells(M, N).Value) = Dic(Cells(M, N).Value) & "B"  '再次判断item项是否已经是"AB"或者"B"了,如果不是就加上"B"
  13.         Else
  14.             Dic.Add Cells(M, N).Value, "B"  '如果字典里还没有就添加到字典里,并以"B"为item项
  15.         End If
  16.     Next N
  17.     Arr = Dic.keys '将字典的keys赋值给数组,便于取用
  18.     For N = LBound(Arr) To UBound(Arr)  '循环从数组里取值(相当于取出字典中的各个key)
  19.         Select Case Dic(Arr(N))  '判断item项的类型
  20.             Case Is = "A"  'A的情况下写到差异不同和A队差异对应的位置,注意用工作表函数的counta来判断该写到第几个单元格
  21.                 Cells(M, 20).Resize(1, 6).Cells(WorksheetFunction.CountA(Cells(M, 20).Resize(1, 6)) + 1) = Arr(N)
  22.                 Cells(M, 26).Resize(1, 6).Cells(WorksheetFunction.CountA(Cells(M, 26).Resize(1, 6)) + 1) = Arr(N)
  23.             Case Is = "B"  'B的情况处理
  24.                 Cells(M, 20).Resize(1, 6).Cells(WorksheetFunction.CountA(Cells(M, 20).Resize(1, 6)) + 1) = Arr(N)
  25.                 Cells(M, 32).Resize(1, 6).Cells(WorksheetFunction.CountA(Cells(M, 32).Resize(1, 6)) + 1) = Arr(N)
  26.             Case Is = "AB"  '是AB时只写到战绩相同里
  27.                 Cells(M, 14).Resize(1, 6).Cells(WorksheetFunction.CountA(Cells(M, 14).Resize(1, 6)) + 1) = Arr(N)
  28.             Case Else  '其他情况,预留(可以防止出错卡住)
  29.             
  30.         End Select
  31.     Next N
  32.     Erase Arr  '清空数组,防止意外出错
  33.     Dic.RemoveAll  '清空字典项目,防止数据混淆
  34. Next M
  35. Set Dic = Nothing  '释放项目
  36. MsgBox "处理完成", vbOKOnly, ""  '显示提示信息
  37. End Sub
附示例文件。
技能比武.rar
2楼
赵文竹
留印记以待以后学习,也算是收藏吧,主要还不会用这里的收藏呵呵~~
3楼
wnianzhong
收藏一下,慢慢学习!
4楼
xyh9999
学习字典法的使用
5楼
wise
前面并没有把字典加入"AB"呢?
AB的项怎么得到呢?
6楼
liuguansky

一个是A,一个是B,两个都有的就是AB
K哥的ITEM项是这样设置的啊。
再判断第二队的时候,就有设置啊。

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap