PowerPoint (全般)

PowerPoint 全般に関する話題を扱うフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Mac OS X : PowerPoint 2016)
スライド内の3つの画像をエンターキーでランダム表示
投稿日時: 17/12/08 08:55:17
投稿者: pochipochi777

お世話になります。
 
1枚のスライド内に3つの画像(Macのスクリーンショットで撮影したもの)があります。それぞれ順番にアニメーションをつけるのではなく,エンターキー(エンターキーでなくても構いません)を押すことで,ランダムに表示されるようにしたいのです。
 
以下は動作例です。
 
初期状態は何も表示されていない

エンターキーを押す

画像2が表示される

エンターキーを押す

画像2が消える

エンターキーを押す

画像3が表示される





 
といった流れです。ただ,同じ画像が続けて表示されても構いません。ランダム表示で構わないのです。
 
ご教示いただけましたら幸いに存じます。

回答
投稿日時: 17/12/09 08:31:46
投稿者: んなっと

Macは持っていないので、以下WindowsでVBAを使う方法を書きます。
参考にはならないかもしれません。
 
 テスト用にスライド1枚だけのをプレゼンテーションを作成
→タイトルなども含めてすべてのオブジェクトを削除、スライド上に何もない状態に
→3枚の画像を挿入
→標準モジュールに以下のコードを貼り付け
 
Dim startFlg As Boolean
Dim AniNum As Long
Sub Prep()
  Dim Pre As Presentation
  Dim Sld As Slide
  Dim Shp As Shape
  Dim i As Long
  Set Pre = ActivePresentation
  Set Sld = ActiveWindow.View.Slide
  With Sld.TimeLine.MainSequence
    For Each Shp In Sld.Shapes
      For i = 1 To 2
        With .AddEffect(Shp, msoAnimEffectFade)
          If i = 2 Then
            .Exit = msoTrue
          End If
        End With
      Next i
    Next
  End With
  For i = 1 To 3 Step 2
    With Pre.Slides.Add(i, ppLayoutBlank).SlideShowTransition
      .AdvanceOnTime = msoTrue
      .AdvanceTime = 0
    End With
  Next i
  With Pre.SlideShowSettings
    .AdvanceMode = ppSlideShowUseSlideTimings
    .LoopUntilStopped = msoTrue
  End With
End Sub
Sub OnSlideShowPageChange(ByVal Wn As SlideShowWindow)
  If startFlg = False Then 'スライドショー開始時のとき
    startFlg = True
    AniNum = 0
    Call DummyLabelSet
  Else
    AniNum = 0
  End If
End Sub
Private Sub DummyLabelSet()
  Dim Shp As Shape
  With ActivePresentation.SlideMaster
    On Error Resume Next
      Set Shp = .Shapes("DummyLbl") '自動実行用ダミーコントロールが
   On Error GoTo 0
    If Shp Is Nothing Then 'なければマスタ左上に追加(最初だけ)
      Set Shp = .Shapes.AddOLEObject(Left:=-2, Top:=-2, _
          Width:=2, Height:=2, _
          ClassName:="Forms.Label.1", Link:=msoFalse)
      With Shp
        .Name = "DummyLbl"
        .Visible = msoFalse
      End With
    End If
  End With
End Sub
Sub OnSlideShowNextBuild(ByVal Wn As SlideShowWindow)
  AniNum = AniNum + 1
  If AniNum >= 2 Then
    Wn.View.GotoSlide 3
    Call AnimChange
  End If
End Sub
Sub OnSlideShowPreviousBuild(ByVal Wn As SlideShowWindow)
  AniNum = AniNum - 1
End Sub
Private Sub AnimChange()
  Dim Sld As Slide
  Dim newNum As Long
  Dim i As Long
  Set Sld = ActivePresentation.Slides(2)
  Randomize
  newNum = Int(Sld.Shapes.Count * Rnd + 1)
  With Sld.TimeLine.MainSequence
    If .Count > 0 Then
      For i = 1 To 2
        .Item(2 * newNum).MoveTo 1
      Next i
    End If
  End With
End Sub
Sub OnSlideShowTerminate(ByVal Wn As SlideShowWindow)
  startFlg = False 'スライドショー終了
  AniNum = 0
End Sub
 
→マクロPrep実行
→スライドショーを実行して確認
→マクロ有効ファイル(*.pptm)で保存

投稿日時: 17/12/09 16:01:02
投稿者: pochipochi777

んなっと様
 
出張のためお返事が遅くなりましたことお詫びいたします。
 
早速ご教示の通りにやってみたのですが,2つございまして,1点目は白紙のスライドが増えてしまうこと,2点目は,1枚目の画像提示はOKなのですが,再度エンターキーを押しますとクラッシュします。1点目は大きな問題ではございませんが,2点目は何回やってもだめです.....。やはりここにWinとMacのVBAの差が出てしまっているのでしょうか.....。
 
会社に行かないとWinで確かめることができません。日曜日に出勤して確認をして,またご連絡いたします。
 
Macで動くと一番良いのですが.....。
 

回答
投稿日時: 17/12/09 17:19:07
投稿者: んなっと

ごめんなさい、その後いろいろ検索したのですが、
この方法では無理みたいです。
力になれなくて申し訳ありません。

投稿日時: 17/12/10 14:16:09
投稿者: pochipochi777

んなっと様
 
ありがとうございます。いろいろとお時間をとっていただき恐縮でございます。
 
少し発想を変えたのですが,同じスレッド内ではわかりにくいと考えまして,別に立てさせていただきます。
 
失礼いたします。