Visio VBAの深淵へ:VSDXの「肥大化」を食い止める極限の最適化術
こんにちは。業務自動化の最前線を走るエンジニアです。
Visioで図面を描き、いざ保存……とした時に「え、ただの構成図なのに数メガバイトもあるの?」と驚いたことはありませんか?
その犯人の多くは、「プレビュー用画像(サムネイル)」です。
Visioは親切心で、ファイルを開く前に中身が見えるようプレビュー画像を生成し、VSDXファイルの中に埋め込みます。しかし、大量のファイルを管理したり、サーバー経由でやり取りしたりする現場では、この機能が逆に足かせになります。
今日は、VBAを使ってこのプレビュー保存を無効化し、「中身だけの軽量なVSDX」を生成する技術を伝授します。マクロの記録から一歩踏み出し、Visioの「プロパティの深層」を操作する感覚を掴みましょう。
—
なぜプレビューを無効化するのか?(技術的背景)
VSDXファイルの実体は、実は「ZIPファイル」です。中身を解凍してみるとわかりますが、XMLデータだけでなく、プレビュー用のPNGファイルなどが同梱されています。
VBAの `Document.SaveAs` を単に実行するだけでは、Visioのデフォルト設定(プレビュー保存あり)が適用されます。これをプログラム側から制御するには、`Document.SetCustomProperty` や `Application.Settings` への理解が必要不可欠です。
今回は、最も堅実で影響範囲をコントロールしやすい `SaveAsEx` メソッド のフラグ操作を解説します。
—
実装コード:軽量化を強制するプロフェッショナルな一行
以下のコードは、現在アクティブな図面を「プレビューなし」で保存するためのルーチンです。
Sub SaveAsLightweight()
‘ 現在のアクティブドキュメントを取得
Dim doc As Visio.Document
Set doc = ActiveDocument
‘ 保存先のパス(環境に合わせて変更してください)
Dim savePath As String
savePath = “C:\Temp\MyDiagram_Slim.vsdx”
‘ SaveAsExを使うのが、自動化エンジニアの嗜み
‘ visSaveAsListOnly はプレビュー保存を抑制するためのフラグ群の一部を制御します
‘ ただし、完全な軽量化にはSaveAsExのフラグ設定が重要です
On Error GoTo ErrHandler
‘ フラグ解説:
‘ visSaveAsWSavePreview (プレビュー保存) を除外したフラグを指定します
‘ 0を指定することで、デフォルトの余計な付加情報を極力省きます
doc.SaveAsEx savePath, Visio.VisSaveAsOptions.visSaveAsNoAutoConnect
MsgBox “軽量化保存が完了しました!”, vbInformation
Exit Sub
ErrHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
コードのポイント:なぜ `SaveAsEx` なのか?
単純な `SaveAs` メソッドは、GUIで保存する際の設定を引き継いでしまいます。一方、`SaveAsEx` は「保存動作」を細かく制御できるプロフェッショナル向けのメソッドです。
特にプレビュー生成を抑えたい場合、Visioの設定(`Application.Settings`)を直接いじる方法もありますが、それは他のファイルにまで影響を及ぼすため危険です。特定のファイルだけを対象にするなら、フラグ制御を行う `SaveAsEx` が最も安全かつ美しい手法です。
—
陥りやすい罠と解決策
初心者がよくやる間違いとして、「保存したはずなのに容量が変わっていない」というものがあります。これには2つの理由が考えられます。
1. 図面内に巨大な画像が埋め込まれている
- プレビューだけでなく、Visio内の図形自体が重いケースです。図形を右クリックし、「画像の圧縮」を行っているか確認してください。
2. キャッシュの影響
- Visioを一度完全に閉じてから、ファイルのプロパティで容量を確認してください。上書き保存直後は、OS側がまだ古い情報を保持していることがあります。
—
さらに一歩先へ:PDF出力時の最適化
ついでに、PDF出力時の容量問題についても触れておきましょう。
VBAからPDFを書き出す際、`ExportAsFixedFormat` を使用しますが、ここでも解像度の指定を怠るとファイルサイズが爆発します。
‘ PDFエクスポート時の軽量化のヒント
doc.ExportAsFixedFormat visFixedFormatPDF, “C:\Temp\output.pdf”, _
visDocExIntentPrint, visPrintAll, 1, 1, False, False, False, False, False
最後の引数群を `False` にすることで、不要なメタデータやフォントのフル埋め込みを調整し、サイズを抑えることが可能です。
—
最後に:自動化エンジニアへのステップアップ
今回の内容は、Visio VBAにおいて「GUIの操作をなぞる」段階から「Visioのエンジンを直接操作する」段階への橋渡しです。
- 今のコードは、他人の環境で動くか?
- 今のコードは、無駄なリソースを消費していないか?
この視点を持つだけで、あなたの書くマクロは一気に「ツール」から「エンジニアリング」へと昇華されます。まずはご自身の作成した図面で、保存後のファイルサイズがどれだけ変わるか、実験してみてください。
もし分からないことがあれば、いつでも聞いてくださいね。あなたの自動化の旅を、全力でサポートします。
