ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 消除重复并合并信息(字典)

消除重复并合并信息(字典)

作者:绿色风 分类: 时间:2022-08-17 浏览:96
楼主
DJ_Soo
Q:有两列数据,第一列有很多重复如"A,B,C,A,C"等,第二列有不同信息,如何将所有第一列相同的内容合并为一个,并将对应第二列的内容整合在一起,并显示整合后的结果?
A:ALT+F11→VBE编辑环境→右键插入模块→输入以下代码:
  1. Option Explicit

  2. Sub Unique_Merge()
  3.     Dim arrKeys As Variant
  4.     Dim arrCon As Variant
  5.     Dim arrRes As Variant
  6.     Dim lstRo As Long
  7.     With ThisWorkbook
  8.         With .Sheets(1)
  9.             lstRo = .Cells(Rows.Count, 1).End(xlUp).Row
  10.             arrKeys = .[A1].Resize(lstRo)
  11.             arrCon = .[B1].Resize(lstRo)
  12.         End With
  13.         arrRes = Unique_Merge_2(arrKeys, arrCon)
  14.         With .Sheets(2).[A1].Resize(UBound(arrRes), 2)
  15.             .EntireRow.ClearContents
  16.             .Value = arrRes
  17.             .Parent.Activate
  18.         End With
  19.     End With
  20. End Sub

  21. Function Unique_Merge_2(arr_Keys As Variant, arr_Con As Variant)
  22.     Dim Dic As Object   '字典
  23.     '注:Key理解为正常我们查字典中的字,如"爱"
  24.     Dim Keys As Variant '数组,装载已经unique的Keys
  25.     Dim Con As String   '按照字典查字的理解,此处Con为对应字义,如爱的字义有"喜欢"和"同情"等不同解释
  26.                         '数值(字典对应的字义),此函数为多种字义给合并起来,并以换行符分隔
  27.     Dim arrKeys As Variant      '***此处两个数组arrKeys和arrCon***************
  28.     Dim arrCon As Variant       '***定义出来是为了适应在工作表中直接引用单元格**
  29.     Dim arrRes() As Variant     '********************************************
  30.    
  31.     Dim Ro As Long
  32.     Dim fstRo As Long   '为适应多种数组,此处设置fstRo以便自动调整(但要求arrKeys,arrCon相同结构!)
  33.     Dim lstRo As Long
  34.     Dim cntKeys As Long     'unique之后keys的个数
  35.     Dim Cnt As Long
  36.    
  37.     Set Dic = CreateObject("Scripting.dictionary")  '创建字典
  38.     arrKeys = arr_Keys: arrCon = arr_Con    '避免遇到range类型出错
  39.     fstRo = LBound(arrKeys): lstRo = UBound(arrKeys)
  40.     For Ro = fstRo To lstRo
  41.         Con = Dic(arrKeys(Ro, 1))
  42.         If Con = "" Then                    '判断是否曾经有过字义内容
  43.             Dic(arrKeys(Ro, 1)) = arrCon(Ro, 1)
  44.         Else
  45.             Dic(arrKeys(Ro, 1)) = Con & vbNewLine & arrCon(Ro, 1)
  46.         End If
  47.     Next Ro
  48.     cntKeys = Dic.Count: Keys = Dic.Keys    'unique之后指定给keys数组
  49.     ReDim arrRes(1 To cntKeys, 1 To 2)      '不用指定类型是为了适应多种类型
  50.     For Cnt = 1 To cntKeys
  51.         arrRes(Cnt, 1) = Keys(Cnt - 1)      '列举字典中所有的字
  52.         arrRes(Cnt, 2) = Dic(Keys(Cnt - 1)) '对应字义的合并
  53.     Next Cnt
  54.     Unique_Merge_2 = arrRes
  55. End Function
整合前数据类型:

 
整合后数据类型:

 

字典应用(唯一整合).rar
2楼
海洋之星
哇塞,好长的代码
3楼
DJ_Soo
都长在定义变量上了..哈哈!
4楼
No.nOう
难道不能玩排序吗**!
5楼
omnw
好帖,学习使用“字典”!
6楼
芐雨
学习使用
7楼
ggq666
8楼
ggq666


9楼
jm9999
很好,顶!

免责声明

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

评论列表
sitemap