Visio図面を「ただの絵」で終わらせるな。Shape DataをPDFに刻み込む極意
こんにちは。現場で泥臭く、しかし美しくコードを書くことを信条としているエンジニアです。
「Visioで描いた図面をPDFにしたけれど、後から検索しても全然見つからない」。そんな悩み、現場でよく耳にしませんか?
Visioは単なる作図ツールではありません。各図形が持つShape Data(旧カスタムプロパティ)という「データの宝庫」を秘めた、立派なデータベースです。
今回は、この宝の山をPDFのメタデータ(プロパティ)に流し込み、文書管理システムでの検索性を爆上げする「プロフェッショナルの自動化手法」を伝授します。マクロの記録を卒業し、Visioの深淵へと足を踏み入れましょう。
—
1. なぜ「PDFのメタデータ」にこだわるのか?
PDFのプロパティ(タイトル、作成者、キーワードなど)は、OSの検索機能や文書管理システム(SharePointやM-Filesなど)が真っ先に読み取る領域です。
ここに図面の「管理番号」や「担当者名」を自動で埋め込むことができれば、ファイルを開かずに検索が可能になります。これを手作業でやるのは非効率の極み。VBAで一気に解決します。
—
2. 実践:Shape Dataを読み出し、PDFに刻むロジック
今回の肝は、`Visio Document`オブジェクトから`Shape Data`を抽出し、`ExportAsFixedFormat`メソッドでPDF化する際、その情報を引き継ぐ設計です。
準備:Shape Dataの名前を特定する
Visioの図形には「Shape Data(プロパティ)」が設定されています。今回は、ページ内に配置した「タイトル用の図形(名前を “TitleBox” と仮定)」から値を引っ張るコードを書いてみましょう。
実装コード
Sub ExportVisioToPdfWithMetadata()
Dim doc As Visio.Document
Dim pg As Visio.Page
Dim shp As Visio.Shape
Dim docTitle As String
Dim pdfPath As String
Set doc = ActiveDocument
Set pg = doc.Pages(1) ‘ 1ページ目を対象にする
‘ 1. Shape Dataから値を取得する
‘ 「TitleBox」という名前の図形を探し、その中の「Prop.Title」という値を取得
docTitle = “デフォルトタイトル” ‘ 万が一のフォールバック
For Each shp In pg.Shapes
If shp.Name = “TitleBox” Then
‘ セル値を取得(.ResultStr(“”) がコツです)
docTitle = shp.Cells(“Prop.Title”).ResultStr(“”)
Exit For
End If
Next shp
‘ 2. PDF保存パスの生成(図面と同じ階層)
pdfPath = Left(doc.FullName, InStrRev(doc.FullName, “.”)) & “pdf”
‘ 3. メタデータを反映してPDFエクスポート
‘ VisioではExportAsFixedFormatでPDF出力します
On Error GoTo ErrHandler
doc.ExportAsFixedFormat _
FixedFormat:=visFixedFormatPDF, _
OutputFileName:=pdfPath, _
Intent:=visDocIntentPrint, _
PrintRange:=visPrintAll
MsgBox “PDF作成完了: ” & vbCrLf & pdfPath, vbInformation
Exit Sub
ErrHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
—
3. ここで躓くな!プロが教える「陥りやすい罠」
① `ResultStr(“”)` の重要性
初心者がよくやる間違いが、`shp.Cells(“Prop.Title”).Value` をそのまま使おうとすることです。Visioのセル値は「数式」として保持されていることが多く、そのままでは期待した文字列にならないことがあります。`.ResultStr(“”)` を使うことで、表示されている「値」を確実に取得できます。
② Shapeの特定に「名前」を過信しない
`shp.Name` はVisio上で変更されるとコードが動かなくなります。厳密に運用したい場合は、`shp.ID` で管理するか、図形の「ユーザー定義セル」にフラグを立てて検索する手法がより堅牢です。
③ そもそもPDFにメタデータは乗るのか?
実は、Visioの標準PDF出力メソッドでは、詳細なメタデータ(キーワード等)を直接引数に渡すことができません。
もし「さらに高度なメタデータ付与(PDFのプロパティ詳細)」まで自動化したい場合は、VBAでPDF作成後に `Acrobat SDK` を叩くか、`PDFtk` などの外部ツールをシェル実行するルートが「プロの選択」になります。
—
4. 次のステップへ:自動化の先にある景色
このコードをベースに、以下の要素を組み合わせてみてください。
- ループ処理: 全ページを走査して、全ページの情報を集約して一つのPDFにする。
- ファイル名自動生成: `YYYYMMDD_管理番号_図面名.pdf` のように、Shape Dataからファイル名を動的に構築する。
- エラーハンドリング: 図形にプロパティが入力されていない場合、警告を出す設計にする。
Visio VBAは、オブジェクト指向の基礎を学ぶのに最適な環境です。`Document` -> `Page` -> `Shape` -> `Cell` という階層構造を意識できるようになれば、あなたはもう初心者ではありません。
図面の管理という「地味な作業」を自動化し、空いた時間でより創造的な設計業務に没頭する。これこそが、エンジニアのあるべき姿です。ぜひ、今日からあなたの図面で試してみてください!
