Visio図面を極限まで軽量化する:保存時のプレビュー生成をコードで完全制御する技術
こんにちは。業務自動化プロジェクトを率いるチーフアーキテクトの私だ。
日々の業務でVisioのVSDXファイルを大量に生成・保存・共有する自動化ツールを組んでいて、ふと疑問に思ったことはないか?
「なぜ、ただ図形を数点配置しただけの図面が、やたらとファイルサイズが大きいのか?」
その犯人は、ファイル保存時にVisioが親切心(余計なお世話)で作る「プレビュー画像(サムネイル)」だ。Windowsエクスプローラーでアイコン表示したり、SharePointでクイックビューしたりするためだけに、バイナリ内部に高解像度のPNG/JPEG画像が毎度強制埋め込まれている。
数メガバイトの肥大化、ネットワーク共有フォルダでのI/Oネック、Git管理時の無駄な差分肥大。自動化エンジニアとして、この無駄を放置するわけにはいかない。
今回は、`Document`オブジェクトのプロパティを叩き、このプレビュー生成を完全無効化して「高速化」と「軽量化」を同時に達成する極限のテクニックを授けよう。
—
1. なぜGUIではなくVBAで制御すべきなのか?
VisioのUI上からも「ファイル保存時のプレビュー」に関する設定は可能だが、現場の自動化においてGUI設定は「百害あって一利なし」だ。
- 環境依存の罠: ユーザーのPC環境やVisioのバージョンによってデフォルト挙動が異なり、設定が勝手に上書きされる。
- バッチ処理の限界: 数百枚の図面を夜間バッチで一括処理する際、GUIの設定に頼っていては信頼性が担保できない。
だからこそ、コード(VBA)の実行コンテキスト内で明示的に制御する必要がある。プロパティを1行書き換えるだけで、生成されるバイナリから不要なプレビューデータを完全に排除できるのだ。
—
2. コア・メカニズム:`Document.PreviewPicture` プロパティ
Visio VBAにおいて、ドキュメント全体の振る舞いを司るのが `ActiveDocument` または `Document` オブジェクトである。
ここに、プレビュー画像の保存を制御する隠れた(しかし極めて強力な)プロパティが存在する。
‘ プレビュー画像の保存を無効化する
ActiveDocument.PreviewPicture = False
たったこれだけだ。だが、このプロパティをオブジェクトのライフサイクルのどのタイミングで叩くか、がエンジニアの腕の見せ所となる。
⚠️ アーキテクトの警告:適用タイミングの罠
`PreviewPicture = False` は、「これから保存するファイル」に対して効果を発揮する。つまり、新規作成直後、あるいは既存ファイルを開いた直後のイミディエイトなタイミングで設定し、その後の `Save` または `SaveAs` の直前に保証されている必要がある。
—
3. 【プロダクションコード】堅牢な軽量保存プロシージャ
実務でそのまま使える、エラーハンドリング完備の堅牢なVBAコードを提供する。
このコードは、新規ドキュメントを生成し、プレビューを殺した上で、指定パスへ最速でクリーン保存する模範的な実装だ。
Option Explicit
Public Sub CreateAndSaveLightweightVisio()
‘ —————————————————————–
‘ プロシージャ名: CreateAndSaveLightweightVisio
‘ 概要: プレビュー画像を排除し、極限まで軽量化したVisio図面を保存する
‘ —————————————————————–
Dim targetDoc As Visio.Document
Dim savePath As String
Dim originalAlerts As Boolean
‘ 1. 堅牢性のための環境退避とエラーハンドリングの準備
originalAlerts = Application.ScreenUpdating
On Error GoTo ErrorHandler
‘ 画面描画を停止し、処理速度を極限まで引き上げる(パフォーマンス最適化)
Application.ScreenUpdating = False
Application.ShowChanges = False
‘ 2. メートル法ベースの新規ドキュメント作成(ステンシルなし)
Set targetDoc = Application.Documents.Add(“”)
‘ =================================================================
‘ 【核心】プレビュー画像の生成を完全無効化
‘ =================================================================
targetDoc.PreviewPicture = False
‘ 3. ここに実際の図形生成ロジックが入る(今回はサンプルとして省略)
‘ Call BuildDiagram(targetDoc)
‘ 4. 保存パスの決定(実務に合わせて変更のこと)
savePath = “C:\Automation\Output\LightweightDrawing.vsdx”
‘ 同名ファイルが存在する場合は上書きするため、事前に削除またはIoCを考慮
If Dir(savePath) <> “” Then
Kill savePath
End If
‘ 5. クリーン保存の実行
targetDoc.SaveAs savePath
‘ 正常終了ログ
Debug.Print “[SUCCESS] 軽量化されたVisio図面が保存されました: ” & savePath
CleanUp:
‘ 6. 環境の確実な復元(リソースリーク防止)
Application.ScreenUpdating = originalAlerts
Application.ShowChanges = True
Set targetDoc = Nothing
Exit Sub
ErrorHandler:
‘ 異常系ハンドリング
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “VisioAutomation”
Resume CleanUp
End Sub
—
4. 既存ファイル(VSDX)をバッチ処理で軽量化する場合
もし、すでに社内に散在している「プレビュー付きの重い図面群」をバッチで一網打尽に軽量化したい場合は、以下のようにファイルをサイレントオープンして上書き保存するルーチンを組めばいい。
Public Sub BatchStripPreviews(ByVal targetFilePath As String)
Dim doc As Visio.Document
‘ 画面描画を抑止してバックグラウンドで開く
Set doc = Application.Documents.OpenEx(targetFilePath, visOpenROAndUW + visOpenHidden)
‘ プレビュー無効化
doc.PreviewPicture = False
‘ 上書き保存
doc.Save
‘ 閉じる
doc.Close
Set doc = Nothing
Debug.Print “[CLEANED] ” & targetFilePath
End Sub
—
5. チーフアーキテクトからの結び
プレビュー画像の無効化は、単なる「ファイルサイズ削減」に留まらない。
- ストレージI/Oの軽減: 大規模なドキュメント資産を持つサーバーの負荷低下。
- バージョン管理システムの健全化: バイナリ差分の無駄な肥大化を防ぎ、Git等のリポジトリを汚さない。
- 処理速度の向上: 保存時のバイナリ生成演算コストのカット。
プロの自動化エンジニアであれば、コードの美しさだけでなく、こうした「目に見えないコスト」にまでメスを入れるべきだ。
明日からの開発現場で、ぜひこの知見を組み込み、無駄を削ぎ落とした洗練されたシステムを構築してほしい。
