こんにちは! Visio VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身がよくわからない……」というモヤモヤを抱えていませんか? 大丈夫、ここをクリアすればVisio VBAの基本とオブジェクトモデルの本質はバッチリです。
今回は、自動生成や修正のたびに端っこへ追いやられてしまった図形たちを、一瞬で美しくキャンバスの中央へ連れ戻す『Page.CenterDrawing』という極上のメソッドを取り上げます。
単なるメソッドの紹介にとどまらず、プロのエンジニアが現場で使う「オブジェクトの階層構造」の意識や、思わぬ罠を回避する知見まで、優しく徹底的に解説していきますね。
—
1. なぜ図面の中央寄せでつまずくのか?(Visioの座標系の罠)
Visioで図面を描いていると、こんな経験はありませんか?
- プログラムで図形を追加したら、ページのはるか右上に偏ってしまった
- 印刷プレビューを見たら、左上に寄っていてカッコ悪い
初心者の頃は、「じゃあ、全図形を選択してマウスでドラッグして……」とやりたくなりますが、それをコードでやろうとすると泥沼にハマります。なぜなら、Visioのページ(Page)と図形(Shape)は、それぞれが全く異なる座標系を持っているからです。
ここで登場するのが、今回主役の `Page.CenterDrawing` メソッド です。
こいつは、ページ上に存在するすべての図形のバウンディングボックス(外接矩形)を計算し、「うまい具合にページの中央へ配置し直す」という計算をバックグラウンドで一瞬で行ってくれる、非常に賢い子なんです。
—
2. Visioオブジェクトモデルの基本階層を理解する
コードを書く前に、Visioの「世界観」を頭に叩き込みましょう。Visio VBAのオブジェクトは、マトリョーシカのように綺麗に入れ子構造になっています。
Application (Visioアプリ全体)
┗ Documents (開いている図面たち)
┗ Document (いま作業しているファイル)
┗ Pages (ページたち)
┗ Page (いま見ているページ)
┗ Shapes (ページ上の図形たち)
私たちが操作したい「描画領域(Page)」は、Documentの中に複数存在し、そのPageの中にさらにShapeたちが存在しています。
`CenterDrawing` は、まさにこの `Page` オブジェクトに対して命令するメソッド です。
—
3. 実践!図面全体を自動中央寄せするマクロ
それでは、実際に動かせるコードを見てみましょう。
以下のコードは、現在アクティブなページの図形群を自動的に解析し、綺麗に中央へ配置するプロシージャです。開発環境(VBE)の標準モジュールにそのまま貼り付けて実行できます。
Option Explicit
Public Sub AutoCenterDrawing()
‘ 変数の宣言(型を明確にするのがプロの作法です)
Dim vsoPage As Visio.Page
‘ 1. 現在アクティブなページを取得する
Set vsoPage = ActivePage
‘ エラーハンドリング:もしページ上に図形が一つもなければ処理をスキップ
If vsoPage.Shapes.Count = 0 Then
MsgBox “ページ上に図形が存在しません。”, vbExclamation, “中央寄せエラー”
Exit Sub
End If
‘ 2. 画面の再描画をロックしてパフォーマンスを爆発的に上げる(お作法)
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
‘ ==========================================
‘ 3. 核心:CenterDrawingメソッドの実行
‘ ==========================================
vsoPage.CenterDrawing
‘ 画面の再描画を復元
Application.ScreenUpdating = True
MsgBox “図面の中央寄せが完了しました!”, vbInformation, “成功”
Exit Sub
ErrorHandler:
‘ エラー時のクリーンアップ
Application.ScreenUpdating = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Sub
コードのここがポイント!
- `ActivePage`: 今ユーザーが画面で見ているページをピンポイントで取得しています。
- `vsoPage.Shapes.Count = 0` のチェック: 図形が1つもない状態で `CenterDrawing` を呼ぶと、Visioが混乱してランタイムエラーを起こすことがあります。こうした「空振り防衛策」を入れるのが実務エンジニアの鉄則です。
- `Application.ScreenUpdating = False`: 描画のたびに画面がチラつくのを防ぎ、処理速度を劇的に向上させるためのテクニックです。
—
4. 現場でありがち!陥りやすい罠と解決策
`CenterDrawing` は非常に便利な反面、知っておかないとハマる「落とし穴」があります。ここを知っているかどうかが、マクロの記録レベルを脱却できたかどうかの分水嶺です。
罠1:「グループ化された図形」の端っこが基準になる
`CenterDrawing` は、ページ上の「すべてのトップレベル図形」のバウンディングボックスを計算します。
もし、ページからはるか離れた場所に「見えないゴミ図形(消し忘れの小さな点など)」がポツンと残っていると、Visioはそのゴミも含めて全体の中央を計算してしまいます。
- 対策: 実行する前に、意図しない孤立した図形やロックされた不要なガイド図形がないか確認しましょう。
罠2: 実行したのに位置が変わらない?
ページサイズ(用紙の向きや寸法)を変更した直後に `CenterDrawing` を呼ぶと、レイアウト計算のタイミングがズレて一発で中央にこない場合があります。
- 対策: 必要に応じて `vsoPage.ResizeToFitContents`(図形の内容に合わせてページサイズを自動調整するメソッド)を事前に実行し、その後に `CenterDrawing` を呼ぶと、完璧なレイアウトが手に入ります。
—
おわりに:ここをクリアすれば、Visio VBAは怖くない!
今回は `Page.CenterDrawing` を通して、Visioのオブジェクト構造と、実務で使える堅牢なコードの書き方をお伝えしました。
「オブジェクトを取得し、状態をチェックし、適切なメソッドを叩く」
この基本のサイクルさえ体に染み込めば、どんなに複雑な図面の自動化であっても怖くありません。ぜひあなたの業務自動化ツールにこのコードを組み込んで、ワンランク上のVisioライフを満喫してください。
それでは、また次回の極限の知見でお会いしましょう!
