【入門編】ExcelやWordへの埋め込みVisioに対応:Application.InPlace判定による埋め込みオブジェクト制御とVBAエラー回避 – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visioのオートメーションの世界へようこそ。
マクロの記録ボタンを押すだけのステージから一歩進んで、自分の手でVisioを自在にコントロールしたい――そう思ってこのページを開いてくれたなら、あなたはもう立派なエンジニアの卵です。

今回は、Visio VBAの基礎でありながら、多くの人が沼にハマる「ExcelやWordへの埋め込み(In-Place活性化)と、単体起動(Standalone)の二面性」について徹底解説します。

ここをクリアできれば、単なる「お絵描きツール」としてのVisioではなく、Officeスイート全体を裏で操るスマートな自動化システムが作れるようになりますよ。さあ、一緒に本質をマスターしていきましょう!

1. なぜ「埋め込みVisio」でマクロは暴走するのか?

普段、私たちがVisioを使うときは、デスクトップからアイコンをダブルクリックして単体で起動しますよね(これを 単体起動 / Standalone と呼びます)。

しかし、企画書や手順書を作る際、WordやExcelの中に直接Visioの図面を「オブジェクト」として埋め込むことがあります。そして、その図面をダブルクリックして編集モードに入った状態を、専門用語で 「In-Place(インプレース)活性化」 と呼びます。

ここで恐ろしい事実をお伝えします。

> 「Visio単体起動のつもりで書いたコードは、WordやExcel上で動かすと、容赦なく実行時エラーを吐いてクラッシュする」

なぜこんなことが起きるのでしょうか?
それは、Visioが単体で動いているときと、別のアプリの窓の中で間借りして動いているときとでは、「親(Application)」や「ドキュメントのライフサイクル」の常識がガラリと変わってしまうからです。

2. オブジェクトモデルの罠:ActiveWindowとInPlaceの正体

Visio VBAの基本中の基本として、現在ユーザーが操作しているウィンドウを指す `ActiveWindow` というプロパティがあります。通常のマクロではこれを使って図形を操作します。

しかし、Excelに埋め込まれたVisioで `ActiveWindow` を叩くとどうなるでしょう?
場合によっては「今、ウィンドウがアクティブじゃないよ!」と怒られたり、Excel側のウィンドウと混同して予期せぬエラー(実行番号: 91 または 424 など)を引き起こします。

ここで登場するのが、今回の主役である `Application.InPlace` プロパティです。

`Application.InPlace` とは何か?

このプロパティは、現在実行されているVisioのインスタンスが、「単体で動いているか(False)」それとも「他のOfficeアプリの中に埋め込まれているか(True)」を教えてくれる唯一の安全弁です。

[Visio起動のシチュエーション判定]
├── Application.InPlace = False → 単体起動 (Standalone)
└── Application.InPlace = True → Office埋め込み (In-Place)

この判定をコードの最初に挟むだけで、プログラムが「今、自分がどこにいるのか」を自覚し、環境に応じた安全なルートを通れるようになります。

3. 【実践】どちらの環境でも絶対にエラーを出さない安全設計コード

それでは、現場でそのままコピペして使える、極めて堅牢なVBAコードを見てみましょう。
このコードは、現在の環境を判定し、埋め込みであっても単体起動であっても、エラーを出さずに図面中のシェイプ数(図形の数)をメッセージボックスで教えてくれる優れものです。

Sub SafeShapeCounter()
‘ =====================================================================
‘ テーマ: VisioのIn-Place判定と安全なオブジェクト制御
‘ 概要: 単体起動・埋め込み起動のどちらでも安全に動作するテンプレート
‘ =====================================================================

Dim vsoApp As Visio.Application
Dim vsoDoc As Visio.Document
Dim vsoPage As Visio.Page
Dim shapeCount As Long

‘ 1. アプリケーションオブジェクトの取得
Set vsoApp = Visio.Application

‘ 2. 【最重要】InPlace(埋め込み)状態の判定
If vsoApp.InPlace Then
‘ —————————————————————–
‘ 【ケースA】ExcelやWordに埋め込まれている場合
‘ —————————————————————–
‘ 埋め込み時は ActiveWindow が不安定なため、
‘ 現在アクティブなドキュメント(ActiveDocument)を直接狙い撃ちします。
On Error Resume Next
Set vsoDoc = vsoApp.ActiveDocument
On Error GoTo 0

If vsoDoc Is Nothing Then
MsgBox “現在、操作対象となるドキュメントが取得できません。”, vbCritical, “埋め込み制御エラー”
Exit Sub
End If

MsgBox “【モード: 埋め込み (In-Place)】” & vbCrLf & _
“ホストアプリ内で安全に実行します。”, vbInformation, “環境判定”

Else
‘ —————————————————————–
‘ 【ケースB】Visioが単体で起動している場合
‘ —————————————————————–
‘ 窓やウィンドウが確実に存在するため、従来通りのウィンドウ経由で取得します。
If vsoApp.Documents.Count = 0 Then
MsgBox “開かれている図面がありません。”, vbExclamation, “単体起動エラー”
Exit Sub
End If

Set vsoDoc = vsoApp.ActiveDocument

MsgBox “【モード: 単体起動 (Standalone)】” & vbCrLf & _
“通常環境で実行します。”, vbInformation, “環境判定”
End If

‘ 3. 共通の処理ロジック(アクティブページから図形数を数える)
‘ ※埋め込み時は ActivePage の取得にも注意が必要です
On Error GoTo PageError
Set vsoPage = vsoDoc.ActivePage

If Not vsoPage Is Nothing Then
shapeCount = vsoPage.Shapes.Count
MsgBox “このページの図形(シェイプ)の数は ” & shapeCount & ” 個です。”, vbInformation, “実行結果”
End If

Exit Sub

PageError:
MsgBox “ページ情報の取得中にエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub

4. コードの深掘り:なぜこの書き方が「プロの技」なのか?

上記のコードには、チーフアーキテクトとしてのこだわりが詰まっています。ポイントを3つに分けて解説しますね。

① `On Error Resume Next` の限定的な使用

エラートラップは諸刃の剣ですが、埋め込みオブジェクトのライフサイクルにおいて、親アプリケーションとの通信が一時的に不安定になる瞬間があります。そのため、ドキュメントの取得部分だけピンポイントでエラーをいなし、すぐに `On Error GoTo 0` で通常の監視に戻しています。

② `ActiveWindow` への過度な依存を断つ

初心者は何をするにも `Visio.ActiveWindow.Selection` や `ActiveWindow.Page` を使いがちです。しかし、埋め込み状態のVisioは「ウィンドウ」という概念がホスト(WordやExcel)の背後に隠れてしまうことがあります。そのため、「ウィンドウではなく、ドキュメント(ActiveDocument)やページ(ActivePage)を直接の起点にする」のが、埋め込み制御を制する最大のコツです。

③ メンテナンス性の高い構造

単体起動と埋め込み起動で「処理の入り口(環境判定)」だけを分岐させ、その後の実処理(シェイプのカウントなど)は共通のオブジェクト (`vsoDoc`) を使うように設計しています。これにより、コードの重複を防ぎ、後からの機能追加が非常に楽になります。

5. ここをクリアすれば、Visio VBAの基本はバッチリ!

お疲れ様でした!今回は少しディープな「InPlace判定」について解説しました。

「ただ動くマクロ」を書くだけなら、記録ボタンを押して出てきたコードを貼り付ければいいかもしれません。しかし、今回学んだような「実行される環境の文脈(コンテキスト)を理解し、どんな状況でもエラーを起きなくする防御的プログラミング」ができるようになると、あなたの作るツールは一気に「プロ品質」へとランクアップします。

WordやExcelと連携するレポート自動化ツールなども、この知識があれば怖いものなしです。ぜひ自分の環境でコードを試して、Visio VBAを完全に手中に収めてくださいね。それでは、次回の極限の知見でお会いしましょう!

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