VBA를 사용해서 엑셀 작업을 자동화하다 보면, 예상하지 못한 오를 마주하는 경우가 생깁니다.
예를 들어, 나눗셈 프로그램을 작성했고 사용자로부터 두 수를 입력받았을 때
분모에 해당하는 값을 0을 입력하면 오류가 발생하게 됩니다.
VBA는 이러한 에러를 처리하는 방법을 제공하고 있습니다.
0으로 나누었을 때 생기는 에러를 예를 들어 작성해 보겠습니다.
On Error Resume Next
먼저 0으로 나누었을 때 어떤 결과가 나타나는지 보겠습니다.
Option Explicit
Sub ZeroDivisionErrorWithResumeNext()
Dim result As Double
Dim a As Integer
Dim b As Integer
a = 10
b = 0
result = a / b
MsgBox result
End Sub
위 코드를 실행하면 0이 분모이기 때문에 당연히 에러가 발생합니다.
아래와 같은 메세지가 발생하고 코드가 실행되지 않습니다.
이러한 에러를 다루는 첫 번째 방법은
에러가 발생하면 무시해 버리는 것입니다.
On Error Resume Next 구문을 사용하면
이 구문 아래에서 에러를 무시하게 됩니다.
Option Explicit
Sub ZeroDivisionErrorWithResumeNext()
Dim result As Double
Dim a As Integer
Dim b As Integer
On Error Resume Next
a = 10
b = 0
result = a / b
MsgBox result
On Error GoTo 0
End Sub
이 코드에서 변수 b에 0이 할당되었고,
result 변수에는 10 / 0의 계산 결과가 들어갑니다.
아래 그림과 같은 결과가 발생합니다.
inf가 출력이 되는 것은
VBA에서 0으로 나눈 결과를 "무한대"로 표현하려는 시도로 볼 수 있습니다.
표현을 그렇게 할 뿐이지 결과적으로는 에러가 발생한 것입니다.
에러가 발생해서 실행이 되면 안 되는데 강제로 실행시켰더니
이런 결과가 나타나게 됩니다.
On Error GoTo 0
On Error GoTo 0 구문은 에러가 발생하면 에러를 표시하고 중단하라는 말입니다.
VBA에서 기본으로 설정되어 있습니다.
Option Explicit
Sub ZeroDivisionErrorWithResumeNext()
Dim result As Double
Dim a As Integer
Dim b As Integer
On Error Resume Next
a = 10
b = 0
result = a / b
MsgBox result
On Error GoTo 0
End Sub
위 코드의 맨 아래부분에 On Error GoTo 0 구문이 사용되었습니다.
즉 위 코드는
a=10 이라는 부분부터
MsgBox result까지 발생하는 오류는 무시하고
다시 원래대로 돌아와라는 의미가 밉니다.
On Error GoTo LabelName
On Error GoTo LabelName 구문은
에러가 발생하면 LabelName이 있는 곳으로 이동하라는 의미입니다.
LabelName은 무엇으로 정해도 되나
보통 HandleError을 사용합니다.
Sub ZeroDivisionErrorWithErr()
On Error GoTo HandleError
Dim a As Integer
Dim b As Integer
a = 10
b = 0
Dim result As Double
result = a / b
Exit Sub
HandleError:
If Err.Number = 11 Then
MsgBox "0으로 나누기 에러 발생: " & Err.Description
Else
MsgBox "알 수 없는 에러 발생: " & Err.Description
End If
On Error GoTo 0
End Sub
위 코드를 실행하면 아래와 같은 결과가 나타납니다.
위 코드에서 사용된 err 객체에 관한 내용은 아래 글을 참고하시면 됩니다.
☞ 엑셀 VBA의 Err 객체 : VBA의 에러를 다루기 위한 가이드
마 치 며
이 외에도 파일이 존재하는지 여부를 확인하거나,
데이터의 형식 검증 등 상황에 대처하기 위해 에러처리 기능을 사용할 수 있습니다.
여기를 방문하시면 더 많은 엑셀 관련 자료를 확인할 수 있습니다.
'EXCEL VBA' 카테고리의 다른 글
[ 엑셀 VBA ] 시트 추가하는 여러가지 방법, 엑셀 시트 추가하기 (0) | 2024.09.05 |
---|---|
[ 엑셀 VBA ] 엑셀 VBA의 Err 객체 : VBA의 에러를 다루기 위한 가이드 (2) | 2024.09.04 |
[ 엑셀 VBA ] VBA를 공부하기 위한 최고의 메뉴얼, 객체 브라우저(Object Browser) 사용하기 (3) | 2024.09.04 |
[ 엑셀 VBA ] 체크 박스 삭제하기 : VBA 체크 박스 생성 및 삭제 자동화 (0) | 2024.08.23 |
[ 엑셀 VBA ] VBA 유저폼 셀 조작 가능하게 하기 : 모달 VS 비모달 (0) | 2024.08.23 |