こんにちは! Visioでの自動化に挑む皆さん、日々の図面作成お疲れ様です。
マクロの記録ボタンを押して、生成されたコードをそのまま動かしてみたものの、「あれ?別のPCで動かすと図形の位置が微妙にズレる…」「グリッドの間隔がバラバラで、綺麗に整列しない…」そんな壁にぶつかったことはありませんか?
実はそれ、あなたのコードのせいではなく、Visioの環境設定(スナップやグリッド)が、開く人やPCによってバラバラになっているからなんです。
今回は、プロの現場でも必須となるテクニック『`Application.Settings` を使った作図補助設定の動的書き換え』について、基礎から徹底的に解説していきます。ここをクリアすれば、どんな環境であっても「寸分狂わない高精度な図形配置」を自動化できるようになりますよ。さあ、一緒にVisio VBAの奥深い世界へ足を踏み入れましょう!
—
1. なぜ「スナップ・グリッド設定」をコードで統一する必要があるのか?
Visioには、図形を配置するときにピタッと吸着させる「スナップ」や、目に見えない方眼紙の幅を決める「グリッド」の機能があります。
手動で図面を描く分にはこれらは非常に便利な機能ですが、VBAで「座標を指定して図形を完璧に配置したい」という自動化の文脈においては、最大の障害になり得ます。
- ユーザーAのPC:グリッド間隔「5mm」でスナップ有効
- ユーザーBのPC:グリッド間隔「10mm」でスナップ無効
この状態で「座標 (10, 10) に図形を置く」というマクロを実行すると、ユーザーの環境設定に引っ張られて、勝手に座標が丸められてしまう(ズレてしまう)という恐ろしい現象が起きます。
だからこそ、マクロの実行開始と同時に、開発者が意図した通りのスナップ・グリッド環境へ強制的に書き換える(イニシャライズする)必要があるのです。
—
2. 扉を開く鍵:`Application.Settings` オブジェクトとは?
Visioのオブジェクトモデルにおいて、画面の表示倍率やマウスポインタの挙動、そして今回主役となる「スナップやグリッドのルール」を司るのが `Application.Settings` です。
ドキュメント(Document)やページ(Page)の個別の設定ではなく、Visioアプリケーション全体、あるいはドキュメント全体に影響を与える大元のアナトミー(構造)を握っています。
よく使う設定プロパティの一覧
コードを書く上で、まず押さえておくべき主要なプロパティがこちらです。
| プロパティ名 | 意味・役割 | 設定する値 |
| :— | :— | :— |
| `SnapEnabled` | スナップ機能自体のON/OFF | `True` または `False` |
| `SnapAngles` | 角度スナップの有効化 | `True` または `False` |
| `GridSpacing` | グリッドの描画間隔(例: 5mmなど) | 数値(内部単位で指定) |
| `SnapExtensions` | 補助線や他の図形へのスナップ拡張 | `True` または `False` |
—
3. 実践!環境を一発で同期する最強のセットアップコード
お待たせしました。ここからは、実際の現場でそのままコピペして使える、極上の実用コードをお見せします。
このコードは、現在のスナップ設定を安全にオフにした上で、ミリメートル単位でグリッドとスナップの精度を強制的に統一するプロシージャです。
Sub ForceSetupSnapAndGrid()
‘ =========================================================================
‘ 目的: Visioの作図補助設定(スナップ・グリッド)を開発者意図の精度に強制統一する
‘ 対象: 全てのVisio VBA初学者〜中級者
‘ =========================================================================
‘ エラーハンドリングの準備
On Error GoTo ErrorHandler
‘ 画面描画を一旦停止して処理を高速化
Application.ScreenUpdating = False
Dim visSettings As Visio.ApplicationSettings
Set visSettings = Application.Settings
‘ — 1. グリッドとスナップの基本方針を強制設定 —
‘ スナップ機能全体を一度「有効」にする(無効にしたい場合は False)
visSettings.SnapEnabled = True
‘ 図形同士の接続点へのスナップを有効にする
visSettings.SnapExtensions = visSnapExtensionGlueToConnectors
‘ — 2. グリッド間隔の高精度なセットアップ —
‘ ※Visioの内部単位は「インチ」ですが、VisualBasic側からmm単位で指定しやすくするため
‘ WorksheetFunctionやVisioのUnitFormulaUメソッドを使うのがスマートです。
‘ 例として「グリッド間隔を 5mm」に強制設定する
‘ ※Visioのデフォルト単位系を考慮し、文字列で単位を渡すのが最も確実です
ActiveDocument.Pages(1).PageSheet.CellsSRC(visSectionObject, visRowRulerGrid, visXGridSpacing).FormulaU = “5 mm”
ActiveDocument.Pages(1).PageSheet.CellsSRC(visSectionObject, visRowRulerGrid, visYGridSpacing).FormulaU = “5 mm”
‘ — 3. 完了メッセージ —
Application.ScreenUpdating = True
MsgBox “作図補助設定の強制セットアップが完了しました!”, vbInformation, “環境同期完了”
Exit Sub
ErrorHandler:
‘ 万が一のエラー時に画面描画を復旧させる
Application.ScreenUpdating = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub
—
4. コードの深掘り:初心者がハマりやすい「3つの罠」
上記のコードを読み解く上で、Visio VBA特有の「罠」についても触れておきましょう。ここを知っているかどうかが、プロのエンジニアかどうかの分かれ道です。
① `Application.Settings` と `Page` 設定の混同
先ほど紹介した `Application.Settings` は、「Visioアプリケーション全体」のデフォルト設定に近い挙動をします。しかし、グリッドの間隔(何mmごとに線を引くか)は、ページごとの設定(PageSheet)に保持されています。
そのため、アプリケーション設定でスナップを制御しつつ、ページの数式セル(`CellsSRC`)に対してダイレクトに “5 mm” と書き込む、というハイブリッドなアプローチが必要になるのです。
② 単位の罠(インチとミリメートル)
Visioのネイティブな内部単位は「インチ」です。コード内で単に `5` と書くと、環境によっては「5インチ(約127mm)」という巨大なグリッドになってしまい、阿鼻叫喚の地獄絵図になります。
必ずコード例のように `”5 mm”` のように文字列で単位を明示(UnitFormulaUを使用) するか、Visioの単位変換メソッドを通すようにしてください。
③ 画面描画のロック (`ScreenUpdating`)
大量の図形を配置したり、設定を一括変更したりするとき、Visioの画面がパカパカと再描画されると処理が極端に遅くなります。`Application.ScreenUpdating = False` で画面を黙らせ、処理が終わったら `True` に戻す。このお作法は実務ではマストです。
—
おわりに:ここをクリアすれば、もう怖くない!
今回は、`Application.Settings` とページ設定を組み合わせた、作図補助設定の動的書き換えについて解説しました。
「マクロを実行するたびに、自分の思い通りのキャンバス環境が秒速で構築される」――この快感を味わえるようになると、Visio VBAのコーディングが何倍も楽しく、そして頼もしいものに変わります。
環境に依存しない、堅牢で美しい自動化ツールをあなたの手で作り上げてください。
ここをクリアしたあなたなら、次のステップも余裕でバッチリです!次回の解説もお楽しみに!
