"Funktsiooni" ja "Alam" protseduurid VBA-s

Sisseehitatud VBA funktsioonid

Enne oma VBA funktsioonide loomise alustamist on hea teada, et Exceli VBA-l on rikkalik eelehitatud sisseehitatud funktsioonide kogu, mida saate koodi kirjutamisel kasutada.

Nende funktsioonide loendit saab vaadata VBA redaktoris:

  • Avage Exceli töövihik ja käivitage VBA redaktor (selleks klõpsake Alt + F11) ja vajutage seejärel F2.
  • Valige ekraani vasakus ülanurgas olevast rippmenüüst teek VBA.
  • Ilmub sisseehitatud VBA klasside ja funktsioonide loend. Klõpsake funktsiooni nimel, et kuvada selle lühikirjeldus akna allosas. vajutades F1 avab selle funktsiooni veebiabilehe.

Lisaks leiate Visual Basicu arendajakeskusest sisseehitatud VBA funktsioonide täieliku loendi koos näidetega.

Kohandatud protseduurid "Function" ja "Sub" VBA-s

Programmis Excel Visual Basic paigutatakse protseduurile käskude komplekt, mis täidab konkreetset toimingut. funktsioon (Funktsioon) või alla (Alamprogramm). Peamine erinevus protseduuride vahel funktsioon и alla kas see on protseduur funktsioon tagastab tulemuse, protseduuri alla - mitte.

Seega, kui teil on vaja toiminguid teha ja saada mingi tulemus (näiteks mitu numbrit kokku liita), kasutatakse tavaliselt protseduuri funktsioonja mõne toimingu tegemiseks (näiteks lahtrite rühma vormingu muutmiseks) peate valima protseduuri alla.

Argumendid

VBA protseduuridele saab argumentide abil edastada erinevaid andmeid. Protseduuri deklareerimisel täpsustatakse argumentide loend. Näiteks protseduur alla lisab VBA-s antud täisarvu (Integer) igasse valitud vahemiku lahtrisse. Saate selle numbri protseduurile edasi anda sellise argumendi abil:

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

Pidage meeles, et protseduuride jaoks on argumente funktsioon и alla VBA-s on valikuline. Mõned protseduurid ei vaja argumente.

Valikulised argumendid

VBA protseduuridel võivad olla valikulised argumendid. Need on argumendid, mida kasutaja saab soovi korral määrata ja kui need jäetakse välja, kasutab protseduur nende jaoks vaikeväärtusi.

Tulles tagasi eelmise näite juurde, et muuta funktsiooni täisarvuline argument vabatahtlikuks, deklareeritakse see järgmiselt:

SubCells (Valikuline i täisarvuna = 0)

Sel juhul täisarvu argument i vaikimisi on 0.

Protseduuris võib olla mitu valikulist argumenti, mis kõik on loetletud argumentide loendi lõpus.

Argumentide edastamine väärtuse ja viite järgi

VBA argumente saab protseduurile edastada kahel viisil:

  • Autor:Val – argumendi edasiandmine väärtuse järgi. See tähendab, et protseduurile edastatakse ainult väärtus (st argumendi koopia) ja seetõttu lähevad protseduurist väljumisel kõik argumendis tehtud muudatused kaotsi.
  • Autor Ref – argumendi edastamine viitega. See tähendab, et argumendi asukoha tegelik aadress mälus edastatakse protseduurile. Kõik protseduuri sees argumendis tehtud muudatused salvestatakse protseduurist väljumisel.

Märksõnade kasutamine Autor:Val or Autor Ref protseduuri deklaratsioonis saab määrata, kuidas argument protseduurile edastatakse. See on näidatud allolevates näidetes:

Sub AddToCells(ByVal i As Integer) ... End Sub
Sel juhul täisarvu argument i väärtuse järgi möödas. Pärast protseduurist lahkumist alla kõik tehtud i muudatused lähevad kaotsi.
Alam AddToCells(ByRef i täisarvuna) ... End Sub
Sel juhul täisarvu argument i viitega läbitud. Pärast protseduurist lahkumist alla kõik tehtud i muudatused salvestatakse muutujasse, mis protseduurile edastati alla.

Pidage meeles, et VBA argumendid edastatakse vaikimisi viidetena. Teisisõnu, kui märksõnu ei kasutata Autor:Val or Autor Ref, siis edastatakse argument viitena.

Enne protseduuride jätkamist funktsioon и alla Üksikasjalikumalt on kasulik vaadata veel kord nende kahte tüüpi protseduuride omadusi ja erinevusi. Järgnevalt on toodud VBA protseduuride lühiarutlused funktsioon и alla ja näidatakse lihtsaid näiteid.

VBA protseduur "Funktsioon"

VBA redaktor tunneb protseduuri ära funktsioonkui see kohtab käskude rühma, mis on suletud järgmiste ava- ja sulgelausete vahele:

Funktsioon ... Lõpeta funktsioon

Nagu varem mainitud, protseduur funktsioon VBA-s (erinevalt alla) tagastab väärtuse. Tagastamisväärtuste suhtes kehtivad järgmised reeglid.

  • Tagastamisväärtuse andmetüüp tuleb deklareerida protseduuri päises funktsioon.
  • Tagastamisväärtust sisaldaval muutujal peab olema sama nimi, mis protseduuril funktsioon. Seda muutujat ei ole vaja eraldi deklareerida, kuna see on alati protseduuri lahutamatu osana olemas. funktsioon.

Seda illustreerib hästi järgmine näide.

VBA funktsiooni näide: matemaatilise tehte sooritamine 3 numbriga

Järgmine on VBA protseduurikoodi näide funktsioon, millel on kolm tüüpi argumenti Kahekordistada (topelttäpsusega ujukomaarvud). Selle tulemusena tagastab protseduur teise tüübinumbri Kahekordistadavõrdne kahe esimese argumendi summaga, millest on lahutatud kolmas argument:

Funktsioon SumMiinus(dNum1 as Double, dNum2 as Double, dNum3 as Double) kui Double SumMinus = dNum1 + dNum2 - dNum3 Lõppfunktsioon

See väga lihtne VBA protseduur funktsioon illustreerib, kuidas andmeid argumentide kaudu protseduurile edastatakse. Näete, et protseduuri tagastatud andmetüüp on määratletud kui Kahekordistada (sõnad ütlevad Nagu Double pärast argumentide loetelu). See näide näitab ka, kuidas protseduuri tulemus funktsioon salvestatakse protseduuri nimega sama nimega muutujas.

VBA protseduuri kutsumine funktsiooniks

Kui ülaltoodud lihtne protseduur funktsioon Visual Basicu redaktoris moodulisse sisestatuna saab seda kutsuda teistest VBA protseduuridest või kasutada Exceli töövihiku töölehel.

Kutsuge teisest protseduurist välja VBA protseduur “Function”.

Menetlus funktsioon saab kutsuda mõnest teisest VBA protseduurist, määrates selle protseduuri lihtsalt muutujale. Järgmine näide näitab protseduuri kutset Summinus, mis määratleti eespool.

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

Kutsuge töölehel VBA protseduur "Funktsioon".

VBA protseduur funktsioon saab Exceli töölehelt välja kutsuda samamoodi nagu mis tahes muud Exceli sisseehitatud funktsiooni. Seetõttu eelmises näites loodud protseduur funktsioon - Summinus saab kutsuda, sisestades töölehe lahtrisse järgmise avaldise:

=SumMinus(10, 5, 2)

VBA protseduur "Sub"

VBA toimetaja saab aru, et ees on protseduur allakui see kohtab käskude rühma, mis on suletud järgmiste ava- ja sulgelausete vahele:

Sub ... End Sub

VBA protseduur “Sub”: Näide 1. Keskjoondus ja fondi suuruse muutmine valitud lahtrivahemikus

Vaatleme lihtsa VBA protseduuri näidet alla, mille ülesanne on muuta valitud lahtrivahemiku vormingut. Lahtrid tsentreeritakse (nii vertikaalselt kui ka horisontaalselt) ja fondi suurus muudetakse kasutaja määratud suuruseks:

Alamvorming_keskne_ja_suurus (valikuline iFontSize as Integer = 10) Selection.Horizontal Alignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Size = iFontSize End Sub

See protseduur alla teeb toiminguid, kuid ei anna tulemust.

See näide kasutab ka valikulist argumenti Fondi suurus. Kui argument Fondi suurus menetlusse ei läinud alla, siis on selle vaikeväärtus 10. Kui aga argument Fondi suurus läks menetlusse alla, siis seatakse valitud lahtrivahemikule kasutaja määratud fondisuurus.

VBA alamprotseduur: näide 2: joondus keskele ja paks font valitud lahtrivahemikus

Järgmine protseduur sarnaneb äsja käsitletuga, kuid seekord rakendab see valitud lahtrivahemikule suuruse muutmise asemel paksu kirjastiili. See on protseduuri näide alla, mis ei nõua argumente:

Sub Format_Centered_And_Bold() Selection.Horizontal Alignment = xlCenter Selection.Vertical Alignment = xlCenter Selection.Font.Bold = True End Sub

Alamprotseduuri kutsumine Excel VBA-s

Helistage teisest protseduurist VBA protseduurile "Sub".

VBA protseduuri kutsumiseks alla mõnest teisest VBA protseduurist peate märksõna kirjutama Helista, protseduuri nimi alla ja edasi sulgudes on protseduuri argumendid. See on näidatud allolevas näites:

Sub main() Call Format_Centered_And_Sized(20) End Sub

Kui protseduur Vorming_keskne_ja_suurus on rohkem kui üks argument, tuleb need eraldada komadega. Nagu nii:

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

Kutsuge töölehel VBA protseduur "Sub".

Menetlus alla ei saa sisestada otse Exceli lehe lahtrisse, nagu seda saab teha protseduuriga funktsioonsest protseduur alla ei tagasta väärtust. Kuid protseduurid alla, millel pole argumente ja mis on deklareeritud kui avalik (nagu allpool näidatud) on töölehe kasutajatele kättesaadav. Seega, kui eespool käsitletud lihtsad protseduurid alla Visual Basic Editori moodulisse sisestatud protseduur Vorming_keskne_ja_paks on saadaval kasutamiseks Exceli töölehel ja protseduuris Vorming_keskne_ja_suurus – pole saadaval, kuna sellel on argumente.

Siin on lihtne viis protseduuri käivitamiseks (või käivitamiseks). alla, juurdepääsetav töölehelt:

  • press Alt + F8 (vajutage klahvi muu ja hoides seda all, vajutage klahvi F8).
  • Valige kuvatavast makrode loendist see, mida soovite käivitada.
  • press jooks (jookse)

Protseduuri läbiviimiseks alla kiiresti ja lihtsalt saate määrata sellele kiirklahvi. Selle jaoks:

  • press Alt + F8.
  • Valige kuvatavast makrode loendist see, millele soovite kiirklahvi määrata.
  • press parameetrid (Valikud) ja sisestage ilmuvas dialoogiboksis klaviatuuri otsetee.
  • press OK ja sulgege dialoog Makro (Makro).

tähelepanu: Kui määrate makrole kiirklahvi, veenduge, et seda ei kasutataks Excelis standardina (näiteks Ctrl + C). Kui valite juba olemasoleva kiirklahvi, määratakse see makrole ümber ja selle tulemusena võib kasutaja makro kogemata käivitada.

VBA protseduuri ulatus

Selle õpetuse 2. osas käsitleti muutujate ja konstantide ulatust ning märksõnade rolli. avalik и Era-. Neid märksõnu saab kasutada ka VBA protseduuridega:

Avalikud alamlahtrid (i täisarvuna) ... End Sub
Kui protseduuri deklaratsioonile eelneb märksõna avalik, siis on protseduur saadaval kõikidele selle VBA projekti moodulitele.
Privaatsed alamlahtrid (i As Integer) ... End Sub
Kui protseduuri deklaratsioonile eelneb märksõna Era-, siis on see protseduur saadaval ainult praeguse mooduli jaoks. Seda ei saa üheski teises moodulis ega Exceli töövihikust välja kutsuda.

Pidage meeles, et kui enne VBA protseduuri deklareerimist funktsioon or alla märksõna pole sisestatud, on protseduuri jaoks määratud vaikeomadus avalik (see tähendab, et see on selles VBA projektis kõikjal saadaval). See on vastupidine muutujate deklaratsioonidele, mis vaikimisi on Era-.

Varajane väljumine VBA protseduuridest "Function" ja "Sub"

Kui teil on vaja VBA-protseduuri täitmine lõpetada funktsioon or alla, ootamata selle loomulikku lõppu, siis on selleks operaatorid Väljumise funktsioon и Välju sub. Nende operaatorite kasutamine on näidatud allpool, kasutades näitena lihtsat protseduuri. funktsioonA, mis loodab saada positiivse argumendi edasiste toimingute tegemiseks. Kui protseduurile edastatakse mittepositiivne väärtus, ei saa enam toiminguid teha, seega peaks kasutajale ilmuma veateade ja protseduur peaks kohe väljuma:

Funktsioon VAT_Amount(sVAT_Rate As Single) Asingle VAT_Amount = 0 Kui sVAT_Rate <= 0 then MsgBox "Oodati sVAT_Rate positiivset väärtust, kuid saadi" & sVAT_Rate Väljumine Funktsioon Lõpeta Kui ... Lõpeta funktsioon

Pange tähele, et enne protseduuri lõpetamist funktsioon - Käibemaksu_summa, sisestatakse koodi sisseehitatud VBA-funktsioon Msgbox, mis kuvab kasutajale hoiatusakna.

Jäta vastus