Home > Artikel > Ausgabe 5/2014 > TempVars unter VBA

TempVars unter VBA

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Im Artikel Programmieren mit Makros haben Sie bereits die so genannten temporären Variablen, auch TempVars genannt, kennen gelernt. Im vorliegenden Artikel vertiefen wir dieses Thema und schauen uns vor allem an, wie Sie die TempVars unter VBA nutzen und wie Sie damit die Verbindung zwischen VBA und Makros herstellen.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1405_Tempvars.accdb.

Voraussetzungen

TempVars wurden erst mit Access 2007 eingeführt. Dementsprechend können Sie als Nutzer von Access 2003 und älter nicht auf dieses Feature zugreifen.

Temporäre Variablen

Temporäre Variablen sind eigentlich ein Sonderfall des Collection-Objekts.Die Unterschiede sind, dass Sie dieses Objekt nicht erst wie ein Collection-Objekt deklarieren und instanzieren müssen, sondern dass es immer und überall bereitsteht.

Warum nun sollte ich einen Wert in einer temporären Variablen speichern und nicht in einer herkömmlichen Variablen?

Dafür gibt es gleich mehrere Gründe:

  • Temporäre Variablen werden im Gegensatz zu herkömmlichen Variablen im Falle eines Laufzeitfehlers nicht gelöscht – ein Beispiel folgt später. Sie werden erst beim Schließen der Access-Datei gelöscht (sofern Sie dies nicht vorher per Makro oder Code erledigt haben).
  • Temporäre Variablen können Sie sowohl von VBA als auch von Makros aus nutzen.

Temporäre Variablen nehmen Variablen des Typs Variant auf, also auch Strings, Zahlen et cetera, aber keine Objekte.

Temporäre Variablen im Makros

Schauen wir kurz auf die Verwendung von temporären Variablen in Makros. Diese legen Sie wie in mit dem Makrobefehl FestlegenTempVar fest (siehe Bild 1). In diesem Fall heißt die Variable AktuelleAusgabe und wird mit dem Wert 5/2014 gefüllt.

Festlegen einer temporären Variablen per Makro

Bild 1: Festlegen einer temporären Variablen per Makro

Das Makro macAktuelleAusgabeAusgeben sieht wie in Bild 2 aus und gibt den Inhalt der temporären Variablen in einem Meldungsfenster aus.

Ausgabe des Inhalts der temporären Variablen

Bild 2: Ausgabe des Inhalts der temporären Variablen

Das Ergebnis ist das Meldungsfenster aus Bild 3. Der Wert des Ausdrucks [TempVar]![AktuelleAusgabe] erscheint als Teil der auszugebenden Zeichenkette. Wichtig: Der Zugriff auf die Elemente der TempVar-Auflistung (die hier unsinnigerweise im Singular anzugeben ist) erfolgt über die Ausrufezeichen-Syntax.

Per Makro angezeigtes Meldungsfenster mit dem Inhalt einer temporären Variablen

Bild 3: Per Makro angezeigtes Meldungsfenster mit dem Inhalt einer temporären Variablen

Temporäre Variable per VBA festlegen

Wenn Sie eine temporäre Variable per VBA festlegen möchten, erledigne Sie dies interessanterweise nicht mit einer der Methoden des DoCmd-Objekts, welches ja fast alle in Makros verwendeten Befehle anbietet.

Stattdessen nutzen Sie direkt die TempVars-Auflistung, in diesem Fall die Add-Methode dieser Auflistung:

TempVars.Add "AktuelleAusgabe", "5/2014"

Eine auf diese Weise festgelegte Variable können Sie auch mit dem soeben definierten Makro macAktuelleAusgabeAusgeben anzeigen. Damit ist schon einmal sichergestellt, dass Makros und VBA auf die gleichen temporären Variablen zugreifen.

Per VBA auf eine temporäre Variable zugreifen

Wenn Sie von VBA aus den Wert einer temporären Variablen zugreifen möchten, verwenden Sie die Item-Eigenschaft der TempVars-Auflistung und übergeben dieser den Namen der benötigten temporären Variablen:

MsgBox "Die aktuelle Ausgabe heißt " & TempVars.Item("AktuelleAusgabe")

Das Ergebnis sieht nun genauso aus wie beim Aufruf des Makros macAktuelleAusgabeAusgeben.

Es gibt noch einen weiteren Weg, auf die Inhalte des TempVars-Objekts zuzugreifen – und zwar, indem Sie einfach direkt den Namen der Variablen angeben:

MsgBox "Die aktuelle Ausgabe heißt " & TempVars("AktuelleAusgabe")

Die nächste Variante ist der Zugriff über den numerischen Index:

MsgBox "Inhalt der ersten TempVar: " & TempVars(0)

Damit greifen Sie aber natürlich nicht mehr gezielt auf eine benannte temporäre Variable zu.

Es gibt einen wichtigen Unterschied beim Zugriff über den Namen der Variablen und über den Index: Wenn Sie über den Namen auf die temporäre Variable zugreifen, wird schlicht eine leere Zeichenfolge zurückgegeben. Wenn Sie es über den Index versuchen und für den Index keine Variable hinterlegt ist, löst dies einen Fehler aus (Fehler 2467, In dem von Ihnen eingegebenen Ausdruck wird auf ein Objekt verwiesen, das geschlossen oder nicht vorhanden ist).

Wert einer temporären Variablen ändern

Den Wert einer temporären Variablen ändern Sie auf zwei Arten – entweder durch direkte Zuweisung oder indem Sie die Variable einfach mit der Add-Methode neu erstellen. Die erste Version sieht so aus:

TempVars("AktuelleAusgabe") = "6/2014"

Oder so:

TempVars(0) = "6/2014"

Beim Überschreiben verwenden Sie diesen Befehl:

TempVars.Add("AktuelleAusgabe") "6/2014"

Wichtig: Nicht nur die letztere Variante legt eine neue temporäre Variable an, wenn diese noch nicht vorhanden ist – auch die einfache Zuweisung erzeugt gegebenenfalls eine neue temporäre Variable.

Alle TempVars durchlaufen

Die einfachste Möglichkeit, die Werte aller temporären Variablen auszugeben, ist das Durchlaufen aller TempVars in einer For Each-Schleife. Dabei verwenden wir eine Variable des Typs TempVar, um die aktuelle temporäre Variable zu referenzieren. Die Prozedur aus Listing 1 zeigt, wie dies funktioniert.

Public Sub AlleTempVarsAusgeben()

     Dim objTempVar As TempVar

     For Each objTempVar In TempVars

         MsgBox "Name: " & objTempVar.Name & vbCrLf & "Wert: " & objTempVar.Value

     Next objTempVar

End Sub

Listing 1: Ausgeben aller temporären Variablen und ihrer Werte

Das TempVar-Objekt nimmt jeweils eine temporäre Variable auf und liefert über die beiden Eigenschaften Name und Value den Namen und den Wert der temporären Variablen.

Variablen zählen

Bei der zweiten Methode, alle temporären Variablen zu durchlaufen, hilft die Count-Eigenschaft. Diese liefert die Anzahl der in der TempVars-Auflistung enthaltenen Elemente:

Debug.Print TempVars.Count

Die Auflistung ist nullbasiert, das heißt, dass der erste Indexwert 0 lautet. Dementsprechend müsste man eine For...Next-Schleife über alle temporären Variablen vom Startwert 0 bis zur Anzahl der temporären Variablen minus 1 laufen lassen. Dies sieht dann wie in Listing 2 aus.

Public Sub AlleTempVarsAusgeben_II()

     Dim i As Integer

     For i = 0 To TempVars.Count - 1

         MsgBox "Name: " & TempVars(i).Name & vbCrLf & "Wert: " & TempVars(i).Value

     Next i

End Sub

Listing 2: Durchlaufen aller temporären Variablen per For...Next-Schleife

Temporäre Variablen entfernen

Wenn Sie die temporäre Variable nicht mehr benötigen, können Sie diese einfach mit der Remove-Methode entfernen. Dazu geben Sie als Parameter entweder den Namen der Variablen oder den Index an:

TempVars.Remove "AktuelleAusgabe"

Tempvars.Remove 0

Auch hier gilt: Wenn Sie versuchen, eine temporäre Variable über den Namen zu löschen, löst dies keinen Fehler aus, wenn die Variable gar nicht vorhanden ist. Wenn Sie hingegen den numerischen Index verwenden und eine entsprechende temporäre Variable ist gar nicht vorhanden, erhalten Sie eine Fehlermeldung.

Alle temporären Variablen entfernen

Wenn Sie alle temporären Variablen löschen wollen, können Sie dies in einer Schleife erledigen. Es geht aber auch viel leichter: nämlich mit der Methode RemoveAll des TempVars-Objekts:

TempVars.RemoveAll

Bei Fehler ...

Wir wollen noch einmal herausstellen, worin die besondere Bedeutung der TempVars liegt – nämlich in der sicheren Unterbringung bei Auftreten eines Laufzeitfehlers. Nehmen wir einmal an, Sie verwenden eine globale Variable namens i, die Sie wie folgt in einem Standardmodul deklarieren:

Public i As Integer

Diese setzen wir in einer ersten Prozedur, die gleich darauf einen Fehler provoziert, auf den Wert 1:

Public Sub TestFehler()

     i = 1

     Debug.Print "Vor dem Fehler: " & i

     Debug.Print i / 0

End Sub

Anschließend rufen wir eine weitere Prozedur auf, die den aktuellen Wert der Variablen ausgibt:

Public Sub NachDemFehler()

     Debug.Print "Nach dem Fehler: " & i

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!