वीबीए: गति और अन्य सर्वोत्तम प्रथाओं में सुधार

यह ट्यूटोरियल चर्चा करेगा कि वीबीए मैक्रोज़ और अन्य वीबीए सर्वोत्तम प्रथाओं को कैसे तेज किया जाए।

VBA कोड को गति देने के लिए सेटिंग्स

नीचे आपको अपने वीबीए कोड को तेज करने के लिए कई युक्तियां मिलेंगी। युक्तियाँ महत्व से शिथिल रूप से व्यवस्थित हैं।

अपने VBA कोड की गति को बेहतर बनाने का सबसे आसान तरीका ScreenUpdating को अक्षम करना और स्वचालित गणनाओं को अक्षम करना है। इन सेटिंग्स को सभी बड़ी प्रक्रियाओं में अक्षम किया जाना चाहिए।

स्क्रीन अपडेट करना अक्षम करें

डिफ़ॉल्ट रूप से, एक्सेल वास्तविक समय में कार्यपुस्तिकाओं में परिवर्तन प्रदर्शित करेगा क्योंकि वीबीए कोड चलता है। यह प्रसंस्करण गति में भारी मंदी का कारण बनता है क्योंकि एक्सेल सबसे अधिक व्याख्या करता है और कोड की प्रत्येक पंक्ति के लिए परिवर्तन प्रदर्शित करता है।

स्क्रीन अपडेट करना बंद करने के लिए:

1 एप्लिकेशन.स्क्रीनअपडेटिंग = गलत

अपने मैक्रो के अंत में, आपको स्क्रीन अपडेटिंग को वापस चालू करना चाहिए:

1 एप्लिकेशन.स्क्रीनअपडेटिंग = सही

जब आपका कोड चल रहा हो, तो आपको स्क्रीन को "रीफ्रेश" करने की आवश्यकता हो सकती है। कोई "ताज़ा करें" आदेश नहीं है। इसके बजाय, आपको स्क्रीन अपडेटिंग को वापस चालू करना होगा और इसे फिर से अक्षम करना होगा।

गणना को मैनुअल पर सेट करें

जब भी कोई सेल मान बदला जाता है, एक्सेल को सभी आश्रित कोशिकाओं की पुनर्गणना करने के लिए "कैलकुलेशन ट्री" का पालन करना चाहिए। इसके अतिरिक्त, जब भी कोई सूत्र बदला जाता है, तो Excel को सभी आश्रित कक्षों की पुनर्गणना करने के अतिरिक्त "गणना वृक्ष" को अद्यतन करने की आवश्यकता होगी। आपकी कार्यपुस्तिका के आकार के आधार पर, ये पुनर्गणना आपके मैक्रोज़ को अनुचित रूप से धीमी गति से चलने का कारण बन सकते हैं।

गणना को मैनुअल पर सेट करने के लिए:

1 आवेदन.गणना = xlमैनुअल

संपूर्ण कार्यपुस्तिका की मैन्युअल रूप से पुनर्गणना करने के लिए:

1 गणना

ध्यान दें कि यदि आवश्यक हो तो बेहतर गति के लिए आप केवल एक शीट, रेंज या व्यक्तिगत सेल की गणना कर सकते हैं।

स्वचालित गणनाओं को पुनर्स्थापित करने के लिए (आपकी प्रक्रिया के अंत में):

1 आवेदन.गणना = xlस्वचालित

जरूरी! यह एक एक्सेल सेटिंग है। यदि आप गणनाओं को स्वचालित रूप से पुन: सेट नहीं करते हैं, तो आपकी कार्यपुस्तिका तब तक पुनर्गणना नहीं करेगी जब तक आप उसे नहीं बताते।

आपको उपरोक्त सेटिंग्स से सबसे बड़ा सुधार दिखाई देगा, लेकिन कई अन्य सेटिंग्स हैं जो एक अंतर ला सकती हैं:

घटनाओं को अक्षम करें

ईवेंट "ट्रिगर" हैं जो विशेष कारण बनते हैं घटना प्रक्रिया चलाने के लिए। उदाहरणों में शामिल हैं: जब कार्यपत्रक पर कोई कक्ष बदलता है, जब कार्यपत्रक सक्रिय होता है, जब कार्यपुस्तिका खोली जाती है, कार्यपुस्तिका सहेजे जाने से पहले, आदि।

किसी भी मैक्रो के चलने पर ईवेंट को अक्षम करने से गति में मामूली सुधार हो सकता है, लेकिन यदि आपकी कार्यपुस्तिका ईवेंट का उपयोग करती है तो गति सुधार बहुत अधिक हो सकता है। और कुछ मामलों में अंतहीन लूप बनाने से बचने के लिए ईवेंट को अक्षम करना आवश्यक है।

ईवेंट अक्षम करने के लिए:

1 आवेदन। सक्षम करें = गलत

ईवेंट को वापस चालू करने के लिए:

1 आवेदन। सक्षम करें = सत्य

पेजब्रेक अक्षम करें

पेजब्रेक को अक्षम करने से कुछ स्थितियों में मदद मिल सकती है:

  • आपने पहले प्रासंगिक वर्कशीट के लिए पेजसेटअप प्रॉपर्टी सेट की है तथा आपकी VBA प्रक्रिया कई पंक्तियों या स्तंभों के गुणों को संशोधित करती है
  • या आपकी वीबीए प्रक्रिया एक्सेल को पेजब्रेक्स की गणना करने के लिए मजबूर करती है (प्रिंट पूर्वावलोकन प्रदर्शित करना या पेजसेटअप के किसी भी गुण को संशोधित करना)।

पेजब्रेक्स को अक्षम करने के लिए:

1 ActiveSheet.DisplayPageBreaks = False

पेजब्रेक्स को पुन: सक्षम करने के लिए:

1 ActiveSheet.DisplayPageBreaks = True

वीबीए स्पीड में सुधार के लिए सर्वोत्तम अभ्यास

सक्रिय करने और चयन करने से बचें

जब आप मैक्रो रिकॉर्ड करते हैं, तो आपको कई सक्रिय और चयन विधियां दिखाई देंगी:

12345678 उप धीमी_उदाहरण ()शीट्स ("शीट 2")। चुनेंरेंज ("डी 9")। चुनेंActiveCell.FormulaR1C1 = "उदाहरण"रेंज ("D12")। चुनेंActiveCell.FormulaR1C1 = "डेमो"रेंज ("D13")। चुनेंअंत उप

वस्तुओं को सक्रिय करना और चुनना आमतौर पर अनावश्यक होता है, वे आपके कोड में अव्यवस्था जोड़ते हैं, और वे बहुत समय लेने वाले होते हैं। जब भी संभव हो आपको इन तरीकों से बचना चाहिए।

बेहतर उदाहरण:

1234 उप Fast_Example ()शीट्स ("शीट 2")। रेंज ("डी 9")। फॉर्मूला आर 1 सी 1 = "उदाहरण"शीट्स ("शीट 2")। रेंज ("डी 12")। फॉर्मूला आर 1 सी 1 = "डेमो"अंत उप

कॉपी और पेस्ट करने से बचें

कॉपी करने के लिए महत्वपूर्ण मेमोरी की आवश्यकता होती है। दुर्भाग्य से, आप VBA को आंतरिक मेमोरी साफ़ करने के लिए नहीं कह सकते। इसके बजाय एक्सेल (प्रतीत होता है) विशिष्ट अंतराल पर इसकी आंतरिक मेमोरी को साफ़ कर देगा। इसलिए यदि आप कई कॉपी और पेस्ट ऑपरेशन करते हैं तो आप बहुत अधिक मेमोरी को हॉग करने का जोखिम उठाते हैं, जो आपके कोड को काफी धीमा कर सकता है या एक्सेल को भी क्रैश कर सकता है।

कॉपी और पेस्ट करने के बजाय, सेल के मान गुण सेट करने पर विचार करें।

123456789 उप कॉपी पेस्ट ()'और धीमारेंज ("ए 1: ए 1000")। कॉपी रेंज ("बी 1: बी 1000")'और तेजरेंज ("बी 1: बी 1000")। वैल्यू = रेंज ("ए 1: ए 1000")। वैल्यू:अंत उप

फॉर लूप्स के बजाय प्रत्येक लूप के लिए उपयोग करें

ऑब्जेक्ट्स के माध्यम से लूप करते समय, प्रत्येक लूप के लिए फॉर लूप की तुलना में तेज़ होता है। उदाहरण:

यह लूप के लिए:

123456 उप लूप1 ()मंद मैं के रूप में रेंजमैं = 1 से 100 . के लिएसेल (i, 1)। मान = 1अगला मैंअंत उप
इससे धीमा है प्रत्येक लूप के लिए:
123456 उप लूप २ ()रेंज के रूप में मंद सेलरेंज में प्रत्येक सेल के लिए ("a1:a100")सेल.वैल्यू = 1अगली सेलअंत उप

चर घोषित करें / विकल्प का स्पष्ट उपयोग करें

VBA की आवश्यकता नहीं है कि आप अपने चर घोषित करें, जब तक कि आप अपने मॉड्यूल के शीर्ष पर विकल्प स्पष्ट नहीं जोड़ते:
1 विकल्प स्पष्ट
विकल्प स्पष्ट जोड़ना एक कोडिंग सर्वोत्तम अभ्यास है क्योंकि इससे त्रुटियों की संभावना कम हो जाती है। यह आपको अपने चर घोषित करने के लिए भी मजबूर करता है, जो आपके कोड की गति को थोड़ा बढ़ा देता है (लाभ अधिक ध्यान देने योग्य होते हैं जितना अधिक एक चर का उपयोग किया जाता है)।स्पष्ट विकल्प त्रुटियों को कैसे रोकता है?विकल्प स्पष्ट का सबसे बड़ा लाभ यह है कि यह आपको परिवर्तनीय नाम वर्तनी त्रुटियों को पकड़ने में मदद करेगा। उदाहरण के लिए, निम्नलिखित उदाहरण में हमने 'var1' नाम का एक वेरिएबल सेट किया है, लेकिन बाद में हम 'varl' नाम के वेरिएबल को रेफर करते हैं। चर 'varl' को परिभाषित नहीं किया गया है, इसलिए यह रिक्त है, जिससे अप्रत्याशित परिणाम मिलते हैं।
1234 उप विकल्प स्पष्ट ()var1 = 10संदेशबॉक्स varlअंत उप

के साथ प्रयोग करें - वक्तव्यों के साथ समाप्त करें

यदि आप एक ही ऑब्जेक्ट को कई बार संदर्भित करते हैं (उदा। रेंज, वर्कशीट, वर्कबुक), स्टेटमेंट के साथ का उपयोग करने पर विचार करें। यह संसाधित करने के लिए तेज़ है, आपके कोड को पढ़ने में आसान बना सकता है, और आपके कोड को सरल बना सकता है।कथन उदाहरण के साथ:
12345678 उप Faster_Example ()शीट्स के साथ ("शीट 2").रेंज ("डी 9")। फॉर्मूला आर 1 सी 1 = "उदाहरण".रेंज ("D12").FormulaR1C1 = "डेमो".रेंज ("डी 9")। फ़ॉन्ट। बोल्ड = ट्रू.रेंज ("D12")। Font.Bold = Trueके साथ समाप्त करनाअंत उप
से तेज है:
123456 उप धीमी_उदाहरण ()शीट्स ("शीट 2")। रेंज ("डी 9")। फॉर्मूला आर 1 सी 1 = "उदाहरण"शीट्स ("शीट 2")। रेंज ("डी 12")। फॉर्मूला आर 1 सी 1 = "डेमो"शीट्स ("शीट 2")। रेंज ("डी 9")। फ़ॉन्ट। बोल्ड = ट्रूशीट्स ("शीट 2")। रेंज ("डी 12")। फ़ॉन्ट। बोल्ड = ट्रूअंत उप

उन्नत सर्वोत्तम अभ्यास युक्तियाँ

केवल यूजर इंटरफेस को सुरक्षित रखें

अंतिम उपयोगकर्ता (या आप!) को गलती से कार्यपुस्तिका को दूषित करने से रोकने के लिए अपने कार्यपत्रकों को असुरक्षित कक्षों को संपादित करने से बचाने के लिए यह अच्छा अभ्यास है। हालाँकि, यह वर्कशीट को VBA को परिवर्तन करने की अनुमति देने से भी बचाएगा। इसलिए आपको कार्यपत्रकों को असुरक्षित और पुन: सुरक्षित करना चाहिए, जो कई शीटों पर किए जाने पर बहुत समय लेने वाला होता है।

12345 सब अनप्रोटेक्टशीट ()पत्रक ("शीट 1")। असुरक्षित "पासवर्ड"'शीट संपादित करें1'शीट्स ("शीट 1")। "पासवर्ड" को सुरक्षित रखेंअंत उप

इसके बजाय, आप UserInterfaceOnly:=True सेट करके शीट को सुरक्षित कर सकते हैं। यह वीबीए को शीट में परिवर्तन करने की अनुमति देता है, जबकि उन्हें उपयोगकर्ता से सुरक्षित रखता है।

1 शीट्स ("शीट 1")। पासवर्ड सुरक्षित रखें: = "पासवर्ड", UserInterFaceOnly: = True

जरूरी! हर बार कार्यपुस्तिका खुलने पर UserInterFaceOnly गलत पर रीसेट हो जाता है। तो इस भयानक सुविधा का उपयोग करने के लिए, आपको हर बार कार्यपुस्तिका खोले जाने पर सेटिंग सेट करने के लिए Workbook_Open या Auto_Open ईवेंट का उपयोग करना होगा।

इस कोड को इस वर्कबुक मॉड्यूल में रखें:

123456 निजी उप कार्यपुस्तिका_ओपन ()वर्कशीट के रूप में डिम WSवर्कशीट में प्रत्येक ws के लिएws.प्रोटेक्ट पासवर्ड: = "पासवर्ड", UserInterFaceOnly:=Trueअगला wsअंत उप

या यह कोड किसी भी नियमित मॉड्यूल में:

123456 निजी उप Auto_Open ()वर्कशीट के रूप में डिम WSवर्कशीट में प्रत्येक ws के लिएws.प्रोटेक्ट पासवर्ड: = "पासवर्ड", UserInterFaceOnly:=Trueअगला wsअंत उप

बड़ी रेंज संपादित करने के लिए सरणियों का प्रयोग करें

कोशिकाओं की बड़ी श्रेणियों में हेरफेर करने में बहुत समय लग सकता है (उदा. १००,०००+)। कक्षों की श्रेणियों के माध्यम से लूप करने के बजाय, प्रत्येक कक्ष में हेरफेर करके, आप कक्षों को एक सरणी में लोड कर सकते हैं, सरणी में प्रत्येक आइटम को संसाधित कर सकते हैं, और फिर सरणी को उनके मूल कक्षों में वापस आउटपुट कर सकते हैं। हेरफेर के लिए कोशिकाओं को सरणियों में लोड करना बहुत तेज हो सकता है।

1234567891011121314151617181920212223242526272829303132 उप लूपरेंज ()रेंज के रूप में मंद सेलमंद टी डबल के रूप में प्रारंभ करेंटीस्टार्ट = टाइमररेंज में प्रत्येक सेल के लिए ("A1:A100000")सेल। वैल्यू = सेल। वैल्यू * 100अगली सेलडीबग.प्रिंट (टाइमर - टीस्टार्ट) और "सेकंड"अंत उपउप लूपअरे ()संस्करण के रूप में मंद गिरफ्तारीडिम आइटम वैरिएंट के रूप मेंमंद टी डबल के रूप में प्रारंभ करेंटीस्टार्ट = टाइमरएआर = रेंज ("ए 1: ए 100000")। मान:गिरफ्तारी में प्रत्येक आइटम के लिएआइटम = आइटम * 100अगला आइटमरेंज ("A1:A100000")। मान = arrडीबग.प्रिंट (टाइमर - टीस्टार्ट) और "सेकंड"अंत उप

आप साइट के विकास में मदद मिलेगी, अपने दोस्तों के साथ साझा करने पेज

wave wave wave wave wave