In jeder Programmiersprache gibt es Konzepte wie Prozeduren und Funktionen. Sie waren auch in der integrierten Programmiersprache VBA für Excel enthalten.
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()
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 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.
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):
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.
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: