2014-10-14 8 views
6

मुझे पता है कि आप Ctrl + तोड़ने के साथ मैन्युअल रूप से चल रहे वीबीए मैक्रो को मैन्युअल रूप से रोक सकते हैं, लेकिन अगर कोई निश्चित स्थिति पूरी हो जाती है तो कोड स्वचालित रूप से बंद होने का कोई तरीका है? exit function/exit sub काम नहीं कर रहे हैं, क्योंकि वे केवल उस विधि को समाप्त कर रहे हैं जिसे वे भीतर बुलाया जाता है।स्वचालित रूप से वीबीए मैक्रो को कैसे रोकें?

उदाहरण के लिए,

sub a 
    call b 
    msgbox "a complete" 
end sub 

sub b 
    call c 
    msgbox "b complete" 'this msgbox will still show after the `exit sub` in 'c' 
end sub 

sub c 
    msgbox "entering c" 
    exit sub    'this will only `exit sub` 'c', but not 'a' or 'b' 
    msgbox "exiting c" 
end sub 

'OUTPUT: 

'entering c 
'b complete 
'a complete 

मुझे लगता है मैं s 'function में s' इन sub कर देते हैं और वापसी कोड यदि विधि सफलतापूर्वक क्रियान्वित पता करने के लिए प्रयोग कर सकते हैं, लेकिन वहाँ यह करने के लिए एक सरल तरीका है?

+0

goto' बुरा है बस एक सामान्य टिप, 'के रूप में। इसका इस्तेमाल न करें। –

+0

http://stackoverflow.com/q/46586/436282 –

उत्तर

9

आप err.raise के साथ अपनी खुद की उपयोगकर्ता-परिभाषित त्रुटि को बढ़ा सकते हैं। यह आपके उदाहरण के समान है, लेकिन इसमें थोड़ा और शक्तिशाली है कि यह एक वास्तविक त्रुटि है जो कोड निष्पादन को रोक देगा, भले ही यह नेस्टेड कॉल पर लागू हो।

उदाहरण के लिए

,

sub a 
on error goto exitCode 
    call b 
    msgbox "a complete" 
    exit sub  'you need this to prevent the error handling code from always running 
exitCode: 
    msgbox "code is exiting..." 
    'clean up code here 
end sub 

sub b 
    call c 
    msgbox "b complete" 
end sub 

sub c 
    msgbox "entering c" 
    err.raise 555, "foo", "an error occurred" 
    msgbox "exiting c" 
end sub 

'OUTPUT: 

'entering c 
'code is exiting... 

err.raise लाइन exitCode: लेबल करने के लिए नियंत्रण भले ही यह a के बाहर बुलाया गया था भेज देंगे। यदि आप इस कस्टम त्रुटि को फेंक दिया जाना चाहिए तो आप परीक्षण करने के लिए किसी भी परिस्थिति का उपयोग कर सकते हैं। err वस्तु और VBA त्रुटि पर

अधिक

https://msdn.microsoft.com/en-us/library/ka13cy19(v=vs.90).aspx

http://www.cpearson.com/excel/errorhandling.htm

1

मेरा मानना ​​है कि आप करने के लिए अपने त्रुटि हैंडलिंग कोड में फिर से त्रुटि बढ़ा है चाहते हैं handling-। इस (नहीं परीक्षण किया) की तरह कुछ का प्रयास करें:

Private Sub Test 
    On Error Goto bad 
    x = 0 
    debug.print 1/x 
    Exit Sub 

    bad: 
     'Clean up code 
     Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext 
End Sub 

जब On Error Goto उपयोग कर, आप लेबल से पहले एक Exit Sub की जरूरत है। अन्यथा कोई त्रुटि नहीं होने पर भी आपका कोड त्रुटि हैंडलर के माध्यम से गिर जाएगा।

आपकी पहली त्रुटि हैंडलिंग में वास्तविक त्रुटियां नहीं होती हैं जो कि आप परीक्षण के दौरान रनटाइम के दौरान हो सकती हैं। साथ ही, कॉलिंग फ़ंक्शन को सिग्नल करने का कोई सुविधाजनक तरीका नहीं है कि जब तक आप सभी कॉलिंग रूटीन में चेक जोड़ते हैं तो कुछ गलत हो जाता है।

ध्यान दें कि यह आम तौर पर बुरा डिजाइन माना जाता है, हालांकि केवल प्रवाह नियंत्रण के लिए एक त्रुटि को बढ़ाने के लिए:

Private Sub Test 
    If x = 0 Then 
     Err.Raise 
    End If 
End Sub 
+0

हमने अपनी वीबी 6 परियोजनाओं के लिए यही किया है। हालांकि आपको प्रत्येक फ़ंक्शन के लिए इसकी आवश्यकता नहीं हो सकती है, केवल वही चीज़ें जहां आप कोड साफ़ करना चाहते हैं। यह वास्तव में आप पर निर्भर है कि आप क्या उपयोग करना चाहते हैं। – Ceres

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