Visio VBAを掌握する極限の知見:機密情報・メタデータの自動消去とクリーンアップの極意
開発プロジェクトの現場において、図面やダイアグラムの「納品物」に潜むリスクを意識したことはあるだろうか。
図面プロパティに刻まれた作成者名、組織名、編集履歴、あるいは幾度もの改修の果てに図面裏で息を潜める「非表示レイヤー」や「ゴーストシェイプ」。これらは社外秘の機密情報であり、意図せず競合他社や顧客の手に渡った場合、致命的なセキュリティインシデントになり得る。
手動での削除? 人間頼みのチェックリスト?
ナンセンスだ。 業務自動化を担うエンジニアであれば、こうしたリスクはVBAによって完全にシステム化し、一網打尽にすべきである。
今回は、Visioのドキュメントオブジェクトモデルの深層に切り込み、`Document.RemoveHiddenInformation` メソッドを駆使して「絶対に安全な納品用ファイル」を生成するプロダクションコードを伝授する。
—
1. なぜ手動クリーンアップは破綻するのか
Visioのファイル( `.vsdx` )は、内部的にはXMLのZIPアーカイブ構造(Open Packaging Conventions)を持っている。そのため、メタデータやカスタムプロパティ、過去の変更履歴はあちこちに散らばっている。
UI上の「ファイル」>「情報」>「問題のチェック(ドキュメントの検査)」から手動で消去することも可能だが、以下の致命的な欠点がある。
- ヒューマンエラー: 担当者が「検査ボタン」を押し忘れる、あるいは一部の項目チェックを外すリスクが常につきまとう。
- スケーラビリティの欠如: 数百枚の図面を一括でクリーンアップしなければならない局面において、GUI操作は完全に無力である。
- 監査証跡の欠如: 「本当にクリーンな状態のファイルが納品されたか」を客観的に証明・ログ化する仕組みがない。
これらを解決するには、Visio VBAによるプログラム制御が唯一にして最高の解となる。
—
2. Document.RemoveHiddenInformation メソッドの真価
Visio 2010以降、オブジェクトモデルには隠し情報やメタデータをプログラムから一括消去するための強力なメソッドが備わっている。それが `Document.RemoveHiddenInformation` だ。
このメソッドは、指定したフラグ(定数)に応じて、図面内の不要なデータを外科手術のごとく正確に切り離す。
主要な削除対象フラグ(VisRemoveHiddenInfoFlags)
- `visRHIProperties` : ドキュメントプロパティ(タイトル、作成者、会社名など)
- `visRHIRecentFiles` : 最近使ったファイルの履歴
- `visRHILayers` : 非表示のレイヤー情報
- `visRHIComments` : コメントや注釈データ
- `visRHICustomData` : カスタムプロパティやメタデータ
ここでアーキテクトとして注意すべきポイントがある。「何も考えずに全てのフラグを立てて実行する」のは愚行である。 図面によっては、運用上必要なカスタムデータやレイヤー構造まで破壊してしまう可能性があるからだ。
したがって、実務で使うツールは「何を消して、何を残すのか」を厳密に制御できる設計でなければならない。
—
3. 【プロダクションコード】堅牢なクリーンアップ・エンジン
実務の現場で即座に稼働し、エラーハンドリングとログ出力を完備したVBAモジュールを公開する。このコードは、単に消去するだけでなく、「別名で保存(コピー)」した上でクリーンアップを実行するため、オリジナルの作業用ファイルを破壊するリスクがゼロである。
Option Explicit
‘ =========================================================================
‘ módulo名: modSecurityCleaner
‘ 概要 : Visio図面の機密情報・メタデータを安全に一括消去し、納品用ファイルを生成する
‘ =========================================================================
Public Sub GenerateCleanedDeliverable()
Dim srcDoc As Document
Dim targetDoc As Document
Dim originalPath As String
Dim savePath As String
Dim fso As Object
‘ 1. アクティブドキュメントの存在チェック
If Application.Documents.Count = 0 Then
MsgBox “処理対象の図面が開かれていません。”, vbCritical, “セキュリティエラー”
Exit Sub
End If
Set srcDoc = Application.ActiveDocument
‘ 2. 未保存ファイルのガード(パスがない場合は保存を促す)
If srcDoc.Path = “” Then
MsgBox “現在の図面が一度も保存されていません。先に名前をつけて保存してください。”, vbExclamation, “保存確認”
Exit Sub
End If
originalPath = srcDoc.FullName
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 3. 納品用ファイルパスの生成(元のファイル名に “_CLEANED” を付与)
savePath = fso.BuildPath(srcDoc.Path, fso.GetBaseName(srcDoc.Name) & “_CLEANED.” & fso.GetExtensionName(srcDoc.Name))
On Error GoTo ErrorHandler
‘ 4. 安全性確保のため、オリジナルをコピーして別名で開き直す(オリジナルを汚さないため)
srcDoc.SaveCopyAs savePath
Set targetDoc = Application.Documents.Open(savePath)
‘ 5. 機密情報のパージ実行
‘ ※要件に合わせてフラグを調整すること
‘ visRHIProperties (プロパティ), visRHILayers (非表示レイヤー), visRHIComments (コメント)
Dim flagsToClean As Long
flagsToClean = visRHIProperties Or visRHILayers Or visRHIComments
‘ メソッド実行
targetDoc.RemoveHiddenInformation flagsToClean
‘ 6. クリーンアップ後の変更を保存して閉じる
targetDoc.Save
targetDoc.Close
MsgBox “機密情報の消去が完了しました。” & vbCrLf & _
“出力先: ” & savePath, vbInformation, “クリーンアップ成功”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“Error No: ” & Err.Number & vbCrLf & _
“Description: ” & Err.Description, vbCritical, “致命的エラー”
If Not targetDoc Is Nothing Then
targetDoc.Close visSaveChangesNo
End If
End Sub
—
4. チーフアーキテクトが教える実装上の極意と注意点
上記のコードをただコピペするだけでは、プロのエンジニアとは言えない。現場で陥りがちな罠と、それを回避するための知見を共有しよう。
① オリジナルを直接操作してはならない
初学者が犯しがみちなミスは、`ActiveDocument.RemoveHiddenInformation` をそのまま実行し、上書き保存してしまうことだ。もしマクロのバグで必要なカスタムプロパティが吹き飛んだ場合、二度と復元できない。
必ず `SaveCopyAs` で別ファイル化し、そちらに対して処理を行うのが鉄則である。
② ファイルシステムオブジェクト(FSO)の活用
VBA標準の文字列操作関数でパスを結合しようとすると、スラッシュやバックスラッシュのミスでバグの温床になる。上記コードのように `Scripting.FileSystemObject` の `BuildPath` を使うことで、OS環境に依存しない堅牢なパス操作が可能になる。
③ データベースや外部連携への応用
このマクロを単体の機能で終わらせるな。例えば、社内の進捗管理データベース(AccessやSQL Server、あるいはSharePointリスト)と連携させ、
1. ステータスが「納品承認済」になった図面を自動取得
2. バックグラウンド(Visible = False)でVisioインスタンスを起動
3. 本マクロを適用して指定サーバーへ自動格納
4. データベースのステータスを「クリーンアップ完了」に更新
ここまで昇華させて初めて、「真の業務自動化」と言える。
—
5. おわりに:技術者は「見えないリスク」を支配する
図面の美しさや、スマートなシェイプ配置にこだわるのはプログラマ・デザイナーとしてのプライドだ。しかし、「データの裏側に何が残っているか」にまで目を光らせるのが、真に優秀なエンジニアの条件である。
メタデータや隠し情報の漏洩は、企業の信頼を一瞬で失墜させる。
今回解説した `Document.RemoveHiddenInformation` の実装をあなたのツール群に組み込み、セキュアでモダンな自動化環境を構築してほしい。
