【実務・中級編】【中級者向け】Visio図面内の「カスタムプロパティ(Shape Data)」を読み取り、PDFのメタデータとして埋め込む – Visio VBA解析バイブル

スポンサーリンク

Visio VBAを掌握せよ:Shape DataをPDFメタデータへ昇華させる「文書管理の極意」

Visioを単なる作図ツールだと思っているなら、それは大きな誤解だ。Visioは「構造化されたデータベース」であり、VBAはそのエンジンである。

今回は、図面内の「Shape Data(旧:カスタムプロパティ)」を抽出し、PDFのプロパティ(メタデータ)として動的に書き込む手法を伝授する。文書管理システム(DMS)で検索にヒットしない図面は、もはや「存在しない」のと同じだ。検索性を最大化し、管理コストをゼロにするための、堅牢なアーキテクチャを提示しよう。

—

1. なぜ「力技」ではいけないのか

多くの初学者は、`ActivePage.Shapes`をループさせて力技で値を拾おうとする。だが、本番環境でそれをやれば、図面が複雑化した瞬間にメモリリークや処理落ちを引き起こす。

極限の設計指針:

  • イベント駆動の排他制御: PDF出力中に図面が変更されるリスクを排除する。
  • メタデータの一元管理: 「どのシェイプがメタデータのソースか」を明示する(今回は特定のセクションまたはIDを指定する方法を推奨する)。
  • エラーハンドリングの徹底: PDFドライバの挙動はOSやバージョンに依存する。`On Error GoTo`は甘えではない。防壁だ。

—

2. 実装:堅牢なメタデータ埋め込みスクリプト

このコードは、特定のシェイプから値を取得し、Visioの`Document.Properties`を通じてPDFに反映させるためのコア・モジュールだ。

Option Explicit

‘ メイン制御ルーチン
Public Sub ExportToPDFWithMetadata()
Dim doc As Visio.Document
Set doc = ActiveDocument

‘ 1. Shape Dataからメタデータを抽出(エラー対策済み)
Dim docTitle As String, docAuthor As String

On Error GoTo ErrorHandler

‘ 例:ページ上の「DocInfo」という名前のシェイプから情報を取得
docTitle = GetShapeData(ActivePage, “DocInfo”, “Title”)
docAuthor = GetShapeData(ActivePage, “DocInfo”, “Author”)

‘ 2. Visioの組み込みプロパティを更新
‘ これにより、PDF出力時に自動的にメタデータが継承される
With doc.DocumentProperties
.Title = IIf(docTitle <> “”, docTitle, “Default Title”)
.Creator = IIf(docAuthor <> “”, docAuthor, “System Admin”)
End With

‘ 3. PDFエクスポート実行(解像度と互換性は環境に合わせて調整)
Dim targetPath As String
targetPath = Environ(“USERPROFILE”) & “\Desktop\ExportedDoc.pdf”

doc.ExportAsFixedFormat visFixedFormatPDF, targetPath, _
visDocFromVisioPages, visDocAllPages, , , , , , , False

MsgBox “PDF生成完了: ” & targetPath, vbInformation
Exit Sub

ErrorHandler:
MsgBox “致命的なエラーが発生しました: ” & Err.Description, vbCritical
End Sub

‘ 汎用的なShape Data取得関数
Private Function GetShapeData(pg As Visio.Page, shapeName As String, fieldName As String) As String
Dim shp As Visio.Shape
On Error Resume Next
Set shp = pg.Shapes(shapeName)
If shp Is Nothing Then Exit Function

‘ Cellの存在確認
If shp.CellExists(“Prop.” & fieldName, 0) Then
GetShapeData = shp.Cells(“Prop.” & fieldName).ResultStr(“”)
End If
End Function

—

3. 現場で生き残るための「3つの鉄則」

① 「Prop.」プレフィックスの厳格化

Shape Dataは内部的に`Prop.フィールド名`として管理される。直接的な`Cells`アクセスは高速だが、存在しないフィールドを叩くと即座にクラッシュする。必ず`CellExists`で存在検証を行うこと。

② PDF出力の「互換性」を疑え

Visioの`ExportAsFixedFormat`は、インストールされているOfficeの更新プログラムやPDFドライバのバージョンに挙動が左右されることがある。重要ドキュメントを扱う場合は、必ず一度PDFのプロパティをプログラムで開き、値が正しく書き込まれているか(Adobe Acrobat SDK等を用いて)検証するテストケースを設けるべきだ。

③ データベース連携の最適化

もし図面情報がExcelやSQL Serverにあるなら、VBAで直接DBを叩くのではなく、「Visioのデータリンク機能(Data Recordsets)」を介してShape Dataに同期させ、その後にこのスクリプトを走らせるのが正解だ。データソースと図面シェイプを疎結合に保つことが、長期的な保守性の鍵となる。

—

最後に:エンジニアとしての矜持

VBAは「古臭い」と揶揄されることもある。しかし、Visioという巨大なオブジェクトモデルを自在に操り、業務プロセスそのものを自動化するこの力は、現代のAI全盛時代においても、現場の最前線で確実に価値を生み出し続ける。

コードをコピペして満足するな。その背後にある「なぜそう書くのか」という設計思想を理解し、君自身の現場の要件に合わせて磨き上げろ。それが、エンジニアとしての真の成長だ。

質問があればいつでも来い。次のステップである「Active Directory連携による作成者自動設定」の設計についても語れるぞ。

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