Die Community zu .NET und Classic VB.
Menü

FAQ 0067: Wie ermittle ich die Grenzen eines Feldes?

 von 

Frage 

Ist ein dynamisches Datenfeld dimensioniert?

Wie ermittle ich die Grenzen eines Feldes?

Wie viele Elemente hat ein Datenfeld?

Die hier gezeigten Quelltexte stammen von pks und Helge Rex.

Dimensionierung  

Mit dem Array auf Dimensionierung überprüfen [Tipp 0571] läßt sich prüfen, ob ein Datenfeld dimensioniert wurde.

Weiterhin wurde folgender Trick entdeckt, der auf einen Bug in VB beruht:

Dim Datenfeld() As Long
Debug.Print "Ist dimensioniert: " & CStr(CBool(Not (Not (Datenfeld))))

ReDim Datenfeld(1 To 3)
Debug.Print "Ist dimensioniert: " & CStr(CBool(Not (Not (Datenfeld))))

Erase Datenfeld
Debug.Print "Ist dimensioniert: " & CStr(CBool(Not (Not (Datenfeld))))

Listing 1: Dimensionierung mittels NOT NOT prüfen

Da durch die Ausnutzung eines Bugs generell Seiteneffekte zu erwarten sind, raten wir vom Einsatz dieses Tricks jedoch ab.

Ober- und Untergrenze  

Die Grenzen eines Datenfeldes lassen sich mit LBound() und UBound() ermitteln:

Dim Datenfeld() As Long

ReDim Datenfeld(1 To 3)

Debug.Print "Untergrenze: " & CStr(LBound(Datenfeld))
Debug.Print "Obergrenze:  " & CStr(UBound(Datenfeld))

Listing 2: Grenzen eindimensionaler Felder ermitteln

Eine Besonderheit ergibt sich, wenn es sich um ein mehrdimensionales Datenfeld handelt:

Dim Datenfeld() As Long

ReDim Datenfeld(1 To 3, 4 To 6)

Debug.Print "Untergrenze 2. Dimension: " & CStr(LBound(Datenfeld, 2))
Debug.Print "Obergrenze  2. Dimension: " & CStr(UBound(Datenfeld, 2))

Listing 3: Grenzen mehrdimensionaler Felder

Wird die Nummer der Dimension weggelassen, ist die erste Dimension gemeint.

Anzahl der Elemente  

Damit ergibt sich auch, wie man die Anzahl der Elemente einer Dimension eines Datenfeldes bestimmt:

Dim Datenfeld() As Long

ReDim Datenfeld(4)

Debug.Print "Anzahl der Elemente: " & _
                        CStr(UBound(Datenfeld) - LBound(Datenfeld) + 1)

Listing 4: Anzahl der Elemente

Wer genau aufpaßt, wird feststellen, daß die Berechnung 5 statt 4 ergibt.
Das liegt ganz einfach daran, daß die Untergrenze eines Datenfeldes standardmäßig 0 ist, damit reicht das Datenfeld von Index 0 bis Index 4, und das sind eben 5 Elemente.

Anzahl der Dimensionen  

Leider hat Microsoft versäumt eine Funktion zu implementieren, mit der man die Anzahl der Dimensionen eines Datenfeldes bestimmen kann.

Erste Möglichkeit

Die folgende Funktion erledigt genau diese Aufgabe:

'   Beispiel von pks
Public Function GetArrayDimension(vArray As Variant) As Long
    Dim i As Long, j As Long
   
    On Error Goto mEnd
    
    For i = 1 To 65
        j = UBound(vArray, i)
    Next
      
mEnd:
    GetArrayDimension = i - 1

    On Error Goto 0
End Function

Listing 5: Anzahl der Dimensionen bestimmen

Zweite Möglichkeit

 Neu Der folgende Code erledigt diese Aufgabe ebenfalls (Beispiel von Philipp Stephani):

Private Declare Sub GetMem4 Lib "msvbvm60.dll" ( _
                ByRef Arr() As Any, _
                ByRef Pointer As Long)

Private Declare Sub GetMem2 Lib "msvbvm60.dll" ( _
                ByVal Address As Long, _
                ByRef Value As Integer)

Listing 6: Benötigte Deklarationen

Public Function GetArrayDimension(vArray() As Long) As Long
    Dim Pointer As Long
    Dim DimensionCount As Integer

    GetMem4 vArray, Pointer
    GetMem2 Pointer, DimensionCount
    
    GetArrayDimension = DimensionCount
End Function

Listing 7: Anzahl der Dimensionen bestimmen

Diese Möglichkeit hat jedoch einen Nachteil: Das Datenfeld muß vom Typ Long sein. Ist es jedoch vom Typ String, muß der Datentyp von vArray in der Funktion GetArrayDimension angepaßt werden. Diese Möglichkeit ist daher nicht allgemeingültig.

Ihre Meinung  

Falls Sie Fragen zu dieser FAQ haben, Ihre Erfahrung mit anderen Nutzern austauschen möchten oder auf eine Ergänzung hinweisen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.