Visioの「闇」を焼き払う:Document.RemoveCustomInformationによるメタデータ完全抹消の極意
Visioは単なる作図ツールではない。それは、OSやアプリケーションのメタデータ、ユーザーの足跡、そして組織の機密情報を内包する「巨大なコンテナ」だ。
社外へファイルを提出する際、プロパティから作成者名を消すだけでは不十分だ。ファイル内には、カスタムプロパティ(Shape Data)、非表示のドキュメントプロパティ、さらには過去の編集履歴が静かに眠っている。これらを放置することは、シニアエンジニアとして「セキュリティの自殺」に等しい。
本稿では、Visioのオブジェクトモデルの深淵に触れ、`Document.RemoveCustomInformation` を駆使した完全クレンジングの実装を解説する。
—
1. なぜ「手動削除」では不十分なのか
Visioのファイル構造はOLE複合ドキュメントであり、GUIから確認できない領域にメタデータが散逸している。特に以下の要素は「見えない脅威」だ。
- Document.CustomDocumentProperties: プロジェクトコードや機密フラグが残存しやすい。
- Shape.DataItems: 図形に紐付くメタデータ。過去の設計者の名前や社内サーバーのパスが含まれる。
- 非表示レイヤーのデータ: 削除したはずのオブジェクトの残滓。
これらを一掃するには、GUIではなく「Visioエンジン」に対し、オブジェクトのライフサイクルを制御しながらコマンドを直接叩き込む必要がある。
—
2. 実装:Document.RemoveCustomInformationの真髄
`RemoveCustomInformation` は、Visio 2013以降で導入された強力なメソッドだ。しかし、このメソッドを「適当に呼ぶ」だけでは、メモリリークや未完了のコミットを招く。以下のコードは、単なる削除ではなく、オブジェクトの明示的解放を考慮した堅牢な実装である。
‘ @brief Visioドキュメントからメタデータを完全抹消するプロシージャ
Public Sub ScrubVisioDocument()
Dim doc As Visio.Document
Set doc = ActiveDocument
‘ 1. エラーハンドリングとトランザクションの開始
On Error GoTo Cleanup
‘ 2. メタデータ削除の実行
‘ visCustomInfoResultingDocument を指定し、社外持ち出し用のクリーンな状態へ
‘ このメソッドはドキュメントに埋め込まれた不要な情報を再帰的に探索・削除する
doc.RemoveCustomInformation visCustomInfoResultingDocument
‘ 3. カスタムドキュメントプロパティの全削除(念押し)
Dim prop As Object
For Each prop In doc.CustomDocumentProperties
prop.Delete
Next prop
‘ 4. 不要なオブジェクト参照の明示的解放
‘ VBAのガベージコレクションを待たず、メモリを即時解放する
Set prop = Nothing
Debug.Print “クレンジング完了: ” & doc.Name
Exit Sub
Cleanup:
‘ 異常終了時のメモリリーク防止
Set prop = Nothing
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
—
3. シニアエンジニアが意識すべき「極限の知見」
オブジェクトの明示的解放とガベージコレクション
VBAの `Set = Nothing` は単なる儀式ではない。VisioのオブジェクトモデルはCOMの参照カウンタで管理されている。特に `RemoveCustomInformation` のような重い処理を行う際、循環参照や巨大なShapeコレクションを保持したままにすると、Visioのプロセスが肥大化し、最悪の場合クラッシュする。
Windows APIによる「完全な痕跡消去」の検討
さらに厳格な運用を求めるなら、`RemoveCustomInformation` を実行した後、`SaveAs` メソッドでバイナリを再構築することを強く推奨する。
Visioファイルは「追記型」の構造を持つことが多く、削除したはずのデータがファイル末尾の空き領域(デッドスペース)に残る場合がある。別名で保存し直すことで、ファイルサイズを最適化しつつ、物理的なメタデータの断片を断ち切るのだ。
‘ 物理的な断片化を防ぐための再保存
doc.SaveAsEx “C:\Temp\Cleaned_” & doc.Name, visSaveAsWS
—
4. 運用上の注意:レガシーとの共存
このスクリプトを導入する際、注意すべき点が二つある。
1. Shape Data(旧カスタムプロパティ)の消失:
この処理はShape Dataを破壊する。もし図面がデータベースと連携している場合、クレンジングによってデータリンクが断たれる。運用前に「提出用コピー」を生成し、そのコピーに対してのみ本スクリプトを適用するワークフローを確立せよ。
2. マクロの持ち出し:
`RemoveCustomInformation` を実行したファイルにVBAプロジェクトが含まれている場合、そのマクロも削除対象となる可能性がある。`.vsdx` ではなく、一度 `.vsdm` を介して運用を制御するアーキテクチャ設計が必要だ。
結論
Visioのメタデータ管理は、単なる「掃除」ではない。それは、システムエンジニアが自らの生成物に対して責任を持つための「境界線」の策定である。
あなたが管理するVisioファイルが、社内の機密を漏洩する穴になるか、あるいは完璧に統制されたドキュメント資産となるか。その差は、この数行のコードを理解し、実装する意思にかかっている。
さあ、コードを書き、システムから「ノイズ」を焼き払え。それが、我々エンジニアの矜持だ。
