三流君のソースコード置き場

ブログにソースコードをアップして、ブログの検索機能で利用してます(利用予定です)

挨拶・自己紹介:「こんな感じ」や「あの、あの」と活舌の悪い、
三流プログラマーのオッサンです
Ken3三流君へ問い合わせ・連絡先:
[Ken3(管理者)へメッセージを送る], [YouTube動画にコメントを書く]
※↑質問・感想,コード修正・作成依頼など気軽に送ってください。

パワポの動画設定マクロ|自動再生とループを確実に動かす「AnimationOrder = 0」の秘訣

PowerPoint VBA】全スライドの動画を「自動再生&ループ」に一括設定するマクロ

PowerPointで大量の動画をスライドに貼った後、一つずつ「再生ボタンを押さずに自動で開始」「終わったらループ再生」と設定していくのは、おじさんには正直キツイ作業ですよね。

「ChatGPTにコードを書いてもらったけど、なぜか自動再生にならない!」という知恵袋の質問をきっかけに、確実に動くコードをデバッグしてみました。同じ悩みを持つ方の備忘録になれば幸いです。

動画での解説はこちら

[00:00](https://www.youtube.com/watch?v=4Dw5WpEWq_I&t=0s) 導入・やりたいことのテスト
[01:08](https://www.youtube.com/watch?v=4Dw5WpEWq_I&t=68s) 不具合確認(ループはOKだが自動再生がNG)
[03:23](https://www.youtube.com/watch?v=4Dw5WpEWq_I&t=203s) 改善案:アニメーションのTriggerTypeを操作する
[08:17](https://www.youtube.com/watch?v=4Dw5WpEWq_I&t=497s) 落とし穴!AnimationOrderを0(先頭)にする重要性
[12:51](https://www.youtube.com/watch?v=4Dw5WpEWq_I&t=771s) 完成したソースの再テスト

    • -

今回作成した完成版VBAソースコード

ChatGPTが生成したコードに、''「アニメーションの順番を先頭にする」''処理と''「開始タイミングを直前の動作と同時にする」''処理を追加した完成版です。

Sub AutoPlayAndLoopVideos_Fixed()
    Dim slide As slide
    Dim shp As Shape
    Dim objTimeLine As PowerPoint.TimeLine
    Dim objEffect As PowerPoint.Effect
    
    ' 全スライドをループ
    For Each slide In ActivePresentation.Slides
        Set objTimeLine = slide.TimeLine
        
        ' スライド内の全図形をチェック
        For Each shp In slide.Shapes
            ' メディア(動画)であるか判定
            If shp.Type = msoMedia Then
                If shp.MediaType = ppMediaTypeMovie Then
                    
                    ' 1. 再生設定(ループ再生)
                    With shp.AnimationSettings.PlaySettings
                        .PlayOnEntry = msoTrue
                        .LoopUntilStopped = msoTrue
                    End With
                    
                    ' 2. アニメーションの順番を一番先頭(0)にする
                    ' これをしないと、他にアニメがあると自動再生されない場合がある
                    shp.AnimationSettings.AnimationOrder = 0
                    
                    ' 3. 開始タイミングを「直前の動作と同時」に設定
                    ' TimeLineオブジェクトから該当するEffectを取得して設定する
                    Set objEffect = objTimeLine.MainSequence.Item(shp.AnimationSettings.AnimationOrder)
                    objEffect.Timing.TriggerType = msoAnimTriggerWithPrevious
                    
                End If
            End If
        Next shp
    Next slide

    MsgBox "設定が完了しました。スライドショーで確認してください。"
End Sub
    • -

ここがポイント!デバッグの記録

1. PlaySettingsだけでは「自動再生」にならない?

当初、ChatGPTのコードでは ``.PlayOnEntry = msoTrue`` を設定していましたが、これだけでは「クリック時」設定が残ってしまい、スライド切り替えと同時に再生が始まりませんでした。
解決策として、''TimeLineオブジェクトのMainSequence''を操作し、``TriggerType`` を ``msoAnimTriggerWithPrevious``(直前の動作と同時)に書き換える必要がありました。

2. 順番の罠:AnimationOrder = 0

動画を挿入する前に他の図形にアニメーションがついていると、動画のアニメーションがリストの下の方に配置されてしまいます。
``shp.AnimationSettings.AnimationOrder = 0`` を明示的に指定することで、スライドが表示された瞬間に真っ先に動画が動き出すようになります。
[08:17](https://www.youtube.com/watch?v=4Dw5WpEWq_I&t=497s) あたりの実演を見ると、その重要性がわかると思います。

    • -

今後の課題とアドバイス

今回は「全ての動画」を対象にしましたが、特定のスライドだけ除外したい場合などは、If文でスライド番号を判定するロジックを追加するとより使いやすくなります。

また、Mac環境での動作については、今回の検証(Windows10 / MS365)と挙動が異なる可能性があるため、もしMacユーザーの方がいたら注意してみてください。


質問・感想・クレームなど、
気軽にコメント欄に書いてもらえるとうれしいです。

[Googleフォームにコメントを残す]
↑質問・コメントの入力フォームです、気軽に書いてください


フッター:最後にKen3Videoの動画一覧を紹介します

YouTubeにアップした動画です。他の動画を一瞬でも見てもらえるとさらに嬉しいです。
再生リスト:[三流君Ken3の最新動画]←リストの一覧形式で表示する


また、ブログを見に来てくださいね。ではまたぁ~