こんにちは!PowerPoint VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから抜け出し、「自分の手で自由自在にPowerPointを操りたい」と感じ始めているなら、今がまさに最高潮に面白いタイミングです。
今回は、PowerPoint VBAにおける「非同期処理の監視」という、少し一歩進んだ、しかし実務ではめちゃくちゃ強力なテクニックを解説します。
テーマは `Presentation.CreateVideo` による動画生成と、`CreateVideoStatus` を用いた完了待ちポーリング実装 です。
「スライドを自動で動画にするマクロを作りたいけれど、書き出しが終わる前に次の処理が走ってエラーになる…」
そんな現場の悩みを一発で解決する、堅牢なコードの書き方を一緒にマスターしていきましょう!ここをクリアすれば、あなたも立派なVBAエンジニアの仲間入りです。
—
1. なぜ「動画の書き出し」には特別な配慮が必要なのか?
PowerPointには、スライドショーをMP4などの動画ファイルとして書き出す `CreateVideo` という非常に強力なメソッドが備わっています。手動で「ファイル」>「エクスポート」>「ビデオの作成」とするあの操作を、VBAから一瞬で呼び出せるのです。
しかし、ここに大きな罠があります。
PowerPointが動画をエンコード(生成)する処理は、「非同期処理(Async)」で行われます。
つまり、VBAから「動画を作れ!」と命令した瞬間、VBAのプログラムは「はい、命令完了!」とばかりに次の行へ進んでしまいます。
もし、その直後に「ファイルをメールに添付する」だの「プレゼンテーションを閉じる」だのといったコードが書いてあったらどうなるでしょう?
当然、まだ動画ファイルが完成していない(あるいはファイルがロックされている)ため、エラーが起きたり、中身が空っぽの壊れた動画ができあがったりします。
解決策:「ポーリング(監視ループ)」の導入
ここで登場するのが、今回の主役であるポーリング(Polling)という概念です。
一定の間隔で「おい、動画の作成もう終わった?」とPowerPointにステータスを問い続け、完了(あるいは失敗)するまでVBAをその場で足止めする――この安全な待機メカニズムを作っていきます。
—
2. 登場する主要なオブジェクトとプロパティ
今回のコードで鍵を握るメンバーたちです。
- `Presentation.CreateVideo` メソッド
- 指定したプレゼンテーションの動画化を開始します。解像度やフレームレート、スライドごとの秒数などを指定できます。
- `Application.CreateVideoStatus` プロパティ
- 現在バックグラウンドで走っている動画生成の進捗状況(ステータス)を返します。
- 返ってくる主なステータス:
- `ppMediaTaskStatusInProgress` (処理中)
- `ppMediaTaskStatusDone` (完了!)
- `ppMediaTaskStatusFailed` (失敗)
- `ppMediaTaskStatusQueued` (待機中)
—
3. 実装コード:安全に動画生成を待つマクロ
それでは、実際に動かせる実用的なコードを見ていきましょう。
開発タブのVisual Basic Editor(VBE)を開き、標準モジュールに以下のコードを貼り付けてみてください。
Sub ExportPresentationToVideo_WithPoll()
Dim pptPres As Presentation
Dim outputPath As String
Dim 経過時間 As Double
‘ 対象は現在アクティブなプレゼンテーション
Set pptPres = ActivePresentation
‘ 保存先のパスを設定(デスクトップに “OutputVideo.mp4” という名前で保存)
outputPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\OutputVideo.mp4”
‘ 既に同名のファイルがあれば削除しておく(エラー防止)
If Dir(outputPath) <> “” Then
Kill outputPath
End If
MsgBox “動画の書き出しを開始します。” & vbCrLf & “完了するまでマクロで待機します。”, vbInformation, “処理開始”
‘ 1. 非同期で動画生成を開始
‘ 引数: ファイルパス, 使用既定タイミング(True), 秒数(5秒), 解像度(1080p), フレームレート(30)
pptPres.CreateVideo FileName:=outputPath, _
UseTimingsAndNarrations:=True, _
DefaultSlideDuration:=5, _
Resolution:=1080, _
FramesPerSecond:=30
‘ 2. 処理がキュー(待ち行列)に入るか、ステータスが取得可能になるまでわずかにウェイト
DoEvents
経過時間 = Timer
‘ 3. 【ここが本質】ステータスが「完了(Done)」になるまで監視ループを回す
Do While pptPres.CreateVideoStatus = ppMediaTaskStatusInProgress Or _
pptPres.CreateVideoStatus = ppMediaTaskStatusQueued
‘ ExcelやPowerPointが「フリーズ(応答なし)」しないようにOSに制御を返す魔法の呪文
DoEvents
‘ 無限ループに陥ったときの安全弁(例:10分以上経ったら強制脱出)
If Timer – 経過時間 > 600 Then
MsgBox “タイムアウトしました。動画生成に時間がかかりすぎています。”, vbCritical, “エラー”
Exit Sub
End If
‘ CPUの負荷を100%に張り付かせないための優しいウェイト(約1秒停止)
Application.Wait (Now + TimeValue(“00:00:01”))
Loop
‘ 4. 結果の判定
If pptPres.CreateVideoStatus = ppMediaTaskStatusDone Then
MsgBox “動画の書き出しが正常に完了しました!” & vbCrLf & “保存先: ” & outputPath, vbInformation, “成功”
Else
MsgBox “動画の書き出しに失敗しました。ステータスコード: ” & pptPres.CreateVideoStatus, vbCritical, “エラー”
End If
End Sub
—
4. コードの深掘りポイント(エンジニアの知見)
このコードには、現場でバグを出さないための「プロの工夫」がいくつか散りばめられています。初心者から一歩抜け出すために、重要なポイントを解説します。
① `DoEvents` の絶妙な配置
無限ループ (`Do While … Loop`) を回すとき、`DoEvents` を入れないとPowerPointの画面が真っ白になり、「応答なし」になって強制終了します。
`DoEvents` は、OSに「画面の描画やユーザーからの入力を処理する余裕を少しちょうだいね」と譲歩する非常に重要な命令です。非同期処理の監視には必須セットとなります。
② `Application.Wait` によるCPU負荷の軽減
`DoEvents` だけだと、VBAはものすごい高速でループを何万回も回し続け、パソコンのCPU使用率が跳ね上がってファンが爆音で回り始めます。
そこで `Application.Wait (Now + TimeValue(“00:00:01”))` を挟み、「1秒に1回だけステータスを確認しに行く」という優しい設計にしています。動画生成は時間がかかる処理なので、1秒ごとの確認で十分実用に耐えます。
③ タイムアウト処理(安全弁)の重要性
もし何らかの予期せぬ理由でPowerPointのエンジンがフリーズした場合、無限ループに入るとマクロを強制終了するしかなくなります。
`Timer` 関数を使って「もし10分(600秒)以上経過しても終わらなかったら、ループを強制脱出する」という脱出ルート(セーフティネット)を必ず用意しておくのが、プロのエンジニアの流儀です。
—
まとめ
今回は `Presentation.CreateVideo` と `CreateVideoStatus` を使った、非同期処理の堅牢な監視ループについて解説しました。
- 動画の書き出しは非同期で行われるため、そのままでは次のコードが先に走ってしまう。
- `Do While` ループと `CreateVideoStatus` を組み合わせて、完了をポーリング(監視)する。
- `DoEvents` と `Application.Wait`、そしてタイムアウト処理を組み合わせることで、PCに優しく安全なマクロが作れる。
ここをクリアできれば、単なる「お片付けマクロ」ではなく、裏で重い処理をしっかりとコントロールできる「本格的な自動化システム」が構築できるようになります。
ぜひご自身の環境でも試して、スムーズな動画自動書き出しの快感を味わってみてくださいね。それでは、次回の応用編でお会いしましょう!
