こんにちは!PowerPoint VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身がさっぱり分からない…」そんなモヤモヤを抱えていませんか?
今回は、多くの現場で「地味に困る」と悩まされるマルチディスプレイ環境でのスライドショー制御をテーマに取り上げます。
「メインモニターではなく、サブモニターに全画面で発表者ツール付きで表示させたい!」
「会議室のプロジェクターにだけスライドを飛ばしたい!」
ここをクリアすれば、PowerPoint VBAのオブジェクトモデルの本質が見えてきます。温かく、そして実務で即戦力になる知識を一緒に紐解いていきましょう。
—
1. PowerPoint VBAの心臓部:オブジェクトモデルの階層構造を理解する
まず、VBAでPowerPointを操るための「地図」を確認します。Excelが「セル(Cell)」の集合体であるのに対し、PowerPointは「プレゼンテーション(Presentation)」の中に「スライド(Slide)」があり、それを「スライドショー(SlideShow)」としてどう見せるかという階層構造になっています。
Application (PowerPointアプリ全体)
┗ Presentations (開いているファイルたち)
┗ Presentation (操作対象のファイル)
┗ SlideShowSettings (スライドショーの設定・制御の心臓部)
┣ StartingSlide / EndingSlide (開始・終了スライド)
┣ ShowPresenterView (発表者ツールの有無)
┗ Run (ショーの実行)
私たちが今回焦点を当てるのは、この階層のなかでも`SlideShowSettings`(スライドショー設定)というオブジェクトです。ここを自由自在に操れるようになると、ディスプレイの指定から表示方法まで、すべてをコードの意のままにコントロールできるようになります。
—
2. なぜマルチディスプレイ制御でつまずくのか?(陥りやすい罠)
PowerPointのスライドショーをVBAで起動する際、最もシンプルなコードはこれです。
ActivePresentation.SlideShowSettings.Run
しかし、これをマルチモニター環境(ノートPC + 外付けモニターなど)で実行すると、大抵の場合「こっちに出てほしいディスプレイとは逆側の画面」や「予期せぬウィンドウサイズ」で起動してしまいます。
原因は、PowerPointが標準で「プライマリモニター」と判定された画面にスライドショーを描画しようとする仕様にあります。「どのディスプレイの何番を使うか」をVBA側で明示的に指定してあげる必要があるのです。
—
3. 実践コード:狙ったディスプレイで発表者ツール付きスライドショーを起動する
それでは、実務でそのまま使える堅牢なプロシージャを公開します。
このコードでは、指定したモニター番号(例えば2画面あるなら2番目のモニター)に全画面のスライドショーを展開し、同時に「発表者ツール(PresenterView)」を有効にするロジックを組み込んでいます。
Sub StartPresentationOnTargetMonitor()
Dim targetMonitor As Long
targetMonitor = 2 ‘ ← ここに表示させたいディスプレイの番号を指定します(例: 2番目のモニター)
‘ エラーハンドリングの準備
On Error GoTo ErrorHandler
‘ 1. 開いているプレゼンテーションが存在するかチェック
If Documents.Count = 0 Then
MsgBox “プレゼンテーションが開かれていません。”, vbExclamation, “エラー”
Exit Sub
End If
‘ 2. スライドショー実行中のウィンドウがあれば事前に閉じる(二重起動防止)
If SlideShowWindows.Count > 0 Then
SlideShowWindows(1).View.Exit
End If
‘ 3. SlideShowSettingsオブジェクトを変数に格納してスマートに操作
Dim ssSettings As SlideShowSettings
Set ssSettings = ActivePresentation.SlideShowSettings
With ssSettings
‘ 発表者ツールを使用する(True: 表示する / False: 表示しない)
.ShowPresenterView = True
‘ 表示先のモニター番号を指定
‘ ※注意: ディスプレイ番号はWindowsの「ディスプレイ設定」に依存します
.StartingSlide = 1
.EndingSlide = ActivePresentation.Slides.Count
‘ 4. スライドショーの実行とモニターの割り当て
‘ Runメソッドを実行すると、SlideShowWindowsコレクションに新しいウィンドウが生成されます
Dim ssWindow As SlideShowView
Set ssWindow = .Run.View
End With
‘ 補足:特定のディスプレイに明示的にスライドショーウィンドウを移動させたい場合のテクニック
‘ (PowerPointのバージョンや環境によっては、ディスプレイ設定ダイアログでの事前設定が優先されます)
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “システムエラー”
End Sub
コードの重要ポイント解説
1. `ShowPresenterView = True`
これが今回のキモです。デュアルモニター環境において、手元のノートPCには「次のスライドやメモ(発表者ツール)」を表示させ、プロジェクター側には「スライド本編」をフルスクリーンで映し出す、あのプロ仕様の画面構成をVBAから強制有効化します。
2. `SlideShowWindows.Count > 0` による二重起動ガード
すでにスライドショーが走っている状態で再度マクロを実行すると、PowerPointが混乱してエラーを起こす原因になります。実務で使うコードには、こうした「現在の状態を掃除する(クリーンアップする)処理」を必ず挟むのがプロの作法です。
—
4. 現場で役立つ知見:マルチディスプレイの「番号」に関する注意点
ここで一つ、現場で開発するエンジニアとして絶対に知っておくべき「罠」をお伝えしておきます。
VBAで指定するモニター番号(上記の `targetMonitor = 2` など)は、WindowsのOS側が認識しているディスプレイの識別番号と連動しています。
ユーザーの環境が変わったり、ドッキングステーションの抜き差しを行ったりすると、この「1番」「2番」の割り振りが変わってしまうことがあります。
より厳密に制御したい大規模なプレゼン自動化ツールを作る場合は、以下のような設計アプローチも検討してください:
- あらかじめ設定シート(ExcelやPowerPoint内の隠しスライド)に「使用するモニター番号」を保持させておく。
- 起動時に `Application.DisplaySettings` や Windows API を叩いて接続モニター数を動的に取得し、存在しないモニター番号を指定された場合にフォールバック(自動で1番に変更)させる。
—
おわりに:ここをクリアすれば、PowerPoint VBAは怖くない!
今回は、マルチディスプレイ環境におけるスライドショーの表示制御と、発表者ツールのコントロールについて解説しました。
「マクロの記録」では絶対に生成されない、こうしたオブジェクトの組み合わせやプロパティの操作こそが、VBAプログラミングの醍醐味です。ここをマスターしたあなたなら、社内のプレゼン業務を自動化するツールや、自動キオスク端末のようなサイネージシステムさえも自力で構築できるはずです。
「ここをもっと深掘りしたい」「こんな応用はできる?」といった疑問があれば、いつでもまた扉を叩いてください。
あなたのVBAライフが、よりスマートで快適なものになりますように。エンジニアリングの旅を、一緒に楽しんでいきましょう!
