Procedurile „Funcție” și „Sub” în VBA

Funcții VBA încorporate

Înainte de a începe să vă creați propriile funcții VBA, este bine să știți că Excel VBA are o colecție bogată de funcții preîncorporate pe care le puteți utiliza în timp ce scrieți codul.

O listă a acestor funcții poate fi vizualizată în editorul VBA:

  • Deschideți un registru de lucru Excel și lansați editorul VBA (faceți clic pentru a face acest lucru Alt + F11), apoi apăsați F2.
  • Selectați o bibliotecă din lista derulantă din stânga sus a ecranului VBA.
  • Va apărea o listă de clase și funcții VBA încorporate. Faceți clic pe numele funcției pentru a afișa scurta sa descriere în partea de jos a ferestrei. presare F1 va deschide pagina de ajutor online pentru acea funcție.

În plus, o listă completă de funcții VBA încorporate cu exemple poate fi găsită la Centrul pentru dezvoltatori Visual Basic.

Proceduri personalizate „Funcție” și „Sub” în VBA

În Excel Visual Basic, un set de comenzi care efectuează o anumită sarcină este plasat într-o procedură. Funcţie (Funcție) sau Sub (subrutină). Principala diferență între proceduri Funcţie и Sub asta este procedura Funcţie returnează rezultat, procedură Sub - nu.

Prin urmare, dacă trebuie să efectuați acțiuni și să obțineți un rezultat (de exemplu, însumați mai multe numere), atunci procedura este de obicei utilizată Funcţieși pentru a efectua pur și simplu unele acțiuni (de exemplu, modificați formatarea unui grup de celule), trebuie să selectați procedura Sub.

Argumente

Diverse date pot fi transmise procedurilor VBA folosind argumente. Lista de argumente este specificată la declararea unei proceduri. De exemplu, procedura Sub în VBA adaugă întregul dat (Integer) la fiecare celulă din intervalul selectat. Puteți trece acest număr procedurii folosind un argument, ca acesta:

Sub AddToCells(i As Integer) ... End Sub

Rețineți că aveți argumente pentru proceduri Funcţie и Sub în VBA este opțional. Unele proceduri nu necesită argumente.

Argumente opționale

Procedurile VBA pot avea argumente opționale. Acestea sunt argumente pe care utilizatorul le poate specifica dacă dorește, iar dacă sunt omise, procedura folosește valorile implicite pentru ele.

Revenind la exemplul anterior, pentru a face opțional un argument întreg pentru o funcție, acesta ar fi declarat astfel:

Sub AddToCells (Opțional i As Integer = 0)

În acest caz, argumentul întreg i implicit va fi 0.

Într-o procedură pot exista mai multe argumente opționale, toate fiind listate la sfârșitul listei de argumente.

Transmiterea argumentelor după valoare și prin referință

Argumentele din VBA pot fi transmise unei proceduri în două moduri:

  • De Val – transmiterea unui argument după valoare. Aceasta înseamnă că numai valoarea (adică o copie a argumentului) este transmisă procedurii și, prin urmare, orice modificări aduse argumentului în interiorul procedurii se vor pierde atunci când procedura iese.
  • PrinRef – transmiterea unui argument prin referință. Adică, adresa reală a locației argumentului din memorie este transmisă procedurii. Orice modificări aduse unui argument în cadrul procedurii vor fi salvate la ieșirea procedurii.

Folosind cuvinte cheie De Val or PrinRef în declarația de procedură, puteți specifica modul în care argumentul este transmis procedurii. Acest lucru este prezentat în exemplele de mai jos:

Sub AddToCells(ByVal i As Integer) ... End Sub
În acest caz, argumentul întreg i trecut prin valoare. După părăsirea procedurii Sub toate făcute cu i schimbările se vor pierde.
Sub AddToCells(ByRef i As Integer) ... End Sub
În acest caz, argumentul întreg i trecut prin referință. După părăsirea procedurii Sub toate făcute cu i modificările vor fi stocate în variabila care a fost transmisă procedurii Sub.

Rețineți că argumentele din VBA sunt transmise implicit prin referință. Cu alte cuvinte, dacă nu sunt folosite cuvinte cheie De Val or PrinRef, atunci argumentul va fi transmis prin referință.

Înainte de a continua cu procedurile Funcţie и Sub mai detaliat, va fi util să aruncăm o altă privire asupra caracteristicilor și diferențelor dintre aceste două tipuri de proceduri. Următoarele sunt scurte discuții despre procedurile VBA Funcţie и Sub și sunt prezentate exemple simple.

Procedura VBA „Funcție”

Editorul VBA recunoaște procedura Funcţiecând întâlnește un grup de comenzi cuprinse între următoarele instrucțiuni de deschidere și de închidere:

Funcție... Încheierea funcției

După cum am menționat mai devreme, procedura Funcţie în VBA (spre deosebire de Sub) returnează o valoare. Următoarele reguli se aplică valorilor returnate:

  • Tipul de date al valorii returnate trebuie declarat în antetul procedurii Funcţie.
  • Variabila care conține valoarea returnată trebuie să fie numită la fel ca și procedura Funcţie. Această variabilă nu trebuie să fie declarată separat, deoarece există întotdeauna ca parte integrantă a procedurii. Funcţie.

Acest lucru este bine ilustrat în exemplul următor.

Exemplu de funcție VBA: Efectuarea unei operații matematice pe 3 numere

Următorul este un exemplu de cod de procedură VBA Funcţie, care ia trei argumente de tip dublu (numere cu virgulă mobilă cu precizie dublă). Ca urmare, procedura returnează un alt număr de tip dubluegal cu suma primelor două argumente minus al treilea argument:

Funcția SumMinus(dNum1 ca dublu, dNum2 ca dublu, dNum3 ca dublu) Ca dublu SumMinus = dNum1 + dNum2 - dNum3 End Function

Această procedură VBA foarte simplă Funcţie ilustrează modul în care datele sunt transmise unei proceduri prin argumente. Puteți vedea că tipul de date returnat de procedură este definit ca dublu (spun cuvintele Ca dublu după lista de argumente). Acest exemplu arată și modul în care rezultatul procedurii Funcţie stocate într-o variabilă cu același nume ca numele procedurii.

Apelarea procedurii VBA „Funcție”

Dacă procedura simplă de mai sus Funcţie inserat într-un modul în editorul Visual Basic, acesta poate fi apelat din alte proceduri VBA sau utilizat pe o foaie de lucru dintr-un registru de lucru Excel.

Apelați procedura VBA „Funcție” dintr-o altă procedură

Procedură Funcţie poate fi apelat dintr-o altă procedură VBA prin simpla atribuire a acelei proceduri unei variabile. Următorul exemplu arată un apel la o procedură Summinus, care a fost definit mai sus.

Sub main() Dim total as Double total = SumMinus(5, 4, 3) End Sub

Apelați procedura VBA „Funcție” dintr-o foaie de lucru

Procedura VBA Funcţie poate fi apelat dintr-o foaie de lucru Excel în același mod ca orice altă funcție Excel încorporată. Prin urmare, procedura creată în exemplul anterior Funcţie - Summinus poate fi apelat prin introducerea următoarei expresii într-o celulă a foii de lucru:

=SumMinus(10, 5, 2)

Procedura VBA „Sub”

Editorul VBA înțelege că există o procedură în fața lui Subcând întâlnește un grup de comenzi cuprinse între următoarele instrucțiuni de deschidere și de închidere:

Sub ... End Sub

Procedura VBA „Sub”: Exemplul 1. Alinierea la centru și modificarea dimensiunii fontului într-un interval selectat de celule

Luați în considerare un exemplu de procedură VBA simplă Sub, a cărui sarcină este să modifice formatarea intervalului de celule selectat. Celulele sunt centrate (atât pe verticală, cât și pe orizontală) și dimensiunea fontului este modificată la cea specificată de utilizator:

Sub Format_Centered_And_Sized(Opțional iFontSize As Integer = 10) Selection.HorizontalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Size = iFontSize End Sub

Această procedură Sub efectuează acțiuni, dar nu returnează un rezultat.

Acest exemplu folosește și un argument Opțional Marimea fontului. Dacă argumentul Marimea fontului nu a trecut la procedura Sub, atunci valoarea sa implicită este 10. Cu toate acestea, dacă argumentul Marimea fontului trecut la procedura Sub, atunci intervalul de celule selectat va fi setat la dimensiunea fontului specificată de utilizator.

Subprocedură VBA: Exemplul 2: Alinierea la centru și font aldine în intervalul selectat de celule

Următoarea procedură este similară cu cea discutată, dar de data aceasta, în loc să redimensioneze, aplică un stil de font aldine pentru intervalul de celule selectat. Acesta este un exemplu de procedură Sub, care nu ia argumente:

Sub Format_Centered_And_Bold() Selection.HorizontalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Bold = True End Sub

Apelarea procedurii „Sub” în Excel VBA

Apelați procedura VBA „Sub” dintr-o altă procedură

Pentru a apela o procedură VBA Sub dintr-o altă procedură VBA, trebuie să scrieți cuvântul cheie Apel, numele procedurii Sub iar mai departe între paranteze sunt argumentele procedurii. Acest lucru este prezentat în exemplul de mai jos:

Sub main() Call Format_Centered_And_Sized(20) End Sub

Dacă procedura Format_Centered_And_Sized are mai mult de un argument, acestea trebuie separate prin virgule. Ca aceasta:

Sub main() Call Format_Centered_And_Sized(arg1, arg2, ...) End Sub

Apelați procedura VBA „Sub” din foaia de lucru

Procedură Sub nu poate fi introdus direct într-o celulă de foaie Excel, așa cum se poate face cu o procedură Funcţiedeoarece procedura Sub nu returnează o valoare. Cu toate acestea, procedurile Sub, care nu au argumente și sunt declarate ca Public (după cum se arată mai jos) va fi disponibil pentru utilizatorii foii de lucru. Astfel, dacă procedurile simple discutate mai sus Sub introdus într-un modul în Visual Basic Editor, procedura Format_Centrat_Și_Aldin vor fi disponibile pentru utilizare într-o foaie de lucru Excel și procedura Format_Centered_And_Sized – nu va fi disponibil deoarece are argumente.

Iată o modalitate ușoară de a rula (sau de a executa) o procedură Sub, accesibil din foaia de lucru:

  • Anunturi Alt + F8 (apasa tasta Alt și în timp ce îl țineți apăsat, apăsați tasta F8).
  • În lista de macrocomenzi care apare, selectați-o pe cea pe care doriți să o rulați.
  • Anunturi Alerga (alerga)

Pentru a efectua o procedură Sub rapid și ușor, îi puteți aloca o comandă rapidă de la tastatură. Pentru asta:

  • Anunturi Alt + F8.
  • În lista de macrocomenzi care apare, selectați-o pe cea căreia doriți să îi atribuiți o comandă rapidă de la tastatură.
  • Anunturi parametrii (Opțiuni) și în caseta de dialog care apare, introduceți comanda rapidă de la tastatură.
  • Anunturi OK și închideți dialogul Macro (Macro).

Atenţie: Când atribuiți o comandă rapidă de la tastatură unei macrocomenzi, asigurați-vă că nu este utilizată ca standard în Excel (de exemplu, Ctrl + C). Dacă selectați o comandă rapidă de la tastatură deja existentă, aceasta va fi reatribuită macrocomenzii și, ca urmare, utilizatorul poate porni macrocomandă accidental.

Domeniul de aplicare al procedurii VBA

Partea 2 a acestui tutorial a discutat domeniul de aplicare al variabilelor și constantelor și rolul cuvintelor cheie. Public и Privat. Aceste cuvinte cheie pot fi utilizate și cu procedurile VBA:

Public Sub AddToCells(i As Integer) ... End Sub
Dacă declarația procedurii este precedată de cuvântul cheie Public, atunci procedura va fi disponibilă pentru toate modulele din acel proiect VBA.
Private Sub AddToCells(i As Integer) ... End Sub
Dacă declarația procedurii este precedată de cuvântul cheie Privat, atunci această procedură va fi disponibilă numai pentru modulul curent. Nu poate fi apelat în orice alt modul sau dintr-un registru de lucru Excel.

Amintiți-vă că dacă înainte de a declara o procedură VBA Funcţie or Sub cuvântul cheie nu este introdus, proprietatea implicită este setată pentru procedură Public (adică va fi disponibil peste tot în acest proiect VBA). Acest lucru este în contrast cu declarațiile de variabile, care sunt implicit Privat.

Ieșire timpurie din procedurile VBA „Funcție” și „Sub”

Dacă trebuie să opriți execuția unei proceduri VBA Funcţie or Sub, fără a aștepta finalul lui firesc, atunci pentru asta există operatori Funcția de ieșire и Ieșiți din Sub. Utilizarea acestor operatori este prezentată mai jos folosind o procedură simplă ca exemplu. FuncţieA care se așteaptă să primească un argument pozitiv pentru a efectua operațiuni ulterioare. Dacă o valoare nepozitivă este transmisă procedurii, atunci nu mai pot fi efectuate operații, astfel încât utilizatorului ar trebui să i se afișeze un mesaj de eroare și procedura ar trebui să iasă imediat:

Funcția VAT_Amount(sVAT_Rate As Single) As Single VAT_Amount = 0 Dacă sVAT_Rate <= 0 Then MsgBox „Se așteaptă o valoare pozitivă a sVAT_Rate, dar a primit” și sVAT_Rate Ieșire funcție End If... End Function

Vă rugăm să rețineți că înainte de a finaliza procedura Funcţie - Suma_TVA, o funcție VBA încorporată este inserată în cod MsgBox, care afișează un pop-up de avertizare pentru utilizator.

Lasă un comentariu