디버깅 버튼이 있는 표준 에러 메시지와 같은 에러 메시지를 표시하는 방법
에러 핸들러를 작성했습니다.On Error Goto
몇 줄의 클리닝 코드를 입력하고 에러 메시지를 표시합니다만, 디폴트 핸들러의 편안함을 잃고 싶지 않습니다.디폴트 핸들러의 쾌적함도, 에러가 발생한 정확한 행으로 향합니다.내가 어떻게 그럴 수 있을까?
일단 좋은 소식입니다.이 코드는 사용자가 원하는 기능을 수행합니다('라인 번호'를 참조하십시오).
Sub a()
10: On Error GoTo ErrorHandler
20: DivisionByZero = 1 / 0
30: Exit Sub
ErrorHandler:
41: If Err.Number <> 0 Then
42: Msg = "Error # " & Str(Err.Number) & " was generated by " _
& Err.Source & Chr(13) & "Error Line: " & Erl & Chr(13) & Err.Description
43: MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext
44: End If
50: Resume Next
60: End Sub
실행 시 예상되는 MsgBox가 표시됩니다.
그리고 이제 나쁜 소식은:
행 번호는 이전 버전의 Basic의 나머지입니다.보통 프로그래밍 환경에서 삽입 및 업데이트를 담당했습니다.VBA 및 기타 "현대" 버전에서는 이 기능이 상실됩니다.
다만, 여기에서는, 행 번호를 자동적으로 추가하는 몇개의 대안이 있어, 타이핑하는 귀찮은 작업이 불필요합니다만, 모두 다소 귀찮은 것 같습니다.또는 상업용입니다.
HTH!
에러 핸들러의 에러 핸들러가 실행중의 에러 타입과 일치하지 않는 경우는, 에러 핸들러를 무효로 해 재개하는 간단한 방법이 있습니다.
다음 핸들러는 각 오류 유형을 다시 확인하고 일치하지 않을 경우 오류 재개를 일반 VBA ie GoTo 0으로 되돌리고 코드를 재개하면 일반 오류 블록이 나타납니다.
On Error GoTo ErrorHandler
x = 1/0
ErrorHandler:
if Err.Number = 13 then ' 13 is Type mismatch (only used as an example)
'error handling code for this
end if
If err.Number = 1004 then ' 1004 is Too Large (only used as an example)
'error handling code for this
end if
On Error GoTo 0
Resume
이 답변에서는 [Debug]버튼을 다루지 않습니다(다음 질문의 방법과 같은 작업을 수행하려면 폼을 디자인하고 해당 버튼을 사용해야 합니다).그러나 이 부분은 다루어집니다.
디폴트 핸들러의 편안함을 잃고 싶지 않습니다.이러한 핸들러는, 에러가 발생한 정확한 회선을 나타내고 있습니다.
우선, 실가동 코드로 하고 싶지 않다고 생각합니다.디버깅용 또는 개인적으로 사용하는 코드로 하고 싶은 것입니다.컴파일러 플래그를 사용하여 디버깅을 나타냅니다.프로그램의 트러블 슈팅을 실시하면 문제의 원인이 되고 있는 행을 쉽게 찾을 수 있습니다.
# Const IsDebug = True
Sub ProcA()
On Error Goto ErrorHandler
' Main code of proc
ExitHere:
On Error Resume Next
' Close objects and stuff here
Exit Sub
ErrorHandler:
MsgBox Err.Number & ": " & Err.Description, , ThisWorkbook.Name & ": ProcA"
#If IsDebug Then
Stop ' Used for troubleshooting - Then press F8 to step thru code
Resume ' Resume will take you to the line that errored out
#Else
Resume ExitHere ' Exit procedure during normal running
#End If
End Sub
주의: 예외:Resume
에러 처리 루틴이 없는 서브 세션에서 에러가 발생했을 경우,Resume
는, 에러가 발생하고 있는 서브 매니저를 호출한 이 프로시저의 회선으로 이동합니다.단, 다시 에러가 발생할 때까지 서브프로시저를 계속 진행할 수 있습니다.서브프로시저가 너무 길어서 지루할 수 없는 경우 서브프로시저에는 에러 처리 루틴이 있을 수 있습니다.
여기에는 여러 가지 방법이 있습니다.트러블 슈팅을 실시할 때, 어느 쪽이든 순서를 밟을 수 있는 소규모 프로그램의 경우는, MsgBox 의 스테이트먼트 바로 뒤에 다음의 행을 붙입니다.
Resume ExitHere ' Normally exits during production
Resume ' Never will get here
Exit Sub
다음 문 포인터를 해당 행으로 끌거나 해당 행에서 커서로 눌러서 실행할 다음 행으로 설정하지 않는 한 Resume 문에는 도달하지 않습니다.
다음은 이러한 개념을 자세히 설명하는 기사입니다.VBA 에러 처리에 관한 5가지 힌트.마지막으로 VBA를 사용하고 있는데 칩 피어슨의 멋진 사이트를 아직 발견하지 못한 경우 VBA의 오류 처리에 대해 설명하는 페이지가 있습니다.
저는 VBA 어플리케이션의 오류를 확인하고 싶었기 때문에 아래 코드를 만들었습니다.
Function Database_FileRpt
'-------------------------
On Error GoTo CleanFail
'-------------------------
'
' Create_DailyReport_Action and code
CleanFail:
'*************************************
MsgBox "********************" _
& vbCrLf & "Err.Number: " & Err.Number _
& vbCrLf & "Err.Description: " & Err.Description _
& vbCrLf & "Err.Source: " & Err.Source _
& vbCrLf & "********************" _
& vbCrLf & "...Exiting VBA Function: Database_FileRpt" _
& vbCrLf & "...Excel VBA Program Reset." _
, , "VBA Error Exception Raised!"
*************************************
' Note that the next line will reset the error object to 0, the variables
above are used to remember the values
' so that the same error can be re-raised
Err.Clear
' *************************************
Resume CleanExit
CleanExit:
'cleanup code , if any, goes here. runs regardless of error state.
Exit Function ' SUB or Function
End Function ' end of Database_FileRpt
' ------------------
언급URL : https://stackoverflow.com/questions/3911973/vba-how-to-display-an-error-message-just-like-the-standard-error-message-which
'sourcecode' 카테고리의 다른 글
암호를 입력하라는 메시지를 표시하지 않고 PowerShell 인증 정보 사용 (0) | 2023.04.23 |
---|---|
Open XML 워크시트에 날짜를 삽입하려면 어떻게 해야 합니까? (0) | 2023.04.23 |
오류: Android_HOME이 설정되어 있지 않고 PATH에 "안드로이드" 명령이 없습니다.다음 조건 중 하나 이상을 충족해야 합니다. (0) | 2023.04.23 |
bash: mkvirtualenv: 명령을 찾을 수 없습니다. (0) | 2023.04.23 |
애플리케이션 내에서 WPF와 WinForms를 혼재시킬 수 있습니까? (0) | 2023.04.23 |