TOP

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

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


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

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

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

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

  1. Sub actualize()  
  2.      Dim last_row As Integer  
  3.        
  4.      'डेटा सेट की अंतिम पंक्ति  
  5.      '...  
  6.           
  7.      'एक गतिशील सरणी में डेटा का एक सेट सहेजा जा रहा है  
  8.      Dim array_db()  
  9.      '...  
  10.           
  11. End Sub  

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

  1. Sub actualize()  
  2.      Dim last_row As Integer  
  3.        
  4.      'डेटाबेस की अंतिम पंक्ति  
  5.      last_row = Sheets("DS").Range("A1").End(xlDown).Row  
  6.   
  7.      'एक गतिशील सरणी में डेटा का एक सेट सहेजा जा रहा है  
  8.      Dim array_db()  
  9.      ReDim array_db(last_row - 2, 2)  
  10.        
  11.      For row_number = 2 To last_row  
  12.          array_db(row_number - 2, 0) = Sheets("DS").Range("A" & row_number)  
  13.          array_db(row_number - 2, 1) = Sheets("DS").Range("B" & row_number)  
  14.          array_db(row_number - 2, 2) = Sheets("DS").Range("C" & row_number)  
  15.      Next  
  16. End Sub  

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

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

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

    1. Sub actualize()  
    2.      Dim last_row As Integer, search_value As String, insert_row As Integer, value_yes_no As String, rows_number As Integer  
    3.        
    4.      'डेटाबेस की अंतिम पंक्ति  
    5.      last_row = Sheets("DS").Range("A1").End(xlDown).Row  
    6.   
    7.      'खोज मान (YES या NO)  
    8.      If Sheets("RES").OptionButton_yes.Value = True Then  
    9.          search_value = "YES"  
    10.      Else  
    11.          search_value = "NO"  
    12.      End If  
    13.        
    14.      'उत्तरों की संख्या YES या NO  
    15.      rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)  
    16.        
    17.      'डेटा सेट को किसी सरणी में सहेजना  
    18.      Dim array_db()  
    19.      ReDim array_db(rows_number - 1, 1)  
    20.   
    21.      insert_row = 0  
    22.        
    23.      For row_number = 2 To last_row  
    24.          value_yes_no = Sheets("DS").Range("C" & row_number)  
    25.            
    26.          If value_yes_no = search_value Then  
    27.              array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number)  
    28.              array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number)  
    29.              insert_row = insert_row + 1  
    30.          End If  
    31.      Next  
    32. End Sub  

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

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

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

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

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

    1. ReDim array_db(rows_number - 1, 1)  

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

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

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

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

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

    1. 'प्रतिक्रियाओं की संख्या "YES"/"NO"  
    2. For no_years = 2011 To 2026  
    3.     For no_client = 1 To 30  
    4.         counter = 0  
    5.           
    6.         For i = 0 To UBound(array_db)  
    7.             If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then  
    8.                 counter = counter + 1  
    9.             End If  
    10.         Next  
    11.           
    12.         Cells(no_years - 2009, no_client + 1) = counter  
    13.     Next  
    14. Next  

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

    1. 'प्रत्येक पंक्ति के लिए लूप  
    2. For no_years = 2011 To 2026  
    3.   
    4.     'प्रत्येक कॉलम के लिए लूप  
    5.     For no_client = 1 To 30  
    6.         'काउंटर रीसेट  
    7.         counter = 0  
    8.           
    9.         'सरणी प्रसंस्करण  
    10.         For i = 0 To UBound(array_db)  
    11.             'जाँच कर रहा है कि तालिका में पंक्ति वर्ष और ग्राहक संख्या से मेल खाती है  
    12.             If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then  
    13.                 'यदि वर्ष और ग्राहक संख्या मेल खाती है, तो काउंटर 1 बढ़ जाता है  
    14.                 counter = counter + 1  
    15.             End If  
    16.         Next  
    17.           
    18.         'सरणी को संसाधित करने के बाद, परिणाम संबंधित सेल में दर्ज किया जाता है  
    19.         Cells(no_years - 2009, no_client + 1) = counter  
    20.     Next  
    21. Next  

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

    1. Sub actualize()  
    2.      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  
    3.        
    4.      'सामग्री हटाना  
    5.      Range("B2:AE17").ClearContents  
    6.        
    7.      'डेटा सेट में अंतिम पंक्ति  
    8.      last_row = Sheets("DS").Range("A1").End(xlDown).Row  
    9.   
    10.      'खोज मान (YES या NO)  
    11.      If Sheets("RES").OptionButton_yes.Value = True Then  
    12.          search_value = "YES"  
    13.      Else  
    14.          search_value = "NO"  
    15.      End If  
    16.        
    17.      'उत्तरों की संख्या YES या NO  
    18.      rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)  
    19.        
    20.      'किसी सरणी में मान सहेजना  
    21.      Dim array_db()  
    22.      ReDim array_db(rows_number - 1, 1)  
    23.   
    24.      insert_row = 0  
    25.        
    26.      For row_number = 2 To last_row  
    27.          value_yes_no = Sheets("DS").Range("C" & row_number)  
    28.            
    29.          If value_yes_no = search_value Then  
    30.              array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number)  
    31.              array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number)  
    32.              insert_row = insert_row + 1  
    33.          End If  
    34.      Next  
    35.        
    36.      'उत्तरों की गिनती YES या NO  
    37.      For no_years = 2011 To 2026  
    38.          For no_client = 1 To 30  
    39.              counter = 0  
    40.                
    41.              For i = 0 To UBound(array_db)  
    42.                  If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then  
    43.                      counter = counter + 1  
    44.                  End If  
    45.              Next  
    46.              Cells(no_years - 2009, no_client + 1) = counter  
    47.          Next  
    48.      Next  
    49. End Sub  

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