Excel & IT Info

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

VBA

[VBA 입문] 14강. 실행 순서 제어(4) ㅡ GoTo 문

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

 

들어가며

지난 3개 강의를 통해 If, For ~ Next, Do ~ Loop 문에 대해 배웠습니다. 이제 GoTo 문을 배우게 되면 Excel VBA에서 사용되는 제어문은 모두 마치게 됩니다. 기대되시죠? 출발합시다.


GoTo 문

GoTo 문은 실행 순서를 바꾸는 가장 직접적인 방법으로 예전 DOS 시절 BASIC에서 사용하던 방식입니다. 다른 제어문에 비해 구조나 사용 방법도 단순합니다. 

GoTo 이동 위치

정말 심플하죠? '이동 위치'는 문자열로 작성되며 끝에 콜론(:)을 붙입니다. 실제 코드를 보겠습니다. 다음 코드를 실행하면 InputBox가 나타납니다. 이름을 입력하면 환영 메시지가, 입력하지 않고 [확인]이나 [취소] 버튼을 누르면 그에 따른 메시지 상자가 나타납니다.

Sub goto_sample()
    Dim sUserName As String
    sUserName = inputBox("이름을 입력하세요")
    
    If Len(sUserName) = 0 Then    ''' 아무 이름도 입력되지 않았다면
        GoTo Noname               ''' Noname 레이블로 이동
    Else
        MsgBox sUserName & "님 환영합니다"
        Exit Sub
    End If

Noname:
    MsgBox "이름을 제대로 입력하세요"
End Sub

프로시저가 끝나기 직전에 'Noname:'이라는 것이 있습니다. 이것을 '레이블(lable)'이라고 합니다.  적절한 이름을 입력하고 뒤에 콜론(:)을 붙여주면 됩니다. 이름이 정상적으로 입력되었다면 이 부분은 실행할 필요가 없기 때문에 If 문에서 Exit Sub를 사용하여 프로시저를 빠져나가도록 했습니다.

'GoTo 이동 위치'라고 해 주면 Excel(VBA)은 하늘이 두 쪽 나도 '이동 위치'로 가서 그 이후의 문장을 실행합니다. GoTo 문은 에러가 발생할 경우에 대비한 검문소 역할이 필요한 경우 흔히 사용합니다.


On Error GoTo 문

GoTo 앞에 On Error라는 키워드가 붙어 있습니다. 프로그램을 실행하는 도중 오류가 발생할 경우, 어떤 이유에서 발생한 오류인지 정보를 알려줌으로써 사용자가 대처하는 데 도움이 될 수 있습니다.

다음 코드를 실행하면 InputBox가 나타납니다. 여기에 0이 아닌 숫자를 입력하면 제대로 된 결과가 나타납니다. 하지만 0이나 문자열을 입력하면 오류가 발생하며, 프로그램이 실행 중단 상태가 됩니다.

Sub on_error_goto()
    Dim X As Integer
    Dim Y As Integer
    Dim sMsg As String
    On Error GoTo ErrTrap    ''' 에러 발생 시 ErrTrap으로 이동
    
    X = 100
    Y = inputBox("0이 아닌 숫자를 입력하세요")
    MsgBox "결과: " & X / Y

ErrTrap:                      ''' 오류가 발생하면 이곳으로 와서 실행
    If Err.Number <> 0 Then   ''' 오류가 발생하였다면 If 문 내부의 명령문 실행
        sMsg = "반드시 0이 아닌 숫자값을 입력하세요"
        MsgBox sMsg
    End If
End Sub

On Error GoTo문을 사용하면 프로시저 실행이 중단되지 않고 정상적으로 종료됩니다. 좀 더 사용자 친화적인 코드라고 할 수 있습니다.

InputBox에 0을 입력한 경우


On Error 문의 세 종류

'On Error GoTo XXX'는 구문은 '에러가 발생하면 XXX(레이블)로 가서 실행하라'는 의미입니다. On Error 문은 오류 발생 시 어떤 조치를 취하도록 하는 구문으로 세 종류가 있습니다.

On Error GoTo 레이블    ''' 오류 발생 시 지정한 레이블로 이동
On Error Resume Next   ''' 오류가 발생하더라도 오류 메시지를 표시하거나 
                       ''' 실행을 중단하지 말고 계속 다음 명령 진행
On Error GoTo 0        ''' 에러 메시지가 다시 나타나도록 설정(초기화)

On Error Resume Next 구문도 꼭 알고 있어야 합니다. 어떤 워크시트(예. DATA)를 삭제하고 다시 만들어야 하는 경우가 있습니다. 그런데 DATA 시트가 없는데 지우라는 명령을 실행하면 오류가 생기겠지요? 이런 경우 이 구문을 활용할 수 있습니다.

Sub on_error_resume_next()
    On Error Resume Next
    Application.DisplayAlerts = False    ''' 시트 삭제 시 나타나는 경고 메시지 제거
    Worksheets("DATA").Delete
    Application.DisplayAlerts = True     ''' 경고 메시지 표시 상태 초기화
End Sub

이렇게 하면 'DATA' 시트가 통합 문서 내에 있든 없든 에러 메시지가 나타나지 않습니다. 하나의 공식처럼 사용되는 구문이므로 눈여겨봐 두시기 바랍니다.


나가며

GoTo를 마지막으로 실행 순서 제어 구문도 마쳤습니다. 축하합니다. VBA 입문 강의의 7부 능선을 넘었습니다. 고지가 멀지 않았습니다.

반응형