티스토리 뷰

이 글에서는 VBA 반복문에 대해서 공부를 해볼 까 합니다. VBA에는 반복구문을 처리하기 위한 여러 문법이 있습니다. 


  • For .. Next
  • For Each .. Next
  • Do Loop (While, Until)


이 글에서는 반복구문에서 가장 간단히 사용할 수 있는 For .. Next를 사용하는 방법을 알아보도록 하겠습니다. 사용 방법을 배운 다음 간단히 For .. Next를 이용하여 로또 프로그램을 짜볼까 합니다. 


그럼 For .. Next 구문에 대해서 공부해 봅시다!!


For .. Next 구문은 사용자가 지정한 반복 횟수 만큼 반복구문을 실행하는 방법입니다. For .. Next를 사용하는 예를 한번 살펴볼까요.

아래의 예를 실행시키면, 시작번호부터 끝번호 까지 +1씩 하면서 반복구문을 반복해서 처리합니다. 물론 끝번호는 숫자로 지정이 되어야 합니다. 




Dim 시작번호 As Integer

For 시작번호 = 1 To 끝번호


'반복구문        


Next


For Next 구문의 간략한 예제를 살펴보겠습니다.


Dim 시작번호 As Integer

For 시작번호 = 1 To 6

Msgbox 시작번호

Next


위와 같이 구현을 하면 1부터 6까지 값을 가진 메시지 박스를 순차적으로 볼 수 있습니다.




For..Next 구문에서 반복 카운트를 실행할 때 기본적으로 시작 번호에서 끝번호까지 +1을 하면서 반복을 진행합니다. 이러한 Counter를 +1이 아닌 다른 숫자 변경하는 방법에 대해서 알아보겠습니다. 만약 사용자가 시작 번호 1에서 끝번호 6까지 +2씩 증가하는 값을 통해서 반복을 하고자 한다면 아래와 같이 For 시작번호 = 1 To 6 Step 2라고 적어주시면 됩니다. Step 이라는 명령어 뒤에 사용자가 원하는 값을 넣어주면 For 문이 2번째로 돌때 시작번호 = (시작번호 + Step뒤에 적은 숫자)가 되는 것입니다. 


    Dim 시작번호 As Integer

    

    For 시작번호 = 1 To 6 Step 2

        MsgBox 시작번호

    Next


간략히 For..Next 구문에 대해서 알아보았습니다. 그럼 For문을 이용해서 로또 프로그램을 짜보겠습니다.

로또 프로그램을 만들기에 앞서 로또 프로그램에 필요한 요구사항을 정의해 볼까요.


<로또 프로그램 요구사항>

  • 1~45사이의 6개의 랜덤 값을 가져온다.
  • 6개의 랜덤 값을 중복되지 않아야 한다.
  • 이 값을 엑셀에 출력한다.


요구사항이 간단하게 3개로 정의가 되네요. 요구사항에 맞게 구현을 해보도록 하겠습니다.


요구사항 1. 1~45사이의 6개의 랜덤값을 가져온다.


이 요구사항을 충족하기 위해서는 6개의 랜덤값을 저장할 6개짜리 1차 배열이 필요할 것입니다.

그리고 1~45 사이의 랜덤수를 만들 함수가 필요합니다. VBA에서 랜덤수를 만드는데 사용되는 함수는 RND 함수입니다. 


정수값을 만들기 위한 RND 함수를 사용하는 방법을 보면 Int((upperbound - lowerbound + 1) * Rnd() + lowerbound) 라고 합니다. 우리가 가져야 하는 값은 1부터 45이므로 Int((45 - 1 + 1) * Rnd() + 1)이라고 사용를 할 수 있겠네요.



위의 내용을 활용하여 배열과 RND 함수를 이용해서 코드를 작성해 보았습니다.


Sub GetLottoNumbers()


    Dim nums(6) As Integer

    Dim randomValue, index As Integer   

    

    For index = 1 To 6    

        randomValue = Int((45 + 1) * Rnd())

        nums(index) = randomValue

    Next


End Sub        


nums라는 배열을 선언하였고, For를 이용하여 6번을 반복하여 Rnd 함수를 이용하여 값을 nums 배열에 넣었습니다. 

요구사항 1에 충족하는 것을 확인할 수 있네요. 


요구사항 2. 6개의 랜덤값이 중복되지 않아야 한다. 


위의 코드를 실행시켜 엑셀에 값을 대입하면 아래와 같이 중복된 값이 나올 때가 있습니다. Rnd 함수를 이용해서 랜덤값을 만들다 보니 중복되는 값을 체크하지 못하고 있습니다. 



중복 체크를 하도록 간략히(?) 수정을 하면 아래의 코드와 같습니다.


Sub GetLottoNumbers()


    Dim nums(6) As Integer

    Dim randomValue, index As Integer

    Dim duplicatedIndex As Integer

    Dim isDuplicated 

        

    For index = 1 To 6        

        Do            

            randomValue = Int((45 + 1) * Rnd())            

            For duplicatedIndex = 1 To 6

                

                If nums(duplicatedIndex) = randomValue Then                

                    isDuplicated = True

                    Exit For                

                Else                    

                    isDuplicated = False                

                End If                

            Next        

        

        Loop While (isDuplicated)        

        nums(index) = randomValue

        

    Next


End Sub


Do Loop While이라는 녀석과 If..Else 구문이 나왔네요.


Do Loop While은 Do 문 안의 코드를 먼저 실행을 하고, While 문의 조건이 참이면 다시 재반복을 거짓이면 구문을 벗어나도록 해주는 반복문입니다. 실행 알고리즘은 아래와 같습니다. (다음 시간에 추가적인 설명을 드리도록 하겠습니다.)



nums 배열에 현재 생성한 값이 있는지를 파악하고, 있으면 번호를 재생성하여 또다시 있는지를 판단하고 번호가 없으면 종료하는 알고리즘입니다. 모든 배열을 비교하기 위해서 For..Next 구문이 하나더 사용되었네요. 자 이제 중복이 발생하지 않습니다. 요구사항 2번이 충족됨을 알수가 있네요.


요구사항 3. 값을 엑셀에 출력하기


배열을 값에 출력을 해보도록 하겠습니다. 엑셀의 Sheet에 존재하는 Cell에 접근하는 방법은 여러가지(Range, Celss, Offset, Union)가 있습니다. 하지만 여기에서는 Cells라는 함수를 통해서 접근을 해보도록 하겠습니다. 


Cells는 Row, Column의 2개의 매개변수를 가지는 함수입니다. Cells(Row, Column)으로 사용 할 수 있는데 Cells(1.1)을 하게 되면 A열의 1행을 선택한것으로 볼 수 있습니다. Cells(2,1)을 하면 A2를 선택하게 되겠지요.


For..Next를 이용하여 1행에 6개의 값을 넣어 보았습니다. 


Sub GetLottoNumbers()


    Dim nums(6) As Integer

    Dim randomValue, index As Integer

    Dim duplicatedIndex As Integer

    Dim isDuplicated 

        

    For index = 1 To 6        

        Do            

            randomValue = Int((45 + 1) * Rnd())            

            For duplicatedIndex = 1 To 6

                

                If nums(duplicatedIndex) = randomValue Then                

                    isDuplicated = True

                    Exit For                

                Else                    

                    isDuplicated = False                

                End If                

            Next        

        

        Loop While (isDuplicated)        

        nums(index) = randomValue

        

    Next


    For index = 1 To 6    

        Cells(1, index) = nums(index)        

    Next


End Sub


자 이제 간단히 로또 프로그램을 VBA를 통해서 엑셀에서 구현해 보았습니다. 결과를 한번 살펴볼까요. 중복없이 1-45 사이의 값이 출력되는 것을 확인할 수 있습니다. 



이 글에서는 엑셀 매크로 VBA를 이용하여 로또 프로그램을 짜는 것을 공부해보았습니다.

이 글이 도움이되셨나요? 그렇다면 아래의 그림을 클릭해주세요.



댓글