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

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

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

【PowerPoint VBA】大量の図形に「クリックで消える」アニメを一括設定!AddTriggerEffect活用術

PowerPoint VBA】大量の図形に一括設定!クリックで消えるパネルやクイズを自動作成する方法

パワーポイントで「クリックした図形が消える」という設定を大量の図形に行うとき、1つずつ手作業で設定して発狂しそうになったことはありませんか?
今回は、VBA(マクロ)を使って、クリックした図形がフェードアウトする「終了動作」を一括で自動設定する方法を備忘録としてまとめます。

[00:00](https://www.youtube.com/watch?v=9PNq6QRLtZ0&t=0s) やりたいこと、実行結果のデモ

1. アニメーションの「2つのシーケンス」を理解する

PowerPointのアニメーションタイムラインには、大きく分けて2つの種類があります。

  • ''MainSequence(メイン・シーケンス)'':クリックするたびに順番通りに実行される通常のアニメ。
  • ''InteractiveSequences(インタラクティブ・シーケンス)'':特定の図形をクリックした時にだけ動作する「トリガー設定」。

今回は、この「インタラクティブ・シーケンス」をVBAで操作して、効率化を図ります。

[00:43](https://www.youtube.com/watch?v=9PNq6QRLtZ0&t=43s) TimeLineのMainSequenceとInteractiveSequences違い

    • -

2. 選択した図形を「自分自身をクリックして消える」ようにする

まずは、選択した複数の図形それぞれに「自分自身をクリックしたらフェードアウト(終了)する」設定を一括で行うコードです。

'選択されたシェイプにアニメ効果を追加する
'自分自身が押されたら、自身を消す(終了アニメ)を追加
Sub pp選択Shapeにフェードアウトを追加_1個別にアニメ追加()

    If ActiveWindow.Selection.Type <> ppSelectionShapes Then
        MsgBox "Shape図形やテキストボックスを選択してね"
        Exit Sub
    End If
    
    If ActiveWindow.Selection.ShapeRange.Count = 0 Then
        MsgBox "Shape図形やテキストボックスを選択してね"
        Exit Sub
    End If

    Dim nPAGE As Integer
    Dim objSLD As PowerPoint.Slide
    Dim objShape As PowerPoint.Shape
    
    nPAGE = ActiveWindow.Selection.SlideRange.SlideIndex
    Set objSLD = ActivePresentation.Slides(nPAGE)
    
    'タイムラインを取得
    Dim objTimeLine As PowerPoint.TimeLine
    Set objTimeLine = objSLD.TimeLine
  
    Dim objEffect As PowerPoint.Effect
    Dim seqInteractive As PowerPoint.Sequence
    
    '選択された各シェイプに対してループ処理
    Dim n As Integer
    For n = 1 To ActiveWindow.Selection.ShapeRange.Count
        Set objShape = ActiveWindow.Selection.ShapeRange(n)
        
        'インタラクティブ・シーケンスを追加
        Set seqInteractive = objTimeLine.InteractiveSequences.Add(1)

        'AddTriggerEffect(対象図形, 効果, トリガーの種類, トリガーとなる図形)
        Set objEffect = seqInteractive.AddTriggerEffect( _
                            objShape, _
                            msoAnimEffectFade, _
                            msoAnimTriggerOnShapeClick, _
                            objShape)
        
        'ここがポイント:終了アニメーションにする
        objEffect.Exit = msoTrue 

    Next

    MsgBox "処理終了、アニメーションウィンドウで確認してください"
End Sub
重要なプロパティ
  • ''objEffect.Exit = msoTrue'':これを設定することで「表示(イン)」ではなく「消去(アウト)」のアニメーションになります。

[04:25](https://www.youtube.com/watch?v=9PNq6QRLtZ0&t=265s) マクロでエフェクト効果のフェードを追加
[06:00](https://www.youtube.com/watch?v=9PNq6QRLtZ0&t=360s) Effect.Exit = msoTrue でフェードアウトに切り替え

    • -

3. 「一括削除ボタン」と「個別消去」を組み合わせる(結合テスト

次に、個別に消すだけでなく「特定のボタン(例:削除全て)を押したときに全ての図形を一気に消す」というハイブリッドな設定です。

'個別クリックでフェードアウト + 「削除全て」ボタンで全消去
Sub pp選択Shapeにフェードアウトを追加_3結合テスト()
    If ActiveWindow.Selection.Type <> ppSelectionShapes Then Exit Sub

    Dim nPAGE As Integer
    Dim objSLD As PowerPoint.Slide
    Dim objShape As PowerPoint.Shape
    nPAGE = ActiveWindow.Selection.SlideRange.SlideIndex
    Set objSLD = ActivePresentation.Slides(nPAGE)
    
    'トリガーとなるシェイプの名前を指定
    Const strShpName = "削除全て" 
    Dim objTriggerShape As Shape
    On Error Resume Next
    Set objTriggerShape = objSLD.Shapes(strShpName)
    On Error GoTo 0
    
    If objTriggerShape Is Nothing Then
        MsgBox "トリガー用の " & strShpName & " が見つかりません"
        Exit Sub
    End If
    
    Dim objTimeLine As PowerPoint.TimeLine: Set objTimeLine = objSLD.TimeLine
    Dim objEffect As PowerPoint.Effect
    Dim seqInteractive As PowerPoint.Sequence
    
    Dim n As Integer
    For n = 1 To ActiveWindow.Selection.ShapeRange.Count
        Set objShape = ActiveWindow.Selection.ShapeRange(n)
        
        Set seqInteractive = objTimeLine.InteractiveSequences.Add(1)

        '1. 一括削除ボタン用のトリガー設定
        Set objEffect = seqInteractive.AddTriggerEffect( _
                            objShape, msoAnimEffectFade, _
                            msoAnimTriggerOnShapeClick, objTriggerShape)
        objEffect.Exit = msoTrue
        'ここがポイント:ボタンを押したときに全員同時に消えるよう設定
        objEffect.Timing.TriggerType = msoAnimTriggerWithPrevious 

        '2. 自分自身をクリックした時のトリガー設定
        Set objEffect = seqInteractive.AddTriggerEffect( _
                            objShape, msoAnimEffectFade, _
                            msoAnimTriggerOnShapeClick, objShape)
        objEffect.Exit = msoTrue
    Next

    MsgBox "結合テスト完了!"
End Sub

[08:58](https://www.youtube.com/watch?v=9PNq6QRLtZ0&t=538s) 選択図形・シェイプ全てをフェードアウトする
[12:06](https://www.youtube.com/watch?v=9PNq6QRLtZ0&t=726s) 直前の動作と同時の設定(TriggerWithPrevious)について

    • -

4. 活用シーン:クイズや演出を効率化

このマクロを使えば、以下のような演出が秒速で作れます。

  • ''例題1:画像を目隠しで隠し、クリックで公開''

[15:23](https://www.youtube.com/watch?v=9PNq6QRLtZ0&t=923s)

  • ''例題2:ランキングの目隠し解除''

[17:40](https://www.youtube.com/watch?v=9PNq6QRLtZ0&t=1060s)

  • ''例題3:大量のブロックで目隠し(モザイク除去風)''

[19:09](https://www.youtube.com/watch?v=9PNq6QRLtZ0&t=1149s)

大量の図形を並べてから「個別に消す」設定を手動で行うと数十分かかりますが、マクロなら一瞬です。

    • -

5. 終わりの挨拶とアドバイス

複数のシェイプに手作業でアニメを設定するのは非効率です。適切なメソッド(`AddTriggerEffect`)とプロパティ(`Exit`, `Timing`)さえ押さえれば、VBAで簡単に自動化できます。

泥縄式で開発するのも一興ですが(笑)、あらかじめ「どんな演出をしたいか」を設計してから組むと、よりスマートなコードになるはずです。
ぜひアレンジして使ってみてください。


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

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


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

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


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