未分類

ワークシートへの参照を減らして、処理速度向上を試す (2)

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)

-未分類