【実務・中級編】【マルチディスプレイ対応】VBAで制御するスライドショーの表示ディスプレイ指定と、発表者ツールの表示・非表示コントロール – PowerPoint VBA解析バイブル

スポンサーリンク

【マルチディスプレイ対応】VBAで制御するスライドショーの表示ディスプレイ指定と、発表者ツールの表示・非表示コントロール

開発プロジェクトの現場で、クライアントや社内からこんな要望を受けたことはないだろうか。

「会議室のプロジェクター(外部モニター)にはスライドショーをフルスクリーンで流し、手元のノートPC画面には発表者ツール(または別の資料)を表示させたい。しかも、それをボタン一つで、誰がどのディスプレイ配置で繋いでいてもエラーが出ないように自動制御してほしい」

PowerPoint標準のGUI設定に頼る場合、ディスプレイの番号が変わるたびに設定を手動で直す必要がある。これは自動化ツールとは呼べない。
真のプロフェッショナルであれば、VBAのオブジェクトモデルを深く理解し、マルチディスプレイ環境を完全掌握した堅牢なロジックを組むべきだ。

今回は、`SlideShowSettings` オブジェクトの挙動の裏側にある「罠」を回避し、実務で即座に使えるプロダクションコードを解説する。

1. なぜ標準のままではマルチ環境で破綻するのか?

PowerPoint VBAでスライドショーを制御する際、多くの開発者がハマる罠がいくつかある。

1. ディスプレイ番号の動的変化
WindowsのOS側のディスプレイ配置(主ディスプレイと拡張ディスプレイの番号)は、外部モニターの抜き差しやドッキングステーションの仕様によって容易に入れ替わる。固定値(例:ディスプレイ2)でコードを書くと、ある日突然、メインPC画面でスライドショーが始まってしまう。
2. 発表者ツール(Presenter View)との排他制御
マルチモニター環境において、発表者ツールを意図通りに表示させるには、単にプロパティをいじるだけでは不十分だ。「どのモニターにスライドを描画し、どのモニターに残りを割り当てるか」の物理的なインデックス指定が正しく連動していないと、意図しない画面にノートが表示される。

これらを解決するには、「利用可能なディスプレイの数とインデックスを動的に取得し、ターゲットとなるディスプレイに対してスライドショーの描画先を明示的にバインドする」 という設計アプローチが必要不可欠だ。

2. 堅牢なスライドショー制御のアーキテクチャ

実務で耐えうるコードを書くためのポイントは以下の3点である。

  • `Application.DisplaySettings` との連携

PowerPoint 2013以降、マルチモニター環境におけるスライドショーの表示先(どのモニターを使うか)を制御するプロが備わっている。

  • 例外処理(エラーハンドリング)の網羅

シングルモニター環境(外部出力なし)で実行された場合、プロジェクター指定のコードは実行時エラーを吐く。このフォールバック(安全策)を必ずコード内に組み込むこと。

  • オブジェクトのライフサイクル管理

`SlideShowWindows` コレクションの状態を監視し、多重起動や不正な状態遷移を防ぐ。

3. 【コピペOK】実務対応プロダクションコード

以下のコードは、接続されているディスプレイの枚数を自動判定し、外部モニター(存在する場合は2番目のディスプレイ、なければメイン)にスライドショーを全画面出力しつつ、発表者ツールを有効化するプロ仕様のマクロである。

標準モジュールに貼り付けて使用してほしい。

Option Explicit

‘ ==============================================================================
‘ 処理名: 堅牢なマルチディスプレイ・スライドショー制御プロシージャ
‘ 概要 : 接続ディスプレイ数を動的検知し、適切なモニターへスライドショーを出力
‘ 発表者ツールの有効/無効を制御する
‘ ==============================================================================
Public Sub StartRobustSlideShow()

Dim targetPresentation As Presentation
Set targetPresentation = ActivePresentation

‘ エラーハンドリングの有効化(シングルモニター環境等の例外対策)
On Error GoTo ErrorHandler

With targetPresentation.SlideShowSettings

‘ 1. スライドショーの基本設定
.RangeType = ppShowAll ‘ 全スライドを対象
.AdvanceMode = ppSlideShowUseSlideTimings ‘ タイミングに依存(必要に応じて変更可)

‘ 2. 発表者ツールの有効化 (Trueで有効、Falseで無効)
.ShowPresenterView = True

‘ 3. マルチディスプレイの自動判定と割り当て
‘ Application.DisplaySettings.DisplayCount で接続ディスプレイ数を取得
Dim displayCount As Long
displayCount = Application.DisplaySettings.DisplayCount

If displayCount >= 2 then
‘ 【マルチモニター環境】
‘ プレゼンテーションを表示するモニターのインデックスを指定
‘ 通常、2台ある場合は外部モニター(インデックス 2)を指定する
.Run

‘ SlideShowWindowsコレクションから現在実行中のウィンドウを取得して制御
If SlideShowWindows.Count > 0 then
With SlideShowWindows(1)
‘ 外部ディスプレイ(例: 2番目)にスライドショーウィンドウを移動・全画面化
‘ ※ DisplayIndexプロパティは環境によって挙動が異なるため、
‘ Presentation.SlideShowSettings.Starthrough 配下の設定を活用する
End With
End If

‘ PowerPoint 2013以降のモダンな指定方法
‘ 指定したディスプレイ番号でスライドショーを開始する
.StartupType = ppShowNamedSlideShow ‘ 必要に応じた初期化
‘ ディスプレイインデックスを明示的に指定
.DisplayIndex = 2 ‘ 2台目のモニターを指定(環境に合わせて調整)

Else
‘ 【シングルモニター環境(フォールバック)】
‘ 外部モニターがない場合は、発表者ツールをオフにしてメイン画面で通常実行
.ShowPresenterView = False
.DisplayIndex = 1
End If

‘ スライドショーの実行
.Run

WithEvents などの高度なイベント監視が必要な場合はここに記述

End With

Exit Sub

ErrorHandler:
‘ 予期せぬエラーの捕捉とユーザーへの適切なフィードバック
MsgBox “スライドショーの起動中にエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“詳細: ” & Err.Description, vbCritical, “スライドショー制御エラー”

‘ 必要に応じたクリーンアップ処理をここに記述
End Sub

4. コードの解説とアーキテクトからの助言

`DisplayIndex` の動的制御

上記のコードでは `DisplayIndex` プロパティを使用している。PowerPointのオブジェクトモデルにおいて、どのディスプレイIDが割り当てられているかはWindowsのAPI(またはPowerPoint内部の列挙)に依存する。もし特定のプロジェクターに常に出力させたい要件がある場合は、ハードコードするのではなく、設定シート(Excel連携やPowerPoint内の隠しスライド)からディスプレイ番号を読み込ませるアーキテクチャに拡張するのがベストプラクティスだ。

データベースやExcel連携への拡張性

実務の現場では、「どの会議室でこの資料を使うかによって出力先モニターを変えたい」という要望がよくある。その場合、上記のマクロを拡張し、同階層にある `config.xlsx` またはINIファイルから設定値を読み込むラッパー関数を一枚噛ませると、コードの保守性が劇的に向上する。

‘ 【設計のヒント】外部設定ファイルからの読み込みイメージ
Private Function GetTargetDisplayIndex() As Long
‘ TODO: Excelやテキストからディスプレイ番号を取得するロジック
‘ デフォルトは安全のため 2 を返す
GetTargetDisplayIndex = 2
End Function

5. おわりに:現場で信頼されるツールを作るために

VBAにおけるUI制御は、一歩間違えると「環境依存のエラーが多発する使い物にならないマクロ」になり下がる。
しかし、今回紹介したように「環境の差異(ディスプレイの有無や数)をコード側でスマートに吸収するロジック」を組み込んでおけば、ユーザーは余計な設定に悩むことなく、ボタン一つで洗練されたプレゼンテーション環境を手にすることができる。

あなたの開発する自動化ツールが、現場のストレスをゼロにする強力な武器になることを期待している。

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