HERBERS Excel-Forum - VBA-Basics

Thema: Gültigkeit von Variablen und Konstanten

Inhaltsverzeichnis
  • 1 Die Gültigkeit:
  • 2 Die Beispiele
  • Die Gültigkeit:

    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.

    • 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