VBA
नकल, वापसी और पासिंग ऐरे
खोज…
Arrays कॉपी करना
आप =
ऑपरेटर का उपयोग करके VBA सरणी को उसी प्रकार के एक सरणी में कॉपी कर सकते हैं। सरणियाँ एक ही प्रकार की होनी चाहिए अन्यथा कोड "त्रुटि को असाइन नहीं कर सकता" संकलन त्रुटि को फेंक देगा।
Dim source(0 to 2) As Long
Dim destinationLong() As Long
Dim destinationDouble() As Double
destinationLong = source ' copies contents of source into destinationLong
destinationDouble = source ' does not compile
स्रोत सरणी निश्चित या गतिशील हो सकती है, लेकिन गंतव्य सरणी गतिशील होनी चाहिए। एक निश्चित सरणी में कॉपी करने का प्रयास संकलन त्रुटि को "असाइन नहीं कर सकता है।" प्राप्त सरणी में कोई भी preexisting डेटा खो जाता है और इसकी सीमा और मंदक को स्रोत सरणी के समान बदल दिया जाता है।
Dim source() As Long
ReDim source(0 To 2)
Dim fixed(0 To 2) As Long
Dim dynamic() As Long
fixed = source ' does not compile
dynamic = source ' does compile
Dim dynamic2() As Long
ReDim dynamic2(0 to 6, 3 to 99)
dynamic2 = source ' dynamic2 now has dimension (0 to 2)
एक बार प्रतिलिपि बनाने के बाद दो सरणियाँ स्मृति में अलग हो जाती हैं, अर्थात दो चर एक ही अंतर्निहित डेटा के संदर्भ नहीं होते हैं, इसलिए एक सरणी में किए गए परिवर्तन दूसरे में दिखाई नहीं देते हैं।
Dim source(0 To 2) As Long
Dim destination() As Long
source(0) = 3
source(1) = 1
source(2) = 4
destination = source
destination(0) = 2
Debug.Print source(0); source(1); source(2) ' outputs: 3 1 4
Debug.Print destination(0); destination(1); destination(2) ' outputs: 2 1 4
ऑब्जेक्ट्स की प्रतिलिपि बनाना
वस्तुओं के सरणियों के साथ उन वस्तुओं के संदर्भों को कॉपी किया जाता है, न कि वस्तुओं को स्वयं। यदि एक सरणी में किसी ऑब्जेक्ट में परिवर्तन किया जाता है, तो यह दूसरे सरणी में भी बदला हुआ दिखाई देगा - वे दोनों एक ही ऑब्जेक्ट को संदर्भित कर रहे हैं। हालाँकि, एक एरे में एक अलग ऑब्जेक्ट के लिए एक एलीमेंट सेट करने से वह दूसरी ऐरे में सेट नहीं होगा।
Dim source(0 To 2) As Range
Dim destination() As Range
Set source(0) = Range("A1"): source(0).Value = 3
Set source(1) = Range("A2"): source(1).Value = 1
Set source(2) = Range("A3"): source(2).Value = 4
destination = source
Set destination(0) = Range("A4") 'reference changed in destination but not source
destination(0).Value = 2 'affects an object only in destination
destination(1).Value = 5 'affects an object in both source and destination
Debug.Print source(0); source(1); source(2) ' outputs 3 5 4
Debug.Print destination(0); destination(1); destination(2) ' outputs 2 5 4
वेरिएंट युक्त एक वेरिएंट
आप किसी वेरिएबल वैरिएबल में और ऐरे से भी कॉपी कर सकते हैं। एक प्रकार से कॉपी करते समय, इसमें उसी प्रकार का एक सरणी होना चाहिए जो प्राप्त करने वाले सरणी के रूप में है अन्यथा यह "टाइप बेमेल" रनटाइम त्रुटि को फेंक देगा।
Dim var As Variant
Dim source(0 To 2) As Range
Dim destination() As Range
var = source
destination = var
var = 5
destination = var ' throws runtime error
फंक्शंस से वापस आ रहा है
एक सामान्य मॉड्यूल में फ़ंक्शन (लेकिन क्लास मॉड्यूल नहीं) डेटा प्रकार के बाद ()
डालकर एक सरणी लौटा सकता है।
Function arrayOfPiDigits() As Long()
Dim outputArray(0 To 2) As Long
outputArray(0) = 3
outputArray(1) = 1
outputArray(2) = 4
arrayOfPiDigits = outputArray
End Function
फ़ंक्शन के परिणाम को फिर उसी प्रकार या संस्करण के एक गतिशील सरणी में रखा जा सकता है। तत्वों को ब्रैकेट के दूसरे सेट का उपयोग करके सीधे एक्सेस किया जा सकता है, हालांकि यह हर बार फ़ंक्शन को कॉल करेगा, इसलिए परिणामों को एक नए सरणी में संग्रहीत करने के लिए सबसे अच्छा है यदि आप उन्हें एक से अधिक बार उपयोग करने की योजना बनाते हैं।
Sub arrayExample()
Dim destination() As Long
Dim var As Variant
destination = arrayOfPiDigits()
var = arrayOfPiDigits
Debug.Print destination(0) ' outputs 3
Debug.Print var(1) ' outputs 1
Debug.Print arrayOfPiDigits()(2) ' outputs 4
End Sub
ध्यान दें कि जो लौटाया गया है वह वास्तव में फ़ंक्शन के अंदर सरणी की एक प्रति है, संदर्भ नहीं। इसलिए यदि फ़ंक्शन स्टैटिक ऐरे की सामग्री को लौटाता है तो उसका डेटा कॉलिंग प्रक्रिया द्वारा नहीं बदला जा सकता है।
आउटपुट तर्क के माध्यम से एक ऐरे को आउटपुट करना
यह एक प्रक्रिया के तर्कों के लिए इनपुट और रिटर्न वैल्यू के माध्यम से आउटपुट के लिए सामान्य रूप से अच्छा कोडिंग अभ्यास है। हालांकि, वीबीए की सीमाएं कभी-कभी ByRef
तर्क के माध्यम से डेटा को आउटपुट करने की प्रक्रिया के लिए आवश्यक बनाती हैं।
एक निश्चित सरणी में आउटपुट
Sub threePiDigits(ByRef destination() As Long)
destination(0) = 3
destination(1) = 1
destination(2) = 4
End Sub
Sub printPiDigits()
Dim digits(0 To 2) As Long
threePiDigits digits
Debug.Print digits(0); digits(1); digits(2) ' outputs 3 1 4
End Sub
एक वर्ग विधि से एक सरणी का उत्पादन
एक आउटपुट तर्क का उपयोग किसी वर्ग मॉड्यूल में एक विधि / कार्यवाही से एक सरणी को आउटपुट करने के लिए भी किया जा सकता है
' Class Module 'MathConstants'
Sub threePiDigits(ByRef destination() As Long)
ReDim destination(0 To 2)
destination(0) = 3
destination(1) = 1
destination(2) = 4
End Sub
' Standard Code Module
Sub printPiDigits()
Dim digits() As Long
Dim mathConsts As New MathConstants
mathConsts.threePiDigits digits
Debug.Print digits(0); digits(1); digits(2) ' outputs 3 1 4
End Sub
आगे बढ़ने के लिए आगमन
सरणी चर के नाम के बाद ()
डालकर कार्यवाहियों को आगे बढ़ाया जा सकता है।
Function countElements(ByRef arr() As Double) As Long
countElements = UBound(arr) - LBound(arr) + 1
End Function
एरे को संदर्भ द्वारा पारित किया जाना चाहिए। यदि कोई पासिंग तंत्र निर्दिष्ट नहीं है, उदाहरण के लिए myFunction(arr())
, तो VBA डिफ़ॉल्ट रूप से ByRef
ग्रहण करेगा, हालांकि यह स्पष्ट करने के लिए अच्छा कोडिंग अभ्यास है। किसी सरणी को मान द्वारा पास करने की कोशिश करना, उदाहरण के लिए myFunction(ByVal arr())
परिणामस्वरूप "Array तर्क होना चाहिए" संकलन त्रुटि (या "Syntax त्रुटि" संकलन त्रुटि यदि VBE विकल्पों में Auto Syntax Check
नहीं की गई है) ।
संदर्भ से गुजरने का मतलब है कि सरणी में कोई भी परिवर्तन कॉलिंग कार्यवाही में संरक्षित किया जाएगा।
Sub testArrayPassing()
Dim source(0 To 1) As Long
source(0) = 3
source(1) = 1
Debug.Print doubleAndSum(source) ' outputs 8
Debug.Print source(0); source(1) ' outputs 6 2
End Sub
Function doubleAndSum(ByRef arr() As Long)
arr(0) = arr(0) * 2
arr(1) = arr(1) * 2
doubleAndSum = arr(0) + arr(1)
End Function
यदि आप मूल सरणी को बदलने से बचना चाहते हैं, तो फ़ंक्शन लिखने के लिए सावधान रहें ताकि यह किसी भी तत्व को न बदले।
Function doubleAndSum(ByRef arr() As Long)
doubleAndSum = arr(0) * 2 + arr(1) * 2
End Function
वैकल्पिक रूप से सरणी की एक कार्य प्रतिलिपि बनाएँ और प्रतिलिपि के साथ काम करें।
Function doubleAndSum(ByRef arr() As Long)
Dim copyOfArr() As Long
copyOfArr = arr
copyOfArr(0) = copyOfArr(0) * 2
copyOfArr(1) = copyOfArr(1) * 2
doubleAndSum = copyOfArr(0) + copyOfArr(1)
End Function