Excel VBA でループ処理中にワークシートのセル参照の方法を変更すると、処理速度が向上するのではないかと考え、参照方法を検討しました。
Range オブジェクトを使用すると、Value プロパティを指定することになりますが、Cells オブジェクトでは必要ありません。
検証した結果ですが、200 個のワークブックをループ処理した場合、改善後は少しだけ (5% ほど) 速くなりました。劇的な速度向上ではありませんが、処理対象のワークブックが増えるほど効果があります。全面的にこちらに変更してもよいのですが、セルに名前を付けている箇所を参照する場合には、Range オブジェクトを使う必要があります。使い分けが必要かもしれません。
Range オブジェクトを使用するパターン
Dim wbReadBook As Object Set wbReadBook = Workbooks.Open("D:\Test\TestBook1.xlsx") With Workbooks("売掛金台帳").Worksheets("Sheet1") .Range("A1").Value = wbReadBook.Worksheets("Sheet1").Range("A1") .Range("A2").Value = wbReadBook.Worksheets("Sheet1").Range("A2") .Range("A3").Value = wbReadBook.Worksheets("Sheet1").Range("A3") .Range("A4").Value = wbReadBook.Worksheets("Sheet1").Range("A4") .Range("A5").Value = wbReadBook.Worksheets("Sheet1").Range("A5") End With wbReadBook.Close (False)
Cells オブジェクトを使用するパターン
Dim wbReadBook As Object Set wbReadBook = Workbooks.Open("D:\Test\TestBook1.xlsx") With Workbooks("売掛金台帳").Worksheets("Sheet1") .Cells(1,"A") = wbReadBook.Worksheets("Sheet1").Cells(1,"A") .Cells(2,"A") = wbReadBook.Worksheets("Sheet1").Cells(2,"A") .Cells(3,"A") = wbReadBook.Worksheets("Sheet1").Cells(3,"A") .Cells(4,"A") = wbReadBook.Worksheets("Sheet1").Cells(4,"A") .Cells(5,"A") = wbReadBook.Worksheets("Sheet1").Cells(5,"A") End With wbReadBook.Close (False)