VBA - Nestande makron

VBA - Nestande makron

com

Introduktion

Det finns flera tillvägagångssätt som kan användas för att ringa ett makro från en annan (beroende på om du ringer en del eller funktion). Dessutom måste du vara särskilt uppmärksam när du hanterar händelseförfaranden eller ringer ett förfarande från en annan arbetsbok.

Ringa en del från en del

    • Utan parametrar
    • Med parametrar
  • Ringa en funktion från en del
  • Ringa en funktion från en funktion
    • Använda en mellanvariabel
    • Utan att använda en mellanvariabel:
  • Ringa ett händelseförfarande
    • Med samtalet
    • Funktionen CallByName
  • Ring ett förfarande i en annan arbetsbok
    • Ringa en del
    • Ringa en funktion

Utan parametrar

Båda delarna finns i samma modul och har inga parametrar. Macro2 ringer Macro1:

 Sub Macro1 () MsgBox "Hej värld!" Slut Sub Sub Macro2 () Ring Macro1 End Sub 

Om du inte vill använda samtalet:

 Sub Macro1 () MsgBox "Hej värld!" Slut Sub Sub Macro2 () Macro1 End Sub 

Det rekommenderas dock inte, eftersom Call-uttalandet gör koden mycket mer läsbar.

När delarna finns i olika moduler och inga parametrar finns det inget krav på att ange modulen. Men du måste fortfarande tänka på underhållet av din kod. Genom att ange vilken modul som används, sparar du värdefull tid när du felsöker din kod. Så om Macro1 finns i modul1 och makro2 i modul2:

 Sub Macro1 () MsgBox "Hej värld!" Slut Sub Sub Macro2 () Samtalsmodul1.Macro1 End Sub 

Med parametrar

Metoden är identisk. Lägg bara till parametrarna inom parentes:

Med samtalet

 Sub Macro1 (Nb1 så långt, Nb2 så långt) Område ("A1") = Nb1 Område ("A2") = Nb2 Slut Sub Sub Macro2 () Ring Makro1 (18254, 654897) Slut Sub 

Utan samtalet

 Sub Macro1 (Nb1 så långt, Nb2 så långt) Område ("A1") = Nb1 Område ("A2") = Nb2 Slut Sub Sub Macro2 () Macro1 18254321, 654897 Slut Del 

Om makronen finns i olika moduler:

 Sub Macro2 () Samtalsmodul1.Macro1 (918254321, 654897) Slutdel 

Ringa en funktion från en del

Vad är en funktion? Vad skiljer en funktion från en Sub? En funktion är en instruktion som returnerar ett värde baserat på specifika parametrar. En del är också en instruktion som beror på parametrar (om någon), men det returnerar inte något värde.

Exempel på funktion:

 Funktionstillägg (Nb1 As Double, Nb2 As Double) Som Double Addition = Nb1 + Nb2 End Function 

I det här exemplet deklareras funktionen "As Double" (den här typen av deklarationen är valfri.) Värdet returneras kommer att vara av dubbeltypen. Med tanke på att funktionen returnerar ett värde måste du lagra detta värde i den uppringande Sub-enheten. Detta kan antingen vara en Excel-cell, en variabel, en kontroll etc ...

 Sub Macro2 () Dim Somme Som Double Somme = Addition (1234, 56, 654, 32) MsgBox Somme End Sub Function Addition (Nb1 As Double, Nb2 As Double) Som Double Addition = Nb1 + Nb2 End Function 

Nb: Parametrar bifogade inom parentes och åtskilda av kommatecken.

Ringa en funktion från en funktion

Vi kommer att använda samma princip!

Använda en mellanvariabel

I det här exemplet lagrar vi resultatet i en mellanliggande variabel:

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

Utan att använda en mellanvariabel:

 Sub Macro2 () Dim Somme Som Double Somme = Addition (1234, 56, 654, 32) MsgBox Somme End Sub Function Addition (Nb1 As Double, Nb2 As Double) Som Double Addition = Nb1 + MultiplieParDeux (Nb2) Slutfunktion Funktion MultiplieParDeux (Nb As Double) Som dubbel MultiplieParDeux = Nb * 2 Slutfunktion 

Ringa ett händelseförfarande

Vad är ett händelseförfarande? Ett händelseförfarande är ett uttalande som automatiskt aktiveras när användaren interagerar med ett visst objekt. Objektet kan antingen vara ett ark, en arbetsbok, en kontroll ... Exempel på händelser: Öppna eller stänga arbetsbok, byta ark, välja från en lista, skriva in en kontroll etc ...

Exempel:

Användaren ändrar värdet på cell A1: "pas mal" visas i B1 om A1 är större än 10.

=== Genomförande: ====

  • Välj arket
  • Högerklicka på arkfliken / Visa kod.
  • I kodfönstret lägger du in följande:

 Private Sub Worksheet_Change (ByVal Target As Range) "Om du inte vill ändra adress A1 => på quitte Om Target.Address" $ A $ 1 ", avsluta sedan" Si la cellule (donc A1) est> 10 alorer på plats "Pas mal!" en B1 Om Target.Value> 10 Då Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Pas terrible!" Slutdel 

Med samtalet

Om det anropade förfarandet finns i samma modul som ditt eventförfarande:

 Private Sub Worksheet_Change (ByVal Target As Range) "Om du inte vill ändra adress A1 => på quitte Om Target.Address" $ A $ 1 ", avsluta sedan" Si la cellule (donc A1) est> 10 alorer på plats "Pas mal!" en B1 Om Target.Value> 10 Då Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Pas terrible!" Avsluta Sub Sub MaMacro () Mått MonRange Som Range Set monRange = Sheets ("Feuil1"). Räckvidd ("A1") Ringa arbetsbladskala (monRange) Slut Del 

Med nackdelar, om anropsproceduren inte finns i samma modul får du följande fel:

  • Kompileringsfel: Sub eller Funktion ej definierad

VBA kan inte komma åt händelseförfarandet. För att åtgärda detta:

Funktionen CallByName

Syntax: CallByName (Objet, NomProcédure, TypeAppel, Args ())
  • Objet: Obligatoriskt. Av objekttypen. Anger objektet som är inblandat i förfarandet.
  • NomProcédure: Obligatorisk. Sträng. Namnet på det anropade förfarandet.
  • TypAppel: Obligatorisk. CallType: Metod, Set, Låt eller Hämta.
  • Args (): Valfritt. Parametrar som ska överföras till den uppringda funktionen.

I vårt exempel ska vi placera maMacro i Module1 och försöka ringa Worksheet_Change Sub. Men först är det nödvändigt att förklara vår händelseförfarande (när de är deklarerade som privata, det kan inte användas i modulen).

 Sub Worksheet_Change (ByVal Target As Range) "Om du inte vill ändra adressen A1 => på quitte Om Target.Address" $ A $ 1 ", avsluta sedan" Si la cellule (donc A1) est> 10 Alors på plats "Pas mal!" en B1 Om Target.Value> 10 Då Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Pas terrible!" Slutdel 

Placera nu MyMacro-delen i modul 2.

 Sub MaMacro () Dim monRange Som Range Set monRange = Ark ("Feuil1"). Räckvidd ("A1") CallByName Worksheets ("Feuil1"), "Worksheet_Change", VbMethod, monRange End Sub 

Ett annat exempel:

När du klickar på en knapp i en UserForm (UserForm2), aktivera Combobox1_Change-händelsen i UserForm1 ...

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

Ring ett förfarande i en annan arbetsbok

Vi använder Run-metoden. Det kommer att anges, inklusive arbetsboken som innehåller det kallade förfarandet och namnet på förfarandet.

Ringa en del

Fall 1: Filen är redan öppen. I det här fallet behöver du inte ange sökvägen:

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

Fall 2: Filen är stängd. I så fall måste hela sökvägen anges:

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

Ringa en funktion

När du ringer en funktion från samma arbetsbok behöver du en variabel för att lagra det returnerade värdet. En variabel. Vi måste också kommunicera alla parametrar som ska överföras till funktionen från den uppringande Suben.

Vi använder Additionsfunktionen i Classeur1.xlsm:

 Funktionstillägg (Nb1 As Double, Nb2 As Double) Som Double Addition = Nb1 + Nb2 End Function 

För att ringa vårt huvudprocedur [Principal ()] i arbetsboken [Classeur2.xlsm] behöver vi följande kod:

Arbetsbok öppnad redan

 Sub Principale () Dim Somme Som Double Somme = Kör ("'Classeur1.xlsm'! Module2.Addition", 1234.56, 654.32) MsgBox Somme End Sub 

Arbetsboken är stängd

 Sub Principale () Dim Somme Som Double Somme = Kör ("'C: \ Users \ franck \ Desktop \ Classeur1.xlsm'! Module2.Addition", 1234.56, 654.32) MsgBox Somme End Sub 

Obs! Om din arbetsbok tidigare var stängd öppnas den efter att makroen körts. Så kom ihåg att stänga den igen ... med en kod!

 Sub TestRun () Dim Somme Som Double Somme = Kör ("'Classeur1.xlsm'! Module2.Addition", 1234.56, 654.32) Arbetsböcker ("Classeur1.xlsm"). Stäng False MsgBox Somme End Sub 
Tidigare Artikel Nästa Artikel

Bästa Tipsen