Proměnné ve VBA


Proměnné VBA

Základní informace

Obecně proměnné slouží k uložení hodnot nebo objektů do paměti počítače, odkud mohou být v průběhu algoritmu volány. Příkladem může být uložení hodnoty A do proměnné A a hodnoty B do proměnné B a jejich následné využití pro početní a další úkony.

Sub UseVariables()
  ' Uložení hodnoty A do proměnné A
  variableA = 10
  ' Uložení hodnoty B do proměnné B
  variableB = 20
  ' Využití proměnných v početních operacích
  MsgBox variableA + variableB ' 30
  MsgBox variableA - variableB ' -10
  MsgBox variableA * variableB ' 200
  MsgBox variableA / variableB ' 0.5
End Sub
MsgBoxy s jednotlivými výsledy makra uvedeného vlevo.

Výhody využívání proměnných

  1. Opakované využití bez nutnosti opětovného zápisu hodnoty
  2. Snadné nastavení hodnoty ve všech instancích proměnné, kdy stačí hodnotu nastavit v rámci první instance
  3. Snadná kontrola datových typů
  4. Optimalizace kódu a zvýšení jeho přehlednosti

Proměnné se deklarují (zakládají). Mohou být deklarovány v rámci procedury nebo v rámci celého projektu (souboru). Základní rozdíl je v tom, zda potřebujeme proměnnou použít pouze v rámci procedury, kde byla deklarována, nebo ve více procedurách, případně modulech. Proměnná deklarovaná uvnitř procedury, zaniká se skončením procedury, zatímco proměnná deklarovaná vně procedury si uchová hodnotu, dokud neukončíme práci na projektu.

Platnost proměnných

Platnost Jak deklarovat proměnnou s touto platností
Samostatná procedura Dim, Static, Const uvnitř procedury.
Samostatný modul Dim, Private na začátku modulu
Všechny moduly Public na začátku modulu

Proměnné uvnitř procedury

Obecný zápis: Dim | Static | Const proměnná As Typ

Existují tři typy proměnných, které mohou být deklarovány uvnitř procedury, a to:

  1. Dim proměnná se používá pro deklarování uvnitř procedury a je uvozena klíčovým slovem Dim (dimenzovat). Těmto proměnným lze kdykoliv v průběhu procedury přiřadit nebo změnit hodnotu. Proměnná zaniká s ukončením procedury.
  2. Const proměnná představuje konstantu, jejíž hodnota je v průběhu procedury neměnná a definujeme ji přímo v deklarační části.
  3. Static proměnná si oproti předchozím dvěma uchová hodnotu i po skončení procedury.

Možnosti deklarování uvnitř procedury

Sub ProceduralVariables()
  ' Deklarace proměnných
  Dim variableA As String
  Const variableB As String = "Konstanta"
  Static variableC As String
  ' Předání hodnoty proměnné
  ' Proměnné A je řádně předána hodnota
  ' Proměnní zanikne se skončením procedury
  variableA = "Text 1"
  ' Konstantě B nelze přiřadit nebo změnit hodnotu mimo deklaraci
  ' Tento řádek skončí chybou
  variableB = "Text 2"
  ' Proměnné C je řádně předána hodnota
  ' Tato proměnná uchová hodnotu i po skončení procedury
  variableC = "Text 3"
End Sub
Compile error hláška - přiřazení konstantě není povoleno.

Proměnná platná v rámci celého modulu nebo projektu

Obecný zápis: Public | Private | Dim [Const] proměnná As Typ

Deklarování proměnné, platné v rámci celého modulu, se provádí v jeho deklarační části, která je vždy na začátku. Proměnné se uvozují klíčovými slovy Private (Dim) nebo Public (dříve se také používalo Global).

  1. Private (Dim) proměnné mají platnost pouze v rámci procedury, ve které jsou deklarovány.
  2. Public proměnné mají platnost v rámci celého projektu. Díky tomu mohu být použity i v jiných modulech a jejich procedurách.

U proměnných deklarovaných v rámci celého modulu je možné, stejně jako u procedurálních proměnných, deklarovat konstantu, a to opět klíčovým slovem Const.

Možnosti deklarování vně procedury

Public variableA As String
Private variableB As String
Public Const variableC As String = "Veřejná konstanta"
Private Const variableD As String = "Privátní konstanta"

Typování proměnných

Každá proměnná je určitého typu a my bychom jej měli u deklarace zvolit. Pokud bychom proměnné netypovali, tak by jim byl automaticky přiřazen typ Variant, který je velikostně nejnáročnější. Typováním proměnných také předcházíme chybnému přiřazení hodnoty do proměnné.

Seznam typů proměnných

Datový typ proměnné Byty Rozsah proměnné Klasická deklarace Zkrácená deklarace
Boolean 2 True nebo False (PRAVDA nebo NEPRAVDA) Dim bVariable as Boolean
Integer 2 -32 768 až 32 767 Dim iVariable as Integer Dim iVariable%
Long 4 -2 147 483 648 až 2 147 483 647 Dim lVariable as Long Dim lVariable&
Single 4 -3,402E38 až 1,401E45 Dim sVariable as Single Dim sVariable!
Double (negative) 8 -1,79769313486232E308 až -4,94065645841247E-324 Dim dVariable as Double Dim dVariable#
Double (positive) 8 4,94065645841247E-324 až 1,79769313486232E308 Dim dVariable as Double Dim dVariable#
Currency 8 -922 337 203 685 477,5808 až 922 337 203 685 477,5807 Dim cVariable as Currency Dim cVariable@
Date 8 1/1/100 až 12/31/9999 Dim dVariable as Date
String 1 za znak Podle počtu znaků Dim strVariable as String Dim strVariable$
Object 4 Jakýkoliv objekt (Worksheet, Range,…) Dim objVariable as Object
Variant Různé Jakákoliv hodnota nebo objekt Dim vVariable as Variant
Bez typu Variant Automaticky Variant Dim Variable

Možnosti typování proměnných

' Ukázky typování proměnných
' Proměnné deklarované uvnitř procedury
Dim promenna As Integer
Const promenna As Long = 10
Static promenna As String
' Proměnné deklarované vně procedury    
Public variableA As Double
Private variableB As Single
Public Const variableC As Boolean = True
Private Const variableD As Date = #12/31/9999#

Jmenné konvence u proměnných

Pro snadnější orientaci v kódu je výhodné proměnné pojmenovat s prefixem, který vypovídá o jejím typu. Za ním pak následuje samotný název proměnné.

Datový typ proměnné Prefix
Boolean b
Integer i
Long l
Single s
Double d
Currency c
Date/Time dt
String str
Object obj
Variant v
Sub VariablesPrefixes()
  Dim bAnswer As Boolean
  Dim iNumber As Integer
  Dim lNumber As Long
  Dim sNumber As Single
  Dim dNumber As Double
  Dim cNumber As Currency
  Dim dtDate As Date
  Dim strText As String
  Dim objObject As Object
  Dim vAny As Variant
End Sub

Objektové proměnné

Objektové proměnné se využívají k uchování objektů jako je Range, Worksheet, PivotTable atd. Oproti klasickým proměnným pro uložení hodnoty se objektové proměnné liší u nastavení její hodnoty. Před názvem proměnné se používá klíčové slovo Set. Objektové proměnné se tedy setují.

Sub ObjectVariables()
  ' Deklarace proměnných
  Dim rngData As Range
  Dim wsNew As Worksheet
  ' Předání hodnot proměnným
  Set rngData = ActiveSheet.Range("A1:G500")
  Set wsNew = Worksheets.Add
End Sub

Deklarace více proměnných

Pokud je potřeba deklarovat více proměnných, můžeme tak učinit klasicky, a to uvedním každé proměnné na novém řádku nebo zápisem více proměnných na jednom řádku, oddělených čárkou. Pozor však na jejich správné typování.

Sub SeveralVariables()
  Dim lVariable1 As Long
  Dim lVariable2 As Long
  Dim lVariable3 As Long
  Dim lVariable4 As Long
  Dim lVariable5 As Long
  Dim lVariable6 As Long
End Sub
' Špatná deklarace
Sub SeveralVariables()
  Dim lVariable1, lVariable2, lVariable3 As Long
  Dim lVariable4, lVariable5, lVariable6 As Long
End Sub
' Správná deklarace
Sub SeveralVariables()
  Dim lVariable1 As Long, lVariable2 As Long, lVariable3 As Long
  Dim lVariable4 As Long, lVariable5 As Long, lVariable6 As Long
End Sub