TOP

VBA-पाठ 13.2. सारणियों का उपयोग करना (Arrays) (जारी)


डेटा के एक से अधिक कॉलम संग्रहीत करने के लिए, हमें सरणी के एक अलग आयाम की आवश्यकता होती है। उदाहरण:

द्वि-आयामी सरणी में डेटा सहेजना:

 'घोषणा
 Dim array_example(10, 2) '11 x 3 "परिभाषित" सरणी

 'किसी सारणी में डेटा सहेजना
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

इन मूल्यों के साथ काम करने के कुछ उदाहरण यहां दिए गए हैं:

MsgBox array_example(0, 0)  '=> रिटर्न: 03.11.2026
MsgBox array_example(0, 1)  '=> रिटर्न: 24
MsgBox array_example(9, 2)  '=> रिटर्न: NO
MsgBox array_example(10, 2) '=> रिटर्न: YES

गतिशील सरणी

आइए एक पल के लिए कल्पना करें कि हमें अपने एरे में डेटा को नियमित आधार पर अपडेट करने की आवश्यकता है, और इसलिए हम घोषणा के समय निश्चित मान निर्दिष्ट नहीं कर सकते...

अंतिम गैर-रिक्त सेल, या दूसरे शब्दों में, हमारे डेटाबेस की अंतिम पंक्ति की पंक्ति संख्या जानने के लिए, हम निम्नलिखित सूत्र का उपयोग करेंगे:

last_row = Range("A1").End(xlDown).Row

Excel घोषणा में चर स्वीकार नहीं करता है।

इसके बजाय, एक गतिशील सरणी घोषित करें (खाली कोष्ठक का उपयोग करके), फिर Redim का उपयोग करके इसका आकार परिभाषित करें:

Dim array_example()
ReDim array_example(last_row - 2, 2)

निम्नलिखित प्रक्रिया का उपयोग करके, आप अपने डेटासेट (तालिका) की सभी पंक्तियों को हमारे सरणी में संग्रहीत कर सकते हैं:

Dim array_example()
ReDim array_example(last_row - 2, 2)

उबाउंड

पिछले उदाहरण में, हमारी सरणी में अंतिम संख्या अंतिम_पंक्ति - 2 थी:

For i = 0 To last_row - 2

हमारे सरणी में अंतिम संख्या निर्धारित करने का दूसरा तरीका Uound का उपयोग करना हो सकता है:

For i = 0 To UBound(array_example)

यह फ़ंक्शन चयनित आयाम के लिए सरणी में सबसे बड़ी संख्या लौटाता है (पहला आयाम डिफ़ॉल्ट है)।

यहां कुछ उदाहरण दिए गए हैं जो इसे और अधिक स्पष्ट कर देंगे:

Sub example()
     Dim array_example(10, 2)
     
     MsgBox UBound(array_example)    '=> रिटर्न : 10
     MsgBox UBound(array_example, 1) '=> रिटर्न : 10
     MsgBox UBound(array_example, 2) '=> रिटर्न : 2
End Sub

सरणी तत्वों की श्रेणी में डेटा सहेजना

किसी लूप का उपयोग किए बिना भी किसी कार्यपत्रक पर कक्षों की श्रेणी से मानों के साथ एक सरणी को पॉप्युलेट करना संभव है:

 'घोषणा
 Dim array_example(10, 2) '11 x 3 "परिभाषित" सरणी

 'किसी सारणी में डेटा सहेजना
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

पूर्ववर्ती कोड को इसके द्वारा प्रभावी ढंग से बदला जा सकता है:

 'घोषणा
 Dim array_example()

 'किसी सारणी में डेटा सहेजना
 array_example = Range("A2:C12").Value

हालाँकि दूसरी विधि पहले की तुलना में अधिक आकर्षक लगती है, सावधान रहें कि ज्यादातर मामलों में इसे लागू करने में आपको पहले की तुलना में अधिक समय लग सकता है।

यदि आप डेटा को इस तरह से अपने एरे में संग्रहीत करते हैं, तो पहली संख्या 0 के बजाय 1 होगी, जो भ्रम पैदा कर सकती है...

बाद में कोड बढ़ाने की प्रक्रिया में, यदि आप केवल उस डेटा को संग्रहीत करने का निर्णय लेते हैं जो सरणी में कुछ खोज मानदंडों से मेल खाता है (या पूरी तरह से अलग ऑपरेशन करता है), तो आपको एक अलग लूप फ़ंक्शन का उपयोग करके कोड को पूरी तरह से फिर से लिखना होगा ...

लेकिन यह दूसरी विधि काफी उपयोगी है यदि आपको एक बड़े डेटा सेट की संपूर्ण सामग्री को सहेजने की आवश्यकता है, क्योंकि यह लूपिंग से तेज़ है (प्रत्येक 15,000 रिकॉर्ड के लिए लगभग 0.2 सेकंड की बचत)।

सारणी (Array)

लेकिन यदि आपको एक ऐसी सारणी बनाने की आवश्यकता है जिसमें "निश्चित" सामग्री हो।

एक समाधान यह हो सकता है कि मूल्यों को टेप द्वारा रिकॉर्ड किया जाए:

Dim en(5)

en(0) = "IF"
en(1) = "VLOOKUP"
en(2) = "SUM"
en(3) = "COUNT"
en(4) = "ISNUMBER"
en(5) = "MID"

सौभाग्य से, आप एक सरणी (Array) का उपयोग करके इस कोड को सरल बना सकते हैं:

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")

यहां Replace फ़ंक्शन का उपयोग करने का प्रदर्शन दिया गया है (इससे आपको निम्नलिखित उदाहरण को समझने में मदद मिलेगी):

Sub replace_example()
     Dim var_translate As String

     'इस उदाहरण के लिए टेक्स्ट रिबन
     var_translate = "Hello World !"
     
     'टेक्स्ट रिबन में "विश्व" को "आप" से बदलें
     var_translate = Replace(var_translate, "World", "you")

     'प्रतिस्थापन के बाद टेप
     MsgBox var_translate '=> "हैलो यू!" लौटाता है
End Sub

अब, यदि हम मानों की एक श्रृंखला को डेटा के दूसरे सेट से बदलना चाहते हैं, तो arrays और Array फ़ंक्शन का उपयोग करना बेहद उपयोगी होगा:

Sub translate() 'अंग्रेजी से फ़्रेंच में फ़ार्मुलों का अनुवाद करने का एक सरलीकृत उदाहरण
     Dim var_translate As String

     'इस उदाहरण के लिए टेक्स्ट रिबन
     var_translate = "Formula to translate : SUM(IF(ISNUMBER(A1:E1),A1:E1,0))"
     
     'मूल्यों के दो सेट
     en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
     fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")
     
     '"SI" को "IF", "RECHERVEV" को "VLOOKUP" आदि से बदलें।
     For i = 0 To UBound(en)
         var_translate = Replace(var_translate, en(i), fr(i))
     Next

     'प्रतिस्थापन के बाद टेप
     MsgBox var_translate '=> अनुवाद करने के लिए "Formula लौटाता है: SOMME(SI(ESTNUM(A1:E1),A1:E1,0))"
End Sub

टेक्स्ट को सरणी में कनवर्ट करें (VBA Split)

Split फ़ंक्शन हमें कैरेक्टर स्ट्रिंग को भागों में विभाजित करने और परिणामी मानों को एक सरणी में लिखने की अनुमति देता है।

रिबन को सरणी में बदलने के लिए, निम्न कार्य करें:

variable = "IF/VLOOKUP/SUM/COUNT/ISNUMBER/MID"

VBA फ़ंक्शन Split का उपयोग करें और विभाजक निर्दिष्ट करें:

en = Split(variable, "/")

"एन" सरणी निम्नलिखित मान लौटाएगी:

MsgBox en(0) '=> रिटर्न: IF
MsgBox en(1) '=> रिटर्न: VLOOKUP
MsgBox en(2) '=> रिटर्न: SUM
MsgBox en(3) '=> रिटर्न: COUNT
MsgBox en(4) '=> रिटर्न: ISNUMBER
MsgBox en(5) '=> रिटर्न: मध्य

निम्नलिखित 3 सरणियाँ भी समान मान लौटाएँगी:

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
en = Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")
en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")

निम्न उदाहरण स्ट्रिंग में तीसरा मान लौटाता है:

MsgBox Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")(2) '=> रिटर्न: SUM

Split का व्युत्क्रम VBA फ़ंक्शन Join है।

यह फ़ंक्शन किसी ऐरे के मानों को एक स्ट्रिंग में एकत्रित करता है।

MsgBox Join(Array(1, 2, 3, 4, 5), "") '=> रिटर्न: 12345