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
결과는 같습니다.
'EXCEL - VBA' 카테고리의 다른 글
UDF에서 자기 셀 참조 시 (2) | 2024.01.05 |
---|---|
메모에 표시되는 사용자 명 표시하지 않기 (0) | 2024.01.02 |
VBA에서 SumProduct 사용하기 (2) | 2023.11.30 |
자료 형태가 다른 것 VLookup으로 검색하기 (2) | 2023.11.20 |
좌표를 이용해 엑셀에 도면 표시하기(3) (0) | 2023.11.16 |