【PowerPoint】スライドをランダムで表示

##はじめに

[スライドをランダムに並び替えるPowerPointマクロ]( https://www.relief.jp/docs/017746.html)をベースにスライドの順番をランダムに入れ替えるマクロを作ってみました。

- スライドをランダムにする

- スライドを2枚セットでランダムにする



![FrashCard.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527341/682fd220-f5a5-d49c-b592-a77ac19162fd.gif)


##マクロ実行のタイミング

**スライドショー終了時にマクロを実行する。**
スライドショーを再生する前にスライドを並び替えるのは難しくスライドショーを一度再生し、次にスライドショーを再生する時にスライドの順番がランダムで並び替わっているという方法にした。
※コードはSlideモジュールに記述してください。


##スライドをランダムにする
フラッシュカードを1枚ずつランダムに入れ替える。

###コード

```vb

Public Sub OnSlideShowTerminate(ByVal Wn As SlideShowWindow)

    Dim sld As Long
    Dim cnt As Long
    Dim i As Long
    
    cnt = ActivePresentation.Slides.Count
    If cnt < 2 Then Exit Sub
    ActiveWindow.ViewType = ppViewSlideSorter
    Randomize
 
    For i = 1 To cnt

        sld = (cnt - 2) * Rnd + 2
        ActivePresentation.Slides(sld).Select
        ActiveWindow.Selection.Cut
        ActivePresentation.Slides(cnt - 1).Select
        ActiveWindow.View.Paste 
        
    Next i

    ActiveWindow.ViewType = ppViewNormal 
End Sub
```


###解説


```vb

Public Sub OnSlideShowTerminate(ByVal Wn As SlideShowWindow)
```



スライドを終了した時にマクロを自動実行する。
ExcelのAuto_OpenやWordのAutoOpenみたいなもの。

```vb

cnt = ActivePresentation.Slides.Count
```

スライド数をカウント。

```vb

If cnt < 2 Then Exit Sub
```

スライドが2枚（タイトルスライド含む）より少ない場合は順番を変えることができない為、マクロ終了。


```vb

ActiveWindow.ViewType = ppViewSlideSorter
Randomize
```

スライド一覧モードにし乱数を初期化。

```vb

For i = 1 To cnt

    sld = (cnt - 2) * Rnd + 2

    ActivePresentation.Slides(sld).Select
    ActiveWindow.Selection.Cut
    ActivePresentation.Slides(cnt - 1).Select
    ActiveWindow.View.Paste 
        
Next i
```

ここではタイトルスライドを除くスライド番号をランダムで指定し、カット＆ペーストを行うことによって順番を入れ替えている。
それをスライド数、繰り返す。


```vb
ActiveWindow.ViewType = ppViewNormal 
```

最後に標準モードに戻し終了。


##スライドを2枚セットでランダムにする

フラッシュカードでは問題と解答をセットでランダムにしたい場合もある。

###コード


```vb

Public Sub OnSlideShowTerminate(ByVal Wn As SlideShowWindow)
    Dim sld As Long
    Dim cnt As Long
    Dim i As Long
    
    cnt = ActivePresentation.Slides.Count

    If cnt < 4 Then Exit Sub

    ActiveWindow.ViewType = ppViewSlideSorter
    Randomize
     
    For i = 1 To cnt
    
        sld = (cnt - 2) * Rnd + 2
    
        If sld Mod 2 = 0 Then
            ActivePresentation.Slides.Range(Array(sld, sld + 1)).Select
            ActiveWindow.Selection.Cut
            ActivePresentation.Slides(cnt - 2).Select
            ActiveWindow.View.Paste

        Else
            i = i - 1
        End If    
    Next i
    ActiveWindow.ViewType = ppViewNormal
End Sub
```


###解説

上記のマクロと変更した部分は


```vb
If sld Mod 2 = 0 Then
    ActivePresentation.Slides.Range(Array(sld, sld + 1)).Select
    ActiveWindow.Selection.Cut
    ActivePresentation.Slides(cnt - 2).Select
    ActiveWindow.View.Paste
Else
    i = i - 1
End If
```


この部分。

スライド番号が奇数だと問題と解答が離れてしまう為、偶数の場合のみ実行する。
選択したスライドとその次のスライドをカット＆ペーストする。
奇数の場合は繰り返す回数を増やす。

##まとめ

主に教育現場で使われるだろうフラッシュカードをPowerPointでランダムに再生する方法に関して説明しました。

- スライドをランダムで再生する

- 問題と解答のスライドをセットでランダムにする

スライド数やスライドの内容を変更しても問題ありません。
タイトルには「よ～い！」とか入れてみてください。
フラッシュカードの設定はタイトルスライド以降のスライドを選択し、画面切り替えのタイミングを自動にして時間を設定してください。

足し算、引き算、九九などにぜひご活用ください。

応用編は[こちら](https://qiita.com/risklqbz/items/628c84041a17686d0f0d)