【入門編】【非同期処理の監視】”Presentation.CreateVideo”による動画生成と、”CreateVideoStatus”を用いたエクスポート完了待ちポーリング実装 – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは!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に優しく安全なマクロが作れる。

ここをクリアできれば、単なる「お片付けマクロ」ではなく、裏で重い処理をしっかりとコントロールできる「本格的な自動化システム」が構築できるようになります。

ぜひご自身の環境でも試して、スムーズな動画自動書き出しの快感を味わってみてくださいね。それでは、次回の応用編でお会いしましょう!

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