खोज…


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


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow