यह ट्यूटोरियल प्रदर्शित करेगा कि VBA में किसी सरणी में किसी मान की खोज (ढूंढें) कैसे करें
सरणी में स्ट्रिंग की खोज करने के कई तरीके हैं - इस पर निर्भर करता है कि सरणी एक आयामी या बहु-आयामी है या नहीं।
एक-आयामी सरणी में खोजना
एक-आयामी सरणी में मान खोजने के लिए, आप फ़िल्टर फ़ंक्शन का उपयोग कर सकते हैं।
123 | डिम जेड वैरिएंट के रूप में'मूल सरणी फ़िल्टर करें'z = फ़िल्टर (ऐरे, स्ट्रिंग, ट्रू, vbCompareBinary) |
फ़िल्टर विकल्प का सिंटैक्स इस प्रकार है
फ़िल्टर (स्रोत सरणी, स्ट्रिंग के रूप में मिलान करें, [बूलियन के रूप में शामिल करें], [vbCompareMethod के रूप में तुलना करें])
NS स्रोत सरणी और यह स्ट्रिंग के रूप में मिलान करें आवश्यक हैं जबकि बूलियन के रूप में शामिल करें और यह vbCompareMethod के रूप में तुलना करें वैकल्पिक हैं। यदि इन्हें शामिल नहीं किया जाता है तो इन्हें सेट किया जाता है सत्य तथा vbतुलना बाइनरी क्रमश।
फ़िल्टर से मेल खाने वाले मान खोजें
1234567891011121314 | उप फाइंडबॉब ()'ऐरे बनाएं'मंद strName () प्रकार के रूप मेंstrName () = ऐरे ("बॉब स्मिथ", "जॉन डेविस", "फ्रेड जोन्स", "स्टीव जेनकिंस", "बॉब विलियम्स")'फ़िल्टर डेटा को स्टोर करने के लिए एक प्रकार घोषित करें'डिम strSubNames as वैरिएंट'मूल सरणी फ़िल्टर करें'strSubNames = फ़िल्टर (strName, "बॉब")'यदि आप LBound मान -1 से अधिक है, तो मान मिल गया हैयदि LBound(strSubNames ) > -1 तो MsgBox ("मुझे बॉब मिला")अंत उप |
दूसरी सरणी फ़िल्टर द्वारा पाए गए मानों को धारण करेगी। यदि आपके LBound और UBound मान -1 नहीं हैं, तो सरणी उस मान को खोजने में कामयाब हो गई है जिसे आप खोज रहे थे।
आप यह भी देख सकते हैं कि मूल सरणी में टेक्स्ट कितनी बार दिखाई देता है।
1234567891011121314 | उप गणना नाम ()'सरणी बनाएं'मंद strName () प्रकार के रूप मेंstrName () = ऐरे ("बॉब स्मिथ", "जॉन डेविस", "फ्रेड जोन्स", "स्टीव जेनकिंस", "बॉब विलियम्स")'फ़िल्टर डेटा को स्टोर करने के लिए एक सरणी घोषित करें'डिम strSubNames as वैरिएंट'मूल सरणी फ़िल्टर करें'strSubNames = फ़िल्टर (strName, "बॉब")'यदि आप UBound मानों से LBound घटाते हैं, और 1 जोड़ते हैं, तो हमें पाठ के प्रकट होने की संख्या प्राप्त होगीMsgbox UBound(strSubNames) - LBound(strSubNames) + 1 और "नाम मिले।"अंत उप |
वे मान खोजें जो फ़िल्टर से मेल नहीं खाते
NS [बूलियन के रूप में शामिल करें] विकल्प आपको यह पता लगाने की अनुमति देता है कि आपके सरणी में कितने मान हैं जो नहीं अपने फ़िल्टर से मिलान करें
1234567891011121314 | उप गणना अतिरिक्त नाम ()'सरणी बनाएं'मंद strName () प्रकार के रूप मेंstrName () = ऐरे ("बॉब स्मिथ", "जॉन डेविस", "फ्रेड जोन्स", "स्टीव जेनकिंस", "बॉब विलियम्स")'फ़िल्टर डेटा को स्टोर करने के लिए एक सरणी घोषित करें'डिम strSubNames as वैरिएंट'मूल सरणी फ़िल्टर करें'strSubNames = फ़िल्टर (strName, "बॉब", गलत)'यदि आप UBound मानों से LBound घटाते हैं, और 1 जोड़ते हैं, तो हमें पाठ के प्रकट होने की संख्या प्राप्त होगीMsgbox UBound(strSubNames ) - LBound(strSubNames ) + 1 और "नाम मिले।"अंत उप |
इसलिए हमने इस लाइन में संशोधन किया है:
1 | strSubNames = फ़िल्टर (strName, "बॉब") |
इस लाइन के साथ:
1 | strSubNames = फ़िल्टर (strName, "बॉब", गलत) |
कोड में इस लाइन का उपयोग करने से वे सभी नाम वापस आ जाएंगे जो "बॉब" से मेल नहीं खाते।
केस संवेदनशील फ़िल्टर
आप पाएंगे कि फ़िल्टर डिफ़ॉल्ट रूप से केस संवेदी है। यह सभी वीबीए कार्यों के लिए सच है। यदि आप ऐसे टेक्स्ट की खोज करना चाहते हैं जो केस सेंसिटिव नहीं है, तो आपको अपने कोड में थोड़ा संशोधन करना होगा।
1 | z = फ़िल्टर (strName, "बॉब", vbTextCompare) |
जोड़ा जा रहा है vbपाठ्य तुलना आपकी फ़िल्टर लाइन पर आपके कोड को "बॉब" या "बॉब" खोजने में सक्षम करेगा। यदि इसे छोड़ दिया जाता है, तो VBA डिफ़ॉल्ट रूप से उपयोग करता है वीबीबाइनरीतुलना जो केवल उस डेटा की तलाश करेगा जो एक है सटीक मिलान। उपरोक्त उदाहरण में ध्यान दें, हमने छोड़ दिया है [बूलियन के रूप में शामिल करें] तर्क तो सच माना जाता है।
विकल्प टेक्स्ट की तुलना करें
वैकल्पिक रूप से, आप टेक्स्ट जोड़ सकते हैं विकल्प टेक्स्ट की तुलना करें आपके मॉड्यूल के शीर्ष पर - यह उस विशेष मॉड्यूल केस में आपके द्वारा लिखे गए सभी कार्यों को असंवेदनशील बना देगा।
एक सरणी के माध्यम से खोजने के लिए लूप का उपयोग करना
फ़िल्टर फ़ंक्शन का उपयोग करने की तुलना में लूप का उपयोग करना थोड़ा अधिक जटिल है। हम एक फ़ंक्शन बना सकते हैं जो सरणी में सभी मानों के माध्यम से लूप करेगा।
1234567891011121314151617 | उप लूपथ्रूअरे ()'सरणी बनाएं'मंद strName () प्रकार के रूप मेंstrName () = ऐरे ("बॉब स्मिथ", "जॉन डेविस", "फ्रेड जोन्स", "स्टीव जेनकिंस", "बॉब विलियम्स")स्ट्रिंग के रूप में मंद strFindstrFind = "बॉब"डिम आई ऐज़ लॉन्ग'सरणी के माध्यम से लूप'i = LBound(strName, 1) के लिए UBound(strName, 1) के लिएअगर InStr(strName(i), strFind) > 0 तोMsgBox "बॉब मिल गया है!"के लिए बाहर निकलेंअगर अंतअगला मैंअंत उप |
"बॉब स्मिथ" या "बॉब विलियम्स" के बजाय टेक्स्ट स्ट्रिंग यानी "बॉब" का एक हिस्सा खोजने के लिए, हमें इफ स्टेटमेंट में इंस्ट्रक्शन फ़ंक्शन का उपयोग करने की आवश्यकता है। यह देखने के लिए कि क्या "बॉब" स्ट्रिंग में था, यह देखने के लिए ऐरे से लूप द्वारा लौटाए गए स्ट्रिंग में देखा गया था, और जैसा कि यह स्ट्रिंग में था, यह एक संदेश बॉक्स लौटाएगा और फिर लूप से बाहर निकल जाएगा।
एक बहु-आयामी सरणी में खोजना
हम बहु-आयामी सरणी के माध्यम से खोजने के लिए लूप का भी उपयोग करते हैं। एक बार फिर, हमें एक फ़ंक्शन बनाने की आवश्यकता है जो हमें सरणी में सभी मानों के माध्यम से लूप करने में सक्षम बनाता है, लेकिन इस बार, हमें सरणी के प्रत्येक आयाम के माध्यम से लूप करने की भी आवश्यकता है।
123456789101112131415161718192021222324252627 | फंक्शन लूपथ्रूअरे ()Dim varArray () प्रकार के रूप मेंस्ट्रिंग के रूप में मंद strFindstrFind = "डॉक्टर"'सरणी का आकार घोषित करें'रेडिम वरअरे(1, 2)'सरणी प्रारंभ करें'varArray(0, 0) = "मेल स्मिथ"varArray(0, 1) = "फ्रेड बकल"varArray(0, 2) = "जेन आयर"varArray(1, 0) = "लेखाकार"varArray(1, 1) = "सचिव"varArray(1, 2) = "डॉक्टर"'लूप के लिए चर घोषित करें'डिम आई अस लॉन्ग, जे अस लॉन्ग'पहले आयाम के लिए लूप'i = LBound(varArray, 1) के लिए UBound(varArray, 1) के लिए'दूसरे आयाम के लिए लूप'j = LBound(varArray, 2) के लिए UBound(varArray, 2) के लिए'अगर हम मान पाते हैं, तो msgbox यह कहने के लिए कि हमारे पास मान है और फ़ंक्शन से बाहर निकलेंअगर varArray(i, j) = strFind फिरMsgBox "डॉक्टर मिल गया है!"समारोह से बाहर निकलेंअगर अंतअगला जेअगला मैंअंत समारोह |