PowerPoint VBAのイベントで、
アニメーションのイベントを探ってみました
と言っても
WithEvents App As Application
で
SlideShowNextClick スライドショー内のクリック
SlideShowNextBuild アニメーション 表示前
タイミングをテストしただけでした。
また、
SlideShowView.GetClickCount メソッド (PowerPoint)
SlideShowView.GetClickIndex メソッド (PowerPoint)
SlideShowView.GotoClick メソッド (PowerPoint)
をテストしてみました。
下記、少し落ち着こうよ・・・の解説動画です。
パワーポイントでイベント処理を行うヒントとなれば・・・
youtu.be
https://youtu.be/Z1O9KtMlxak
目次
00:00 挨拶、やりたいこと
00:35 1.パワポにイベント処理を書く
03:54 1.2 実行させ、説明する
08:22 1.3 スライドショー時、画面切り替え自動 を説明
10:51 SlideShowEnd後、Set Nothingで切断
12:05 2.時間帯で音声を切り替えてみた・・・
13:50 SlideShowNextClick時に次のアニメーション音声を選択・判断
18:06 3.次へ のボタンが押されるまで 1ページ目のアニメを繰り返す
23:04 Wn.View.GotoClick 1が失敗 アニメが再描画しない
25:33 蛇足で3ページ内のループをテスト作成でハマる
27:27 ダミーのアニメが必要?(現在アニメ最後の判断が間違ってます)
クラスモジュールに
Public WithEvents App As Application
と書き、
次に
標準モジュールで
Dim X As New EventClassModule
Sub ppスライド開始() '↑クラスモジュールとアプリをリンクしてイベント処理
Set X.App = Application 'イベントを拾えるように代入
'↑クラスモジュール EventClassModule 内で、
'WithEvents App As Application で定義しているので、開始時に代入
ActivePresentation.SlideShowSettings.Run 'スライドショーを開始する
End Sub
とすると、
パワポのスライドショー時のイベントを操作することができます。
と言っても、
イベントのタイミングで、
Debug.Print しただけの説明ですが・・・
1.2 実行させ、説明する
'Build ビルド?次を作るとき? ' https://learn.microsoft.com/ja-jp/office/vba/api/powerpoint.application.slideshownextbuild 'マウス クリックするか、アニメーションのタイミング、 'アニメーション化されたオブジェクトが表示される前に発生します。 Private Sub App_SlideShowNextBuild(ByVal Wn As SlideShowWindow) Debug.Print Now() & "SlideShowNextBuild 次を作成するタイミングで呼ばれる" Debug.Print " GetClickCount=" & Wn.View.GetClickCount & " アニメタイミング総数" Debug.Print " GetClickIndex=" & Wn.View.GetClickIndex & " 今のアニメ位置※グループ化" Debug.Print "--" End Sub
1.3 スライドショー時、画面切り替え自動 を説明
2.時間帯で音声を切り替えてみた・・・
アニメを条件によって、スキップさせたい、
そんな例として、
アニメ 音声を 時間によって切り替え、スキップさせてみた。
なんて言ってますが、
中身は単純で、
Private p As Long 'スライドページ数
とページを覚える変数を作り、
Private Sub App_SlideShowNextSlide(ByVal Wn As SlideShowWindow) p = Wn.View.Slide.SlideIndex 'ページ数 SlideIndex Debug.Print Now() & " SlideShowNextSlide スライドNo." & p End Sub
スライドが切り替わったタイミングで、
ページを覚える。
クリック、次へのイベント
SlideShowNextClick
内で、
GetClickIndex でチェック 判断のタイミングを計り
If Time() < #10:00:00 AM# Then '10時より下は、おはようにする
違ったら、
Wn.View.GotoClick 2 '強引に次 2のお昼へ
と、飛ばしただけでした・・・
3.次へ のボタンが押されるまで 1ページ目のアニメを繰り返す
次へのボタンが押されるまで、
1ページのアニメーションを繰り返してみた
※繰り返したかったけど、ページを飛ばし直しました・・・
'Build ビルド?次を作るとき? ' https://learn.microsoft.com/ja-jp/office/vba/api/powerpoint.application.slideshownextbuild 'マウス クリックするか、アニメーションのタイミング、 'アニメーション化されたオブジェクトが表示される前に発生します。 Private Sub App_SlideShowNextBuild(ByVal Wn As SlideShowWindow) Debug.Print Now() & "SlideShowNextBuild 次を作成するタイミングで呼ばれる" Debug.Print " GetClickCount=" & Wn.View.GetClickCount & " アニメタイミング総数" Debug.Print " GetClickIndex=" & Wn.View.GetClickIndex & " 今のアニメ位置※グループ化" Debug.Print "--" 'スライドが1ページ目の時だけ、ループさせる If Wn.View.Slide.SlideIndex = 1 Then 'アニメの終わりを 総数=現在のインデックスで判断 If Wn.View.GetClickCount = Wn.View.GetClickIndex Then 'Wn.View.GotoClick 1 'アニメ1へ飛ばせば・・と思ったがダメでした 'スライドを移動(1ページに飛ばし、再読み込み扱いでかわす) Wn.View.GotoSlide 1 '↑なんか、しっくりこないけど、これでループします。 End If End If End Sub
以上、簡単なテスト・デバッグ動画でした、、、
ソース01
Option Explicit Dim X As New EventClassModule Sub ppスライド開始() '↑クラスモジュールとアプリをリンクしてイベント処理 Set X.App = Application 'イベントを拾えるように代入 '↑クラスモジュール EventClassModule 内で、 'WithEvents App As Application で定義しているので、開始時に代入 ActivePresentation.SlideShowSettings.Run 'スライドショーを開始する End Sub Sub ppスライド終了() Set X.App = Nothing 'イベントとのつながりを切る End Sub クラス Option Explicit Public WithEvents App As Application Private Sub App_SlideShowBegin(ByVal Wn As SlideShowWindow) Debug.Print Now() & " SlideShowBegin スライドショーの開始" End Sub Private Sub App_SlideShowEnd(ByVal Pres As Presentation) Debug.Print Now() & " SlideShowEnd スライドショーの終了" '終了のタイミング Call ppスライド終了 '標準モジュールにSet = Nothingを書きリンクを切る End Sub 'SlideShowNextClick こんなイベントもあったりします Private Sub App_SlideShowNextClick(ByVal Wn As SlideShowWindow, ByVal nEffect As Effect) Debug.Print Now() & " SlideShowNextClick 次へ行くとき通ります" End Sub 'Build ビルド?次を作るとき? ' https://learn.microsoft.com/ja-jp/office/vba/api/powerpoint.application.slideshownextbuild 'マウス クリックするか、アニメーションのタイミング、 'アニメーション化されたオブジェクトが表示される前に発生します。 Private Sub App_SlideShowNextBuild(ByVal Wn As SlideShowWindow) Debug.Print Now() & "SlideShowNextBuild 次を作成するタイミングで呼ばれる" Debug.Print " GetClickCount=" & Wn.View.GetClickCount & " アニメタイミング総数" Debug.Print " GetClickIndex=" & Wn.View.GetClickIndex & " 今のアニメ位置※グループ化" Debug.Print "--" End Sub
ソース02
Option Explicit Public WithEvents App As Application Private p As Long 'スライドページ数 Private Sub App_SlideShowBegin(ByVal Wn As SlideShowWindow) Debug.Print Now() & " SlideShowBegin スライドショーの開始" End Sub Private Sub App_SlideShowNextSlide(ByVal Wn As SlideShowWindow) p = Wn.View.Slide.SlideIndex 'ページ数 SlideIndex Debug.Print Now() & " SlideShowNextSlide スライドNo." & p End Sub Private Sub App_SlideShowEnd(ByVal Pres As Presentation) Debug.Print Now() & " SlideShowEnd スライドショーの終了" '終了のタイミング Call ppスライド終了 '標準モジュールにSet = Nothingを書きリンクを切る End Sub 'SlideShowNextClick こんなイベントもあったりします Private Sub App_SlideShowNextClick(ByVal Wn As SlideShowWindow, ByVal nEffect As Effect) Debug.Print Now() & " SlideShowNextClick 次へ行くとき通ります" Debug.Print " GetClickIndex=" & Wn.View.GetClickIndex & " 今のアニメ位置※グループ化" 'test If p = 1 Then '1ページ目のみ下記のチェック '時間帯のチェック 'GetClickIndex = 1:おはよう 2:お昼 If Wn.View.GetClickIndex = 1 Then 'おはようを再生するか?チェック If Time() < #10:00:00 AM# Then '10時より下はおはようにする 'そのまま再生 Else Wn.View.GotoClick 2 '強引に次 2のお昼へ End If End If If Wn.View.GetClickIndex = 2 Then '昼時間のチェック '10~12時はお昼のメッセージ If Time() > #10:00:00 AM# And Time() < #12:00:00 PM# Then 'そのまま再生 Else Wn.View.GotoClick 3 '違ったら、次へスキップする End If End If '↑もっと、うまくIF文かけそうだけど、 'こんな感じて、時間帯でアニメ(音声)をスキップできる 'View.GetClickIndex が現在処理候補 'View.GotoClick n でn番目に飛ばす End If End Sub 'Build ビルド?次を作るとき? ' https://learn.microsoft.com/ja-jp/office/vba/api/powerpoint.application.slideshownextbuild 'マウス クリックするか、アニメーションのタイミング、 'アニメーション化されたオブジェクトが表示される前に発生します。 Private Sub App_SlideShowNextBuild(ByVal Wn As SlideShowWindow) Debug.Print Now() & "SlideShowNextBuild 次を作成するタイミングで呼ばれる" Debug.Print " GetClickCount=" & Wn.View.GetClickCount & " アニメタイミング総数" Debug.Print " GetClickIndex=" & Wn.View.GetClickIndex & " 今のアニメ位置※グループ化" Debug.Print "--" End Sub
ソース03
Option Explicit Public WithEvents App As Application Private Sub App_SlideShowBegin(ByVal Wn As SlideShowWindow) Debug.Print Now() & " SlideShowBegin スライドショーの開始" End Sub Private Sub App_SlideShowEnd(ByVal Pres As Presentation) Debug.Print Now() & " SlideShowEnd スライドショーの終了" '終了のタイミング Call ppスライド終了 '標準モジュールにSet = Nothingを書きリンクを切る End Sub 'SlideShowNextClick こんなイベントもあったりします Private Sub App_SlideShowNextClick(ByVal Wn As SlideShowWindow, ByVal nEffect As Effect) Debug.Print Now() & " SlideShowNextClick 次へ行くとき通ります" End Sub 'Build ビルド?次を作るとき? ' https://learn.microsoft.com/ja-jp/office/vba/api/powerpoint.application.slideshownextbuild 'マウス クリックするか、アニメーションのタイミング、 'アニメーション化されたオブジェクトが表示される前に発生します。 Private Sub App_SlideShowNextBuild(ByVal Wn As SlideShowWindow) Debug.Print Now() & "SlideShowNextBuild 次を作成するタイミングで呼ばれる" Debug.Print " GetClickCount=" & Wn.View.GetClickCount & " アニメタイミング総数" Debug.Print " GetClickIndex=" & Wn.View.GetClickIndex & " 今のアニメ位置※グループ化" Debug.Print "--" 'スライドが1ページ目の時だけ、ループさせる If Wn.View.Slide.SlideIndex = 1 Then 'アニメの終わりを 総数=現在のインデックスで判断 If Wn.View.GetClickCount = Wn.View.GetClickIndex Then 'Wn.View.GotoClick 1 'アニメ1へ飛ばせば・・と思ったがダメでした 'スライドを移動(1ページに飛ばし、再読み込み扱いでかわす) Wn.View.GotoSlide 1 '↑なんか、しっくりこないけど、これでループします。 End If End If 'スライドが3ページ目の時だけ、ループさせる If Wn.View.Slide.SlideIndex = 3 Then 'アニメの終わりを 総数=現在のインデックスで判断 If Wn.View.GetClickCount = Wn.View.GetClickIndex Then 'Wn.View.GotoClick 1 'アニメ1へ飛ばせば・・と思ったがダメでした 'スライドを移動(3ページに飛ばし、再読み込み扱いでかわす) Wn.View.GotoSlide 3 '↑なんか、しっくりこないけど、これでループします。 End If End If End Sub