Variablen sind eine Platzhalter für Zeichenfolgen, Werte und Objekte. So 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.
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.
Eine Variable ist innerhalb einer Prozedur deklariert und nur in dieser Prozedur gültig.
Sub VarA()
Dim iValue As Integer
iValue = 10 + 5
MsgBox "Variablenwert: " & iValue
End Sub
Eine Variable ist innerhalb eines Moduls in jeder Prozedur gültig und wird im Modulkopf deklariert.
Dim mdModul As Double
Sub VarB()
mdModul = 23 / 14
Call ProcedureA
End Sub
Private Sub ProcedureA()
MsgBox "Variablenwert: " & mdModul
End Sub
Eine Variable ist innerhalb einer Prozedur als statisch deklariert und behält bei neuen Prozeduraufrufen ihren Wert.
Sub VarC()
Static iValue As Integer
Static iCount As Integer
iCount = iCount + 1
MsgBox iCount & ". Aufruf: " & iValue
iValue = iValue + 100
End Sub
Eine Variable ist in der Arbeitsmappe in jedem Modul gültig und im Modulkopf eines Moduls als Public deklariert.
Im zweiten Aufruf:
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
Variablen an eine Funktion übergeben und den Rückgabewert melden.
Die Funktion:
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
Variable ByRef an ein Unterprogramm übergeben und den veränderten Rückgabewert melden.
Das Unterprogramm:
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
Variable an eine Funktion einer anderen Arbeitsmappe übergeben und den Rückgabewert melden.
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
Variablenwerte werden belegt und zurückgesetzt.
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
Konstante auf Prozedurebene als Endpunkt einer Schleife.
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-Konstante für alle Prozeduren der Arbeitsmappe.
Public Const gciDecember As Integer = 12
Sub varK()
MsgBox "Monat Dezember hat den Index " & gciDecember
End Sub
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.
Sub varL()
Const cDay As String = "Day(Now())"
MsgBox "Tageskonstante: " & Evaluate(cDay)
End Sub