以下是引用ldy888在2007-10-31 23:16:53的发言:再度提速 在狼版基础上再度以空间换时间,加入字典处理不重复值, Sub Macro22() Dim arr, i As Long, n As Long, b(1000000) As Boolean, c(1000000) As Boolean, t As Single Application.ScreenUpdating = False Dim d As New Dictionary ' Set d = CreateObject("Scripting.Dictionary") arr = Range("a1:c60000") t = Timer For i = 1 To 60000 b(arr(i, 1)) = True Next For i = 1 To 60000 If b(arr(i, 2)) Then c(arr(i, 2)) = True Next For i = 1 To 60000 If c(arr(i, 3)) Then d(arr(i, 3)) = 1 Next [d1].Resize(d.Count, 1) = Application.Transpose(d.Keys) Application.ScreenUpdating = True MsgBox Timer - t & "秒!" ,最快到到 0.0625秒 End Sub 你们检查个以上代码结果的正确性没有?三列数值都重复的情况很少,我觉得上面代码输出的结果不正确也!并且 b(1000000) As Boolean, c(1000000) As Boolean 占用了大量的内存空间. 而且我觉得这个问题没有这么复杂,就像我以下的代码只用了0.09秒,而且只占用了很少的内存: Sub XQ1234() ti = Timer Dim myData(), sData(), rData() myData = Range("a1:c60000") '赋值给数组 t = 0 For r = 1 To 60000 If myData(r, 1) = myData(r, 2) And myData(r, 2) = myData(r, 3) Then '如果:第一个值等于第二个值 并且 第二个值等于第三个值 t = t + 1 ReDim Preserve sData(1 To t) ReDim Preserve rData(1 To t) sData(t) = myData(r, 1) '重复数值 rData(t) = r '行号 End If Next r If t >= 1 Then Cells(10, 6) = "行号" Cells(11, 6).Resize(t, 1) = Application.WorksheetFunction.Transpose(rData) Cells(10, 7) = "重复数值" Cells(11, 7).Resize(t, 1) = Application.WorksheetFunction.Transpose(sData) MsgBox "找到" & t & "个重复值,用时 " & Timer - ti & " 秒" Else MsgBox "没有重复,用时 " & Timer - ti & " 秒" End If End Sub
[此贴子已经被作者于2008-6-4 22:13:23编辑过] |