Visio脱・依存戦略:外部データリンクを「静的」に断ち切る極限の設計術
業務自動化の世界で、Visioは「図面」以上の存在になり得る。ExcelやSQL Serverと連携し、データ駆動型図面を作成する。これは素晴らしい能力だが、配布フェーズでその「繋がり」が足枷になることは諸君も経験済みだろう。
機密情報を含むデータソースへのリンクが残ったままの図面を社外へ送るか? そんなリスク管理の甘さは、プロフェッショナルの仕事ではない。今日は、Visioの外部データリンクをプログラム的に検知し、痕跡を残さず「切断」する、プロダクションレベルの実装手法を授ける。
—
1. なぜ「力技のループ」が地雷になるのか
初級者がやりがちなのは、ページ内の全シェイプを巡回し、片っ端からリンクを解除しようとするアプローチだ。だが、Visioのオブジェクトモデルを理解していれば、それが「不完全な破壊」を生むことは明白だ。
- 理由1:データレコードセットの残存
シェイプのリンクを解除しても、`DataRecordsets` オブジェクトがドキュメント内に残存していれば、ファイルサイズは肥大化し、接続情報はメタデータとして残り続ける。
- 理由2:パフォーマンスの欠如
巨大な図面でシェイプを個別に走査し、`GetShapesLinkedToDataRow` を呼び出すのは、Visioの描画エンジンに過度な負荷をかける。
我々が目指すべきは、シェイプのリンク解除と、データソースそのもののパージを分離し、かつアトミック(不可分)に処理することだ。
—
2. 実装:堅牢なデータ分離エンジン
以下のコードは、単なるコピペ用ではない。業務環境での実行を想定し、エラーハンドリングとリソース解放を組み込んだ「即戦力」だ。
Option Explicit
‘ ———————————————————————-
‘ 目的:指定したドキュメントから全データリンクを解除し、ソースを切断する
‘ 理由:配布時のセキュリティ確保およびファイル軽量化
‘ ———————————————————————-
Public Sub PurgeAllDataLinks(ByVal doc As Visio.Document)
Dim drs As Visio.DataRecordset
Dim i As Long
On Error GoTo ErrorHandler
‘ 1. 全データレコードセットをループして削除
‘ これにより、シェイプとの紐付け情報が根こそぎ破棄される
‘ 注意:この操作は元に戻せない(Undo不可)ため、バックアップは必須
For i = doc.DataRecordsets.Count To 1 Step -1
Set drs = doc.DataRecordsets.Item(i)
Debug.Print “Removing DataRecordset: ” & drs.Name
drs.Delete
Next i
‘ 2. 万が一残ったカスタムプロパティ(Shape Data)のクリーンアップ
‘ 必要に応じて個別のシェイプ属性をリセットする処理をここに記述する
MsgBox “データリンクの分離が完了しました。”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
なぜこの実装が「プロ」の書き方なのか
1. 逆順ループ(Step -1): コレクションからアイテムを削除する場合、前からループするとインデックスがずれてバグの温床となる。削除処理の定石だ。
2. 即時削除: シェイプを個別に `Unlink` するよりも、`DataRecordset` を削除するほうが、Visioの内部構造としては圧倒的にクリーンである。
3. エラーハンドリング: 外部データが既に欠損しているケースなど、想定外の挙動に対してアプリケーションをクラッシュさせない。
—
3. 運用における鉄則
このコードを組み込む上で、以下の「アーキテクトの視点」を忘れないでほしい。
- Undoスタックの考慮: `DataRecordset.Delete` はUndo不可だ。処理を実行する前に `ActiveDocument.SaveAs` で別名保存する運用フローを必ず組み込め。
- イベント駆動の封印: 巨大な図面では、データ更新時に走る `EventDataRecordsetChanged` 等のイベントが処理を遅延させる。自動化処理中は `Application.DeferRecalc = True` を活用し、再計算を一時停止させるのが定石だ。
- メタデータの精査: リンクを解除しても、ドキュメントの「プロパティ」に接続文字列が残ることがある。必要であれば、`doc.CustomProperties` や `DocumentSheet` のシェイプシートも確認せよ。
—
最後に:ツールは道具に過ぎない
外部データリンクの自動切断は、単なる「掃除」ではない。「どの情報を外部に持ち出し、どの情報を隠蔽するか」という、情報のライフサイクルを制御するエンジニアリングそのものだ。
このコードを自らのワークフローに組み込み、配布用図面の軽量化とセキュリティ向上を自動化せよ。諸君の業務が、煩雑な手作業から解放されることを期待している。
技術的な疑問があれば、いつでも聞いてくれ。アーキテクトの知見を惜しみなく提供しよう。
