Excel VBA でループ処理中にワークシートオブジェクトへの参照を何度も繰り返している箇所がある場合、その参照回数を減らすと、処理速度が向上するのではないかと考え、参照方法を検討しました。
前回は設定される側のワークブックが対象でしたが、今回は値を抽出される側のワークブックが対象です。
特にループ処理中に同じワークシートオブジェクトを何度も参照する場合、処理速度が低下すると考えました。そこで、ループ処理の前にワークシートオブジェクトを作成しておいてから使用するようにしました。
検証した結果ですが、200 個のワークブックをループ処理した場合、改善後は少しだけ (8% ほど) 速くなりました。劇的な速度向上ではありませんが、処理対象のワークブックが増えるほど効果がありますし、何より、同じ表現をコード中ですべきではありませんので、改善後の方法が良いと思います。
■ 参照処理ごとにワークブックとワークシートオブジェクトが参照されるパターン
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)
■ ワークシートオブジェクトを最初に一度作成しておくパターン
Dim wbReadBook As Object Set wbReadBook = Workbooks.Open("D:\Test\TestBook1.xlsx") Dim ThisSHEET As Worksheet Set ThisSHEET = wbReadBook.Worksheets("Sheet1") With Workbooks("売掛金台帳").Worksheets("Sheet1") .Range("A1").Value = ThisSHEET.Range("A1") .Range("A2").Value = ThisSHEET.Range("A2") .Range("A3").Value = ThisSHEET.Range("A3") .Range("A4").Value = ThisSHEET.Range("A4") .Range("A5").Value = ThisSHEET.Range("A5") End With wbReadBook.Close (False)