EXCEL - VBA

While 문 - VB와 VBA의 차이점

별동산 2023. 12. 17. 09:29
반응형

VBA는 엑셀 등  오피스 앱을 위한 VB이지만(Visual Basic for Application),  VB가 모두 적용되는 것은 아닙니다.


1. VB와 VBA의 While문 차이점

가. VB의 While문

구글에서 vba while로 검색을 하면 VB에 대한 도움말만 나오고, 

 
들어가 보면 While 반복문의 구문은 아래와  같습니다.

While condition
    [ statements ]
    [ Continue While ]
    [ statements ]
    [ Exit While ]
    [ statements ]
End While

 
Continue While 문도 있고, Exit While로 중간에 빠질 수 있습니다.
condition은 조건이고, statements는 실행문입니다.
 
Exit While 다음의 statements(실행문)는 Exit While로 중간에 빠져나가게 되면 실행되지 않고 끝나게 됩니다.
 

나. VBA의 While문 → Do...Loop문

VBA에 적용되는 While문을 검색하려면 vba do while로 앞에 do를 붙여서 검색해야 합니다.
그래도 검색결과는 Microsoft 것이 1페이지의 맨 아래에 아래와 같이 나오네요,
While문이 아니라 Do...Loop 실행문입니다.

 
눌러서 들어가 보면 구문은 아래와 같습니다.

Do [{ While | Until } condition ] 
    [ statements ] 
    [ Exit Do ] 
    [ statements ] 
Loop

또는

Do [ statements ] 
    [ Exit Do ] 
    [ statements ] 
Loop [{ While | Until } condition ]

 
전체적인 구문은 Do... Loop이고,
While 또는 Until을 Do 다음에 적을 수도 있고, Loop 다음에 적을 수도 있고,
condition(조건)은 While 또는 Until 다음에 놓습니다.
 
그리고, Do문을 중간에 빠지려면 Exit Do를 사용합니다.

Do문이므로 Exit Do가 당연한데, While문에 익숙해 있어서 Exit While을 하게 되는데, 그러면 에러가 발생합니다.
뒤에서 사례를 가지고 직접 해보겠습니다.
 
Exit Do 다음의 statements(실행문)는 Exit Do로 중간에 빠져나가게 되면 실행되지 않고 끝나게 됩니다.
 
 

2. 예제

가. VB의 While문 사용
 
(1) 실패

Sub while1()
    Dim i As Integer
    While True
        i = i + 1
        Debug.Print i        
    Wend
End Sub

 
VBA이지만 Do While을 쓰지 않고 VB의 While문을 써도 됩니다.
While True이기 때문에 빠져나가는 문장이 없으면 integer(정수)의 한도인 32767에서 멈추고 오버플로 오류가 발생합니다.

 
(2) 성공 1

Sub while1()
    Dim i As Integer
    While True
        i = i + 1
        Debug.Print i
        If i = 10 Then End
    Wend
    Debug.Print 11
End Sub

 
If i = 10 Then End
라고 "i가 10이 되면 끝내라"라는 조건문을 넣어야 합니다.
그리고 실행하면 직접 실행창에 1부터 10까지만 출력됩니다.

 
(3) 오류 1
그러나 VB 구문처럼 Exit While을 쓰려고 하면 컴파일 오류가 발생합니다.

 
확인 버튼을 누르고, Exit While을 지우고, End로 바꿉니다.
 
(4) 성공 2

Sub while1()
    Dim i As Integer
    While i < 10
        i = i + 1
        Debug.Print i
'        If i = 10 Then End
    Wend
End Sub

 
if 조건문을 주석 처리하고 While 다음에 i < 10이라고 조건을 지정하면
i가 10보다 작은 동안만 반복 실행하므로
1부터 10까지 직접 실행창에 값이 표시됩니다.

 
 
(5) 원하지 않는 결과 : End 다음의 실행문은 실행하지 못함
위에서 End의 단점은 'Sub 프로시저를 끝내버린다'는 것입니다.
다시 말해 Wend 다음에
debug.print 11
이라고 써도 실행되지 않습니다.
따라서, debug.print 11을 실행하려면 
VBA의 Do...Loop문을 사용해야 합니다.

 

나. VBA의 Do...Loop문 사용

(1) 성공 1
아래와 같이 While을 Do While로 수정하고, Wend를 Loop로 수정하고 실행하면

Sub while2()
    Dim i As Integer
    Do While True
        i = i + 1
        Debug.Print i
        If i = 10 Then Exit Do
    Loop
    Debug.Print 11
End Sub

 
i가 10일 때 Do...Loop 반복문의 실행이 끝나고,
Loop 다음의 debug.print 11이 실행돼서
11이 출력됩니다.
 
 

 
 
(2) 성공 2 : While 다음에 조건문 설정
Do...Loop문 안에 있던 if i=10 then end를 지우고
While 다음에 조건을 설정하면 do while i<10이 됩니다.
다시 말해 i가 10보다 작은 동안만 실행하라는 의미입니다.

Sub while3()
    Dim i As Integer
    Do While i < 10
        i = i + 1
        Debug.Print i
    Loop
    Debug.Print 11
End Sub

 
실행하면 10까지 실행하고 Loop문 다음의 11을 잘 실행합니다.

 
(3) 성공 3 : Loop 다음에 조건문 설정
아래와 같이 while i < 10을 Loop 다음으로 옮겨도 동일한 결과를 얻을 수 있습니다.

Sub while4()
    Dim i As Integer
    Do
        i = i + 1
        Debug.Print i
    Loop While i < 10
    Debug.Print 11
End Sub

 
 
(4) While과 Until의 차이점
아래와 같이 While을 Until로 바꿔서 until i < 10라고 한 다음 실행하니

Sub while5()
    Dim i As Integer
    Do
        i = i + 1
        Debug.Print i
    Loop Until i < 10
    Debug.Print 11
End Sub

 
1과 11뿐이 출력되지 않습니다.
 
Until의 의미가 '조건이 충족될 때까지'이다 보니 
Do...Loop문을 한번 돌면 i가 2가 되고, 2는 10보다 작기 때문에 Do...Loop문을 빠져나가는 것입니다.

 
(5) Until 조건수정 
따라서, Until 다음의 <를 =으로 수정해야 합니다.

Sub while6()
    Dim i As Integer
    Do
        i = i + 1
        Debug.Print i
    Loop Until i = 10
    Debug.Print 11
End Sub

 
이제 11까지 잘 출력됩니다.

 
(6) 성공 4 : Do 다음에 Until문 사용
아래와 같이 Until i = 10을 Do 다음으로 옮기고 실행해도 

Sub while7()
    Dim i As Integer
    Do Until i = 10
        i = i + 1
        Debug.Print i
    Loop
    Debug.Print 11
End Sub

 
결과는 같습니다.

do_loop문.xlsm
0.03MB
반응형