Excel & IT Info

아이엑셀러 닷컴, 엑셀러TV

VBA

[VBA 입문] 13강. 실행 순서 제어(3) ㅡ Do ~ Loop 문

권현욱(엑셀러) 2023. 10. 6. 08:00
반응형

들어가며

Excel VBA에서 반복문을 만드는 또 한 가지 방법은 Do ~ Loop 문을 사용하는 겁니다. For ~ Next는 반복할 횟수가 정해진 경우에, Do ~ Loop는 몇 번 반복할지 모를 때 흔히 사용합니다. 절대적인 기준은 아니며, 같은 상황을 For ~ Next로도, Do ~ Loop로도 표현할 수 있습니다.

조금만 하다 보면 어떤 것이 적합한지 분별하는 눈이 생깁니다. 준비되셨나요? 출발합니다.


Do ~ Loop 문

Do와 Loop 사이의 명령을 반복 실행합니다. 중간에 탈출(Exit)할 조건을 만들어 두지 않으면 무한 Loop 순환에 빠지게 되므로 대비책을 만들어 두어야겠죠. 1부터 100까지 숫자를 합산하는 반복문을 Do ~ Loop로 처리해 보겠습니다. 

Sub do_loop_1()
    Dim iSum As Integer
    Dim i As Integer
    
    Do
        i = i + 1
        If i > 100 Then    ''' 이 부분이 없으면 무한 루프에 빠짐
            Exit Do
        Else
            iSum = iSum + i
        End If
    Loop
    
    MsgBox "결과: " & iSum
End Sub

Exit Do가 없으면 시스템이 다운될 때까지 반복문이 실행됩니다. 이번에는 같은 작업을 For ~ Next 문으로 나타내 볼까요?

Sub for_next()
    Dim iSum As Integer
    Dim i As Integer
    
    For i = 1 To 100
        iSum = iSum + i
    Next
    
    MsgBox "합계: " & iSum
End Sub

이 경우에는 For ~ Next 문이 더 간결하게 표현되는군요. 하지만 Do ~ Loop는 그 나름의 쓰임새가 있습니다. Do ~ Loop는 몇 가지 종류가 있습니다.

Do While Do While ~ Loop
Do ~ Loop While
Do Until Do Until ~ Loop
Do ~ Until Loop

Exit Do 역할을 하는 While과 Until이 Do 쪽에 붙느냐 Loop 쪽에 붙느냐에 따라 4종류로 나뉩니다. 각각의 차이에 대해 알아보겠습니다.


Do While Loop 문

아, 짜증이 물밀듯 밀려올라고 합니다.

"순환문을 돌리기 위한 구문이면 화끈하게 하나만 있으면 되지, For ~ Next, For Each ~ In ~ Next, Do ~ Loop도 모자라서 Do While Loop라고요?"

당연한 말이지만, 누구를 골탕 먹이려고 복잡하게 해 놓은 것이 아니라 상황에 따라 그만큼 융통성 있게 처리하기 위해 그렇게 한 겁니다. 실무에서 다양한 상황에 직면하다 보면 저절로 터득하게 될 테니 너무 고민하지 않아도 됩니다.

Do While Loop 문은 '~인 동안에는 반복문을 실행'하라는 뜻으로, 사용 형태는 다음과 같이 2가지로 구분할 수 있습니다.

Do [While 조건]
    명령문
    명령문
    [Exit Do]
    명령문
    명령문
Loop
----------
Do
    명령문
    명령문
    [Exit Do]
    명령문
    명령문
Loop [While 조건]

[While 조건]이 어느 쪽에 붙느냐에 따라 결과가 조금 다릅니다. 그 차이는 다음 예제를 보면 명확해집니다.

Sub do_while_loop_1()
    Do While Not IsEmpty(ActiveCell)    ''' 현재 셀이 공백이 아닌 경우 Do 문 실행
        ActiveCell.Value = "VBA"        ''' 현재 셀에 'VBA' 입력
        ActiveCell.Offset(1, 0).Select  ''' 셀 포인터를 1행 아래로 이동
    Loop
End Sub

현재 셀 포인터가 위치한 셀을 기존으로 아래로 한 행씩 내려가면서 'VBA'라는 문자열을 삽입하는 코드입니다. 경우에 따라 이 코드는 한 번도 실행되지 않을 수 있습니다. 왜냐고요? 현재 셀에 아무 값도 들어있지 않다면 Do While 안으로 들어가지 않기 때문입니다.

그렇다면 아래의 경우는 어떨까요?

Sub do_while_loop_2()
    Do
        ActiveCell.Value = "VBA"
        ActiveCell.Offset(1, 0).Select
    Loop While Not IsEmpty(ActiveCell)
End Sub

이번에는 조건절이 Loop 쪽에 있습니다. 이런 경우에는 Do 안에 있는 명령문을 적어도 한 번은 실행합니다.


Do Until Loop 문

Do While Loop가 '~인 동안에는 반복문을 실행'하는 것이라면, Do Until Loop는 '~가 될 때까지 반복문을 실행'합니다. 다시 말해서 Do While은 조건식이 참(True)인 동안에는 반복문을 실행하는 데 비해, Do Until은 조건식이 True가 될 때까지 반복한다는 점에서 차이가 있습니다.

Do [Until 조건]
    명령문
    명령문
    [Exit Do]
    명령문
    명령문
Loop
----------
Do
    명령문
    명령문
    [Exit Do]
    명령문
    명령문
Loop [Until 조건]

While이 Until로 바뀐 것 말고는 같은 형태죠? 사용 예제 역시 마찬가지입니다. 다음 두 프로시저는 동일한 기능을 수행합니다. Until을 While로 바꿨을 때  While 뒤에 Not이 붙은 점에 유의하세요.

Sub do_until_1()
    Do Until IsEmpty(ActiveCell)
        ActiveCell.Value = "VBA"
        ActiveCell.Offset(1).Select
    Loop
End Sub
----------
Sub do_while_1()
    Do While Not IsEmpty(ActiveCell)
        ActiveCell.Value = "VBA"
        ActiveCell.Offset(1).Select
    Loop
End Sub

다음 두 프로시저도 마찬가지입니다.

Sub do_until_2()
    Do
        ActiveCell.Value = "VBA"
        ActiveCell.Offset(1).Select
    Loop Until IsEmpty(ActiveCell)
End Sub
----------
Sub do_while_2()
    Do
        ActiveCell.Value = "VBA"
        ActiveCell.Offset(1).Select
    Loop While Not IsEmpty(ActiveCell)
End Sub

'조건절이 어느 쪽에 붙어 있느냐에 따라 Do ~ Loop 문 내부가 아예 실행되지 않을 수도 있다' 정도만 이해하면 됩니다.


나가며

Excel VBA에서 사용되는 대표적인 반복문 구문을 모두 배우셨습니다. 축하합니다. 모든 것을 한 번에 알려고 스트레스받지 마세요. 익숙한 것을 한 두 가지 이해한 다음, 실무에 하나씩 적용하다 보면 차이를 자연스레 깨닫는 순간이 옵니다. 정말입니다. Trust me!

반응형