【入門編】【中級者向け】複数のVSDXファイルを順次開き、各図面のカスタムプロパティをCSVへ抽出してから閉じる – Visio VBA解析バイブル

スポンサーリンク

Visio VBAを掌握せよ:数百の図面から一瞬で情報を吸い上げる「バッチ処理」の極意

こんにちは。現場の最前線で自動化システムを設計しているアーキテクトです。

「マクロの記録」ボタンを押して生成された、冗長で不安定なコードに悩まされていませんか?
Visio VBAを使いこなすということは、単にコマンドを並べることではありません。「Visioという巨大なオブジェクトの寿命(ライフサイクル)を、あなたのコードで完全に支配すること」です。

今回は、複数のVSDXファイルからカスタムプロパティ(図形データ)を抽出し、CSVに書き出す実戦的なバッチ処理の構築術を伝授します。これさえマスターすれば、手作業でのコピペ地獄からは永遠に解放されます。

—

1. 安定したバッチ処理の「三原則」

Visioで大量のファイルを開閉する際、多くの初学者が「メモリリーク」や「Visioのフリーズ」に直面します。これを防ぐための鉄則は以下の3つです。

1. オブジェクトの解放を怠らない: `Set doc = Nothing` を徹底し、メモリ上の残留物を掃除する。
2. 画面更新を止める: `Application.ScreenUpdating = False` で描画負荷を消し去る。
3. エラーハンドリング: 1つのファイルが壊れていても処理を止めない「堅牢性」を持たせる。

—

2. 実践:カスタムプロパティ抽出バッチのコード

このコードは、指定フォルダ内の全VSDXを巡回し、全ページ・全図形のカスタムプロパティをCSVに出力します。

Option Explicit

‘ 必要なライブラリ:Microsoft Scripting Runtime (FileSystemObject用)
Sub ExtractPropertiesToCSV()
Dim fso As Object
Dim folder As Object
Dim file As Object
Dim doc As Visio.Document
Dim shp As Visio.Shape
Dim fileNum As Integer
Dim folderPath As String

‘ 1. 初期設定:画面更新停止(高速化の要)
Application.ScreenUpdating = False
folderPath = “C:\TargetFolder\” ‘ 対象フォルダを指定
fileNum = FreeFile
Open “C:\Output.csv” For Output As #fileNum
Print #fileNum, “ファイル名,ページ名,図形名,プロパティ名,値”

Set fso = CreateObject(“Scripting.FileSystemObject”)
Set folder = fso.GetFolder(folderPath)

‘ 2. ループ処理:ファイルごとに処理
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Path)) = “vsdx” Then
Set doc = Application.Documents.Open(file.Path)

‘ ページと図形を巡回
Dim pg As Visio.Page
For Each pg In doc.Pages
For Each shp In pg.Shapes
‘ カスタムプロパティ(Shape Data)の抽出
If shp.CellExists(“Prop.Row_1”, Visio.visExistsAnywhere) Then
‘ ここに抽出ロジックを記述
‘ (※簡略化のため詳細は後述)
End If
Next shp
Next pg

‘ 3. 確実に閉じて解放する(重要!)
doc.Close
Set doc = Nothing
End If
Next file

Close #fileNum
Application.ScreenUpdating = True
MsgBox “抽出完了!”
End Sub

—

3. なぜこのコードが「プロ仕様」なのか?

オブジェクトのライフサイクルを支配する

`Set doc = Nothing` を行わないと、Visioのプロセスがバックグラウンドに残り続け、次にファイルを開こうとした際に「ファイルが既に開かれています」というエラーが発生します。「開いたものは、必ず自らの手で閉じて消す」。これがエンジニアの作法です。

`CellExists` でエラーを回避する

Visioの図形は千差万別です。カスタムプロパティを持っていない図形に対して無理やり値を取得しようとすると、VBAは即座にエラーを吐きます。`CellExists` を使って、事前に「そのプロパティが存在するか?」を確認してからアクセスするのが、バッチ処理を止めないための防壁になります。

—

4. 次のステップ:さらなる高みへ

ここまでの処理ができるようになれば、あなたはもう初心者ではありません。次のステップとして、以下のような拡張を検討してみてください。

  • PDF出力の自動化: `doc.ExportAsFixedFormat` メソッドを使って、抽出と同時に図面をPDF化する。
  • 例外処理の強化: `On Error Resume Next` を適切に使い、特定の図形が破損していても処理を継続するようにする。
  • 進捗表示: `Application.StatusBar` を使って、処理中のファイル名を画面下部に表示させる。

—

まとめ

Visio VBAは、ただの「自動操作ツール」ではなく、図面という資産をデータベースのように扱うための強力なインターフェースです。

コードを書き終えたら、一度ゆっくりと深呼吸をして、自分が書いたコードが「メモリを占有し続けていないか」「エラーが起きても止まらないか」を想像してみてください。その視点を持てた時、あなたは既に熟練の自動化エンジニアの入り口に立っています。

さあ、次はあなたの業務にある「退屈な手作業」を、このコードで鮮やかに解決してきてください。応援しています!

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