ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何将多列内容去重后按NAME分行返回?

如何将多列内容去重后按NAME分行返回?

作者:绿色风 分类: 时间:2022-08-17 浏览:123
楼主
liuguansky
Q:现在的数据源第一列为NAME后面有三列数据Arr,现在 要求返回成一个NAME一行的形式,且NAME后的ARR去重返回在当行。应该该如何处理?

A:用如下代码可以实现:



  1. Sub JusTTest()

  2.     Dim Arr, i&, j%, D, Dt, kR&, ArrR(1 To 60000, 1 To 256) As String

  3.     '定义名称

  4.     Set D = CreateObject("scripting.dictionary")

  5.     Set Dt = CreateObject("scripting.dictionary")

  6.     '创建字典对象

  7.     Arr = Sheets(1).Range("a1").CurrentRegion.Value

  8.     '获取数据到数组

  9.     For i = 2 To UBound(Arr, 1) '循环行

  10.         If Not D.exists(Arr(i, 1)) Then '如果NAME不存在

  11.             D.Add Arr(i, 1), 0 '添加新NAME入字典KEY

  12.             Set D(Arr(i, 1)) = CreateObject("scripting.dictionary") '创建字典ITEM为字典项目

  13.             kR = kR + 1: Dt.Add Arr(i, 1), Array(kR, 1): ArrR(kR, 1) = Arr(i, 1)

  14.             '同时累加计数,对当前NAME的行列位置进行赋值

  15.         End If

  16.         For j = 2 To UBound(Arr, 2) '循环列

  17.             If Not D(Arr(i, 1)).exists(Arr(i, j)) Then '如果ARR不存在

  18.                 D(Arr(i, 1)).Add Arr(i, j), "" '添加入子字典KEY

  19.                 Dt(Arr(i, 1)) = Array(Dt(Arr(i, 1))(0), Dt(Arr(i, 1))(1) + 1) '同时累加列计位

  20.                 ArrR(Dt(Arr(i, 1))(0), Dt(Arr(i, 1))(1)) = Arr(i, j) '返回结果数组对应位置值

  21.             End If

  22.         Next j

  23.     Next i

  24.     With Sheets(2)

  25.         .UsedRange.ClearContents

  26.         .Range("A1").Resize(D.Count, 256) = ArrR

  27.         .Activate

  28.     End With

  29.     Set D = Nothing

  30.     Set Dt = Nothing

  31. End Sub
该帖已经同步到 liuguansky的微博
2楼
JOYARK1958
謝謝提供學習下載中

免责声明

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

评论列表
sitemap