VBA에서
int(Rnd * 5) 하면 0부터 4까지의 랜덤 숫자가 나온다.
1부터 5까지로 하려면
Rnd*4+1로 해서 0부터 4까지 나온 수에 1을 더하면 된다.
그런데 랜덤 숫자는 바로 전에 나온 숫자와 중복된 숫자가 나올 수도 있다.
이를 방지하는 방법을 생각해보자.
그저 단순히 이전 랜덤값을 저장했다가 비교할 수도 있지만
중복된 수를 원천적으로 차단할 수는 없다.
그래서 배열을 이용해본다.
5개의 배열에 1부터 5까지를 넣어 두고
랜덤으로 배열을 섞어주는 것이다.
어떤 값을 가진 배열들을 서로 섞는 것이라 중복된 수가 나올 수가 없다.
1부터 5까지의 수중에서 랜덤으로 추출한다고 가정하고
소스 일부분을 보자
Private Num() As Integer
Private CurIndex As Integer
Const DEFAULT = 1
Sub GetRandom()
Dim Min As Integer, Max As Integer
Dim i As Integer
Dim r As Integer, temp As Integer
Randomize
Min = 1
Max = 5
ReDim Num(Min To Max)
'initialize the Num array
'Num(1)=1, Num(2)=2, Num(3)=3 ...
For i = Min To Max
Num(i) = i
Next
' shuffle
' get random index and exchange each other
For i = Min To Max
r = Rnd * (Max - Min) + Min 'Rnd * 4 +1
'swap index i's value and r's value
temp = Num(i)
Num(i) = Num(r)
Num(r) = temp
Next
...생략...
소스를 보면
Num(1) 부터 Num(5) 까지에 1부터 5까지의 숫자를 일단 담아 두고
최저값부터 최대값까지 돌면서 랜덤한 위치의 배열값과 현재위치의 배열값을 서로 바꿔준다.
끝까지 루프를 돌면 배열값은 여기저기 섞이게 된다.
예제 슬라이드쇼를 만들어 보았다.
첨부한 PPT파일은 아래 화면과 같이 1~5사이의 랜덤값을 구해서
5번에 걸쳐 랜덤한 슬라이드로 이동하는 예제이다.
먼저 1번 버튼을 눌러 배열을 섞습니다.
누를 때마다 섞어진 배열을 보여줍니다.
그리고 현재 인덱스는 1이며 그 1번째 랜덤값은 1이므로
2번 버튼을 누르면 1번 슬라이드로 넘어갑니다.
1번 슬라이드에 도착했습니다.
핵심 소스를 보여주고 있습니다.
다시 리턴 버튼으로 마지막 슬라이드로 돌아갑니다.
다시 2번 버튼을 눌러 다음 랜덤 슬라이드로 넘어갑니다.
2번째 랜덤값인 4번 슬라이드로 이동합니다.
다시 리턴을 눌러 돌아가고 다음 랜덤 슬라이드로 넘어갑니다.
지금까지 중복되지 않는 랜덤값을 구해보았습니다.
PPT를 제작할 때 임의의 랜덤한 위치의 슬라이드로 이동하고 싶을 때 참조하면 되겠습니다.
여기서는 배열을 섞었는데
아예 슬라이드 자체 순서를 섞을 수도 있습니다.
하지만 섞인 상태에서 저장하면 보기가 좋지 않은 단점이 있습니다.
수정: 2018.5.17
요청에 의해 추가로 44개 슬라이드인 경우로 바꿔봤습니다.
이번에는 처음으로 돌아가지 않고 44개중의 하나로 바로 건너뛰는 경우
'VBA Tipz' 카테고리의 다른 글
파워포인트 VBA로 도트 하트 그리기 (0) | 2022.03.17 |
---|---|
파워포인트 VBA 어디서 배워요? (0) | 2022.03.17 |
파워포인트 VBA 어떻게 시작할까요? (0) | 2022.03.17 |
64비트 호환 API 선언 모음 (0) | 2019.10.29 |
그룹개체를 복사하면 Parent/Child 속성을 잃어버린다. (2) | 2017.01.12 |
Collection: 배열을 넘어서는 컬렉션 Type 소개 (0) | 2017.01.12 |
for each의 경고 (0) | 2017.01.12 |
power point에서 고칠 수 없는 오류가 발생했습니다. 프레젠테이션을 저장하고 power point를 종료한 후 다시 시작하십시오. (3) | 2016.05.19 |
최근댓글