Excel を使っていると、いつのまにか異様に重くなっていることがある。1 個所編集して確定すると 1〜2 秒の待ちが発生したりする。イライラ発生器としては抜群の性能だ。
VBA や COM 経由で編集している場合も同様で、編集する内容や個数の割に、時間がかかってしまう。処理速度が本来の 1/5 とか 1/10 とかになってしまうこともある。
こういう場合の原因としては、いくつかあるようだが、僕が気付いているのを挙げると、
- シートに載っているデータが多い
- 使用しているセル範囲が広すぎる (見た目のデータ有無だけでなく、編集途中の内容がすごーく右下のセルに残っていたりする)。シェイプが多すぎる (パッと見でないように見えても、いろいろ編集していると、高さ 0 のシェイプがセル境界に乗っていたりするので要注意)。
- 数式の再計算が行われている
- 数式を使っている個所が多い。複雑な数式が使われている。
- 印刷範囲の再計算が行われている
- 印刷範囲が設定されている。改ページプレビューが使用されている。
解決策というか、回避策としては、
- シートに載っているデータが多い
- 使用しているセル範囲を事前に確認する (Ctrl+End で右下に移動できる。VBA で確認するなら Worksheet#UsedRange.Address プロパティ)。シェイプの利用状況を事前に確認する (Worksheet#Shapes コレクション)。
- 数式の再計算が行われている
- 編集中は再計算を「手動」にする (Application.Calculation プロパティに xlCalculationManual をセット)。
- 印刷範囲の再計算が行われている
- 編集中は印刷範囲をリセットする (Worksheet#PageSetup.PrintArea プロパティに空文字列をセット)。編集中は改ページプレビューを解除する (Application.ActiveWindow.View プロパティに xlNormalView をセット)。
ってところか。あと、VBA の場合に限り、編集中のみ Application.ScreenUpdating プロパティに False をセットすることで、画面再描画を抑止するというのも有名なところだ。ただし、COM 経由で編集していて、Excel をそもそも表示していない場合は、ScreenUpdating をいじっても速度は変わらない (当たり前か)。
上記の回避策のうち、編集中に値を変更するものは、編集完了後に値を戻す必要がある。あと、「印刷範囲」「改ページプレビュー」については、これをいじることで設定が崩れるケースもあるみたいなので、もうちょっと検証が必要かな。