【入門編】Shape.ObjectTypeプロパティによる厳密な図形種別判定:Group・Foreign・Shape・Guideを安全に分岐処理するテクニック – Visio VBA解析バイブル

スポンサーリンク

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` を活用した「ページ内の全グループを一括解除し、特定の図形だけを抽出してリサイズする」といった、より実践的なテクニックをお届けします。

コードを書く楽しさを、存分に味わってください。応援しています。

タイトルとURLをコピーしました