こんにちは!PowerPoint VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから抜け出し、「自分の手で動かすプログラム」を書き始めると、世界がガラリと変わりますよね。
さて、現場でバリバリとプレゼン資料を自動化しているエンジニアの間で、時々こんな恐怖のセリフが囁かれます。
「本番直前のプロジェクター接続で、なぜかスライドショーが強制終了した……」
会議室の大型モニター、出先のプロジェクター、あるいは個人のマルチディスプレイ環境。PowerPointは、画面の解像度やディスプレイの構成が変わった瞬間に機嫌を損ね、`Presentation.SlideShowSettings.Run` の実行時に無情な実行時エラーを吐き出すことがあります。
今回は、そんなハードウェアの気まぐれに負けず、「どんなディスプレイ環境でも絶対にスライドショーを途絶えさせない、最高に堅牢なフォールバック処理」の極意を伝授します。ここをクリアすれば、あなたのVBAスキルは確実にワンランク上のエンジニア領域に到達しますよ!
—
1. なぜ、プロジェクター接続時にエラーが起きるのか?
まずは敵を知ることから始めましょう。
通常、PowerPointでスライドショーを起動するコードは非常にシンプルです。
‘ 通常のシンプルなスライドショー起動コード
ActivePresentation.SlideShowSettings.Run
このコード、自分のPCの画面(シングルモニター)でテストしている時は完璧に動きます。しかし、外部プロジェクターを接続した瞬間、以下の現象が起きます。
1. ディスプレイ番号のズレ: PowerPointが「何番目の画面で全画面表示するか(`DisplayTarget`)」を記憶しているが、接続が変わることでその番号が存在しなくなる。
2. 解像度の不整合: メインPCとプロジェクターの解像度の急激な変化に、VBAの描画エンジンがついていけなくなる。
結果として、VBAはパニックを起こし、画面が真っ暗になったりエラーダイアログがポップアップしたりします。本番のプレゼン直前にこれが起きたら、冷や汗ものですよね。
—
2. エラーを「予期して受け止める」エラーハンドリングの美学
プログラミング初心者のうちは、「エラーが出たらどうしよう」と及び腰になりがちです。しかし、ベテランエンジニアはこう考えます。
「エラーは起きるもの。起きた後にどうリカバリーするか(フォールバックするか)が腕の見せ所だ」
PowerPoint VBAには、エラーが発生した時にプログラムを止めるのではなく、「別のルートに誘導する」ための呪文があります。それが `On Error GoTo` です。
これを使って、「まずは全力で全画面(フルスクリーン)での起動を試みる。もしハードウェアの機嫌が悪くてエラーが出たら、安全なウィンドウモードに切り替えて生き残る」というスマートな仕組みを作りましょう。
—
3. 実装コード:絶対に落ちない堅牢なスライドショー起動ルーチン
それでは、実際の現場でそのままコピペして使える実用コードを公開します。
標準モジュールに以下のコードを貼り付けてみてください。
Option Explicit
‘ ==============================================================================
‘ プロジェクター接続エラーを回避し、安全にスライドショーを起動するプロシージャ
‘ ==============================================================================
Sub SafeStartSlideShow()
Dim targetPres As Presentation
Set targetPres = ActivePresentation
‘ 【重要】エラーが発生した時のジャンプ先を指定
On Error GoTo ErrorHandler
‘ — 挑戦フェーズ:理想の全画面(フルスクリーン)起動 —
With targetPres.SlideShowSettings
‘ デフォルトの全画面表示を指定
.ShowType = ppShowTypeSpeaker ‘ 発表者として表示(全画面)
.RangeType = ppShowAll
‘ スライドショーを実行
Dim ssw As SlideShowWindow
Set ssw = .Run
End With
‘ 正常に起動できた場合は、ここで処理を正常終了
Exit Sub
ErrorHandler:
‘ — フォールバック(緊急避難)フェーズ —
‘ エラー番号を記録しておく必要がある場合はここにDebug.Printなどを記述
MsgBox “全画面での起動に失敗しました(ディスプレイ構成の不整合の可能性があります)。” & vbCrLf & _
“安全のため、ウィンドウモードでスライドショーを起動します。”, _
vbExclamation, “ディスプレイ環境アラート”
‘ エラー状態をクリア
Err.Clear
‘ 安全策:ウィンドウ表示(ppShowTypeWindow)に変更して強制起動
On Error GoTo FinalHandler ‘ フォールバック先での万が一のエラー対策
With targetPres.SlideShowSettings
.ShowType = ppShowTypeWindow ‘ ウィンドウ内で実行
.RangeType = ppShowAll
.Run
End With
Exit Sub
FinalHandler:
‘ ここまで来るのは最終手段。これ以上はどうしようもない致命的エラー
MsgBox “スライドショーの起動に完全に失敗しました。ファイルの状態を確認してください。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
—
4. コードの深掘り解説:ここがエンジニアのこだわりポイント
このコードには、ただ動くだけではない「プロの知見」がいくつか詰まっています。ポイントを紐解いていきましょう。
① `On Error GoTo` による処理の分岐
VBAにおけるエラー処理の基本形です。`On Error GoTo ErrorHandler` を宣言した瞬間から、もしその下でエラーが起きてもプログラムは強制終了せず、`ErrorHandler:` ラベルの位置へワープします。
② `ppShowTypeWindow` という強力な切り札
PowerPointのスライドショーには、全画面だけでなく「通常のウィンドウ内」で動かすモード(`ppShowTypeWindow`)があります。
全画面表示はディスプレイの解像度やマルチモニターの配置に強く依存しますが、ウィンドウモードはOSのウィンドウ管理システムの上で動くため、外部ディスプレイのトラブルをほとんど受けません。
「全画面がダメなら、確実に動くウィンドウで表示させる」これが今回のフォールバックの核心です。
③ ユーザーへの優しい対話(UI/UXの配慮)
突然マクロがフリーズしたり、意味不明なエラーコード(「実行時エラー ‘-2147467259’…」など)が画面に出ると、一般のユーザーはパニックになります。
フォールバック処理の中で `MsgBox` を挟み、「何が起きているのか」「今からどうリカバリーするのか」を日本語で優しく伝えることで、システムの信頼性がグッと上がります。
—
5. 応用編:マルチモニター環境をVBAで制御する
もし、社内の特定の大型プロジェクター(常に2番目のディスプレイなど)に強制的に映したい場合は、起動前に `DisplayTarget` プロパティを調整する高度なテクニックもあります。
‘ ディスプレイ番号を指定してスライドショーを設定する例
With targetPres.SlideShowSettings
.ShowType = ppShowTypeSpeaker
.DisplayType = ppShowDisplayUseSpecified
.DisplayTarget = 2 ‘ 2番目のモニターを強制指定(※存在しない番号を指定するとエラーになるので注意!)
End With
このように、ディスプレイの指定を厳密に行えば行うほど、環境が変わった時の「爆弾」になりやすくなります。だからこそ、今回紹介した「全画面でダメならウィンドウに逃げる」という安全ネット(フォールバック)の考え方が、実務では最大の武器になるのです。
—
まとめ
今回は、プロジェクター接続時のトラブルを華麗にかわすフォールバック処理について解説しました。
- 外部環境(解像度やモニター)の変化は、スライドショー起動エラーの最大の原因
- エラーを恐れるな、`On Error GoTo` でハンドリングせよ
- 全画面(`ppShowTypeSpeaker`)がダメなら、ウィンドウ(`ppShowTypeWindow`)に逃げるのがプロの技
ここをクリアすれば、あなたの書くPowerPoint VBAマクロは、どんな現場でも頼りにされる「プロフェッショナルなツール」に生まれ変わります。
ぜひ次のプレゼン資料の自動化から、この堅牢なコードを取り入れてみてくださいね。それでは、また次回の知見でお会いしましょう!
