VBA - Schachtelungsmakros
VBA - Schachtelungsmakros
comEinfü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