こんにちは! Visio VBAの奥深い世界へようこそ。
マクロの記録ボタンを押して、生成された呪文のようなコードを眺める段階はもう卒業しましたね。おめでとうございます。ここから先は、ただ図形を動かすだけではなく、「Visioの中にあなただけのビジネス世界を構築する」という、最高にエキサイティングな領域です。
今回は、プログラミング初学者の方から「マクロ職人」を脱却したい方に向けて、Visio VBAで最も強力な武器の一つ「Shapeオブジェクトをラップした独自業務オブジェクトの作り方」を伝授します。
ここをクリアすれば、あなたのVisioツールは一気に保守性が高く、拡張性のある「本物のソフトウェア」に生まれ変わります。さあ、一緒に扉を開けましょう!
—
なぜ、素のShapeオブジェクトだけでは限界が来るのか?
Visioで業務ツール(ネットワーク図、座席表、プラント設計図など)を作るとき、図形(Shape)には様々な「意味」を持たせますよね。「この四角形はサーバーだから、IPアドレスと型番を持たせたい」「この丸は社員だから、氏名と部署を持たせたい」。
素のVBAだと、これを実現するためにこう書きたくなります。
‘ 素のShapeオブジェクトに無理やりデータを詰め込む悪魔のスタイル
myShape.CellsU(“User.ModelNumber”).FormulaU = “””SR-2023″””
myShape.CellsU(“User.Price”).FormulaU = “150000”
…これ、大規模な図面になると地獄を見ます。プロパティ名が変わったときの修正漏れ、タイポによる実行時エラー、そして何よりコードが「何をやっているのか分からないスパゲッティ」になってしまいます。
解決策:クラスモジュールで「ラップ(包み込む)」する
オブジェクト指向の考え方を使いましょう。
標準の`Shape`オブジェクトを中身に隠し(カプセル化)、外側には「ITAsset(IT資産)」という分かりやすい専用のプロパティ(ModelNumberやPrice)を持ったクラスを被せるのです。
[ あなたの書くVBAコード ]
↓ 操作する
[ ITAsset クラス(自作) ] ← 価格、型番、検証状態を安全に管理!
↓ 連動する
[ Visioの標準 Shape オブジェクト ]
この設計を手に入れた瞬間、あなたのVBAコードの質は劇的に跳ね上がります。
—
実践!業務オブジェクト構築の4ステップ
それでは、実際に手を動かして「価格」と「型番」を持つ機器シェイプのクラスを作ってみましょう。
ステップ1:クラスモジュールの挿入と名前の変更
1. VBAエディタ(Alt + F11)を開きます。
2. メニューの「挿入」>「クラス モジュール」をクリックします。
3. プロパティウィンドウで、このモジュールの名前を `ClsITAsset` に変更します。(※ここが超重要!)
ステップ2:クラスモジュールにコードを書き込む
`ClsITAsset` の中身を以下のように記述します。これが「ラップ」の正体です。
Option Explicit
‘ — プライベート変数(内部で保持するデータ) —
Private m_VisioShape As Visio.Shape
‘ — 初期化(インスタンス生成時に呼ばれる) —
Public Sub Init(targetShape As Visio.Shape)
Set m_VisioShape = targetShape
End Sub
‘ — 外部から見せるプロパティ:型番 (ModelNumber) —
Public Property Get ModelNumber() As String
‘ Visioのシェイプシート(User.ModelNumber)から値を取得
On Error Resume Next
ModelNumber = m_VisioShape.CellsU(“User.ModelNumber”).ResultStr(visNoCast)
If Err.Number <> 0 Then ModelNumber = “未設定”
On Error GoTo 0
End Property
Public Property Let ModelNumber(ByVal value As String)
‘ シェイプシートに値を書き込む
If m_VisioShape.CellExistsU(“User.ModelNumber”, visExistsAnywhere) = False Then
m_VisioShape.AddNamedRow visSectionUser, “ModelNumber”, 0
End If
m_VisioShape.CellsU(“User.ModelNumber”).FormulaU = “””” & value & “”””
End Property
‘ — 外部から見せるプロパティ:価格 (Price) —
Public Property Get Price() As Double
On Error Resume Next
Price = m_VisioShape.CellsU(“User.Price”).ResultIU
If Err.Number <> 0 Then Price = 0
On Error GoTo 0
End Property
Public Property Let Price(ByVal value As Double)
If m_VisioShape.CellExistsU(“User.Price”, visExistsAnywhere) = False Then
m_VisioShape.AddNamedRow visSectionUser, “Price”, 0
End If
m_VisioShape.CellsU(“User.Price.Value”).FormulaU = value
End Property
‘ — 業務メソッド:この機器の正当性を検証する —
Public Function ValidateAsset() As Boolean
If Me.Price > 0 And Me.ModelNumber <> “未設定” Then
ValidateAsset = True
Else
ValidateAsset = False
End If
End Function
💡 ここがエンジニアの知見:
Visioのシェイプシート(`User`セクションなど)をデータ置き場として利用しつつ、クラスモジュールの `Property Let/Get` でラップしています。これにより、VBA側からはただの「変数」を扱うような感覚で、Visioの複雑なセルの操作を隠蔽できるのです。
—
ステップ3:標準モジュールから呼び出してみる
次に、標準モジュール(`Module1`など)を挿入し、先ほど作ったクラスを実際に動かしてみましょう。アクティブページで選択している図形を対象にします。
Option Explicit
Sub TestCreateAssetObject()
Dim shp As Visio.Shape
‘ 1. 選択している図形があるかチェック
If ActiveWindow.Selection.Count = 0 Then
MsgBox “対象の図形を選択してください。”, vbExclamation
Exit Sub
End If
Set shp = ActiveWindow.Selection(1)
‘ 2. 自作クラスのインスタンスを生成し、Shapeを渡してラップする
Dim asset As New ClsITAsset
asset.Init shp
‘ 3. プロパティに値を代入してみる(シェイプシートに自動書き込みされる)
asset.ModelNumber = “SW-CORE-01”
asset.Price = 250000
‘ 4. 取得(Get)とメソッドのテスト
Dim msg As String
msg = “【設定完了】” & vbCrLf & _
“型番: ” & asset.ModelNumber & vbCrLf & _
“価格: ¥ ” & Format(asset.Price, “#,
0″) & vbCrLf & _
“検証結果: ” & IIf(asset.ValidateAsset(), “OK (正常)”, “NG (要確認)”)
MsgBox msg, vbInformation, “業務オブジェクトのテスト”
End Sub
—
陥りやすい罠と、プロが教える注意点
ここで、Visio VBAでクラスを使うときに初心者が必ずハマる「落とし穴」を共有しておきます。
1. メモリの解放とライフサイクルを意識する
`Set asset = Nothing` を適切に行うこと。特に大規模な図形を一括処理するループ処理の中では、オブジェクトの生成と破棄のサイクルを意識しないと、メモリリークを引き起こしVisioが突然フリーズする原因になります。
2. エラーハンドリングの重要性
Visioの図形はユーザーが手動で削除したり、予期せぬ変更を加えることがあります。ラップしている大元の `Visio.Shape` が途中で消滅していないか、常に `If m_VisioShape Is Nothing Then` などのガード句を入れるのが、プロの堅牢なコードの書き方です。
—
まとめ:ここをクリアすれば、Visio VBAは敵なし!
いかがでしたか?
今回はShapeオブジェクトをラップするクラスモジュールの基本を解説しました。
- 標準のShapeだけでは業務ロジックが散らかる
- クラスモジュールでラップ(カプセル化)することで、プロパティやメソッドがすっきり整理される
- シェイプシートとの橋渡しをクラス内部に閉じ込めることで、保守性が爆発的に向上する
ここをマスターすれば、もはやあなたは単なる「マクロ記録者」ではありません。「Visioソリューション・アーキテクト」の第一歩を踏み出しています。
ぜひ、あなたの職場にあるVisio業務をこのオブジェクト指向のパワーで自動化・効率化してみてください。それでは、また次の極限の知見でお会いしましょう!
