cmp-online.de
Startseite
Neu...
Yamaha XT600Z
Meine Tenere
XT-Technik
VB/VBA-Grundlagen
Grundelemente
Prozeduren
Operatoren
Variablen
Methoden
Schleifen
Vordefinierte Funktionen
Excel-Objekte
Impressum
private homepage von christian mario preussler
Variablen, Konstanten und Felder

Ebenso, wie zum Beispiel in C/C++, werden auch in VBA Variablen, Konstanten und Felder unterschieden. Die vorhandenen Unterschiede sollen in den nächsten drei Teilabschnitten erläutert werden.

Variablenarten

Wie andere Programmiersprachen unterscheidet auch VBA bei numerischen Variablen zwischen Variablen für ganzzahlige und für gebrochene Zahlenwerte; weiterhin gibt es Variablen für alphanumerische Texte, für Ja/Nein-Entscheidungen und für das Datum.

Zu den Namen und Eigenschaften der wichtigsten Datentypen siehe folgende Tabelle:

Tabelle 5.5: Die wichtigsten Datentypen in VBA

Variablenart

Name

Speicherbedarf

Wertebereich (ca.)

Universell

Variant

16 Bytes

+ 1 Byte je Zeichen

Jeder Wert

Ganzzahl

Integer

2 Bytes

-32768 bis 32768

Ganzzahl

Long

4 Bytes

- 2 Mrd. bis 2 Mrd.

Fließkommazahl

Single

4 Bytes

+/- 1,4E-45 bis 3,4E38

Fließkommazahl

Double

8 Bytes

+/- 4,9E-324 bis 1,8E308

Boolesch

Boolean

2 Bytes

True oder False

Zeichenfolge

String

1 Byte je Zeichen

Nur vom Speicherplatz begrenzt

Weitere Datentypen der Programmiersprache VBA, die hier nicht explizit beschrieben werden sollen, sind z.B. Date, Currency, Byte, Decimal.

Neben den Standard-Datentypen sind selbstdefinierte Datentypen mit Hilfe der Type-Anweisung möglich. Mit ihr kann der Programmierer aus mehreren Standardtypen, ähnlich wie in einem Datenfeld (Abschnitt 5.3.3), die benötigte Variablenform selbst bestimmen (siehe Fachliteratur).

Deklaration und Gültigkeitsbereiche von Variablen

Variablen sollten als erste Anweisungen in Prozeduren/Funktionen, d.h. im Deklarations-bereich des Unterprogrammes, folgendermaßen deklariert werden:

Dim VarName As Datentyp

Diese Form der Variablenerzeugung zu Beginn eines Unterprogrammes ist jedoch nur erforderlich, wenn der Code-Bereich mit dem Befehl Option Explicit begonnen wird (was die Sicherheit beim Programmablauf erhöht). Ansonsten kann VBA auch während der Laufzeit an irgendeiner Stelle im Programmcode automatisch Speicherplatz für eine Variable freimachen. Der Datentyp und somit der Speicherplatz der Variablen wird automatisch anhand der Erfordernisse festgelegt:

'Anweisungen
Var1 = 3 'Erzeugung einer Integer-Variablen
Var2 = 3.14 'Erzeugung einer Single-Variablen
'aber:
Var1 = 1.717
'In Var1 ist jetzt, anders als vorher, eine Single-Variable gespeichert

Mit der Dim-Anweisung erzeugte Veränderliche sind nur in dem Bereich gültig, in denen sie definiert wurden. Wenn die Anweisung in einer Prozedur steht, hat sie ihren Gültigkeitsbereich nur lokal in dieser Prozedur. Sollen Variablen auch innerhalb anderer Prozeduren Verwendung finden, dann ist eine Definition außerhalb aller Prozeduren und Funktionen im Code-Bereich des programmierten Formulars (oder der Tabelle) nötig. Dort erzeugte Veränderliche sind in allen Unterprogrammen des Formulars gültig. In diesen Fällen spricht man von generellen Variablen.
Wenn darüber hinaus eine Variable auch in Unterprogrammen anderer Formulare oder Module genutzt werden soll, muß sie in einem Modul (und nur in einem Modul) definiert werden; dann aber wird nicht das Schlüsselwort Dim verwendet, sondern stattdessen Public. Die Variable ist dann global gültig:

Public Var3 As Integer

Statt die Variablen mit der Angabe des gewünschten Datentyps zu definieren, kann bei einigen Typen auch ein charakterisierendes Kurzzeichen verwendet werden. Bei Integer-Daten sieht das folgendermaßen aus:

Dim nVar%

Die möglichen Kurzzeichen entnehmen Sie der nachfolgenden Tabelle.

Tabelle 5.6: Kurzzeichen der wichtigsten Datentypen

Datentyp

Kurzzeichen

Integer

%

Long

&

Single

!

Double

#

String

$

Diese Kurzzeichen sollten auch im Zusammenhang mit Zahlenangaben verwendet werden. Um einer Variablen vom Typ Double einen Fließkommawert zuzuweisen, müßte man folglich schreiben:

dblVar1 = 3#

Das wird um so wichtiger, wenn z.B. eine Rechenoperation folgender Art durchgeführt werden soll:

Dim lVar1 As Long
lVar1 = 255 * 256 'Fehler!

Der obige Fehler tritt auf, weil VBA die Rechnung vor der Zuweisung durchführt; in beiden Variablen erkennt VBA den Typ Integer, mit der Multiplikation wird der Gültigkeitsbereich der Integer-Variable überschritten! Wird eine der beiden Zahlen als Long-Typ definiert, dann tritt der Fehler nicht auf (siehe /1/).

Der Datentyp Variant

Eine besondere Position nimmt der Datentyp Variant ein. Variant ist der Standard-Datentyp in VBA. Wird bei der Definition der Variablen kein anderer Typ angegeben, dann ist die Variable automatisch vom Typ Variant:

Dim VariableX 'Varible vom Typ Variant

Wie der Name schon andeutet, kann einer Variant-Variablen jeder Wert zugewiesen werden, sie passt ihre Art der internen Speicherung automatisch an die Erfordernisse des zu speichernden Wertes an. Soll ein Double-Wert gespeichert werden, so bleibt die gespeicherte Zahl gebrochen rational, bei Integerzahlen werden auch in die Variante keine Nachkommastellen geschrieben. Das ist besonders zu beachten, wenn eine implizite Typumwandlung, die in VBA möglich ist, erreicht werden soll. Wenn eine Double-Zahl einer Integer-Variablen zugewiesen wird, dann werden automatisch die Nachkommastellen abgeschnitten. Beispiel:

Dim n As Integer
N = 3.41 'N hat den Inhalt 3

Bei Variantvariablen funktioniert die Umwandlung nicht, egal, welchen Wert sie vorher hatte:

Dim V As Variant
V = 3
'Anweisungen
V = 3.41 'in V ist der Double-Wert 3,41 gespeichert.

Die Verwendung einer Varianten ist aber duchaus sinnvoll, wenn nicht im vorhinein bekannt ist, welchen Inhalt sie aufnehmen soll. Denn wenn zum Beispiel eine Funktion eigentlich eine ganze Zahl zurückliefern soll, bei bestimmten Verhältnissen aber einen Text (“Die Berechnung konnte nicht durchgeführt werden“), dann ist eine Variant-Variable die richtige Wahl. Besonders Wertvoll ist sie aber auch, weil sie, ohne Größenangabe bei der Definition, auch ein Feld aufnehmen kann (siehe Literatur). Um herauszufinden, welche Art von Inhalt die Variante hat, kann man die von VBA bereit-gestellten Funktionen VarType und TypeName benutzen. Erstere liefert als Rückgabewert einen, den Typ charakterisierenden, ganzzahligen numerischen Wert, letztere gibt den Namen des Typs als Text zurück (siehe: Online-Hilfe).

Weiterhin kann, anders als die anderen Variablen, eine Variante auch Objekte aufnehmen (siehe Abschnitt 5.3.4, Objektvariablen).

Eine Variant-Variable kann auch die Zustände Empty (noch überhaupt nicht belegt) und Null annehmen. Null ist die Kennzeichnung für einen nicht belegten Zeiger. Hier können die Funktionen IsEmpty und IsNull zur Ermittlung des Inhalts herangezogen werden. Zur Verwendung von IsEmpty siehe Felder.

Konstanten

Ebenso wie bei den Variablen gibt es auch bei der Definition von Konstanten verschiedene Gültigkeitsbereiche. Die Definition einer Konstanten in einer Prozedur/Funktion (lokale Gültigkeit) oder einem Formular/Modul (generelle Gültigkeit) sieht folgendermaßen aus:

Const Pi = 3.14

Sollen Konstanten global gültig sein, dann muß der Definition das Schlüsselwort Public vorangestellt werden (nur in Modulen möglich):

Public Const Pi = 3.14

Neben selbstdefinierten Konstanten bieten sowohl VBA, als auch Excel viele eigene Konstanten an, die z.B. bei der Parameterangabe in Funktionsaufrufen genutzt werden können. Diese Konstanten erkennt man zumeist an den ersten beiden Buchstaben, für VBA-Konstanten ist das "vb...", Excel-eigene erkennt man an "xl..." Als Beispiele wären zu nennen vbYesNo als Übergabeparameter an den Aufruf eines Meldedialogs (MessageBox, siehe Abschnitt 6.1) oder vbHourglass als Kennzeichnung für einen sanduhrförmigen Mauszeiger. Auflistungen aller vordefinierten Konstanten hält die Online-Hilfedatei der Excel-IDE bereit.

Felder

Zum Sprachumfang von VBA gehören auch ein- oder mehrdimensionale Felder. Mit der folgenden Anweisung können einem Integer-Feld insgesamt 11 (!) Integer-Werte zugewiesen werden:

Dim nFeld(10) As Integer 'Zählung der Indizes von 0 bis 10 
'(jeweils einschließlich) 
'Zuweisung von Zahlenwerten:
nFeld(1) = 100
nFeld(2) = 200 
'...

Ein zweidimensionales Feld wird folgendermaßen definiert:

Dim nmFeld(1,5) As Long 'erste Dimension von Index 0 bis 1, 
'zweite von 0 bis 5

Will man erreichen, daß die Zählung der Indizes bei von 0 verschiedenen Zahlen beginnt, ist es erlaubt, die Index-Grenzen anzugeben:

Dim nFeld(-5 To 5) As Integer

Überaus gut gelungen ist in VBA die dynamische Größenanpassung von Feldern. Ist es erforderlich, daß erst zur Laufzeit des geschriebenen Programms die Größe des Feldes festgelegt wird, etwa weil vorher nicht klar ist, ob ein Feld 10 oder 10000 Werte aufnehmen soll (die Speicherverschwendung bei irrtümlicher Wahl eines sehr großen Feldes wird im unglücklichsten Falle auch zu einer Verlangsamung des Programmablaufs führen), dann wird i.A. folgende Anweisung benutzt:

Dim nFeld() As Long
'andere Anweisungen
Redim nFeld(10) 'das Feld nimmt jetzt 11 Zahlenwerte auf

Soll zu einem späteren Zeitpunkt noch einmal die Anzahl der Feldelemente erhöht werden, muß, wenn die schon enthaltenen Elemente nicht überschrieben werden sollen, das Schlüsselwort Preserve verwendet werden:

Redim Preserve nFeld(20)

Sogar der Datentyp läßt sich im nachhinein noch festlegen (siehe Literatur).

Der erste und der letzte verwendete Index des Feldes können mit den Funktionen UBound und LBound erfragt werden. Angewandt auf das letzte Beispiel:

nObergrenze = UBound(nFeld) ' nObergrenze hat den Wert 20

Oft muß vor der Zuweisung von Werten zu den Feldelementen heausgefunden werden, ob das Feld überhaupt initialisiert, sprich auf eine (beliebige) Größe festgelegt wurde. Dann kann man sich mit, oft umständlichen, Programmiertricks helfen, oder statt eines Feldes mit festgelegtem Datentyp eine Variant-Variable zur Aufnahme der Werte verwenden. Denn bei der Varianten kann man die von VBA mitgelieferte IsEmpty-Funktion verwenden: Sie gibt zurück, ob das Feld schon einmal mit einer Größe belegt wurde (Rückgabewert False), oder noch nicht benutzt wurde (True).