こんにちは!Visio VBAの世界へようこそ。
図面作成の自動化を目指して「マクロの記録」から一歩踏み出そうとしているあなたを、心から歓迎します!
Visioの画面上で、バラバラに散らかった何十個もの図形(シェイプ)を、マウスでひとつひとつドラッグしてキレイに並べる……そんな不毛で途方もない作業に頭を悩ませたことはありませんか?
実は、Visio VBAの真価は「座標の数学的計算」と「一括配置」にあります。
この記事を読み終える頃には、あなたはVisioの座標系の仕組みを完璧に理解し、どんなに大量の図形でも一瞬で美しいグリッド(格子状)やフローチャート状に整列させる「極上の自動化コード」を書けるようになります。
ここをクリアすれば、Visio VBAの基本はバッチリですよ!一緒にマスターしていきましょう。
—
1. Visio座標系の「絶対ルール」:ExcelやWordとの決定的な違い
コードを書く前に、Visio特有の「空間のルール」を1つだけ覚えてください。ここを勘違いしていると、図形が明後日の方向に飛んでいってしまいます。
一般的な画像編集ソフトやExcelのセル座標は「左上」が原点(0,0)で、下に行くほどY座標が増加しますよね?
しかし、Visioの原点(0,0)は「左下」です。数学の x-y 座標平面とまったく同じ構造をしています。
【Visioの座標系】
(Y軸)
↑ 高 Y (ページの上へ)
│
│
(0,0) ───────→ (X軸) 高 X (ページの右へ)
(左下)
図形の位置を決める「PinX」と「PinY」
Visioでは、すべてのシェイプがShapeSheet(シェイプシート)という内部パラメータを持っています。図形の位置をコントロールするのは、主に以下の2つのセル(パラメータ)です。
- `PinX`:ページの原点(0,0)から見た、図形のピン(回転軸・基準点)の X座標(横位置)
- `PinY`:ページの原点(0,0)から見た、図形のピン(回転軸・基準点)の Y座標(縦位置)
※通常、図形のピンは「図形の中央」に設定されています(`LocPinX = Width 0.5`)。つまり、`PinX`/`PinY` を指定することは「図形の中心をページのどこに置くか」を指定することと同じです。
—
2. パフォーマンスを劇的に変える「アーキテクトの作法」
大量のシェイプをVBAで動かす際、初学者とプロのコードを分かつ決定的なポイントがあります。それが「画面更新の停止」と「Undoスコープの制御」です。
100個の図形を移動させるとき、VBAが1移動ごとに画面を描画(再計算)すると、画面がチラつき、処理に何秒もかかってしまいます。
‘ 1. 描画を止めて超高速化する
Visio.Application.ScreenUpdating = False
‘ 2. 万が一のやり直し(Ctrl+Z)を1回にまとめる
Dim undoScopeID As Long
undoScopeID = Visio.Application.BeginUndoScope(“自動整列”)
‘ ─── ここで整列処理を行う ───
‘ 3. 後処理(元に戻す)
Visio.Application.EndUndoScope undoScopeID, True
Visio.Application.ScreenUpdating = True
この「プロの仕込み」をコードに含めるだけで、処理速度は数十倍になり、ユーザー体験も極上になります。
—
3. 実践アルゴリズム:グリッド自動整列の数学
今回は、選択した複数のシェイプを取得し、指定した列数(例:4列)で綺麗に整列させる「グリッド配置アルゴリズム」を組みます。
計算の考え方
選択した図形に `0` から始まるインデックス(順番 `i`)を振ります。
1. 列番号(Column) = `i Mod 列数` (余りを求める)
2. 行番号(Row) = `i \ 列数` (商を求める整数割り算)
3. X座標 = `開始X + (列番号 横間隔)`
4. Y座標 = `開始Y – (行番号 縦間隔)` ← ※下に向かうので引き算!
このシンプルな算数が、Visio VBAにおけるレイアウト自動化の核(コア)となります。
—
4. 完全版VBAコード(コピペ&そのまま使える!)
標準モジュールに以下のコードを貼り付けて試してみてください。
配置したい図形をマウスで複数選択してから実行(F5)します。
Option Explicit
”’
”’
Public Sub AlignSelectedShapesToGrid()
‘ Visioオブジェクトの宣言(ライフサイクルを意識)
Dim visApp As Visio.Application
Dim visSelection As Visio.Selection
Dim targetShape As Visio.Shape
Set visApp = Visio.Application
Set visSelection = visApp.ActiveWindow.Selection
‘ ガード節:何も選択されていない場合は安全に処理を抜ける
If visSelection.Count = 0 Then
MsgBox “整列させたい図形を1つ以上選択してください。”, vbExclamation, “処理中断”
Exit Sub
End If
‘ — レイアウトパラメータの設定 (単位: mm を意識) —
Dim cols As Long
Dim startX_mm As Double
Dim startY_mm As Double
Dim gapX_mm As Double
Dim gapY_mm As Double
cols = 4 ‘ 1行あたりに並べる列数
startX_mm = 40# ‘ 配置開始位置のX座標 (左端からの距離 mm)
startY_mm = 250# ‘ 配置開始位置のY座標 (下端からの距離 mm)
gapX_mm = 40# ‘ 図形同士の横間隔 (mm)
gapY_mm = 30# ‘ 図形同士の縦間隔 (mm)
‘ — パフォーマンス最適化の開始 —
visApp.ScreenUpdating = False
Dim undoScopeID As Long
undoScopeID = visApp.BeginUndoScope(“図形のグリッド整列”)
On Error GoTo ErrorHandler
‘ — 座標計算と一括配置ループ —
Dim i As Long
Dim colIndex As Long
Dim rowIndex As Long
Dim posX_mm As Double
Dim posY_mm As Double
‘ 選択された各シェイプに対してループ処理
For i = 1 To visSelection.Count
‘ Selectionのインデックスは 1 から始まります
Set targetShape = visSelection.Item(i)
‘ 0始まりのインデックスで配列の位置(行・列)を算出
Dim zeroBasedIndex As Long
zeroBasedIndex = i – 1
colIndex = zeroBasedIndex Mod cols ‘ 列番号 (0, 1, 2, 3)
rowIndex = zeroBasedIndex \ cols ‘ 行番号 (0, 0, 0, 0, 1, 1…)
‘ 座標の計算
posX_mm = startX_mm + (colIndex gapX_mm)
posY_mm = startY_mm – (rowIndex gapY_mm) ‘ Y軸は下方向へ進むためマイナス
‘ 【重要】VisioのShapeSheetセルへ値をセットする
‘ FormulaU プロパティを使い、単位付きの数式文字列として書き込むのが最も安全・確実です
targetShape.Cells(“PinX”).FormulaU = posX_mm & ” mm”
targetShape.Cells(“PinY”).FormulaU = posY_mm & ” mm”
Next i
CleanUp:
‘ — パフォーマンス最適化の終了(後処理) —
visApp.EndUndoScope undoScopeID, True
visApp.ScreenUpdating = True
MsgBox visSelection.Count & ” 個の図形を整列させました!”, vbInformation, “完了”
Exit Sub
ErrorHandler:
‘ エラーが発生した場合も画面更新を必ず再開させるのがプロの設計です
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Resume CleanUp
End Sub
—
5. 初学者がハマりやすい「3つの罠」と回避策
このコードを書いていく中で、初心者が必ずと言っていいほどぶつかる壁があります。あらかじめ解説しておきますね。
罠①:単位の壁(Inches vs mm)
Visioの内部処理(`ResultIU`などの内部単位)は、実は「インチ(Inches)」で管理されています。
VBAから単に `targetShape.Cells(“PinX”).ResultIU = 50` と書くと「50インチ(約127cm)」として扱われ、画面外に図形が消し飛びます。
- 回避策: 上記コードのように `.FormulaU = “50 mm”` と明示的に単位文字列を入れて書き込むのが最も間違いなく安全です。
罠②:Y座標の「逆転」による逆走
計算式で `posY = startY + (rowIndex gapY)` と足し算にしてしまうと、行が進むほど図形が「上に向かって」重なっていきます。
- 回避策: 「下へ並べる=Y座標は減る」ので、必ずマイナス(引き算)にします。
罠③:グループ化された図形の扱い
グループ図形の中にある「内部シェイプ」の `PinX` を書き換えようとすると、ページの座標ではなく「親グループ内の相対座標」として扱われ、レイアウトが崩れることがあります。
- 回避策: 最初は「ページに直接置かれた最上位のシェイプ」を選択して整列させる運用から始めましょう。
—
まとめ:マスターへの道
お疲れ様でした!今回のポイントを振り返りましょう。
1. Visioの原点(0,0)は左下にある(Y軸は上がプラス、下がマイナス)
2. 図形の位置は `Cells(“PinX”)` と `Cells(“PinY”)` で制御する
3. 値を入れるときは `”50 mm”` のように単位を明確に記述する
4. `ScreenUpdating = False` と `UndoScope` でプロ並みの超高速処理にする
この基礎さえ押さえてしまえば、余白の自動計算や、接続線(コネクタ)を使ったフローチャートの完全自動生成など、高度な自動化の世界が一気に開けます。
「手動でちまちま並べていた作業が、ボタン一発で一瞬で終わる」
この感動を、ぜひご自身のVisioで体感してくださいね。ここをクリアしたあなたなら、Visio VBAの基礎はもうバッチリです!
