Visio VBAの「呪縛」を解く:図面を汚さず、静かに去るためのクリーンな終了術
こんにちは。自動化の世界へようこそ。
マクロの記録ボタンを押して、生成されたコードの多さに絶望した経験はありませんか?あるいは、プログラムを実行するたびに「変更を保存しますか?」というダイアログに邪魔をされて、自動化が止まってしまったことは?
Visio VBAは強力ですが、その背後にある「オブジェクトのライフサイクル」を理解しないと、図面ファイルはゴミだらけになり、メモリは圧迫されます。
今回は、「図面から情報を吸い出し、何事もなかったかのように静かに閉じる」という、自動化エンジニアが必ず通るべき「クリーンな終了処理」の極意を伝授します。
—
1. なぜ「Close」で迷うのか?
Visioの `Document.Close` メソッドを呼ぶとき、多くの人が直面するのが「保存確認ダイアログ」です。これはVisioが「この図面は変更された(Dirtyフラグが立った)」と判断するためです。
自動化の現場では、「抽出が終わったら、変更は破棄して即座に閉じる」のが鉄則。これを実現するための鍵は、`Saved` プロパティの制御にあります。
—
2. 実践コード:シェイプ情報を抽出し、美しく閉じる
以下のコードは、ページ内のシェイプ名を取得してCSVに出力し、図面を保存せずに閉じる一連の流れです。
Sub ExportShapeInfoAndCloseSilently()
Dim doc As Visio.Document
Dim pg As Visio.Page
Dim shp As Visio.Shape
Dim fileNum As Integer
Dim csvPath As String
‘ 1. 対象のドキュメント(アクティブな図面)を取得
Set doc = ActiveDocument
csvPath = “C:\Temp\ShapeData.csv”
‘ 2. CSVファイルを開く
fileNum = FreeFile
Open csvPath For Output As #fileNum
Print #fileNum, “ShapeID,ShapeName”
‘ 3. 全ページ・全シェイプを走査
For Each pg In doc.Pages
For Each shp In pg.Shapes
‘ CSVに書き出し
Print #fileNum, shp.ID & “,” & shp.Name
Next shp
Next pg
Close #fileNum
‘ — ここが本題:クリーンな終了処理 —
‘ 4. 「図面は保存済みである」とVisioに誤認させる魔法のフラグ
‘ これをTrueにすると、Close時に保存確認が出なくなります
doc.Saved = True
‘ 5. ドキュメントを閉じる
doc.Close
MsgBox “抽出完了。図面は保存せずに閉じました。”, vbInformation
End Sub
—
3. コードの心臓部:「Saved = True」の正体
このコードの肝は `doc.Saved = True` です。
- 何をしているのか?
Visioの各ドキュメントオブジェクトには `Saved` というプロパティがあります。通常、編集を行うとこの値は `False` になります。Visioは閉じる直前に「SavedがFalseなら保存確認を出そう」と判断します。
ここで強制的に `True` を代入することで、「この図面はもう保存されていますから、確認は不要ですよ」とVisioを説得しているのです。
- 注意点:
`Saved = True` はあくまで「状態の偽装」です。実際に変更内容を保存したい場合は、必ず `doc.Save` を呼び出してから閉じるようにしてください。
—
4. 初学者が陥りやすい「3つの罠」
① 変数の解放を忘れる
大規模なプログラムを書く場合、`Set doc = Nothing` と記述してオブジェクトを明示的に解放する癖をつけましょう。Visioは巨大なメモリを食うアプリケーションです。リソース管理を怠ると、動作が徐々に重くなります。
② アクティブドキュメントへの依存
`ActiveDocument` を使うのは簡単ですが、複数の図面を開いていると誤爆の原因になります。可能な限り `Set doc = Documents.Open(“パス”)` のように明示的に変数へ代入して制御しましょう。
③ エラーハンドリングの欠如
ファイルが読み取り専用だったり、パスが存在しなかったりした際にコードが止まると、Visioが「ゾンビ状態(プロセスだけ残る)」になることがあります。`On Error GoTo` を使い、エラー発生時にも確実に `doc.Close` が呼ばれるような堅牢な設計を心がけてください。
—
最後に:自動化の先にあるもの
「図面を閉じる」という単純な操作一つとっても、Visioのオブジェクトモデルを理解しているかどうかで、プログラムの「品格」が変わります。
今回はCSV出力でしたが、このテクニックは「PDFへの一括変換」「図面内のテキストの一括置換」など、あらゆるバッチ処理の基礎となります。
ここをクリアしたあなたは、もう「マクロの記録」に頼る初心者ではありません。次は、Visioのシェイプデータ(プロパティ)を自在に操る世界へ足を踏み入れてみてください。
あなたの自動化ライフが、より洗練されたものになることを願っています。何か詰まったら、いつでも戻ってきてくださいね。
