ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 数据去重并作结构转换一例

数据去重并作结构转换一例

作者:绿色风 分类: 时间:2022-08-18 浏览:83
楼主
LOGO
如下图所示,如何将左侧数据去重并以右侧形式返回结果?

 

代码如下:
  1. Sub 数据去重并作结构转换()

  2. '声明变量
  3. Dim 数据            '要处理的数据
  4. Dim 关键字          '字典的关键字
  5. Dim 项目            '字典的项目
  6. Dim 辅助            '辅助数组
  7. Dim 结果            '结果数组
  8. Dim 字典 As Object   '字典对象
  9. Dim i As Integer     '
  10. Dim y As Integer

  11. Dim 列数 As Integer '结果数组列数
  12. Dim 行数 As Integer '结果数组行数

  13. '变量赋值
  14. 数据 = Range("A1").CurrentRegion                '将要处理的数据写入数组
  15. Set 字典 = CreateObject("scripting.dictionary")  '引用vbs字典
  16.     字典(数据(2, 1)) = "," & 数据(2, 2) & ","                '将数据数组第一条记录先写入字典(双边加逗号是为了下面项目是否添加作准备)
  17.    
  18.     '提速语句
  19.     Application.ScreenUpdating = False
  20.     Application.Calculation = xlCalculationManual
  21.    
  22.     For i = 3 To UBound(数据)                   '将第二条记录起至最后一条记录写入字典
  23.        If 字典(数据(i, 1)) = "" Then             '如果字典关键字中不存在当前记录
  24.             字典(数据(i, 1)) = "," & 数据(i, 2) & ","      '那么将该对数据写入字典(字典都是成对的,关键字+项目)
  25.         Else                                    '如果字典中已经存在该数据(关键字),那么再做进一步判断
  26.             If InStr(字典(数据(i, 1)), "," & 数据(i, 2) & ",") Then '如果该关键字的项目中已经存在了
  27.                 字典(数据(i, 1)) = 字典(数据(i, 1))      '那么项目不作添加
  28.             Else                                       '否则在原有项目的基础上添加当前数据,并且用逗号隔开
  29.                 字典(数据(i, 1)) = 字典(数据(i, 1)) & 数据(i, 2) & "," '
  30.             End If
  31.         End If
  32.     Next i  '处理数据中的下一行数据
  33. '    Stop
  34.     关键字 = 字典.keys  '将字典的关键字写入数组-关键字
  35.     项目 = 字典.items   '将字典的项目写入数组-项目
  36.    
  37.     '由于上面为了instr时实现精确查找,所以在项目的两端都添加了逗号,所以现在要把项目两端的逗号给去掉
  38.     For i = 1 To 字典.Count
  39.         项目(i - 1) = Mid(项目(i - 1), 2, Len(项目(i - 1)) - 2)
  40.     Next i
  41. '    Stop
  42.    
  43.     行数 = 字典.Count   '确定结果数组的行数(与字典的关键字个数一样)
  44.    
  45.     ReDim 辅助(1 To 行数) '定义辅助数组的大小(要将项目数组的每个数据用split根据分隔符号(,)来拆分,然后将其存放到辅助数组中去,形成数组中的数组)
  46.         辅助(1) = Split(项目(0), ",") '先将项目数组的第一个数据用split拆分然后放到辅助数组中去
  47.         列数 = UBound(辅助(1))        '获取辅助数组第一个数据(是一个数组)的下标数(因为下一步要通过循环来获取辅助数组各数据中下标最大者,将其下标
  48.     For i = 1 To UBound(项目)         '+2作为结果数组的列数(+2的原因:split产生的数组下标从0开始,所以要+1,另外结果中还要多一列(字典中的关键字),所以还要+1)
  49.         辅助(i + 1) = Split(项目(i), ",") '依次将项目用split拆分后放到辅助数组中去
  50.         If UBound(辅助(i)) > 列数 Then 列数 = UBound(辅助(i)) '循环比较辅助数组内各数组的下标,获取最大者以便进一步确定辅助数组的列数
  51.     Next i
  52.         
  53.         ReDim 结果(1 To 行数 + 1, 1 To 列数 + 2) '定义结果数组的行数(行数+1是因为要写入标题),列数
  54.         
  55.             '写入结果数组第一行各列数据
  56.             结果(1, 1) = 数据(1, 1)      '第1行第1列写入数据数组的第1行第1列的标题
  57.             For i = 2 To UBound(结果, 2) '第1行第2列至最后一列写入列名(原数据第1行第2列的标题+数字:如结果1、结果2、、、、)
  58.                 结果(1, i) = 数据(1, 2) & i - 1
  59.             Next i
  60. '            Stop
  61.             '写入结果数组第1列第2行至最后一行的数据(这里要写入的是字典的关键字)
  62.             For i = 2 To UBound(结果)
  63.                 结果(i, 1) = 关键字(i - 2) '关键字数组的下标是从0开始的,所以要-2
  64.             Next i
  65.             
  66.             '写入结果数组除第1行和第一列外的其他数据(即辅助数组中的数据)
  67.             '
  68.     For i = 1 To UBound(辅助)
  69.         For y = 0 To UBound(辅助(i))
  70.             结果(i + 1, y + 2) = 辅助(i)(y)
  71.         Next y
  72.     Next i
  73.    
  74.     '将结果数组写入单元格
  75.     With Range("E1")  '写入起点设为E1
  76.         .CurrentRegion.Clear '写入前先清除该一片区域原有数据
  77.         .Resize(UBound(结果), UBound(结果, 2)) = 结果 '写入结果
  78.         With .CurrentRegion
  79.              .EntireColumn.AutoFit
  80.              .Borders.LineStyle = xlContinuous
  81.         End With
  82.     End With
  83.     '恢复屏幕更新和自动重算,以免影响正常工作
  84.     Application.ScreenUpdating = True
  85.     Application.Calculation = xlCalculationAutomatic
  86. End Sub



数据附件.rar

免责声明

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

评论列表
sitemap