Prozeduren: Unterschied zwischen den Versionen

Aus VBA-wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „== Sub-Prozeduren == === Einfache Unterprozeduren === Der Rumpf einer Sub-Prozedur wird in der hier abgebildeten Form definiert: <span style="Color:blue">Sub…“)
 
Keine Bearbeitungszusammenfassung
Zeile 3: Zeile 3:
=== Einfache Unterprozeduren ===
=== Einfache Unterprozeduren ===


Der Rumpf einer Sub-Prozedur wird in der hier abgebildeten Form definiert: <span style="Color:blue">Sub </span>SubProcedureName<span style="Color:gray">()</span> MsgBox <span style="Color:gray">"Hallo!"</span> <span style="Color:blue">End Sub</span> Diese Prozedur kann nun direkt ausgeführt (F5 oder 'Ausführen' im VBA-Editor wählen) oder von einer anderen Prozedur aufgerufen werden: <span style="Color:blue">Sub </span>CallSubProcedureName<span style="Color:gray">()</span> SubProcedureName <span style="Color:green">' Aufruf der Prozedur durch Angabe des Namens</span> <span style="Color:blue">End Sub</span>
Der Rumpf einer Sub-Prozedur wird in der hier abgebildeten Form definiert:
 
<span style="Color:blue">Sub </span>SubProcedureName<span style="Color:gray">()</span>
   
    MsgBox <span style="Color:gray">"Hallo!"</span>
<span style="Color:blue">End Sub</span>
 
Diese Prozedur kann nun direkt ausgeführt (F5 oder 'Ausführen' im VBA-Editor wählen) oder von einer anderen Prozedur aufgerufen werden:
 
<span style="Color:blue">Sub </span>CallSubProcedureName<span style="Color:gray">()</span>
    SubProcedureName     <span style="Color:green">' Aufruf der Prozedur durch Angabe des Namens</span>
<span style="Color:blue">End Sub</span>


=== Sub-Prozedur mit Übergabeparameter(n) ===
=== Sub-Prozedur mit Übergabeparameter(n) ===


Wenn die Ausführung einer Prozedur zusätzliche Informationen erfordert, können diese in sogenannten Übergabeparametern (Argumenten) untergebracht werden.
Wenn die Ausführung einer Prozedur zusätzliche Informationen erfordert, können diese in sogenannten Übergabeparametern (Argumenten) untergebracht werden.
* Übergabeparameter werden zu einem wichtigen Bestandteil der Prozedur
* Übergabeparameter werden zu einem wichtigen Bestandteil der Prozedur
* Übergabeparameter gelten innerhalb der Prozedur als eigene Variablen und können als solche verwendet werden
* Übergabeparameter gelten innerhalb der Prozedur als eigene Variablen und können als solche verwendet werden
* Die Namen der Übergabeparameter müssen nicht für den Aufruf aus einer anderen Prozedur verwendet werden, lediglich die Reihenfolge muss eingehalten werden ;Beispiel mit einem Übergabeparameter <span style="Color:blue">Sub </span>SubProcedureWithArgument<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strArgument<span style="Color:blue"> As String</span><span style="Color:gray">)</span> <span style="Color:green">' Rumpf einer Sub-Prozedur mit einem Argument in den runden Klammern,</span> <span style="Color:green">' welches als Zeichenkette erwartet wird.</span> <span style="Color:green">' Dieses Argument ist ein wichtiger Bestandteil der Prozedur und wird in die Befehlskette</span> <span style="Color:green">' integriert:</span> <span style="Color:green">' Beispiel: Ein Dialog zeigt den übergebenen Text an</span> MsgBox strArgument <span style="Color:green">' Eine Prozedur mit Übergabeparametern kann NICHT direkt ausgeführt werden,</span> <span style="Color:green">' denn der VBA-Editor kann der Prozedur nicht die geforderten Informationen liefern.</span> <span style="Color:blue"> End Sub</span> <span style="Color:blue"> Sub </span>CallSubProcedureWithArgument<span style="Color:gray">()</span> <span style="Color:green">' Aufruf der Prozedur:</span> SubProcedureWithArgument <span style="Color:gray">"Hallo!"</span> <span style="Color:blue">End Sub</span> ;Beispiel mit mehreren Übergabeparametern: <span style="Color:blue">Sub </span>SubProcedureWithArguments<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strArgument<span style="Color:blue"> As String</span><span style="Color:gray">,</span><span style="Color:blue"> ByVal </span>intSecondArgument<span style="Color:blue"> As Integer</span><span style="Color:gray">)</span> <span style="Color:green">' Wenn eine Prozedur mehrere Argumente benötigt, werden diese mit Kommata getrennt angegeben</span> <span style="Color:green">' Beispiel: Ein Dialog zeigt den übergebenen Text an und das Ergebnis der quadierten Zahl</span> MsgBox strArgument & vbNewLine & <span style="Color:gray">"Die Zahl "</span> & intSecondArgument & <span style="Color:gray">" im Quadrat: "</span> & intSecondArgument <span style="Color:gray">^</span> <span style="Color:gray">2</span><span style="Color:blue"> End Sub</span> <span style="Color:blue"> Sub </span>CallSubProcedureWithArguments<span style="Color:gray">()</span> <span style="Color:green">' Aufruf der Prozedur:</span> <span style="Color:green">' Beim Aufruf einer Prozedur mit Argumenten werden KEINE Klammern angegeben!</span> SubProcedureWithArguments <span style="Color:gray">"Hallo",</span> <span style="Color:gray">27</span><span style="Color:blue"> End Sub</span>
* Die Namen der Übergabeparameter müssen nicht für den Aufruf aus einer anderen Prozedur verwendet werden, lediglich die Reihenfolge muss eingehalten werden
 
 
;Beispiel mit einem Übergabeparameter
 
<span style="Color:blue">Sub </span>SubProcedureWithArgument<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strArgument<span style="Color:blue"> As String</span><span style="Color:gray">)</span>
    <span style="Color:green">' Rumpf einer Sub-Prozedur mit einem Argument in den runden Klammern,</span>
    <span style="Color:green">' welches als Zeichenkette erwartet wird.</span>
    <span style="Color:green">' Dieses Argument ist ein wichtiger Bestandteil der Prozedur und wird in die Befehlskette</span>
    <span style="Color:green">' integriert:</span>
   
    <span style="Color:green">' Beispiel: Ein Dialog zeigt den übergebenen Text an</span>
    MsgBox strArgument
   
    <span style="Color:green">' Eine Prozedur mit Übergabeparametern kann NICHT direkt ausgeführt werden,</span>
    <span style="Color:green">' denn der VBA-Editor kann der Prozedur nicht die geforderten Informationen liefern.</span>
    <span style="Color:blue">
End Sub</span>
 
<span style="Color:blue">
Sub </span>CallSubProcedureWithArgument<span style="Color:gray">()</span>
   
    <span style="Color:green">' Aufruf der Prozedur:</span>
    SubProcedureWithArgument <span style="Color:gray">"Hallo!"</span>
<span style="Color:blue">End Sub</span>
 
 
;Beispiel mit mehreren Übergabeparametern:
 
<span style="Color:blue">Sub </span>SubProcedureWithArguments<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strArgument<span style="Color:blue"> As String</span><span style="Color:gray">,</span><span style="Color:blue"> ByVal </span>intSecondArgument<span style="Color:blue"> As Integer</span><span style="Color:gray">)</span>
    <span style="Color:green">' Wenn eine Prozedur mehrere Argumente benötigt, werden diese mit Kommata getrennt angegeben</span>
   
    <span style="Color:green">' Beispiel: Ein Dialog zeigt den übergebenen Text an und das Ergebnis der quadierten Zahl</span>
    MsgBox strArgument & vbNewLine & <span style="Color:gray">"Die Zahl "</span> & intSecondArgument & <span style="Color:gray">" im Quadrat: "</span> & intSecondArgument <span style="Color:gray">^</span> <span style="Color:gray">2</span><span style="Color:blue">
End Sub</span>
 
<span style="Color:blue">
Sub </span>CallSubProcedureWithArguments<span style="Color:gray">()</span>
    <span style="Color:green">' Aufruf der Prozedur:</span>
    <span style="Color:green">' Beim Aufruf einer Prozedur mit Argumenten werden KEINE Klammern angegeben!</span>
   
    SubProcedureWithArguments <span style="Color:gray">"Hallo",</span> <span style="Color:gray">27</span><span style="Color:blue">
End Sub</span>


== Funktionen ==
== Funktionen ==
Zeile 18: Zeile 75:
=== Deklaration ===
=== Deklaration ===


;Beispiel einer einfachen Funktion <span style="Color:blue">Function </span>FunctionName<span style="Color:gray">()</span><span style="Color:blue"> As String</span> <span style="Color:green">' Der Funktionsrumpf ist dem der Sub-Prozedur sehr ähnlich, erhält aber zusätzlich einen Datentyp</span> <span style="Color:green">' Der Datentyp bestimmt, welche Art von Ergebnis zurückgegeben wird</span> <span style="Color:green">' Der Name der Funktion wird innerhalb der Funktion als Variable verwendet und gibt so den</span> <span style="Color:green">' gewünschten Wert zurück</span> FunctionName <span style="Color:gray">=</span> <span style="Color:gray">"Rückgabewert"</span> <span style="Color:blue"> End Function</span>
;Beispiel einer einfachen Funktion
; Beispiel einer Funktion mit Übergabeparameter(n) <span style="Color:blue"> Function </span>FunctionWithArguments<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strArgument<span style="Color:blue"> As String</span><span style="Color:gray">,</span><span style="Color:blue"> ByVal </span>intSecondArgument<span style="Color:blue"> As Integer</span><span style="Color:gray">)</span><span style="Color:blue"> As String</span> <span style="Color:green">' Die Erweiterung einer Funktion um Argumente erfolgt analog zur Sub-Prozedur mit Argumenten</span> <span style="Color:green">' Beispiel: diese Funktion wiederholt den ersten Buchstaben des angegebenen Text so oft,</span> <span style="Color:green">' wie im zweiten Argument angegeben ist</span> FunctionWithArguments <span style="Color:gray">=</span> String<span style="Color:gray">(</span>intSecondArgument<span style="Color:gray">,</span> strArgument<span style="Color:gray">)</span> <span style="Color:blue"> End Function</span>
<span style="Color:blue">Function </span>FunctionName<span style="Color:gray">()</span><span style="Color:blue"> As String</span>
    <span style="Color:green">' Der Funktionsrumpf ist dem der Sub-Prozedur sehr ähnlich, erhält aber zusätzlich einen Datentyp</span>
    <span style="Color:green">' Der Datentyp bestimmt, welche Art von Ergebnis zurückgegeben wird</span>
    <span style="Color:green">' Der Name der Funktion wird innerhalb der Funktion als Variable verwendet und gibt so den</span>
    <span style="Color:green">' gewünschten Wert zurück</span>  
    FunctionName <span style="Color:gray">=</span> <span style="Color:gray">"Rückgabewert"</span>
    <span style="Color:blue">
End Function</span>
 
 
; Beispiel einer Funktion mit Übergabeparameter(n)
<span style="Color:blue">
Function </span>FunctionWithArguments<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strArgument<span style="Color:blue"> As String</span><span style="Color:gray">,</span><span style="Color:blue"> ByVal </span>intSecondArgument<span style="Color:blue"> As Integer</span><span style="Color:gray">)</span><span style="Color:blue"> As String</span>
    <span style="Color:green">' Die Erweiterung einer Funktion um Argumente erfolgt analog zur Sub-Prozedur mit Argumenten</span>
   
    <span style="Color:green">' Beispiel: diese Funktion wiederholt den ersten Buchstaben des angegebenen Text so oft,</span>
    <span style="Color:green">' wie im zweiten Argument angegeben ist</span>
   
    FunctionWithArguments <span style="Color:gray">=</span> String<span style="Color:gray">(</span>intSecondArgument<span style="Color:gray">,</span> strArgument<span style="Color:gray">)</span>
    <span style="Color:blue">
End Function</span>


=== Aufruf (Klammersetzung) ===
=== Aufruf (Klammersetzung) ===


Beim Aufruf von Funktionen müssen wir im VBA die besondere Klammersetzung beachten. Bitte sehen Sie sich hierzu folgende Prozedur mit all seinen Kommentaren an: <span style="Color:blue">Sub </span>UseFunctions<span style="Color:gray">()</span> <span style="Color:blue"> Dim </span>strResult<span style="Color:blue"> As String</span> <span style="Color:green">' Aufruf der Funktion ohne Verwendung des Rückgabewertes wie eine Prozedur</span> FunctionName <span style="Color:green">' Beispiel: MsgBox-Funktion wird sehr oft aufgerufen, ohne dass der Rückgabewert beachtet wird:</span> <span style="Color:green">' WICHTIG: KEINE KLAMMERN!!!</span> MsgBox <span style="Color:gray">"Hallo!"</span> <span style="Color:green">' Mehrere Parameter werden wie gehabt durch Kommas getrennt</span> MsgBox <span style="Color:gray">"Hallo!",</span> vbOKOnly <span style="Color:green">' Aufruf mit Verwendung des Rückgabewertes:</span> <span style="Color:green">' Der Name der Funktion wird wie eine Variable eingesetzt und verwendet</span> strResult <span style="Color:gray">=</span> FunctionName Debug<span style="Color:gray">.</span>Print FunctionName <span style="Color:blue">If </span>FunctionName <span style="Color:gray">=</span> <span style="Color:gray">"EtwasAnderes"</span><span style="Color:blue"> Then</span> MsgBox <span style="Color:gray">"Meldung"</span> <span style="Color:blue"> End If</span> <span style="Color:green">' Wenn links des Funktionsnamens weitere Anweisungen erscheinen, MÜSSEN Klammern gesetzt werden,</span> <span style="Color:green">' wenn Übergabeparameter angegeben werden</span> strResult <span style="Color:gray">=</span> FunctionName strResult <span style="Color:gray">=</span> FunctionName<span style="Color:gray">()</span> <span style="Color:green">' Ohne Argument: Klammern optional</span> strResult <span style="Color:gray">=</span> FunctionWithArguments<span style="Color:gray">("y",</span> <span style="Color:gray">3)</span> <span style="Color:green">' Mit Parameter: Klammern nötig!</span> Debug<span style="Color:gray">.</span>Print FunctionWithArguments<span style="Color:gray">("y",</span> <span style="Color:gray">3)</span> <span style="Color:blue"> If </span>FunctionWithArguments<span style="Color:gray">("a",</span> <span style="Color:gray">3)</span> <span style="Color:gray">=</span> <span style="Color:gray">"aaa"</span><span style="Color:blue"> Then</span> MsgBox <span style="Color:gray">"Treffer!"</span> <span style="Color:blue"> End If</span> <span style="Color:green">' Beispiel Messagebox:</span> <span style="Color:green">' Zeigt Meldung an, der gedrückte Knopf zur Bestätigung interesseiert nicht</span> MsgBox <span style="Color:gray">"Hallo!"</span> <span style="Color:green">' Zeigt eine Abfrage an, die Bestätigung wird in der If-Abfrage ausgewertet</span> <span style="Color:blue"> If </span>MsgBox<span style="Color:gray">("Bitte bestätigen",</span> vbYesNo<span style="Color:gray">)</span> <span style="Color:gray">=</span> vbYes<span style="Color:blue"> Then</span> MsgBox <span style="Color:gray">"Prima!"</span> <span style="Color:blue"> End If</span> <span style="Color:green">' Ebenfalls werden Klammern in folgenden Fällen gesetzt:</span> <span style="Color:green">' Bei Eigenschaften:</span> Cells<span style="Color:gray">(1,</span> <span style="Color:gray">2)</span> <span style="Color:gray">=</span> <span style="Color:gray">"Test"</span> <span style="Color:green">' Nach dem Befehl mit Parametern erscheint ein '='</span> <span style="Color:green">' Bei näher spezifizierten Objekten</span> Cells<span style="Color:gray">(1,</span> <span style="Color:gray">2).</span>Select<span style="Color:blue"> End Sub</span>
Beim Aufruf von Funktionen müssen wir im VBA die besondere Klammersetzung beachten. Bitte sehen Sie sich hierzu folgende Prozedur mit all seinen Kommentaren an:
 
<span style="Color:blue">Sub </span>UseFunctions<span style="Color:gray">()</span>
    <span style="Color:blue"> Dim </span>strResult<span style="Color:blue"> As String</span>
   
    <span style="Color:green">' Aufruf der Funktion ohne Verwendung des Rückgabewertes wie eine Prozedur</span>
    FunctionName
   
    <span style="Color:green">' Beispiel: MsgBox-Funktion wird sehr oft aufgerufen, ohne dass der Rückgabewert beachtet wird:</span>
    <span style="Color:green">' WICHTIG: KEINE KLAMMERN!!!</span>
    MsgBox <span style="Color:gray">"Hallo!"</span>
   
    <span style="Color:green">' Mehrere Parameter werden wie gehabt durch Kommas getrennt</span>
    MsgBox <span style="Color:gray">"Hallo!",</span> vbOKOnly
   
    <span style="Color:green">' Aufruf mit Verwendung des Rückgabewertes:</span>
    <span style="Color:green">' Der Name der Funktion wird wie eine Variable eingesetzt und verwendet</span>
    strResult <span style="Color:gray">=</span> FunctionName
    Debug<span style="Color:gray">.</span>Print FunctionName
    <span style="Color:blue">If </span>FunctionName <span style="Color:gray">=</span> <span style="Color:gray">"EtwasAnderes"</span><span style="Color:blue"> Then</span>
        MsgBox <span style="Color:gray">"Meldung"</span>
    <span style="Color:blue"> End If</span>
   
   
    <span style="Color:green">' Wenn links des Funktionsnamens weitere Anweisungen erscheinen, MÜSSEN Klammern gesetzt werden,</span>
    <span style="Color:green">' wenn Übergabeparameter angegeben werden</span>
    strResult <span style="Color:gray">=</span> FunctionName
    strResult <span style="Color:gray">=</span> FunctionName<span style="Color:gray">()</span>                       <span style="Color:green">' Ohne Argument: Klammern optional</span>
    strResult <span style="Color:gray">=</span> FunctionWithArguments<span style="Color:gray">("y",</span> <span style="Color:gray">3)</span>       <span style="Color:green">' Mit Parameter: Klammern nötig!</span>
    Debug<span style="Color:gray">.</span>Print FunctionWithArguments<span style="Color:gray">("y",</span> <span style="Color:gray">3)</span>
    <span style="Color:blue"> If </span>FunctionWithArguments<span style="Color:gray">("a",</span> <span style="Color:gray">3)</span> <span style="Color:gray">=</span> <span style="Color:gray">"aaa"</span><span style="Color:blue"> Then</span>
        MsgBox <span style="Color:gray">"Treffer!"</span>
    <span style="Color:blue"> End If</span>
   
    <span style="Color:green">' Beispiel Messagebox:</span>
    <span style="Color:green">' Zeigt Meldung an, der gedrückte Knopf zur Bestätigung interesseiert nicht</span>
    MsgBox <span style="Color:gray">"Hallo!"</span>
   
    <span style="Color:green">' Zeigt eine Abfrage an, die Bestätigung wird in der If-Abfrage ausgewertet</span>
    <span style="Color:blue"> If </span>MsgBox<span style="Color:gray">("Bitte bestätigen",</span> vbYesNo<span style="Color:gray">)</span> <span style="Color:gray">=</span> vbYes<span style="Color:blue"> Then</span>
        MsgBox <span style="Color:gray">"Prima!"</span>
    <span style="Color:blue"> End If</span>
   
   
    <span style="Color:green">' Ebenfalls werden Klammern in folgenden Fällen gesetzt:</span>
    <span style="Color:green">' Bei Eigenschaften:</span>
    Cells<span style="Color:gray">(1,</span> <span style="Color:gray">2)</span> <span style="Color:gray">=</span> <span style="Color:gray">"Test"</span>     <span style="Color:green">' Nach dem Befehl mit Parametern erscheint ein '='</span>
    <span style="Color:green">' Bei näher spezifizierten Objekten</span>
    Cells<span style="Color:gray">(1,</span> <span style="Color:gray">2).</span>Select<span style="Color:blue">
End Sub</span>


== Eigenschaften ==
== Eigenschaften ==


<span style="Color:green">' 'Property Get' verhält sich identisch zu einer Funktion</span> <span style="Color:blue"> Private Property </span>Get FirstWord<span style="Color:gray">()</span><span style="Color:blue"> As String</span> <span style="Color:blue"> If </span>ActiveDocument<span style="Color:gray">.</span>Words<span style="Color:gray">.</span>Count <span style="Color:gray">></span> <span style="Color:gray">0</span><span style="Color:blue"> Then</span> FirstWord <span style="Color:gray">=</span> ActiveDocument<span style="Color:gray">.</span>Words<span style="Color:gray">.</span>Item<span style="Color:gray">(1).</span>Text <span style="Color:blue"> End If End Property</span> <span style="Color:green">' 'Property Let' übernimmt den gewünschten Wert als Parameter. ' Dieser Parameter muss den gleichen Datentyp haben wie ' die 'Property Get'-Funktion</span> <span style="Color:blue"> Private Property </span>Let FirstWord<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strWord<span style="Color:blue"> As String</span><span style="Color:gray">)</span> <span style="Color:blue"> If </span>ActiveDocument<span style="Color:gray">.</span>Words<span style="Color:gray">.</span>Count <span style="Color:gray">=</span> <span style="Color:gray">0</span><span style="Color:blue"> Then</span> ActiveDocument<span style="Color:gray">.</span>Range<span style="Color:gray">.</span>Text <span style="Color:gray">=</span> strWord <span style="Color:blue"> Else</span> ActiveDocument<span style="Color:gray">.</span>Words<span style="Color:gray">.</span>Item<span style="Color:gray">(1).</span>Text <span style="Color:gray">=</span> strWord <span style="Color:blue"> End If End Property</span> <span style="Color:green">' 'Property Get' mit Parameter zur Bestimmung des gewünschten Wertes</span> <span style="Color:blue"> Public Property </span>Get BookmarkText<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strName<span style="Color:blue"> As String</span><span style="Color:gray">)</span><span style="Color:blue"> As String</span> <span style="Color:blue"> If </span>ActiveDocument<span style="Color:gray">.</span>Bookmarks<span style="Color:gray">.</span>Exists<span style="Color:gray">(</span>strName<span style="Color:gray">)</span> <span style="Color:gray">=</span><span style="Color:blue"> False Then Exit Property</span> BookmarkText <span style="Color:gray">=</span> ActiveDocument<span style="Color:gray">.</span>Bookmarks<span style="Color:gray">.</span>Item<span style="Color:gray">(</span>strName<span style="Color:gray">).</span>Range<span style="Color:gray">.</span>Text<span style="Color:blue"> End Property</span> <span style="Color:green">' Wenn Parameter verwendet werden, gilt der letzte Parameter als Übergabewert (Set Parameter). ' Die Anzahl der bestimmenden Parameter (alle Parameter außer dem letzten) ' müssen die gleiche Anzah der gleichen Datentypen der 'Property Get'-Funktion entsprechen!</span> <span style="Color:green">' ACHTUNG: Die Namen der Parameter müssen ebenfalls übereinstimmen!!!</span> <span style="Color:blue"> Public Property </span>Let BookmarkText<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strName<span style="Color:blue"> As String</span><span style="Color:gray">,</span><span style="Color:blue"> ByVal </span>strValue<span style="Color:blue"> As String</span><span style="Color:gray">)</span> <span style="Color:blue"> Dim </span>rngBookmark<span style="Color:blue"> As </span>Range <span style="Color:blue"> If </span>ActiveDocument<span style="Color:gray">.</span>Bookmarks<span style="Color:gray">.</span>Exists<span style="Color:gray">(</span>strName<span style="Color:gray">)</span> <span style="Color:gray">=</span><span style="Color:blue"> False Then</span> MsgBox <span style="Color:gray">"Die Textmarke '"</span> & strName & <span style="Color:gray">"' kann nicht gefunden werden."</span> <span style="Color:blue"> Exit Property</span> <span style="Color:blue"> End If</span> <span style="Color:blue"> Set </span>rngBookmark <span style="Color:gray">=</span> ActiveDocument<span style="Color:gray">.</span>Bookmarks<span style="Color:gray">.</span>Item<span style="Color:gray">(</span>strName<span style="Color:gray">).</span>Range <span style="Color:green">' Die Textmarke wird in dem Moment, in dem der Text neu gesetzt wird, gelöscht.</span> <span style="Color:green">' Der Bereich nimmt jedoch den neuen Text auf und enthält danach diesen neuen Bereich.</span> rngBookmark<span style="Color:gray">.</span>Text <span style="Color:gray">=</span> strValue rngBookmark<span style="Color:gray">.</span>Bookmarks<span style="Color:gray">.</span>Add strName<span style="Color:blue"> End Property</span> <span style="Color:blue"> Private Sub </span>TestFirstWord<span style="Color:gray">()</span> <span style="Color:blue"> Dim </span>strWord<span style="Color:blue"> As String</span> <span style="Color:green">' Großer Vorteil von Properties:</span> <span style="Color:green">' Unter dem gleichen Namen können anhand des Zusammenhangs das Abfragen und das Setzen</span> <span style="Color:green">' eines Wertes untergebracht werden!</span> strWord <span style="Color:gray">=</span> FirstWord FirstWord <span style="Color:gray">=</span> <span style="Color:gray">"Adresse"</span> Debug<span style="Color:gray">.</span>Print FirstWord <span style="Color:green">' Als Gegensatz mit Funktion und Prozedur:</span> <span style="Color:green">' Unterschiedliche Benennung -> wie benenne ich die Prozeduren, damit die Intention klar ist?</span> <span style="Color:green">' ReadValue, WriteValue, ChangeValue, LoadValue, ReturnValue ...?</span> <span style="Color:green">' Übergabe des neuen Wertes als Parameter -> Nur aus dem Zusammenhang erkennt man, dass dies der neue Wert ist.</span> <span style="Color:green">' SetBookmarkText "bkmEMail", "b.beispiel@muster.ag"</span> <span style="Color:green">' strText = GetBookmarkText("bkmDepartment")</span> <span style="Color:blue">End Sub</span> <span style="Color:blue"> Public Sub </span>SetAndReadBookmarks<span style="Color:gray">()</span> <span style="Color:blue"> Dim </span>strValue<span style="Color:blue"> As String</span> BookmarkText<span style="Color:gray">("bkmAuth")</span> <span style="Color:gray">=</span> <span style="Color:gray">"Max Muster"</span> BookmarkText<span style="Color:gray">("bkmAuthor")</span> <span style="Color:gray">=</span> <span style="Color:gray">"Berta Beispiel"</span> BookmarkText<span style="Color:gray">("bkmDepartment")</span> <span style="Color:gray">=</span> <span style="Color:gray">"Neue Medien"</span> BookmarkText<span style="Color:gray">("bkmPhone")</span> <span style="Color:gray">=</span> <span style="Color:gray">"+49 1234589"</span> BookmarkText<span style="Color:gray">("bkmEMail")</span> <span style="Color:gray">=</span> <span style="Color:gray">"b.beispiel@muster.ag"</span> strValue <span style="Color:gray">=</span> BookmarkText<span style="Color:gray">("bkmDepartment")</span> Debug<span style="Color:gray">.</span>Print strValue Debug<span style="Color:gray">.</span>Print BookmarkText<span style="Color:gray">("bkmAuthor")</span><span style="Color:blue"> End Sub</span>
 
<span style="Color:green">' 'Property Get' verhält sich identisch zu einer Funktion</span>
<span style="Color:blue">
Private Property </span>Get FirstWord<span style="Color:gray">()</span><span style="Color:blue"> As String</span>
   
    <span style="Color:blue"> If </span>ActiveDocument<span style="Color:gray">.</span>Words<span style="Color:gray">.</span>Count <span style="Color:gray">></span> <span style="Color:gray">0</span><span style="Color:blue"> Then</span>
        FirstWord <span style="Color:gray">=</span> ActiveDocument<span style="Color:gray">.</span>Words<span style="Color:gray">.</span>Item<span style="Color:gray">(1).</span>Text
    <span style="Color:blue"> End If
End Property</span>
 
 
 
<span style="Color:green">' 'Property Let' übernimmt den gewünschten Wert als Parameter.
' Dieser Parameter muss den gleichen Datentyp haben wie
' die 'Property Get'-Funktion</span>
<span style="Color:blue">
Private Property </span>Let FirstWord<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strWord<span style="Color:blue"> As String</span><span style="Color:gray">)</span>
   
    <span style="Color:blue"> If </span>ActiveDocument<span style="Color:gray">.</span>Words<span style="Color:gray">.</span>Count <span style="Color:gray">=</span> <span style="Color:gray">0</span><span style="Color:blue"> Then</span>
        ActiveDocument<span style="Color:gray">.</span>Range<span style="Color:gray">.</span>Text <span style="Color:gray">=</span> strWord
    <span style="Color:blue"> Else</span>
        ActiveDocument<span style="Color:gray">.</span>Words<span style="Color:gray">.</span>Item<span style="Color:gray">(1).</span>Text <span style="Color:gray">=</span> strWord
    <span style="Color:blue"> End If
End Property</span>
 
 
 
<span style="Color:green">' 'Property Get' mit Parameter zur Bestimmung des gewünschten Wertes</span>
<span style="Color:blue">
Public Property </span>Get BookmarkText<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strName<span style="Color:blue"> As String</span><span style="Color:gray">)</span><span style="Color:blue"> As String</span>
   
    <span style="Color:blue"> If </span>ActiveDocument<span style="Color:gray">.</span>Bookmarks<span style="Color:gray">.</span>Exists<span style="Color:gray">(</span>strName<span style="Color:gray">)</span> <span style="Color:gray">=</span><span style="Color:blue"> False Then Exit Property</span>
    BookmarkText <span style="Color:gray">=</span> ActiveDocument<span style="Color:gray">.</span>Bookmarks<span style="Color:gray">.</span>Item<span style="Color:gray">(</span>strName<span style="Color:gray">).</span>Range<span style="Color:gray">.</span>Text<span style="Color:blue">
End Property</span>
 
 
<span style="Color:green">' Wenn Parameter verwendet werden, gilt der letzte Parameter als Übergabewert (Set Parameter).
' Die Anzahl der bestimmenden Parameter (alle Parameter außer dem letzten)
' müssen die gleiche Anzah der gleichen Datentypen der 'Property Get'-Funktion entsprechen!</span>  
<span style="Color:green">' ACHTUNG: Die Namen der Parameter müssen ebenfalls übereinstimmen!!!</span>
<span style="Color:blue">
Public Property </span>Let BookmarkText<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strName<span style="Color:blue"> As String</span><span style="Color:gray">,</span><span style="Color:blue"> ByVal </span>strValue<span style="Color:blue"> As String</span><span style="Color:gray">)</span>
    <span style="Color:blue"> Dim </span>rngBookmark<span style="Color:blue"> As </span>Range
   
    <span style="Color:blue"> If </span>ActiveDocument<span style="Color:gray">.</span>Bookmarks<span style="Color:gray">.</span>Exists<span style="Color:gray">(</span>strName<span style="Color:gray">)</span> <span style="Color:gray">=</span><span style="Color:blue"> False Then</span>
        MsgBox <span style="Color:gray">"Die Textmarke '"</span> & strName & <span style="Color:gray">"' kann nicht gefunden werden."</span>
        <span style="Color:blue"> Exit Property</span>
    <span style="Color:blue"> End If</span>
    <span style="Color:blue"> Set </span>rngBookmark <span style="Color:gray">=</span> ActiveDocument<span style="Color:gray">.</span>Bookmarks<span style="Color:gray">.</span>Item<span style="Color:gray">(</span>strName<span style="Color:gray">).</span>Range
    <span style="Color:green">' Die Textmarke wird in dem Moment, in dem der Text neu gesetzt wird, gelöscht.</span>
    <span style="Color:green">' Der Bereich nimmt jedoch den neuen Text auf und enthält danach diesen neuen Bereich.</span>
    rngBookmark<span style="Color:gray">.</span>Text <span style="Color:gray">=</span> strValue
    rngBookmark<span style="Color:gray">.</span>Bookmarks<span style="Color:gray">.</span>Add strName<span style="Color:blue">
End Property</span>
 
<span style="Color:blue">
Private Sub </span>TestFirstWord<span style="Color:gray">()</span>
    <span style="Color:blue"> Dim </span>strWord<span style="Color:blue"> As String</span>
   
    <span style="Color:green">' Großer Vorteil von Properties:</span>
    <span style="Color:green">' Unter dem gleichen Namen können anhand des Zusammenhangs das Abfragen und das Setzen</span>
    <span style="Color:green">' eines Wertes untergebracht werden!</span>
    strWord <span style="Color:gray">=</span> FirstWord
    FirstWord <span style="Color:gray">=</span> <span style="Color:gray">"Adresse"</span>
    Debug<span style="Color:gray">.</span>Print FirstWord
   
    <span style="Color:green">' Als Gegensatz mit Funktion und Prozedur:</span>
    <span style="Color:green">' Unterschiedliche Benennung -> wie benenne ich die Prozeduren, damit die Intention klar ist?</span>
    <span style="Color:green">' ReadValue, WriteValue, ChangeValue, LoadValue, ReturnValue ...?</span>
    <span style="Color:green">' Übergabe des neuen Wertes als Parameter -> Nur aus dem Zusammenhang erkennt man, dass dies der neue Wert ist.</span>
    <span style="Color:green">'     SetBookmarkText "bkmEMail", "b.beispiel@muster.ag"</span>
    <span style="Color:green">'     strText = GetBookmarkText("bkmDepartment")</span>
<span style="Color:blue">End Sub</span>
 
<span style="Color:blue">
Public Sub </span>SetAndReadBookmarks<span style="Color:gray">()</span>
    <span style="Color:blue"> Dim </span>strValue<span style="Color:blue"> As String</span>
   
    BookmarkText<span style="Color:gray">("bkmAuth")</span> <span style="Color:gray">=</span> <span style="Color:gray">"Max Muster"</span>
    BookmarkText<span style="Color:gray">("bkmAuthor")</span> <span style="Color:gray">=</span> <span style="Color:gray">"Berta Beispiel"</span>
    BookmarkText<span style="Color:gray">("bkmDepartment")</span> <span style="Color:gray">=</span> <span style="Color:gray">"Neue Medien"</span>
    BookmarkText<span style="Color:gray">("bkmPhone")</span> <span style="Color:gray">=</span> <span style="Color:gray">"+49 1234589"</span>
    BookmarkText<span style="Color:gray">("bkmEMail")</span> <span style="Color:gray">=</span> <span style="Color:gray">"b.beispiel@muster.ag"</span>
   
    strValue <span style="Color:gray">=</span> BookmarkText<span style="Color:gray">("bkmDepartment")</span>
    Debug<span style="Color:gray">.</span>Print strValue
    Debug<span style="Color:gray">.</span>Print BookmarkText<span style="Color:gray">("bkmAuthor")</span><span style="Color:blue">
End Sub</span>


== Geltungsbereich ==
== Geltungsbereich ==


Der Geltungsbereich einer Prozedur kann eingeschränkt werden, indem man bei der Definition ein 'Private' voranstellt: <span style="Color:blue">Private Sub </span>SubProcedure<span style="Color:gray">()</span> <span style="Color:green">' ...</span> <span style="Color:blue">End Sub</span> Wenn kein 'Private' der Prozedur vorangestellt ist, wird die Prozedur automatisch als öffentlich ('Public') betrachtet.
Der Geltungsbereich einer Prozedur kann eingeschränkt werden, indem man bei der Definition ein 'Private' voranstellt:
 
<span style="Color:blue">Private Sub </span>SubProcedure<span style="Color:gray">()</span>
    <span style="Color:green">' ...</span>
<span style="Color:blue">End Sub</span>
 
Wenn kein 'Private' der Prozedur vorangestellt ist, wird die Prozedur automatisch als öffentlich ('Public') betrachtet.


=== Modulweite Prozeduren: 'Private' ===
=== Modulweite Prozeduren: 'Private' ===
Zeile 39: Zeile 261:
=== Projektweite Prozeduren: 'Public' in einem Modul ===
=== Projektweite Prozeduren: 'Public' in einem Modul ===


Wenn Sie die Funktionalität einer Prozedur immer und von allen anderen Modulen in Ihrem Projekt zur Verfügung stellen möchten, definieren Sie die Prozedur in einem Modul (nicht in einem Klassenmodul!) und stellen der Definition das 'Public' voran: <span style="Color:blue">Private Sub </span>StartDoingThings<span style="Color:gray">()</span> <span style="Color:green">' ...</span> <span style="Color:blue">End Sub</span>
Wenn Sie die Funktionalität einer Prozedur immer und von allen anderen Modulen in Ihrem Projekt zur Verfügung stellen möchten, definieren Sie die Prozedur in einem Modul (nicht in einem Klassenmodul!) und stellen der Definition das 'Public' voran:
 
<span style="Color:blue">Private Sub </span>StartDoingThings<span style="Color:gray">()</span>
    <span style="Color:green">' ...</span>
<span style="Color:blue">End Sub</span>


=== Besondere Regeln bei Klassenmodulen und UserFormen ===
=== Besondere Regeln bei Klassenmodulen und UserFormen ===


Grundsätzlich gelten bei Prozeduren in Klassenmodulen die gleichen Regeln, allerdings steht der Inhalt einer Klasse erst dann zur Verfügung, wenn explizit mithilfe einer Variablen darauf zugegriffen wird. Siehe [[Variablen#Besondere_Geltungsbereiche_in_Klassen_und_UserFormen|Variablen: Besondere Geltungsbereiche in Klassen und UserFormen]].
Grundsätzlich gelten bei Prozeduren in Klassenmodulen die gleichen Regeln, allerdings steht der Inhalt einer Klasse erst dann zur Verfügung, wenn explizit mithilfe einer Variablen darauf zugegriffen wird.
 
Siehe [[Variablen#Besondere_Geltungsbereiche_in_Klassen_und_UserFormen|Variablen: Besondere Geltungsbereiche in Klassen und UserFormen]].


== Übergabeparameter bzw. Parameter vertiefend betrachtet ==
== Übergabeparameter bzw. Parameter vertiefend betrachtet ==

Version vom 10. Oktober 2018, 15:29 Uhr

Sub-Prozeduren

Einfache Unterprozeduren

Der Rumpf einer Sub-Prozedur wird in der hier abgebildeten Form definiert:

Sub SubProcedureName()
    
    MsgBox "Hallo!"
End Sub

Diese Prozedur kann nun direkt ausgeführt (F5 oder 'Ausführen' im VBA-Editor wählen) oder von einer anderen Prozedur aufgerufen werden:

Sub CallSubProcedureName()

    SubProcedureName     ' Aufruf der Prozedur durch Angabe des Namens
End Sub

Sub-Prozedur mit Übergabeparameter(n)

Wenn die Ausführung einer Prozedur zusätzliche Informationen erfordert, können diese in sogenannten Übergabeparametern (Argumenten) untergebracht werden.

  • Übergabeparameter werden zu einem wichtigen Bestandteil der Prozedur
  • Übergabeparameter gelten innerhalb der Prozedur als eigene Variablen und können als solche verwendet werden
  • Die Namen der Übergabeparameter müssen nicht für den Aufruf aus einer anderen Prozedur verwendet werden, lediglich die Reihenfolge muss eingehalten werden


Beispiel mit einem Übergabeparameter
Sub SubProcedureWithArgument(ByVal strArgument As String)

    ' Rumpf einer Sub-Prozedur mit einem Argument in den runden Klammern,
    ' welches als Zeichenkette erwartet wird.
    ' Dieses Argument ist ein wichtiger Bestandteil der Prozedur und wird in die Befehlskette
    ' integriert:
    
    ' Beispiel: Ein Dialog zeigt den übergebenen Text an
    MsgBox strArgument
    
    ' Eine Prozedur mit Übergabeparametern kann NICHT direkt ausgeführt werden,
    ' denn der VBA-Editor kann der Prozedur nicht die geforderten Informationen liefern.
    
End Sub

Sub CallSubProcedureWithArgument()
    
    ' Aufruf der Prozedur:
    SubProcedureWithArgument "Hallo!"
End Sub


Beispiel mit mehreren Übergabeparametern
Sub SubProcedureWithArguments(ByVal strArgument As String, ByVal intSecondArgument As Integer)
    ' Wenn eine Prozedur mehrere Argumente benötigt, werden diese mit Kommata getrennt angegeben
    
    ' Beispiel: Ein Dialog zeigt den übergebenen Text an und das Ergebnis der quadierten Zahl
    MsgBox strArgument & vbNewLine & "Die Zahl " & intSecondArgument & " im Quadrat: " & intSecondArgument ^ 2
End Sub

Sub CallSubProcedureWithArguments()

    ' Aufruf der Prozedur:
    ' Beim Aufruf einer Prozedur mit Argumenten werden KEINE Klammern angegeben!
    
    SubProcedureWithArguments "Hallo", 27
End Sub

Funktionen

Funktionen sind spezielle Formen von Sub-Prozeduren, welche nach Erfüllung ihrer Aufgabe ein Ergebnis zurückliefern.

Deklaration

Beispiel einer einfachen Funktion
Function FunctionName() As String
    ' Der Funktionsrumpf ist dem der Sub-Prozedur sehr ähnlich, erhält aber zusätzlich einen Datentyp
    ' Der Datentyp bestimmt, welche Art von Ergebnis zurückgegeben wird

    ' Der Name der Funktion wird innerhalb der Funktion als Variable verwendet und gibt so den
    ' gewünschten Wert zurück 

    FunctionName = "Rückgabewert"
    
End Function


Beispiel einer Funktion mit Übergabeparameter(n)

Function FunctionWithArguments(ByVal strArgument As String, ByVal intSecondArgument As Integer) As String
    ' Die Erweiterung einer Funktion um Argumente erfolgt analog zur Sub-Prozedur mit Argumenten
    
    ' Beispiel: diese Funktion wiederholt den ersten Buchstaben des angegebenen Text so oft,
    ' wie im zweiten Argument angegeben ist
    
    FunctionWithArguments = String(intSecondArgument, strArgument)
    
End Function

Aufruf (Klammersetzung)

Beim Aufruf von Funktionen müssen wir im VBA die besondere Klammersetzung beachten. Bitte sehen Sie sich hierzu folgende Prozedur mit all seinen Kommentaren an:

Sub UseFunctions()
     Dim strResult As String
    
    ' Aufruf der Funktion ohne Verwendung des Rückgabewertes wie eine Prozedur
    FunctionName
   
    ' Beispiel: MsgBox-Funktion wird sehr oft aufgerufen, ohne dass der Rückgabewert beachtet wird:
    ' WICHTIG: KEINE KLAMMERN!!!
    MsgBox "Hallo!"
    
    ' Mehrere Parameter werden wie gehabt durch Kommas getrennt
    MsgBox "Hallo!", vbOKOnly
    
    ' Aufruf mit Verwendung des Rückgabewertes:
    ' Der Name der Funktion wird wie eine Variable eingesetzt und verwendet
    strResult = FunctionName
    Debug.Print FunctionName
    If FunctionName = "EtwasAnderes" Then
        MsgBox "Meldung"
    End If
   
   
    ' Wenn links des Funktionsnamens weitere Anweisungen erscheinen, MÜSSEN Klammern gesetzt werden,
    ' wenn Übergabeparameter angegeben werden
    strResult = FunctionName
    strResult = FunctionName()                       ' Ohne Argument: Klammern optional
    strResult = FunctionWithArguments("y", 3)        ' Mit Parameter: Klammern nötig!
    Debug.Print FunctionWithArguments("y", 3)
    If FunctionWithArguments("a", 3) = "aaa" Then
        MsgBox "Treffer!"
    End If
   
    ' Beispiel Messagebox:
    ' Zeigt Meldung an, der gedrückte Knopf zur Bestätigung interesseiert nicht
    MsgBox "Hallo!"
   
    ' Zeigt eine Abfrage an, die Bestätigung wird in der If-Abfrage ausgewertet
    If MsgBox("Bitte bestätigen", vbYesNo) = vbYes Then
        MsgBox "Prima!"
    End If
   
   
    ' Ebenfalls werden Klammern in folgenden Fällen gesetzt:
    ' Bei Eigenschaften:
    Cells(1, 2) = "Test"     ' Nach dem Befehl mit Parametern erscheint ein '='
    ' Bei näher spezifizierten Objekten
    Cells(1, 2).Select
End Sub

Eigenschaften

' 'Property Get' verhält sich identisch zu einer Funktion

Private Property Get FirstWord() As String
    
    If ActiveDocument.Words.Count > 0 Then
       FirstWord = ActiveDocument.Words.Item(1).Text
    End If
End Property


' 'Property Let' übernimmt den gewünschten Wert als Parameter.
' Dieser Parameter muss den gleichen Datentyp haben wie
' die 'Property Get'-Funktion

Private Property Let FirstWord(ByVal strWord As String)
   
    If ActiveDocument.Words.Count = 0 Then
        ActiveDocument.Range.Text = strWord
    Else
        ActiveDocument.Words.Item(1).Text = strWord
    End If
End Property


' 'Property Get' mit Parameter zur Bestimmung des gewünschten Wertes

Public Property Get BookmarkText(ByVal strName As String) As String
   
    If ActiveDocument.Bookmarks.Exists(strName) = False Then Exit Property
    BookmarkText = ActiveDocument.Bookmarks.Item(strName).Range.Text
End Property


' Wenn Parameter verwendet werden, gilt der letzte Parameter als Übergabewert (Set Parameter).
' Die Anzahl der bestimmenden Parameter (alle Parameter außer dem letzten)
' müssen die gleiche Anzah der gleichen Datentypen der 'Property Get'-Funktion entsprechen! 

' ACHTUNG: Die Namen der Parameter müssen ebenfalls übereinstimmen!!!

Public Property Let BookmarkText(ByVal strName As String, ByVal strValue As String)
    Dim rngBookmark As Range
    
    If ActiveDocument.Bookmarks.Exists(strName) = False Then
        MsgBox "Die Textmarke '" & strName & "' kann nicht gefunden werden."
        Exit Property
    End If
    Set rngBookmark = ActiveDocument.Bookmarks.Item(strName).Range
    ' Die Textmarke wird in dem Moment, in dem der Text neu gesetzt wird, gelöscht.
    ' Der Bereich nimmt jedoch den neuen Text auf und enthält danach diesen neuen Bereich.
    rngBookmark.Text = strValue
    rngBookmark.Bookmarks.Add strName
End Property

Private Sub TestFirstWord()
    Dim strWord As String
    
    ' Großer Vorteil von Properties:
    ' Unter dem gleichen Namen können anhand des Zusammenhangs das Abfragen und das Setzen
    ' eines Wertes untergebracht werden!
    strWord = FirstWord
    FirstWord = "Adresse"
    Debug.Print FirstWord
    
    ' Als Gegensatz mit Funktion und Prozedur:
    ' Unterschiedliche Benennung -> wie benenne ich die Prozeduren, damit die Intention klar ist?
    ' ReadValue, WriteValue, ChangeValue, LoadValue, ReturnValue ...?
    ' Übergabe des neuen Wertes als Parameter -> Nur aus dem Zusammenhang erkennt man, dass dies der neue Wert ist.
    '     SetBookmarkText "bkmEMail", "b.beispiel@muster.ag"
    '     strText = GetBookmarkText("bkmDepartment")
End Sub

Public Sub SetAndReadBookmarks()
    Dim strValue As String
    
    BookmarkText("bkmAuth") = "Max Muster"
    BookmarkText("bkmAuthor") = "Berta Beispiel"
    BookmarkText("bkmDepartment") = "Neue Medien"
    BookmarkText("bkmPhone") = "+49 1234589"
    BookmarkText("bkmEMail") = "b.beispiel@muster.ag"
   
    strValue = BookmarkText("bkmDepartment")
    Debug.Print strValue
    Debug.Print BookmarkText("bkmAuthor")
End Sub

Geltungsbereich

Der Geltungsbereich einer Prozedur kann eingeschränkt werden, indem man bei der Definition ein 'Private' voranstellt:

Private Sub SubProcedure()
    ' ...
End Sub

Wenn kein 'Private' der Prozedur vorangestellt ist, wird die Prozedur automatisch als öffentlich ('Public') betrachtet.

Modulweite Prozeduren: 'Private'

Wenn eine Prozedur als 'Private' markiert wird, steht sie ausschließlich solchen Prozeduren zur Verfügung, die sich ebenfalls in diesem Modul befinden. Der Aufruf aus einem anderen Modul ist nicht möglich.

Projektweite Prozeduren: 'Public' in einem Modul

Wenn Sie die Funktionalität einer Prozedur immer und von allen anderen Modulen in Ihrem Projekt zur Verfügung stellen möchten, definieren Sie die Prozedur in einem Modul (nicht in einem Klassenmodul!) und stellen der Definition das 'Public' voran:

Private Sub StartDoingThings()
    ' ...
End Sub

Besondere Regeln bei Klassenmodulen und UserFormen

Grundsätzlich gelten bei Prozeduren in Klassenmodulen die gleichen Regeln, allerdings steht der Inhalt einer Klasse erst dann zur Verfügung, wenn explizit mithilfe einer Variablen darauf zugegriffen wird.

Siehe Variablen: Besondere Geltungsbereiche in Klassen und UserFormen.

Übergabeparameter bzw. Parameter vertiefend betrachtet

Übergabe ByRef / ByVal

Optionale Parameter

Unbestimmte Anzahl von erwarteten Parametern: ParamArray