MatsuoTech

技術メモとひとりごと。

Web系やJavaをやってきた人がExcelマクロやってみての知見(高速、安定化について)

高速、安定化するためのコツ

  • 関数計算を手動、画面の表示更新をオフにする。
    マクロのファイルを保存したりする場合はデフォルト値に戻すことを忘れない。
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
  • Rangeはオブジェクトとしてメモリ上に保持されることを意識する。
    たとえば、以下のようにループしてRange取って挿入、という風にするとループn回分のRangeが作成される(※)ためメモリが不足しマクロが止まる可能性がある。
For i = 1 To n
   Range("A" & i").Insert
Next

※Rangeをたくさん作ると、この画像のように範囲指定がたくさんワークシート上に作られるイメージ。

  • Rangeを使用せず、Cellsを用いて値を設定する。
    上記と同等の理由。

  • ポインタの動きを減らす ↓のこいつがあっち行ってこっち行って…となると、遅い。
    そのため、よく使われるのがRange = 配列という代入方法。以下のような感じ。

Dim values() As String
ReDim values(7, 5)
~ 略 ~
Range("A1:B7") = values

イメージとしては、この範囲を二次元の配列として捉えて、値を設定する感じ。
ちょっとメモリ管理っぽくて面白い。

次はVBAの言語仕様についてのイライラを書く、と思う。