【PowerPoint】スライドを指定した数ごとにランダムで表示する

##はじめに

前回記事[【PowerPoint】スライドをランダムで表示](https://qiita.com/risklqbz/items/c959813f99d35c24abca)では2枚までしかセットで入れ替えることができませんでしたが、今回は数値を指定すると複数セットで分けることができるよう作成しました。
使い方や設定方法は前回記事をご覧ください。

<img width="400" alt="slide" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527341/095a1a86-c617-dda5-4838-cf3291b1732f.jpeg">


##準備
-	コードはSlideモジュールに記述する。（前回と同じ。）
-	スライド終了時にマクロを実行する。（前回と同じ。）

-	タイトルスライド（スライド1）に”inputTextbox”という名前のオートシェイプを作成する。
そこに入力された数字をもとにスライドを分けるという仕組み。
例えば、「7」を入力していると7枚ごとに（タイトルスライド除く）ランダムに振り分ける。

##スライドを指定した数のセットで入れ替える

###コード

```vb

Public Sub OnSlideShowTerminate(ByVal Wn As SlideShowWindow)

    Dim sld As Long
    Dim cnt As Long
    Dim i As Long
    Dim sld1 As Slide
    Dim shp As Shape
    Dim setNumber As Long
    Dim arry() As Variant
    
    cnt = ActivePresentation.Slides.Count

    Set sld1 = ActivePresentation.Slides(1)

    Set shp = Shapes("inputTextbox")

    sld1.Select

    If ActiveWindow.ViewType = ppViewSlideSorter Then

        ActiveWindow.ViewType = ppViewNormal

    End If

    shp.Select

    setNumber = shp.TextFrame.TextRange.Text

    If IsNumeric(setNumber) = False Then

        MsgBox ("数値を入力してください。")

        Exit Sub

    End If


    If cnt < 2 * setNumber Then
        MsgBox ("スライド数が足りません。")
        Exit Sub

    ElseIf cnt = 2 Then
        MsgBox ("スライド数を2以上にしてください。")
        Exit Sub
    End If

    If setNumber = 1 Then
        GoTo L1:

    ElseIf Not cnt Mod setNumber = 1 Then
        MsgBox ("スライド数をセットした倍数にしてください。")
        Exit Sub
    End If

L1:

    ActiveWindow.ViewType = ppViewSlideSorter
    Randomize

    For i = 1 To cnt

        sld = (cnt - 2) * Rnd + 2

        If (sld - 2) Mod setNumber = 0 Then

            ReDim arry(setNumber)       
    
            For k = 0 To setNumber - 1
                arry(k) = sld
                sld = sld + 1
            Next k

            ActivePresentation.Slides.Range(arry).Select
            ActiveWindow.Selection.Cut
            ActivePresentation.Slides(cnt - setNumber).Select
            ActiveWindow.View.Paste

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


###解説

[前回](https://qiita.com/risklqbz/items/c959813f99d35c24abca)より変更した箇所を解説します。

```vb
Set sld1 = ActivePresentation.Slides(1)
```
スライド(1)を変数に代入。

```vb
Set shp = Shapes("inputTextbox")
```
"inputTextbox"という名前の図形を変数に代入。名前はスライド(1)で作成した図形の名前にする。

```vb
sld1.Select
```
スライド(1)を選択。

```vb
If ActiveWindow.ViewType = ppViewSlideSorter Then
    ActiveWindow.ViewType = ppViewNormal
End If
```

エラー等でスライド一覧モードになっている場合は標準モードに戻す。

```vb
shp.Select
```
スライド(1)の"inputTextbox"を選択。

```vb
setNumber = shp.TextFrame.TextRange.Text
```
入力した数値をセット数に代入。

```vb
If IsNumeric(setNumber) = False Then
    MsgBox ("数値を入力してください。")
    Exit Sub
End If
```

もし数値じゃない場合マクロ終了。

```vb
If cnt < 2 * setNumber Then
    MsgBox ("スライド数が足りません。")
    Exit Sub

ElseIf cnt = 2 Then
    MsgBox ("スライド数を2以上にしてください。")
    Exit Sub
End If
```

スライド数が入れ替えれる数より少ない場合マクロ終了。

```vb
If setNumber = 1 Then       
    GoTo L1

ElseIf Not cnt Mod setNumber = 1 Then
    MsgBox ("スライド数をセットした倍数にしてください。")
    Exit Sub
End If
L1:

```

セットした数が1の時はマクロ継続。
スライド数がセットした数で割り切れない場合、マクロ終了。


```vb
If (sld - 2) Mod setNumber = 0 Then
```
スライド番号をタイトルスライド除くsetNumberの倍数で指定。


```vb
ReDim arry(setNumber)
```
配列を再定義。


```vb
For k = 0 To setNumber - 1
    arry(k) = sld
    sld = sld + 1
Next k
```

スライド番号をセット数格納する。

```vb
Else
    i = i - 1
End If
```
条件外の時繰り返し回数を増やす

##まとめ

「スライドを指定した数ごとにランダムで表示する」に関して説明しました。
ぜひご活用ください。