読者です 読者をやめる 読者になる 読者になる

【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」型という超処理が重い型になる。

(かわりに型エラーにならないしダックタイプ的にメンバを呼び出せる。)

明示的に指定できる場合はできるだけ指定する。