ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用VBA提取不重复的类别和子类别并排序?

如何用VBA提取不重复的类别和子类别并排序?

作者:绿色风 分类: 时间:2022-08-17 浏览:100
楼主
amulee
Q:如何用VBA提取不重复的类别和子类别并排序?
A:如附件,B2:C298有许多类别和子类别,如何按照右边的效果图提取不重复的类别和子类别并排序。请参考以下代码:
  1. Sub 数据处理()
  2.     Dim ArrYS, ArrJG, i&, k&, j&, temp
  3.     Dim d As New Dictionary
  4.     ArrYS = Range("B2:C" & Range("B1048576").End(xlUp).Row)
  5.     k = 0
  6.     ReDim ArrJG(1 To 3, 1 To 1)
  7.     '剔除重复
  8.     For i = 1 To UBound(ArrYS, 1)
  9.         If Not d.Exists(ArrYS(i, 1) & ArrYS(i, 2)) Then
  10.             k = k + 1
  11.             d(ArrYS(i, 1) & ArrYS(i, 2)) = k
  12.             ReDim Preserve ArrJG(1 To 3, 1 To k)
  13.             ArrJG(2, k) = ArrYS(i, 1)
  14.             ArrJG(3, k) = ArrYS(i, 2)
  15.         End If
  16.     Next i
  17.     '排序。双关键字。
  18.     For i = 1 To UBound(ArrJG, 2)
  19.         For j = i + 1 To UBound(ArrJG, 2)
  20.             If StrComp(ArrJG(2, j), ArrJG(2, i), vbTextCompare) = -1 Then
  21.                 temp = ArrJG(2, i)
  22.                 ArrJG(2, i) = ArrJG(2, j)
  23.                 ArrJG(2, j) = temp
  24.                 temp = ArrJG(3, i)
  25.                 ArrJG(3, i) = ArrJG(3, j)
  26.                 ArrJG(3, j) = temp
  27.             Else
  28.                 If StrComp(ArrJG(2, j), ArrJG(2, i), vbBinaryCompare) = 0 Then
  29.                     If StrComp(ArrJG(3, j), ArrJG(3, i), vbTextCompare) = -1 Then
  30.                         temp = ArrJG(2, i)
  31.                         ArrJG(2, i) = ArrJG(2, j)
  32.                         ArrJG(2, j) = temp
  33.                         temp = ArrJG(3, i)
  34.                         ArrJG(3, i) = ArrJG(3, j)
  35.                         ArrJG(3, j) = temp
  36.                     End If
  37.                 End If
  38.             End If
  39.         Next j
  40.     Next i
  41.     For i = UBound(ArrJG, 2) To 1 Step -1
  42.         ArrJG(1, i) = i
  43.         If i > 1 Then
  44.             If ArrJG(2, i) = ArrJG(2, i - 1) Then ArrJG(2, i) = ""
  45.         End If
  46.     Next i
  47.     Range("I2").Resize(UBound(ArrJG, 2), 3) = Application.Transpose(ArrJG)
  48. End Sub


A-VBA-用代码列出类别和子类别.rar
2楼
kevinchengcw
收下了,楼主继续加油!

免责声明

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

评论列表
sitemap