Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2627|回复: 6

[已解决]求助:VBA药品去重复

[复制链接]
发表于 2014-10-6 10:18 | 显示全部楼层 |阅读模式
求助:VBA药品去重复

当运行,VBA时,弹出一选择框,按住CTRL键,可以选择多列(可以选择一列,也可以选择多列)。

确定后,删除,这些列重复的行。

请高手老师们帮帮忙,谢谢大家了!
VBA药品去重复.rar (34.42 KB, 下载次数: 26)
发表于 2014-10-6 10:55 | 显示全部楼层
  1. Sub 多列选择去重复()
  2.     Dim rng As Range, arr, area, i%, j%, k%, d As Object

  3.     On Error Resume Next
  4.     Set rng = Application.InputBox("请按CTRL选择需要去重复的列", "选择", , , , , , 8)
  5.     If rng Is Nothing Then Exit Sub
  6.     If rng.Rows.Count = 1 Then
  7.         Exit Sub
  8.     Else
  9.         ReDim arr(1 To rng.Areas.Count)
  10.         For i = 1 To rng.Areas.Count
  11.             arr(i) = Intersect(ActiveSheet.UsedRange, rng.Areas(i)).Value
  12.         Next
  13.         Set d = CreateObject("scripting.dictionary")
  14.         For i = UBound(arr(1)) To 2 Step -1
  15.             sr = ""
  16.             For j = 1 To UBound(arr)
  17.                 For k = 1 To UBound(arr(j), 2)
  18.                      sr = sr & arr(j)(i, k)
  19.                 Next
  20.             Next
  21.             If d.exists(sr) Then Rows(i).Delete Else d(sr) = ""
  22.         Next
  23.     End If
  24. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-10-6 10:59 | 显示全部楼层
xdragon 发表于 2014-10-6 10:55

谢谢老师了,你太厉害了,

有重复的数据,是不是,保留的第一次出现的数据呀

我测试下,太感谢你了老师!

点评

如果需要保留第一次出现的数据请用下面这个吧  发表于 2014-10-6 11:06
回复

使用道具 举报

发表于 2014-10-6 11:05 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xdragon 于 2014-10-6 11:07 编辑
  1. Sub 多列选择去重复()
  2.     Dim rng As Range, arr, area, i%, j%, k%, d As Object
  3.     On Error Resume Next
  4.     Set rng = Application.InputBox("请按CTRL选择需要去重复的列", "选择", , , , , , 8)
  5.     If rng Is Nothing Then Exit Sub
  6.     If rng.Rows.Count = 1 Then
  7.         Exit Sub
  8.     Else
  9.         ReDim arr(1 To rng.Areas.Count)
  10.         For i = 1 To rng.Areas.Count
  11.             arr(i) = Intersect(ActiveSheet.UsedRange, rng.Areas(i)).Value
  12.         Next
  13.         Set d = CreateObject("scripting.dictionary")
  14.         Set rng = Nothing
  15.         For i = 2 To UBound(arr(1))
  16.             For j = 1 To UBound(arr)
  17.                 For k = 1 To UBound(arr(j), 2)
  18.                      sr = sr & arr(j)(i, k)
  19.                 Next
  20.             Next
  21.             If d.exists(sr) Then
  22.                 If rng Is Nothing Then Set rng = Rows(i) Else Set rng = Union(rng, Rows(i))
  23.             Else: d(sr) = ""
  24.             End If
  25.             sr = ""
  26.         Next
  27.     End If
  28.     rng.Delete
  29. End Sub
复制代码
如果需要保留从上到下第一个不重复的,那就用这个吧

评分

参与人数 1 +12 收起 理由
yjwdjfqb + 12 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-10-6 11:08 | 显示全部楼层
xdragon 发表于 2014-10-6 11:05
如果需要保留从上到下第一个不重复的,那就用这个吧

谢谢老师了,你太厉害了,谢谢了!
回复

使用道具 举报

发表于 2014-10-6 11:24 | 显示全部楼层
xdragon 发表于 2014-10-6 10:55

请教一下。arr(j)(i, k),这个是数组的什么格式,属于几维数组
回复

使用道具 举报

发表于 2014-10-6 11:26 | 显示全部楼层
526753064 发表于 2014-10-6 11:24
请教一下。arr(j)(i, k),这个是数组的什么格式,属于几维数组

arr是一维数组,每个arr(j)下面包含的各是一个二维数组。就是一个一维数组里面有n个二维数组的意思。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-12 09:04 , Processed in 0.231861 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表