소개
실제 슬라이드 순서를 건드리지는 않고
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
첨부 파일
참고 링크
- 모든 슬라이드의 순서를 실제로 섞어서 랜덤으로 재생하는 예제:
https://kin.naver.com/qna/detail.naver?d1id=1&dirId=102020103&docId=432885383#answer2 - 기존 답변
https://kin.naver.com/qna/detail.naver?d1id=1&dirId=102020103&docId=438939126 - 구역별로 랜덤 재생
https://kin.naver.com/qna/detail.naver?d1id=1&dirId=102020103&docId=439397594#answer1 - 관련 지식인 질문글
https://kin.naver.com/qna/detail.naver?d1id=1&dirId=102020103&docId=460716520
'PPT+VBA' 카테고리의 다른 글
물결무늬 선 만들기 (2) | 2024.04.05 |
---|---|
폴더 내의 모든 pptx파일의 모든 슬라이드를 png로 내보내기 (0) | 2024.04.02 |
편집 모드에서 자동으로 동영상 재생 (0) | 2024.03.13 |
Freeform 도형을 따라 잉크 그리기 애니메이션 자동 생성 (1) | 2024.02.25 |
테이블(표) 윤곽선 따라 가이드 선 자동 추가 (1) | 2024.01.15 |
시간 제한 퀴즈 게임 템플릿 (1) | 2024.01.01 |
폴더 내의 모든 PPT를 PDF로 일괄로 내보내기 (0) | 2023.12.17 |
폴더 내의 모든 PPT파일을 동영상으로 내보내기 (0) | 2023.12.04 |
최근댓글