<엑셀VBA 입문 14강> On Error 구문의 사용
VBA 코드를 찾다보면 “On Error Resume Next” 라던지 “On Error GoTo 레이블명”과 같은 명령어를 본 일이 있을 것이다. (본 적 없어도 괜찮다.)
오늘은 이 On Error의 정체에 대해서 배운다.
간단히 설명하면 On Error 라는 구문은 <에러가 발생했을 경우 처리방식>을 결정한다.
1. 에러가 나는 함수
먼저 에러가 나는 상황을 일부러 만들어보자.
아래와 같이 doTest 함수를 작성한다.

|
Sub 매크로1() End Sub Function doTest() Dim a 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 MsgBox (“함수의 끝”) End Function |

3. 에러가 발생하면 임의처리하기 (On Error GoTo 레이블명)
다음으로 On Error GoTo 구문이 있다. 사용은 [On Error GoTo 레이블명] 으로 쓴다. 예를 들면 [On Error GoTo aaaaa] 같은 식이다.
레이블이란 특정한 위치를 뜻하는데, [레이블명:] 형식으로 쓰면 된다.
[레이블명:] 이라고 써두면 나중에 GoTo문으로 도달할 수 있는 지점이 된다.
아래 예제를 보면 쉽게 이해될 것이다.
|
Function doTest() Dim a aaaaa: |

여기서 중요한 것은 레이블 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강> 변수를 같은 이름으로 사용하면 섞일까? (지역변수와 전역변수) :