回答編集履歴

2

コード追記

2022/11/07 12:55

投稿

hatena19
hatena19

スコア33620

test CHANGED
@@ -23,3 +23,30 @@
23
23
 
24
24
  40万行とデータ数が多いので配列を使って高速化してます。
25
25
  大量のデータを高速に処理するには配列の利用は必須ですので、 「VBA 配列 高速化」などのキーワードで検索すると解説ページが多数見つかりますので、それで研究してください。
26
+
27
+ 追記
28
+ ---
29
+ 棚卸結果の項番がマスターの方に存在しない場合のエラー対策を追加
30
+ ```vba
31
+ Public Sub Sample2()
32
+ Dim aryResult(), aryMaster()
33
+ With Workbooks("棚卸結果.xlsx").Worksheets(1)
34
+ aryResult = .Range(.Cells(2, 1), .Cells(Rows.Count, "D").End(xlUp)).Value
35
+ End With
36
+ ReDim aryMaster(1 To UBound(aryResult), 1 To 2)
37
+
38
+ Dim i As Long, n As Long
39
+ For i = 1 To UBound(aryResult)
40
+ n = aryResult(i, 4)
41
+ If n > 0 And n <= UBound(aryMaster) Then
42
+ aryMaster(n, 1) = aryResult(i, 1)
43
+ aryMaster(n, 2) = aryResult(i, 2)
44
+ Else
45
+ Debug.Print "エラー行番号: " & i + 1
46
+ End If
47
+ Next
48
+
49
+ Workbooks("マスタ.xlsx").Worksheets(1).Range("C2").Resize(UBound(aryMaster), 2).Value = aryMaster
50
+ End Sub
51
+ ```
52
+ 棚卸結果の項番がマスターの方に存在しない場合は、イミディエイトウィンドウにその行番号を出力するようしました。

1

コード修正

2022/11/02 04:13

投稿

hatena19
hatena19

スコア33620

test CHANGED
@@ -5,7 +5,7 @@
5
5
  ```vba
6
6
  Public Sub Sample()
7
7
  Dim aryResult(), aryMaster()
8
- With Worksheets("棚卸結果")
8
+ With Workbooks("棚卸結果.xlsx").Worksheets(1)
9
9
  aryResult = .Range(.Cells(2, 1), .Cells(Rows.Count, "D").End(xlUp)).Value
10
10
  End With
11
11
  ReDim aryMaster(1 To UBound(aryResult), 1 To 2)
@@ -17,7 +17,7 @@
17
17
  aryMaster(n, 2) = aryResult(i, 2)
18
18
  Next
19
19
 
20
- Worksheets("マスタ.xlsx").Range("C2").Resize(UBound(aryMaster), 2).Value = aryMaster
20
+ Workbooks("マスタ.xlsx").Worksheets(1).Range("C2").Resize(UBound(aryMaster), 2).Value = aryMaster
21
21
  End Sub
22
22
  ```
23
23