回答編集履歴
2
コード修正
answer
CHANGED
@@ -60,7 +60,7 @@
|
|
60
60
|
Public Sub dic_04()
|
61
61
|
Dim mydic As Object
|
62
62
|
Dim i As Long
|
63
|
-
Dim ary1
|
63
|
+
Dim ary1()
|
64
64
|
Dim ary2(2 To 180000, 0) As Long
|
65
65
|
|
66
66
|
Application.ScreenUpdating = False
|
@@ -69,7 +69,7 @@
|
|
69
69
|
Set mydic = CreateObject("Scripting.Dictionary")
|
70
70
|
|
71
71
|
With Sheets("条件")
|
72
|
-
ary1 = .Range("A2:B6000")
|
72
|
+
ary1 = .Range("A2:B6000").Value
|
73
73
|
For i = 6000 To 2 Step -1
|
74
74
|
mydic(ary1(i - 1, 1)) = ary1(i - 1, 2)
|
75
75
|
Next i
|
@@ -79,7 +79,7 @@
|
|
79
79
|
For i = 2 To 180000
|
80
80
|
ary2(i, 0) = mydic.Item(.Cells(i, 1).Value)
|
81
81
|
Next
|
82
|
-
.Range("B2:B180000") = ary2
|
82
|
+
.Range("B2:B180000").Value = ary2
|
83
83
|
End With
|
84
84
|
|
85
85
|
Set mydic = Nothing
|
1
追記
answer
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
CreateObject で生成した時点で初期化されていますので、
|
19
19
|
初期化コードなどは不要です。
|
20
20
|
|
21
|
-
|
21
|
+
蛇足
|
22
22
|
---
|
23
23
|
|
24
24
|
あと、処理速度の改善を検討する場合、まずは、どの処理に時間がかかっているのか計測する必用があります。
|
@@ -41,4 +41,51 @@
|
|
41
41
|
'Dictionaryからセルへの書き込み処理
|
42
42
|
|
43
43
|
Debug.Print Format(Timer - T,"0.00秒")
|
44
|
-
```
|
44
|
+
```
|
45
|
+
|
46
|
+
蛇足の蛇足
|
47
|
+
---
|
48
|
+
サンプルを作成して当方の環境で処理速度を計測してみました。
|
49
|
+
"条件"シートに6000件のデータ、
|
50
|
+
重複を排除してDictionaryに登録すると 3000件
|
51
|
+
"抽出結果"シートには180000件のデータ
|
52
|
+
質問のコードで3秒ぐらい。
|
53
|
+
同じデータなら、誤差範囲の差しかでませんでした。
|
54
|
+
|
55
|
+
でコードのチューンナップしてみました。
|
56
|
+
セル範囲からの読み込み、書き込みを配列を介して一括処理に変更してみました。
|
57
|
+
これで、処理時間が1/3に短縮できました。
|
58
|
+
|
59
|
+
```
|
60
|
+
Public Sub dic_04()
|
61
|
+
Dim mydic As Object
|
62
|
+
Dim i As Long
|
63
|
+
Dim ary1
|
64
|
+
Dim ary2(2 To 180000, 0) As Long
|
65
|
+
|
66
|
+
Application.ScreenUpdating = False
|
67
|
+
Application.EnableEvents = False
|
68
|
+
|
69
|
+
Set mydic = CreateObject("Scripting.Dictionary")
|
70
|
+
|
71
|
+
With Sheets("条件")
|
72
|
+
ary1 = .Range("A2:B6000")
|
73
|
+
For i = 6000 To 2 Step -1
|
74
|
+
mydic(ary1(i - 1, 1)) = ary1(i - 1, 2)
|
75
|
+
Next i
|
76
|
+
End With
|
77
|
+
|
78
|
+
With Sheets("抽出結果")
|
79
|
+
For i = 2 To 180000
|
80
|
+
ary2(i, 0) = mydic.Item(.Cells(i, 1).Value)
|
81
|
+
Next
|
82
|
+
.Range("B2:B180000") = ary2
|
83
|
+
End With
|
84
|
+
|
85
|
+
Set mydic = Nothing
|
86
|
+
|
87
|
+
Application.EnableEvents = True
|
88
|
+
Application.ScreenUpdating = True
|
89
|
+
End Sub
|
90
|
+
```
|
91
|
+
|