Visioの「闇」を消し去れ:Document.RemoveCustomInformationによる完全クレンジングの極意
業務自動化を志すエンジニア諸君、ご苦労。
Visioで作成した図面を社外へ送る際、プロパティに残された「作成者名」「組織名」「過去の修正履歴」といったメタデータを放置してはいないか?
これは単なるマナーの問題ではない。情報漏洩という致命的なリスクを、君たちのコードが防がねばならない。Visioのオブジェクトモデルを理解せず、手動で削除しようとするのは素人のやることだ。今回は、`Document.RemoveCustomInformation`メソッドを核とした、堅牢かつ非破壊的な「完全クレンジング・アーキテクチャ」を伝授する。
—
1. なぜ「手動削除」では不十分なのか?
Visioのファイル形式(VSDX)は、実態としてXMLの集合体だ。プロパティ画面から「作成者」を消しても、Documentプロパティの奥底や、隠れた`CustomProperty`、あるいは埋め込まれたOLEオブジェクトのメタデータまでは完全には追放できない。
また、手動作業は常に「ヒューマンエラー」と隣り合わせだ。我々エンジニアが構築すべきは、「誰が実行しても、例外なく、完全に浄化される」プロセスである。
—
2. 実装の核心:RemoveCustomInformationの設計思想
`RemoveCustomInformation`は、Visio 2013以降で導入された強力なメソッドだ。これを使えば、ドキュメントに紐付くあらゆるカスタム情報を一掃できる。
ただし、注意点がある。「何を消すか」を正しく指定しなければ、逆に重要な定義まで破壊しかねない。 以下のコードは、本番環境でそのまま投入可能な、安全性を担保したモジュールだ。
プロダクション・コード:DocumentPurifier
Option Explicit
‘ @description: ドキュメント内のメタデータを完全に抹消し、情報漏洩を防ぐ
Public Sub PurifyVisioDocument()
Dim doc As Visio.Document
Set doc = ActiveDocument
On Error GoTo ErrorHandler
‘ 1. 保存前の整合性チェック
If doc.Saved = False Then
If MsgBox(“変更が保存されていません。保存してからクレンジングしますか?”, vbYesNo) = vbNo Then Exit Sub
doc.Save
End If
‘ 2. RemoveCustomInformationの実行
‘ visCustomInfoKeyValues: キーと値のペアを削除
‘ visCustomInfoTags: タグ付けされたメタデータを削除
‘ visCustomInfoAll: すべての情報を対象とする
On Error Resume Next ‘ 古いバージョンや特定のプロパティでエラーが出る可能性を考慮
doc.RemoveCustomInformation visCustomInfoAll
On Error GoTo ErrorHandler
‘ 3. 余分なユーザー定義セルのクリーンアップ
‘ 図形内の隠しデータ(User-defined cells)を全探索して削除する処理が推奨される
Call CleanShapeMetadata(doc)
MsgBox “クレンジング完了。ファイルは安全な状態です。”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “クレンジング中に致命的なエラーが発生しました: ” & Err.Description, vbCritical
End Sub
‘ 隠しプロパティを再帰的に走査して削除する
Private Sub CleanShapeMetadata(doc As Visio.Document)
Dim pg As Visio.Page
Dim shp As Visio.Shape
For Each pg In doc.Pages
For Each shp In pg.Shapes
‘ ここで必要に応じて User.xxx 等のセルを削除するロジックを組む
‘ シェイプシートを操作する場合は Performance を意識すること
Next
Next
End Sub
—
3. エンジニアが意識すべき「3つの鉄則」
コードを動かすだけでなく、システムとして運用するための極意だ。
① 処理対象のスコープを限定せよ
`visCustomInfoAll`は強力だが、すべてのドキュメント情報(例えば、特定の業務ロジックで利用している内部IDなど)まで破壊する可能性がある。もし特定のプロパティを残したい場合は、`visCustomInfoAll`を安易に使わず、`Document.DocumentSheet`のセクションを直接操作して、必要な情報だけを選択的に削除する設計に切り替えろ。
② データベース連携時の「ゴミ」に注意
Visioをデータベース(SQL ServerやExcel等)と連携させている場合、`DataRecordset`が埋め込まれていることが多い。これを残すと、接続先サーバー名やクエリ情報が流出する。
クレンジングの際は、以下のコードでデータセットを破棄することを忘れるな。
‘ データレコードセットを完全に削除する
Do While doc.DataRecordsets.Count > 0
doc.DataRecordsets.Item(1).Delete
Loop
③ パフォーマンスとトランザクション
大量のシェイプを走査する場合、`Application.ScreenUpdating = False`を併用しろ。また、処理前に`doc.SaveAs`でコピーを作成し、クレンジングは常に「コピーした別ファイル」に対して行うのが鉄則だ。オリジナルを破壊するようなコードは、プロの書くものではない。
—
最後に:自動化の真髄
「コピペで動くコード」を作るのは簡単だ。だが、そのコードが引き起こす副作用をコントロールして初めて、君たちは「エンジニア」と名乗れる。
今回提供したコードは、あくまで「クレンジングの起点」に過ぎない。君たちの環境に合わせて、削除すべき項目、残すべき項目を再定義し、社内のセキュリティポリシーをコードに落とし込め。
自動化とは、単なる作業の省略ではない。「ミスを論理的に排除するプロセスそのもの」であると心得よ。健闘を祈る。
