VAブリッジにおけるSharePoint環境での保存警告回避策

コラム

VBAアセットが提供している「VAブリッジ」は、Excelを「ユーザーファイル(操作画面)」と「マスタファイル(データ保存用)」に分離し、簡易的なデータベースとして活用することで、複数ユーザーでの安全な同時利用を可能にするVBAアドインです。その活用方法の一つとして、SharePoint(またはOneDrive)上にユーザーファイルを置いて共有・運用することができます。

この場合、「対象ファイルの自動保存を強制的にOFFにし、終了時にローカルの変更データ(検索履歴や一時データ)を一切残さずに破棄して閉じる」という終了処理の制御が必要となります。

1. なぜ「保存せずに破棄する」運用が必要なのか?

VAブリッジを用いた運用では、システムを以下の2つに分割します。

  1. データの器(バックエンド/マスタファイル): 実際のデータが蓄積されるファイル(非表示のExcelやCSVなど)。
  2. システムの器(フロントエンド/ユーザーファイル): 弁護士や事務局が直接操作する画面用のExcelファイル。マクロを通じてデータの器から情報を取得・更新する。

この「システムの器」となるユーザーファイル自体は保存を行いません。これには以下の重要な目的があります。

  • 画面レイアウトの意図しない変更防止もし所員が各自のPCで行った一時的な操作(案件一覧のソートやフィルターの適用など)が自動保存されてしまうと、他の所員の画面レイアウトを勝手に変えてしまう恐れがあります。
  • 複数ユーザーアクセス時のファイル競合防止複数人で同時にアクセスしている際に各自の変更が自動保存されると、保存の衝突によるファイルの破損を招く恐れがあります。
  • セキュリティと守秘義務の徹底 法律事務所においては、外部からアクセスされるリスクのあるSharePoint上のユーザーファイル内に、検索履歴や事件に関する機密データを残したくありません。

そのため、「必要なデータの送受信はマクロで安全に制御しつつ、ファイル自体のローカルでの状態変化はサーバーへ保存せずに毎回破棄して綺麗に閉じる」という特殊な制御が必須となります。

2. 終了時に発生する2つの「問題」とその「原因」

単にVBAから Wb.Close SaveChanges:=False (保存せずに閉じる)を実行するだけでは、SharePoint環境ではスムーズに終了できません。以下のような問題に直面します。

問題1:共同編集セッション等の警告ダイアログが割り込む

  • 【事象】 対象のユーザーファイルに他の所員がアクセスしている場合、単にローカルで保存済みフラグ(Saved = True)を立てても、「最新のデータを保存しますか?」といった警告や、Excel標準の「保存しますか?」ダイアログが強制的に表示されてしまいます。
  • 【原因】 SharePoint環境ではバックグラウンドでクラウドとの同期処理(他ユーザーとのセッション維持など)が常に行われており、これがVBAの終了命令よりも優先して割り込んでくるためです。

問題2:警告を消そうとすると「外枠だけ残る」ゴースト状態になる

  • 【事象】 問題1の警告を非表示にするため、標準の閉じる処理を一旦キャンセル(Cancel = True)し、VBAから強制終了させるアプローチをとりました。しかし今度は、ファイル自体は閉じたのに「エクセル本体の外枠(アドインのプロセス)」だけが画面に残るという不具合が発生しました。
  • 【原因】 閉じる処理をキャンセルしたことで、ファイルだけでなく「エクセル本体(アプリケーション)を終了する」という本来の動作までストップしてしまったためです。裏で動いているアドインがプロセスとして残るため、完全に終了しきれなくなります。

3. 対策:ファイル数による「分岐処理」

これらの問題を同時に解決し、安全かつスムーズに終了させるための有効な解決策が、**「現在画面に見えているファイルが残り1つかどうかで、閉じるプロセスを完全に分ける」**ことです。

  1. 他にファイルが開いている場合(問題1の対策):標準の閉じる処理を一旦キャンセル(Cancel = True)し、アラートを強制的に消した状態で、VBAから対象のユーザーファイル単体を閉じます(Wb.Close)。その後、開いたままの他のファイルのために設定を元の状態に戻します。
  2. 最後の1つの場合(問題2の対策):エクセル本体の終了処理をストップさせないよう、キャンセル処理(Cancel = True)は行いません。アラートを消し、保存済みのフラグを立てた上で、アドインごと道連れにして直接 Application.Quit を実行します。

最終的な実装コード

以下が、VAブリッジにも実装されている最終コードです。アドイン側の、ユーザーファイルが閉じられた際に起動するイベント(Private Sub App_WorkbookBeforeClose)に記述します。

    ' --- 強制データ破棄(共同編集対応・外枠残り完全解消版) ---
    
    ' 1. 開いている画面(可視ワークブック)の数を数える
    Dim visibleWbCount As Long
    Dim loopWb As Workbook
    For Each loopWb In Application.Workbooks
        ' アドインや非表示ファイル以外で、ウィンドウが表示されているものをカウント
        If Not loopWb.IsAddin Then
            If loopWb.Windows.Count > 0 Then
                If loopWb.Windows(1).Visible Then
                    visibleWbCount = visibleWbCount + 1
                End If
            End If
        End If
    Next loopWb

    ' 2. 開いているファイル数に応じて「閉じる処理」を分岐
    If visibleWbCount <= 1 Then
        ' ==========================================================
        ' ▼最後の1つの場合:アドインを含めExcel本体ごと綺麗に終了させる
        ' ==========================================================
        ' ※標準の閉じる処理を Cancel = True で邪魔しない!
        
        ' 警告とイベントをオフにし、保存済みにする
        Application.EnableEvents = False
        Application.DisplayAlerts = False 
        Wb.Saved = True
        
        ' 裏で開いているアドインごと道連れにして、強制的にExcelを終了させる
        Application.Quit
        
        ' 【重要】Quitでそのまま終了するため、設定(DisplayAlerts等)はあえてTrueに戻しません。
        ' 戻してしまうと、終了の瞬間にSharePointの同期警告が復活する恐れがあります。
        
    Else
        ' ==========================================================
        ' ▼他に開いているファイルがある場合:このファイルだけを閉じる
        ' ==========================================================
        ' 標準の閉じる処理(+余計な警告)を一旦キャンセルする
        Cancel = True 
        
        Application.EnableEvents = False
        Application.DisplayAlerts = False 
        Wb.Saved = True 
        
        ' VBAから強制的に保存せずに閉じる
        Wb.Close SaveChanges:=False
        
        ' 【重要】Excelは起動し続けるため、他の作業に影響が出ないよう必ず元に戻す
        Application.DisplayAlerts = True
        Application.EnableEvents = True
    End If

コメント

タイトルとURLをコピーしました