Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Daten / Array / FAQ

Oft gestellte Fragen über Arrays

Historie
04.11.2001Array als Funktions-Ergebnis
18.05.2001Erste Version

Einleitung

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:

Ist ein Array leer?

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

Wieviele Elemente enthält ein Array?

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 Function
Beispiel 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

Wie wird ein Array an eine Prozedur übergeben?

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!

Wie kann eine Funktion ein Array zurückgeben?

Abhängig von der eingesetzten VB-Version stehen dafür drei Möglichkeiten zur Verfügung:

Als "echtes" Array

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
Als Variant-Array

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
Als ByRef-Parameter

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