こんにちは!Visio VBAの自動化の世界へようこそ。
チーフアーキテクトの私です。
「マクロの記録」ボタンを押して図形をポチポチ動かす――そこから一歩進んで、自分の手でロジックを組み立て、巨大な図面を一瞬で自動生成したい。そう思ったあなたへ。Visio VBAの扉を開く準備はできましたか?
今回は、すべてのVBAコードの「起点」となるApplicationオブジェクトを取り上げます。ここを完全に理解すれば、Visio VBAの基本はバッチリです。一緒に、安全で強固な自動化の土台を作り上げていきましょう!
—
1. すべての始まり:Applicationオブジェクトとは何か?
VisioのVBAエディタを開くと、世界は `Application` というたった一つの巨大な神(Root Object)から始まります。
イメージしてください。Visioというアプリケーションそのものが「会社」だとすると、`Application` は「社長室」です。社長(Application)の許可なく、書類(Document)を机の上に広げることも、ペン(Shape)を取ることもできません。
Visioのオブジェクト階層は、綺麗にピラミッド構造をしています。
Application (Visioそのもの)
┗ Documents (開かれている図面ファイルたち)
┗ Document (個別の図面ファイル)
┗ Pages (ページたち)
┗ Page (個別のページ)
┗ Shapes (図形たち)
┗ Shape (個別の図形)
このピラミッドの頂点に君臨するのが `Application` オブジェクトです。だからこそ、私たちはまずこのオブジェクトを正しく安全に把捉(キャッチ)しなければならないのです。
—
2. Visio内蔵VBAと外部(Excel等)からの決定的な違い
初心者の方が最初に躓くのが、「どこからコードを書くか」によって `Application` の取得方法が変わるという点です。ここ、とても重要なのでしっかり押さえましょう。
パターンA:VisioのVBAエディタから実行する場合(内蔵)
Visioの画面で `[Alt] + [F11]` を押して書くコードです。この場合、`Application` はすでに目の前で動いているので、わざわざ探す必要はありません。
Sub CheckVisioVersion()
‘ すでに存在するApplicationオブジェクトを暗黙的に利用できる
MsgBox “現在のVisioバージョンは ” & Application.Version & ” です。”
End Sub
ここでは `Application` を省略して `MsgBox Version` と書いても動きますが、コードの明確さのために `Application.` と明示する習慣をつけるのが、一流のエンジニアへの第一歩です。
パターンB:Excelや外部アプリからVisioを操作する場合(外部起動)
「Excelのボタンを押したら、裏でVisioを起動して図面を作りたい」という実務で非常によくあるケースです。ここでは、OSに対して「Visioを起動してください」と頼む必要があります。
ここで重要になるのが、「安全なインスタンスの取得(セーフティ・バインディング)」です。
—
3. 【実践】安全にVisioインスタンスを把捉するコード
マルチセッション環境(すでに別のVisioが起動しているかもしれない状態)において、外部から安全にVisioを操作するための実用コードを授けましょう。
以下のコードは、ExcelのVBAからVisioを安全に起動・把捉するテンプレートです。そのまま実務でコピー&ペーストして使えます。
Sub LaunchOrConnectVisioSafely()
Dim visApp As Object ‘ Visio.Application
Dim isNewInstance As Boolean
On Error GoTo ErrorHandler
‘ 1. すでに起動しているVisioインスタンスへの接続を試みる (GetSetting的なアプローチ)
On Error Resume Next
Set visApp = GetObject(, “Visio.Application”)
On Error GoTo ErrorHandler ‘ エラー監視を元に戻す
‘ 2. 起動していなければ、新しくインスタンスを生成する
If visApp Is Nothing Then
Set visApp = CreateObject(“Visio.Application”)
isNewInstance = True
MsgBox “Visioの新しいインスタンスを起動しました。”, vbInformation
Else
isNewInstance = False
MsgBox “既存のVisioインスタンスに接続しました。”, vbInformation
End If
‘ 3. 安全にVisioの機能を叩く(例:ウィンドウを表示する)
visApp.Visible = True
‘ — ここに実際の自動化処理を記述していきます —
‘ 4. クリーンアップ(新しく起動したもので、必要であれば閉じる処理など)
‘ 今回はそのままにしておきます
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
‘ 異常終了時のオブジェクト解放
Set visApp = Nothing
End Sub
コードの解説とエンジニアの知見
- `GetObject(, “Visio.Application”)`:
すでにメモリ上に立ち上がっているVisioを掴みに行きます。これをやらないと、ユーザーがすでに作業中のVisioがあるにもかかわらず、裏で不要なVisioが何重にも立ち上がり、PCのメモリが爆発(リソース枯渇)します。実務では必須の配慮です。
- `CreateObject(“Visio.Application”)`:
Visioが起動していなかった場合に、新しくバックグラウンド(あるいはフォアグラウンド)で立ち上げます。
- `Object` 型による遅延バインディング(Late Binding):
外部から操作する場合、参照設定のバージョン違いによる「コンパイルエラー」を防ぐため、あえて `Object` 型で受けておくと安全です。
—
4. 陥りやすい罠:デスクトップ上の「幽霊プロセス」
外部連携コードを書いているときによくある事故が、「VBAの実行が終わったのに、タスクマネージャーを見ると Visio.exe が裏で居座り続けている(ゾンビプロセス)」という現象です。
これは、オブジェクトの参照(メモリのつながり)がVBA内で完全に解放されていないことが原因で起こります。
対策:変数は必ず `Nothing` で解放する
コードの最後やエラー時には、必ず取得したオブジェクトをクリアする癖をつけましょう。
‘ 処理の最後に必ず記述する
Set visApp = Nothing
たったこれだけの行ですが、これをサボるプログラマーと、徹底するプログラマーの間には、「安定稼働するシステム」か「エラー続出の爆弾」かという決定的な差が生まれます。
—
最後に:ここをクリアすれば、もう初心者ではない!
今回は、Visio VBAのすべての土台である `Application` オブジェクトの構造と、内外からの安全なインスタンス取得法について解説しました。
- Visioのオブジェクトモデルの頂点には `Application` がいること。
- 外部から操作する際は、既存の起動を疑い (`GetObject`)、なければ新規作成 (`CreateObject`) する安全設計が不可欠であること。
- 使い終わったオブジェクトは必ず解放すること。
ここをクリアしたあなたなら、次は `Documents.Add` を使って新しい図面キャンバスを創り出すステップへ軽々と進めるはずです。
「ここをクリアすれば、Visio VBAの基本はバッチリですよ!」
自信を持って、次の自動化の扉を開いてみてください。あなたのVBAライフが素晴らしいものになることを応援しています!
