VBA in Excel/ Gültigkeit von Variablen und Konstanten
Deklaration von Variablen
[Bearbeiten]Variablen sind Platzhalter für Zeichenfolgen, Werte und Objekte. Um neue Variablen erstmalig zu verwenden, müssen sie deklariert werden, indem ihnen ein Variablentyp zugewiesen wird. Dies geschieht in den meisten Fällen durch die dim-Anweisung
Dim intCounter as Integer
Die Gültigkeit
[Bearbeiten]Die Gültigkeit und die Lebensdauer der Werte der Variablen werden durch den Ort und die Art ihrer Deklaration 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 enthaltende 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 Deklaration 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 (für “global“) 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
[Bearbeiten]Deklaration auf Prozedurebene
[Bearbeiten]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
[Bearbeiten]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
[Bearbeiten]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
[Bearbeiten]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
[Bearbeiten]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 "Kubikmeter: " & 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
[Bearbeiten]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 "Kubikmeter: " & 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
[Bearbeiten]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
[Bearbeiten]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
[Bearbeiten]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
[Bearbeiten]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
[Bearbeiten]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