VBA 예외 처리(On Error Goto 오류 레이블...)

15088 단어
Word, Excel, 나아가 VBA를 지원하는 Office 구성 요소에서 코드에서 오류를 처리하는 방식은 보통 'On Error Goto 오류 탭' 문장을 사용한 다음 코드의 뒤에 오류 탭과 그 안에 포함된 오류 처리 코드를 추가합니다.다음은 오류 처리 프로그램을 만드는 절차를 요약한 것이다.
(1) 프로세스 중에 오류가 발생할 수 있는 코드 행 앞에 오류 처리 명령문인 On Error Goto ErrHandler를 추가합니다. 여기서 "ErrHandler"는 사용자 정의 오류 레이블 이름입니다.
(2) 오류가 발생할 수 있는 코드 행 뒤에 오류 처리 취소 명령문인 On Error Goto 0을 추가하면 오류가 발생하면 지정된 오류 레이블로 이동하지 않고 [디버깅], [묶음] 등의 버튼이 있는 오류 프롬프트 창을 직접 표시합니다.
(3) 매크로의 끝(일반 프로그램의 끝)에 코드 행 Exit Sub을 추가하여 프로그램의 오류가 발생하지 않았을 때 오류 처리 프로그램을 실행하지 않도록 합니다.
(4) 코드 행 Exit Sub의 다음 행에 "MyErr:"등의 이름과 콜론으로 구성된 오류 레이블을 추가합니다.
(5) 오류 레이블의 다음 행에 오류 처리 코드를 작성합니다.오류를 일으킨 코드 행 뒤에 있는 코드 행을 반환하려면 Resume Next 문을 사용합니다.
참고: 프로세스의 끝에 여러 개의 오류 처리 프로그램을 추가할 수 있지만 각 오류 처리 프로그램이 현재 오류 프로그램 이후의 오류 처리 프로세스를 계속하지 않도록 하려면 Resume Next 또는 Exit Sub 문구로 끝나야 합니다.
간단한 예를 들면 위에서 말한 내용을 더욱 직관적으로 반영할 수 있다.다음 코드에서 워크북에 지정된 작업표가 없는 것을 발견하면 오류가 발생하고 오류 코드를 실행하며 오류 번호와 오류 설명을 포함하는 대화상자를 표시합니다.
 1 Sub           ()
 2 
 3     Dim wksname As String, msg As String
 4 
 5     On Error GoTo MyErr
 6 
 7     wksName = Worksheets("sx").Name
 8 
 9     MyErr:
10 
11     msg = "    " & Err.Number & "" & Err.Description
12 
13     MsgBox msg
14 
15 End Sub

참고: 문제를 일으킨 코드 행 앞에 On Error Resume Next 문구를 사용하든 "On Error Goto 태그"문구를 사용하든 프로그램이 다른 오류 정보를 다시 가져오려면 문제를 일으킨 코드 행 뒤에 On Error Goto 0 문구를 사용하여 정상적인 오류 캡처 상태를 복원해야 합니다.그렇지 않으면 현재 오류 처리 프로그램이 뒤의 모든 오류에 영향을 미칠 것입니다.예를 들어, 다음 코드는 On Error Goto 0 문을 사용하지 않으므로 뒤에 오류가 발생할 때(x/y 두 번) 태그 MyErr로 이동하여 오류 처리 프로그램을 실행합니다.
Sub ErrTest()

    Dim x As Integer, y As Integer, z As Single

    x = 1

    y = 0

    On Error GoTo MyErr

    MsgBox x / y

    MsgBox x / y

    MsgBox "                 "

    Exit Sub

MyErr:

    MsgBox "   1  :      0"

    Resume Next   

End Sub

 
다음 코드는 On Error Goto 0 문을 적시에 사용했기 때문에 두 번째 오류가 발생했을 때(즉 두 번째 x/y) MyErr 탭을 실행하는 코드가 아닌 내장된 오류 메시지가 표시됩니다.
 1 Sub ErrTest1()
 2 
 3     Dim x As Integer, y As Integer, z As Single
 4 
 5     x = 1
 6 
 7     y = 0
 8 
 9     On Error GoTo MyErr
10 
11     MsgBox x / y
12 
13     On Error GoTo 0
14 
15     MsgBox x / y
16 
17     MsgBox "                 "
18 
19     Exit Sub
20 
21 MyErr:
22 
23     MsgBox "   1  :      0"
24 
25     Resume Next
26 
27 End Sub

 
아래 코드는 On Error Goto 0 문을 사용하지 않았지만 두 번째 오류가 발생하기 전에 두 번째 오류 레이블이 추가되어 두 개의 오류 처리 프로그램이 각각의 오류를 처리합니다.
 1 Sub ErrTest2()
 2 
 3     Dim x As Integer, y As Integer, z As Single
 4 
 5     x = 1
 6 
 7     y = 0
 8 
 9     On Error GoTo MyErr1
10 
11     MsgBox x / y
12 
13     On Error GoTo MyErr2
14 
15     MsgBox x / y
16 
17     MsgBox "                 "
18 
19     Exit Sub
20 
21 MyErr1:
22 
23     MsgBox "   1  :      0"
24 
25     Resume Next
26 
27 MyErr2:
28 
29     MsgBox "   2  :      0"
30 
31     Resume Next
32 
33 End Sub

상기 3단 코드는 오류 처리 프로그램을 실행한 후 오류가 발생한 코드로 되돌아와 계속 실행됩니다.이 예에서는 오류 처리 프로그램을 실행한 후에도 "MsgBox"오류 코드 행의 다음 행 코드 계속 실행"코드 행을 계속 실행합니다.
프로그램이 실행될 때 오류가 발생하는 것을 원하지 않지만, 때때로 우리는 오류를 이용하여 코드의 효율을 높일 수 있다.예를 들어 사용자가 어떤 이유로 워크북의 워크시트를 삭제할 때 VBA 프로그램에 워크시트를 조작하는 코드가 포함되면 사용자가 이 프로그램을 실행할 때 오류가 발생할 수 있습니다.이 때, 오류를 이용하여 작업표가 작업장에 존재하는지 검사할 수 있습니다.코드는 다음과 같습니다.
 1 Sub          ()
 2 
 3     Dim WksName As String
 4 
 5     On Error Resume Next
 6 
 7     WksName = Worksheets("sx").Name
 8 
 9     If Err.Number <> 0 Then
10 
11         MsgBox prompt:="             sx", Title:="    "
12 
13     End If
14 
15     On Error GoTo 0
16 
17 End Sub

 
참고: On Error Resume Next 문을 사용한 후에는 오류가 발생할 수 있는 코드 행 이후에 On Error Goto 0 문을 사용하여 오류 캡처, 즉 오류 검사의 정상 상태로 복원하여 발생할 수 있는 다른 오류를 알 수 있도록 해야 합니다.또한 On Error Resume Next 문을 사용하여 무시할 수 없는 오류를 무시하면 현재 실행 중인 프로세스가 즉시 종료됩니다.더 심각한 것은 매크로 1이 매크로 2를 호출했지만 매크로 2에 무시할 수 없는 오류가 발생하면 매크로 2의 실행을 즉시 끝내고 매크로 1의 다음 줄 코드를 계속 실행합니다. 이런 경우 전체 코드에 예측할 수 없는 오류가 포함될 수 있으므로 조심해야 합니다.
Resume 문
오류 처리 프로그램이 끝난 후에 원래의 운행을 회복합니다.
문장
묘사
Resume
오류와 오류 처리 프로그램이 같은 과정에 나타나면 오류가 발생한 문장에서 다시 실행됩니다.호출되는 과정에서 오류가 발생하면, 오류 처리 프로그램을 포함하는 최근 호출된 문장에서 실행을 복원합니다
Resume Next
오류와 오류 처리 프로그램이 같은 프로그램에 나타나면 오류가 발생한 문장을 뒤따르는 다음 문장에서 다시 실행됩니다.호출되는 동안 오류가 발생하면 오류 처리 프로그램을 포함하는 마지막 프로세스가 포함된 명령문(또는 On Error Resume Next 명령문)이 해당 명령문 바로 뒤에 오는 명령문에서 다시 실행됩니다.
Resume line
필요한 라인 매개 변수가 지정한 라인에서 실행을 회복합니다.라인 매개 변수는 줄 탭이나 줄 번호입니다. 오류 처리 프로그램과 같은 과정에 있어야 합니다.
 
On Error 문에서 오류 처리 프로그램을 시작하고 하위 프로그램의 위치를 지정합니다.오류 처리 프로그램을 금지하는 데도 사용할 수 있습니다.
문장
묘사
On Error GoTo line            
오류 처리 프로그램을 시작하고, 이 절차는 필요한 라인 매개 변수에서 지정한 라인에서 시작합니다.라인 매개 변수는 모든 줄 라벨이나 줄 번호일 수 있습니다.실행 중 오류가 발생하면 컨트롤이 라인으로 넘어가 오류 처리 프로그램을 활성화합니다.지정된 line은 On Error 문과 동일한 프로세스 중 하나여야 합니다.그렇지 않으면 컴파일 시간 오류가 발생할 수 있습니다.
On Error Resume Next
실행 중 오류가 발생했을 때 컨트롤이 오류가 발생한 문장 다음에 있는 문장으로 넘어가 계속 실행된다는 것을 설명합니다.On Error GoTo 대신 객체에 액세스할 때 이 형식을 사용합니다.
On Error GoTo 0
현재 프로세스에서 시작된 오류 처리 프로그램을 금지합니다. 
 
 
오류 처리 프로그램은 Err 객체의 Number 속성 값을 기준으로 오류 발생 원인을 결정합니다.다른 오류가 발생하기 전이나 오류가 발생할 수 있는 프로세스를 호출하기 전에 오류 처리 프로그램은 먼저 Err 객체의 관련 속성 값을 테스트하거나 저장해야 합니다.Err 객체의 속성 값은 최근에 발생한 오류만 반영합니다.Err.Description에는 Err.Number와 연관된 오류 정보입니다.
On Error GoTo 0은(는) 현재 프로세스 중 오류 처리를 중지합니다.비록 과정 중에 0의 줄이 포함되어 있더라도, 줄 0은 오류를 처리하는 코드의 시작점으로 지정하지 않는다.On Error GoTo 0 문이 없으면 프로세스를 종료할 때 오류 처리 프로그램이 자동으로 닫힙니다.
 
발췌:https://blog.csdn.net/daihongliu/article/details/78285088
전재 대상:https://www.cnblogs.com/maol986162214/p/11128415.html

좋은 웹페이지 즐겨찾기