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

回答編集履歴

3

コード追記

2020/04/12 12:35

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -45,4 +45,24 @@
45
45
  .EntireRow.Delete
46
46
  .AutoFilter
47
47
  End With
48
+ ```
49
+
50
+ ---
51
+ ② の旧版判定のコードを配列を使ったものにしてみました。セル参照なしでメモリー上での処理になるのでさらに高速化できると思います。
52
+
53
+ ```vba
54
+ Dim rng As Range, ary() As Variant
55
+ Set rng = ws.Range("A2:F" & Cells(Rows.Count, 1).End(xlUp).Row)
56
+ ary = rng.Value '表データを配列に格納
57
+ Dim old As Boolean
58
+ For i = UBound(ary) To 2 Step -1
59
+ If ary(i, 1) <> ary(i - 1, 1) Then '商品コードブレーク
60
+ old = False
61
+ ElseIf ary(i, 5) <> ary(i - 1, 5) Then '更新日ブレーク
62
+ old = True
63
+ End If
64
+
65
+ If old Then ary(i - 1, 6) = "旧版"
66
+ Next i
67
+ rng.Columns(6).Value = Application.Index(ary, 0, 6) '配列の6列目を表の6列目に代入
48
68
  ```

2

コード追記

2020/04/12 12:35

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -34,4 +34,15 @@
34
34
  '略 ③ ④
35
35
 
36
36
  End Sub
37
+ ```
38
+
39
+ ③ の旧版のコピー/削除は、1行ずつコピー/削除するのではなく、AutoFilter で旧版のデータのみに絞り込んでから、コピー/削除すれば1回で済みますので、高速化になると思います。
40
+
41
+ ```vba
42
+ With ws.Range("A2:F" & ws.Cells(Rows.Count, 1).End(xlUp).Row)
43
+ .AutoFilter Field:=6, Criteria1:="=旧版"
44
+ .Copy ws2.Range("A2")
45
+ .EntireRow.Delete
46
+ .AutoFilter
47
+ End With
37
48
  ```

1

説明追記

2020/04/12 10:09

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -1,5 +1,13 @@
1
+ > ①コード、日付でソートする。
1
- 配列に格納してから処理すとか、高速化方法はいろいろありますがとりあえずは、旧版の判定ロジックの高速化のロジックを考えてみました
2
+ ②コードが同じで日付が異な箇所コード日付を記憶させF列に旧版と記載する
3
+ ③F列が旧版の列を別シートにコピーし削除する。
4
+ ④日付でソートする。
2
5
 
6
+ ① と ④ はそんなに時間がかかっていないし、大幅なの高速化はないでしょう。
7
+
8
+ ② と ③ で時間がかかっていると予想されます。
9
+ まずは、② の高速化のロジックを考えてみました。
10
+
3
11
  日付が昇順に並んでいるなら、ループをは後ろから走査した方がシンプルかつ高速になりそうです。
4
12
  Boolean型の旧版判定変数を、
5
13
  商品コードがブレーク(変化したら)したら False
@@ -8,8 +16,7 @@
8
16
  ```vba
9
17
 
10
18
  Sub 移動()
11
- '
19
+ '略
12
- '商品コード、更新日の昇順で並べ替え
13
20
 
14
21
  With ws
15
22
  Dim old As Boolean ’旧版判定
@@ -24,10 +31,7 @@
24
31
  Next i
25
32
  End With
26
33
 
27
- '
34
+ '略 ③ ④
28
- '旧版をSheet2へ移動
29
35
 
30
36
  End Sub
31
-
32
-
33
37
  ```