Kontakt
DSVGO
Historie | |
04.11.2001 | Array als Funktions-Ergebnis |
18.05.2001 | Erste Version |
Ein Array bzw. Feld ist eine Ansammlung von gleichartigen Daten, welche über einen Namen und mindestens einen Index angesprochen werden können. Bezüglich ihrer Verwendung werden immer wieder die folgenden Fragen gestellt:
Mit folgender Funktion kann festgestellt werden, ob ein dynamisches Array bereits initialisiert worden ist:
Function IsEmptyArray(ByRef a As Variant) As Boolean Dim Dummy As Long If IsArray(a) Then 'Ggf. Fehler provozieren: On Error Resume Next Dummy = LBound(a) 'Ergebnis bestimmen: IsEmptyArray = (Err.Number <> 0) On Error GoTo 0 Else Err.Raise 13 'Type mismatch' End If End Function
Beispiele für den Aufruf:
Private Sub Form_Click() Dim Zahlen() As Long MsgBox IsEmptyArray(Zahlen) 'ergibt Wahr/True ReDim Zahlen(3 To 5) MsgBox IsEmptyArray(Zahlen) 'ergibt Falsch/False MsgBox IsEmptyArray(765432) 'ergibt Fehler/Error End Sub
Bei eindimensionalen Feldern kann die Anzahl der Elemente leicht via LBound und UBound bestimmt werden:
Anzahl = UBound(Feld) - LBound(Feld) + 1
Problematischer wird es, wenn das Array aus mehreren Dimensionen besteht. Dann muss nämlich vorher bestimmt werden, wieviele Dimensionen existieren (s.a. Anzahl der Dimensionen eines Arrays bestimmen). Die einzelnen Dimensions-Größen müssen miteinander multipliziert werden, um die Gesamt-Anzahl aller Elemente zu erhalten (so besteht ein 3x4 Feld aus 12 Elementen):
Function ArrayCount(ByRef a As Variant) As Long Dim Index As Long Dim Count As Long ArrayCount = 1 For Index = 1 To Dimension(a) Count = UBound(a, Index) - LBound(a, Index) + 1 ArrayCount = ArrayCount * Count Next Index End FunctionBeispiel für den Aufruf:
Private Sub Form_Click() Dim Zahlen(3 To 5, -2 To 7) As Long MsgBox ArrayCount(Zahlen) 'ergibt 30 End Sub
Das folgende Beispiel zeigt, wie ein Array an eine Funktion übergeben wird, welche die Summe aller Zahlen berechnet:
'Funktions-Deklaration: Function ArrayAdd(ByRef a() As Long) As Long Dim i As Long For i = LBound(a) To UBound(a) ArrayAdd = ArrayAdd + a(i) Next i End Function 'Test-Aufruf: Private Sub Form_Click() Dim Zahlen(3 To 5) As Long Zahlen(3) = 7 Zahlen(4) = -2 Zahlen(5) = 5 MsgBox ArrayAdd(Zahlen) 'ergibt 10 End Sub
Man beachte, dass es zwar möglich ist, den Array-Typ (hier Long) festzulegen, aber nicht die Anzahl der Dimensionen: Die Deklaration der Funktion sieht immer gleich aus, egal ob ein eindimensionales oder ein mehrdimensionales Array erwartet wird!
Abhängig von der eingesetzten VB-Version stehen dafür drei Möglichkeiten zur Verfügung:
Seit VB6 können Arrays direkt zurückgeben werden, etwa so:
Function Test1() As Integer() Dim a() As Integer 'Array anlegen und füllen: Redim a(1 To 3) a(3) = 5 'Array zurückgeben: Test1 = a End Function
Dies ist natürlich die schnellste und sauberste Lösung, da typsicher. Folgendermaßen kann diese Funktion dann genutzt werden:
Dim b() As Integer b = Test1 MsgBox b(3) 'ergibt 5
Bis VB5 muss dafür der Variant-Typ "mißbraucht" werden, etwa so:
Function Test2() As Variant Dim a() As Integer 'Array anlegen und füllen: ReDim a(1 To 3) a(3) = 5 'Array zurückgeben: Test2 = a End Function
Diese Lösung ist wegen der Nutzung des Variant-Typs langsamer und nicht typsicher. Der Aufruf dieser Funktion sieht (bis auf den eingesetzten Datentyp) genauso wie die VB6-Lösung aus:
Dim b As Variant b = Test2 MsgBox b(3) 'ergibt 5
Alternativ kann das Ergebnis-Array auch via ByRef-Parameter (s.a. "ByVal oder ByRef - Parameter richtig deklarieren") zurückgegeben werden, z.B. so:
Sub Test3(ByRef a() As Integer) 'Array anlegen und füllen: ReDim a(1 To 3) a(3) = 5 End Sub
Dies ist eine schnelle und saubere Lösung (für alle VB-Versionen), allerdings wird aus dem Funktions-Aufruf ein Prozedur-Aufruf:
Dim b() As Integer Test3 b MsgBox b(3) 'ergibt 5
© Jost Schwider, 18.05.2001-04.11.2001 - http://vb-tec.de/arrfaq.htm