| home |  
  

   © 2005 by Friedel Schmidt •  E-Mail  •                      Top  

   | impressum | feedback | home |  


Inhaltsverzeichnis

Suchen

Links
  

Variablen in Makros
Versionen: Alle


Grundlegendes


Was sind Variablen und wann kann man sie einsetzen?

Variablen sind eine Art Platzhalter für Objekte, Zeichenfolgen und Werte. Man kann "darin" beispielsweise bei Berechnungen mehrfach zu verwendende Werte oder wiederholt anzuzeigende Meldungen speichern. Variablen können an Funktionen oder Unterprogramme übergeben, dort zu Berechnungen verwendet und mit geänderten Werten zurückgegeben werden (d.h. der Wert der Variablen kann sich verändern, doch der Name der Variablen bleibt). Der Gebrauch von Variablen in VBA-Anweisungen ist identisch mit dem Einsatz von Variablen in mathematischen Gleichungen.
Wird ein Element nur einmal im Code angesprochen - z.B. die Msg-Box "Hallo"- ist das Speichern der Zeichenfolge "Hallo" in einer Variablen eher verwirrend und überflüssig. Allerdings gibt es auch Ausnahmen, bei denen trotz einmaliger Verwendung das Speichern in einer Variablen sinnvoll sein kann - z.B. wenn der restliche Code durch den langen Inhalt einer MsgBox oder bei langen Objektnamen zu unübersichtlich wird.
Variablen einzusetzen ist immer dann sinnvoll, wenn Elemente mehrfach angesprochen werden. Wenn man Variablen sinnvoll einsetzt, beschleunigen sie die Ausführung eines VBA-Makros enorm.


Was ist bei der Benennung von Variablen zu beachten?

  • Der Name der Variablen muß mit einem Buchstaben beginnen.
  • Nach dem ersten Buchstaben kann jede mögliche Kombination von Zahlen und Buchstaben sowie das Unterstreichungszeichen (_) folgen.
  • Variablennamen dürfen keine Leerschritte, Punkte (.) oder andere Zeichen enthalten, die bei VBA für mathematische Berechnungen oder Vergleichsoperationen (=, +, - usw.) eingesetzt werden.
  • Variablennamen dürfen maximal 255 Zeichen enthalten.
  • Variablennamen dürfen nicht mit bestimmten Schlüsselwörtern identisch sein. Wählt man einen Variablennamen, der mit einem derartig gesperrten Schlüsselwort identisch ist, meldet VBA einen Syntaxfehler.
  • Variablennamen müssen in ihrem Gültigkeitsbereich eindeutig sein. Das heißt, daß der Name innerhalb der Prozedur oder des Moduls in dem die Variable eingesetzt ist, nur einmal vorkommen (deklariert sein) darf. Wenn versehentlich zwei Variablen in einer Prozedur den gleichen Namen haben oder der Name der Variablen mit dem Namen einer Prozedur in dem gleichen Modul identisch ist, reagiert VBA bei der Ausführung der Prozedur mit einer Fehlermeldung.
  • Funktion der Variablen so gut wie möglich im Variablennamen beschreiben
  • Variablen nicht größer als erforderlich dimensionieren

Sinnvollerweise sollte man dem Namen der Variablen ein Kürzel vorne anstellen, aus dem der Variablentyp hervorgeht, das erleichtert einiges beim Lesen des Codes:

Variablentyp    Variableninhalt    Variablenname
String    Zeichenfolgen (z.B. Text)    strDateiname
Integer    Zahl von -32.768 bis 32.767    intIrgendeineZahl
Date    Datum oder Zeit    datBeginn



Wie werden Variablen erzeugt?

Die einfachste Art eine Variable zu erzeugen ist das Verwenden derselben in einem Code. Allein schon durch die Verwendung einer Variablen in einer Anweisung wird VBA mitgeteilt dass eine Variable erzeugt werden soll. Das nennt man indirekte oder implizite Variablendeklaration.
Diese Vorgehensweise ist zwar auf den ersten Blick Benutzerfreundlich, kann jedoch diverse Probleme bereiten (und tut es in der Regel auch). Hat man zum Beispiel die Variable Irgendwas erzeugt und schreibt sie bei der weiteren Verwendung falsch, z.B. Irgenwas, kommt es, abhängig davon an welcher Stelle im Code die falsche Schreibweise verwendet wird, zu einem Laufzeitfehler oder VBA erzeugt eine neue Variable mit diesem (falschen) Namen.

Die implizite Variablendeklaration ist auch und besonders in komplexen Makros problematisch, wenn man davon ausgeht gerade eine (implizite) Variable zu erzeugen aber in Wirklichkeit den Namen einer bereits verwendeten Variablen verwendet - in diesem Fall wird der vorher gespeicherte Wert unbeabsichtigt überschrieben! Das erzeugt zwar keinen Laufzeitfehler, kann aber das gewünschte Resultat auf den Kopf stellen und die Ursache des Problems ist kaum zu lokalisieren.

Aus diesen und anderen Gründen gibt es die Möglichkeit, explizite Variablendeklarationen vorzunehmen. Variablen explizit zu deklarieren, hat folgende Vorteile:
  • Durch explizite Variablendeklarationen wird die Ausführung des Codes beschleunigt. VBA erzeugt alle explizit deklarierten Variablen in einem Modul oder einer Prozedur, bevor die Befehle der Prozedur ausgeführt werden. Die Geschwindigkeit bei der Ausführung steigt, da der zeitliche Aufwand für die Analyse und die Erzeugung von implizit deklarierten Variablen entfällt.
    Werden sie nicht explizit deklariert oder nicht dimensioniert, handelt es sich beim Programmstart in jedem Fall um den Variablentyp Variant, der zum einen mit 16 Bytes den größten Speicherplatz für sich beansprucht, zum anderen während des Programmablaufes seinen Typ mehrmals wechseln kann, was möglicherweise die Programmausführung erschwert.
    Außerdem benötigen Variant-Variablen erheblich längere Berechnungszeiten als andere.
  • Durch explizite Variablendeklarationen werden, wie bereits beschrieben, Fehler durch falsch geschriebene Variablennamen vermieden.
  • Das Lesen und Verstehen eines Quelltextes ist einfacher, wenn dieser explizite Variablendeklarationen enthält. Da alle Variablendeklaration am Anfang des Moduls oder der Prozedur stehen kann man beim Lesen des Quelltextes einfacher erkennen welche Variablen in einem Modul oder einer Prozedur verwendet werden.
  • Bei explizit deklarierten Variablen kann die Großschreibung im Variablennamen verbindlich vorgegeben werden. Wenn man eine Variable explizit deklariert, richtet sich VBA bei der Groß- oder Kleinschreibung des Variablennamens in einer VBA-Anweisung nach dem Variablennamen, der bei der Deklaration angegeben wurde, und nicht nach der neuesten Schreibweise. Wenn man zum Beispiel eine Variable explizit mit dem Namen datAnfang deklariert und später datanfang schreibt, verändert VBA datanfang so, daß der Name mit der Schreibweise in der expliziten Deklaration, also datAnfang, übereinstimmt.
  • Obwohl im Datentyp Variant Daten des Datentyps Date gespeichert werden können, treten Probleme auf, wenn ein Datum aus Excel als Variant gespeichert werden soll. VBA erkennt zum Beispiel ein Datum aus einer Zelle eines Excel-Tabellenblattes erst, nachdem es mit Hilfe der Datumsformatierung von Excel formatiert wurde. Speichert man aber das Datum des Excel-Tabellenblattes mit dem Datentyp Date gibt es keine Formatierungsprobleme. Wird umgekehrt ein Datum einem Excel-Tabellenblatt hinzugefügt, werden die darin enthaltenen Informationen nur richtig interpretiert, wenn sie mit dem Datentyp Date und nicht mit dem Datentyp Variant gespeichert wurden. Aus diesem Grund sollten Variablen, die Datumsangaben enthalten, immer explizit der Datentyp Date zugewiesen werden.


Zur expliziten Deklaration einer Variablen benutzt man die DIM-Anweisung mit folgender Syntax:

Dim datBeginn 

Diese Anweisung signalisiert VBA, eine Variable mit dem Namen "datBeginn" zu erzeugen. (Das Schlüsselwort Dim ist übrigens die Abkürzung für das Wort Dimension). Da alle Variablen, die nur mit dem Schlüsselwort Dim erzeugt werden, den Datentyp Variant erhalten und im Beispiel der Inhalt der Variante ein Datum sein soll ist das allerdings noch nicht alles. Es muss noch der korrekte Variablentyp (oder Datentyp) zugewiesen werden. Dies geschieht durch folgende Syntax:

Dim datBeginn As Date 

Erst durch diese Anweisung weiß VBA das eine Variable vom Typ Datum erzeugt werden soll.

Der Übersichtlichkeit halber sollte man die Variablendeklaration nach einem eigenen System anordnen.
Zuerst die Objekttypen, dann nach ihrem Speicherbedarf absteigend die übrigen Variablen.
Variablen eines Typs sollte man möglichst in einer Zeile deklarieren:

Dim wksQuelle As Worksheet, wksZiel As Worksheet
Dim arrWoche(1 to 20) As Integer
Dim dblZeile As Double
Dim intCounter As Integer, intSpalte As Integer
Dim strMsg As String 

Diese Schreibweise ist falsch:

Dim intCounter, intZeile, intSpalte As Integer 

Eine weit verbreitete Fehlinformation lautet, Variablen könne mit der vorgenannten Deklaration der Integer-Typ zugewiesen werden. Hier haben aber zum Programmstart die Variablen intCounter und intZeile den Variant-Typ, ausschließlich die Variable intSpalte hat den Integer-Typ.


Wo sind die Variablen verfügbar?

Variablen auf Prozedurebene
Eine Variable, die innerhalb einer Prozedur deklariert wurde, steht auch nur innerhalb dieser Prozedur zur Verfügung. In der Praxis sieht das so aus, dass die Variable nur so lange existiert, wie VBA die entsprechende Prozedur ausführt.

Variablen auf Modulebene
Manchmal ist es jedoch nützlich, dass mehrere Prozeduren auf eine Variable zugreifen können. Wird ein Wert häufig benötigt, ist es effizienter, diesen Wert einmal zu berechnen, ihn in einer Variablen zu speichern und diese Variable in unterschiedlichen Prozeduren zu verwenden, als diesen Wert immer wieder neu zu berechnen.
Mit VBA kann man Variablen deklarieren, auf deren Inhalt mehrere Prozeduren gleichzeitig zurückgreifen können. Steht eine Variable allen Prozeduren in einem Modul zur Verfügung, befindet sich diese Variable auf Modulebene. Eine Variable auf Modulebene ist nur gültig für das Modul, in dem die Variable deklariert wurde.

Variablen mit demselben Namen, aber unterschiedlichen Gültigkeitsbereichen
Innerhalb eines Gültigkeitsbereichs der Variablen muss der Variablenname eindeutig sein. Genauso wie in einer Prozedur keine zwei Variablen mit dem gleichen Namen deklariert werden dürfen, so dürfen aus den gleichen Gründen in einem Modul auch keine zwei Variablen mit dem gleichen Namen deklariert werden, die beide auf Modulebene Gültigkeit haben.
Befinden sich jedoch zwei Variablen mit identischen Namen in unterschiedlichen Gültigkeitsbereichen, werden dadurch keine Probleme verursacht. Wenn Variablen mit den gleichen Namen sich in unterschiedlichen Gültigkeitsbereichen befinden, benutzt VBA die Variable mit dem lokalsten Gültigkeitsbereich.

"Werthaltigkeit" - die Lebensdauer von Variablen
Mit der Lebensdauer wird die Länge der Zeit bezeichnet, die eine bestimmte Variable ihren zugewiesenen Wert behält. Zugewiesene Werte in Variablen existieren nur so lange, wie die Variable in ihrem Gültigkeitsbereich aktiv ist.
Variablen auf Prozedurebene werden jedes Mal neu erzeugt, wenn die Ausführung einer Prozedur beginnt. Sobald die Ausführung beendet ist, werden diese Variablen gelöscht. Oder genauer gesagt, lokale Variablen sind solange undefiniert, das heißt ohne Kontext, bis die Ausführung der Prozedur beginnt, in der die Deklaration der Variablen stattfindet. Sobald das Ende der Prozedur, in der die Variablen deklariert wurden, erreicht ist, befindet sich die Variable wieder in ihrem undefinierten Zustand.
Variablen, die auf Modulebene deklariert werden, existieren so lange wie VBA eine Prozedur in diesem Modul ausführt. Wenn VBA eine Prozedur ausführt, wird zunächst das gesamte Modul durchsucht, in dem sich die Prozedur befindet, und es werden alle Variablen auf Modulebene erzeugt. Solange VBA eine Prozedur in diesem Modul ausführt, bleiben die Werte der Variablen auf Modulebene erhalten.




Variablendeklaration erzwingen
Variablentypen