Datenfelder

Mit Hilfe von Datenfeldern können Sie auf mehrere Variablen mit dem gleichen Namen verweisen und dabei eine Nummer (den Index) verwenden, um die einzelnen Variablen voneinander zu unterscheiden. Damit können Sie in vielen Fällen kürzeren und einfacheren Code schreiben, weil Sie Schleifen erstellen können, die einen effizienten Zugriff auf die Variablen über ihren Index erlauben. Datenfelder haben sowohl eine Ober- als auch eine Untergrenze, und die Elemente des Datenfeldes werden fortlaufend innerhalb dieser Grenzen abgelegt. Da Visual Basic Speicherplatz für jeden Indexwert reserviert, sollten Sie das Datenfeld nicht größer als nötig deklarieren.

Alle Elemente in einem Datenfeld haben denselben Datentyp. Wenn dies der Datentyp Variant ist, dann können die einzelnen Elemente auch verschiedene Arten von Daten (Objekte, Zeichenfolgen, Zahlen usw.) enthalten. Sie können Datenfelder aller Grunddatentypen deklarieren.

Deklarieren von Datenfeldern fester Größe

Je nach dem gewünschten Gültigkeitsbereich für das Datenfeld gibt es drei Möglichkeiten, ein Datenfeld fester Größe zu deklarieren

·     Sie können ein öffentliches Datenfeld erstellen, indem Sie das Datenfeld mit der Public-Anweisung im Deklarationsabschnitt eines Moduls deklarieren. 

·     Sie können ein Datenfeld auf Modulebene erstellen, indem Sie das Datenfeld mit der Private-Anweisung im Deklarationsabschnitt eines Moduls deklarieren. 

·     Sie können ein lokales Datenfeld erstellen, indem Sie das Datenfeld mit der Private-Anweisung in einer Prozedur deklarieren.

Festlegen von oberen und unteren Grenzen

Bei der Deklaration eines Datenfelds müssen Sie die obere Grenze hinter dem Datenfeldnamen in Klammern angeben. Die obere Grenze kann dabei den Bereich für den Datentyp Long (-2.147.483.648 bis 2.147.483.647) nicht überschreiten. Nachfolgend finden Sie zwei Beispiele für Datenfelddeklarationen, die im Deklarations­abschnitt eines Code-Moduls erscheinen können:

Dim Counters(14) As Integer                    ' 15 Elemente.

Dim Sums(20) As Double                  ' 21 Elemente.

Sie können ein öffentliches Datenfeld erstellen, indem Sie Public anstelle von Dim verwenden:

Public Counters(14) As Integer

Public Sums(20) As Double

Die gleichen Deklarationen innerhalb einer Prozedur verwenden Dim:

Dim Counters(14) As Integer

Dim Sums(20) As Double

Die erste Deklaration erstellt ein aus 15 Elementen bestehendes Datenfeld mit den Indizes von 0 bis 14. Die zweite Deklaration erstellt ein aus 21 Elementen bestehendes Datenfeld mit den Indizes von 0 bis 20. Die untere Grenze wird standardmäßig auf 0 gesetzt. 

Sie können die untere Grenze explizit (als Datentyp Long) angeben, indem Sie das Schlüsselwort To verwenden:

Dim Counters(1 To 15) As Integer

Dim Sums(100 To 120) As String

In den obigen Deklarationen erstrecken sich die Indexnummern von Counters über den Bereich von 1 bis 15 und die Indexnummern von Sums über den Bereich von 100 bis 120.

Mehrdimensionale Datenfelder

Manchmal ist es notwendig, zusammenhängende Informationen in einem Datenfeld zu verwalten. Um z.B. jedes Pixel auf Ihrem Computer-Bildschirm zu verwalten, müssen Sie auf dessen X- und Y-Koordinaten verweisen. Dies läßt sich mit einem mehr­dimensionalen Datenfeld zum Speichern der Werte erzielen.

In Visual Basic können Sie mehrdimensionale Datenfelder deklarieren. Die folgende Anweisung deklariert beispielsweise ein zweidimensionales Datenfeld mit 10 mal 10 Elementen in einer Prozedur:

Static MatrixA(9, 9) As Double

Sie können eine oder beide Dimensionen auch mit expliziten unteren Grenzen deklarieren:

Static MatrixA(1 To 10, 1 To 10) As Double

Sie können das Datenfeld auf mehr als zwei Dimensionen erweitern. Beispiel:

Dim MultiD(3, 1 To 10, 1 To 15)

Diese Deklaration erstellt ein Datenfeld, das drei Dimensionen mit den Größen 4 mal 10 mal 15 hat. Insgesamt enthält das Datenfeld 600 Elemente (das Produkt aus den Elementen pro Dimension).

Verwenden von Schleifen zur Modifizierung von Datenfeldern

Dim I As Integer, J As Integer

 

Static MatrixA(1 To 10, 1 To 10) As Double

For I = 1 To 10

   For J = 1 To 10

      MatrixA(I, J) = I * 10 + J

   Next J

Next I

Sie können ein mehrdimensionales Datenfeld effizient verarbeiten, indem Sie verschachtelte For-Schleifen verwenden. Die nebenstehenden Anweisungen initialisieren z.B. alle Elemente in MatrixA auf einen Wert, der von der aktuellen Position im Datenfeld abhängt:

Dynamische Datenfelder

Manchmal ist nicht offensichtlich, wie groß ein Datenfeld sein muss. Sie können sich in diesem Fall die Möglichkeit offen halten, die Größe des Datenfeldes zur Laufzeit zu ändern.

Die Größe eines dynamischen Datenfeldes kann jederzeit verändert werden. Dynamische Datenfelder in Visual Basic sind sehr flexibel und praktisch und erleichtern es Ihnen, Speicherplatz effizient zu verwalten. So können Sie beispiels­weise kurzzeitig ein großes Datenfeld verwenden und dann den Speicherplatz wieder für das System freigeben, wenn Sie das Datenfeld nicht mehr benötigen.

So erstellen Sie ein dynamisches Datenfeld

1     Deklarieren Sie das Datenfeld mit einer Public-Anweisung (wenn das Datenfeld öffentlich sein soll), mit einer Dim-Anweisung auf Modulebene (wenn Sie ein Datenfeld auf Modulebene benötigen) oder mit einer Static- oder Dim-Anweisung in einer Prozedur (wenn das Datenfeld lokal verfügbar sein soll). Sie deklarieren das Datenfeld als dynamisch, indem Sie eine leere Dimensionsliste angeben.

Dim DynArray()

2     Reservieren Sie den Speicherplatz für die momentan benötigte Anzahl an Elementen mit einer ReDim-Anweisung. Beispiel:

ReDim DynArray(X + 1)

Diese Anweisung kann nur innerhalb einer Prozedur verwendet werden. Im Gegensatz zu den Anweisungen Dim und Static ist ReDim eine ausführbare Anweisung, d.h. sie bewirkt, dass eine Operation zur Laufzeit ausgeführt wird.

Für die ReDim-Anweisung kann die gleiche Syntax wie für Datenfelder fester Länge verwendet werden. Jeder Aufruf von ReDim kann die Anzahl der Elemente sowie die obere und untere Grenze einer Dimension ändern. Die Anzahl der Dimensionen im Datenfeld kann jedoch nicht verändert werden, nachdem sie festgelegt wurde.

ReDim DynArray(4 to 12)

Sie können z.B. das dynamische Datenfeld Matrix1 erstellen, indem Sie es zuerst auf Modulebene deklarieren:

Dim Matrix1() As Integer

Eine Prozedur reserviert dann den Speicherplatz für das Datenfeld:

Sub CalcValuesNow ()

   ...

   ReDim Matrix1(19, 29)

End Sub

Die hier gezeigte ReDim-Anweisung legt eine Matrix von 20 mal 30 Ganzzahlen (mit insgesamt 600 Elementen) an. Sie haben auch die Möglichkeit, die Grenzen eines dynamischen Datenfeldes mit Variablen festzulegen:

ReDim Matrix1(X, Y)

Beibehalten des Inhalts dynamischer Datenfelder

Bei jeder Ausführung einer ReDim-Anweisung gehen alle Werte verloren, die zu diesem Zeitpunkt im Datenfeld gespeichert waren. Visual Basic setzt die Werte bei Datenfeldern des Typs Variant auf Empty, bei numerischen Datenfeldern auf Null, bei Zeichenfolgenfeldern auf eine Nullzeichenfolge und bei Datenfeldern mit Objekten auf Nothing

Dies ist hilfreich, wenn Sie das Datenfeld für neue Daten vorbereiten oder auf minimale Größe verkleinern möchten. Manchmal muss die Größe eines Datenfeldes allerdings geändert werden, ohne dass die darin enthaltenen Daten verlorengehen. Sie können dazu ReDim mit dem Schlüsselwort Preserve verwenden. So können Sie z.B. ein Datenfeld um ein Element vergrößern, ohne die Werte in den bestehenden Elementen zu verlieren, indem Sie mit Hilfe der Ubound-Funktion auf die obere Grenze verweisen:

           ReDim Preserve DynArray(UBound(DynArray) + 1)

Bei einem mehrdimensionalen Datenfeld kann bei Verwendung von Preserve nur die Obergrenze der letzten Dimension verändert werden. Wenn Sie eine der anderen Dimensionen oder die Untergrenze der letzten Dimension ändern, tritt ein Laufzeitfehler auf. Folgendes ist also z.B. erlaubt:

ReDim Preserve Matrix(10, UBound(Matrix, 2) + 1)

Nicht erlaubt ist dagegen: ReDim Preserve Matrix(UBound(Matrix, 1) + 1, 10)

Syntax: ReDim Preserve Datenfeldname(Obergrenzen vorheriger Dimens.,Ubound(Datenfeldname,LetzteDimension) + 1)