Kintamieji ir konstantos VBA

VBA, kaip ir bet kurioje kitoje programavimo kalboje, kintamieji ir konstantos naudojami bet kokioms reikšmėms saugoti. Kaip rodo pavadinimas, kintamieji gali keistis, o konstantos saugo fiksuotas reikšmes.

Pavyzdžiui, konstanta Pi išsaugo reikšmę 3,14159265... Skaičius „Pi“ programos vykdymo metu nepasikeis, tačiau tokią reikšmę vis tiek patogiau išsaugoti kaip konstantą.

Tuo pačiu metu galime naudoti kintamąjį sVAT_Rate įsigytų prekių PVM tarifui saugoti. Kintamoji vertė sVAT_Rate gali skirtis priklausomai nuo įsigyto gaminio.

Duomenų tipai

Visi kintamieji ir konstantos yra tam tikro duomenų tipo. Toliau pateiktoje lentelėje pateikiami VBA naudojami duomenų tipai su aprašymu ir galimų reikšmių diapazonu:

Duomenų tipas DydisAprašymasVertybių diapazonas
Baitas1 baitaiTeigiami sveikieji skaičiai; dažnai naudojamas dvejetainiams duomenimsnuo 0 į 255
Būlio2 baitaiGali būti tiesa arba klaidingaTiesa ar melas
Sveikasis skaičius2 baitaisveikieji skaičiai (be trupmeninės dalies)nuo -32 iki +768
ilgai4 baitaiDideli sveikieji skaičiai (be trupmeninės dalies)от -2 147 483 648 до +2 147 483 647
vienas4 baitaiVieno tikslumo slankiojo kablelio skaičiusnuo -3.4e38 iki +3.4e38
dvigubai8 baitaiDvigubo tikslumo slankiojo kablelio skaičiusnuo -1.8e308 iki +1.8e308
valiuta8 baitaiSlankaus kablelio skaičius su fiksuotu kablelio skaičiumiот -922 337 203 685 477.5808 до +922 337 203 685 477.5807
Data8 baitaiData ir laikas – Data tipo duomenys rodomi slankiojo kablelio skaičiumi. Sveikoji šio skaičiaus dalis išreiškia datą, o trupmeninė – laiką.nuo 1 sausio 100 d. iki 31 m. gruodžio 9999 d
Objektas4 baitaiObjekto nuorodaBet kokia objekto nuoroda
StyginiųkeičiasiSimbolių rinkinys. Stygos tipas gali būti fiksuoto arba kintamo ilgio. Dažniau naudojamas su kintamu ilgiuFiksuotas ilgis – iki maždaug 65 simbolių. Kintamo ilgio – iki maždaug 500 milijardų simbolių
variantaskeičiasiGali būti datos, plūduriavimo arba simbolių eilutės. Šis tipas naudojamas tais atvejais, kai iš anksto nežinoma, kokio tipo duomenys bus įvesti.Skaičius – dvigubas, eilutė – eilutė

Akivaizdu, kad naudodami aukščiau esančią lentelę ir pasirinkę tinkamą duomenų tipą, galite ekonomiškiau naudoti atmintį (pvz., pasirinkti duomenų tipą Sveikasis skaičius užuot ilgai or vienas užuot dvigubai). Tačiau, kai naudojate kompaktiškesnius duomenų tipus, turite būti atsargūs, kad jūsų kodas nesistengtų į juos įtraukti neproporcingai didelių reikšmių.

Kintamųjų ir konstantų deklaravimas

Vertėjo pastaba: Kalbant apie VBA kintamuosius, verta paminėti dar vieną labai svarbų dalyką. Jei deklaruojame kintamąjį, bet nepriskiriame jam jokios reikšmės, tada jis inicijuojamas numatytąja verte:

• teksto eilutės inicijuojamos tuščiomis eilutėmis;

• skaičiai — reikšmė 0;

• tipo kintamieji Būlio — Netiesa;

• datos – 30 m. gruodžio 1899 d.

Prieš pradedant naudoti kintamąjį arba konstantą, jis turi būti deklaruotas. Norėdami tai padaryti, prie makrokomandos pridėkite šią paprastą kodo eilutę:

Dim Имя_Переменной As Тип_Данных

Aukščiau esančioje kodo eilutėje Kintamasis_vardas yra kintamojo, kuris bus naudojamas kode, pavadinimas ir Duomenų tipas yra vienas iš duomenų tipų iš lentelės, pateiktos šiek tiek anksčiau šiame straipsnyje. Pavyzdžiui:

Dim sVAT_Rate As Single Dim i As Integer

Panašiai deklaruojamos ir konstantos, tačiau deklaruojant konstantas iš karto reikia nurodyti jų reikšmę. Pavyzdžiui, taip:

Const iMaxCount = 5000 Const iMaxScore = 100

„Excel“ kintamųjų deklaruoti nebūtina. Pagal numatytuosius nustatymus visi „Excel“ įvesti, bet nedeklaruoti kintamieji turės tokio tipo variantas ir galės priimti tiek skaitines, tiek tekstines reikšmes.

Taigi programuotojas gali naudoti naują kintamąjį bet kuriuo metu (net jei jis nebuvo deklaruotas), o „Excel“ laikys jį kaip tipo kintamąjį variantas. Tačiau yra keletas priežasčių, kodėl tai neturėtų būti daroma:

  1. Atminties naudojimas ir skaičiavimo greitis. Jei nedeklaruojate kintamojo su duomenų tipo nuoroda, pagal numatytuosius nustatymus jis bus nustatytas į tipą variantas. Šis duomenų tipas naudoja daugiau atminties nei kiti duomenų tipai. Keli papildomi baitai vienam kintamajam gali atrodyti mažai, tačiau praktiškai programos gali turėti tūkstančius kintamųjų (ypač dirbant su masyvais). Todėl papildoma atmintis, kurią naudoja tokie kintamieji kaip variantas, palyginti su tipo kintamaisiais Sveikasis skaičius or vienas, gali sudaryti didelę sumą. Be to, operacijos su tipo kintamaisiais variantas yra vykdomi daug lėčiau nei su kitų tipų kintamaisiais, atitinkamai papildomai tūkstantis tipo kintamųjų variantas gali žymiai sulėtinti skaičiavimus.
  2. Rašybos klaidų prevencija kintamųjų pavadinimuose. Jei visi kintamieji yra deklaruoti, tada galima naudoti VBA teiginį − Aiški parinktis (apie tai kalbėsime vėliau), kad būtų galima identifikuoti visus nedeklaruotus kintamuosius. Tai pašalina klaidos atsiradimą programoje dėl neteisingai parašyto kintamojo pavadinimo. Pavyzdžiui, naudojant kintamąjį pavadinimu sVAT_Rate, galite padaryti rašybos klaidą ir, priskirdami šiam kintamajam reikšmę, parašyti: „VATRate = 0,175“. Tikimasi, kad nuo šiol kintamasis sVAT_Rate turėtų būti 0,175, bet, žinoma, nėra. Jei įjungtas visų naudojamų kintamųjų privalomo deklaravimo režimas, VBA kompiliatorius iš karto parodys klaidą, nes neras kintamojo VATRAte tarp paskelbtųjų.
  3. Paryškinamos reikšmės, kurios neatitinka deklaruoto kintamojo tipo. Jei deklaruosite tam tikro tipo kintamąjį ir bandysite jam priskirti kitokio tipo duomenis, gausite klaidą, kurios neištaisius gali sugesti programa. Iš pirmo žvilgsnio tai gali atrodyti kaip gera priežastis nedeklaruoti kintamųjų, tačiau iš tikrųjų, nei anksčiau, paaiškėja, kad vienas iš kintamųjų gavo neteisingus duomenis, kuriuos turėjo gauti – tuo geriau! Priešingu atveju, jei programa ir toliau paleis, rezultatai gali būti neteisingi ir netikėti, o klaidų priežastis bus daug sunkiau surasti. Taip pat gali būti, kad makrokomanda bus „sėkmingai“ įvykdyta. Dėl to klaida bus nepastebėta ir darbas bus tęsiamas su neteisingais duomenimis!

Šiuo atžvilgiu pageidautina aptikti neteisingą duomenų tipą ir kuo anksčiau ištaisyti tokias klaidas kode. Dėl šių priežasčių, rašant VBA makrokomandą, rekomenduojama deklaruoti visus kintamuosius.

Aiški parinktis

operatorius Aiški parinktis priverčia deklaruoti visus kintamuosius, kurie bus naudojami VBA kode, ir pažymi visus nedeklaruotus kintamuosius kaip klaidas kompiliavimo metu (prieš prasidedant kodo vykdymui). Taikyti šį operatorių nėra sunku – tiesiog parašykite šią eilutę pačioje VBA failo viršuje:

Option Explicit

Jei norite visada įterpti Aiški parinktis kiekvieno naujo sukurto VBA modulio viršuje, tai galima padaryti automatiškai. Norėdami tai padaryti, turite įjungti parinktį Reikalauti kintamos deklaracijos VBA redaktoriaus nustatymuose.

Tai daroma taip:

  • „Visual Basic Editor“ meniu spustelėkite įrankiai > Nustatymai
  • Pasirodžiusiame dialogo lange atidarykite skirtuką redaktorius
  • Pažymėkite langelį Reikalauti kintamos deklaracijos ir paspauskite OK

Kai įjungta, eilutė Aiški parinktis bus automatiškai įterptas kiekvieno naujo sukurto modulio pradžioje.

Kintamųjų ir konstantų sritis

Kiekvienas deklaruojamas kintamasis arba konstanta turi savo ribotą apimtį, tai yra ribotą programos dalį, kurioje šis kintamasis egzistuoja. Apimtis priklauso nuo to, kur buvo paskelbtas kintamasis arba konstanta. Paimkite, pavyzdžiui, kintamąjį sVAT_Rate, kuris naudojamas funkcijoje Iš viso išlaidų. Šioje lentelėje aptariamos dvi kintamos apimties parinktys sVAT_Ratedeklaruojamos dviejose skirtingose ​​modulio pozicijose:

Parinktis Aiškiai Pritemdyti sVAT_Rate kaip vieną funkciją Total_Cost() kaip dvigubą... Pabaigos funkcija
Jei kintamasis sVAT_Rate deklaruojamas pačioje modulio pradžioje, tada šio kintamojo apimtis bus visas modulis (ty kintamasis sVAT_Rate bus atpažinti pagal visas šio modulio procedūras).

Todėl, jei funkcijoje Iš viso išlaidų kintamas sVAT_Rate bus priskirta tam tikra reikšmė, tada kita tame pačiame modulyje vykdoma funkcija naudos kintamąjį sVAT_Rate su ta pačia prasme.

Tačiau jei iškviečiama kokia nors funkcija, esanti kitame modulyje, tada jai skirtas kintamasis sVAT_Rate nebus žinoma.

Parinktis Aiški funkcija Total_Cost() kaip dvigubai pritemdytas sVAT_rate kaip vienas ... Pabaigos funkcija
Jei kintamasis sVAT_Rate paskelbta funkcijos pradžioje Iš viso išlaidų, tada jos taikymo sritis bus apribota tik šia funkcija (ty funkcijos viduje Iš viso išlaidų, galite naudoti kintamąjį sVAT_Rate, bet ne lauke).

Bandant naudoti sVAT_Rate kitoje procedūroje VBA kompiliatorius praneš apie klaidą, nes šis kintamasis nebuvo deklaruotas už funkcijos ribų Iš viso išlaidų (su sąlyga, kad naudojamas operatorius Aiški parinktis).

Aukščiau pateiktame pavyzdyje kintamasis deklaruojamas modulio lygiu su raktiniu žodžiu Dim. Tačiau gali prireikti, kad deklaruoti kintamieji gali būti naudojami kituose moduliuose. Tokiais atvejais vietoj raktinio žodžio deklaruoti kintamąjį Dim turi būti naudojamas raktinis žodis Visuomenės.

Beje, norint deklaruoti kintamąjį modulio lygiu, o ne raktinį žodį Dim galima naudoti raktinį žodį Privatus, kuris rodo, kad šis kintamasis skirtas naudoti tik dabartiniame modulyje.

Taip pat galite naudoti raktinius žodžius konstantoms deklaruoti. Visuomenės и Privatus, bet ne vietoj raktinio žodžio Const, kartu su juo.

Toliau pateikti pavyzdžiai rodo raktinių žodžių naudojimą Visuomenės и Privatus taikomi kintamiesiems ir konstantoms.

Parinktis Aiškus viešas sVAT_Rate kaip vieno viešo konst. iMax_Count = 5000...    
Šiame pavyzdyje raktinis žodis Visuomenės naudojamas deklaruoti kintamąjį sVAT_Rate ir konstantos iMax_Count. Tokiu būdu deklaruotų elementų apimtis bus visas dabartinis projektas.

Tai reiškia, kad sVAT_Rate и iMax_Count bus prieinama bet kuriame projekto modulyje.

Parinktis Aiškus privatus sVAT_Rate As Single Private Const iMax_Count = 5000...    
Šiame pavyzdyje deklaruoti kintamąjį sVAT_Rate ir konstantos iMax_Count naudojamas raktinis žodis Privatus. Šių elementų apimtis yra dabartinis modulis.

Tai reiškia, kad sVAT_Rate и iMax_Count bus prieinamos visose dabartinio modulio procedūrose, bet nebus prieinamos kitų modulių procedūroms.

Palikti atsakymą