Visio VBAの深淵へ:`DeleteEx`で操る「破壊と再生」の作法
こんにちは。Visioの世界へようこそ。
日々、自動化コードを書き殴っていると、ふと気づくはずです。「なぜ、図形を消すと線まで一緒に消えてしまうんだ?」あるいは「なぜ、線だけが残って残骸になるんだ?」と。
多くの初心者がここで躓き、`Shape.Delete`メソッドという「単なる破壊」に甘んじています。しかし、真のプロフェッショナルは違います。Visio 2013以降に実装された`Shape.DeleteEx`という「外科手術のような消去」を使いこなし、図面の整合性を完璧に制御しているのです。
今日は、あなたのコードを「ただ動くもの」から「壊れないもの」へと進化させる、その核心をお話しします。
—
1. なぜ「ただのDelete」では不十分なのか?
Visioの図形は、単なる絵ではありません。コネクタ(線)で繋がれ、コンテナ(枠)に収められ、相互に依存し合う「生き物」です。
従来の`Shape.Delete`を使うと、Visioは「この図形を消すなら、繋がっている線も不要だな」と気を利かせて全消去(あるいは中途半端な残骸化)を強行します。これは自動化において、往々にして「意図せぬ崩壊」を招きます。
ここで登場するのが`DeleteEx`です。このメソッドは、削除の際に「何を道連れにするか」を細かく指示できる、エンジニアの意志を反映するための道具なのです。
—
2. DeleteExメソッドの正体
`DeleteEx`の構文は非常にシンプルですが、その引数(オプション)に真髄があります。
‘ 構文の基本
Shape.DeleteEx(Flags As Integer)
この`Flags`に渡す数値が、削除の運命を決定づけます。よく使われる定数は以下の通りです。
- visDeleteNoFlags (0): 通常の削除。
- visDeleteNoHealConnectors (1): コネクタを削除せずに残す(これぞ真骨頂)。
- visDeleteNoContainerMembers (2): コンテナ内の図形を道連れにしない。
—
3. 実践:コネクタを「残して」図形だけを消すコード
例えば、フローチャートの特定のステップを削除したいが、その前後の矢印(コネクタ)は維持して、別の図形に繋ぎ直したい……そんな状況を想像してください。
Sub IntelligentDelete()
Dim shp As Visio.Shape
Dim vsoPage As Visio.Page
Set vsoPage = ActivePage
‘ 仮に名前が “Process_01” という図形を消す場合
Set shp = vsoPage.Shapes(“Process_01”)
‘ ここが重要!
‘ 1(visDeleteNoHealConnectors) を指定して、コネクタの破壊を防ぐ
‘ これにより、線はページ上に残り、後続のプログラムで再接続が可能になる
On Error Resume Next ‘ 万が一既に削除されている場合のエラー回避
shp.DeleteEx 1
If Err.Number = 0 Then
Debug.Print “図形を安全に削除しました。”
Else
Debug.Print “削除に失敗しました。”
End If
On Error GoTo 0
End Sub
なぜこのコードが「知的」なのか?
もしここで通常の`Delete`を使っていたら、コネクタは消失し、図面は断片化します。しかし`DeleteEx`を使えば、「図形という個体」だけを消去し、「コネクタという関係性」を維持することができます。これは、後続のオブジェクトを再配置する際に非常に強力なアドバンテージとなります。
—
4. 陥りやすい罠と解決策
初心者がよくやる間違いが、「削除対象のShapeオブジェクトを保持したままループを回す」ことです。
- エラーの正体: 削除した瞬間にそのオブジェクトはメモリから解放されます。その後に同じ変数にアクセスしようとすると、「オブジェクトが設定されていません」という悲しいエラー(Error 91)が発生します。
- 鉄則: 削除処理を行った直後は、必ず変数を `Nothing` にするか、ループ処理なら「後ろから消す」のが鉄則です。
‘ 悪い例:前から消すとインデックスがずれてバグる
‘ 良い例:コレクションの後ろから消す
For i = ActivePage.Shapes.Count To 1 Step -1
If ActivePage.Shapes(i).Name Like “Dummy” Then
ActivePage.Shapes(i).DeleteEx 1
End If
Next i
—
最後に:自動化は「破壊」の制御から始まる
Visio VBAにおける自動化のゴールは、単に図形を配置することではありません。「図面のライフサイクルを、プログラムを通じて完全に管理すること」です。
`DeleteEx`を使いこなすということは、図面の中の「つながり(関係性)」を尊重するということ。これは、大規模な設計図や複雑なインフラ構成図を扱うプロフェッショナルな現場では、不可欠なスキルです。
さあ、今日からあなたのコードに「知性」を組み込んでみてください。
ここをクリアすれば、あなたはもう「マクロの記録」に頼る初心者ではありません。Visioというキャンバスを意のままに操る、立派なオートメーション・アーキテクトです。
何かわからないことがあれば、またいつでも聞きに来てください。応援していますよ。
