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

スポンサーリンク

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のシェイプデータ(プロパティ)を自在に操る世界へ足を踏み入れてみてください。

あなたの自動化ライフが、より洗練されたものになることを願っています。何か詰まったら、いつでも戻ってきてくださいね。

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