TOP

VBA-पाठ 13.3. सरणियों का उपयोग करना (Arrays) (व्यायाम)

सरणियों का उपयोग करने का अभ्यास करने के लिए, हम मैक्रो का अपना स्वयं का संस्करण बनाएंगे जिसका उपयोग हमने चरण दर चरण सरणियों के गति लाभ को प्रदर्शित करने के लिए किया था...


यहां इस अभ्यास का शुरुआती बिंदु है (आप देखेंगे कि डेटासेट को 1000 पंक्तियों तक कम कर दिया गया है):

यहां आप Excel उदाहरण फ़ाइल डाउनलोड कर सकते हैं: arrays_exercise.xls

अभ्यास का उद्देश्य: प्रक्रिया को एक लूप का उपयोग करके डेटासेट में डेटा को संसाधित करना चाहिए और प्रत्येक वर्ष के लिए हां या नहीं प्रतिक्रियाओं की संख्या की गणना करनी चाहिए और प्रत्येक ग्राहक संख्या के लिए (या तो हाँ या नहीं, उपयोगकर्ता की पसंद के आधार पर) और इस मात्रा को दर्ज करना चाहिए वर्कशीट के निर्दिष्ट सेल में.

"डीएस" वर्कशीट से डेटा को एक सरणी में सहेजने के लिए निम्नलिखित मैक्रो को पूरा करें:

Sub actualize()
     Dim last_row As Integer
     
     'डेटा सेट की अंतिम पंक्ति
     '...
        
     'एक गतिशील सरणी में डेटा का एक सेट सहेजा जा रहा है
     Dim array_db()
     '...
        
End Sub

यहाँ एक उदाहरण समाधान है:

Sub actualize()
     Dim last_row As Integer
     
     'डेटाबेस की अंतिम पंक्ति
     last_row = Sheets("DS").Range("A1").End(xlDown).Row

     'एक गतिशील सरणी में डेटा का एक सेट सहेजा जा रहा है
     Dim array_db()
     ReDim array_db(last_row - 2, 2)
     
     For row_number = 2 To last_row
         array_db(row_number - 2, 0) = Sheets("DS").Range("A" & row_number)
         array_db(row_number - 2, 1) = Sheets("DS").Range("B" & row_number)
         array_db(row_number - 2, 2) = Sheets("DS").Range("C" & row_number)
     Next
End Sub

यह मूल रूप से वही दोहराता है जो हमने पिछले पाठ में किया था...

लेकिन अब हमें निम्नलिखित क्रियाएँ जोड़कर अपने मैक्रो को संशोधित करने की आवश्यकता है:

  • उपयोगकर्ता की पसंद निर्धारित करें ("हाँ" या "नहीं");
  • सरणी (रेडिम) का आकार निर्धारित करने के लिए डेटा सेट में "हां" या "नहीं" उत्तरों की संख्या की गणना करें;
  • हम डेटा सेट से केवल उन्हीं पंक्तियों को सहेजते हैं जिनमें सरणी में "हाँ" या "नहीं" उत्तर होते हैं (इसका मतलब है कि तीसरे कॉलम से डेटा को सहेजने की कोई आवश्यकता नहीं है)।
  • यहाँ एक उदाहरण समाधान है:

    Sub actualize()
         Dim last_row As Integer, search_value As String, insert_row As Integer, value_yes_no As String, rows_number As Integer
         
         'डेटाबेस की अंतिम पंक्ति
         last_row = Sheets("DS").Range("A1").End(xlDown).Row
    
         'खोज मान (YES या NO)
         If Sheets("RES").OptionButton_yes.Value = True Then
             search_value = "YES"
         Else
             search_value = "NO"
         End If
         
         'उत्तरों की संख्या YES या NO
         rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)
         
         'डेटा सेट को किसी सरणी में सहेजना
         Dim array_db()
         ReDim array_db(rows_number - 1, 1)
    
         insert_row = 0
         
         For row_number = 2 To last_row
             value_yes_no = Sheets("DS").Range("C" & row_number)
             
             If value_yes_no = search_value Then
                 array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number)
                 array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number)
                 insert_row = insert_row + 1
             End If
         Next
    End Sub
    

    उपयोगकर्ता की पसंद से खोज प्रक्रिया की शुरुआत में निम्नलिखित कोड द्वारा निर्धारित की जाती है:

     'खोज मान (YES या NO)
     If Sheets("RES").OptionButton_yes.Value = True Then
         search_value = "YES"
     Else
         search_value = "NO"
     End If
    

    हम "हाँ" या "नहीं" प्रतिक्रियाओं की संख्या निर्धारित करने के लिए काउंटआईएफ फ़ंक्शन का उपयोग करेंगे:

     'उत्तरों की संख्या YES या NO
     rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)
    

    हां या नहीं प्रतिक्रियाओं की संख्या को फिट करने के लिए सरणी का आकार बदल दिया गया है और इसे दो कॉलम में घटा दिया गया है:

    ReDim array_db(rows_number - 1, 1)
    

    यह डेटा अब ऐरे में संग्रहीत किया जाएगा जब इसका तीसरा कॉलम उपयोगकर्ता के चयन से मेल खाएगा:

     'किसी संख्या को किसी सारणी में सम्मिलित करना
     insert_row = 0
    
     'डेटा सेट प्रोसेसिंग
     For row_number = 2 To last_row
         'कॉलम C मान (YES या NO)
         value_yes_no = Sheets("DS").Range("C" & row_number)
         
         'यदि मान उपयोगकर्ता के चयन से मेल खाता है, तो स्ट्रिंग को सरणी में संग्रहीत किया जाता है
         If value_yes_no = search_value Then
             'मान को कॉलम A में सहेजा जा रहा है
             array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number)
             'मान को कॉलम बी में सहेजा जा रहा है
             array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number)
             'एक पंक्ति सहेजी गई है => सरणी में प्रविष्टि संख्या 1 से बढ़ गई है
             insert_row = insert_row + 1
         End If
     Next
    

    हमारी सारणी में केवल वही डेटा शामिल है जिसमें हम रुचि रखते हैं।

    बस इतना करना बाकी है:

  • तालिका के प्रत्येक तत्व को "आरईएस" वर्कशीट पर 2 लूपों का उपयोग करके संसाधित करें (चेकबोर्ड अभ्यास के समान विचार);
  • प्रत्येक सेल के लिए प्रत्येक ग्राहक संख्या द्वारा प्रत्येक वर्ष के लिए इस शीट पर घटनाओं की कुल संख्या डालें।
  • यहाँ एक उदाहरण समाधान है:

     'प्रतिक्रियाओं की संख्या "YES"/"NO"
     For no_years = 2011 To 2026
         For no_client = 1 To 30
             counter = 0
             
             For i = 0 To UBound(array_db)
                 If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then
                     counter = counter + 1
                 End If
             Next
             
             Cells(no_years - 2009, no_client + 1) = counter
         Next
     Next
    

    इसे विस्तार से समझाते हुए टिप्पणियों के साथ समस्या का समाधान किया गया:

     'प्रत्येक पंक्ति के लिए लूप
     For no_years = 2011 To 2026
     
         'प्रत्येक कॉलम के लिए लूप
         For no_client = 1 To 30
             'काउंटर रीसेट
             counter = 0
             
             'सरणी प्रसंस्करण
             For i = 0 To UBound(array_db)
                 'जाँच कर रहा है कि तालिका में पंक्ति वर्ष और ग्राहक संख्या से मेल खाती है
                 If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then
                     'यदि वर्ष और ग्राहक संख्या मेल खाती है, तो काउंटर 1 बढ़ जाता है
                     counter = counter + 1
                 End If
             Next
             
             'सरणी को संसाधित करने के बाद, परिणाम संबंधित सेल में दर्ज किया जाता है
             Cells(no_years - 2009, no_client + 1) = counter
         Next
     Next
    

    और अंत में, हमारे संपूर्ण मैक्रो के लिए कोड:

    Sub actualize()
         Dim last_row As Integer, search_value As String, insert_row As Integer, value_yes_no As String, rows_number As Integer, counter As Integer
         
         'सामग्री हटाना
         Range("B2:AE17").ClearContents
         
         'डेटा सेट में अंतिम पंक्ति
         last_row = Sheets("DS").Range("A1").End(xlDown).Row
    
         'खोज मान (YES या NO)
         If Sheets("RES").OptionButton_yes.Value = True Then
             search_value = "YES"
         Else
             search_value = "NO"
         End If
         
         'उत्तरों की संख्या YES या NO
         rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)
         
         'किसी सरणी में मान सहेजना
         Dim array_db()
         ReDim array_db(rows_number - 1, 1)
    
         insert_row = 0
         
         For row_number = 2 To last_row
             value_yes_no = Sheets("DS").Range("C" & row_number)
             
             If value_yes_no = search_value Then
                 array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number)
                 array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number)
                 insert_row = insert_row + 1
             End If
         Next
         
         'उत्तरों की गिनती YES या NO
         For no_years = 2011 To 2026
             For no_client = 1 To 30
                 counter = 0
                 
                 For i = 0 To UBound(array_db)
                     If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then
                         counter = counter + 1
                     End If
                 Next
                 Cells(no_years - 2009, no_client + 1) = counter
             Next
         Next
    End Sub
    

    यहां आप Excel उदाहरण फ़ाइल डाउनलोड कर सकते हैं: arrays_exercise_completed.xls