이 페이지에서
구문
= RandBetweenUnique ( 최소값, 최대값, 개수, [제외값] )
인수구분
형식 설명
최소값
필수
Long
추출할 숫자의 최소값입니다.
최대값
필수
Long
추출할 숫자의 최대값입니다.
개수
필수
Long
추출할 고유 숫자의 개수입니다.
최소값과 최대값 사이의 숫자 개수보다 큰 값을 입력하면 두 숫자 사이의 개수만큼만 배열로 반환됩니다.
제외값
선택
Variant
추출할 숫자 중 제외될 값을 배열 또는 범위로 입력합니다.
예를 들어 = RandBetweenUnique ( 1, 100, 5, {10,20,30} ) 을 입력하면 1과 100 사이의 숫자 중 {10,20,30} 을 제외한 고유 숫자 5개를 무작위로 반환합니다.
마스터 코드
복사한 코드는 VBA 편집기(Alt + F11) 새 모듈에 붙여넣어 사용하세요'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ RandBetweenUnique 함수
'▶ 두 숫자 사이의 무작위 고유 숫자를 지정한 갯수만큼 생성하여 배열로 반환합니다.
'▶ 인수 설명
'_____________lngL : 추출할 숫자의 최소값입니다.
'_____________lngU : 추출할 숫자의 최대값입니다.
'_____________lngCount : 추출할 고유숫자의 개수입니다.
'_____________Excludes : 추출할 숫자 중 제외될 값이 입력된 배열 또는 범위입니다.
'###############################################################
Function RandBetweenUnique(lngL As Long, lngU As Long, Count As Long, Optional Excludes As Variant) As Variant
' 변수 설정
Dim dictList As Object: Dim dictExclude As Object
Dim Exclude As Variant
Dim i As Long: Dim j As Long
Set dictList = CreateObject("Scripting.Dictionary")
Set dictExclude = CreateObject("Scripting.Dictionary")
' 제외값 설정
If Not IsMissing(Excludes) Then
For Each Exclude In Excludes
If Not dictExclude.Exists(Exclude) Then dictExclude.Add Exclude, Exclude
Next
End If
' 추출개수가 최대개수보다 클 경우 추출개수 재조정
If Count > lngU - lngL + 1 - dictExclude.Count Then Count = lngU - lngL + 1 - dictExclude.Count
' 무작위 값 생성
Do
j = CLng(Rnd * (lngU - lngL)) + lngL
If Not dictList.Exists(j) And Not dictExclude.Exists(j) Then
dictList.Add j, j
i = i + 1
End If
Loop Until i = Count
'결과값 반환
RandBetweenUnique = dictList.Items
End Function
활용 예제
1과 10 사이에서 고유 번호 3개 생성
= RandBetweenUnique ( 1, 10, 3 )
'// {3,6,10} — 1과 10 사이의 숫자 중 고유번호 3개를 반환합니다.
제외할 값을 지정해 고유 번호 생성
= RandBetweenUnique ( 1, 30, 5, {7,17,27} )
'// 1과 30 사이의 숫자 중 {7,17,27} 을 제외한 고유번호 5개를 반환합니다.
안내사항
반환 가능한 최대 개수는 "최대값-최소값-제외값개수+1" 개이며, 개수를 그보다 크게 입력해도 반환 가능한 개수만큼만 반환됩니다.
댓글 3
로그인 후 댓글을 작성할 수 있습니다.
SEANPAUL
2020.08.16 19:04
딱 필요한 기능이었어요. 감사해요
iviolin
2020.08.17 10:34
와 정말 대단합니다... 한 수 배워갑니다.
강민준🤗
2024.08.11 12:55
좋은 자료 감사합니다.🙇♂️