Visual Basic 6: Arrays

Aus Wikibooks

Oftmals ergeben sich gravierende Probleme bei der Benutzung von Variablen: Entweder man muss sehr viele anlegen, oder - was weitaus schlimmer ist - man weiß nicht, wie viele man benötigt. Das erste Problem lässt sich zwar noch lösen, allerdings nur sehr unelegant (wer möchte schon 300 Variablen anlegen). Das zweite ist gänzlich unlösbar. Hier bieten Arrays eine gute Aushilfe. Ein Array ist im Prinzip eine Variable mit mehreren Einträgen. Diese Einträge werden durch Ziffern - ihren Index - unterschieden.

Deklaration[Bearbeiten]

Visual Basic 6 bietet zwei Arten von Arrays: ein statisches Datenfeld (festgelegte Größe) oder ein dynamisches Datenfeld (Größe änderbar). Auf beide kann mit denselben Methoden zugegriffen werden.

Deklaration als statisches Datenfeld

Dim strMitglieder(5) As String '5 gibt den größten Index an, das Array ist nun allerdings 6 Elemente groß,
                               'da VB ohne zusätzliche Angabe einer Untergrenze immer bei 0 anfängt zu zählen

Hinweis: Die Basis (der Index des ersten Elements) lässt sich global ändern, siehe Abschnitt Option Base.

Deklaration als dynamisches Datenfeld

Dim strMitglieder() As String 'Hat noch keine Festlegung auf Anzahl der Elemente.

Man kann mit der Funktion Array auch ein Datenfeld initialisieren, dafür muss es allerdings als Variant (= beliebiger Datentyp, der in aller Regel vermieden werden sollte) definiert werden (wobei VB dem ersten Element den Index 0 gibt)

Dim varMitglieder As Variant
varMitglieder = Array("Benedikt","Caesar","Dominik","Emil")

Die Werte des Arrays werden mit dem entsprechenden Index ausgelesen:

varMitglieder(1) 'gibt den Wert mit dem Index 1 zurück; beim vorhergehenden
                 'Beispiel wäre das "Caesar"

Man kann einem Array allerdings nicht nur eine, sondern gleich mehrere Ebenen - Dimensionen genannt - geben. Hierzu muss die neue Dimension nur durch ein Komma getrennt hinter die alte gestellt werden:

Dim strMitglieder(5, 6) As String

Will man nun auf einen Wert zugreifen, muss man für beide Dimensionen einen Index angeben:

strMitglieder(1, 2) = "Lisa"

Das Array kann jetzt also nicht mehr nur 6 (0-5), sondern 6 (0-5) mal 7 (0-6), also 42 Elemente aufnehmen.

Maximal kann ein Array allerdings nur 60 Dimensionen enthalten.

Man kann einer Dimension nicht nur eine obere sondern auch eine untere Grenze geben. Dies geschieht mittels des Schlüsselwortes To.

Dim strMitglieder(1 To 5, 3 To 6)

Jetzt ist der kleinste Index der ersten Dimension 1 und der kleinste der zweiten Dimension 3. Alle Werte darunter produzieren einen Fehler beim Aufruf.

Alle Grenzen können auch mit Variablen festgelegt werden:

Dim lngUnten as Long
Dim lngOben as Long
lngUnten = 1
lngOben = 3
Dim strMitglieder(lngUnten To lngOben) As String

erzeugt das selbe Datenfeld wie

Dim strMitglieder(1 To 3) As String

Option Base[Bearbeiten]

Sollen alle Arrays anstatt mit 0 beim Index 1 anfangen, bietet sich Option Base 1 an:

Option Base 1
Dim strMitglieder(2) ' Erzeugt ein Array mit 2 Einträgen: 1 und 2

Somit würde das selbe Feld erzeugt wie bei folgender Zeile ohne Verwendung von Option Base 1:

Dim strMitglieder(1 To 2)

Methoden zur Verwaltung von Arrays[Bearbeiten]

UBound[Bearbeiten]

Diese Funktion gibt den größten Index einer Dimension eines Arrays zurück.

Dim strName(3, 2 to 4) As String
MsgBox UBound(strName)

Dies gibt die Zahl 3 aus. Standardmäßig wird die erste Dimension untersucht. Interessiert man sich für eine andere, muss man dies mit angeben:

Dim strName(3, 2 to 4) As String
MsgBox UBound(strName, 2)

Jetzt erhalten sie die Ausgabe 4.

LBound[Bearbeiten]

Diese Funktion gibt den kleinsten Index einer Dimension eines Arrays zurück.

Dim strName(3, 2 to 4) as String
MsgBox LBound(strName)

Dies gibt die Zahl 0 aus. Standardmäßig wird die erste Dimension untersucht. Interessiert man sich für eine andere, muss man dies mit angeben:

Dim strName(3, 2 to 4) as String
MsgBox LBound(strName, 2)

Jetzt erhalten sie die Ausgabe 2.

ReDim[Bearbeiten]

Mit ReDim kann man die Größe eines Arrays ändern. Hierzu verwendet man folgende Syntax:

ReDim ArrayName(Untergrenze1 To Obergrenze1, Untergrenze2 To Obergrenze2, ...) [As Datentyp]

Das Array muss bei diesem Vorgang zwar bereits deklariert sein, eine Initialisierung ist allerdings nicht erforderlich:

Dim varName as Variant
varName = Array()
ReDim varName(1 To 5, 0 To 7) as String

Die Angabe As Datentyp ändert den Datentyp des Datenfeldes, was aber nur funktioniert, wenn das Array in einer Variant-Variable liegt.

Bei diesem Vorgang geht allerdings der gesamte Inhalt des Arrays verloren. Ist dies nicht erwünscht, kann man es mit dem Schlüsselwort Preserve unterbinden:

ReDim Preserve ArrayName(Untergrenze1 To Obergrenze1, Untergrenze2 To Obergrenze2, ...)

Eine Änderung des Datentyps ist jetzt natürlich nicht mehr möglich.

Des Weiteren kann man anstelle von festen Zahlen auch hier Variablen als Grenzen vergeben:

Dim strName()
Dim intGrenze as Long
intGrenze = 3
ReDim strName(intGrenze)

Allerdings hat auch ReDim seine Grenzen: Hat man einmal die Anzahl der Dimensionen festgelegt, lässt sich diese nicht mehr verändern. So produziert

Dim strName(1 To 7)
ReDim strName(2 To 5, 0 To 4)

einen Fehler.