VBA
Arrays kopieren, zurückgeben und übergeben
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