こんにちは! Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身は何をしているのかサっぱり…」という状態から抜け出し、自分の手でロジックを組み上げたいと思っていませんか?
今回は、Visio VBAの基礎のキモであるオブジェクトモデル(Application / Document / Page / Shape)を総動員し、実務で誰もが一度は頭を抱える「画像シェイプの縦横比崩れ問題」を華麗に解決する全自動ツールの作り方を解説します。
ここをクリアすれば、Visio VBAの基本構造と、プロっぽく動かすための「本質」はバッチリ掴めますよ。一緒にマスターしていきましょう!
—
1. 現場の悲劇:なぜ画像の縦横比は勝手に崩れるのか?
Visioの図面にCAD図面や写真、スクリーンショット(PNGやJPEG)をポンと貼り付けると、レイアウトの都合でついついマウスで四隅を引き延ばしてしまいがちです。その結果、
- 「人が横に引き伸ばされて太って見える」
- 「製品のロゴが縦に潰れている」
といった、資料としてはちょっと恥ずかしい「アスペクト比(縦横比)の崩壊」が起きてしまいます。これを手動で一つひとつ元のサイズに戻すのは、地獄のような単純作業です。
「なら、VBAで一発で元の正しい比率に戻そう!」
そう思ったとき、あなたを待ち受けるのが Visio VBA 特有の壁、「シェイプの正体を見極める技術」です。
—
2. Visio VBAの骨組み:オブジェクトモデルの階層を理解する
VisioのVBAを書くときは、今自分が「どの階層(オブジェクト)」を触っているのかを頭の中でイメージすることが最も重要です。
Application (Visioアプリそのもの)
┗ Documents (開いている図面たち)
┗ Document (対象の図面)
┗ Pages (ページたち)
┗ Page (作業中のページ)
┗ Shapes (シェイプたち)
┗ Shape (個々の図形や画像)
今回のツールでは、この階層を上から順に辿っていきます。
「いまアクティブなページにある全シェイプを走査し、それが『画像』だったら、正しいサイズにリセットする」というアルゴリズムを組み立てます。
—
3. 核心:`Shape.ForeignType` で画像の正体を暴く
Visioにおいて、画像(BMP, PNG, JPEGなど)はただの「四角い図形(Rectangle)」ではありません。外部から取り込まれたデータ、すなわち「外国(Foreign)のデータオブジェクト」として扱われます。
ここで登場するのが、今回の主役である `Shape.ForeignType` プロパティです。
シェイプが画像データである場合、`ForeignType` は特定の定数(Visioの内部コード)を返します。さらに、画像シェイプの幅(Width)と高さ(Height)の背後には、「インポートされた瞬間のオリジナルのサイズ(WidthForeign / HeightForeign)」というプロパティがこっそり隠されています。
この仕組みを利用して、「現在のサイズ」を無視し、「本来の比率(Foreign)」に強制アジャストするコードを書いていきます。
—
4. 実装:アスペクト比自動修復マクロの全コード
以下のコードを、VisioのVBAエディタ([開発]タブ > [Visual Basic])の標準モジュールに貼り付けてください。
Sub ResetAllImagesToOriginalAspectRatio()
‘ =====================================================================
‘ 概要: ページ上のすべての画像シェイプの縦横比を検出し、
‘ 歪んだサイズを元の正しいアスペクト比に自動リセットする
‘ =====================================================================
Dim vsoPage As Visio.Page
Dim vsoShape As Visio.Shape
Dim correctedCount As Long
‘ 1. エラーハンドリングの準備
On Error GoTo ErrorHandler
‘ 2. 現在アクティブなページを取得 (Application -> Document -> Page)
Set vsoPage = ActivePage
correctedCount = 0
‘ 3. 画面描画を停止してマクロの実行速度を爆発的に上げる(お作法)
ActiveWindow.ScreenUpdating = False
‘ 4. ページ内の全シェイプをループ処理 (For Each構文)
For Each vsoShape in vsoPage.Shapes
‘ 5. シェイプが「画像(Foreign Object)」であるか判定
‘ ※ Visioでは画像は VisTypeForeign として扱われます
If vsoShape.Type = visTypeForeign Then
‘ ForeignTypeをチェックし、画像データ(Bitmap/Metafile等)か確認
‘ visForeignTypeBitmap (1) や visForeignTypeMetafile 等が含まれます
Select Case vsoShape.ForeignType
Case visForeignTypeBitmap, visForeignTypeMetafile, visForeignTypeNative
‘ 【ここが本質】
‘ WidthForeign / HeightForeign は、インポートされた時点の「元サイズ」を持っています。
‘ 現在の「高さ(Height)」を基準にして、元の縦横比を維持した「正しい幅」を再計算します。
Dim originalRatio As Double
Dim currentHeight As Double
‘ ゼロ除算エラーを防ぐためのガード
If vsoShape.HeightForeign > 0 And vsoShape.WidthForeign > 0 Then
‘ 元の縦横比(幅 ÷ 高さ)を算出
originalRatio = vsoShape.WidthForeign / vsoShape.HeightForeign
‘ 現在の高さをもとに、正しい幅を再設定
currentHeight = vsoShape.Cells(“Height”).ResultIU
vsoShape.Cells(“Width”).ResultIU = currentHeight originalRatio
correctedCount = correctedCount + 1
End If
End Select
End If
Next vsoShape
‘ 6. 画面描画を再開
ActiveWindow.ScreenUpdating = True
‘ 完了メッセージ
MsgBox “処理が完了しました。” & vbCrLf & _
“修正された画像シェイプの数: ” & correctedCount & “個”, _
vbInformation, “Visio VBA 自動化エンジン”
Exit Sub
ErrorHandler:
‘ 万が一のエラー時に画面描画がフリーズするのを防ぐ
ActiveWindow.ScreenUpdating = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub
—
5. コードの重要ポイント解説
初心者のうちは、次の3つのポイントを意識するだけでVisio VBAの解像度がグッと上がります。
1. `ActiveWindow.ScreenUpdating = False` の魔法
シェイプの数が多い図面でVBAを走らせると、画面がチラつき、処理速度が極端に落ちます。処理の最初に画面描画を止め、最後に `True` に戻すのは、プロのエンジニアが必ず仕込む定石です。
2. `vsoShape.Type = visTypeForeign` でふるいにかける
四角形やコネクタ、ステンシル図形など、Visioには様々なシェイプがいます。画像だけをピンポイントで狙い撃つために、この「異物(Foreign)判定」が強力なフィルターになります。
3. `Cells(“Width”).ResultIU` による正確なサイズ操作
サイズを変更するとき、単に `vsoShape.Width = …` と書くこともできますが、Visioの内部シェイプシート(ShapeSheet)のセルを直接叩く `Cells().ResultIU` を使う方が、単位(インチやミリメートル)の混乱を防ぎ、意図した通りに確実に動きます。
—
6. まとめと次のステップ
今回は、`Shape.ForeignType` と元の比率を保持するプロパティを活用して、歪んだ画像を美しく自動修復するツールを作成しました。
- Application > Document > Page > Shape というオブジェクトの親子関係。
- 画像をただの図形ではなく `Foreign Object` として捉える視点。
- 実務で必須の 画面描画抑制(ScreenUpdating) のテクニック。
これらを理解できたあなたは、もう単なる「マクロの記録の利用者」ではありません。立派なVisio VBAエンジニアの第一歩を踏み出しています。
「選択した特定の画像だけ直したい」「ドキュメント全体の全ページを巡回させたい」など、ここからさらに応用を利かせるのはあなた次第です。ぜひ自分の業務に合わせてカスタマイズしてみてくださいね。
それでは、快適な自動化ライフを!
