数式が大量に含まれる重いExcelファイルでは、動作を軽快にするために計算方法を「手動」に設定することがよくあります。しかし、この設定には「再計算(F9キー)を忘れて、古いデータのまま上書き保存してしまう」という大きなリスクが伴います。
VBAを使えば、このヒューマンエラーを防ぎ、手動計算モードの快適さと、データの正確性を両立させることが可能です。この記事では、ブックのCalculateBeforeSave
プロパティを使い、安全な運用を実現する方法を解説します。
手動計算モードの課題
まず、VBAで計算方法を手動に切り替えるのは簡単です。 Application.Calculation = xlCalculationManual
これにより、セルに値を入力するたびに発生していた再計算が抑制され、ブックの動作が非常にスムーズになります。しかし、前述の通り、最後にF9
キーなどで再計算をしないまま保存すると、計算結果が更新されていない古いデータがファイルに残ってしまいます。
解決策: .CalculateBeforeSave プロパティ
この課題を解決するのが、Workbook
オブジェクトが持つ.CalculateBeforeSave
というプロパティです。これは、そのブックの「保存前に再計算を行うかどうか」を設定するTrue
/False
のフラグです。
myBook.CalculateBeforeSave = True
: 保存する直前に、Excelがこのブックの完全な再計算を自動的に実行します。myBook.CalculateBeforeSave = False
(既定値): 保存時にも再計算は行われず、表示されているデータのまま保存されます。
このプロパティをTrue
に設定しておくことで、ユーザーが再計算を忘れても、Excelが最後の砦として計算を実行してくれるため、常に正しい値が保存されるようになります。
完成したVBAコード
この設定は、ブックを開いたときに自動で適用されるのが最も効果的です。そのため、以下のコードは**ThisWorkbook
モジュール**のWorkbook_Open
イベントに記述します。
' ThisWorkbookモジュールに記述します
Private Sub Workbook_Open()
' アプリケーション全体の計算方法を手動に設定
' これにより、データ入力中の再計算が抑制され、動作が軽快になる
Application.Calculation = xlCalculationManual
' このブックの「保存前に計算」オプションをオンにする
' これにより、手動計算モードでも、保存時には必ず最新の計算結果が反映される
Me.CalculateBeforeSave = True
' 設定が完了したことをユーザーに通知(任意)
MsgBox "このブックは「手動計算モード」で開かれました。" & vbCrLf & _
"(保存する際には、自動的に再計算が実行されます)", vbInformation
End Sub
コードのポイント解説
① Workbook_Openイベントへの記述
このコードをThisWorkbook
モジュールのWorkbook_Open
イベント内に記述することで、ユーザーがこのファイルを開くたびに、自動的に計算モードが「手動」に、そして「保存前再計算」が「オン」に設定されます。これにより、設定のし忘れがなくなり、常に意図した動作を保証できます。
② Application.Calculation と ThisWorkbook.CalculateBeforeSave
Application.Calculation
は、Excelアプリケーション全体に影響するグローバルな設定です。Me.CalculateBeforeSave
(またはThisWorkbook.CalculateBeforeSave
)は、このブックにのみ影響するローカルな設定です。
この2つを組み合わせることで、「作業中はサクサク軽く、保存時だけは確実に計算する」という理想的な環境を、このブック限定で実現できます。
③ ユーザーへの通知
MsgBox
での通知は任意ですが、ユーザーが「入力しても計算結果が変わらない」と混乱するのを防ぐため、「このブックは手動計算モードですよ」と最初に伝えてあげるのは親切な設計と言えるでしょう。
まとめ
大規模なExcelブックを安全かつ快適に運用するための黄金の組み合わせは、以下の通りです。
Application.Calculation = xlCalculationManual
を設定して、編集中のパフォーマンスを向上させる。ThisWorkbook.CalculateBeforeSave = True
を設定して、計算忘れによるデータ不整合のリスクを排除する。
この2つの設定をWorkbook_Open
イベントに記述しておくことで、ヒューマンエラーに依存しない、堅牢なファイル運用が可能になります。