-
Excel 매크로 (VBA) - 022. 로또 번호 생성기를 만들어 보자Excel/Excel 매크로 2022. 11. 5. 12:39728x90
전체 목차
- 001. 특정 행을 복사하여 삽입하기
- 002. 선택하여 붙여 넣기 기능 정리
- 003. 변수/Assignment/Loop/비교
- 004. 데이터가 있는 셀의 범위 알아내기
- 005. 데이터 시트(쉘) 순회하기
- 006. 셀 병합 하기
- 007. 변수에 저장되어 있는 데이터 확인하기 (디버그 기능)
- 008. 정렬하기 (Sort)
- 009. 버튼 컨트롤 (Excel Form vs. ActiveX)
- 010. 콤보 상자 컨트롤 (Excel Form vs. ActiveX)
- 011. 확인란/옵션단추 컨트롤(Excel Form vs. ActiveX)
- 012. 스핀단추 컨트롤(스피너, Excel Form vs. ActiveX)
- 013. 자동필터(Auto Filter)
- 014. 함수(function) (전편)
- 015. 함수(function) (후편)
- 016. 중복 데이터 제거하기
- 017. 텍스트 나누기 (공백, 특수문자)
- 018. Vlookup으로 데이터 조회하기(주식 종목 코드 조회)
- 019. 런타임 에러 처리 (1)
- 020. 런타임 에러 처리 (2)
- 021. 인풋박스 (InputBox) 사용 방법
포스트 목차.본 포스트에서는 VBA를 이용하여 로또 번호 생성기를 만드는 방법에 대해 다룬다. VBA를 사용하지 않고 엑셀 기능만으로 로또 번호 생성기를 만든 예제는 다음 링크에서 확인할 수 있다.
01. 로또 번호 생성기 요구사항(1) 대량 로또 번호 세트
로또 번호 생성기는 대량의 로또 번호를 생성하는 것을 목표로 한다.
생성 세트 수는 소스 코드 레벨에서 변경하능하게 만들 예정이며, 여기서는 약 10,000(9,997)개의 로또 번호 세트를 만든다.
(2) 1부터 45까지의 겹치지 않는 랜덤 번호
당연한 이야기지만 1부터 45까지의 겹치지 않는 랜덤 번호를 발생시켜야 한다.
(3) 세트를 구성하는 숫자들은 정렬되어 있어야 한다.
하나의 셋트 내에서 나오는 숫자들은 오름차순으로 정렬되어 있어야 한다.
(4) 초기화 기능
로또 번호를 다시 뽑고 싶은 경우를 대비하여 모든 로또 번호를 지우는 초기화 기능을 제공한다. (꼭 필요한 기능은 아니다. 어차피 로또 번호 생성 버튼을 클릭할 때마다 숫자는 변경될 것이다.)02. 필요한 요소본격적인 예제에 대해 다루기 전에 필요한 요소들을 설명하려고 한다.
(1) VBA에서 난수 생성
- Rnd 함수
Rnd 함수는 난수생성기에서 차례대로 난수를 가져오는 역할을 한다. 난수는 0에서 1사이의 값을 갖는다.
Rnd 함수는 생략가능한 인자를 갖는다.
Rnd 또는 Rnd(number)의 형태로 사용될 수 있다.
number의 값에 따라 다른 동작을 한다.
number가 0보다 작은 경우, number를 시드로 하는 난수를 반환한다.
number가 0보다 큰 경우, 다음 난수를 가져온다.
number가 0인 경우, 이전에 생성한 난수를 가져온다.
number를 지정하지 않은 경우, 다음 난수를 가져온다.
- Randomize 문
난수생성기를 새로운 시드로 초기화 한다.
우리는 매번 다른 난수를 생성해야 되므로 Randomize 문을 사용한 후에 Rnd 함수를 사용하도록 하자.
(2) 정렬 (버블소트)
생성된 난수를 오름차순으로 정렬하기 위해 간단한 정렬 알고리즘은 버블소트를 사용한다. 다음 링크에 설명이 잘 되어 있는 것 같다.
https://gmlwjd9405.github.io/2018/05/06/algorithm-bubble-sort.html(3) 내용 지우기
ClearContents 메소드
Expression.ClearContents 형태로 사용할 수 있으며, 여기서는 Range 객체 이후에 사용할 예정이다. Range 객체의 영역에 있는 셀의 값/수식을 지우는 역할을 한다.
(4) Loop 문
여기서 사용될 루프문에 대해서는 이전 포스트를 참고하도록 하자.
변수/Assignment/Loop/비교03. 예제 및 설명(1) 생성기 화면
생성기는 위의 그림처럼 구성된다.
A3:F3을 시작으로 A10000:F10000까지 로또 번호를 생성할 예정이다.
생성이후에는 1부터 45까지의 숫자가 몇번 나왔는지 K열에 계산될 예정이다.
(2) 번호 수 세기번호 수는 COUNTIF 함수를 이용하여 센다. (자세한 내용은 다음 링크를 참고하자)
이 부분을 미리 작성하면, 속도가 굉장히 느려지므로 로또 번호가 다 생성된 이후에 추가하던지, 수식 계산 모드를 수동으로 변경하도록 하자.
- 수식 계산 모드 수동으로 변경하기
https://slowly-rising.blogspot.com/2022/10/blog-post_31.html
(3) 초기화 관련
- 매크로 지정
초기화 버튼을 우클릭 한 후 매크로를 지정을 선택하여 매크로를 지정해주자.- 코드는 다음과 같이 작성한다.
12345678910Dim maxRow As LongDim IsInit As Boolean'초기화 버튼Sub 단추2_Click()IsInit = TruemaxRow = 10000ActiveSheet.Range(Cells(3, 1), Cells(maxRow, 6)).ClearContentsEnd Subcs - maxRow 는 최대행의 수를 지정하기 위한 변수이고 IsInit은 초기화 여부를 저장하기 위한 변수이다.
- 데이터가 들어갈 영역인 Cells(3,1) 에서 Cells(10000,6)까지의 영역의 모든 값/수식을 지운다.
(4) 로또 번호 생성 관련1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950'생성 버튼Sub 단추1_Click()'초기화 되어 있지 않은 경우 10000 개로 설정If IsInit = False ThenmaxRow = 10000End If'난수생성기 초기화Randomize'6개의 번호를 저장할 배열 선언Dim numbers(1 To 6) As Integer'3열부터 데이터 채우기For i = 3 To maxRow'j는 로또 숫자 하나에 해당하는 반복문For j = 1 To 6'이전에 생성한 숫자와 겹치지 않는지 체크하는 부분Do'중복 확인을 위한 체커checker = 0'난수를 생성한다.numbers(j) = Int(Rnd * 45) + 1'이전에 생성한 값들 중복되지 않는 경우 체커를 1 증가For k = 1 To j - 1If numbers(j) <> numbers(k) Thenchecker = checker + 1End IfNext k'이전에 생성한 모든 숫자와 겹치지 않는 경우 루프 종료Loop Until checker = j - 1Next j'정렬을 위한 두 개의 루프 생성For m = 1 To 6For n = m + 1 To 6'순서대로 안되어있을 경우에 순서 변경If numbers(m) > numbers(n) Thentemp = numbers(n)numbers(n) = numbers(m)numbers(m) = tempEnd IfNext nNext m'정렬한 로또 번호를 셀에 입력For j = 1 To 6ActiveSheet.Cells(i, j) = numbers(j)Next jNext iEnd Subcs 13-48: i 열부터, maxRow까지의 행에 데이터를 채우기 위한 루프
15-30: 6개의 중복되지 않는 난수를 추출하기 위한 루프
23-27: 이전에 생성한 숫자들과 비교를 통해 현재 생성한 난수가 겹치지 않는지를 확인하기 위한 루프, 이전 생성 숫자와 겹칠경우에 난수를 다시 생성한다.
33-42: 두 개의 중복 루프를 돌면서 버블정렬을 수행하여, 숫자를 오름차순으로 정렬한다.
45-47: 추출한 숫자를 워크시트에 입력한다.(5) 실행 결과
위에서 COUNIF 부분을 제거한 상태에서 실행을 하면 다음과 같은 결과를 얻을 수 있다.
(6) 작성 파일 공유
모두 즐거운 주말 되시길 기원합니다.728x90'Excel > Excel 매크로' 카테고리의 다른 글
VBA 중복데이터 합치기 (0) 2023.04.27 Excel 매크로 (VBA) - 023. 클래스 모듈 (간단한 예제) (0) 2022.11.09 Excel 매크로 (VBA) - 021. 인풋박스 (InputBox) 사용 방법 (0) 2022.09.14 Excel 매크로 (VBA) - 020. 런타임 에러 처리 (2) (0) 2022.09.13 Excel 매크로 (VBA) - 019. 런타임 에러 처리 (1) (0) 2022.09.12