TOP

VBA-Lektion 9. Prozeduren und Funktionen

In jeder Programmiersprache gibt es Konzepte wie Prozeduren und Funktionen. Sie waren auch in der integrierten Programmiersprache VBA für Excel enthalten.

  • Eine Funktion ist eine Routine, die ein Ergebnis zurückgibt. Ein Funktionsaufruf ist ein Ausdruck und kann in anderen Ausdrücken oder auf der rechten Seite einer Zuweisungsanweisung verwendet werden (in VBA als „Function“ bezeichnet);
  • Eine Prozedur ist jede Routine, die keine Funktion ist. In VBA als „Sub“ (vom Wort „subroutine“) gekennzeichnet.

  • Prozeduren (Public - Private)

    Zu diesem Zeitpunkt sind alle von uns erstellten Prozeduren vom Typ Public, was bedeutet, dass sie von jedem Modul aus zugänglich sind.

     Sub example()
     
     'Identisch mit:
     Public Sub example()
    

    Um die Prozedur nur in einem bestimmten Modul verfügbar zu machen, wird das Schlüsselwort Private verwendet:

    Private Sub example()
    

    Ausführen einer Prozedur mitten in einer anderen Prozedur

    Um eine Prozedur innerhalb einer anderen Prozedur auszuführen, geben Sie einfach ihren Namen ein.

    Hier ist ein sehr einfaches Beispiel dafür:

    Private Sub warning()
        MsgBox "Caution !!!" '"WARNUNG!"
    End Sub
    
    Sub macro_test()
        If Range("A1") = "" Then
            warning '=> Prozedur „warning“ ausführen
        End If
        'usw...
    End Sub
    

    Argumente

    Argumente ermöglichen die Verwendung von Werten aus einer Prozedur in einer Unterprozedur (denken Sie daran, dass Variablen standardmäßig nur in der Prozedur verfügbar sind, in der sie deklariert wurden).

    Private Sub warning(var_text As String)
        MsgBox "Caution : " & var_text & " !"
    End Sub
    
    Sub macro_test()
        If Range("A1") = "" Then
            warning "empty cell"               '„Leere Zelle“
        ElseIf Not IsNumeric(Range("A1")) Then
            warning "non-numerical value"      '„nicht numerischer Wert“
        End If
    End Sub
    

    Der Prozedur „warning“ wurde ein Argument hinzugefügt, in diesem Fall handelt es sich um eine Variable „var_text“ vom Typ „String“ (Ribbon):

    Private Sub warning(var_text As String)
    

    Diese Routine benötigt ein Argument, daher müssen wir nach „warning“ einen Wert einfügen, um sie auszuführen:

    warning "empty cell"
    

    Wenn wir mehrere Argumente schreiben möchten, sollten diese durch Kommas getrennt werden.

    Optionale Argumente

    Wenn die Prozedur Argumente hat, müssen diese standardmäßig angegeben werden. Wenn sie nicht angegeben werden, wird die Prozedur nicht ausgeführt.

    Mit dem Schlüsselwort Optional kann nach einem obligatorischen Argument ein optionales Argument hinzugefügt werden. Beispiel:

    Private Sub dialog_boxes(last_name As String, Optional first_name, Optional age)
    

    Diese Prozedur kann nun mit oder ohne optionalem Argument ausgeführt werden, wie hier:

     'Beispiel 1: Nachnamen anzeigen:
     dialog_boxes last_name1
       
     'Beispiel 2: Wir zeigen den Namen und Vornamen an:
     dialog_boxes last_name1, first_name1
       
     'Beispiel 3: Nachname und Alter anzeigen:
     dialog_boxes last_name1, , age1
       
     'Beispiel 4: Nachname, Vorname und Alter anzeigen:
     dialog_boxes last_name1, first_name1, age1
    

    Argumente müssen in der richtigen Reihenfolge eingegeben werden.

    Um zu testen, ob ein optionales Argument in einer Prozedur vorhanden ist, verwenden wir die Funktion IsMissing. Diese Funktion ist nur mit einigen Funktionstypen (vom Typ Variant) kompatibel und dies ist wichtig, da der Typ der optionalen Argumente nicht deklariert wurde (nicht deklarierter Typ = Variant).

    Hier ist ein Beispiel, das die beiden oben besprochenen Codefragmente verwendet:

    Sub macro_test()
    
        Dim last_name1 As String, first_name1 As String, age1 As Integer
       
        last_name1 = Range("A1")
        first_name1 = Range("B1")
        age1 = Range("C1")
    
        'Beispiel 1: Nachnamen anzeigen:
        dialog_boxes last_name1
       
        'Beispiel 2: Wir zeigen den Namen und Vornamen an:
        dialog_boxes last_name1, first_name1
       
        'Beispiel 3: Nachname und Alter anzeigen:
        dialog_boxes last_name1, , age1
       
        'Beispiel 4: Nachname, Vorname und Alter anzeigen:
        dialog_boxes last_name1, first_name1, age1
    
    End Sub
    
    Private Sub dialog_boxes(last_name As String, Optional first_name, Optional age)
       
        If IsMissing(age) Then 'Wenn die Altersvariable fehlt...
           
            If IsMissing(first_name) Then 'Wenn die Variable Vorname fehlt, dann
            							  'Es wird nur der Nachname angezeigt
               MsgBox last_name
            Else 'Ansonsten werden Nachname und Vorname angezeigt
               MsgBox last_name & " " & first_name
            End If
           
        Else 'Wenn die Altersvariable vorhanden ist...
    
            If IsMissing(first_name) Then 'Wenn die Variable Vorname fehlt, dann
                                          'Nachname und Alter werden angezeigt
               MsgBox last_name & ", " & age & " years old"
            Else 'Ansonsten werden Nachname, Vorname und Alter angezeigt
               MsgBox last_name & " " & first_name & ", " & age & " years old"
            End If
       
        End If
           
    End Sub
    

    Sehen Bild unten (Beispiel 1):

    ByRef - ByVal

    Standardmäßig sind Argumente vom Typ ByRef, was bedeutet, dass, wenn eine Variable als Argument übergeben wird, auch ein Verweis darauf übergeben wird. Mit anderen Worten: Wenn eine Variable durch eine andere Unterprozedur geändert wurde, wird sie auch in der äußeren Prozedur geändert, die diese Unterprozedur aufruft.

    Beispiel:

    Sub macro_test()
        Dim var_number As Integer
        
        var_number = 30
        calcul_square var_number
       
        MsgBox var_number
    End Sub
    
    Private Sub calcul_square(ByRef var_value As Integer) 'ByRef ist optional
                                                          '(ist der Standardwert)
        var_value = var_value * var_value
    End Sub
    

    Zur Verdeutlichung finden Sie unten ein Beispiel dafür, was passiert, wenn die Ausführung des Makros gestartet wird:

     var_number = 30
     'Der Anfangswert der Variablen „var_number“ ist 30
    
     calcul_square var_number
     'Die Unterprozedur wird mit „var_number“ als Argument ausgeführt
    
     Private Sub calcul_square(ByRef var_value As Integer)
     'Die Variable „var_value“ dient gewissermaßen dem schnellen Zugriff auf die Variable „var_number“,
     'Das heißt, wenn die Variable „var_value“ geändert wird, wird auch die Variable „var_number“ geändert
     '(und sie müssen nicht denselben Namen haben)
     var_value = var_value * var_value
     'Der Wert der Variablen „var_value“ wird geändert (und daher wird gleichzeitig auch „var_number“ geändert)
    
     End Sub
     'Ende des Teilverfahrens
    
     MsgBox var_number
     'Die Variable „var_number“ wurde geändert, sodass jetzt 900 im Dialog angezeigt wird
    

    Die zweite Methode ist die Verwendung von ByVal.

    Im Gegensatz zu ByRef, das eine Referenz (Label) übergibt, übergibt ByVal einen Wert, was bedeutet, dass der als Argument übergebene Wert nicht geändert wurde.

    Unten können Sie sehen, wie der vorherige Code und ByVal funktionieren:

     var_number = 30
     'Der Anfangswert der Variablen „var_number“ ist 30
    
     calcul_square var_number
     'Die Unterprozedur wird mit „var_number“ als Argument ausgeführt
    
     Private Sub calcul_square(ByVal var_value As Integer)
     'Die Variable „var_value“ kopiert den Wert der Variablen „var_number“ (die beiden Variablen stehen in keinem Zusammenhang)
    
     var_value = var_value * var_value
     'Der Wert der Variablen „var_value“ hat sich geändert
    
     End Sub
     'Ende der Unterprozedur (in diesem Beispiel hat die Unterprozedur keine Auswirkung auf irgendetwas)
    
     MsgBox var_number
     'Die Variable „var_number“ wurde nicht geändert und daher wird im Dialogfeld 30 angezeigt
    

    Was Sie beachten müssen: Verwenden Sie ByVal, wenn die Variable nicht geändert werden soll.

    Funktionen

    Der Hauptunterschied zwischen einer Prozedur und einer Funktion besteht darin, dass eine Funktion einen Wert zurückgibt.

    Hier ist ein einfaches Beispiel:

    Function square(var_number)
        square = var_number ^ 2 'Die Funktion „Quadrat“ gibt den Wert „Quadratwurzel“ zurück
    End Function
    
    Sub macro_test()
        Dim result As Double
        result = square(9.876) 'Der Ergebnisvariablen wird der Wert zugewiesen, der von der Funktion berechnet wurde
        MsgBox result 'Das Ergebnis wird angezeigt (in diesem Fall das Quadrat von 9,876)
    End Sub
    

    Die Funktion kann auf einem Arbeitsblatt wie jede andere Funktion in Excel verwendet werden.

    So erhalten Sie beispielsweise das Quadrat des in Zelle A1 eingegebenen Werts: