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
'डेटा सेट की अंतिम पंक्ति
'...
'एक गतिशील सरणी में डेटा का एक सेट सहेजा जा रहा है
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
'डेटाबेस की अंतिम पंक्ति
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
-
-
- If Sheets("RES").OptionButton_yes.Value = True Then
- search_value = "YES"
- Else
- search_value = "NO"
- End If
-
-
- 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
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
उपयोगकर्ता की पसंद से खोज प्रक्रिया की शुरुआत में निम्नलिखित कोड द्वारा निर्धारित की जाती है:
-
- If Sheets("RES").OptionButton_yes.Value = True Then
- search_value = "YES"
- Else
- search_value = "NO"
- End If
'खोज मान (YES या NO)
If Sheets("RES").OptionButton_yes.Value = True Then
search_value = "YES"
Else
search_value = "NO"
End If
हम "हाँ" या "नहीं" प्रतिक्रियाओं की संख्या निर्धारित करने के लिए काउंटआईएफ फ़ंक्शन का उपयोग करेंगे:
-
- rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)
'उत्तरों की संख्या YES या NO
rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)
हां या नहीं प्रतिक्रियाओं की संख्या को फिट करने के लिए सरणी का आकार बदल दिया गया है और इसे दो कॉलम में घटा दिया गया है:
- ReDim array_db(rows_number - 1, 1)
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
'किसी संख्या को किसी सारणी में सम्मिलित करना
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 लूपों का उपयोग करके संसाधित करें (चेकबोर्ड अभ्यास के समान विचार);
प्रत्येक सेल के लिए प्रत्येक ग्राहक संख्या द्वारा प्रत्येक वर्ष के लिए इस शीट पर घटनाओं की कुल संख्या डालें।
यहाँ एक उदाहरण समाधान है:
-
- 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
'प्रतिक्रियाओं की संख्या "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
-
- 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
-
-
- If Sheets("RES").OptionButton_yes.Value = True Then
- search_value = "YES"
- Else
- search_value = "NO"
- End If
-
-
- 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
-
-
- 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
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