Datentypen

Variablen haben den Zweck, Werte zu speichern und zu verarbeiten. Texte kann man z. B. zusammenfügen, mit Zahlen kann man rechnen. Die Software muss dazu erkennen, ob eine Variable einen Text oder eine Zahl enthält. So erwartet man z. B., dass „Mittag“ und „essen“ zu „Mittagessen“ zusammengesetzt wird, aber „1“ und „2“ soll wohl in der Regel „3“ ergeben, und nicht „12“. Wünschen wir es doch anders (also eine Interpretation als Text), müssen wir es dem Programm gezielt sagen können. Verschiedene Computerprogramme stellen dazu unterschiedliche Verfahren zur Verfügung. VBA ist diesbezüglich eine sogenannte typisierte Programmiersprache. Das bedeutet, dass jede Variable einen bestimmten Datentyp hat, es also von vornherein festgelegt ist, welche Art von Werten in einer Variablen gespeichert werden kann.

a + b = ? 
Text: Mittag essen
Zahl: 1 2
   3
Option Explicit
Sub
HalloDu() Dim meinText As String meinText = "Hallo Welt" Debug.Print meinText End Sub

Dieses Beispiel kannten wir schon, aber bei der Variablendeklaration ist As String hinzugekommen, womit die Variable nur noch Texte speichern kann. Der Datentyp folgt nach dem Schlüsselwort As. Sobald man As getippt hat, stellt IntelliSense eine ziemlich lange Auswahlliste zur Verfügung. Die Liste variiert je nachdem, in welcher Applikation VBA gerade läuft. Wer „seine“ Applikation kennt, dem kommt hier Vieles bekannt vor. Uns interessieren aber zunächst nur die Datentyp VBA-internen Datentypen:

Datentypen
TypWertebereichSpeicherbedarfAnfangswertBeispiel
BooleanJa/Nein-Werte (True oder False)2 ByteFalseweiblich = True
ByteGanzzahlen 0 bis 2551 Byte0Alter = 42
IntegerGanzzahlen -32.768 bis 32.7672 Byte0Baujahr = 1950
LongGanzzahlen -2.147.483.648 bis 2.147.483.6474 Byte0KundenNr = 23
LongLong ¹Ganzzahlen ca. ± 9 Trillionen8 Byte0Menschen =
Currencyskalierte Ganzzahlen ca. ± 9 Billionen, 4 Nachkommastellen8 Byte0Euro = -47.11
SingleGleitkommazahl, einfache Genauigkeit4 Byte0gerundet = 1.5
DoubleGleitkommazahl, doppelte Genauigkeit8 Byte0Ergebnis = 1.75
DateDatum (1. Jan 100 bis 31. Dez 9999) und Zeit8 Byte30.12.1899 00:00Heute =
StringTexteAnz. Zeichen * 2vbNullStringInfo = "Hallo Welt"
Objectabhängig vom Objekt4 ByteNothingSet BMW = Auto
Variantabhängig vom gerade aktuellen InhaltunterschiedlichEmptydiverses = -1

¹ Nur auf 64-Bit-Systemen verfügbar

Die Entscheidung für einen Datentyp hängt davon ab, ob man Texte oder Zahlen speichern will. Für Texte fester Länge gibt es noch die Syntax String * Länge, also z. B. Dim MeinZeichen As String * 1, wenn der String immer exakt ein Zeichen enthalten soll. Bei Zahlen wird zwischen Ganzzahlen und Gleitkommazahlen unterschieden. Dafür gibt es jeweils mehrere Datentypen (Ganzzahlen: Byte, Integer und Long. Fließkommazahlen: Single und Double). Single existiert eher aus Kompatibilitätsgründen und sollte heute nicht mehr verwendet werden. Currency ist intern eine Ganzzahl, die durch 10000 geteilt wird und so 4 feste Nachkommastellen hat. Im Gegensatz zu „normalen“ Fließkommazahlen ist das ein sehr genaues Rechenverfahren und daher besonders im Zusammenhang mit Geldbeträgen zu empfehlen. Variant-Variablen können jeden beliebigen Wert annehmen. Eine Dim-Anweisung ohne Datentyp deklariert die Variable als Variant.

Sobald man eine Variable deklariert hat, wird ihr ein Anfangswert und Speicherplatz zugewiesen. Numerische Variablen bekommen den Wert 0, Strings entsprechen der leeren Zeichenfolge "". Strings fester Länge bekommen eine Zeichenfolge zugewiesen, die aus dem Steuerzeichen vbNullChar besteht, und zwar so oft, wie der String lang ist. Eine Variant-Variable bekommt den Sonderwert Empty, der anzeigt, dass sie noch keinen Wert zugewiesen bekommen hat. Man kann ihr auch später wieder Empty zuweisen, um sie wieder in einen „jungfräulichen Zustand“ zu versetzen. Außerdem kann ein Variant auch den Sonderwert Null enthalten, um anzuzeigen, dass die Variable keine gültigen Daten enthält.

Object-Variablen werden erst sehr viel später im Tutorial angesprochen. Hier sei nur schon erwähnt, dass der Anfangswert Nothing ein Sonderwert ist, um anzuzeigen, dass die Variable auf kein Objekt verweist.

Wieviel Speicherplatz eine Variable verbraucht, interessiert in der Praxis selten - es sei denn, man will z. B. eine ganze Datenbank auf einmal in Variablen speichern. Bei String und Variant zeigt sich dann, warum diese Datentypen ein Performanceproblem haben können: Je nach Inhalt der Variable ändert sich ihr Speicherbedarf. „Unter der Haube“ muss der Computer im Speicher einiges umräumen, wenn sich der Inhalt ändert. Zudem muss sich VBA bei Variant auch noch merken, als welcher Datentyp der derzeitige Wert gerade interpretiert werden soll. Während deswegen im Umfeld z. B. von Microsoft Access der Datentyp Variant eher verpönt ist, wird dessen Flexibilität von manchen Usern von Microsoft Excel gerne genutzt, um Variablen wie in einer nicht-typisierten Scriptsprache zu nutzen.