Úvod
Tento článek popisuje použití proměnných v dílčích procedurách aplikace Microsoft Excel v jazyce Microsoft jazyk Visual Basic for Application.
Další informace
Proměnné v dílčí proceduře
Výkonnou vlastností programovacích jazyků je schopnost uložit něco do proměnné, takže obsah proměnné může být použit nebo změněn později v proceduře. Tento dokument popisuje následující použití proměnných v jazyce Visual Basic:
- Jak se proměnné deklarují.
- Procedury a projekty, které mohou proměnnou používat.
- Doba života proměnné.
Deklarace proměnné v makru
Nejjednodušší způsob, jak deklarovat proměnnou v makru, je použít příkaz Dim. Následující řádek deklaruje dvě proměnné jako celá čísla:
Dim x As Integer, y As Integer
Pokud jsou jako celá čísla zadaná x a y, říkáte jazyku Visual Basic, aby vyhradil dostatek paměti pro celočíselnou proměnnou (po 2 bajtech pro x a y) a aby informace uložené v x nebo y byly celé číslo v rozsahu -32768 až 32767.
POZNÁMKA: Pokud deklarujete více než jednu proměnnou pomocí jednoho příkazu Dim, musíte zadat datový typ pro každou proměnnou.
Pokud nezadáte datový typ pro každou proměnnou, jako v následujícím kódu jazyka Visual Basic, nastaví se jako celočíselná proměnná pouze proměnná y. Proměnná x bude typu variant:
Dim x, y As Integer
Další informace najdete níže v tématu Datový typ Variant .
Chcete-li provést test proměnné, postupujte takto:
Uložte a zavřete všechny otevřené sešity a pak otevřete nový sešit.
Spusťte Visual Basic Editor (stiskněte klávesy ALT+F11).
V nabídce Vložit klikněte na Modul.
Zadejte tento 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 SubSpusťte makro Variable_Test . Zobrazí se následující zpráva:
the value of x is 10
the value of y is 100Klikněte na OK.
V makru Variable_Test změňte následující řádek:
x = 10Požadovaná akce:
x = "error"Spusťte makro Variable_Test .
Obdržíte chybu za běhu, protože "error" není celé číslo a pokoušíte se přiřadit tuto řetězcovou hodnotu celočíselné proměnné x.
Souhrn datových typů
Jedná se o běžné datové typy proměnných:
Datový typ Variant
Pokud při deklaraci proměnné nezadáte datový typ nebo proměnnou nedeklarujete vůbec, Visual Basic automaticky určí datový typ variant pro tuto proměnnou. Výhody proměnných, které jsou deklarovány jako tento datový typ:
- Proměnné mohou obsahovat řetězec, datum, čas, logickou hodnotu nebo číselné hodnoty.
- Proměnné mohou hodnoty obsažené v proměnných převádět automaticky.
Nevýhodou je, že proměnné variant vyžadují alespoň 16 bajtů paměti. 16 bajtů paměti může být významné ve velkých procedurách nebo ve složitých modulech.
Pokud se chcete podívat, jak to funguje v makru Variable_Test, postupujte takto:
Změňte kód v makru Variable_Test takto:
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
Spusťte makro Variable_Test .
Neobdržíte chybu, protože k proměnným x a y můžete přiřadit cokoli.
POZNÁMKA: Můžete taky vynechat následující řádek a makro bude dál fungovat, protože proměnné x a y se budou považovat za datové typy Variant:
Dim x, y
Rozsah proměnné
Když deklarujete proměnnou, může a nemusí být viditelná jinými makry ve stejném modulu, v jiných modulech nebo v jiných projektech. Tato dostupnost proměnné v modulech se označuje jako rozsah. Existují tři typy rozsahu na úrovni procedur, na úrovni soukromého modulu a na úrovni veřejného modulu. Rozsah závisí na tom, jak a kde proměnnou nebo proměnné deklarujete.
Rozsah na úrovni procedury
Proměnná s oborem na úrovni procedury není vidět mimo proceduru, ve které je deklarována. Pokud nastavíte hodnotu proměnné, která má obor na úrovni procedury, obsah této proměnné ostatní makra neuvidí.
Pokud chcete ověřit, že proměnná s rozsahem na úrovni procedury není vidět mimo proceduru, ve které je deklarována, postupujte takto:
Vložte do projektu nový modul.
Zadejte do tohoto modulu obě následující makra:
Sub Macro1() Dim x As Integer x = 10 MsgBox "x, jak vidí Macro1 je " & x 'další řádek běží Macro2 Macro2 End Sub Macro2() MsgBox "x, jak vidí Macro2 je " & x End SubSpusťte makro1 a zobrazí se následující zpráva:
x, as seen by Macro1 is 10Klikněte na OK a zobrazí se následující zpráva:
x, as seen by Macro2 isKlikněte na OK.
Makro2 nezobrazuje hodnotu proměnné x, protože proměnná x je místní pro Makro1.
Obor na úrovni privátního a veřejného modulu
Proměnné můžete definovat v části deklarací modulu (v horní části modulu, nad všemi dílčími procedurami) a nastavit rozsah proměnné pomocí Public příkazu, Dim příkazu nebo Private příkazu. Pokud před proměnnou umístíte příkaz Public, bude proměnná dostupná pro všechna makra ve všech modulech v projektu. Pokud před proměnnou umístíte příkaz Dim nebo příkaz private, bude proměnná dostupná pouze pro makra v modulu, ve kterém je deklarována.
Rozdíl mezi veřejným a dim příkazem zobrazíte takto:
Uložte a zavřete všechny otevřené sešity a pak otevřete nový sešit.
Spusťte program Visual Basic Editor.
Vložte do projektu modul.
-
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 další modul.
Do tohoto modulu zadejte následující kód:
Sub Macro2()
x = x * 3
MsgBox x
End SubSpusťte Macro_1a makro v prvním modulu.
S proměnnou x deklarovanou jako Public x As Integer mají všechna tři makra v projektu přístup k hodnotě x. V prvním okně se zprávou se zobrazí hodnota 10. Ve druhém okně se zprávou se zobrazí hodnota 20 (protože x se v Macro_1b násobí 2). Ve třetím okně se zprávou se zobrazí hodnota 60 (protože hodnota x byla v Macro_1b změněna na 20 a potom byla v Makru2 vynásobena 3).
Řádek deklarace v prvním modulu změňte z:
Public x As IntegerPožadovaná akce:
Dim x As IntegerSpusťte makro Macro_1a .
Pokud je proměnná x deklarovaná jako "Dim x As Integer", mají k hodnotě x přístup jenom makra v prvním modulu. V prvním okně se zprávou se tedy zobrazí hodnota 10, ve druhém okně se zprávou hodnota 20 (protože hodnota x se v Macro_1b násobí hodnotou 2) a ve třetím okně se zprávou se zobrazí hodnota 0 (protože makro2 nevidí hodnotu x a neinicializovanou hodnotu nula používá makro 2).
Řádek deklarace v prvním modulu změňte z:
Dim x As IntegerPožadovaná akce:
Private x As IntegerSpusťte makro Macro_1a .
Stejná okna zpráv se zobrazují pomocí oboru Private výpisu, jako by používali Dim příkaz. Proměnná x má stejný obor, soukromý modulu, ve kterém je deklarována.
POZNÁMKA: Pokud chcete, aby byl rozsah proměnné omezen na modul, ve kterém je deklarována, použijte Privatestatement místo Dim příkazu. Oba dosahují stejného efektu, ale rozsah je jasnější, když si přečtete kód, pokud použijete Private příkaz.
Životnost proměnné
Doba, po kterou si proměnná zachovává svou hodnotu, se označuje jako její životnost. Hodnota proměnné se může během její životnosti měnit, ale tuto hodnotu si zachová. Navíc, když proměnná ztratí obor, nemá už hodnotu.
Inicializace hodnoty proměnné
Když spustíte makro, všechny proměnné se inicializují na hodnotu. Číselná proměnná se inicializuje na nulu, řetězec s proměnnou délkou se inicializuje na řetězec nulové délky ("") a řetězec s pevnou délkou se vyplní kódem ASCII 0. Proměnné variant jsou inicializovány na Empty. Prázdná proměnná je reprezentována nulou v číselném kontextu a řetězcem nulové délky ("") v řetězcovém kontextu.
Proměnné na úrovni procedury
Pokud máte proměnnou, která je v makru deklarovaná pomocí příkazu Dim, proměnná si zachová svou hodnotu, dokud je makro spuštěné. Pokud toto makro volá jiná makra, zůstane hodnota proměnné zachována (není však dostupná pro ostatní makra), dokud jsou tato makra také spuštěna.
Chcete-li demonstrovat, jak proměnné na úrovni procedury fungují, postupujte takto:
Vložte do projektu nový modul.
Zadejte do tohoto modulu obě následující makra:
Sub Macro1()
'nastavit x jako proměnnou úrovně procedury
Dim x As Integer
MsgBox "inicializovaná hodnota x je " & x
x = 10
MsgBox "x is " & x
'the next line runs Macro2
Makro2
MsgBox "x is still " & x
End Sub
Sub Macro2()
MsgBox "x, jak viděno Macro2 je" & x
End SubSpusťte makro1.
Zobrazí se následující zpráva:
the initialized value of x is 0Klikněte na OK a zobrazí se zpráva:
x is 10Klikněte na OK a zobrazí se následující zpráva:
x, as seen by Macro2 isKlikněte na OK.
Makro2 nezobrazuje hodnotu proměnné x, protože proměnná x je místní pro Makro1. Zobrazí se následující zpráva:
x is still 10Klikněte na OK.
Spusťte makro1.
Zobrazí se stejné zprávy, které jsou popsány v krocích 3 až 6, protože jakmile se Makro1 v kroku 6 zastavilo, ztratila se hodnota proměnné x. Proto se při opětovném spuštění Makra1 v kroku 7 zobrazí jako první zpráva hodnota x jako nula (inicializovaná hodnota).
Statické klíčové slovo
Pokud je proměnná na úrovni procedury deklarována pomocí klíčového slova, proměnná si zachová svou hodnotu, dokud se projekt neresetuje. Proto pokud máte statickou proměnnou, při příštím volání procedury se statická proměnná inicializuje na svou poslední hodnotu.
Chcete-li zjistit, jak klíčové slovo Static funguje, postupujte takto:
1.
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
Spusťte makro1.
Zobrazí se zpráva:
the initialized value of x is 0Klikněte na OK a zobrazí se zpráva:
x is 10Klikněte na OK.
Spusťte makro1 a zobrazí se následující zpráva:
the initialized value of x is 10Klikněte na OK a zobrazí se následující zpráva:
x is 20Klikněte na OK.
Hodnoty zobrazené ve zprávách se podruhé liší, protože proměnná x je deklarována jako statická proměnná a proměnná si svou hodnotu zachová i po prvním spuštění Macro1.
POZNÁMKA: Pokud máte proměnnou na úrovni modulu, její životnost je stejná, jako kdyby se jednalo o statickou proměnnou na úrovni procedury.
Pokud chcete ověřit životnost proměnné na úrovni modulu, postupujte takto:
1.
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
Spusťte makro1 a zobrazí se následující zpráva:
the initialized value of x is 0Klikněte na OK a zobrazí se následující zpráva:
x is 10Klikněte na OK.
Spusťte makro1 a zobrazí se tato zpráva:
the initialized value of x is 10Klikněte na OK.
Zobrazí se následující zpráva:
x is 20Klikněte na OK.
Hodnoty zobrazené ve zprávách se podruhé liší, protože proměnná x je deklarována jako statická proměnná a zachová si svou hodnotu i po prvním spuštění Macro1 .
Resetování projektu za účelem resetování proměnných
Pokud chcete resetovat hodnotu statické proměnné nebo proměnné na úrovni modulu, klikněte na tlačítko Resetovat na
nebo klepněte na příkaz Obnovit v nabídce Spustit .
Pokud to uděláte pro projekt Makro1 a pak znovu spustíte Makro1, hodnota proměnné x se inicializuje zpět na nulu a zobrazí se první zpráva:
the initialized value of x is 0