Document_Closeイベントで差込データソースとの接続を切断する

Document_Closeイベントの挙動

差し込み印刷の設定をしているドキュメントは、一旦閉じると、次回起動時に自動的に前回接続していたデータソースに接続しようとする。

これはこれで親切機能なのだが、何も知らない人が差し込み設定をしたドキュメントを別のフォルダに移動したりした日には大パニックが起こること必定であるw

また、差し込み設定のことがよく分かっている人間でも、たとえば前年度のものを使い回すのにフォルダごと移動したようなとき、その都度差し込み設定をやり直すのはちょいメンドクサイ。

そんなこともあって、

akashi-keirin.hatenablog.com

こういうのを作ったわけだが、実はコレも不十分だった。

Openイベントで一旦接続を切るようにしたとしても、Openイベントが発生する前にデータソースを探しに行っているっぽいので、全然解決になっていないことに気づいたのだ。

これはやはりCloseイベントで対応しないといけないと分かった。

ドキュメントClose時にデータソースを切断するイベントマクロ

細かい説明は後にして、とりあえずの完成形を示す。

リスト1 ThisDocumentモジュール
Private Sub Document_Close()
  Dim Doc As Document
  Set Doc = ThisDocument
  With Doc
    If .Saved Then    '……(1)'
      Call disconnectMailMergeDataSource(Doc)    '……(2)'
      .Save    '……(3)'
    Else
      Call disconnectMailMergeDataSource(Doc)    '……(4)'
    End If
  End With
End Sub

まず、(1)からの6行

If .Saved Then
  Call disconnectMailMergeDataSource(Doc)    '……(2)'
  .Save    '……(3)'
Else
  Call disconnectMailMergeDataSource(Doc)    '……(4)'
End If

では、ドキュメントのSavedプロパティによって条件分岐している。

SavedプロパティがTrue、すなわち既に上書き保存された状態であれば、(2)の

Call disconnectMailMergeDataSource(Doc)

で、まずdisconnectMailMergeDataSourceメソッドを呼んで接続をぶった切る。

ちなみに、disconnectMailMergeDataSourceメソッドのコードはコチラ

で、(3)の

.Save

で再度上書き保存をする。ドキュメントClose時点で上書き保存済みであり、その後の変更はデータソースの切断だけなので、再度上書き保存してもユーザーに不利益は生じないはず。これでデータソースが切断された状態で保存されているはずだ。

で、SavedプロパティがFalseのとき、すなわち上書き保存せずにドキュメントCloseしようとしたときにも(4)の

Call disconnectMailMergeDataSource(Doc)

でデータソースをぶった切っている。

なぜこんなことが必要なのか。

次の画像を見てほしい。

f:id:akashi_keirin:20180406175657j:plain

SavedプロパティがFalseの状態、すなわち変更を保存していない状態でドキュメントを閉じようとしてみる。

f:id:akashi_keirin:20180406175757j:plain

f:id:akashi_keirin:20180406175807j:plain

f:id:akashi_keirin:20180406175822j:plain

f:id:akashi_keirin:20180406175830j:plain

上書き保存をせずに(すなわちSavedプロパティがFalseの状態で)Document_Closeイベントが発生すると、このような順でプロシージャが実行され、そのあとで

f:id:akashi_keirin:20180406175839j:plain

コイツが出てくるのだ。

つまり、もしCloseイベントの中でデータソースをぶった切っておかないと、上書き保存確認ダイアログで[保存]を選んだ場合にデータソースに接続された状態で保存されてしまうわけ。

おわりに

これで少なくともWord2013では「常に差込データソースを切断した状態に保つ」ことができるようになった。

ただ、職場のWord2010だと、Closeイベント内で 切断→上書き保存 をしても、接続状態なんだよなあ……。

@akashi_keirin on Twitter