【実務・中級編】【中級者向け】Visio図面内のシェイプ情報をCSVに書き出し、図面を保存せずに閉じるためのクリーンな終了処理 – Visio VBA解析バイブル

スポンサーリンク

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の可能性は、単なる作図ソフトの枠を遥かに超えている。

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