自動保存がアドインおよびマクロに与える影響について

Excel、PowerPoint、Word での自動保存のしくみと、アドインやマクロに与える影響について説明します。

自動保存の概要

ファイルがクラウド (OneDrive、OneDrive for Business、または SharePoint Online) でホストされている場合、自動保存を使用すると、ユーザーの編集内容を自動的かつ継続的に保存できます。 ファイルが他のユーザーと共有されると、その変更がこのユーザーのバージョンのファイルにマージされます。 自動保存がオフになっている場合は、ユーザーの変更をクラウドに保持し、このユーザーが他のユーザーの変更を受け取るために、保存を手動でトリガーする必要があります。

現在、Excel、Word、PowerPoint には BeforeSave イベントが用意されており、ユーザーが保存をトリガーした後、保存が行われる前にコードを実行できます。 Excel には、保存の完了後にマクロまたはアドイン コードを実行できる AfterSave イベントも用意されています。

自動保存が有効になっている場合、これらのイベントはユーザーの操作なしで定期的に自動的に発生します。 このため、これらのイベントを利用するアドインとマクロでは、AutoSave がオンの場合に問題が発生する可能性があります。

一般に、ユーザーが自動保存を無効にした場合、これらの問題は回避できます。 これは、WordExcelPowerPointAutoSaveOn プロパティが使用可能な場合は、ユーザーの代わりに使用できます (次の例を参照)。 また、自動保存が有効になっている場合でも、アドインとマクロがスムーズに動作するように、これらの問題を軽減するための開発者としての手順を実行することもできます。

次の使用例は、自動保存をオフにし、ブックが自動的に保存されていないことをユーザーに通知します。

Sub UseAutoSaveOn()
    ActiveWorkbook.AutoSaveOn = False
    MsgBox "This workbook is being saved automatically: " & ActiveWorkbook.AutoSaveOn
End Sub

保存イベントと自動保存に関する潜在的な問題

保存イベントと自動保存の相互作用に関して、次の 1 つ以上の問題を処理する必要がある場合があります。

  1. BeforeSave イベントまたは AfterSave イベントのコードの実行時間が長すぎます
  2. 保存イベントのコードによってモーダル ダイアログが表示される
  3. 保存イベントのコードによって元に戻すスタックがクリアされます (Excel のみ)
  4. AfterSave のコードがブックを汚す (Excel のみ)
  5. BeforeSave のコードは、ファイルの保存を取り消します (引数 Cancel を True に設定します)

問題 1: BeforeSave イベントまたは AfterSave イベントのコードの実行時間が長すぎる

一般に、アドインまたはマクロ コードの実行中、Word、Excel、PowerPoint はユーザーの操作に応答しません。 したがって、 BeforeSave または AfterSave イベント ハンドラーのコードの実行に時間がかかりすぎる場合は、ユーザー エクスペリエンスが大幅に低下する可能性があります。

自動保存が無効になっている場合、このコードはユーザーが明示的に保存を選択した場合にのみ実行されるため、遅延は目立たないため、保存する準備ができるまでユーザーが回避できます。

自動保存が有効になっている場合、このコードは定期的に自動的に実行されます。特にコードに時間がかかる場合は、ユーザーを中断する可能性があります。

シナリオ例

ユーザーが Excel ブック内のデータに基づいてカスタム マップを作成できるようにするアドインを想像してみてください。 このようなアドインには、ユーザーが作成したマップをシリアル化し、CustomXML パーツ内のブックに格納する BeforeSave コードが含まれている場合があります。 このプロセスが完了するまでに 1 秒かかる場合があり、この処理が行われている間、Excel が応答しなくなる可能性があります。

自動保存がオフの場合、ユーザーは保存するタイミングを選択します。そのため、アドインが保存プロセスをわずかに遅くしても、ユーザーは気付きません。

自動保存が有効になっている場合、この BeforeSave コードは、ユーザーが他の何か (セルへのデータの入力など) の途中にある場合でも、定期的に自動的に実行されます。これは非常に面倒な場合があります。

回避策

アドインは、保存イベント内で実行時間の長い操作を回避する必要があります。 この例では、開発者は、保存イベントを待機するのではなく、ユーザーが作成または変更するときに、カスタム マップをファイルに保持することを選択できます。

問題 2: 保存イベントのコードによってモーダル ダイアログが表示される

モーダル ダイアログなどの UI を表示する保存イベントで実行されるコードは、自動保存がオンのときにユーザー エクスペリエンスが深刻に低下する可能性があります。 BeforeSave イベントと AfterSave イベントは定期的に自動的に実行されるため、これらのダイアログ ボックスによってユーザーの通常のワークフローが中断される可能性があります。

シナリオ例

会社のブランドが適用されていることを確認するために保存する前に Word 文書を検証するアドインは、見つかった問題についてユーザーに警告し、修正する方法を提供するダイアログ ボックスを起動する可能性があります。 BeforeSave イベントが自動的かつ継続的に発生するようになったため、ユーザーが他の操作を行っている間に、この検証ダイアログが突然表示される可能性があります。

回避策

UI をアプリケーションの他の領域に表示する必要があるコードを削除することを検討してください。 たとえば、ユーザーは "検証" ボタンを選択して検証プロセスをトリガーしたり、ユーザーが既存のデータを変更しようとした場合にのみ検証コードを起動したりできます。

検証コードを新しいドキュメントからの最初の保存時にのみトリガーし、後続の自動保存ではトリガーしない場合は、BeforeSave または AfterSave の間に UI を表示する前に、Excel の Workbook.Path などのプロパティを調べることを検討してください。 Excel では、ブックに保存場所がまだない場合は、 Workbook.Path プロパティを空白にする必要があります。

問題 3: 保存イベントのコードによって元に戻すスタックがクリアされる (Excel のみ)

一般に、Excel で特定の VBA ステートメントを実行すると、元に戻すスタックがクリアされます。 たとえば、 を実行 ActiveCell.Value = "myValue"してセルの値を変更すると、元に戻すスタックがクリアされます。 このようなコードがマクロまたはアドインの BeforeSave イベントまたは AfterSave イベントに存在し、自動保存がオンになっている場合、そのマクロまたはアドインのユーザーは、通常のユーザー 操作を期待どおりに元に戻すことができません。

シナリオ例

アドインには、ドキュメントを検査し、ブック内の "ログ" テーブルに値を書き込む BeforeSave イベントに応答して実行されるコードが含まれている場合があります。 自動保存がオンの場合、元に戻すスタックが定期的にクリアされ、ユーザーに迷惑をかける可能性があります。

回避策

BeforeSave イベントまたは AfterSave イベントでブックに書き込むコードを削除することを検討してください。 たとえば、例のシナリオで説明されているアドインは、別のファイルまたはデータベースに変更ログを格納するように変更される場合があります。

問題 4: AfterSave のコードでブックが汚れている (Excel のみ)

自動保存がオンの場合、 BeforeSave イベントと AfterSave イベントは、前回トリガーされてからブックに変更があった場合にのみトリガーされます。 AfterSave イベントのコードがブックに汚れている (つまり、追加の変更を加える) 場合、イベントが同じ変更に対して再度発生し、イベントをキューに入れ、無期限に再び発生する可能性があります。 これにより、システム リソースが無駄になり、バッテリの寿命に影響を与える可能性があります。

回避策

AfterSave のブックを汚すコードは、BeforeSave または別の場所に完全に移動する必要があります (「問題 3」を参照)。 自動保存を使用しない場合でも、ブックが永続的な "ダーティ" 状態になり、ユーザーが変更を保存するように求めるプロンプトが近くに表示され、追加の変更が加えられていない場合でも、これは適切な方法ではありません。 

問題 5: BeforeSave のコードは、ファイルの保存を取り消します (引数 Cancel を True に設定します)

現在、 BeforeSave イベントの保存を取り消すには、 を True に設定 Cancel します。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Cancel = True
End Sub

自動保存が有効になっている場合、アプリケーション (Excel、Word、または PowerPoint) は、ファイルに保存されていない変更がなくなったまで、継続的に自動的に保存されます。 ユーザーがファイルを 1 回変更すると、アプリケーションはファイルの保存を試みます。

開発者が前に説明した方法で保存を取り消す場合、アプリケーションは保存されていない変更があることを継続的に判断し、保存が (最終的には) もう一度試行されます。 最初の保存を取り消したのと同じイベント コードもこの 2 回目の保存試行を取り消すので、ファイルが開いている限りプロセスは続行され、パフォーマンスとバッテリ寿命が低下する可能性があります。

シナリオ例

アドインは、既定の Word 保存コードを完全にオーバーライドして、ファイルがディスクまたは SharePoint の場所ではなく企業データベースに保存されるようにする場合があります。 このようなアドインは、別の場所に保存する前に、最初に試行された保存を取り消します。

回避策

このようなアドインでは、AutoSaveOn を False に設定することで、自動保存がオフになっていることを確認する必要があります。 自動保存を有効にするには、ファイルを OneDrive または SharePoint の場所に既に保存しておく必要があるため、このシナリオのほとんどのバージョンでは、自動保存は既にオフまたは無効になっている必要があります。

関連項目

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。