Jak používat proměnné v dílčích procedurách aplikace Excel v jazyce jazyk Visual Basic for Application

Ú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:

  1. Uložte a zavřete všechny otevřené sešity a pak otevřete nový sešit.

  2. Spusťte Visual Basic Editor (stiskněte klávesy ALT+F11).

  3. V nabídce Vložit klikněte na Modul.

  4. 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 Sub

  5. Spusťte makro Variable_Test . Zobrazí se následující zpráva:

    the value of x is 10
    the value of y is 100

  6. Klikněte na OK.

  7. V makru Variable_Test změňte následující řádek:

    x = 10

  8. Požadovaná akce:

    x = "error"

  9. 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:

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:

  1. Vložte do projektu nový modul.

  2. 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 Sub

  3. Spusťte makro1 a zobrazí se následující zpráva:

    x, as seen by Macro1 is 10

  4. Klikněte na OK a zobrazí se následující zpráva:

    x, as seen by Macro2 is

  5. Klikně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:

  1. Uložte a zavřete všechny otevřené sešity a pak otevřete nový sešit.

  2. Spusťte program Visual Basic Editor.

  3. Vložte do projektu modul.

  4. 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
    
  5. Vložte do projektu další modul.

  6. Do tohoto modulu zadejte následující kód:
    Sub Macro2()
        x = x * 3
        MsgBox x
    End Sub

  7. Spusťte Macro_1a makro v prvním modulu.

  8. 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).

  9. Řádek deklarace v prvním modulu změňte z:

       Public x As Integer

    Požadovaná akce:

       Dim x As Integer

  10. Spusťte makro Macro_1a .

  11. 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).

  12. Řádek deklarace v prvním modulu změňte z:

      Dim x As Integer

    Požadovaná akce:

        Private x As Integer

  13. Spusťte makro Macro_1a .

  14. 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:

  1. Vložte do projektu nový modul.

  2. 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 Sub

  3. Spusťte makro1.

  4. Zobrazí se následující zpráva:

        the initialized value of x is 0

  5. Klikněte na OK a zobrazí se zpráva:

     x is 10

  6. Klikněte na OK a zobrazí se následující zpráva:

    x, as seen by Macro2 is

  7. Klikněte na OK.

  8. 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 10

  9. Klikněte na OK.

  10. 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
  1. Spusťte makro1.

  2. Zobrazí se zpráva:

    the initialized value of x is 0

  3. Klikněte na OK a zobrazí se zpráva:

    x is 10

  4. Klikněte na OK.

  5. Spusťte makro1 a zobrazí se následující zpráva:

    the initialized value of x is 10

  6. Klikněte na OK a zobrazí se následující zpráva:

    x is 20

  7. Klikně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
  1. Spusťte makro1 a zobrazí se následující zpráva:

    the initialized value of x is 0

  2. Klikněte na OK a zobrazí se následující zpráva:

    x is 10

  3. Klikněte na OK.

  4. Spusťte makro1 a zobrazí se tato zpráva:

    the initialized value of x is 10

  5. Klikněte na OK.

  6. Zobrazí se následující zpráva:

    x is 20

  7. Klikně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