Excel精英培训网

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

[已解决]哪位老师有,VBA删除当前工作表,完全数据重复的数据行,只保留一行

[复制链接]
发表于 2014-3-18 18:49 | 显示全部楼层 |阅读模式
本帖最后由 yjwdjfqb 于 2014-3-18 19:07 编辑

哪位老师有,VBA删除当前工作表,完全数据重复的数据行,只保留一行

或者帮帮我写一个,谢谢大家了!


附件.rar (1.74 KB, 下载次数: 14)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-3-18 19:08 | 显示全部楼层
  1. Sub Macro1()
  2. Dim arr, d, rng As Range, i&, p$
  3. t = Timer
  4. Set d = CreateObject("scripting.dictionary")
  5. arr = Range("a1").CurrentRegion
  6. For i = 1 To UBound(arr)
  7.     p = ""
  8.     For j = 1 To UBound(arr, 2)
  9.         p = p & "," & arr(i, j)
  10.     Next
  11.     If Not d.exists(p) Then
  12.         d(p) = ""
  13.     Else
  14.         If rng Is Nothing Then Set rng = Cells(i, 1) Else Set rng = Union(rng, Cells(i, 1))
  15.     End If
  16. Next
  17. If Not rng Is Nothing Then rng.EntireRow.Delete
  18. MsgBox Timer - t
  19. End Sub
复制代码
回复

使用道具 举报

发表于 2014-3-18 19:10 | 显示全部楼层
………………

新建 Microsoft Excel 工作表.zip

8 KB, 下载次数: 24

回复

使用道具 举报

发表于 2014-3-18 19:16 | 显示全部楼层
  1. Sub Macro1()
  2. Dim arr, d, rng As Range, i&, p$
  3. t = Timer
  4. Set d = CreateObject("scripting.dictionary")
  5. arr = Range("a1").CurrentRegion
  6. For i = 1 To UBound(arr)
  7.     p = Join(Application.Index(arr, i, 0), ",")
  8.     If Not d.exists(p) Then
  9.         d(p) = ""
  10.     Else
  11.         If rng Is Nothing Then Set rng = Cells(i, 1) Else Set rng = Union(rng, Cells(i, 1))
  12.     End If
  13. Next
  14. If Not rng Is Nothing Then rng.EntireRow.Delete
  15. MsgBox Timer - t
  16. End Sub
复制代码
再提供一种方法,两种方法速度差不多

评分

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

查看全部评分

回复

使用道具 举报

发表于 2014-3-18 19:24 | 显示全部楼层
  1. Sub 删除重复行()
  2.     Dim arr(), k%, n%, d, str$ '定义变量
  3.     Set d = CreateObject("scripting.dictionary") '创建字典去重
  4.     For k = 1 To Range("b65536").End(xlUp).Row '循环建立字典,并对重复数据的行数进行记录
  5.         str = Cells(k, 2) & Cells(k, 3) & Cells(k, 4) & Cells(k, 5) & Cells(k, 6) '建立字典关键字字符串
  6.         If Not d.exists(str) Then '判断关键字在字典中是否存在
  7.             d(str) = "" '不存在,添加到字典中
  8.         Else '存在
  9.             n = n + 1 '数组计数
  10.             ReDim Preserve arr(1 To n) '重新定义数组
  11.             arr(n) = k '向数组中添加重复数据所在的行号
  12.         End If
  13.     Next
  14.     For k = UBound(arr) To 1 Step -1 'x循环删除重复行
  15.         Range("a" & arr(k)).EntireRow.Delete
  16.     Next
  17. End Sub
复制代码

评分

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

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-3-18 19:24 | 显示全部楼层
dsmch 发表于 2014-3-18 19:16
再提供一种方法,两种方法速度差不多

朋友你好,感谢你的帮助,第二种好像要快点

但,工作表,数据行间有完全的空行,就不会执行成功,

能不能,先把数据间的空行(整行完全是空的),删除后,再执行删除完全相同的行,保留一行

附件2.rar (5.87 KB, 下载次数: 12)
回复

使用道具 举报

发表于 2014-3-18 19:27 | 显示全部楼层
10有个去重复的功能。
回复

使用道具 举报

发表于 2014-3-18 19:33 | 显示全部楼层
本帖最后由 风林火山 于 2014-3-18 19:34 编辑
yjwdjfqb 发表于 2014-3-18 19:24
朋友你好,感谢你的帮助,第二种好像要快点

但,工作表,数据行间有完全的空行,就不会执行成功,

Sub test()
    Dim arr As Range, k%
    k = Cells(Rows.Count, 2).End(3).Row
    ActiveSheet.Range("b1:F" & k).RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5), Header:=xlYes
    Columns("B:B").SpecialCells(xlCellTypeBlanks).Select
    Selection.EntireRow.Delete
End Sub


回复

使用道具 举报

 楼主| 发表于 2014-3-18 19:44 | 显示全部楼层
hwc2ycy 发表于 2014-3-18 19:27
10有个去重复的功能。

版主,单位都是用的2003的哟!
回复

使用道具 举报

发表于 2014-3-18 19:49 | 显示全部楼层
以上都不对吧,答案怎么有二条记录一样的?

1
0
2

这样?
Sub 删除内容完全重复的行()
     Dim cnn, SQL$
     Set cnn = CreateObject("adodb.connection")
     cnn.Open "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName
     SQL = "SELECT DISTINCT * FROM [SHEET1$A2:C65536]"  '
     Sheets("SHEET2").Range("A2").CopyFromRecordset cnn.Execute(SQL)
     cnn.Close
     Set cnn = Nothing
End Sub


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 00:15 , Processed in 0.542070 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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