2010-10-12 16 views
16

सामान्य रूप से, मैं On Error Goto कथन का उपयोग करके एक त्रुटि-हैंडलर बनाता हूं, वहां मैंने सफाई कोड की कुछ पंक्तियां डाली हैं और त्रुटि संदेश प्रदर्शित किया है, लेकिन अब मैं डिफ़ॉल्ट हैंडलर की सुविधा को खोना नहीं चाहता जो मुझे इंगित करता है सटीक रेखा जहां त्रुटि हुई है। मैं उसे कैसे कर सकता हूँ?वीबीए: मानक त्रुटि संदेश की तरह एक त्रुटि संदेश कैसे प्रदर्शित करें जिसमें "डीबग" बटन है?

अग्रिम धन्यवाद।

+0

बस रखने के लिए उचित लिंक ... यह प्रश्न यहां जारी है: http://stackoverflow.com/questions/3929997/vba-how-to-make-the-current-cursor-in-vbe-jump-to-the-line-where- अंतिम-त्रुटि/3930626 # 3930626 –

उत्तर

37

सबसे अच्छी खबर। इस कोड को आप क्या चाहते हैं

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 दिखाया गया है:

alt text

और अब बुरी खबर:
रेखा संख्या मूल के पुराने संस्करणों का अवशेष हैं। प्रोग्रामिंग पर्यावरण आमतौर पर उन्हें डालने और अपडेट करने का प्रभार लेता है। वीबीए और अन्य "आधुनिक" संस्करणों में, यह कार्यक्षमता खो जाती है।

हालांकि, Here वहाँ "स्वचालित रूप से" लाइन नंबर जोड़ने के लिए, तो लिखने के थकाऊ काम को बचाने के लिए कई विकल्प हैं ... लेकिन उन सभी को और अधिक या कम बोझिल ... या वाणिज्यिक लगते हैं।

HTH!

+0

MZTools लाइन नंबरों को जोड़/निकाल सकते हैं और इसके नि: शुल्क –

+0

@ चार्ल्स हाँ। मैंने उद्धृत पृष्ठ में संदर्भों में से एक है। Tnx! –

+0

@ अविश्वासी, कोड, बहुमूल्य जानकारी, और उपयोगी बाहरी संदर्भों के लिए बहुत बहुत धन्यवाद। बस उत्सुक है, क्या लाइन को पाठक के फोकस में लाने का एक तरीका है, यहां तक ​​कि उन्हें हाइलाइट करें और डिबगिंग मोड दर्ज करें? क्या वह वास्तव में आंतरिक कार्यक्षमता है? – Vantomex

1

आपके त्रुटि हैंडलर में त्रुटि हैंडलर को आसानी से अक्षम करने का एक आसान तरीका है यदि यह आपके द्वारा किए जा रहे त्रुटि प्रकारों से मेल नहीं खाता है और फिर से शुरू होता है।

नीचे दिए गए हैंडलर प्रत्येक त्रुटि प्रकार को फिर से जांचता है और यदि कोई भी मैच नहीं है तो यह सामान्य VBA यानी 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 
0

इस उत्तर डीबग बटन को संबोधित नहीं करता (आप एक फार्म के लिए डिजाइन और उस पर बटन का उपयोग अपने next question में विधि की तरह कुछ करने के लिए करना होगा)।

अब मैं डिफ़ॉल्ट प्रबंधक जो भी सटीक लाइन जहां त्रुटि हुई है करने के लिए मुझसे बात की comfortableness खोने के लिए नहीं करना चाहती: लेकिन यह इस भाग को संबोधित करता है।

सबसे पहले, मुझे लगता है कि आप इसे उत्पादन कोड में नहीं चाहते हैं - आप इसे डिबगिंग के लिए चाहते हैं या कोड के लिए व्यक्तिगत रूप से उपयोग करेंगे। मैं डिबगिंग इंगित करने के लिए एक कंपाइलर ध्वज का उपयोग करता हूं; तो अगर मैं किसी प्रोग्राम की समस्या निवारण कर रहा हूं, तो मैं आसानी से उस रेखा को ढूंढ सकता हूं जो समस्या पैदा कर रहा है।

# 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 इस proc कि त्रुटि के साथ उप-प्रक्रिया कहा जाता है में लाइन के पास ले जाएगा। लेकिन आप अभी भी उप-प्रक्रिया में कदम उठा सकते हैं, F8 का उपयोग करके फिर से त्रुटियों तक। यदि उप-प्रक्रिया बहुत कठिन बनाने के लिए बहुत लंबा है, तो आपकी उप-प्रक्रिया में शायद अपनी स्वयं की त्रुटि को नियमित रूप से संभालना चाहिए।

ऐसा करने के कई तरीके हैं।

Resume ExitHere   ' Normally exits during production 
    Resume     ' Never will get here 
Exit Sub 

यह फिर से शुरू बयान के लिए कभी नहीं मिल जाएगा, जब तक आप कर रहे हैं: कभी कभी छोटे कार्यक्रमों मैं कहाँ जानता हूँ कि मैं कर रहा हूँ वाला यह माध्यम से निकलते जा वैसे भी जब समस्या निवारण, मैं सिर्फ इन पंक्तियों सही MsgBox बयान के बाद डाल के लिए आगे बढ़ने के लिए इसे अगली पंक्ति के रूप में सेट करें, या तो उस पंक्ति पर अगला कथन सूचक खींचकर या CtrlF9 दबाकर उस पंक्ति पर कर्सर के साथ दबाकर।

यहां एक लेख है जो इन अवधारणाओं पर विस्तार करता है: Five tips for handling errors in VBA। अंत में, यदि आप वीबीए का उपयोग कर रहे हैं और अभी तक चिप पियरसन की भयानक साइट नहीं खोज पाई है, तो उसके पास Error Handling In VBA समझाते हुए एक पृष्ठ है।

0

मेरे लिए मैं सिर्फ अपनी VBA आवेदन में त्रुटि दिखाई दे तो समारोह में मैं नीचे दिए गए कोड बनाया चाहता था ..

समारोह Database_FileRpt '-------------- ----------- त्रुटि पर GoTo CleanFail '------------------------- ' 'Create_DailyReport_Action और कोड

CleanFail:

'*************************************

MsgBox "********************" _

& vbCrLf & "Err.Number:" & Err.Number _

& vbCrLf & "Err.Description:" & Err.Description _

& vbCrLf & "Err.Source:" & Err.Source _

& vbCrLf & "********************" _

& vbCrLf & "... से बाहर निकल रहा VBA फंक्शन: Database_FileRpt" _

& vbCrLf & "... एक्सेल वीबीए प्रोग्राम रीसेट।" _

, "वीबीए त्रुटि अपवाद उठाया गया!"


'ध्यान दें कि अगली पंक्ति 0 करने के लिए त्रुटि वस्तु रीसेट हो जाएगा, चर ऊपर मूल्यों याद करने के लिए उपयोग किया जाता है' ताकि एक ही त्रुटि फिर से उठाया जा सकता है

Err.Clear

'*************************************

फिर से शुरू CleanExit

क्लीनएक्सिट:

'सफाई कोड, यदि कोई हो, तो यहां जाता है। त्रुटि स्थिति के बावजूद चलता है।

बाहर निकलें समारोह 'उप या समारोह

समाप्ति समारोह' Database_FileRpt

के अंत

'------------------

संबंधित मुद्दे