【ExcelVBA】高速化メモ
移行手順書オールインワンでVBAスクリプトを作りこむになった。
難で今更VBA・・・と愚痴りたいが、まあExcelは相当優秀なツールだし
Win32APIも使えて、あくまで.NETの先がけだけどフォームも作れる。
しばらくのエントリはこいつとの付き合いになろう。
まず、ExcelVBAの高速化についてのテクをめもる。
Application.ScreenUpdating = false
Application.ScreenUpdating = trueに戻すまで、画面を再描画しない。
随所で紹介されているプロパティだが、実はこれ、効果が非常に限定的。
(可視部分では効果大だが、それ以外のとこの更新では意味がないように感じる)
もっと基本的なところで最適化すべきだ。
シートのI/O回数を減らす
基本。特にWriteは再計算を伴う。Readも計算結果を待ったりするのでバカにならない。
[回避テク]CreateObject("Scripting.Dictionary")を使ってみる
ScriptingDictionaryはハッシュマップ。連想配列。
デフォの変数に比べると数段遅いが、それでもデータシートを読むよりも十数倍速い。
プロパティシートから値を一括で読み取って、シート各セルのReadを各1回で済ませる実装につかった。(可読性もあがるし一石二鳥。)
Dim properties
Set properties = CreateObject("Scriptiong.Dictionary")
Dim propSheet As Worksheet
set propSheet = Worksheets("properties")
Dim rowEnd = propSheet.Cells(propSheet.Rows, 1).End(xlTop)
For i = 1 to rowEnd
Dim key As String, val As String
key = propSheet.Cells(i, 1).Value2
val = propSheet.Cells(i, 2).Value2
properties.Add key, val
Next
Variable型を避ける
型指定しないで変数使うと「Variable」型という超処理が重い型になる。
(かわりに型エラーにならないしダックタイプ的にメンバを呼び出せる。)
明示的に指定できる場合はできるだけ指定する。