Visio VBAの「クリーンな終了処理」を極める:破壊的な自動化を支えるメモリ解放の作法
業務自動化において、Visioは最も「扱いが難しい」アプリケーションの一つだ。不必要に生成されるメモリリーク、バックグラウンドで残存するゾンビプロセス、そしてユーザーの作業を阻害する「保存確認ダイアログ」。これらを制御下に置けないエンジニアは、真の意味でVisioを自動化できているとは言えない。
今回は、図面からシェイプ情報を抽出し、「ファイルを保存せず、一切の警告を出さずに閉じる」という、実務で最も要求されながらもハマりやすい「クリーンな終了処理」の極意を伝授する。
—
1. なぜ「保存確認ダイアログ」が自動化の敵なのか
自動化の目的は、人間の介入をゼロにすることだ。`Document.Close` メソッドを安易に呼び出すと、Visioは「変更が加えられた(=シェイプ情報を読み取る過程でさえも)」と判断し、容赦なく保存確認ダイアログを表示する。
これを力技で `Application.DisplayAlerts = False` として黙らせる手法は、あくまで対症療法に過ぎない。真のエンジニアは、「保存済みフラグ(Saved)」をプログラム側で操作し、Visioを「変更などなかった」と信じ込ませるという洗練されたアプローチをとる。
—
2. 堅牢な抽出とクリーン終了のプロダクションコード
以下のコードは、シェイプの情報をCSVへ吐き出し、一切の痕跡を残さずにファイルを閉じるためのテンプレートだ。エラーハンドリングとオブジェクトの解放を徹底している。
Option Explicit
”’
”’
Public Sub ExportShapeDataAndCloseSilently()
Dim doc As Visio.Document
Dim shp As Visio.Shape
Dim fileNum As Integer
Dim csvPath As String
csvPath = “C:\Temp\ShapeData.csv”
Set doc = ActiveDocument ‘ あるいは Documents.Open(“FilePath”)
On Error GoTo ErrorHandler
‘ 1. ファイル番号を取得して書き込み開始
fileNum = FreeFile
Open csvPath For Output As #fileNum
Print #fileNum, “ShapeName,ID,Text”
‘ 2. シェイプ情報の抽出(読み取り専用のつもりでもVisioは変更とみなすことがある)
For Each shp In doc.Pages(1).Shapes
Print #fileNum, shp.Name & “,” & shp.ID & “,” & Replace(shp.Text, vbCr, “”)
Next shp
Close #fileNum
‘ 3. 【重要】保存済みフラグを強制的にTrueにする
‘ これにより、Closeメソッドは変更がないと判断し、警告を出さない
doc.Saved = True
‘ 4. クリーンに終了
doc.Close
Set doc = Nothing
MsgBox “抽出完了:ファイルはクリーンに閉じられました。”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
If fileNum > 0 Then Close #fileNum
If Not doc Is Nothing Then doc.Close
End Sub
—
3. アーキテクトの知見:なぜこの設計が「最強」なのか
① `doc.Saved = True` の魔力
このプロパティはVisioの「変更検知エンジン」を騙すためのスイッチだ。これを実行した直後、Visio内部の「Dirtyフラグ」がクリアされる。ユーザーが何万回シェイプを動かそうが、このフラグさえ書き換えれば、`Close` は静寂の中で完了する。`DisplayAlerts = False` で全てを遮断するよりも、「論理的な状態を整合させる」この手法の方が、副作用が極めて少ない。
② オブジェクトのライフサイクル管理
`Set doc = Nothing` は単なる行儀の問題ではない。VisioはCOMオブジェクトであり、メモリ参照が残っていると、バックグラウンドで `visio.exe` がゾンビプロセスとして残り続ける。これを繰り返すと、大規模なバッチ処理中にメモリ不足(Out of Memory)を招く。エラーハンドラ内でも必ず `Close` を呼び出すのが、中級者から上級者への分かれ道だ。
③ データベース連携時の落とし穴
もしCSVではなく直接データベース(SQL Server等)に書き出す場合、ネットワーク断絶等でエラーが起きると、Visioは「保存されない未処理の図面」を抱えたままハングする。必ず `On Error GoTo` を活用し、`Finally` 相当の処理を自前で実装すること。
—
4. 最後に:自動化とは「静寂」である
優秀な自動化ツールは、まるでそこに存在しなかったかのように、目的の仕事だけを完遂して消え去る。ユーザーに「保存しますか?」という迷いを投げかける時点で、その自動化は失敗だ。
Visioの深淵に触れる際は、常に「Visioが何を考え、どう反応するか」を先回りして制御せよ。このクリーンな終了処理をマスターしたあなたは、もうVisioの挙動に振り回されることはないはずだ。
次は、シェイプのメタデータをXML形式で構造化し、外部APIへ動的にPOSTする実装に挑戦してみるといい。Visioの可能性は、単なる作図ソフトの枠を遥かに超えている。
