제어문

On Error 문

노만e 2025. 3. 17. 07:22

엑셀 VBA에서 On Error 문은 코드 실행 중 발생하는 오류를 처리하는 기능을 제공합니다.

즉, 오류가 발생했을 때 코드가 중단되지 않고, 원하는 방식으로 오류를 처리하도록 도와줍니다.


1. 기본 문법

On Error GoTo 라벨
  • 오류가 발생하면 지정한 라벨로 이동하여 오류 처리 코드 실행
On Error Resume Next
  • 오류가 발생해도 무시하고 다음 코드 실행
On Error GoTo 0
  • 오류 처리를 비활성화하고 기본 오류 메시지를 표시

2. On Error GoTo (오류 발생 시 특정 위치로 이동)

Sub 오류_처리_GoTo()
On Error GoTo 오류처리 ' 오류 발생 시 오류처리 라벨로 이동
Dim x As Integer
x = 10 / 0 ' 0으로 나누기 오류 발생
Exit Sub ' 정상 실행 시 오류처리 라벨을 건너뜀
오류처리:
MsgBox "오류 발생! 오류 번호: " & Err.Number & vbNewLine & "설명: " & Err.Description
End Sub

📌 출력:

오류 발생! 오류 번호: 11
설명: 0으로 나눌 수 없습니다.

📌 0으로 나누는 오류 발생 시 오류 메시지를 출력하고 코드 중단 방지


3. On Error Resume Next (오류 무시하고 계속 실행)

Sub 오류_무시_실행()
On Error Resume Next ' 오류 발생해도 계속 실행
Dim x As Integer
x = 10 / 0 ' 오류 발생하지만 코드가 중단되지 않음
MsgBox "오류가 발생했지만 계속 실행됨!"
End Sub

📌 출력: "오류가 발생했지만 계속 실행됨!"

📌 0으로 나누는 오류가 발생해도 코드가 중단되지 않고 계속 실행됨


4. On Error Resume Next + Err.Number (오류 발생 여부 확인)

Sub 오류_확인_후_처리()
On Error Resume Next ' 오류 발생해도 코드 계속 실행
Dim x As Integer
x = 10 / 0 ' 오류 발생
If Err.Number <> 0 Then
MsgBox "오류 발생! 오류 번호: " & Err.Number & vbNewLine & "설명: " & Err.Description
Err.Clear ' 오류 정보 초기화
End If
End Sub

📌 출력: "오류 발생! 오류 번호: 11"

📌 Err.Number를 확인하여 오류 발생 여부를 감지한 후 처리


5. On Error GoTo 0 (오류 처리 해제)

Sub 오류_처리_해제()
On Error Resume Next ' 오류 무시
Debug.Print 10 / 0 ' 오류 발생하지만 무시됨
On Error GoTo 0 ' 오류 처리 해제
Debug.Print 10 / 0 ' 여기서 다시 오류 발생 (실제 오류 메시지 표시됨)
End Sub

📌 On Error GoTo 0 이후 발생한 오류는 정상적으로 처리됨 (중단됨)


6. 파일 열기 오류 처리 (Dir 함수 활용)

Sub 파일_존재확인()
Dim 파일경로 As String
파일경로 = "C:\없는파일.xlsx"
On Error Resume Next ' 오류 무시
Workbooks.Open 파일경로
If Err.Number <> 0 Then
MsgBox "파일을 찾을 수 없습니다!", vbExclamation
Err.Clear
Else
MsgBox "파일이 열렸습니다!"
End If
End Sub

📌 파일이 존재하지 않으면 "파일을 찾을 수 없습니다!" 메시지 출력

📌 Err.Clear를 사용하여 오류 초기화


7. 특정 오류만 처리하고 나머지는 기본 오류 메시지 표시

Sub 특정오류_처리()
On Error GoTo 오류처리
Dim x As Integer
x = 10 / 0 ' 0으로 나누기 오류 발생
Exit Sub ' 오류 없으면 오류 처리 부분 실행하지 않음
오류처리:
If Err.Number = 11 Then ' 특정 오류만 처리
MsgBox "0으로 나누는 오류 발생! 코드 계속 실행 가능."
Resume Next ' 오류 발생한 다음 줄부터 실행 계속
Else
MsgBox "예상치 못한 오류 발생: " & Err.Description
Err.Clear
End If
End Sub

📌 오류 코드 11(0으로 나누기)은 처리하고, 다른 오류는 기본 오류 처리


8. 배열에서 오류가 발생하는 경우 처리

Sub 배열오류_처리()
Dim arr(2) As Integer
Dim i As Integer
On Error Resume Next ' 오류 발생해도 코드 실행 계속
For i = 0 To 3 ' 배열 크기 초과 (오류 발생)
arr(i) = i * 10
If Err.Number <> 0 Then
MsgBox "배열 범위 초과 오류 발생! " & Err.Description
Err.Clear
End If
Next i
End Sub

📌 배열 인덱스 초과 오류 발생 시 오류 메시지 출력 후 코드 계속 실행


9. 시트 존재 여부 확인 후 실행

Sub 시트존재_확인()
Dim ws As Worksheet
Dim 시트이름 As String
시트이름 = "데이터"
On Error Resume Next
Set ws = ThisWorkbook.Sheets(시트이름)
If ws Is Nothing Then
MsgBox "시트가 존재하지 않습니다!"
Else
MsgBox "시트가 존재합니다!"
End If
Err.Clear
End Sub

📌 "데이터" 시트가 없으면 "시트가 존재하지 않습니다!" 메시지 출력


10. 셀 값이 숫자인 경우만 계산

Sub 숫자만_계산()
Dim 값 As Variant
값 = Range("A1").Value
On Error Resume Next ' 오류 무시
MsgBox "결과: " & 값 * 10
If Err.Number <> 0 Then
MsgBox "A1의 값이 숫자가 아닙니다!", vbExclamation
Err.Clear
End If
End Sub

📌 A1의 값이 숫자가 아니면 "A1의 값이 숫자가 아닙니다!" 메시지 출력


📝 정리

기능
VBA 코드
오류 발생 시 특정 위치로 이동
On Error GoTo 오류처리
오류 무시하고 실행 계속
On Error Resume Next
오류 발생 여부 확인
If Err.Number <> 0 Then ... Err.Clear
오류 처리 해제
On Error GoTo 0
파일 존재 확인 후 실행
If Dir(파일경로) = "" Then MsgBox "파일 없음"
특정 오류만 처리
If Err.Number = 11 Then Resume Next
배열 인덱스 오류 처리
If Err.Number <> 0 Then MsgBox "배열 오류"
시트 존재 여부 확인
If ws Is Nothing Then MsgBox "시트 없음"
셀 값이 숫자인 경우만 계산
If IsNumeric(Range("A1").Value) Then ...

🔥 VBA의 On Error를 활용하면 오류 발생 시 코드 실행을 안전하게 제어할 수 있습니다! 🚀