वीबीए में प्रभावी ढंग से काम करने के लिए, आपको लूप्स को समझना होगा।
लूप्स आपको एक कोड ब्लॉक को एक निश्चित संख्या में बार-बार दोहराने या ऑब्जेक्ट के एक सेट में प्रत्येक ऑब्जेक्ट पर एक कोड ब्लॉक को दोहराने की अनुमति देता है।
पहले हम आपको यह दिखाने के लिए कुछ उदाहरण दिखाएंगे कि लूप क्या करने में सक्षम हैं। फिर हम आपको लूप्स के बारे में सब कुछ सिखाएंगे।
वीबीए लूप त्वरित उदाहरण
प्रत्येक लूप के लिए
संग्रह में प्रत्येक ऑब्जेक्ट के माध्यम से प्रत्येक लूप लूप के लिए, जैसे कार्यपुस्तिका में प्रत्येक कार्यपत्रक या किसी श्रेणी में प्रत्येक कक्ष।
कार्यपुस्तिका में सभी कार्यपत्रकों के माध्यम से लूप
यह कोड कार्यपुस्तिका में सभी कार्यपत्रकों के माध्यम से लूप करेगा, प्रत्येक शीट को खोलेगा:
12345678 | सब लूपथ्रूशीट्स ()वर्कशीट के रूप में डिम WSवर्कशीट में प्रत्येक ws के लिएws.दृश्यमान = सत्यअगलाअंत उप |
रेंज में सभी कोशिकाओं के माध्यम से लूप
यह कोड कोशिकाओं की एक श्रृंखला के माध्यम से लूप करेगा, परीक्षण करेगा कि सेल मान नकारात्मक, सकारात्मक या शून्य है या नहीं:
1234567891011121314 | उप अगर_लूप ()रेंज के रूप में मंद सेलरेंज में प्रत्येक सेल के लिए ("A2:A6")यदि सेल.वैल्यू > 0 तोसेल। ऑफसेट (0, 1)। मान = "सकारात्मक"ElseIf Cell.Value <0 फिरसेल। ऑफसेट (0, 1)। मान = "नकारात्मक"अन्यथासेल। ऑफसेट (0, 1)। मान = "शून्य"अगर अंतअगली सेलअंत उप |
अगले लूप्स के लिए
एक अन्य प्रकार का "फॉर" लूप फॉर नेक्स्ट लूप है। फॉर नेक्स्ट लूप आपको पूर्णांकों के माध्यम से लूप करने की अनुमति देता है।
यह कोड 1 से 10 तक पूर्णांकों के माध्यम से लूप करेगा, प्रत्येक को एक संदेश बॉक्स के साथ प्रदर्शित करेगा:
123456 | उप फॉरलूप ()डिम आई अस इंटीजरमैं = 1 से 10 . के लिएसंदेशबॉक्स मैंअगला मैंअंत उप |
लूप्स करते समय करें
Do जबकि एक शर्त पूरी होने पर लूप्स लूप करेंगे। यह कोड 1 से 10 तक पूर्णांकों के माध्यम से भी लूप करेगा, प्रत्येक को एक संदेश बॉक्स के साथ प्रदर्शित करेगा।
12345678 | उप DoWhileLoop ()डिम एन अस इंटीजरएन = 1करें जबकि n <11संदेशबॉक्स संख्याएन = एन + 1कुंडलीअंत उप |
लूप्स तक करें
इसके विपरीत, जब तक कोई शर्त पूरी नहीं हो जाती, तब तक डू जब तक लूप लूप नहीं करेगा। यह कोड पिछले दो उदाहरणों की तरह ही काम करता है।
12345678 | उप DoUntilLoop ()डिम एन अस इंटीजरएन = 1n >= 10 . तक करेंसंदेशबॉक्स संख्याएन = एन + 1कुंडलीअंत उप |
हम इसके बारे में नीचे चर्चा करेंगे, लेकिन आपको डू वाइल या डू जब तक लूप बनाते समय बेहद सावधान रहने की जरूरत है ताकि आप कभी न खत्म होने वाला लूप न बनाएं।
वीबीए लूप बिल्डर
यह हमारे प्रीमियम वीबीए ऐड-इन: ऑटोमैक्रो से "लूप बिल्डर" का एक स्क्रीनशॉट है। लूप बिल्डर आपको विभिन्न वस्तुओं, या संख्याओं के माध्यम से लूप से लूप बनाने की अनुमति देता है। आप प्रत्येक ऑब्जेक्ट पर क्रिया कर सकते हैं और/या केवल उन ऑब्जेक्ट्स का चयन कर सकते हैं जो कुछ मानदंडों को पूरा करते हैं।
ऐड-इन में कई अन्य कोड निर्माता, एक व्यापक VBA कोड लाइब्रेरी और कोडिंग टूल का वर्गीकरण भी शामिल है। यह किसी भी वीबीए डेवलपर के लिए जरूरी है।
अब हम विभिन्न प्रकार के लूपों को गहराई से कवर करेंगे।
अगले लूप के लिए वीबीए
लूप सिंटैक्स के लिए
फॉर नेक्स्ट लूप आपको कोड के एक ब्लॉक को एक निर्दिष्ट संख्या में दोहराने की अनुमति देता है। वाक्यविन्यास है:
12345 | [पूर्णांक के रूप में मंद काउंटर]काउंटर के लिए = प्रारंभ से अंत तक [चरण मान][कुछ करो]अगला [काउंटर] |
जहां कोष्ठक में आइटम वैकल्पिक हैं।
- [लंबे समय तक मंद काउंटर] - काउंटर चर घोषित करता है। यदि आपके मॉड्यूल के शीर्ष पर विकल्प स्पष्ट घोषित किया गया है तो आवश्यक है।
- काउंटर - एक पूर्णांक चर गिनने के लिए प्रयोग किया जाता है
- शुरू - प्रारंभ मान (उदा. 1)
- समाप्त - अंतिम मूल्य (उदा. 10)
- [चरण मान] - आपको प्रत्येक 1 पूर्णांक के बजाय प्रत्येक n पूर्णांकों को गिनने की अनुमति देता है। आप ऋणात्मक मान के साथ उल्टा भी जा सकते हैं (उदा. चरण -1)
- [कुछ करो] - वह कोड जो दोहराएगा
- अगला [काउंटर] - फॉर नेक्स्ट लूप का क्लोजिंग स्टेटमेंट। आप काउंटर शामिल कर सकते हैं या नहीं। हालांकि, मैं काउंटर को शामिल करने की दृढ़ता से अनुशंसा करता हूं क्योंकि यह आपके कोड को पढ़ने में आसान बनाता है।
अगर यह भ्रमित करने वाला है, तो चिंता न करें। हम कुछ उदाहरणों की समीक्षा करेंगे:
10 . तक गिनें
फॉर-नेक्स्ट लूप का उपयोग करके यह कोड 10 तक गिना जाएगा:
12345678 | उप ForEach_CountTo10 ()डिम एन अस इंटीजरn = 1 से 10 . के लिएसंदेशबॉक्स संख्याअगला नंबरअंत उप |
लूप स्टेप के लिए
१० तक गिनें - केवल सम संख्याएँ
यह कोड १० तक गिनेगा, केवल सम संख्याओं की गिनती करेगा:
12345678 | उप ForEach_CountTo10_Even ()डिम एन अस इंटीजरn = 2 से 10 के लिए चरण 2संदेशबॉक्स संख्याअगला नंबरअंत उप |
ध्यान दें कि हमने "चरण 2" जोड़ा है। यह फॉर लूप को काउंटर के माध्यम से 2 से "कदम" करने के लिए कहता है। हम रिवर्स में कदम रखने के लिए नकारात्मक चरण मान का भी उपयोग कर सकते हैं:
लूप स्टेप के लिए - उलटा
10 . से उलटी गिनती
यह कोड 10 से उलटी गिनती करेगा:
123456789 | उप ForEach_Countdown_Inverse ()डिम एन अस इंटीजरn = 10 से 1 चरण -1 . के लिएसंदेशबॉक्स संख्याअगला नंबरMsgBox "लिफ्ट ऑफ"अंत उप |
यदि सेल खाली है तो पंक्तियां हटाएं
मैंने अक्सर कोशिकाओं की श्रेणियों के माध्यम से लूप के लिए एक नकारात्मक कदम फॉर-लूप का उपयोग किया है, कुछ मानदंडों को पूरा करने वाली पंक्तियों को हटा दिया है। यदि आप शीर्ष पंक्तियों से नीचे की पंक्तियों तक लूप करते हैं, जैसे ही आप पंक्तियों को हटाते हैं तो आप अपने काउंटर को गड़बड़ कर देंगे।
यह उदाहरण रिक्त कोशिकाओं वाली पंक्तियों को हटा देगा (नीचे की पंक्ति से शुरू):
12345678910 | उप ForEach_DeleteRows_BlankCells ()डिम एन अस इंटीजरn = 10 से 1 चरण -1 . के लिएअगर रेंज ("ए" और एन)। मान = "" तोरेंज ("ए" और एन)। EntireRow.Deleteअगर अंतअगला नंबरअंत उप |
लूप के लिए नेस्टेड
आप लूप के लिए एक दूसरे के अंदर लूप के लिए "घोंसला" कर सकते हैं। गुणन तालिका बनाने के लिए हम Nested For Loops का उपयोग करेंगे:
1234567891011 | उप Nested_ForEach_MultiplicationTable ()पूर्णांक के रूप में मंद पंक्ति, पूर्णांक के रूप में कॉलमपंक्ति के लिए = 1 से 9कर्नल = 1 से 9 . के लिएसेल (पंक्ति + 1, कॉलम + 1)। मान = पंक्ति * colअगला कॉलमअगली पंक्तिअंत उप |
के लिए बाहर निकलें
एग्जिट फॉर स्टेटमेंट आपको फॉर नेक्स्ट लूप से तुरंत बाहर निकलने की अनुमति देता है।
यदि आप एक निश्चित शर्त पूरी करते हैं, तो आप आमतौर पर एक इफ स्टेटमेंट के साथ एक्जिट फॉर का उपयोग करेंगे, फॉर नेक्स्ट लूप से बाहर निकलेंगे।
उदाहरण के लिए, आप किसी सेल को खोजने के लिए फॉर लूप का उपयोग कर सकते हैं। एक बार वह सेल मिल जाने के बाद, आप अपने कोड को गति देने के लिए लूप से बाहर निकल सकते हैं।
यह कोड कॉलम ए में "त्रुटि" की तलाश में पंक्तियों 1 से 1000 के माध्यम से लूप करेगा। यदि यह पाया जाता है, तो कोड सेल का चयन करेगा, आपको मिली त्रुटि के लिए सतर्क करेगा, और लूप से बाहर निकल जाएगा:
12345678910111213 | उप ExitFor_Loop ()डिम आई अस इंटीजरमैं = 1 से 1000 . के लिएयदि रेंज ("ए" और आई)। मान = "त्रुटि" तोरेंज ("ए" और आई)। चुनेंMsgBox "त्रुटि मिली"के लिए बाहर निकलेंअगर अंतअगला मैंअंत उप |
महत्वपूर्ण: नेस्टेड फॉर लूप्स के मामले में, एग्जिट फॉर केवल करंट फॉर लूप से बाहर निकलता है, सभी सक्रिय लूप्स से नहीं।
के लिए जारी रखें
VBA में "जारी रखें" कमांड नहीं है जो Visual Basic में पाया जाता है। इसके बजाय, आपको "बाहर निकलें" का उपयोग करने की आवश्यकता होगी।
प्रत्येक लूप के लिए वीबीए
प्रत्येक लूप के लिए VBA एक संग्रह में सभी वस्तुओं के माध्यम से लूप करेगा:
- एक श्रेणी में सभी सेल
- एक कार्यपुस्तिका में सभी कार्यपत्रक
- वर्कशीट में सभी आकार
- सभी खुली कार्यपुस्तिका
आप प्रत्येक लूप के लिए नेस्टेड का भी उपयोग कर सकते हैं:
- सभी कार्यपत्रकों पर एक श्रेणी में सभी कक्ष
- सभी कार्यपत्रकों पर सभी आकार
- सभी खुली कार्यपुस्तिकाओं में सभी पत्रक
- और इसी तरह…
वाक्यविन्यास है:
123 | संग्रह में प्रत्येक वस्तु के लिए[कुछ करो]अगला [वस्तु] |
कहा पे:
- वस्तु - रेंज, वर्कशीट, वर्कबुक, शेप आदि का प्रतिनिधित्व करने वाला वेरिएबल (उदा। rng)
- संग्रह - वस्तुओं का संग्रह (उदा। रेंज ("ए 1: ए 10")
- [कुछ करो] - प्रत्येक वस्तु पर चलने के लिए कोड ब्लॉक
- अगला [वस्तु] - बंद बयान। [ऑब्जेक्ट] वैकल्पिक है, हालांकि दृढ़ता से अनुशंसित है।
रेंज में प्रत्येक सेल के लिए
यह कोड प्रत्येक सेल के माध्यम से एक सीमा में लूप करेगा:
123456789 | उप ForEachCell_inRange ()रेंज के रूप में मंद सेलरेंज में प्रत्येक सेल के लिए ("a1:a10")सेल। वैल्यू = सेल। ऑफसेट (0,1)। वैल्यूअगली सेलअंत उप |
कार्यपुस्तिका में प्रत्येक कार्यपत्रक के लिए
यह कोड एक कार्यपुस्तिका में सभी कार्यपत्रकों के माध्यम से लूप करेगा, प्रत्येक शीट को असुरक्षित करेगा:
123456789 | उप ForEachSheet_inWorkbook ()वर्कशीट के रूप में डिम WSवर्कशीट में प्रत्येक ws के लिएws.असुरक्षित "पासवर्ड"अगला wsअंत उप |
प्रत्येक खुली कार्यपुस्तिका के लिए
यह कोड सभी खुली कार्यपुस्तिकाओं को सहेजेगा और बंद करेगा:
123456789 | उप ForEachWB_inWorkbooks ()कार्यपुस्तिका के रूप में मंद wbकार्यपुस्तिकाओं में प्रत्येक wb के लिएwb.सेव चेंज बंद करें:=सचअगला डब्ल्यूबीअंत उप |
वर्कशीट में प्रत्येक आकार के लिए
यह कोड सक्रिय शीट में सभी आकृतियों को हटा देगा।
123456789 | उप ForEachShape ()आकार के रूप में मंद shpActiveSheet.Shapes में प्रत्येक shp के लिएshp.हटाएंअगला shpअंत उप |
कार्यपुस्तिका में प्रत्येक कार्यपत्रक में प्रत्येक आकृति के लिए
आप प्रत्येक लूप के लिए घोंसला भी बना सकते हैं। यहां हम सक्रिय कार्यपुस्तिका में सभी कार्यपत्रकों में सभी आकृतियों के माध्यम से लूप करेंगे:
1234567891011 | उप ForEachShape_inAllWorksheets ()आकृति के रूप में मंद shp, कार्यपत्रक के रूप में wsवर्कशीट में प्रत्येक ws के लिएप्रत्येक shp के लिए ws.Shapes . मेंshp.हटाएंअगला shpअगला wsअंत उप |
प्रत्येक के लिए - IF लूप
जैसा कि हमने पहले उल्लेख किया है, आप लूप के भीतर एक इफ स्टेटमेंट का उपयोग कर सकते हैं, केवल कुछ मानदंडों को पूरा करने पर ही कार्रवाई कर सकते हैं।
यह कोड सभी रिक्त पंक्तियों को एक श्रेणी में छिपा देगा:
12345678910 | उप ForEachCell_inRange ()रेंज के रूप में मंद सेलरेंज में प्रत्येक सेल के लिए ("a1:a10")यदि सेल.वैल्यू = "" तो _सेल.एंटायररो।हिडन = ट्रूअगली सेलअंत उप |
वीबीए डू जबकि लूप
वीबीए डू व्हेन एंड डू टिल (अगला भाग देखें) बहुत समान हैं। एक शर्त पूरी होने पर (या जब तक) वे एक लूप दोहराएंगे।
एक शर्त पूरी होने पर Do जबकि लूप एक लूप को दोहराएगा।
यहाँ डू जबकि सिंटेक्स है:
123 | हालत करते समय करें[कुछ करो]कुंडली |
कहा पे:
- शर्त - परीक्षण करने की स्थिति
- [कुछ करो] - दोहराने के लिए कोड ब्लॉक
आप लूप के अंत में कंडीशन के साथ Do जबकि लूप भी सेट कर सकते हैं:
123 | करना[कुछ करो]लूप जबकि कंडीशन |
हम हर एक का प्रदर्शन करेंगे और दिखाएंगे कि वे कैसे भिन्न हैं:
जबकि ऐसा
यहां डू जबकि लूप उदाहरण है जिसे हमने पहले प्रदर्शित किया था:
12345678 | उप DoWhileLoop ()डिम एन अस इंटीजरएन = 1करें जबकि n <11संदेशबॉक्स संख्याएन = एन + 1कुंडलीअंत उप |
लूप जबकि
अब हम उसी प्रक्रिया को चलाते हैं, सिवाय इसके कि हम स्थिति को लूप के अंत तक ले जाएंगे:
12345678 | उप DoLoopWhile ()डिम एन अस इंटीजरएन = 1करनासंदेशबॉक्स संख्याएन = एन + 1लूप जबकि n <11अंत उप |
वीबीए लूप तक करें
तब तक करें जब तक कि एक निश्चित शर्त पूरी नहीं होने तक लूप्स एक लूप को दोहराएगा। सिंटैक्स अनिवार्य रूप से डू जबकि लूप के समान है:
123 | शर्त तक करें[कुछ करो]कुंडली |
और इसी तरह स्थिति लूप की शुरुआत या अंत में जा सकती है:
123 | करना[कुछ करो]स्थिति तक लूप |
तब तक करो
यह तब तक करें जब तक कि हमारे पिछले उदाहरणों की तरह, लूप की गिनती 10 तक हो जाएगी
12345678 | उप DoUntilLoop ()डिम एन अस इंटीजरएन = 1n > 10 . तक करेंसंदेशबॉक्स संख्याएन = एन + 1कुंडलीअंत उप |
तब तक घुमाओ
यह लूप जब तक लूप 10 तक गिना जाएगा:
12345678 | उप DoLoopUntil ()डिम एन अस इंटीजरएन = 1करनासंदेशबॉक्स संख्याएन = एन + 1एन> 10 . तक लूपअंत उप |
लूप से बाहर निकलें
फॉर लूप से बाहर निकलने के लिए एग्जिट फॉर का उपयोग करने के समान, आप डू लूप से तुरंत बाहर निकलने के लिए एग्जिट डू कमांड का उपयोग करते हैं
1 | Do . से बाहर निकलें |
यहाँ Exit Do का एक उदाहरण है:
123456789101112131415 | उप ExitDo_Loop ()डिम आई अस इंटीजरमैं = 1I> 1000 . तक करेंयदि रेंज ("ए" और आई)। मान = "त्रुटि" तोरेंज ("ए" और आई)। चुनेंMsgBox "त्रुटि मिली"Do . से बाहर निकलेंअगर अंतमैं = मैं + 1कुंडलीअंत उप |
लूप समाप्त करें या तोड़ें
जैसा कि हमने ऊपर उल्लेख किया है, आप लूप से बाहर निकलने के लिए Exit For या Exit Do का उपयोग कर सकते हैं:
1 | के लिए बाहर निकलें |
1 | Do . से बाहर निकलें |
हालाँकि, इन आदेशों को आपके लूप चलाने से पहले आपके कोड में जोड़ा जाना चाहिए।
यदि आप वर्तमान में चल रहे लूप को "तोड़ने" का प्रयास कर रहे हैं, तो आप दबाने का प्रयास कर सकते हैं ESC या CTRL + रोकना तोड़ना कीबोर्ड पर। हालाँकि, यह काम नहीं कर सकता है। यदि यह काम नहीं करता है, तो आपको अपने लूप के समाप्त होने की प्रतीक्षा करनी होगी या अंतहीन लूप के मामले में, उपयोग करना होगा CTRL + Alt + हटाएं एक्सेल को बंद करने के लिए मजबूर करने के लिए।
यही कारण है कि मैं डू लूप्स से बचने की कोशिश करता हूं, गलती से एक अंतहीन लूप बनाना आसान है जो आपको एक्सेल को पुनरारंभ करने के लिए मजबूर करता है, संभावित रूप से आपका काम खो देता है।
अधिक लूप उदाहरण
पंक्तियों के माध्यम से लूप
यह एक कॉलम में सभी पंक्तियों के माध्यम से लूप करेगा:
123456789 | सार्वजनिक उप लूपथ्रूरो ()रेंज के रूप में मंद सेलरेंज में प्रत्येक सेल के लिए ("ए: ए")Ff सेल.वैल्यू "" फिर MsgBox सेल.एड्रेस और":" और सेल.वैल्यूअगली सेलअंत उप |
कॉलम के माध्यम से लूप
यह एक पंक्ति में सभी स्तंभों के माध्यम से लूप करेगा:
123456789 | सार्वजनिक उप लूपथ्रू कॉलम ()रेंज के रूप में मंद सेलरेंज में प्रत्येक सेल के लिए ("1:1")यदि सेल.वैल्यू "" तो MsgBox सेल.पता और ":" और सेल.वैल्यूअगली सेलअंत उप |
एक फ़ोल्डर में फाइलों के माध्यम से लूप
यह कोड एक सूची बनाते हुए एक फ़ोल्डर में सभी फाइलों के माध्यम से लूप करेगा:
12345678910111213141516171819 | सब लूपथ्रूफाइल्स ()वस्तु के रूप में FSO का मंद होनाऑब्जेक्ट के रूप में मंद ओफ़ोल्डरऑब्जेक्ट के रूप में डिम ओफाइलडिम आई अस इंटीजरओएफएसओ सेट करें = CreateObject ("Scripting.FileSystemObject")फ़ोल्डर सेट करें = oFSO.GetFolder ("सी: \ डेमो)मैं = 2फ़ोल्डर में प्रत्येक फ़ाइल के लिए.फ़ाइलेंरेंज ("ए" और आई)। मान = oFile.Nameमैं = मैं + 1अगली फ़ाइलअंत उप |
सरणी के माध्यम से लूप
यह कोड सरणी 'arrList' के माध्यम से लूप करेगा:
123 | i = LBound(arrList) के लिए UBound(arrList) के लिएMsgBox गिरफ्तारी सूची (i)अगला मैं |
LBound फ़ंक्शन को सरणी का "निचला बाउंड" मिलता है और UBound को "ऊपरी बाउंड" मिलता है।
एक्सेस वीबीए में लूप्स
ऊपर दिए गए अधिकांश उदाहरण एक्सेस वीबीए में भी काम करेंगे। हालांकि, एक्सेस में, हम रेंज ऑब्जेक्ट के बजाय रिकॉर्डसेट ऑब्जेक्ट के माध्यम से लूप करते हैं।
123456789101112131415161718 | सब लूपथ्रू रिकॉर्ड्स ()त्रुटि पर फिर से शुरू करें अगलाडेटाबेस के रूप में मंद डीबीएसरिकॉर्डसेट के रूप में पहले डिम करेंसेट डीबीएस = करंटडीबीसेट rst = dbs.OpenRecordset("tblClients", dbOpenDynaset)rst के साथ.मूवलास्ट.मूवफर्स्टतब तक करें .EOF = TrueMsgBox (rst.Fields("ClientName")).आगे बढ़ेंकुंडलीके साथ समाप्त करनापहला.बंदपहले सेट करें = कुछ नहींडीबीएस सेट करें = कुछ भी नहींअंत उप |