|
▼PePe さん:
時間があったので、Findと CountIf と Dictionary とで、
どのくらい処理時間に差が出るのか、2つのシートに
2万行のランダム数値データを置いて、テストしてみました。
Option Explicit
Declare Function timeGetTime Lib "winmm.dll" () As Long
’// 2万行データの生成
Sub GenData()
Const Lo = 1000, Hi = 9999
Const MAX = 20000
Dim i&
Randomize
ReDim v(1 To MAX, 1 To 1)
For i = 1 To MAX
v(i, 1) = Int((Hi - Lo + 1) * Rnd() + Lo)
Next
Cells(1).Resize(MAX).Value = v
End Sub
Sub test1_Find()
Const MAX = 20000
Dim WS1 As Worksheet
Dim WS2 As Worksheet
Dim r1 As Range, r2 As Range, c As Range
Dim LstR1 As Long, LstR2 As Long
Dim v
Dim t&
t = timeGetTime()
Set WS1 = Worksheets(1)
Set WS2 = Worksheets(2)
With WS1
LstR1 = MAX '.Cells(Rows.Count, 1).End(xlUp).Row
Set r1 = .Range("A1:A" & LstR1)
LstR2 = MAX ' WS2.Cells(Rows.Count, 1).End(xlUp).Row
'WS2 A列をLoop
For Each r2 In WS2.Range("A1:A" & LstR2)
v = r2.Value
Set c = Nothing
'Bk2シートA列のあるセル値が、Bk1側にあるか調べる
Set c = r1.Find(v, LookIn:=xlFormulas, LookAt:=xlWhole)
'↓無かった時の処理
If c Is Nothing Then
LstR1 = LstR1 + 1
.Cells(LstR1, 1).Value = v
End If
Next r2
End With
Debug.Print "Find", timeGetTime() - t
End Sub
Sub test2_CountIf()
Const MAX = 20000
Dim WS1 As Worksheet
Dim WS2 As Worksheet
Dim r1 As Range, r2 As Range
Dim LstR1 As Long, LstR2 As Long
Dim v
Dim t&
t = timeGetTime()
Set WS1 = Worksheets(1)
Set WS2 = Worksheets(2)
With WS1
LstR1 = MAX '.Cells(Rows.Count, 1).End(xlUp).Row
Set r1 = .Range("A1:A" & LstR1)
LstR2 = MAX ' WS2.Cells(Rows.Count, 1).End(xlUp).Row
'WS2 A列をLoop
For Each r2 In WS2.Range("A1:A" & LstR2)
v = r2.Value
'Bk2シートA列のあるセル値が、Bk1側にあるか調べる
If WorksheetFunction.CountIf(r1, v) = 0 Then
'↓無かった時の処理
LstR1 = LstR1 + 1
.Cells(LstR1, 1).Value = v
End If
Next r2
End With
Debug.Print "CountIf", timeGetTime() - t
End Sub
Sub test3_Dictionary()
Const MAX = 20000
Dim WS1 As Worksheet
Dim WS2 As Worksheet
Dim r1 As Range, r2 As Range
Dim LstR1 As Long, LstR2 As Long
Dim i&, v
Dim dic As Object
Dim t&
t = timeGetTime()
Set dic = CreateObject("Scripting.Dictionary")
Set WS1 = Worksheets(1)
Set WS2 = Worksheets(2)
With WS1
LstR1 = MAX '.Cells(Rows.Count, 1).End(xlUp).Row
v = .Range("A1:A" & LstR1).Value
For i = 1 To UBound(v)
dic(v(i, 1)) = Empty
Next
LstR2 = MAX ' WS2.Cells(Rows.Count, 1).End(xlUp).Row
'WS2 A列をLoop
v = WS2.Range("A1:A" & LstR2).Value
For i = 1 To UBound(v)
'Bk2シートA列のあるセル値が、Bk1の辞書にあるか調べる
If Not dic.Exists(v(i, 1)) Then
'↓無かった時の処理
LstR1 = LstR1 + 1
.Cells(LstR1, 1).Value = v(i, 1)
End If
Next i
End With
Debug.Print "Dictionary", timeGetTime() - t
End Sub
■結果です(1回だけ 単位:ミリ秒)
CountIf 69390
Find 59691
Dictionary 256
|
|