仲間からプレゼンを自動で行いたいが、プレゼンの総時間がわからないかと問い合わせがありました
なぜ総時間を知りたいかというと、バックグラウンドミュージックを流すのですが、流しっぱなしにすると最後でプッツンと終わってしまうので、音をフェードアウトし静かに終わりたいとのことです

オーディオをクリックして再生でフェードアウトを設定

再生・バックグラウンドで再生

右クリック・トリム 再生時間を設定します

 


設定

  • 画面切り替え・画面切り替えのタイミング・自動で秒数を設定します
  • すべてに適用:とりあえずすべてのスライドで同じ秒数にします


確認

  • 表示・スライド一覧で表示されるスライドの右下に秒数が表示されます
  • 今回の例では13スライド*3秒で39秒です

 


実際に動かすと61秒になります
二つことが反映されていません

  1. 画面切り替えの継続時間
  2. スライドに含まれるシェイプのアニメーション時間と遅延時間

これらはスライドの実総時間にプラスされます

この時間を取得するのが簡単にできなかったのでVBAで取得することにしました

このプログラムを作るのに必要な情報がまとまっているところはなかったですので探すのに大変苦労しました。

そもそもプレゼンの総時間がどんな項目で規定されているかという情報自体を見つけることができませんでしたので、設定をいろいろと変えてみて作業をしました

 

定義プレゼンの総時間は下記の4っつの総和になります

  • 画面切り替え:画面切り替えのタイミング:自動で設定される秒
  • 画面切り替え:期間
  • シェイプアニメーション遅延時間
  • シェイプアニメーション継続時間
表示・スライド一覧で正確な時間が表示されないのが、そもそもの欠陥ではないでしょうか?
microsoftさんちゃんと作ってよ
 
結局、下記の小さなプログラムをつくるのに3時間もかかり、なかなかいい勉強になりました


Sub 自動スライドショー表示時間取得()
  Dim sld As Slide
  Dim time_tmp As Single
  Dim time_sum As Single
  Dim ShapeWaitSec
  Dim durationsec As Double
  Dim numDU As Double
  
  time_sum = 0

  For Each sld In ActivePresentation.Slides
  
  With sld
 'スライドの画面切り替えタイミング自動時間の取得
    time_tmp = .SlideShowTransition.AdvanceTime
 '継続時間取得
    tsdu = .SlideShowTransition.Duration
 
 'シェイプのアニメーション遅延時間取得
    ShapeWaitSec = 0
    For Each shp In sld.Shapes
        If shp.AnimationSettings.Animate And (shp.AnimationSettings.AdvanceTime <> 9.223372E+15 Or shp.AnimationSettings.AdvanceTime <> 0) Then
            ShapeWaitSec = ShapeWaitSec + shp.AnimationSettings.AdvanceTime
        End If
    Next shp
    
    time_sum = time_sum + time_tmp + tsdu + ShapeWaitSec
  End With

'シェイプのアニメーション継続時間取得
   n = sld.TimeLine.MainSequence.Count
   If n > 0 Then
       For k = 1 To n
        numDU = numDU + sld.TimeLine.MainSequence.Item(k).Timing.Duration
 '       Debug.Print sld.SlideIndex & ": " & k & " " & numDU
    
      Next
    End If
  Next sld
  
  w = time_sum + numDU
  
  MsgBox "総表示時間は、" & Int(w) & "秒です。"

End Sub