티스토리 뷰

VBA

[Excel][VBA] 오류 처리 방법

어린왕자1234 2021. 11. 20. 02:14

■ 오류 종류

    구문 오류 : 문법 오류

    런타임 오류 : 프로시저 구동 중 발생하는 오류

    ※ 오류처리프로시져를 작성하여 에러를 처리하고자 한다면

       VBE 옵션에서 [오류발생 시 무조건 중단] 해제 -> [ 처리되지 않은 오류 발생 시 중단 ] 선택

 

■ 오류처리 개념

    VBA는 기본적으로 프로시저 구동 중 발생하는 런타임 오류에 대해서

    VBA오류메시지 대화상자를 뛰운다.    -------------------------------≫

   일반 Excel사용자가 이런 에러 메시지창을 대하면 대처가 불가할 수 있으니

   배포자가 에러를 내부적으로 처리할 필요가 있다 

    ( 배포자가 작성한 메시지를 뛰우거나 에러처리 코드 실행 )

     ▶ VBA는 에러발생 시 발생에러를 Err 개체의 Number 속성에 저장

     ▶ Error함수를 이용하여 오류메시지를 반환 가능------------------≫

     MsgBox "Error" & Err & " : " & Error(Err.Number)

     MsgBox "Error" & Err & " : " & Error(Err)  ' 동일 결과

 

■ 에러처리 방법

    [ Test ] 

    빈 시트에서 Cells.SpecialCells(xlFormulas, xlNumbers).Select  프로시저 수행시 Err 1004 에러 발생

    ▶ 오류를 무시하고 프로그램을 계속 진행하다가 나중에 Err개체를 확인하여 적절히 조치함       

        : On Error Resume Next문은 에러발생 전에 위치시키고(주로 프로시저 시작 부분에 놓음),

          에러처리는 끝에서 한다.         

Sub 예러처리()
    On Error Resume Next
    Cells.SpecialCells(xlFormulas, xlNumbers).Select   
                      ' 이동옵션 : 수식-수 선택 => 숫자가 있는 셀만 선택 기능   
    
    ' 기타 코드    
    
    MsgBox "Error" & Err & " : " & Error(Err) 
End Sub
Range객체.SpecialCells(Type, Value)
- 홈>찾기 및 선택>이동옵션
  : 지정Type만 선택 기능

   ▶ 오류를 처리하기 위하여 오류처리 루틴으로 이동 (Lable이용)

       :  On Error GoTo문은 GoTo문과 같은 기능이며, 에러 발생하여 레이블로 이동한다면
          레이블 이후에 루틴은 모두 수행한다. 이 말은 에러가 발생하지 않아도 루틴 마지막에는
          레이블 이후 코드가 실행되어  원치 않는 에러처리 메시지박스가 뜰 수 있다.
          그러므로 레이블 이전에 Exit Sub 꼭 삽입해야 에러 미발생시 레이블이후 코드 미실행됨

Sub 예러처리()
    Cells.SpecialCells(xlFormulas, xlNumbers).Select
    On Error GoTo ErrorHandler   ' 에러가 발생하여 레이블로 이동하라는 명령
    
    ' 기타 코드
    
    Exit Sub
ErrorHandler:
MsgBox "Error" & Err & " : " & Error(Err)    'Exit Sub문이 없을시 에러 미발생시도 수행됨
End Sub

   On Error GoTo 0문을 이용하여 On Error Resume Next를 무력화

       :  이문장 이전에 저장된 Err을 0(이전 까지는 에러가 발생하지 않은 것으로 처리)으로 만들고, 이후 발생한 Error는           VBA 에러처리 메시지를 뛰운다. ( 큰 프로젝트에서 계속 에러발생을 무시하지 않고자 할 때 사용 )

Sub 예러처리()
    On Error Resume Next
    Cells.SpecialCells(xlFormulas, xlNumbers).Select
      
    If Err = 1004 Then
        MsgBox "Error" & Err & " : " & Error(Err)
    End If
    
    ' 에러 처리가 필요시 On Error Resume Next 무력화
    On Error GoTo 0

    ' 기타 코드  (이후 코드에서 에러 발생시 vba에러메시지창 발생)
    
End Sub

 

※ 에러처리를 이용한 file open 상태 확인

Function FileCheck(FileName As String) As Boolean

    Dim Wb As Workbook
    Dim Chk As Boolean
     
    Chk = False
     
    On Error Resume Next
    Set Wb = Workbooks(FileName)
    If Err.Number = 0 Then FileCheck = True    ' 파일이 open되지 않아 set 수행안되면 에러발생되어 True반환
    On Error GoTo 0

End Function
 
Sub aaa()
    If FileCheck("재무재표.xlsx") Then
        MsgBox ("File is Open")
    Else
        MsgBox ("File is not Open")
    End If
End Sub

 

[참조] Try ~ Expect ~ Finally 구현 (레이블이용 : Keyword이용 아님)

Sub 예러처리()
Try:
    On Error GoTo Except
    Cells.SpecialCells(xlFormulas, xlNumbers).Select
    GoTo Finally
Except:
    MsgBox "Error" & Err & " : " & Error(Err)
Finally:

    ' 무조건 실행되는 코드
    
End Sub