VBA - Makronaredbe za gniježđenje

VBA - Makronaredbe za gniježđenje

com

Uvod

Postoji nekoliko pristupa koji se mogu koristiti za pozivanje makronaredbe iz drugog (ovisno o tome zovete li Sub ili funkciju). Osim toga, pri rukovanju procedurama događaja ili pozivanjem postupka iz druge radne knjige morate posvetiti posebnu pozornost.

Pozivanje Suba iz Sub

    • Bez parametara
    • S parametrima
  • Pozivanje funkcije iz podmornice
  • Pozivanje funkcije iz funkcije
    • Korištenje intermedijerne varijable
    • Bez upotrebe intermedijerne varijable:
  • Pozivanje postupka događaja
    • Sa stavkom poziva
    • Funkcija CallByName
  • Nazovite postupak u drugoj radnoj knjizi
    • Pozivanje podmornice
    • Pozivanje funkcije

Bez parametara

Oba Subs su u istom modulu i nemaju parametre. Macro2 poziva Macro1:

 Sub Macro1 () MsgBox "Pozdrav svijetu!" Kraj Sub Sub Macro2 () Nazovite Macro1 End Sub 

Ako ne želite koristiti Izjavu poziva:

 Sub Macro1 () MsgBox "Pozdrav svijetu!" Kraj Sub Sub Macro2 () Macro1 End Sub 

To se, međutim, ne preporučuje, budući da pozivni izraz čini kod čitljivijim.

Kada su Subs u različitim modulima i nemaju parametre, nema potrebe za određivanjem modula. Ali ipak morate razmisliti o održavanju koda. Označavajući koji se modul koristi, uštedjet ćete malo dragocjenog vremena pri otklanjanju pogrešaka u kodu. Dakle, ako je Macro1 u Modulu1 i Macro2 u Modulu2:

 Sub Macro1 () MsgBox "Pozdrav svijetu!" Kraj Sub Sub Macro2 () Pozovite Module1.Macro1 End Sub 

S parametrima

Metoda je identična. Samo dodajte parametre u zagrade:

Sa stavkom poziva

 Pod Macro1 (Nb1 kao dugačak, Nb2 kao dugačak) Raspon ("A1") = Nb1 raspon ("A2") = Nb2 Kraj Sub Sub Macro2 () Poziv Macro1 (18254, 654897) Kraj Sub 

Bez izjave poziva

 Pod Macro1 (Nb1 kao dugačak, Nb2 kao dugačak) Raspon ("A1") = Nb1 Raspon ("A2") = Nb2 Kraj Sub Sub Macro2 () Macro1 18254321, 654897 Kraj Sub 

Ako su makronaredbe u različitim modulima:

 Sub Macro2 () Pozovite Module1.Macro1 (918254321, 654897) Kraj Sub 

Pozivanje funkcije iz podmornice

Što je funkcija? Što razlikuje funkciju od Sub? Funkcija je instrukcija koja vraća vrijednost na temelju specifičnih parametara. Sub je također instrukcija koja ovisi o parametrima (ako postoje), ali ne vraća nikakvu vrijednost.

Primjer funkcije:

 Dodatak funkciji (Nb1 kao dvostruki, Nb2 kao dvostruki) kao dvostruki dodatak = funkcija Nb1 + Nb2 

U ovom primjeru funkcija je deklarirana "kao dvostruka" (ova deklaracija tipa nije obavezna.) Vrijednost koju vraća bit će tipa Double. S obzirom da funkcija vraća vrijednost, morat ćete osigurati pohranu te vrijednosti u pozivnom sub. To može biti Excel ćelija, varijabla, kontrolna itd.

 Sub Macro2 () Dim Somme kao dvostruki Somme = Dodatak (1234, 56, 654, 32) Dodatak za MsgBox Somme Završetak pod-funkcije (Nb1 kao dvostruki, Nb2 kao dvostruki) Kao dvostruko pridodavanje = Nb1 + Nb2 Završna funkcija 

Nb: Parametri zatvoreni u zagradama i odvojeni zarezima.

Pozivanje funkcije iz funkcije

Koristit ćemo isti princip!

Korištenje intermedijerne varijable

U ovom primjeru pohranit ćemo rezultat u intermedijernu varijablu:

 Sub Macro2 () Dim Somme kao dvostruki Somme = Dodatak (1234, 56, 654, 32) Dodatak za MsgBox Somme Završetak pod-funkcije (Nb1 kao dvostruki, Nb2 kao dvostruki) Kao dvostruki dim VarNb kao dvostruki VarNb = MultiplieParDeux (Nb2) dodatak = Nb1 + VarNb Završna funkcija Funkcija MultiplieParDeux (Nb kao dvostruka) kao dvostruki MultiplieParDeux = Nb * 2 krajnja funkcija 

Bez upotrebe intermedijerne varijable:

 Sub Macro2 () Dim Somme kao dvostruki Somme = Dodatak (1234, 56, 654, 32) Dodatak za MsgBox Somme Završetak pod-funkcije (Nb1 kao dvostruki, Nb2 kao dvostruki) Kao dvostruko dodavanje = Nb1 + MultiplieParDeux (Nb2) Kraj Funkcija Funkcija MultiplieParDeux (Nb kao dvostruka) Kao dvostruki višestruki parDeux = Nb * 2 krajnja funkcija 

Pozivanje postupka događaja

Što je procedura događanja? Postupak događaja je izjava koja se automatski aktivira kada korisnik komunicira s određenim objektom. Objekt može biti list, radna knjiga, kontrola ... Primjeri događaja: otvaranje ili zatvaranje radne knjige, promjena lista, odabir s popisa, upisivanje u kontrolnu itd.

Primjer:

Korisnik mijenja vrijednost ćelije A1: "pas mal" će se prikazati u B1 ako je A1 veći od 10.

=== Provedba: ====

  • Odaberite list
  • Desnom tipkom miša kliknite na karticu lista / Prikaz koda.
  • U prozorčiću koda umetnite sljedeće:

 Privatni podradni list_Promjena (ciljna vrijednost ByVal kao raspon) 'Primjenjuje se da se izmijeni naziv adrese A1 => na kraju Ako je cilj.Address "$ A $ 1" Zatim izađite iz "Podijelite adresu" 10 mjesta na mjestu "Pas mal!" hr B1 Ako je Target.Value> 10 Tada Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Pas užasan!" Kraj pod 

Sa stavkom poziva

Ako se pozvani postupak nalazi u istom modulu kao i procedura događaja:

 Privatni podradni list_Promjena (ciljna vrijednost ByVal kao raspon) 'Primjenjuje se da se izmijeni naziv adrese A1 => na kraju Ako je cilj.Address "$ A $ 1" Zatim izađite iz "Podijelite adresu" 10 mjesta na mjestu "Pas mal!" hr B1 Ako je Target.Value> 10 Tada Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Pas užasan!" Kraj Sub Sub MaMacro () Dim monRange As Range Set monRange = Listovi ("Feuil1"). Domet ("A1") Poziv Radni list_Promijeni (monRange) Kraj Sub 

Ako se postupak poziva ne nalazi u istom modulu, pojavit će se sljedeća pogreška:

  • Pogreška pri sastavljanju: Sub ili funkcija nije definirana

VBA ne može pristupiti postupku događaja. Da biste to ispravili:

Funkcija CallByName

Sintaksa: CallByName (Objet, NomProcédure, TypeAppel, Args ())
  • Objet: Obavezno. Tip objekta. Označava objekt uključen u postupak.
  • NomProcédure: Obavezno. Niz. Naziv nazvanog postupka.
  • TypeAppel: Obavezno. Vrsta poziva: Metoda, Postavljanje, Puštanje ili Dobivanje.
  • Args (): Neobavezno. Parametri koji se prosljeđuju pozvanoj funkciji.

U našem primjeru, postavit ćemo maMacro u Module1 i pokušati nazvati Worksheet_Change Sub. Ali prvo, potrebno je proglasiti našu proceduru događanja (kada je deklarirana kao privatna, ne može se koristiti u modulu).

 Sub Worksheet_Change (ByVal cilj kao raspon) 'Si la cellule zabrinutost paralelni izmjena n'a pas za adresu A1 => na quitte Ako Target.Address "$ A $ 1" Zatim Exit Sub' Si la cellule (donc A1) je> 10 na mjestu "Pas mal!" hr B1 Ako je Target.Value> 10 Tada Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Pas užasan!" Kraj pod 

Sada stavite podnaslov MyMacro u modul 2.

 Sub MaMacro () Dim monRange As Range Set monRange = Listovi ("Feuil1"). Domet ("A1") Radni listovi CallByName ("Feuil1"), "Worksheet_Change", VbMethod, monRange End Sub 

Još jedan primjer:

Nakon što kliknete na gumb u korisničkoj formi (UserForm2), pokrenite događaj Combobox1_Change u UserForm1 ...

 Privatna Sub CommandButton1_Click () CallByName UserForm1, "ComboBox1_Change", Sub Sub Sub Sub 

Nazovite postupak u drugoj radnoj knjizi

Koristit ćemo metodu Run. To će biti navedeno, uključujući i radnu knjigu koja sadrži pozvani postupak i naziv postupka.

Pozivanje podmornice

Slučaj 1: Datoteka je već otvorena. U tom slučaju ne morate navesti putanju:

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

Slučaj 2: Datoteka je zatvorena. U tom slučaju mora se navesti puna putanja:

 Sub TestRun () Application.Run "" C: Korisnici frank Desktop Classeur1.xlsm '! Module2.Macro2 "Kraj Sub 

Pozivanje funkcije

Kada pozivate funkciju iz iste radne knjige, trebat ćete varijablu za pohranu vraćene vrijednosti. Varijabla. Morat ćemo također prenijeti sve parametre koji će se proslijediti funkciji iz pozvanog Sub.

Koristit ćemo funkciju dodavanja koja se nalazi u Classeur1.xlsm:

 Dodatak funkciji (Nb1 kao dvostruki, Nb2 kao dvostruki) kao dvostruki dodatak = funkcija Nb1 + Nb2 

Da bismo pozvali našu glavnu proceduru [Principale ()] u radnoj knjizi [Classeur2.xlsm], potreban nam je sljedeći kod:

Radna knjiga je već otvorena

 Sub Principale () Dim Somme kao dvostruki Somme = Run ("'Classeur1.xlsm'! Module2.Addition", 1234.56, 654.32) 

Radna knjiga je zatvorena

 Sub Principale () Dim Somme kao dvostruki Somme = Run ("'C: Korisnici franck-a Desktop" Classeur1.xlsm'! Module2.Addition ", 1234.56, 654.32) MsgBox Somme End Sub 

Napomena: Ako je vaša radna knjiga prethodno bila zatvorena, otvorit će se nakon izvršavanja makronaredbe. Zato zapamtite da ga opet zatvorite ... koristeći kod!

 Sub TestRun () Dim Somme kao dvostruki Somme = Run ("'Classeur1.xlsm'! Module2.Addition", 1234.56, 654.32) Radne knjige ("Classeur1.xlsm"). 
Prethodni Članak Sljedeći Članak

Top Savjeta