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