VBA त्रुटियाँ धोखा पत्र
त्रुटियाँ
विवरणवीबीए कोडऑन एरर - स्टॉप कोड और डिस्प्ले एररत्रुटि गोटो 0 . परऑन एरर - स्किप एरर और रनिंग जारी रखेंत्रुटि पर फिर से शुरू करें अगलात्रुटि पर - कोड की एक पंक्ति पर जाएँ [लेबल]त्रुटि गोटो पर [लेबल]साफ़ करता है (रीसेट) त्रुटित्रुटि गोटो -1 . परत्रुटि संख्या दिखाएंMsgBox Err.Numberत्रुटि का विवरण दिखाएंMsgBox Err.Descriptionस्वयं की त्रुटि उत्पन्न करने का कार्यइर्र.राइजअधिक वीबीए "चीट शीट्स" और मुफ्त पीडीएफ डाउनलोड देखें
वीबीए त्रुटि प्रबंधन
वीबीए त्रुटि प्रबंधन VBA रनटाइम त्रुटियों का अनुमान लगाने, पता लगाने और हल करने की प्रक्रिया को संदर्भित करता है। VBA त्रुटि प्रबंधन प्रक्रिया कोड लिखते समय होती है, वास्तव में कोई त्रुटि होने से पहले।
VBA रनटाइम त्रुटियाँ कोड निष्पादन के दौरान होने वाली त्रुटियां हैं। रनटाइम त्रुटियों के उदाहरणों में शामिल हैं:
- एक गैर-मौजूद कार्यपुस्तिका, कार्यपत्रक, या अन्य वस्तु का संदर्भ देना
- अमान्य डेटा उदा। एक त्रुटि वाले एक्सेल सेल को संदर्भित करना
- शून्य से विभाजित करने का प्रयास
VBA ऑन एरर स्टेटमेंट
अधिकांश VBA त्रुटि प्रबंधन के साथ किया जाता है त्रुटि कथन पर. ऑन एरर स्टेटमेंट VBA को बताता है कि अगर किसी त्रुटि का सामना करना पड़ता है तो उसे क्या करना चाहिए। वहाँ तीन हैं त्रुटि विवरण पर:
- त्रुटि गोटो 0 . पर
- त्रुटि पर फिर से शुरू करें अगला
- गो टू एरर पर रेखा
त्रुटि गोटो 0 . पर
त्रुटि गोटो 0 . पर VBA की डिफ़ॉल्ट सेटिंग है। आप कोड की निम्न पंक्ति जोड़कर इस डिफ़ॉल्ट सेटिंग को पुनर्स्थापित कर सकते हैं:
1 | त्रुटि गोटो 0 . पर |
जब कोई त्रुटि होती है त्रुटि गोटो 0 . पर, VBA कोड निष्पादित करना बंद कर देगा और अपना मानक त्रुटि संदेश बॉक्स प्रदर्शित करेगा।
अक्सर आप जोड़ देंगे a त्रुटि गोटो 0 . पर जोड़ने के बाद त्रुटि पर फिर से शुरू करें अगला त्रुटि प्रबंधन (अगला भाग):
123456789 | उप ErrorGoTo0 ()त्रुटि पर फिर से शुरू करें अगलाActiveSheet.Shapes("Start_Button").Deleteत्रुटि गोटो 0 . पर'अधिक कोड चलाएँ'अंत उप |
त्रुटि पर फिर से शुरू करें अगला
त्रुटि पर फिर से शुरू करें अगला VBA को त्रुटियों वाले कोड की किसी भी पंक्ति को छोड़ने और अगली पंक्ति पर जाने के लिए कहता है।
1 | त्रुटि पर फिर से शुरू करें अगला |
ध्यान दें: त्रुटि पर फिर से शुरू करें अगला किसी त्रुटि को ठीक नहीं करता है, या अन्यथा इसे हल नहीं करता है। यह केवल वीबीए को आगे बढ़ने के लिए कहता है जैसे कि त्रुटि वाले कोड की रेखा मौजूद नहीं थी। का अनुचित उपयोग त्रुटि पर फिर से शुरू करें अगला अनपेक्षित परिणाम हो सकते हैं।
उपयोग करने का एक अच्छा समय त्रुटि पर फिर से शुरू करें अगला वस्तुओं के साथ काम करते समय होता है जो मौजूद हो भी सकता है और नहीं भी। उदाहरण के लिए, आप कुछ कोड लिखना चाहते हैं जो एक आकृति को हटा देगा, लेकिन यदि आप कोड को तब चलाते हैं जब आकृति पहले ही हटा दी जाती है, तो VBA एक त्रुटि देगा। इसके बजाय आप उपयोग कर सकते हैं त्रुटि पर फिर से शुरू करें अगला यदि मौजूद है तो आकार को हटाने के लिए वीबीए को बताने के लिए।
123 | त्रुटि पर फिर से शुरू करें अगलाActiveSheet.Shapes("Start_Button").Deleteत्रुटि गोटो 0 . पर |
नोटिस हमने जोड़ा त्रुटि गोटो 0 . पर संभावित त्रुटि वाले कोड की पंक्ति के बाद। यह त्रुटि प्रबंधन को रीसेट करता है।
अगले भाग में हम आपको दिखाएंगे कि कैसे परीक्षण करें कि क्या कोई त्रुटि हुई है त्रुटि संख्या, आपको अधिक उन्नत त्रुटि प्रबंधन विकल्प दे रहा है…
Err.Number, Err.Clear, और कैचिंग एरर्स
किसी त्रुटि वाली लाइन को केवल स्किप करने के बजाय, हम उपयोग करके त्रुटि को पकड़ सकते हैं त्रुटि पर फिर से शुरू करें अगला तथा त्रुटि संख्या.
त्रुटि संख्या पता की गई त्रुटि के प्रकार के अनुरूप एक त्रुटि संख्या देता है। अगर कोई त्रुटि नहीं है, त्रुटि संख्या = 0.
उदाहरण के लिए, यह प्रक्रिया "11" लौटाएगी क्योंकि जो त्रुटि होती है वह है रन-टाइम त्रुटि '11'.
1234567 | उप ErrorNumber_ex ()त्रुटि पर फिर से शुरू करें अगलाएक्टिवसेल.वैल्यू = 2 / 0MsgBox Err.Numberअंत उप |
Err.Number से निपटने में त्रुटि
की असली शक्ति त्रुटि संख्या यह पता लगाने की क्षमता में निहित है कि क्या कोई त्रुटि हुई है (त्रुटि संख्या ०)। नीचे दिए गए उदाहरण में, हमने एक फ़ंक्शन बनाया है जो यह परीक्षण करेगा कि क्या कोई शीट Err.Number का उपयोग करके मौजूद है।
12345678910111213141516171819 | उप टेस्टडब्ल्यूएस ()MsgBox DoWSExist ("टेस्ट")अंत उपफ़ंक्शन DoWSExist (wsName स्ट्रिंग के रूप में) बूलियन के रूप मेंवर्कशीट के रूप में डिम WSत्रुटि पर फिर से शुरू करें अगलाws सेट करें = पत्रक (wsName)'अगर त्रुटि WS मौजूद नहीं है'अगर Err.Number 0 तोDoWSExist = गलतअन्यथाक्या डब्लूएसईएक्सिस्ट = सत्यअगर अंतत्रुटि गोटो -1 . परअंत समारोह |
नोट: हमने a . जोड़ा है त्रुटि गोटो -1 . पर अंत तक जो Err.Number को 0 पर रीसेट करता है (नीचे दो खंड देखें)।
साथ में त्रुटि पर फिर से शुरू करें अगला तथा त्रुटि संख्या, आप दोहरा सकते हैं "पकड़ने की कोशिश" अन्य प्रोग्रामिंग भाषाओं की कार्यक्षमता।
गो टू एरर पर रेखा
गो टू एरर पर रेखा जब कोई त्रुटि आती है तो VBA को कोड की लेबल वाली लाइन पर "जाने" के लिए कहता है। आप गो टू स्टेटमेंट को इस तरह घोषित करते हैं (जहां इरहैंडलर जाने के लिए लाइन लेबल है):
1 | एरर गो टू एररहैंडलर |
और इस तरह एक लाइन लेबल बनाएं:
1 | त्रुटि हैंडलर: |
नोट: यह वही लेबल है जिसका उपयोग आप नियमित VBA GoTo Statement के साथ करते हैं।
नीचे हम का उपयोग करके प्रदर्शित करेंगे गो टू एरर पर रेखा एक प्रक्रिया से बाहर निकलने के लिए।
एरर एग्जिट सब पर
त्रुटि होने पर आप उप से बाहर निकलने के लिए ऑन एरर गोटो लाइन का उपयोग कर सकते हैं।
आप अपनी प्रक्रिया के अंत में एरर हैंडलर लाइन लेबल लगाकर ऐसा कर सकते हैं:
12345678 | उप ErrGoToEnd ()त्रुटि पर GoTo endProc'कुछ कोड'एंडप्रोक:अंत उप |
या Exit Sub कमांड का उपयोग करके:
123456789101112131415 | उप ErrGoToEnd ()त्रुटि पर GoTo endProc'कुछ कोड'गोटो छोड़ेंबाहर निकलेंएंडप्रोक:उप से बाहर निकलेंबाहर निकलें:'कुछ और कोडअंत उप |
Err.Clear, Error GoTo -1 पर, और Err.Number रीसेट करना
किसी त्रुटि को संभालने के बाद, आपको त्रुटि प्रबंधन के साथ भविष्य की समस्याओं को रोकने के लिए आम तौर पर त्रुटि को साफ़ करना चाहिए।
त्रुटि होने के बाद, दोनों एरर.क्लियर तथा त्रुटि गोटो -1 . पर रीसेट करने के लिए इस्तेमाल किया जा सकता है त्रुटि संख्या से 0. लेकिन एक बहुत ही महत्वपूर्ण अंतर है: एरर.क्लियर वास्तविक त्रुटि को स्वयं रीसेट नहीं करता है, यह केवल रीसेट करता है त्रुटि संख्या.
इसका क्या मतलब है? का उपयोग करते हुएएरर.क्लियर, आप त्रुटि प्रबंधन सेटिंग को बदलने में सक्षम नहीं होंगे। अंतर देखने के लिए, इस कोड का परीक्षण करें और बदलें त्रुटि गोटो -1 . पर साथ एरर.क्लियर:
123456789101112131415161718192021 | उप त्रुटि उदाहरण ()त्रुटि GoTo errHandler पर:'"एप्लिकेशन-परिभाषित" त्रुटित्रुटि (13)उप से बाहर निकलेंत्रुटि हैंडलर:' त्रुटि साफ़ करें'त्रुटि गोटो -1 . परत्रुटि GoTo errHandler2 पर:'"बेमेल टाइप करें" त्रुटित्रुटि (1034)उप से बाहर निकलेंत्रुटिहैंडलर2:डिबग.प्रिंट त्रुटि.विवरणअंत उप |
आमतौर पर, मैं हमेशा उपयोग करने की सलाह देता हूं त्रुटि गोटो -1 . पर, जब तक कि आपके पास उपयोग करने का कोई अच्छा कारण न हो एरर.क्लियर बजाय।
त्रुटि MsgBox पर VBA
आप त्रुटि पर एक संदेश बॉक्स भी प्रदर्शित करना चाह सकते हैं। जहां त्रुटि होती है, उसके आधार पर यह उदाहरण विभिन्न संदेश बॉक्स प्रदर्शित करेगा:
12345678910111213141516171819202122232425262728 | उप ErrorMessageEx ()स्ट्रिंग के रूप में मंद त्रुटि संदेशएरर गो टू एररहैंडलर'चरण 1errMsg = "कॉपी और पेस्ट चरण के दौरान एक त्रुटि हुई।"'इर्र।राइज (11)'चरण 2errMsg = "डेटा सत्यापन चरण के दौरान एक त्रुटि हुई।"'इर्र।राइज (11)'चरण 3'errMsg = "पी एंड एल-बिल्डिंग और कॉपी-ओवर चरण के दौरान एक त्रुटि हुई।"एरर राइज (11)'चरण 4'errMsg = "सेटअप पृष्ठ पर आयात लॉग करने का प्रयास करते समय एक त्रुटि हुई"'इर्र।राइज (11)गो टू एंडप्रोकत्रुटि हैंडलर:MsgBox errMsgएंडप्रोक:अंत उप |
यहां आप Err.Raise(11) को अपने वास्तविक कोड से बदल देंगे।
वीबीए इसररर
त्रुटियों को संभालने का दूसरा तरीका उनके लिए VBA IsError फ़ंक्शन के साथ परीक्षण करना है। IsError फ़ंक्शन त्रुटियों के लिए एक अभिव्यक्ति का परीक्षण करता है, यदि कोई त्रुटि होती है तो TRUE या FALSE लौटाता है।
123 | उप IsErrorEx ()MsgBox IsError (रेंज ("a7")। मान)अंत उप |
यदि त्रुटि VBA
आप एक्सेल इफ़एरर फ़ंक्शन के साथ वीबीए में त्रुटियों को भी संभाल सकते हैं। इफएरर फंक्शन को का उपयोग करके एक्सेस किया जाना चाहिए वर्कशीटफंक्शन क्लास:
1234567 | उप ifErrorEx ()डिम एन अस लॉन्गn = वर्कशीटफंक्शन। इफएरर (रेंज ("ए 10")। वैल्यू, 0)संदेशबॉक्स संख्याअंत उप |
यह रेंज A10 के मान को आउटपुट करेगा, यदि मान एक त्रुटि है, तो यह इसके बजाय 0 आउटपुट करेगा।
वीबीए त्रुटि प्रकार
रनटाइम त्रुटियाँ
जैसा की ऊपर कहा गया है:
VBA रनटाइम त्रुटियाँ कोड निष्पादन के दौरान होने वाली त्रुटियां हैं। रनटाइम त्रुटियों के उदाहरणों में शामिल हैं:
- एक गैर-मौजूद कार्यपुस्तिका, कार्यपत्रक, या अन्य वस्तु का संदर्भ देना
- अमान्य डेटा उदा। एक त्रुटि वाले एक्सेल सेल को संदर्भित करना
- शून्य से विभाजित करने का प्रयास
आप ऊपर चर्चा की गई विधियों का उपयोग करके रनटाइम त्रुटियों को "त्रुटि प्रबंधन" कर सकते हैं।
सिंटैक्स त्रुटियाँ
वीबीए सिंटेक्स त्रुटियाँ कोड लेखन में त्रुटियां हैं। सिंटैक्स त्रुटियों के उदाहरणों में शामिल हैं:
- गलत वर्तनी
- गुम या गलत विराम चिह्न
VBA संपादक लाल हाइलाइटिंग के साथ कई सिंटैक्स त्रुटियों की पहचान करता है:
वीबीए संपादक के पास "ऑटो सिंटेक्स चेक" का विकल्प भी है:
जब यह चेक किया जाता है, तो कोड की एक पंक्ति दर्ज करने के बाद VBA संपादक आपको सिंटैक्स त्रुटियों को सचेत करने वाला एक संदेश बॉक्स उत्पन्न करेगा:
मुझे व्यक्तिगत रूप से यह बेहद कष्टप्रद लगता है और इस सुविधा को अक्षम कर देता है।
संकलन त्रुटियां
किसी प्रक्रिया को चलाने का प्रयास करने से पहले, VBA प्रक्रिया को "संकलित" करेगा। संकलन प्रोग्राम को स्रोत कोड (जिसे आप देख सकते हैं) से निष्पादन योग्य रूप (आप नहीं देख सकते) में बदल देते हैं।
VBA संकलन त्रुटियाँ वे त्रुटियां हैं जो कोड को संकलित करने से रोकती हैं।
संकलन त्रुटि का एक अच्छा उदाहरण एक अनुपलब्ध चर घोषणा है:
अन्य उदाहरणों में शामिल हैं:
- के लिये के बग़ैर अगला
- चुनते हैं के बग़ैर अंत चयन
- अगर के बग़ैर अगर अंत
- कॉलिंग a प्रक्रिया जो मौजूद नहीं है
सिंटैक्स त्रुटियाँ (पिछला अनुभाग) संकलन त्रुटियों का एक सबसेट हैं।
डीबग> संकलित करें
जब आप किसी प्रक्रिया को चलाने का प्रयास करेंगे तो संकलन त्रुटियाँ दिखाई देंगी। लेकिन आदर्श रूप से, आप प्रक्रिया को चलाने का प्रयास करने से पहले संकलन त्रुटियों की पहचान करेंगे।
आप प्रोजेक्ट को समय से पहले संकलित करके ऐसा कर सकते हैं। ऐसा करने के लिए, पर जाएँ डीबग> VBA प्रोजेक्ट संकलित करें.
संकलक पहली त्रुटि पर "जाएगा"। एक बार जब आप उस त्रुटि को ठीक कर लेते हैं, तो प्रोजेक्ट को फिर से संकलित करें। तब तक दोहराएं जब तक कि सभी त्रुटियां ठीक न हो जाएं।
आप बता सकते हैं कि सभी त्रुटियाँ ठीक हो गई हैं क्योंकि VBA प्रोजेक्ट संकलित करें धूसर हो जाएगा:
अतिप्रवाह त्रुटि
NS वीबीए ओवरफ्लो त्रुटि तब होता है जब आप किसी मान को बहुत बड़े वेरिएबल में डालने का प्रयास करते हैं। उदाहरण के लिए, पूर्णांक चर केवल -32,768 से 32,768 के बीच के मान हो सकते हैं। यदि आप एक बड़ा मान दर्ज करते हैं, तो आपको एक अतिप्रवाह त्रुटि प्राप्त होगी:
इसके बजाय, आपको इसका उपयोग करना चाहिए लंबी चर बड़ी संख्या में स्टोर करने के लिए।
अन्य वीबीए त्रुटि शर्तें
वीबीए कैच एरर
अन्य प्रोग्रामिंग भाषाओं के विपरीत, वीबीए में नहीं है कैच स्टेटमेंट. हालाँकि, आप कैच स्टेटमेंट का उपयोग करके दोहरा सकते हैं त्रुटि पर फिर से शुरू करें अगला तथा अगर Err.Number 0 तो. यह एरर नंबर के साथ एरर हैंडलिंग में ऊपर कवर किया गया है।
VBA त्रुटि पर ध्यान न दें
वीबीए में त्रुटियों को अनदेखा करने के लिए, बस उपयोग करें त्रुटि पर फिर से शुरू करें अगला बयान:
1 | त्रुटि पर फिर से शुरू करें अगला |
हालाँकि, जैसा कि ऊपर उल्लेख किया गया है, आपको इस कथन का उपयोग करने में सावधानी बरतनी चाहिए क्योंकि यह किसी त्रुटि को ठीक नहीं करता है, यह केवल त्रुटि वाले कोड की रेखा को अनदेखा करता है।
VBA थ्रो एरर / Err.Raise
वीबीए में एक त्रुटि के माध्यम से, आप का उपयोग करते हैं इर्र.राइज तरीका।
कोड की यह पंक्ति रन-टाइम त्रुटि '13' उठाएगी: बेमेल टाइप करें:
1 | इरराइज (13) |
VBA त्रुटि ट्रैपिंग
VBA त्रुटि ट्रैपिंग वीबीए त्रुटि प्रबंधन के लिए सिर्फ एक और शब्द है।
वीबीए त्रुटि संदेश
ए वीबीए त्रुटि संदेश इस तरह दिखता है:
जब आप 'डीबग' पर क्लिक करते हैं, तो आपको कोड की वह पंक्ति दिखाई देगी जो त्रुटि दे रही है:
लूप में वीबीए त्रुटि प्रबंधन
लूप के अंदर एरर हैंडल करने का सबसे अच्छा तरीका है त्रुटि पर फिर से शुरू करें अगला साथ में त्रुटि संख्या यह पता लगाने के लिए कि क्या कोई त्रुटि हुई है (उपयोग करना याद रखें एरर.क्लियर प्रत्येक घटना के बाद त्रुटि को दूर करने के लिए)।
नीचे दिया गया उदाहरण दो नंबरों (कॉलम ए द्वारा कॉलम बी) को विभाजित करेगा और परिणाम को कॉलम सी में आउटपुट करेगा। यदि कोई त्रुटि है, तो परिणाम 0 होगा।
12345678910111213141516 | उप परीक्षण ()रेंज के रूप में मंद सेलत्रुटि पर फिर से शुरू करें अगलारेंज में प्रत्येक सेल के लिए ("a1:a10")'सेल वैल्यू सेट करें'सेल। ऑफसेट (0, 2)। वैल्यू = सेल। वैल्यू / सेल। ऑफसेट (0, 1)। वैल्यू'यदि Cell.Value त्रुटि है तो 0 पर डिफ़ॉल्ट हैअगर Err.Number 0 तोसेल। ऑफसेट (0, 2)। मान = 0एरर.क्लियरअगर अंतअगलाअंत उप |
एक्सेस में वीबीए त्रुटि प्रबंधन
उपरोक्त सभी उदाहरण एक्सेस वीबीए में ठीक उसी तरह काम करते हैं जैसे एक्सेल वीबीए में।
123456789101112131415161718 | समारोह DelRecord (फॉर्म के रूप में frm)'इस फ़ंक्शन का उपयोग किसी तालिका में किसी प्रपत्र से रिकॉर्ड को हटाने के लिए किया जाता है'GoTo समाप्त होने में त्रुटि होने परfrm . के साथअगर .NewRecord तोपूर्ववत करेंसमारोह से बाहर निकलेंअगर अंतके साथ समाप्त करनाfrm.RecordsetClone . के साथबुकमार्क = frm.बुकमार्क.हटाएंfrm.requeryके साथ समाप्त करनासमारोह से बाहर निकलेंसमापन:समाप्तअंत समारोह |