Suche…


Arrays kopieren

Sie können ein VBA-Array mit dem Operator = in ein Array desselben Typs kopieren. Die Arrays müssen vom gleichen Typ sein, andernfalls löst der Code einen Kompilierungsfehler "Array nicht zuordnen" aus.

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

Das Quellarray kann fest oder dynamisch sein, das Zielarray muss jedoch dynamisch sein. Wenn Sie versuchen, in ein festes Array zu kopieren, wird ein Kompilierungsfehler "Kann Array nicht zuweisen" ausgelöst. Alle bereits vorhandenen Daten im empfangenden Array gehen verloren, und ihre Grenzen und Dimensionen werden in das Quellarray geändert.

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)

Sobald die Kopie erstellt wurde, sind die beiden Arrays im Speicher getrennt, dh die beiden Variablen sind keine Verweise auf dieselben zugrunde liegenden Daten. Daher werden die an einem Array vorgenommenen Änderungen nicht im anderen angezeigt.

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

Arrays von Objekten kopieren

Bei Arrays von Objekten werden die Referenzen auf diese Objekte kopiert, nicht die Objekte selbst. Wenn eine Änderung an einem Objekt in einem Array vorgenommen wird, scheint es auch in dem anderen Array geändert zu werden - beide referenzieren auf dasselbe Objekt. Wenn Sie ein Element in einem Array auf ein anderes Objekt setzen, wird dieses Objekt jedoch nicht auf das andere Array gesetzt.

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

Varianten, die ein Array enthalten

Sie können ein Array auch in und aus einer Variantenvariablen kopieren. Beim Kopieren aus einer Variante muss ein Array desselben Typs wie das empfangende Array enthalten sein. Andernfalls wird ein Laufzeitfehler "Typkonflikt" ausgelöst.

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

Arrays aus Funktionen zurückgeben

Eine Funktion in einem normalen Modul (aber nicht einem Class-Modul) kann ein Array zurückgeben, indem Sie () hinter den Datentyp stellen.

Function arrayOfPiDigits() As Long()
    Dim outputArray(0 To 2) As Long
    
    outputArray(0) = 3
    outputArray(1) = 1
    outputArray(2) = 4

    arrayOfPiDigits = outputArray
End Function

Das Ergebnis der Funktion kann dann in einem dynamischen Array desselben Typs oder einer Variante abgelegt werden. Auf die Elemente kann auch direkt mit einem zweiten Satz von Klammern zugegriffen werden. Die Funktion wird jedoch jedes Mal aufgerufen. Daher empfiehlt es sich, die Ergebnisse in einem neuen Array zu speichern, wenn sie mehrmals verwendet werden sollen

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

Beachten Sie, dass das, was zurückgegeben wird, tatsächlich eine Kopie des Arrays innerhalb der Funktion ist, keine Referenz. Wenn die Funktion also den Inhalt eines statischen Arrays zurückgibt, können ihre Daten nicht von der aufrufenden Prozedur geändert werden.

Ausgabe eines Arrays über ein Ausgabeargument

Es ist normalerweise eine gute Kodierungspraxis, wenn die Argumente einer Prozedur eingegeben und über den Rückgabewert ausgegeben werden. Die Einschränkungen von VBA machen es jedoch manchmal erforderlich, dass eine Prozedur Daten über ein ByRef Argument ByRef .

Ausgabe in ein festes Array

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

Ausgabe eines Arrays aus einer Class-Methode

Ein Ausgabeargument kann auch zur Ausgabe eines Arrays aus einer Methode / einem Verfahren in einem Klassenmodul verwendet werden

' 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

Arrays an Vorgänge übergeben

Arrays können an verfahren übergeben werden, indem nach dem Namen der Arrayvariablen () wird.

Function countElements(ByRef arr() As Double) As Long
    countElements = UBound(arr) - LBound(arr) + 1
End Function

Arrays müssen als Referenz übergeben werden. Wenn kein Übergabemechanismus angegeben wird, z. B. myFunction(arr()) , nimmt VBA standardmäßig ByRef an. Es ist jedoch ByRef , dies explizit zu machen. Beim Versuch, ein Array über einen Wert zu übergeben, z. B. führt myFunction(ByVal arr()) zu einem Kompilierungsfehler "Array-Argument muss ByRef sein" (oder zu einem Kompilierungsfehler "Syntaxfehler", wenn die Auto Syntax Check Syntaxprüfung in den VBE-Optionen nicht geprüft wird) .

Übergeben als Verweis bedeutet, dass alle Änderungen am Array im aufrufenden Vorgang beibehalten werden.

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

Wenn Sie das ursprüngliche Array nicht ändern möchten, schreiben Sie die Funktion so, dass keine Elemente geändert werden.

Function doubleAndSum(ByRef arr() As Long)
    doubleAndSum = arr(0) * 2 + arr(1) * 2
End Function

Alternativ können Sie eine Arbeitskopie des Arrays erstellen und mit der Kopie arbeiten.

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow