|
|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
用以下代码测试你那38340行数据,只需要140秒左右,可以说算最快的了。
楼主再要嫌慢,那就没办法了。
附件为:
Test.rar
(178.1 KB, 下载次数: 14)
具体实现思路如下:
利用 Dictionary 字典,主键唯一性。
1、逆向逐行对每行12个单元格的值进行排序,并组合成一字符串,
2、再检查字典中是否存在该字符串为主键的键值;
3、如果第二步存在的话,将删除该行。不存在则在字典中添加一主键,其键值为第一步组合成的字符串
以下代码,按楼主提供的数据38340行12列,将循环次为38340*12次,共有8513组数为不重复的- Sub 行与行的值全部相同则只保留一行()
- Dim nRowCount As Long
- Dim DR As Dictionary
- Dim DelLine As String, TT As String
-
- yy = Timer
- bStop = False
- nRowCount = Sheet1.Range("a1").CurrentRegion.Rows.Count '获得数据行数
-
- Set DR = New Dictionary '建立一新空白字典对象
-
- For i = nRowCount To 1 Step -1 '逆向逐行检查
- TT = ""
-
- For J = 1 To 12 '对每行12个数进行排序
- '对行进行排序
-
- DoEvents '移交控制权,以免程序运行时,鼠标无法点击工作表中“停止”按钮
-
- If bStop = True Then Exit Sub '如果点了停止按钮,则中断程序
-
- TT = TT & "/" & Application.WorksheetFunction.Small(Sheet1.Range(Sheet1.Cells(i, 1), Sheet1.Cells(i, 12)), J) '获得该行12个数排序后得到的字符串,并付值给变量TT
- Next
-
- Application.StatusBar = "正在检测 第 " & i & " 行, 最终检查到 1 时就结束程序,请耐心等候。。。(己完成 " & Format(i / nRowCount, "0.0%") & ")" '状态栏提示动态文字。
-
- If DR.Exists("k" & TT) = True Then '如果以 TT 字符串为主键的键存在于字典时,则删除该行
- If Len(DelLine & "," & i & ":" & i) > 256 Or i = 1 Then '行号字符满256或检测到最后一行时将删除重复的行
- If Len(DelLine) <> 0 Then
- DelLine = Right(DelLine, Len(DelLine) - 1)
- Range(DelLine).Delete Shift:=xlUp
- DelLine = "," & i & ":" & i
- Else
- Range("1:1").Delete Shift:=xlUp
- End If
- Else
- DelLine = DelLine & "," & i & ":" & i
- End If
- Else
- DR.Add "k" & TT, "k" & TT '如果以 TT 字符串为主键的键不存在于字典时,则添加主键 TT
- End If
- Next
-
- Application.StatusBar = False ' 循环完成后,将状态栏文字恢复到默认。
-
- MsgBox DR.Count & "用时:" & Timer - yy
- End Sub
复制代码
[ 本帖最后由 xyh_bear 于 2009-8-6 17:04 编辑 ] |
|