【入門編】Visio VBAにおけるカスタムクラスモジュールの活用:Shapeオブジェクトをラップした独自業務クラスの設計 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAを「設計」する。Shapeをラップして業務を制御する極上の流儀

こんにちは。日々、自動化の迷宮を探索しているエンジニアの皆さん。

「マクロの記録」ボタンを押して生成された、あの長く、読み解くのに骨が折れるコードに疲弊していませんか?
`ActivePage.Shapes.ItemFromID(1).CellsU(“PinX”).Formula = “…”`

このようなコードがコードベースのあちこちに散らばった瞬間、そのシステムは「負債」へと変貌します。VisioのAPIは強力ですが、あまりにも直接的すぎます。私たちが扱うべきは「Shape」ではなく「業務上の意味を持ったオブジェクト(例:サーバー、タスク、工程)」であるべきなのです。

今回は、VBAの「クラスモジュール」を使い、VisioのShapeを隠蔽・抽象化して、保守性の高いコードを書くための「極意」を伝授します。

1. なぜ「クラスモジュール」なのか?

VBAのクラスモジュールを使う最大の理由は、「複雑さを境界線の向こう側に追い出す」ためです。

例えば、「サーバー」という図形を扱うとき、位置や色だけでなく、「IPアドレス」や「スペック」といった情報をShapeのセルの深淵に埋め込む必要があります。これをベタ書きすると、後で仕様が変わった瞬間に地獄を見ます。

クラスでラップすれば、メインのロジックは以下のようになります。

‘ 理想的なメイン処理
Dim myServer As ServerNode
Set myServer = New ServerNode
Set myServer.Shape = ActivePage.Shapes.ItemFromID(1)

‘ 内部のCellsU操作はすべてクラスが隠蔽してくれる
myServer.IPAddress = “192.168.1.1”
myServer.HighlightError

これができれば、コードは「何をしているか」が誰の目にも明らかになります。

2. 実装:Shapeをラップしたクラス「ServerNode」を作る

まずは、VBAプロジェクトに「クラスモジュール」を追加し、名前を `ServerNode` としてください。

‘ クラスモジュール: ServerNode
Option Explicit

Private m_shp As Visio.Shape

‘ Shapeをセットするためのプロパティ
Public Property Set Shape(ByVal shp As Visio.Shape)
Set m_shp = shp
End Property

‘ IPアドレスを書き込むプロパティ
Public Property Let IPAddress(ByVal value As String)
‘ User-defined cell “User.IP” に値を書き込むという複雑な操作を隠蔽
m_shp.CellsU(“User.IP”).Formula = “””” & value & “”””
End Property

‘ エラー時に赤くするメソッド
Public Sub HighlightError()
‘ 内部の複雑な色設定をメソッド名で抽象化
m_shp.CellsU(“FillForegnd”).Formula = “RGB(255,0,0)”
End Sub

このコードのポイント

  • カプセル化: `CellsU(“User.IP”)` なんていう呪文をメイン処理から追放しました。
  • 保守性: もしIPアドレスの保存先が「Prop.IP」に変更になった場合、変更するのはこのクラス内だけです。

3. 初学者が陥りやすい罠:オブジェクトの寿命と参照

クラスモジュールを使い始めると、必ず一度は遭遇する罠があります。それは「Shapeとクラスの同期」です。

VisioのShapeは、削除されたりIDが変わったりする「動的な存在」です。クラス側で `m_shp` を保持していても、元の図形が消えていれば `m_shp.Name` を叩いた瞬間にエラー(オートメーションエラー)が発生します。

対策:健全性チェックを入れる

クラス内に図形が有効かをチェックする関数を用意するのがプロの流儀です。

‘ クラス内のメソッド
Public Function IsValid() As Boolean
If m_shp Is Nothing Then
IsValid = False
Else
‘ IDが取得できれば、図形はまだそこに存在する
On Error Resume Next
Dim id As Long: id = m_shp.ID
IsValid = (Err.Number = 0)
On Error GoTo 0
End If
End Function

4. さあ、次のステップへ

ここをクリアすれば、あなたはもう「マクロ記録の奴隷」ではありません。

1. Shapeの操作をクラスに押し込める
2. ロジックを「Shape」から「業務語(タスク、サーバー、接続線)」に変換する
3. エラーハンドリングをクラスの境界線に配置する

この3ステップを意識するだけで、あなたのVisio VBAは劇的に、それこそ別次元の品質へと進化します。

「動けばいいコード」から「メンテナンスを愛せるコード」へ。
皆さんの自動化ライフが、より知的で美しいものになることを願っています。質問があれば、いつでも現場の知見を共有しましょう。

それでは、良いコーディングを!

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