Visio VBAの深淵へ:Shapeの「1D/2D判定」で自動化を極める
こんにちは。業務自動化の最前線へようこそ。
Visio VBAの世界に足を踏み入れたばかりの頃、多くの人が「なぜか思うように図形が選べない」「コネクタだけを操作したいのに、四角形まで巻き込んでエラーになる」という壁に突き当たります。
マクロの記録ボタンを押して生成されたコードは、いわば「その場限りのメモ書き」。現場で耐えうる堅牢なシステムを構築するには、Visioが図形をどう見ているか、その「本質」を知る必要があります。
今日は、Visio自動化の第一歩であり、かつ奥義でもある「OneD/TwoDプロパティによる厳密な図形判定」について、その心髄をお話ししましょう。
—
なぜ「名前」で判断してはいけないのか?
初学者が陥りやすい罠が、`If Shape.Name = “コネクタ” Then` のような文字列判定です。
しかし、現場のVisio図面は、ユーザーが名前を変更したり、グループ化されたり、マスターシェイプから派生したりと、名前は極めて不安定な指標です。
Visioのエンジンは、図形を「1次元(1D)」か「2次元(2D)」かという構造的な特性で厳格に管理しています。これこそが、プログラムが最も信頼できる「真実」なのです。
- 1Dシェイプ: 始点と終点を持つもの(コネクタ、線、矢印など)。
- 2Dシェイプ: 閉じた領域を持つもの(四角形、円、アイコン、グループ化された図形など)。
—
堅牢な判定ロジックの実装
それでは、実際に「コネクタだけを安全に抽出する」ためのコードを見ていきましょう。ただ動くだけでなく、メモリ管理を意識した美しい実装です。
Sub IdentifyShapesCorrectly()
Dim vsoPage As Visio.Page
Dim vsoShape As Visio.Shape
‘ アクティブなページを取得
Set vsoPage = ActivePage
‘ ページ内の全シェイプを走査
For Each vsoShape In vsoPage.Shapes
‘ 【ここが核心】OneDプロパティでの判定
‘ 0なら2D(枠)、1なら1D(コネクタ・線)と判定します
If vsoShape.OneD Then
Debug.Print “発見:1Dシェイプ(コネクタ等): ” & vsoShape.Name
‘ ここにコネクタに対する処理を記述
Else
Debug.Print “発見:2Dシェイプ(枠・アイコン等): ” & vsoShape.Name
‘ ここに枠に対する処理を記述
End If
Next vsoShape
‘ オブジェクトの解放(メモリのクリーンアップ)
Set vsoShape = Nothing
Set vsoPage = Nothing
End Sub
このコードの「プロのこだわり」
1. プロパティの直感的な利用: `vsoShape.OneD` は真偽値(Boolean)を返します。`If vsoShape.OneD = True Then` と書くよりも、`If vsoShape.OneD Then` と書くのがVisio VBAの作法です。
2. 型指定の重要性: `Dim vsoShape As Visio.Shape` と型を明示することで、IntelliSense(入力補完)が働き、開発効率が劇的に向上します。
3. オブジェクトの解放: 小規模なマクロでは省略されがちですが、`Set vsoShape = Nothing` を行う習慣は、大規模な自動化システムを組む際のメモリリークを防ぐための「礼儀」です。
—
よくあるエラーと対処法
Q: グループ化された図形はどう判定されるの?
A: グループ化された図形は、たとえ中にコネクタが含まれていても、親シェイプとしては「2Dシェイプ」として扱われます。もしグループの中身まで触りたい場合は、`vsoShape.Type` プロパティと再帰処理を組み合わせる必要があります。まずはこの「1D/2D判定」をマスターしてから、次のステップへ進みましょう。
Q: なぜかエラーが出る!
A: 最も多いエラーは「ページに何も図形がない時にループを回してエラーになる」ケースや、「保護(ロック)された図形を操作しようとして弾かれる」ケースです。処理の冒頭に `If vsoPage.Shapes.Count > 0 Then` といったガード節を入れる癖をつけると、より堅牢なプログラムになります。
—
先輩エンジニアからのメッセージ
自動化とは、単に作業を短縮することではありません。「Visioの内部構造を理解し、そのルールに沿って指示を出す」という対話のプロセスです。
`OneD` プロパティを使いこなせるようになれば、あなたのマクロは「動けばいいコード」から「保守可能な資産」へと進化します。
まずはこのコードをVBE(Visual Basic Editor)に貼り付けて、お手元の図面で試してみてください。図形たちが「1Dなのか、2Dなのか」を瞬時に見分ける感覚を掴めれば、もうあなたはVisio VBAの基礎を完全に卒業したと言えるでしょう。
何か行き詰まったら、いつでも戻ってきてください。私たちは常に、自動化の先にある「より創造的な時間」のためにコードを書いています。応援していますよ。
