Úvod
V tomto článku sa popisuje, ako používať premenné v Microsoft Excel pod procedúr v aplikácii Microsoft Visual Basic for Applications.
Ďalšie informácie
Premenné v pod procedúre
Výkonnou funkciou programovacích jazykov je schopnosť niečo uložiť do premennej tak, aby obsah premennej bolo možné použiť alebo zmeniť neskôr v postupe. Tento dokument popisuje nasledujúce používanie premenných v Visual Basic:
-
spôsob deklarovať premenné,
-
Postupy a projekty, ktoré môžu premennú použiť.
-
Životnosť premennej.
Deklarovanie premennej v makre
Najjednoduchším spôsobom deklarovať premennú v makre je použitie príkaza Dim. V nasledujúcom riadku sa deklarujú dve premenné ako celé čísla:
Dim x As Integer, y As Integer
Ak sú hodnoty x a y zadané ako celé čísla, Visual Basic uchová dostatok pamäte pre celočíselnú premennú (2 bajty pre hodnoty x a y) a že informácie uložené v x alebo y sú celé číslo v rozsahu -32768 až 32767.
POZNÁMKA: Ak deklarovate viac ako jednu premennú pomocou jedného príkazu Dim, musíte špecifikovať typ údajov pre každú premennú.
Ak nezadáte typ údajov pre každú premennú tak, ako je to v nasledujúcom Visual Basic kóde, ako celočíselná premenná je nastavená iba premenná y. Premenná x bude typom variantu:
Dim x, y As Integer
Ďalšie informácie nájdete v časti Údajový typ Variant nižšie.
Ak chcete vykonať test premennej, postupujte takto:
-
Uložte a zatvorte všetky otvorené zošity a potom otvorte nový zošit.
-
Spustite editor Visual Basic (stlačte kombináciu klávesov ALT + F11).
-
V ponuke Vložiť kliknite na položku Modul.
-
Zadajte nasledujúci kód:
Sub Variable_Test()
Dim x As Integer, y As Integer
x = 10
y = 100
MsgBox "hodnota x je " & x & _
Chr(13) & "hodnota y je " & y
End Sub -
Spustite Variable_Test makra. Zobrazí sa toto hlásenie:
the value of x is 10
the value of y is 100 -
Kliknite na tlačidlo OK.
-
V nasledujúcom Variable_Test zmeniť nasledujúci riadok:
x = 10 -
na:
x = "error" -
Spustite Variable_Test makra.
Chyba pri spustení sa zobrazí, pretože výraz "chyba" nie je celé číslo a pokúšate sa priradiť túto hodnotu reťazca k celočíselnej premennej x.
Súhrn typu údajov
Toto sú bežné typy údajov premenných:
údajový typ Variant
Ak pri deklarovaní premennej nezadáte typ údajov alebo ak deklarovate premennú vôbec, Visual Basic automaticky určí údajový typ variantu pre túto premennú. Nižšie sú uvedené výhody premenných deklarovaných ako tento typ údajov:
-
Premenné môžu obsahovať reťazce, dátum, čas, booleovské alebo číselné hodnoty.
-
Premenné môžu automaticky konvertovať hodnoty, ktoré obsahujú.
Nevýhodou je, že premenné typu Variant vyžadujú minimálne 16 bajtov pamäte. 16 bajtov pamäte môže byť vo veľkých postupoch alebo v zložitých moduloch významné.
Ak chcete zistiť, ako to funguje v Variable_Test makra, postupujte takto:
Zmeňte kód v makre Variable_Test na:
Sub Variable_Test()
Dim x, y
x = "string"
y = 1.23
MsgBox "the value of x is " & x & _
Chr(13) & "the value of y is " & y
End Sub
Spustite Variable_Test makra.
Chyba sa zobrazí, pretože premenným variantu x a y môžete priradiť čokoľvek.
POZNÁMKA: Môžete tiež vynechať nasledujúci riadok a makro bude fungovať aj naďalej, keď sa premenné x a y budú považovať za typy údajov Variant:
Dim x, y
Rozsah premennej
Keď deklarujete premennú, môže, ale nemusia sa zobraziť inými makrami v rovnakom module, v iných moduloch alebo v iných projektoch. Táto dostupnosť premennej v moduloch sa označuje ako rozsah. Tri typy rozsahu sú na úrovni procedúr, na úrovni súkromného modulu a na úrovni verejného modulu. Rozsah závisí od toho, ako a kde deklarujte premenné alebo premenné.
Rozsah na úrovni procedúr
Premenná s rozsahom na úrovni postupu sa nebude nachádzať mimo postupu, v ktorom je deklarovaná. Ak nastavíte hodnotu premennej, ktorá má rozsah na úrovni postupu, obsah tejto premennej sa ostatným makrám nebude zobraziť.
Ak chcete overiť, či sa premenná s rozsahom na úrovni postupu nezachová mimo procedúry v deklarovanej procedúre, postupujte takto:
-
Vložte do projektu nový modul.
-
Do tohto modulu zadajte obe nasledujúce makrá:
Sub Macro1() Dim x As Integer x = 10 MsgBox "x, as seen by Macro1 is " & x 'the next line runs Macro2 Macro2 End Sub Sub Macro2() MsgBox "x, as seen by Macro2 is " & x End Sub -
Spustite makro1 a zobrazí sa toto hlásenie:
x, as seen by Macro1 is 10 -
Kliknite na tlačidlo OKa zobrazí sa nasledujúce hlásenie:
x, as seen by Macro2 is -
Kliknite na tlačidlo OK.
Makro2 nezobrazí hodnotu premennej x, pretože premenná x je lokálna pre makro1.
Rozsah na úrovni súkromného a verejného modulu
Premenné môžete definovať v sekcii deklarácií modulu (v hornej časti modulu nad všetkými pod procedúrami) a nastaviť rozsah premennej pomocou verejného príkazu, príkazu Dim alebo príkazu Private. Ak umiestnite príkaz Public pred premennú, premenná bude k dispozícii pre všetky makrá vo všetkých moduloch v projekte. Ak umiestnite príkaz Dim alebo súkromný príkaz pred premennú, vaša premenná je dostupná iba pre makrá v module, v ktorom je deklarovaná.
Ak chcete zobraziť rozdiel medzi príkazom Verejné a príkazom Dim, postupujte takto:
-
Uložte a zatvorte všetky otvorené zošity a potom otvorte nový zošit.
-
Spustite Visual Basic Editor.
-
Vložte modul do projektu.
-
Type the following code into this module: Public x As Integer Sub Macro_1a() x = 10 MsgBox x Macro_1b End Sub Sub Macro_1b() x = x * 2 MsgBox x Macro2 End Sub
-
Vložte do projektu ďalší modul.
-
Do tohto modulu zadajte nasledujúci kód:
Sub Macro2() x = x * 3
MsgBox x
End Sub -
Spustite Macro_1a makra v prvom module.
-
Ak je premenná x deklarovaná ako "Public x As Integer", všetky tri makrá v projekte majú prístup k hodnote x. V prvom okne s hlásením sa zobrazí hodnota 10. V druhom okne s hlásením sa zobrazí hodnota 20 (pretože hodnota x sa vynásobí hodnotou 2 v Macro_1b). V treťom okne s hlásením sa zobrazí hodnota 60 (pretože hodnota x bola v časti Macro_1b zmenená na 20 a potom bola v makre vynásobená číslom 3).
-
Zmeňte riadok deklarácie v prvom module z:
Public x As Integer
na:
Dim x As Integer -
Spustite Macro_1a makra.
-
Ak je premenná x deklarovaná ako Dim x As Integer, majú prístup k hodnote x iba makrá v prvom module. Takže prvé okno s hlásením zobrazí hodnotu 10, v druhom okne hlásenia sa zobrazí hodnota 20, (pretože v poli s hlásením Macro_1b x sa vynásobí číslom 2) a v treťom okne s hlásením sa zobrazí hodnota 0 (pretože Makro2 nevedie hodnotu x a makro 2 používa neinicializovanú hodnotu nula).
-
Zmeňte riadok deklarácie v prvom module z:
Dim x As Integer
ak chcete:
Private x As Integer -
Spustite Macro_1a makra.
-
Rovnaké polia správ sa zobrazujú pomocou rozsahu súkromného výpisu ako pri použití príkazu Dim. Premenná x má rovnaký rozsah, súkromný pre modul, v ktorom je deklarovaná.
POZNÁMKA: Ak chcete, aby bol rozsah premennej obmedzený na modul, v ktorom je deklarovaný, namiesto prehlásenia Dim použite príkaz Privatestatement. Oba majú rovnaký účinok, ale pri čítaní kódu pri použití súkromného vyhlásenia je rozsah jasnejší.
Čas platnosti premennej
Čas, počas ktorého si premenná zachováva svoju hodnotu, sa nazýva jeho životnosť. Hodnota premennej sa môže zmeniť počas svojej platnosti, ale zachová hodnotu. Ak premenná stratí rozsah, už nemá hodnotu.
Inicializácia hodnoty premennej
Po spustení makra sa všetky premenné inicializujú na hodnotu. Číselná premenná sa inicializuje na nulu, reťazec s variabilnou dĺžkou sa inicializuje na reťazec s nulovou dĺžkou ("") a reťazec s pevnou dĺžkou je vyplnený kódom ASCII 0. Premenné typu Variant sú inicializované na prázdne. Prázdna premenná je v číselnom kontexte zastúpená nulou a reťazec s nulovou dĺžkou ("") v kontexte reťazca.
Premenné na úrovni postupu
Ak máte premennú deklarovanú v makre pomocou príkazu Dim, premenná si zachová svoju hodnotu, kým je makro spustené. Ak toto makro vyvolá iné makrá, hodnota premennej sa zachová (nie je však k dispozícii pre ďalšie makrá), pokiaľ sú spustené aj tieto ďalšie makrá.
Ak chcete ukázať, ako fungujú premenné na úrovni procedúr, postupujte takto:
-
Vložte do projektu nový modul.
-
Do tohto modulu zadajte obe nasledujúce makrá:
Sub Macro1()
'set x as a procedure level variable
Dim x As Integer
MsgBox Inicializovaná hodnota x je " & x
x = 10
MsgBox "x je " & x
Ďalší riadok spúšťa Makro2
Makro2
MsgBox "x je stále " & x
End Sub
Sub Macro2()
MsgBox "x, ako vidia Macro2 je " & x
End Sub -
Spustite makro1.
-
Zobrazí sa toto hlásenie:
the initialized value of x is 0 -
Kliknite na tlačidlo OKa zobrazí sa hlásenie:
x is 10 -
Kliknite na tlačidlo OKa zobrazí sa nasledujúce hlásenie:
x, as seen by Macro2 is -
Kliknite na tlačidlo OK.
-
Makro2 nezobrazí hodnotu premennej x, pretože premenná x je lokálna pre makro1. Zobrazí sa toto hlásenie:
x is still 10 -
Kliknite na tlačidlo OK.
-
Spustenie makra1.
Prijímate rovnaké hlásenia, aké sú popísané v krokoch 3 až 6, pretože po zastavení spustenia makra1 v kroku 6 sa hodnota premennej x stratila. Ak teda znova otvoríte Makro1 v kroku 7, v prvej správe sa zobrazí hodnota x ako nula (inicializovaná hodnota).
Statické kľúčové slovo
Ak je premenná na úrovni postupu deklarovaná pomocou statického kľúčového slova, premenná si zachová hodnotu, až kým sa projekt nevynuluje. Ak teda máte statickú premennú, pri ďalšom vol volovaní procedúry sa statická premenná inicializuje na jej poslednú hodnotu.
Ak chcete zistiť, ako statické kľúčové slovo funguje, postupujte takto:
-
Change the code in Macro1 to: Sub Macro1() 'set x as a procedure level variable Static x As Integer MsgBox "the initialized value of x is " & x x = x + 10 MsgBox "x is " & x End Sub
-
Spustite makro1.
-
Zobrazí sa toto hlásenie:
the initialized value of x is 0 -
Kliknite na tlačidlo OKa zobrazí sa hlásenie:
x is 10 -
Kliknite na tlačidlo OK.
-
Spustite makro1 a zobrazí sa toto hlásenie:
the initialized value of x is 10 -
Kliknite na tlačidlo OKa zobrazí sa nasledujúce hlásenie:
x is 20 -
Kliknite na tlačidlo OK.
Hodnoty, ktoré sa zobrazujú v správach, sú odlišné druhýkrát, pretože premenná x je deklarovaná ako statická premenná a jej hodnota sa zachová po prvom spustení makra1.
POZNÁMKA: Ak máte premennú na úrovni modulu, jeho životnosť je rovnaká ako v prípade statickej premennej na úrovni procedúr.
Ak chcete overiť čas platnosti premennej na úrovni modulu, postupujte takto:
-
Change the code in the module that contains Macro1 to the following: Dim x As Integer 'create a module-level variable Sub Macro1() MsgBox "the initialized value of x is " & x x = x + 10 MsgBox "x is " & x End Sub
-
Spustite makro1 a zobrazí sa toto hlásenie:
the initialized value of x is 0 -
Kliknite na tlačidlo OK a zobrazí sa nasledujúce hlásenie:
x is 10 -
Kliknite na tlačidlo OK.
-
Spustite makro1 a zobrazí sa toto hlásenie:
the initialized value of x is 10 -
Kliknite na tlačidlo OK.
-
Zobrazí sa toto hlásenie:
x is 20 -
Kliknite na tlačidlo OK.
Hodnoty, ktoré sa zobrazujú v správach, sú po druhom čase odlišné, pretože premenná x je deklarovaná ako statická premenná a zachováva jej hodnotu po prvom spustení makra1.
Vynulovanie premenných v projekte
Ak chcete obnoviť hodnotu statickej premennej alebo premennej úrovne modulu, kliknite na tlačidlo Resetovať na
Štandardný panel s nástrojmi alebo kliknite na položku Obnoviť v ponuke Spustiť.
Ak to urobiť pre projekt Macro1 a potom znova spustite Makro1,hodnota premennej x sa inicializuje späť na nulu a zobrazí sa prvé hlásenie:
the initialized value of x is 0