Microsoft 365のExcelでは、OneDriveやSharePointに保存されたファイルに対して「自動保存」が標準でオンになっています。これは共同編集や不意のシャットダウンに非常に便利な機能ですが、VBAマクロで大量のデータを処理する際には、一つ一つの変更が即座に保存されてしまい、処理速度の低下や不要なバージョン履歴の生成につながることがあります。
この記事では、マクロ実行中にブックの自動保存を一時的にオフにし、処理が終わったら元の状態に戻すという、安全で推奨される方法を解説します。
.AutoSaveOn プロパティとは?
.AutoSaveOn
は、Workbook
オブジェクトが持つプロパティで、ブックの自動保存が現在有効(True
)か無効(False
)かを示します。
このプロパティは、OneDriveまたはSharePoint上に保存されているブックでのみ有効です。ローカルに保存されているファイルに対して操作しようとするとエラーになるため、注意が必要です。
このプロパティの値をVBAで変更することで、自動保存をプログラムで制御できます。
完成したVBAコード(推奨パターン)
マクロの実行中だけ自動保存をオフにし、マクロ終了時に元の設定に戻すのが、ユーザーの設定を尊重する安全な方法です。
Sub ProcessDataWithAutoSaveControl()
Dim targetBook As Workbook
Dim wasAutoSaveOn As Boolean
' 現在アクティブなブックを操作対象に設定
Set targetBook = ActiveWorkbook
' --- 1. 自動保存が利用可能なブックか確認 ---
' (ローカルファイルなどでエラーになるのを防ぐ)
On Error Resume Next
wasAutoSaveOn = targetBook.AutoSaveOn
If Err.Number <> 0 Then
' このブックは自動保存の対象外なので、以降の処理は不要
Else
' --- 2. 自動保存の元の状態を記憶し、一時的にオフにする ---
If wasAutoSaveOn = True Then
targetBook.AutoSaveOn = False
Debug.Print "自動保存を一時的にオフにしました。"
End If
End If
On Error GoTo 0
' ======================================================
' === ここに、時間のかかる本来のメイン処理を記述 ===
' (例: 大量のデータを書き換える、複雑な計算を行うなど)
Application.StatusBar = "重い処理を実行中..."
Application.Wait Now + TimeValue("00:00:03") ' 処理のダミー
Application.StatusBar = False
' ======================================================
' --- 3. 自動保存の状態を元に戻す ---
' マクロ実行前に自動保存がオンだった場合のみ、オンに戻す
If wasAutoSaveOn = True Then
targetBook.AutoSaveOn = True
Debug.Print "自動保存を元の「オン」の状態に戻しました。"
End If
MsgBox "処理が完了しました。"
End Sub
コードのポイント解説
① 事前の状態確認と条件
On Error Resume Next
wasAutoSaveOn = targetBook.AutoSaveOn
If Err.Number <> 0 Then
' ...
End If
On Error GoTo 0
ローカルに保存されたファイル(自動保存の対象外)で.AutoSaveOn
プロパティを操作しようとするとエラーが発生します。On Error Resume Next
を使うことで、このエラーを無視して処理を続行させ、エラーが発生しなかった(=自動保存が利用可能な)場合のみ、後続の処理に進むようにしています。
② 状態の記憶と一時的なOFF
wasAutoSaveOn = targetBook.AutoSaveOn
' ...
If wasAutoSaveOn = True Then
targetBook.AutoSaveOn = False
End If
このコードの最も重要な部分です。まず、wasAutoSaveOn
という変数に、マクロ実行前の自動保存のオン/オフ状態(True
かFalse
)を記憶させます。その後、もしオンであったなら、targetBook.AutoSaveOn = False
で一時的にオフに切り替えます。
③ 状態の復元
If wasAutoSaveOn = True Then
targetBook.AutoSaveOn = True
End If
メインの処理がすべて完了した後、①で記憶しておいた元の状態wasAutoSaveOn
を基に、自動保存の設定を復元します。
wasAutoSaveOn
がTrue
だった(=元々オンだった)場合のみ、自動保存をオンに戻します。これにより、ユーザーが元々オフにしていた設定を、マクロが勝手にオンにしてしまうのを防ぐことができます。
まとめ
VBAマクロで自動保存を安全に制御するための推奨パターンは、以下の通りです。
- 処理の開始前に、ブックの
.AutoSaveOn
の現在の状態を変数に記憶しておく。 - もし自動保存がオンなら、一時的にオフ (
.AutoSaveOn = False
) にする。 - 目的のメイン処理を実行する。
- 処理の最後に、記憶しておいた変数を基に、自動保存の状態を元の設定に復元する。
この手順を踏むことで、マクロのパフォーマンスを確保しつつ、ユーザーの元の設定を尊重する、親切で安定したツールを作成することができます。