소개

 

실제 슬라이드 순서를 건드리지는 않고
100개의 슬라이드에서 랜덤으로 배열(추출)된 5개 문제슬라이드로 차례대로 이동하고
재시작 또는 종료하는 예제입니다.

 

 

조건

  • 슬라이드 순서를 그대로 유지(바꾸지 않기)
  • <스페이스> 등 다음 슬라이드를 누르면 다음 랜덤 슬라이드로 이동
  • 마지막에 종료 메시지 출력
  • 종료 후 다시 시작하면 다른 랜덤 5슬라이드로 이동. 무한 반복

 

구현

  • 슬라이드쇼 재구성을 이용해서 실행할 때마다 사용자정의 슬라이드쇼를 생성
  • 시작을 누르면 새로운 슬라이드쇼를 시작 (화면이 새로 시작하는 단점이 있음)
  • 모든 슬라이드 순서를 슬라이드 ID로 구분해서 랜덤 재배열해서 처음 5개만 추출하여 쇼를 재구성
  • 5슬라이드 후 마지막 슬라이드로 이동
  • 재시작을 누르면 다시 다른 쇼를 재구성하여 시작
  • 슬라이드쇼 종료시 재구성한 쇼 삭제

 

 

실행 영상

 

실행 코드

Option Explicit
Option Base 1

Dim Started As Boolean
Const qCount As Integer = 5     '문제 개수

 
'Sub NotUsed_onSlideShowPageChange(SSW As SlideShowWindow)
'
'    If SSW.View.CurrentShowPosition = 1 Then
'        'SSW.View.Exit
'        CallNamedShow
'    End If
'
'End Sub

Sub onSlideShowTerminate(SSW As SlideShowWindow)

    If Not Started Then RemoveNamedShows
    Started = False
    ActiveWindow.View.GotoSlide 1
End Sub

Sub CallNamedShow()
    
    Dim pres As Presentation
    Dim myShow As NamedSlideShow
    Dim sCount As Long, i As Long, t As Long, r As Long
    Dim Arr() As Long, qArr() As Long
    Dim usr As VbMsgBoxResult
    
    Randomize   ' 랜덤 시드 초기화
   
    '기존 쇼 삭제
    RemoveNamedShows
    
    'usr = MsgBox(qCount & "개의 문제가 출제됩니다." & vbNewLine & vbNewLine & _
        "시작하려면 <확인>을 누르세요.", vbOKCancel + vbInformation, "알림")
    'If usr = vbCancel Then Exit Sub
        
    Set pres = ActivePresentation
    sCount = pres.Slides.Count - 2  '첫번째와 마지막 슬라이드 제외

    '초기화 : 각 슬라이드의 SlideID를 저장
    ReDim Arr(1 To sCount)
    For i = 1 To sCount
        Arr(i) = pres.Slides(i + 1).SlideID
    Next i

    '순서 섞기
    For i = 1 To sCount
        r = Int(Rnd * sCount) + 1
        t = Arr(i)
        Arr(i) = Arr(r)
        Arr(r) = t
    Next i
    
    ReDim qArr(1 To qCount + 1)
    For i = 1 To qCount
        qArr(i) = Arr(i)
    Next i
    qArr(qCount + 1) = pres.Slides(pres.Slides.Count).SlideID
    
    '확인
    'For i = 1 To qCount + 1: Debug.Print qArr(i) & " ";: Next i: Debug.Print
 
    
    '새로운 쇼 재구성
    With pres.SlideShowSettings.NamedSlideShows
                            
        Set myShow = .Add("myShow" & "_" & Format(Now, "mmddhhnnss"), qArr)
        
    End With
    
    Started = True
  
    pres.SlideShowWindow.View.Exit

    With pres.SlideShowSettings
        .RangeType = ppShowNamedSlideShow
        '.ShowPresenterView = msoFalse
        '.ShowType = ppShowTypeSpeaker
        '.ShowWithAnimation = msoTrue
        .SlideShowName = myShow.Name
        .Run
    End With

End Sub

Sub RemoveNamedShows()
    Dim i As Integer
    
    With ActivePresentation.SlideShowSettings.NamedSlideShows
        '기 존 쇼 삭제
        For i = .Count To 1 Step -1
            If .Item(i).Name Like "myShow*" Then .Item(i).Delete
        Next i
    End With
    
End Sub

 

 

첨부 파일

 

Random105.pptm
0.21MB

 

 

참고 링크