VBA - Macrocomandări

VBA - Macrocomandări

com

Introducere

Există mai multe abordări care pot fi utilizate pentru a apela o macrocomandă de la alta (în funcție de faptul dacă apelați un Sub sau o funcție). În plus, trebuie să acorde o atenție deosebită atunci când se ocupă de procedurile de eveniment sau de a apela o procedură dintr-un alt registru de lucru.

Apelarea unui Sub dintr-un Sub

    • Fără parametri
    • Cu parametri
  • Apelarea unei funcții dintr-un Sub
  • Apelarea unei funcții dintr-o funcție
    • Folosind o variabilă intermediară
    • Fără utilizarea unei variabile intermediare:
  • Apelarea unei proceduri de eveniment
    • Cu instrucțiunea de apel
    • Funcția CallByName
  • Apelați o procedură într-un alt registru de lucru
    • Apelarea unui Sub
    • Apelarea unei funcții

Fără parametri

Ambele subsisteme sunt în același modul și nu au parametri. Macro2 a sunat Macro1:

 Sub Macro1 () MsgBox "Buna ziua!" Sfârșit Sub Sub Macro2 () Apelați Macro1 End Sub 

Dacă nu doriți să utilizați instrucțiunea de apel:

 Sub Macro1 () MsgBox "Buna ziua!" Sfârșit Sub Sub Macro2 () Macro1 End Sub 

Nu este recomandat însă, deoarece declarația de apel face ca codul să fie mult mai ușor de citit.

Când subsilerele sunt în module diferite și nu au parametri, nu există nicio cerință de specificare a modulului. Dar totuși trebuie să te gândești la menținerea codului tău. Prin indicarea modulului care este utilizat, veți economisi timp prețios atunci când depanați codul. Deci, dacă Macro1 este în Module1 și Macro2 în Module2:

 Sub Macro1 () MsgBox "Buna ziua!" End Sub Sub Macro2 () Apel Module1.Macro1 End Sub 

Cu parametri

Metoda este identică. Doar adăugați parametrii în paranteze:

Cu instrucțiunea de apel

 Sub Macro1 (Nb1 pe termen lung, Nb2 la lungime) Interval ("A1") = Nb1 Interval ("A2") = Nb2 End Sub Sub Macro2 () Apel Macro1 (18254, 654897) 

Fără declarația de apel

 Sub Macro1 (Nb1 pe termen lung, Nb2 la lungime) Interval ("A1") = Nb1 Interval ("A2") = Nb2 End Sub Sub Macro2 () Macro1 18254321, 654897 End Sub 

Dacă macrocomenzile sunt în module diferite:

 Sub Macro2 () Apel Module1.Macro1 (918254321, 654897) End Sub 

Apelarea unei funcții dintr-un Sub

Ce este o funcție? Ce diferențiază o funcție de un Sub? O funcție este o instrucțiune care returnează o valoare bazată pe parametrii specifici. A Sub este, de asemenea, o instrucțiune care depinde de parametri (dacă există), dar nu întoarce nici o valoare.

Exemplu de funcție:

 Adăugarea funcției (Nb1 ca dublu, Nb2 ca dublu) Ca adiție dublă = Nb1 + Nb2 End Function 

În acest exemplu, funcția este declarată "As Double" (această declarație de tip este opțională.) Valoarea returnată va fi de tip Double. Având în vedere faptul că funcția returnează o valoare, va trebui să furnizați stocarea acestei valori în submeniul de apel. Aceasta poate fi o celulă Excel, o variabilă, un control etc.

 Sub Macro2 () Dim Somme ca dublu Somme = Addition (1234.56, 654.32) MsgBox Somme End Sub Suplimentare funcție (Nb1 ca dublu, Nb2 ca dublu) Ca adiție dublă = Nb1 + Nb2 End Funcția 

Nb: Parametrii cuprinsi între paranteze și separați prin virgule.

Apelarea unei funcții dintr-o funcție

Vom folosi același principiu!

Folosind o variabilă intermediară

În acest exemplu vom stoca rezultatul într-o variabilă intermediară:

 Sub Macro2 () Dim Somme Ca dublu Somme = Adăugare (1234.56, 654.32) MsgBox Somme End Sub Suplimentare funcție (Nb1 ca dublu, Nb2 ca dublu) Ca dimensiune dublă VarNb Ca dublă VarNb = MultiplieParDeux (Nb2) Addition = Funcția MultiplieParDeux (Nb ca dublă) Ca dublu MultiplieParDeux = Nb * 2 Funcția de terminare 

Fără utilizarea unei variabile intermediare:

 (Nb2 ca dublu, Nb2 ca dublu) Ca adiție dublă = Nb1 + MultiplieParDeux (Nb2) Funcția de capăt a funcției MultiplieParDeux (Nb ca dublu) Ca dublă MultiplieParDeux = Nb * 2 Funcția de terminare 

Apelarea unei proceduri de eveniment

Ce este o procedură de eveniment? O procedură de eveniment este o declarație care este activată automat atunci când utilizatorul interacționează cu un anumit obiect. Obiectul poate fi fie o foaie, un registru de lucru, fie un control ... Exemple de evenimente: deschiderea sau închiderea unui registru de lucru, schimbarea foii, alegerea dintr-o listă, tastarea unui control etc.

Exemplu:

Utilizatorul modifică valoarea celulei A1: "pas mal" va fi afișat în B1 dacă A1 este mai mare de 10.

=== Implementare: ====

  • Selectați foaia
  • Faceți clic dreapta pe fila foaie / Vizualizați codul.
  • În fereastra de cod, introduceți următoarele:

 În cazul în care țintă, adresa "$ A $ 1", apoi ieșiți sub "Si la cellule (donc A1) est> 10 alors pe loc "Pas mal!" ro B1 Dacă Target.Value> 10 Apoi Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Pas teribil!" End Sub 

Cu instrucțiunea de apel

Dacă procedura apelată este în același modul ca procedura dvs. de eveniment:

 În cazul în care țintă, adresa "$ A $ 1", apoi ieșiți sub "Si la cellule (donc A1) est> 10 alors pe loc "Pas mal!" ro B1 Dacă Target.Value> 10 Apoi Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Pas teribil!" End Sub Sub MaMacro () Dim monRange ca set de limite monRange = Sheets ("Feuil1") Interval ("A1") CallHeed Worksheet_Change (monRange) End Sub 

Prin contra, dacă procedura de apelare nu este în același modul, veți primi următoarea eroare:

  • Eroare de compilare: Sub sau funcția nu este definită

VBA nu poate accesa procedura evenimentului. Pentru a remedia acest lucru:

Funcția CallByName

Sintaxă: CallByName (Objet, NomProcédure, TypeAppel, Args ())
  • Objet: Necesar. Din tipul obiectului. Desemnează obiectul implicat în procedură.
  • NomProcédure: Necesar. Şir. Numele procedurii chemate.
  • TypeAppel: Necesar. Tip de apel: Metodă, setare, permitere sau obținere.
  • Argumente (): Opțional. Parametrii care trebuie transmiși la funcția apelată.

În exemplul nostru, vom plasa maMacro în modulul 1 și vom încerca să sunăm la Worksheet_Change Sub. Dar, mai întâi, este necesar să declarăm procedura evenimentului nostru (atunci când este declarat privat, nu poate fi folosit în modul).

 Sub Worksheet_Change (ByVal Target As Range) 'Si la cellule concernee par le schimbare n'a pas pentru adresă A1 => pe quitte Dacă Target.Address "$ A $ 1" Apoi Exit Sub' Si la cellule (donc A1) est> 10 alors pe loc "Pas mal!" ro B1 Dacă Target.Value> 10 Apoi Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "Pas teribil!" End Sub 

Acum plasați MyMacro Sub în modulul 2.

 ("Feuil1"), "Worksheet_Change", VbMethod, monRange End Sub ("Feuil1"), 

Alt exemplu:

După ce faceți clic pe un buton într-un UserForm (UserForm2), declanșați evenimentul Combobox1_Change în UserForm1 ...

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

Apelați o procedură într-un alt registru de lucru

Vom folosi metoda Run. Acesta va fi specificat, inclusiv registrul de lucru care conține procedura chemată și numele procedurii.

Apelarea unui Sub

Cazul 1: Fișierul este deja deschis. În acest caz, nu este nevoie să specificați calea:

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

Cazul 2: Dosarul este închis. În acest caz, trebuie specificată calea completă:

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

Apelarea unei funcții

Când apelați o funcție din același registru de lucru, veți avea nevoie de o variabilă pentru a stoca valoarea returnată. O variabilă. Va trebui să comunicați, de asemenea, toți parametrii care urmează să fie transmiși funcției de la sub-apelantul Sub.

Vom folosi funcția Addition aflată în Classeur1.xlsm:

 Adăugarea funcției (Nb1 ca dublu, Nb2 ca dublu) Ca adiție dublă = Nb1 + Nb2 End Function 

Pentru a apela procedura principală [Principale ()] din registrul de lucru [Classeur2.xlsm], avem nevoie de următorul cod:

Cartea de lucru a fost deja deschisă

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

Registrul de lucru este închis

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

NB: Dacă agenda dvs. a fost închisă anterior, se va deschide după executarea macrocomenzii. Deci, amintiți-vă să o închideți din nou ... folosind un cod!

 Sub TestRun () Dim Somme ca Double Somme = Run ("'Classeur1.xlsm'! Module2.Addition", 1234.56, 654.32) Biblioteca de lucru ("Classeur1.xlsm") Close MsgBox Somme End Sub 
Articolul Precedent Articolul Următor

Cele Mai Importante Sfaturi