【実務・中級編】【プロフェッショナル】Slide.Shapes.AddMediaObject2を用いた動画・音声ファイルの動的埋め込みと、再生オプション(自動再生、ループ、クリック時再生)のVBAによる完全制御 – PowerPoint VBA解析バイブル

スポンサーリンク

【プロフェッショナル】PowerPoint VBAで動画・音声を完全制御する:`AddMediaObject2`の深淵

業務自動化において、プレゼンテーションへ動画や音声を「自動流し込み」するニーズは意外と多い。しかし、素人が書いたコードは決まって「ファイルパスの参照エラー」や「スライドショー実行時の再生トラブル」で爆死する。

今回は、`Slide.Shapes.AddMediaObject2`を軸に、マルチメディアオブジェクトのライフサイクルを完全に掌握するための設計手法を伝授する。

1. `AddMediaObject2`を選択すべき必然性

なぜ `AddMedia` ではなく `AddMediaObject2` なのか。それは、このメソッドが持つ「リンク」と「埋め込み」の柔軟性と、その後の `MediaFormat` プロパティへのアクセス権にある。

多くの初学者は、「とりあえず挿入すればいい」と考えがちだが、現場で求められるのは「再生トリガーの確定」と「メディア形式の非依存性」だ。動画ファイルを埋め込んだ後、それが「クリックで再生」なのか「自動再生」なのかをコードで制御できなければ、それはツールではなく単なる「配置作業の代替」に過ぎない。

2. プロダクション環境に耐えうる実装パターン

以下のコードは、単にメディアを挿入するだけでなく、スライドショー実行時の挙動をAPIレベルで上書きする設計だ。

‘ ———————————————————————-
‘ プロダクション用:メディアオブジェクト挿入・設定関数
‘ ———————————————————————-
Public Sub InsertAndConfigureMedia(ByRef targetSlide As Slide, _
ByVal filePath As String, _
ByVal left As Single, ByVal top As Single)

‘ ファイル存在確認は必須。実行時の例外を未然に防ぐ
If Dir(filePath) = “” Then
Err.Raise vbObjectError + 1001, “MediaTool”, “ファイルが見つかりません: ” & filePath
End If

‘ メディアの埋め込み
Dim shp As Shape
Set shp = targetSlide.Shapes.AddMediaObject2(filePath, msoFalse, msoTrue, left, top)

‘ メディアフォーマットの制御
With shp.MediaFormat
‘ 自動再生の設定
.AutoPlay = msoTrue

‘ ループ設定(必要に応じて)
.Looping = msoTrue

‘ 音量設定(0.0~1.0の範囲で制御)
.Volume = 0.8
End With

‘ アニメーションのトリガー設定(重要)
‘ 埋め込み直後のオブジェクトに対し、自動再生トリガーを明示的に付与
Dim eff As Effect
Set eff = targetSlide.TimeLine.MainSequence.AddEffect(shp, msoAnimEffectMediaPlay, , msoAnimTriggerOnPageClick)

‘ オブジェクトのレイアウト調整(メタデータ等の非表示化)
shp.Name = “AutoInsertedMedia_” & Format(Now, “hhmmss”)
End Sub

3. 設計上の「3つの鉄則」

現場でバグを起こさないために、以下の知見を心に刻んでほしい。

① 相対パスの罠を回避せよ

VBAからファイルを参照する際、カレントディレクトリは常に変動する。`ActivePresentation.Path` を基準にした絶対パスの生成を徹底すること。これを行わないと、別PCに配布した瞬間にツールは沈黙する。

② メディアの「初期化完了」を待機する設計

巨大な動画ファイルを連続挿入する場合、`AddMediaObject2` の完了を待たずに次の処理へ進むと、Shapeが正しく初期化されず、プロパティ操作で `Automation Error` が発生することがある。必要であれば、ループ処理の合間に `DoEvents` を挟み、オブジェクトのスタックを整理せよ。

③ アニメーション順序のロジック

`AddMediaObject2` で挿入した直後のメディアは、デフォルトでは「クリック待ち」の状態になることが多い。自動再生(`AutoPlay = msoTrue`)を機能させるには、単にプロパティをいじるだけでなく、`TimeLine.MainSequence` に対して「スライド開始時(With Previous)」のアニメーション設定を明示的に追加するのが、最も確実な「プロの振る舞い」である。

4. 最後に:なぜ「動的制御」が必要なのか

単にファイルを追加するだけのスクリプトは、単なる「作業の自動化」に過ぎない。真のエンジニアが目指すべきは、「誰がどの環境でプレゼンしても、メディアが確実に、意図した音量とタイミングで再生される」という、プレゼンテーションの信頼性を担保する仕組みだ。

このコードをベースに、フォルダ内の動画を一括挿入するループ処理や、データベースからパスを読み込んで属性を付与するロジックを組めば、もはや手作業に戻ることはできないはずだ。

自動化とは、単に楽をすることではなく、「ミスが発生しうる余地を、コードの力で論理的に排除すること」である。この設計思想を忘れないでほしい。

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