<엑셀VBA 입문 14강> On Error 구문의 사용

<엑셀VBA 입문 14강> On Error 구문의 사용

VBA 코드를 찾다보면 “On Error Resume Next” 라던지 “On Error GoTo 레이블명”과 같은 명령어를 본 일이 있을 것이다. (본 적 없어도 괜찮다.)

오늘은 이 On Error의 정체에 대해서 배운다.

간단히 설명하면 On Error 라는 구문은 <에러가 발생했을 경우 처리방식>을 결정한다.

1. 에러가 나는 함수

먼저 에러가 나는 상황을 일부러 만들어보자.

아래와 같이 doTest 함수를 작성한다.

Sub 매크로1()

‘ 매크로1 매크로
‘ 바로 가기 키: Ctrl+k

    Call doTest

End Sub

Function doTest()

    Dim a
    a = 10 / 0

    MsgBox (“함수의 끝”)

End Function

보다시피 굉장히 간단한 코드다. 단축키 Ctrl + k 를 누르면 doTest 함수가 실행되지만, 에러가 나는 경우다.

산수에서 어떤 숫자를 0 으로 나누는 것은 불가능하다고 되어 있는데, 프로그래밍에서도 똑같다.

숫자를 0 으로 나누면 에러가 난다. (아래 그림)

“0으로 나누었습니다”라는 에러가 발생하였다. 당연하게도 그 아래 MsgBox 명령어는 아예 수행되지 않았다.

프로그램 수행이 중단된 것이다.

하지만 어떠한 경우에도 프로그램이 중단되지 않고 수행되기를 원한다면 어떨까?

예를 들면 프로그램을 돌려놓고 10시간 쯤 자리를 비우는 경우 말이다.

실제로 필자는 VBA로 특정 업무를 자동화해놓고, 다른 업무를 진행했던 적이 종종 있다.

2. 에러가 발생해도 무시하기 (On Error Resume Next)

On Error Resume Next 는 함수에 에러가 발생해도 현상을 무시한다.

함수 첫번째 줄에 쓰면 된다.

이를 테면 아래와 같은 코드다.

Function doTest()

    On Error Resume Next
    Dim a
    a = 10 / 0

    MsgBox (“함수의 끝”)

End Function

3. 에러가 발생하면 임의처리하기 (On Error GoTo 레이블명)

다음으로 On Error GoTo 구문이 있다. 사용은 [On Error GoTo 레이블명] 으로 쓴다. 예를 들면 [On Error GoTo aaaaa] 같은 식이다.

레이블이란 특정한 위치를 뜻하는데, [레이블명:] 형식으로 쓰면 된다.

[레이블명:] 이라고 써두면 나중에 GoTo문으로 도달할 수 있는 지점이 된다.

아래 예제를 보면 쉽게 이해될 것이다.

Function doTest()
 
    ‘에러 발생시 aaaaa 레이블로 이동(GoTo)
    On Error GoTo aaaaa

    Dim a
    a = 10 / 0
        
    ‘함수의 끝
    Exit Function 

aaaaa:
    MsgBox (“에러가 났어요!”)
    
End Function

여기서 중요한 것은 레이블 aaaaa 위쪽에 [Exit Function] 이란 명령어를 적어서 함수를 종료시켜주는 것이다.

[Exit Function] 이라는 명령어를 적지 않으면, 함수는 첫번째 줄부터 마지막 줄까지 진행되기 때문에, 에러가 발생하지 않았을 경우에도 [에러가 났어요]라는 메시지가 발생하게 된다.

참고로 지금은 Function 안쪽이기 때문에 [Exit Function] 명령어를 사용했지만, Sub 안쪽이라면 [Exit Sub] 명령어를 사용해야 한다.

즉, aaaaa: 라는 명령어는 어떤 지점을 표시해두는 기능 뿐이다. 레이블을 지정한다고 해서 독립된 공간이 마련되는 것은 아니다.

특히 에러가 발생했을 때 메시지를 띄워줘야 한다면, 실제로 [에러가 났어요]같은 애매한 메시지보다는, 정확한 메시지를 띄워주는 편이 낫다. 아래 코드를 사용하면 된다.

MsgBox  (“에러코드 ” & Err.Number & ” 발생 : ” & Err.Description)

일반적으로 어떤 함수인가에 따라 에러 처리를 다르게 해주는 편이 좋다.

예를 들어 문자열을 잘라내는 함수라면 에러 발생시 빈 값을 리턴하도록 처리해주는게 좋고,

숫자를 리턴하는 함수라면 0 이나 -1 을 리턴해서 에러가 발생해도 문제 없이 진행되도록 처리하는 편이 좋다.

에러가 났다고 명시적으로 메시지를 꼭 띄워줘야 하는 상황이라면, MsgBox를 띄워주자.

이상 VBA On Error 구문의 사용이었다.

이어지는 글 <엑셀VBA 입문 15강> 텍스트 파일쓰기, 파일읽기 : https://blog.naver.com/bb_/221329757129
이어지는 글 <엑셀VBA 입문 16강> VBA로 워크시트 함수 활용하기 : https://blog.naver.com/bb_/221350410698

이어지는 글 <엑셀VBA 입문 17강> 변수를 같은 이름으로 사용하면 섞일까? (지역변수와 전역변수) :

https://blog.naver.com/bb_/221417490850