三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

パワポ アニメのイベント SlideShowNextBuild などをWithEventsで使用する GetClickCount GetClickIndex ほか

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 ダミーのアニメが必要?(現在アニメ最後の判断が間違ってます)

1.パワポ VBAでイベント処理を書く

クラスモジュールに
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

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)