回答編集履歴

3

コード追記

2020/04/12 12:35

投稿

hatena19
hatena19

スコア33715

test CHANGED
@@ -93,3 +93,43 @@
93
93
  End With
94
94
 
95
95
  ```
96
+
97
+
98
+
99
+ ---
100
+
101
+ ② の旧版判定のコードを配列を使ったものにしてみました。セル参照なしでメモリー上での処理になるのでさらに高速化できると思います。
102
+
103
+
104
+
105
+ ```vba
106
+
107
+ Dim rng As Range, ary() As Variant
108
+
109
+ Set rng = ws.Range("A2:F" & Cells(Rows.Count, 1).End(xlUp).Row)
110
+
111
+ ary = rng.Value '表データを配列に格納
112
+
113
+ Dim old As Boolean
114
+
115
+ For i = UBound(ary) To 2 Step -1
116
+
117
+ If ary(i, 1) <> ary(i - 1, 1) Then '商品コードブレーク
118
+
119
+ old = False
120
+
121
+ ElseIf ary(i, 5) <> ary(i - 1, 5) Then '更新日ブレーク
122
+
123
+ old = True
124
+
125
+ End If
126
+
127
+
128
+
129
+ If old Then ary(i - 1, 6) = "旧版"
130
+
131
+ Next i
132
+
133
+ rng.Columns(6).Value = Application.Index(ary, 0, 6) '配列の6列目を表の6列目に代入
134
+
135
+ ```

2

コード追記

2020/04/12 12:35

投稿

hatena19
hatena19

スコア33715

test CHANGED
@@ -71,3 +71,25 @@
71
71
  End Sub
72
72
 
73
73
  ```
74
+
75
+
76
+
77
+ ③ の旧版のコピー/削除は、1行ずつコピー/削除するのではなく、AutoFilter で旧版のデータのみに絞り込んでから、コピー/削除すれば1回で済みますので、高速化になると思います。
78
+
79
+
80
+
81
+ ```vba
82
+
83
+ With ws.Range("A2:F" & ws.Cells(Rows.Count, 1).End(xlUp).Row)
84
+
85
+ .AutoFilter Field:=6, Criteria1:="=旧版"
86
+
87
+ .Copy ws2.Range("A2")
88
+
89
+ .EntireRow.Delete
90
+
91
+ .AutoFilter
92
+
93
+ End With
94
+
95
+ ```

1

説明追記

2020/04/12 10:09

投稿

hatena19
hatena19

スコア33715

test CHANGED
@@ -1,4 +1,20 @@
1
+ > ①コード、日付でソートする。
2
+
3
+ ②コードが同じで日付が異なる箇所のコード、日付を記憶させF列に旧版と記載する。
4
+
5
+ ③F列が旧版の列を別シートにコピーし削除する。
6
+
7
+ ④日付でソートする。
8
+
9
+
10
+
11
+ ① と ④ はそんなに時間がかかっていないし、大幅なの高速化はないでしょう。
12
+
13
+
14
+
15
+ ② と ③ で時間がかかっていると予想されます。
16
+
1
- 配列に格納してから処理するとか、高速化の方法はいろいろありすが、とりあえずは、旧版判定ロジックの高速化のロジックを考えてみました。
17
+ まずは、の高速化のロジックを考えてみました。
2
18
 
3
19
 
4
20
 
@@ -18,9 +34,7 @@
18
34
 
19
35
  Sub 移動()
20
36
 
21
- '
37
+ '略
22
-
23
- '商品コード、更新日の昇順で並べ替え
24
38
 
25
39
 
26
40
 
@@ -50,16 +64,10 @@
50
64
 
51
65
 
52
66
 
53
- '
67
+ '略 ③ ④
54
-
55
- '旧版をSheet2へ移動
56
68
 
57
69
 
58
70
 
59
71
  End Sub
60
72
 
61
-
62
-
63
-
64
-
65
73
  ```