VBA - Schachtelungsmakros

VBA - Schachtelungsmakros

com

Einführung

Es gibt verschiedene Ansätze, um ein Makro von einem anderen aufzurufen (abhängig davon, ob Sie einen Sub oder eine Funktion aufrufen). Darüber hinaus müssen Sie beim Verarbeiten von Ereignisprozeduren oder Aufrufen einer Prozedur aus einer anderen Arbeitsmappe besondere Aufmerksamkeit schenken.

Einen Teilnehmer von einem Teilnehmer aus anrufen

    • Ohne Parameter
    • Mit Parametern
  • Aufrufen einer Funktion von einem Sub
  • Aufrufen einer Funktion aus einer Funktion
    • Verwendung einer Zwischenvariablen
    • Ohne Verwendung einer Zwischenvariablen:
  • Aufruf einer Ereignisprozedur
    • Mit der Call-Anweisung
    • Die CallByName-Funktion
  • Rufen Sie eine Prozedur in einer anderen Arbeitsmappe auf
    • Ein Sub anrufen
    • Aufrufen einer Funktion

Ohne Parameter

Beide Subs befinden sich im selben Modul und haben keine Parameter. Das Macro2 ruft Macro1 auf:

 Sub Macro1 () MsgBox "Hallo Welt!" End Sub Sub Macro2 () Rufen Sie Macro1 End Sub auf 

Wenn Sie die Call-Anweisung nicht verwenden möchten:

 Sub Macro1 () MsgBox "Hallo Welt!" End Sub Sub Macro2 () Macro1 End Sub 

Es wird jedoch nicht empfohlen, da die Call-Anweisung den Code viel besser lesbar macht.

Wenn sich die Subs in verschiedenen Modulen befinden und keine Parameter haben, muss das Modul nicht angegeben werden. Trotzdem müssen Sie über die Pflege Ihres Codes nachdenken. Indem Sie angeben, welches Modul verwendet wird, sparen Sie wertvolle Zeit beim Debuggen Ihres Codes. Wenn also Macro1 in Module1 und Macro2 in Module2 ist:

 Sub Macro1 () MsgBox "Hallo Welt!" End Sub Sub Macro2 () Rufen Sie Module1.Macro1 End Sub auf 

Mit Parametern

Die Methode ist identisch. Fügen Sie einfach die Parameter in Klammern hinzu:

Mit der Call-Anweisung

 Sub Macro1 (Nb1 As Long, Nb2 As Long) Bereich ("A1") = Nb1 Bereich ("A2") = Nb2 End Sub Sub Macro2 () Call Macro1 (18254, 654897) End Sub 

Ohne die Call-Anweisung

 Sub Macro1 (Nb1 As Long, Nb2 As Long) Bereich ("A1") = Nb1 Bereich ("A2") = Nb2 End Sub Sub Macro2 () Macro1 18254321, 654897 End Sub 

Wenn sich die Makros in verschiedenen Modulen befinden:

 Sub Macro2 () Rufen Sie Module1.Macro1 (918254321, 654897) End Sub auf 

Aufrufen einer Funktion von einem Sub

Was ist eine Funktion? Was unterscheidet eine Funktion von einem Sub? Eine Funktion ist eine Anweisung, die einen Wert basierend auf bestimmten Parametern zurückgibt. Ein Sub ist auch eine Anweisung, die von Parametern abhängt (falls vorhanden), aber keinen Wert zurückgibt.

Funktionsbeispiel:

 Funktionsaddition (Nb1 As Double, Nb2 As Double) Als Doppeladdition = Nb1 + Nb2 End Function 

In diesem Beispiel wird die Funktion als "Double" deklariert (diese Typdeklaration ist optional). Der zurückgegebene Wert ist vom Typ "Double". Da die Funktion einen Wert zurückgibt, müssen Sie diesen Wert im aufrufenden Sub speichern. Dies kann entweder eine Excel-Zelle, eine Variable, ein Steuerelement usw. sein.

 Sub Macro2 () Dim Somme As Double Somme = Addition (1234.56, 654.32) MsgBox Somme End Sub Function Addition (Nb1 As Double, Nb2 As Double) As Double Addition = Nb1 + Nb2 End Function 

Nb: Parameter in Klammern und durch Kommas getrennt.

Aufrufen einer Funktion aus einer Funktion

Wir werden das gleiche Prinzip anwenden!

Verwendung einer Zwischenvariablen

In diesem Beispiel speichern wir das Ergebnis in einer Zwischenvariablen:

 Sub Macro2 () Dim Somme As Double Somme = Addition (1234.56, 654.32) MsgBox Somme End Sub Function Addition (Nb1 As Double, Nb2 As Double) As Double Dim VarNb As Double VarNb = MultiplieParDeux (Nb2) Addition = Nb1 + VarNb End Function Funktion MultiplieParDeux (Nb As Double) Als Double MultiplieParDeux = Nb * 2 End Function 

Ohne Verwendung einer Zwischenvariablen:

 Sub Macro2 () Dim Somme As Double Somme = Addition (1234.56, 654.32) MsgBox Somme End Sub Function Addition (Nb1 As Double, Nb2 As Double) As Double Addition = Nb1 + MultiplieParDeux (Nb2) End Function Function MultiplieParDeux (Nb As Double) As Double MultiplieParDeux = Nb * 2 End Function 

Aufruf einer Ereignisprozedur

Was ist ein Ereignisablauf? Eine Ereignisprozedur ist eine Anweisung, die automatisch aktiviert wird, wenn der Benutzer mit einem bestimmten Objekt interagiert. Das Objekt kann entweder ein Arbeitsblatt, eine Arbeitsmappe oder ein Steuerelement sein. Beispiele für Ereignisse: Öffnen oder Schließen einer Arbeitsmappe, Ändern eines Arbeitsblatts, Auswählen aus einer Liste, Eingeben eines Steuerelements usw.

Beispiel:

Der Benutzer ändert den Wert der Zelle A1: "pas mal" wird in B1 angezeigt, wenn A1 größer als 10 ist.

=== Implementierung: ====

  • Wählen Sie das Blatt aus
  • Klicken Sie mit der rechten Maustaste auf die Blattregisterkarte / Code anzeigen.
  • Fügen Sie im Codefenster Folgendes ein:

 Private Sub Worksheet_Change (ByVal Target As Range) Die Adresse A1 muss geändert werden. Wenn Target.Address "$ A $ 1", dann Exit Sub (ByVal Target As Range) (donc A1) est> 10 Alors auf Platz "Pas mal!" de B1 Wenn Target.Value> 10, dann Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Schrecklich!" End Sub 

Mit der Call-Anweisung

Wenn sich die aufgerufene Prozedur in demselben Modul befindet wie Ihre Ereignisprozedur:

 Private Sub Worksheet_Change (ByVal Target As Range) Die Adresse A1 muss geändert werden. Wenn Target.Address "$ A $ 1", dann Exit Sub (ByVal Target As Range) (donc A1) est> 10 Alors auf Platz "Pas mal!" de B1 Wenn Target.Value> 10, dann Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Schrecklich!" End Sub Sub MaMacro () Dim monRange As Range Set monRange = Sheets ("Feuil1"). Range ("A1") Rufen Sie Worksheet_Change (monRange) auf 

Wenn sich die aufrufende Prozedur nicht in demselben Modul befindet, wird folgende Fehlermeldung Ihnen angezeigt:

  • Kompilierfehler: Sub oder Funktion nicht definiert

VBA kann nicht auf die Ereignisprozedur zugreifen. Um dies zu beheben:

Die CallByName-Funktion

Syntax: CallByName (Objet, NomProcédure, TypeAppel, Args ())
  • Objekt: Erforderlich. Vom Objekttyp. Bezeichnet das an der Prozedur beteiligte Objekt.
  • NomProcédure: Erforderlich. String. Der Name der aufgerufenen Prozedur.
  • TypeAppel: Erforderlich. CallType: Methode, Set, Let oder Get.
  • Argumente (): Optional. Parameter, die an die aufgerufene Funktion übergeben werden sollen.

In unserem Beispiel platzieren wir maMacro in Module1 und versuchen, Worksheet_Change Sub aufzurufen. Zunächst muss jedoch unsere Ereignisprozedur deklariert werden (wenn sie als privat deklariert wird, kann sie nicht im Modul verwendet werden).

 Sub Worksheet_Change (ByVal Target As Range) 'Die Zelle muss geändert werden und die Adresse A1 muss eingegeben werden => on quitte If Target.Address "$ A $ 1" Dann Exit Sub' Die Zelle muss (donc A1) est> 10 alors auf Platz "Pas mal!" de B1 Wenn Target.Value> 10, dann Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Schrecklich!" End Sub 

Platzieren Sie nun den MyMacro Sub in Modul 2.

 Sub MaMacro () Dim monRange As Range Set monRange = Sheets ("Feuil1"). Range ("A1") CallByName-Arbeitsblätter ("Feuil1"), "Worksheet_Change", VbMethod, monRange End Sub 

Ein anderes Beispiel:

Wenn Sie in einer UserForm (UserForm2) auf eine Schaltfläche klicken, lösen Sie in UserForm1 das Ereignis Combobox1_Change aus ...

 Private Sub CommandButton1_Click () CallByName UserForm1, "ComboBox1_Change", VbMethod End Sub 

Rufen Sie eine Prozedur in einer anderen Arbeitsmappe auf

Wir werden die Run-Methode verwenden. Es wird angegeben, einschließlich der Arbeitsmappe, die die aufgerufene Prozedur und den Namen der Prozedur enthält.

Ein Sub anrufen

Fall 1: Die Datei ist bereits geöffnet. In diesem Fall muss der Pfad nicht angegeben werden:

 Sub TestRun () Application.Run "'Classeur1.xlsm'! Module2.Macro2" End Sub 

Fall 2: Die Datei ist geschlossen. In diesem Fall muss der vollständige Pfad angegeben werden:

 Sub TestRun () Application.Run "'C: \ Users \ franck \ Desktop \ Classeur1.xlsm'! Module2.Macro2" End Sub 

Aufrufen einer Funktion

Wenn Sie eine Funktion aus derselben Arbeitsmappe aufrufen, benötigen Sie eine Variable, um den zurückgegebenen Wert zu speichern. Eine Variable. Wir müssen auch alle Parameter kommunizieren, die vom aufrufenden Sub an die Funktion übergeben werden sollen.

Wir werden die Addition-Funktion verwenden, die sich in der Classeur1.xlsm befindet:

 Funktionsaddition (Nb1 As Double, Nb2 As Double) Als Doppeladdition = Nb1 + Nb2 End Function 

Um unsere Hauptprozedur [Principale ()] in der Arbeitsmappe [Classeur2.xlsm] aufzurufen, benötigen wir den folgenden Code:

Arbeitsmappe bereits geöffnet

 Sub Principale () Dim Somme As Double Somme = Run ("Classeur1.xlsm"! Module2.Addition ", 1234.56, 654.32) MsgBox Somme End Sub 

Arbeitsmappe ist geschlossen

 Sub Principale () Dim Somme As Double Somme = Run ("C: \ Users \ franck \ Desktop \ Classeur1.xlsm"! Module2.Addition ", 1234.56, 654.32) MsgBox Somme End Sub 

Hinweis: Wenn Ihre Arbeitsmappe zuvor geschlossen wurde, wird sie nach Ausführung des Makros geöffnet. Denken Sie also daran, es wieder zu schließen ... mit einem Code!

 Sub TestRun () Dim Somme As Double Somme = Run ("Classeur1.xlsm"! Module2.Addition ", 1234.56, 654.32) Arbeitsmappen (" Classeur1.xlsm "). Close False MsgBox Somme End Sub 
Vorherige Artikel Nächster Artikel

Top-Tipps