Visio VBAの深淵へ:Shape.ObjectTypeで「図形の正体」を確実に見抜く技術
こんにちは。自動化の海を渡るエンジニアの皆さん。
Visio VBAの世界に足を踏み入れたとき、多くの人が「マクロの記録」で生成されたコードが、なぜか少し複雑な図形になると途端に動かなくなる……という壁にぶつかります。
その原因の9割は、「Visioが、目の前の図形を『ただのShape』としか見ていないこと」にあります。
Visioの図形には、グループ、外部オブジェクト(画像やCADデータ)、ガイド線など、それぞれ「性格」が異なります。これらを同じ土俵で扱おうとすると、APIは即座にエラーを吐き出します。今日は、Visioのオブジェクトモデルを掌握するための鍵、『ObjectTypeプロパティ』による安全な分岐処理を伝授しましょう。
—
1. なぜ「Shape」だけでは不十分なのか?
Visioの `Shape` オブジェクトは、いわば「何にでも化けられる魔法の器」です。しかし、中身が「グループ」なのか「ただの四角形」なのかで、できることは大きく変わります。
例えば、グループ図形に対して「テキストを入力する」という命令を出そうとすると、Visioは混乱します。「グループそのものに書くのか? それとも中の図形に書くのか?」と。ここで `ObjectType` を使ったガード(事前チェック)が重要になるのです。
Visioが持つ主な「顔」 (ObjectType)
- visTypeShape (1): 通常の図形(四角や丸など)。
- visTypeGroup (2): 図形がまとまったグループ。
- visTypeForeign (3): 外部オブジェクト(画像、CAD、OLEオブジェクトなど)。
- visTypeGuide (4): ガイド線。
—
2. 安全な分岐処理:実装のテンプレート
現場でトラブルを起こさないために、必ずこの「ガード節」のパターンを身につけてください。複雑な処理を書く前に、まずは「相手が何者か」を確認するのです。
Public Sub AnalyzeSelectedShapes()
Dim shp As Visio.Shape
‘ 選択している図形を一つずつ確認する
For Each shp In ActiveWindow.Selection
Select Case shp.ObjectType
Case Visio.VisObjectType.visTypeShape
Debug.Print “普通の図形ですね。操作可能です。”
‘ ここに通常のプロパティ操作を記述
Case Visio.VisObjectType.visTypeGroup
Debug.Print “グループ化されています。再帰処理が必要かもしれません。”
‘ shp.Shapes で中の図形にアクセス可能
Case Visio.VisObjectType.visTypeForeign
Debug.Print “外部オブジェクトです。画像データなどを含みます。”
‘ ForeignTypeプロパティでさらに詳細な判定が可能
Case Visio.VisObjectType.visTypeGuide
Debug.Print “ガイド線です。これは操作対象から除外すべきです。”
‘ ガイド線を誤って移動させないためのガード
Case Else
Debug.Print “未知のオブジェクトタイプ: ” & shp.ObjectType
End Select
Next shp
End Sub
—
3. ここをクリアすれば中級者!:陥りやすい罠
罠1:Foreignオブジェクトの罠
`visTypeForeign` は非常に強力ですが、扱いには注意が必要です。例えば、図形の中に配置された画像ファイル(ビットマップ)などがこれに当たります。これに `shp.Text` を設定しようとすると、Visioは「画像に文字は書けません」とエラーを返します。`ObjectType` で事前に `visTypeForeign` を弾くことで、この予期せぬクラッシュを防げます。
罠2:グループの中の「入れ子」
グループの中にさらにグループがある場合、`shp.Shapes.Count` を使って再帰的に処理する必要があります。`ObjectType` で `visTypeGroup` を検知したら、その中でさらにループを回す……という構造を組むだけで、あなたの自動化ツールは「プロレベル」の堅牢性を手に入れます。
—
4. チーフアーキテクトからのアドバイス
「マクロの記録」はあくまでもVisioがどう動いているかのヒントに過ぎません。本当に高度な自動化を実現するには、今回お話ししたように「プログラムが操作対象をどう認識しているか」を制御する力が不可欠です。
- 「何でもできる」と過信しない: 常に `ObjectType` で相手の素性を確認する。
- エラーは未然に防ぐ: 実行時エラーで止めるのではなく、処理対象外なら静かにスキップする。
この2点を徹底するだけで、あなたの書くVisio VBAは、誰が使っても落ちない「堅牢なツール」へと進化します。
「ここをクリアすれば、Visio VBAの基本はバッチリですよ」。
次回の記事では、この `ObjectType` を活用した「ページ内の全グループを一括解除し、特定の図形だけを抽出してリサイズする」といった、より実践的なテクニックをお届けします。
コードを書く楽しさを、存分に味わってください。応援しています。
