VBA in Excel - Grundlagen: Gültigkeit von Variablen und Konstanten
Aus Wikibooks
Die Gültigkeit:
Variablen sind Platzhalter für Zeichenfolgen, Werte und Objekte. Sie können Werte oder Objekte enthalten. Abhängig vom Ort und der Art ihrer Deklaration werden ihre Gültigkeit und die Lebensdauer ihrer Werte festgelegt.
- Deklaration innerhalb einer Prozedur
Die Variable hat ihre Gültigkeit ausschließlich für diese Prozedur und kann aus anderen Prozeduren nicht angesprochen werden. - Deklaration im Modulkopf
Die Variable gilt für alle Prozeduren dieses Moduls, eine Weitergabe als Parameter ist nicht notwendig. - Deklaration im Modulkopf eines Standardmoduls als Public
Die Variable gilt für alle Prozeduren der Arbeitsmappe, soweit das die Prozedur enthaltene Modul nicht als Private deklariert ist.
Empfehlenswert ist die grundsätzliche Vermeidung von Public-Variablen und der Verzicht auf Variablen auf Modulebene. Es ist nicht immer einfach zu beurteilen, wann diese öffentlichen Variablen ihren Wert verlieren oder wo er geändert wird. Die sauberste Lösung ist die Deklariation innerhalb der Prozeduren und die Weitergabe als Parameter.
Wenn Sie mit öffentlichen Variablen arbeiten, sollten Sie Ihre Variablennamen gemäß den Programmier-Konventionen vergeben und sie so als öffentlich kennzeichnen. Ein vorangestelltes g könnte darauf hinweisen, dass es sich um eine Public-Variable, ein kleines m, dass es sich um eine Variable auf Modulebene handelt.
In den nachfolgenden Beispielen wird Deklaration und Verhalten von Variablen demonstriert.
Die Beispiele
-
Deklaration auf Prozedurebene
Eine Variable ist innerhalb einer Prozedur deklariert und nur in dieser Prozedur gültig.
- Prozedur: varA
- Art: Sub
- Modul: Standardmodul
- Zweck: Variablendemonstration
- Ablaufbeschreibung:
- Variablendeklaration
- Wert an Integer-Variable übergeben
- Wert melden
- Code:
Sub VarA() Dim iValue As Integer iValue = 10 + 5 MsgBox "Variablenwert: " & iValue End Sub
-
Deklaration auf Modulebene
Eine Variable ist innerhalb eines Moduls in jeder Prozedur gültig und wird im Modulkopf deklariert.
- Prozedur: varB und ProcedureA
- Art: Sub
- Modul: Standardmodul
- Zweck: Variablendemonstration
- Ablaufbeschreibung:
- Variablendeklaration im Modulkopf
- Wert an Double-Variable übergeben
- Unterprogramm ohne Parameter aufrufen
- Variablenwert melden
- Code:
Dim mdModul As Double Sub VarB() mdModul = 23 / 14 Call ProcedureA End Sub Private Sub ProcedureA() MsgBox "Variablenwert: " & mdModul End Sub
-
Statische Variable
Eine Variable ist innerhalb einer Prozedur als statisch deklariert und behält bei neuen Prozeduraufrufen ihren Wert.
- Prozedur: varC
- Art: Sub
- Modul: Standardmodul
- Zweck: Variablendemonstration
- Ablaufbeschreibung:
- Variablendeklaration
- Aufrufzähler hochzählen
- Wert melden
- Wert hochzählen
- Code:
Sub VarC() Static iValue As Integer Static iCount As Integer iCount = iCount + 1 MsgBox iCount & ". Aufruf: " & iValue iValue = iValue + 100 End Sub
-
Public-Variable
Eine Variable ist in der Arbeitsmappe in jedem Modul gültig und im Modulkopf eines Moduls als Public deklariert.
- Prozedur: varD und varE für den Folgeaufruf
- Art: Sub
- Modul: Standardmodul
- Zweck: Variablendemonstration
- Ablaufbeschreibung:
- Variablendeklaration im Modulkopf
- Arbeitsblatt an Objektvariable übergeben
- Arbeitsblattnamen melden
Im zweiten Aufruf:
- Wenn die Objekt-Variable nicht initialisiert ist...
- Warnton
- Negativmeldung
- Sonst...
- Arbeitsblattnamen melden
- Code:
Public gwksMain As Worksheet Sub VarD() Set gwksMain = Worksheets("Tabelle1") MsgBox "Blattname: " & gwksMain.Name End Sub Sub varE() If gwksMain Is Nothing Then Beep MsgBox "Bitte zuerst über Beispiel D initialisieren!" Else MsgBox "Blattname: " & gwksMain.Name End If End Sub
-
Übergabe von Variablen an eine Funktion
Variablen an eine Funktion übergeben und den Rückgabewert melden.
- Prozedur: varF und Funktion GetCbm
- Art: Sub/Funktion
- Modul: Standardmodul
- Zweck: Variablendemonstration
- Ablaufbeschreibung:
- Variablendeklaration
- Funktions-Rückgabewert in eine Double-Variable einlesen
- Ergebnis melden
Die Funktion:
- Rückgabewert berechnen
- Code:
Sub varF() Dim dCbm As Double dCbm = GetCbm(3.12, 2.44, 1.58) MsgBox "Kubikmenter: " & Format(dCbm, "0.00") End Sub Private Function GetCbm( _ dLength As Double, _ dWidth As Double, _ dHeight As Double) GetCbm = dLength * dWidth * dHeight End Function
-
ByRef Verarbeitung in einem Unterprogramm
Variable ByRef an ein Unterprogramm übergeben und den veränderten Rückgabewert melden.
- Prozedur: varG und Unterprogramm ProcedureB
- Art: Sub
- Modul: Standardmodul
- Zweck: Variablendemonstration
- Ablaufbeschreibung:
- Variablendeklaration
- Variable für Rückgabewert initialisieren
- Unterprogramm mit Parametern aufrufen
- Ergebnis melden
Das Unterprogramm:
- Rückgabewert berechnen
- Code:
Sub varG() Dim dCbm As Double dCbm = 0 Call ProcedureB(3.12, 2.44, 1.58, dCbm) MsgBox "Kubikmenter: " & dCbm End Sub Private Sub ProcedureB( _ ByVal dLength As Double, _ ByVal dWidth As Double, _ ByVal dHeight As Double, _ ByRef dErgebnis As Double) dErgebnis = dLength * dWidth * dHeight End Sub
-
Übergabe von Variablen an eine andere Arbeitsmappe
Variable an eine Funktion einer anderen Arbeitsmappe übergeben und den Rückgabewert melden.
- Prozedur: varH und Funktion in anderer Arbeitsmappe
- Art: Sub/Funktion
- Modul: Standardmodul
- Zweck: Variablendemonstration
- Ablaufbeschreibung:
- Variablendeklaration
- Pfad und Dateinamen der Test-Arbeitsmappe an String-Variable übergeben
- Wenn die Test-Arbeitsmappe nicht gefunden wurde...
- Negativmeldung
- Sonst...
- Bildschirmaktualisierung ausschalten
- Wert an Long-Variable übergeben
- Test-Arbeitsmappe öffnen
- Funktion in der Text-Arbeitsmappe aufrufen und Ergebnis in Long-Variable einlesen
- Test-Arbeitsmappe schließen
- Bildschirmaktualisierung einschalten
- Rückgabewert melden
- Code:
Sub varH() Dim lValue As Long Dim sFile As String sFile = ThisWorkbook.Path & "\vb04_test.xls" If Dir(sFile) = "" Then MsgBox "Die Testdatei " & sFile & " fehlt!" Else Application.ScreenUpdating = False lValue = 12345 Workbooks.Open sFile lValue = Application.Run("vb04_test.xls!Berechnung", lValue) ActiveWorkbook.Close savechanges:=False Application.ScreenUpdating = True MsgBox "Ergebnis: " & lValue End If End Sub Function Berechnung(lWert As Long) Berechnung = lWert * 54321 End Function
-
Variablen füllen und zurücksetzen
Variablenwerte werden belegt und zurückgesetzt.
- Prozedur: varI
- Art: Sub
- Modul: Standardmodul
- Zweck: Variablendemonstration
- Ablaufbeschreibung:
- Variablendeklaration
- Aktives Arbeitsblatt an eine Objekt-Variable übergeben
- Schleife bilden
- Array mit Werten füllen
- Meldung mit Arbeitsblattnamen, Array-Inhalt und Wert der Zählvariablen
- Meldung, dass die Werte zurückgesetzt werden
- Objektvariable zurücksetzen
- Array zurücksetzen
- Zählvariable zurücksetzen
- Fehlerroutine initialisieren
- Arbeitsblattnamen melden (führt zum Fehler)
- Wert des ersten Datenfeldes melden (leer)
- Wert der Zählvariablen melden (0)
- Prozedur verlassen
- Fehlerroutine
- Wenn es sich um die Fehlernummer 91 handelt...
- Meldung mit Fehlernummer und Fehlertext
- Nächste Programmzeile abarbeiten
- Code:
Sub varI() Dim wks As Worksheet Dim arr(1 To 3) As String Dim iCounter As Integer Set wks = ActiveSheet For iCounter = 1 To 3 arr(iCounter) = Format(DateSerial(1, iCounter, 1), "mmmm") Next iCounter MsgBox "Name des Objeks Arbeitsblatt:" & vbLf & _ " " & wks.Name & vbLf & vbLf & _ "Inhalt des Arrays:" & vbLf & _ " " & arr(1) & vbLf & _ " " & arr(2) & vbLf & _ " " & arr(3) & vbLf & vbLf & _ "Inhalt der Zählvariablen:" & vbLf & _ " " & iCounter MsgBox "Jetzt werden die Variablen zurückgesetzt!" Set wks = Nothing Erase arr iCounter = 0 On Error GoTo ERRORHANDLER MsgBox wks.Name MsgBox "Wert des ersten Datenfeldes: " & arr(1) MsgBox "Wert der Zählvariablen: " & iCounter Exit Sub ERRORHANDLER: If Err = 91 Then MsgBox "Fehler Nr. " & Err & ": " & Error Resume Next End If End Sub
-
Konstanten auf Prozedurebene
Konstante auf Prozedurebene als Endpunkt einer Schleife.
- Prozedur: varJ
- Art: Sub
- Modul: Standardmodul
- Zweck: Variablendemonstration
- Ablaufbeschreibung:
- Konstantendeklaration
- Variablendeklaration
- Schleife bilden
- Schleife beenden
- Zählvariable melden
- Code:
Sub varJ() Const ciLast As Integer = 100 Dim iCounter As Integer For iCounter = 1 To ciLast Next iCounter MsgBox "Zähler: " & iCounter End Sub
-
Public-Konstanten
Public-Konstante für alle Prozeduren der Arbeitsmappe.
- Prozedur: varK
- Art: Sub
- Modul: Standardmodul
- Zweck: Variablendemonstration
- Ablaufbeschreibung:
- Konstantendeklaration im Modulkopf
- Meldung mit der Public-Konstanten
- Code:
Public Const gciDecember As Integer = 12 Sub varK() MsgBox "Monat Dezember hat den Index " & gciDecember End Sub
-
Übergabe eines variablen Wertes an eine Konstante
Variabler Wert als Konstante. Gegen Versuche, einen variablen Wert an eine Konstante zu übergeben, wehrt sich VBA vehement. Das Beispiel zeigt eine Möglichkeit, das Problem zu umgehen.
- Prozedur: varL
- Art: Sub
- Modul: Standardmodul
- Zweck: Variablendemonstration
- Ablaufbeschreibung:
- Konstantendeklaration
- Meldung mit der variablen Konstanten
- Code:
Sub varL() Const cDay As String = "Day(Now())" MsgBox "Tageskonstante: " & Evaluate(cDay) End Sub