이전 포스팅 바로가기

[엑셀 VBA #3] 변수 종류와 선언, 활용법


[엑셀 VBA #4] 변수를 이용한 DO~LOOP 반복문 응용






반복문은 엑셀 VBA의 기본중의 기본이라고 할 수 있습니다.

이번 포스팅에서는 DO~LOOP문을 사용한 반복문에 대해 알아보겠습니다.

저번 포스팅과 같이 예제2 파일을 받고 따라와 주세요.

예제속에 있는 코드를 먼저 분석해 보시고 공부하시면 이해하기 훨씬 수월합니다.

예제 파일 속에는 지난 예제들이 모두 수록되있습니다. (숨김 해제하시면 됩니다.)



예제2.xlsm





DO는 '하다', LOOP는 '반복'을 의미합니다.

DO~LOOP 반복문은 아래와 같이 구성되어 있습니다.


DO

명령1

명령2

명령3

.....

변수 = 변수 +(-) X

LOOP WHILE 조건


즉, 아래에 있는 조건에 부합할 때에, DO 아래, LOOP 위에 있는 명령을 반복 시행한다는 의미입니다.

하지만 DO~LOOP 반복문은 조건문과 비슷해 보이지만 대체할 수 없습니다.

엑셀 VBA는 기본적으로 위에서 아래로 순차적으로 명령을 수행합니다.

따라서 조건에 부합하지 않더라도, LOOP 문이 읽히기 전에는 DO 문 아래에 위치한 명령이 최소 1회는 실행되게 됩니다.


예를 들어, 아래와 같은 코드를 실행했을 경우,



Sub test()


x = 110


DO

msgbox "x는 100보다 큽니다."            'msgbox문은 화면에 팝업창을 띄우는 코드입니다.

x = x - 1

LOOP WHILE X > 100


End Sub


x의 기본값은 110이고, LOOP WHILE 뒤에 붙은 조건은 X > 100 이기때문에,

"x는 100보다 큽니다." 라는 팝업이 10번 생성됩니다.

하지만 코드가 아래와 같다면 어떨까요?


Sub text ()


x = 99


DO

msgbox "x는 100보다 큽니다."

x = x - 1

LOOP WHILE X > 100


End Sub


위 코드의 경우, x의 기본값 자체가 99이고 LOOP WHILE 뒤에 붙은 조건에 부합하지 않습니다.

하지만 코드를 실행했을 경우, 조건에 부합하지 않음에도 불구하고 팝업창이 한번 뜨게 됩니다.

따라서 DO~LOOP문은, 명령을 일단 한번 실행한 후, 조건에 맞는 경우 코드를 반복하는 문법이라고 생각하면 됩니다.


VBA 실행창에서 F8을 눌러서 순차적으로 코드를 실행해보세요.






DO~LOOP문을 이용한 반복문 이중구조


엑셀 VBA 코드를 작성하다 보면 한 개의 반복문만으로 부족한 경우가 생기게 됩니다.

이러한 경우에 DO~LOOP문 밖에 DO~LOOP문을 한번 더 사용하여, 반복문 이중구조를 구성할 수 있습니다.

예제2 속의 예제가 반복문 이중구조의 대표적인 예입니다.




예제는 위에 보이는 버튼을 누르면 우측 상자에 좌측 상자와 같이 피라미드식으로 숫자 열이 생성되는 로직입니다.


예제의 로직을 차근차근 살펴보겠습니다.




1. 변수 선언


먼저 Dim 문을 사용해 사용할 변수를 선언합니다.

255가 넘어갈 수 없는 숫자기이 때문에 메모리 용량이 가작 작은 Byte로 선언했습니다.


위 반복문을 실행하기 전에 사용해야 할 변수는 총 몇개일까요?

변수란 말 그대로 '변하는 수'입니다.

따라서 로직 속에서 변하는 수를 생각하면 쉽게 구할 수 있습니다.


1. 각 숫자가 위치해야할 행 i

2. 각 숫자가 위치해야할 열 p

3. 각 행에 들어가야할 숫자 개수 x

4. 입력되야하는 값 y

5. 반복 수 i (1번과 같은 값을 사용합니다)


Sub example_2


Dim i As Byte

Dim p As Byte

Dim x As Byte

Dim y As Byte


따라서 위와 같이 변수 선언을 합니다.





2. 기본 값 설정


반복문을 실행하기 전에 반복문이 실행되는 위치와, 출력할 첫 번째 값을 설정해야 합니다.

위의 예제 속에서 처음 값이 출력되야 하는 위치는 K2셀이고, 이를 좌표로 환산하면 (2, 11)입니다.

따라서 행값 i 는 2, 열값 p 는 11을 줍니다.

그리고 첫 행에 한 개의 숫자가 들어가기 때문에 숫자 개수값 x는 1이 되고, 첫 항에 들어가는 값이 1이기 때문에 값 y 또한 1이 됩니다.


i = 2

p = 11

x = 1

y = 1



이제 첫 항을 설정 했으니, 본격적으로 DO~LOOP 반복문을 집어넣습니다.





3. 매 행에 적정 개수의 수를 입력하는 DO~LOOP문 입력


위에 설명했듯이, 이번 예제는 DO~LOOP 이중구조를 갖고 있습니다.

따라서 DO~LOOP문 안에 또 다른 DO~LOOP문이 들어가는 구조를 형성합니다.


먼저 안쪽에 들어가는 반복문을 작성합니다.


Do

Sheet3.cells(i, p).Value = y

p = p + 1

y = y + 1

x = x + 1

Loop While x<i





4. 다음 행으로 넘어가는 DO~LOOP문 입력


위 반복문 밖에 다음 행으로 진행시키는 반복문을 작성합니다.


Do

i = i + 1        '다음 행으로 진행시키는 코드

y = 1        '출력 값 초기화 (행이 바뀌면 1부터 다시 시작해야하기 때문)

p = 11        '출력 열 위치 초기화 (첫 열부터 다시 입력해야하기 때문)

x = 1        '반복 횟수 초기화

Loop While i < 11        '10번째 행까지만 입력하도록 제한





5. 반복문 합치기


두 반복문을 합쳐줍니다.


Do


Do

Sheet3.cells(i, p).Value = y

p = p + 1

y = y + 1

x = x + 1

Loop While x < i


i = i + 1

y = 1

p = 11

x = 1

Loop while i < 11






6. 코드 완성

Sub example_2()

Dim i As Byte

Dim p As Byte

Dim x As Byte

Dim y As Byte

i = 2             

p = 11         

x = 1            

y = 1            


Do                                   

            Do                        

            Sheet3.Cells(i, p).Value = y

            p = p + 1

            y = y + 1

            x = x + 1

            Loop While x < i


i = i + 1            

y = 1                   

p = 11                

x = 1

Loop While i < 11            

End Sub











DO~LOOP 반복문은 정말 간단하지만, 이중구조로 되어있을 경우 사뭇 복잡해 보입니다.

예제 코드를 연구해 보시고, 숫자를 바꿔서 여러번 시도해 보세요.

그리고 자신만의 코드를 구상해서 반복문을 구현해 보시면 확실히 이해하실 수 있을겁니다.

궁금한 점이나 질문은 댓글로 남겨주시기 바랍니다.












Posted by Simon K
: