質問するログイン新規登録

回答編集履歴

2

コード修正

2017/05/01 23:11

投稿

hatena19
hatena19

スコア34367

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

追記

2017/05/01 23:11

投稿

hatena19
hatena19

スコア34367

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
+