यह ट्यूटोरियल चर्चा करेगा कि वीबीए मैक्रोज़ और अन्य वीबीए सर्वोत्तम प्रथाओं को कैसे तेज किया जाए।
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 | विकल्प स्पष्ट |
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डीबग.प्रिंट (टाइमर - टीस्टार्ट) और "सेकंड"अंत उप |