皆さん、こんにちは!Excel VBAのベテラン講師として、今日も皆さんのExcelスキルアップのお手伝いをさせていただきます。
さて、今回は「ファイルを自動保存するマクロ」という、非常に実用的で、かつ多くの方が「こんな機能があったらいいな」と思っているテーマに挑戦します。日々の業務でExcelを使っていると、うっかり保存し忘れて作業内容が消えてしまったり、PCが予期せずシャットダウンしてしまったり…そんな経験はありませんか?私自身も、長年Excelと格闘してきた中で、何度か冷や汗をかいた経験があります。
この連載では、そんな悲劇を防ぐための「自動保存マクロ」を、基礎から応用まで段階的に、そして丁寧に解説していきます。全4回にわたって、皆さんが自信を持ってこのマクロを使いこなせるようになることを目指します。
### なぜ自動保存が必要なのか?
まずは、なぜ自動保存が重要なのかを改めて確認しておきましょう。
1. **データ消失のリスク軽減:**
* **人的ミス:** 忙しい時や集中している時、つい「保存」ボタンを押し忘れてしまうことがあります。
. **PCの予期せぬトラブル:** 電源断、フリーズ、OSのクラッシュなど、PC側の問題でデータが失われる可能性は常に存在します。
* **停電:** 特にデスクトップPCの場合、停電は即座にデータ消失に繋がります。
2. **作業効率の向上:**
* 「保存しなきゃ」という意識が軽減され、本来の作業に集中できます。
* 自動保存の間隔を短く設定すれば、万が一の際にも失われる作業量が最小限に抑えられます。
3. **安心感:**
* 「万が一」に備えているという安心感は、精神的な余裕を生み、よりクリエイティブな作業に集中させてくれます。
Excelには標準で「自動保存」機能がありますが、これは「指定した時間間隔で、開いているブックの変更内容を一時ファイルとして保存する」機能であり、最終的にユーザーが「保存」操作をしない限り、元のファイルには反映されません。また、保存先や保存形式などを細かく制御することもできません。
VBAで自動保存マクロを作成することで、これらの標準機能では実現できない、より柔軟で強力な自動保存を実現できるのです。例えば、
* 特定のファイル名で、指定したフォルダに定期的に保存する。
* 保存する際に、ファイル名に日付や時刻を追加してバージョン管理する。
* 特定の条件を満たした場合のみ保存する。
* 保存が完了したことを、メッセージボックスなどで通知する。
など、様々なカスタマイズが可能になります。
### 今回の目標:基本的な自動保存マクロの作成
この連載の初回となる今回は、最も基本的な「指定した時間間隔で、現在開いているブックを上書き保存する」マクロの作成を目指します。まずはこの基本形を理解することが、今後の応用への足がかりとなります。
### VBAの準備
自動保存マクロを記述するには、VBAエディターが必要です。
1. Excelを開き、「開発」タブを表示します。もし「開発」タブが表示されていない場合は、Excelのオプション設定から有効にしてください。([ファイル] > [オプション] > [リボンのユーザー設定] で、「開発」にチェックを入れます。)
2. 「開発」タブの「Visual Basic」ボタンをクリックするか、`Alt + F11` キーを押してVBAエディターを開きます。
3. VBAエディターのメニューから `挿入` > `標準モジュール` を選択し、新しいモジュールを作成します。ここにマクロコードを記述していきます。
### 自動保存の仕組みを考える
自動保存を実現するためには、主に以下の2つの要素が必要になります。
1. **定期的に処理を実行する仕組み:** 一定時間ごとにマクロの処理を呼び出す必要があります。VBAには、これを実現するための「タイマー機能」のようなものが直接用意されているわけではありませんが、`Application.OnTime` メソッドという非常に便利な機能があります。これは、「指定した日時に、指定したプロシージャ(マクロ)を実行する」というものです。これを利用して、繰り返し処理を実現します。
2. **ブックを保存する処理:** 現在アクティブなブック、あるいは特定のブックを保存するVBAコードが必要です。これは `ActiveWorkbook.Save` や `ThisWorkbook.Save` といったメソッドで実現できます。
### `Application.OnTime` メソッドとは?
`Application.OnTime` メソッドは、VBAで定期的な処理を実行するための鍵となる機能です。その構文は以下のようになります。
Application.OnTime EarliestTime, Procedure, [LatestTime], [Schedule]
* `EarliestTime`: 処理を実行したい最も早い日時を指定します。`Now()` 関数(現在日時)に時間を加算することで、未来の日時を指定できます。
* `Procedure`: 実行したいプロシージャ(マクロ名)を指定します。プロシージャ名は文字列として指定します。
* `LatestTime` (省略可能): 処理を実行できる最も遅い日時を指定します。この時間を過ぎると、処理は実行されません。
* `Schedule` (省略可能): `True` を指定すると、指定した日時に `Procedure` を実行するようにスケジュールします。省略した場合や `False` を指定した場合は、スケジュールされている処理をキャンセルします。
### 初めての自動保存マクロコード
では、これらの知識を元に、まずは「5分ごとに現在開いているブックを上書き保存する」マクロを作成してみましょう。
まず、自動保存を実行するメインのプロシージャ(例: `AutoSaveWorkbook`)と、その処理をスケジュールするためのプロシージャ(例: `StartAutoSave`)、そしてスケジュールを解除するためのプロシージャ(例: `StopAutoSave`)の3つを作成するのが一般的です。
‘=================================================================
‘ モジュール名: AutoSaveModule
‘ 機能: Excelブックの自動保存機能を提供する
‘=================================================================
Option Explicit
‘ 自動保存の間隔 (分単位)
Const SAVE_INTERVAL_MINUTES As Double = 5
‘ 次回の保存日時を保持する変数
Public NextSaveTime As Date
‘=================================================================
‘ ■ 自動保存を開始するプロシージャ
‘=================================================================
Sub StartAutoSave()
‘ — 処理開始のメッセージ —
Debug.Print “自動保存を開始します。間隔: ” & SAVE_INTERVAL_MINUTES & “分”
‘ — 次回の保存日時を計算 —
‘ 現在時刻に指定した間隔を加算
NextSaveTime = Now + TimeSerial(0, SAVE_INTERVAL_MINUTES, 0)
‘ — Application.OnTime を使用して、次回の保存処理をスケジュール —
‘ EarliestTime: NextSaveTime (計算した次回の保存日時)
‘ Procedure: “AutoSaveWorkbook” (実行したいマクロ名)
‘ Schedule: True (実行をスケジュールする)
Application.OnTime EarliestTime:=NextSaveTime, Procedure:=”AutoSaveWorkbook”, Schedule:=True
‘ — ユーザーへの通知 (任意) —
‘MsgBox “自動保存を開始しました。(” & SAVE_INTERVAL_MINUTES & “分間隔)”, vbInformation
End Sub
‘=================================================================
‘ ■ 実際にブックを保存するプロシージャ
‘=================================================================
Sub AutoSaveWorkbook()
‘ — 保存対象のブックを確認 —
‘ 現在アクティブなブックを保存対象とする
Dim wb As Workbook
Set wb = ActiveWorkbook
‘ — 保存可能かどうかのチェック —
‘ ブックが開かれており、かつ保存されていない変更があるか?
‘ (※今回は簡易的に、常に保存を試みます。次回以降で条件分岐を検討します。)
‘ — 保存処理 —
On Error Resume Next ‘ エラーが発生しても処理を続行する
wb.Save ‘ 現在のブックを上書き保存
On Error GoTo 0 ‘ エラーハンドリングを元に戻す
‘ — 保存成功/失敗の確認 (簡易) —
If Err.Number = 0 Then
Debug.Print Now & ” – ブックを保存しました: ” & wb.Name
Else
Debug.Print Now & ” – ブックの保存中にエラーが発生しました: ” & Err.Description
‘ エラー発生時は、次のスケジュールを中止するなどの処理も検討できます。
‘ StopAutoSave ‘ エラー発生時に自動保存を停止する場合
End If
‘ — 次回の保存処理を再度スケジュール —
‘ 現在時刻に指定した間隔を加算
NextSaveTime = Now + TimeSerial(0, SAVE_INTERVAL_MINUTES, 0)
‘ — Application.OnTime を使用して、次回の保存処理をスケジュール —
Application.OnTime EarliestTime:=NextSaveTime, Procedure:=”AutoSaveWorkbook”, Schedule:=True
‘ — ユーザーへの通知 (任意) —
‘MsgBox Now & ” – 自動保存が完了しました。”, vbInformation
End Sub
‘=================================================================
‘ ■ 自動保存を停止するプロシージャ
‘=================================================================
Sub StopAutoSave()
‘ — Application.OnTime を使用して、スケジュールされた処理をキャンセル —
‘ EarliestTime: NextSaveTime (キャンセルしたい処理の時間)
‘ Procedure: “AutoSaveWorkbook” (キャンセルしたいマクロ名)
‘ Schedule: False (実行をキャンセルする)
On Error Resume Next ‘ スケジュールされていない場合にエラーになるのを防ぐ
Application.OnTime EarliestTime:=NextSaveTime, Procedure:=”AutoSaveWorkbook”, Schedule:=False
On Error GoTo 0 ‘ エラーハンドリングを元に戻す
‘ — 処理終了のメッセージ —
Debug.Print “自動保存を停止しました。”
‘ — ユーザーへの通知 (任意) —
‘MsgBox “自動保存を停止しました。”, vbInformation
End Sub
### コードの解説
* **`Option Explicit`**: これは非常に重要な宣言です。モジュール内の全ての変数を宣言することを強制します。これにより、タイプミスによる意図しない変数の生成を防ぎ、コードの堅牢性を高めます。必ずモジュールの先頭に記述するように習慣づけましょう。
* **`Const SAVE_INTERVAL_MINUTES As Double = 5`**: 自動保存の間隔を定数として定義しています。`5` と設定しているので、5分ごとに保存されます。`Double` 型にしているのは、`TimeSerial` 関数などで計算した結果が小数を含む可能性があるためです。
* **`Public NextSaveTime As Date`**: 次に保存を実行する日時を保持するためのグローバル変数です。`Public` とすることで、他のプロシージャからも参照できるようにしています。
* **`StartAutoSave` プロシージャ**:
* `Debug.Print`: VBAエディターの「イミディエイトウィンドウ」(`Ctrl + G` で表示)にメッセージを出力します。デバッグ時に非常に役立ちます。
* `NextSaveTime = Now + TimeSerial(0, SAVE_INTERVAL_MINUTES, 0)`: 現在時刻 (`Now()`) に、指定した保存間隔 (`SAVE_INTERVAL_MINUTES`) を加算して、次回の保存日時を計算しています。`TimeSerial(時, 分, 秒)` は、指定した時間を作成する関数です。ここでは `0`時 `SAVE_INTERVAL_MINUTES` 分 `0`秒 を加算しています。
* `Application.OnTime EarliestTime:=NextSaveTime, Procedure:=”AutoSaveWorkbook”, Schedule:=True`: ここで、指定した日時 (`NextSaveTime`) に `AutoSaveWorkbook` マクロを実行するようにスケジュールしています。
* **`AutoSaveWorkbook` プロシージャ**:
* `Dim wb As Workbook` と `Set wb = ActiveWorkbook`: 現在アクティブなブックを取得します。
* `On Error Resume Next` / `On Error GoTo 0`: 保存処理中にエラーが発生した場合(例: ブックが保護されている、保存先のフォルダが存在しないなど)でも、マクロが停止せずに処理を続行するためのエラーハンドリングです。エラーが発生したかどうかは、後述の `Err.Number` で確認できます。
* `wb.Save`: アクティブなブックを上書き保存します。
* `If Err.Number = 0 Then … Else … End If`: 保存処理後に `Err.Number` をチェックしています。`0` であればエラーは発生しておらず、保存は成功したとみなせます。そうでなければエラーが発生したことになります。
* **重要な点**: `AutoSaveWorkbook` プロシージャの最後で、再度 `Application.OnTime` を使って次の保存処理をスケジュールしています。これにより、一度実行された後も、継続的に(指定した間隔で)保存処理が繰り返されるようになります。
* **`StopAutoSave` プロシージャ**:
* `Application.OnTime EarliestTime:=NextSaveTime, Procedure:=”AutoSaveWorkbook”, Schedule:=False`: スケジュールされていた `AutoSaveWorkbook` の実行をキャンセルします。`Schedule:=False` がキャンセルを指定する部分です。
* `On Error Resume Next` を入れているのは、もし何らかの理由で `NextSaveTime` が既に過ぎていたり、あるいは `StartAutoSave` が実行されていなかったりして、スケジュール自体が存在しない場合に、エラーでマクロが停止してしまうのを防ぐためです。
### マクロの実行方法
1. 上記のコードをVBAエディターの標準モジュールに貼り付けます。
2. Excelシートに戻り、`Alt + F8` キーを押して「マクロ」ダイアログを表示します。
3. `StartAutoSave` を選択して「実行」ボタンをクリックします。
4. これで、5分ごとにアクティブなブックが自動的に上書き保存されるようになります。
5. 自動保存を停止したい場合は、再度 `Alt + F8` でマクロダイアログを表示し、`StopAutoSave` を選択して実行します。
### 確認方法
* VBAエディターを開き、`Ctrl + G` でイミディエイトウィンドウを表示しておくと、保存の実行状況やエラーメッセージがリアルタイムで確認できて便利です。
* Excelのステータスバーに表示される「準備完了」の文字が、保存のタイミングで一瞬消えてまた表示されることでも確認できます。
* 実際に5分待って、Excelファイルを保存し直してみると、変更が反映されていることがわかります。
### 注意点と今後の課題
* **保存頻度:** `SAVE_INTERVAL_MINUTES` の値を小さくしすぎると、頻繁な保存処理がPCに負荷をかけたり、作業の邪魔になったりする可能性があります。ご自身のPC環境や作業内容に合わせて調整してください。
* **未保存のブック:** このマクロは、まだ一度も保存されていないブック(ファイル名が「Book1」など)に対しても `Save` を実行しようとします。これは通常、保存ダイアログが表示され、ユーザーの操作を待ってしまうため、自動保存の意図に反します。次回以降で、この問題を解決する方法を解説します。
* **エラーハンドリング:** 現在のエラーハンドリングは非常に簡易的です。保存先のフォルダが存在しない、ファイルが読み取り専用になっている、ブックがパスワードで保護されているなど、様々なエラーケースが考えられます。これらのエラーに適切に対処する方法も、今後の連載で触れていきます。
* **保存先とファイル名:** 現在はアクティブなブックを「上書き保存」するだけです。次回以降では、指定したフォルダに、日付や時刻を付加した新しいファイル名で保存する方法などを解説します。
* **ブックを閉じる際の処理:** マクロで自動保存を開始した場合、Excelを閉じようとした際に「保存しますか?」というメッセージが表示されることがあります。これは、VBAでスケジュールされた `OnTime` の処理がまだ完了していない(次の保存時間が来ていない)ためです。この挙動についても、次回以降で改善策を検討します。
### まとめ
今回は、Excel VBAを使った自動保存マクロの第一歩として、`Application.OnTime` メソッドを使った基本的な上書き保存の仕組みを学びました。
* `Application.OnTime` を使って、指定した日時にマクロを実行する。
* `TimeSerial` 関数で時間を加算して、次回の実行日時を計算する。
* `StartAutoSave`, `AutoSaveWorkbook`, `StopAutoSave` の3つのプロシージャで処理を管理する。
いかがでしたでしょうか? これで、あなたのExcel作業に「安心」という強力な味方が加わりました。
次回、第17回 ファイルを自動保存するマクロに挑戦 2/4 では、今回触れた「未保存のブックへの対応」や「保存先フォルダの指定」、「ファイル名への日付・時刻の追加」といった、より実用的な機能を追加していきます。
どうぞお楽しみに!
