【入門編】機密情報・メタデータの自動消去:Document.RemoveHiddenInformationのVBA実装 – Visio VBA解析バイブル

スポンサーリンク

こんにちは! Visio VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから抜け出し、自分の手で図面を意のままに操るエンジニアへの第一歩を踏み出そうとしているあなたへ。今日は、実務で絶対に避けて通れない「機密データの完全消去」という極めて重要なテーマについてお話しします。

ここをクリアすれば、単なる「VBAが少し書ける人」から、セキュリティや納品品質まで配慮できる「ワンランク上のプロフェッショナル」へグッと近づきますよ。しっかりついてきてくださいね!

納品図面に潜む「見えない爆弾」の正体

私たちは普段、何気なくVisioで図面を作成し、修正を重ねています。
しかし、その `.vsd` や `.vsdx` ファイルの中身を覗いたことがありますか?

図面には、私たちが意識していない多くの「メタデータ(付加情報)」がこっそり蓄積されています。

  • 作成者や会社の組織名、最終更新者の名前
  • 過去のコメントや、図面から削除したはずの非表示シェイプ
  • 編集の履歴や、カスタムプロパティに埋め込まれた機密情報

これらをそのままクライアントや外部へ納品してしまうと……想像しただけでも冷や汗ものですよね。情報漏洩のリスクはもちろん、「社内秘」のメモがそのまま残っていたという事故は、現場のエンジニアリングにおいて最も避けたい失態の一つです。

手動でこれらを消去するのは、見落としのリスクもあり非現実的。だからこそ、VBAを使って自動化・一括処理する仕組みが絶対に不可欠なのです。

Visio VBAの心臓部:`Document` オブジェクトと隠し情報の関係

Visioのオブジェクトモデルを少しだけ思い出してください。
`Application` の下には `Document` があり、その中に `Page` や `Shape` がぶら下がっていますよね。

機密情報やメタデータは、個々のシェイプというよりも、ドキュメント全体(Documentオブジェクト)のキャンバスの裏側にまとわりついています。

ここで登場するのが、Visioが誇る強力なメソッド `RemoveHiddenInformation` です。

このメソッドを知っていれば、コード一発で不要なメタデータを根こそぎ安全にパージ(消去)することができます。まずは、その全貌を見てみましょう。

実装コード:機密データ自動消去マクロ

実務でそのままコピペして、すぐに安全なクリーンアップを行える実用コードを用意しました。
開発タブのVisual Basic Editorを開き、標準モジュールに貼り付けてみてください。

Option Explicit

‘ ==============================================================================
‘ 処理名 : 納品前ドキュメント・メタデータ一括消去マクロ
‘ 概要 : アクティブなVisio図面から作成者情報や非表示データ等を完全に削除する
‘ ==============================================================================
Sub CleanUpHiddenInformationForDelivery()

Dim targetDoc As Visio.Document
Dim resultMsg As String

‘ 1. 現在アクティブなドキュメントをターゲットに設定
Set targetDoc = ActiveDocument

‘ 【重要】何らかのドキュメントが開かれているかチェック
If targetDoc Is Nothing Then
MsgBox “処理対象の図面が開かれていません。”, vbExclamation, “エラー”
Exit Sub
End If

‘ 2. ユーザーへの最終確認(誤操作防止の安全装置)
If MsgBox(“図面「 ” & targetDoc.Name & ” 」に含まれる作成者情報や非表示データを完全に削除しますか?” & vbCrLf & _
“※この操作は元に戻せません。必ず別名保存したファイルでお試しください。”, _
vbYesNo + vbQuestion, “セキュリティ・クリーンアップ確認”) = vbNo Then
Exit Sub
End If

On Error GoTo ErrorHandler

‘ 3. RemoveHiddenInformation メソッドの実行
‘ 引数に「どの情報を消すか」のフラグを指定します。
‘ ここでは代表的なメタデータと非表示データを網羅的に削除するフラグを合算(Or)しています。
targetDoc.RemoveHiddenInformation ( _
Visio.VisRemoveHiddenInfoTypes.visRHIInactiveMarkup Or _
Visio.VisRemoveHiddenInfoTypes.visRHICustomProperties Or _
Visio.VisRemoveHiddenInfoTypes.visRHIComments Or _
Visio.VisRemoveHiddenInfoTypes.visRHIMetaData _
)

‘ 4. 成功メッセージの通知
MsgBox “クリーンアップが正常に完了しました!” & vbCrLf & _
“機密メタデータは完全に消去されています。”, vbInformation, “完了”

Exit Sub

ErrorHandler:
‘ 予期せぬエラーをキャッチ
MsgBox “エラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical, “予期せぬエラー”

End Sub

コードのポイントと知っておくべき「エンジニアの知見」

このコードの肝は、`targetDoc.RemoveHiddenInformation` の引数に指定している 定数(フラグ) にあります。

1. 削除対象をコントロールするビットフラグ

`Visio.VisRemoveHiddenInfoTypes` という列挙体を使うことで、「何を消して、何を残すか」を細かく制御できます。

  • `visRHIMetaData`: 文書プロパティ(作成者、会社名など)
  • `visRHIComments`: 挿入されたコメント
  • `visRHICustomProperties`: カスタムプロパティ(シェイプデータに隠された機密など)
  • `visRHIInactiveMarkup`: 非アクティブなマークアップ・インクデータ

これらを `Or` 演算子で繋ぐことで、一度にまとめて掃除機をかけるようにクリーンアップできるわけです。

2. 「元に戻せない」という恐怖(トランザクションの限界)

プログラミング初心者が陥りやすい最大の罠がこれです。
`RemoveHiddenInformation` で削除された情報は、VBAの `Undo`(元に戻す)では復活させることができません。

そのため、先ほどのコードにも組み込んでいる通り、実行する前に必ずユーザーに確認を促す `MsgBox` を挟むこと、そして「本番ファイルを直接上書きするのではなく、納品用フォルダに別名保存(`SaveAs`)した上で実行する」というフローを設計するのが、一流のエンジニアの作法です。

陥りやすいエラーとスマートな対策

現場でこのマクロを運用し始めると、いくつかの「壁」にぶつかることがあります。代表的なものを先回りしてクリアしておきましょう。

Q. 「読み取り専用」の図面でエラーになる

A. ドキュメントの状態を事前にチェックしましょう。
共有サーバーやメール添付から開いた直後のファイルは「読み取り専用」になっていることがあり、この状態ではデータを削除して保存することができません。
コードの先頭で `targetDoc.ReadOnly` プロパティを判定し、読み取り専用なら処理を中断するか、ローカルへの保存を促すガード節を入れると、エラーでマクロが強制終了するのを防げます。

If targetDoc.ReadOnly Then
MsgBox “このファイルは読み取り専用です。一度ローカルに保存してから実行してください。”, vbCritical
Exit Sub
End If

ここをクリアすれば、Visio VBAの基本はバッチリですよ!

お疲れ様でした!
今日は、オブジェクトモデルの操作だけでなく、「セキュリティと実務運用」というエンジニアにとって最も価値のある視点を交えて、メタデータ消去の自動化を学びました。

「ボタン一つで、社外秘データが綺麗に消え去り、安全な納品ファイルが生成される」。
この仕組みをあなたの職人に導入するだけで、ヒューマンエラーによる事故はゼロになり、チーム全体の信頼性も劇的に向上します。

Visio VBAは、ただ図形を動かすだけのオモチャではありません。ビジネスの現場を守る強力な盾にもなるのです。
この調子で、次のステップへ進んでいきましょう!あなたの自動化の旅を、これからも全力で応援しています。

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