Přeskočit navigaci | Přeskočit na novinky
     

Jste zde: Úvodní stránka » excel » vba-teorie-zaklady » promene-excel-vba

Proměnné ve VBA - MS Excel

Videokurzy Excel

Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:

... neplýtvejte zbytečně místem ...

Úvodem do proměných ve VBA

Při psaní maker je vhodné v úvodu deklarovat proměnné. Sice VBA funguje bez tohoto deklarování, ale zbytečně alokuje pro proměnou větší prostor než je potřeba. Pro malé skripty to nevadí, ale u složitějších programů se bez deklaraci neobejdeme. Jinak si spomalíme výpočet.

Jaký popis proměných zvolit

... jasně a výstižně bez diakritiky ...

Název musí být vystižný. Tak aby bylo jasné o jaký parametr jde.

  • aaa, bb, cc, x, y, z - z tohohle se těžko něco pozná o jakou proměnu jde
  • In_DelkaHrany, In_SirkaHrany - z názvu lze poznat o co se jedná a o jaký typ jde.

Doporučuji používat názvy proměnných bez diakritiky. Každé slovo začínat velkým písmenem. V názvu proměnné označit její typ.

Výhody oceníte při hledání chyb, či doplňování skriptu po půl roce.

Typy pro platnost

Kromě deklarace správného typu je potřeba deklarovat platnost.

  • Static - Statická proměnná dokud pro danou proceduru, zachovává si platnost.
  • Public - Ve všech modulech a procedurách zachovává si platnost i po skončení danné procedury.
  • Private - dostupné pro všechny procedury v daném modulu
  • Dim - dostupné pro jednu proceduru v daném modulu. Jen když tento modul běží.Nebo pro procedury v danném modulu. Záleží kde je deklarace uvedena.

Příklad platnost proměnné

Než to složitě vysvětlovat v čem se proměnné liší uvedu příklda dvou kódu. Pokud si je spustíte bude Vám to jasné:

Sub PlatnostPromenne1() Dim HodnotaLg1 As Long HodnotaLg = HodnotaLg + 1 MsgBox "HodnotaLg = " & HodnotaLg End Sub Sub PlatnostPromenne2() Static HodnotaLg As Long HodnotaLg = HodnotaLg + 1 MsgBox "HodnotaLg = " & HodnotaLg End Sub

Pokud několikrát spustíte první kód bude HodnotaLg stále rovná jedné, ale u druhého kódu se bude hodnota HodnotaLg postupně zvyšovat.

Takže ač se proměnná HodnotaLg jmenuje v obou procedurách stejně jde o různou proměnnou. Procedury můžete spouštět na sřídačku.

Platnost proměnné pro celý modul

Trochu si to zamotáme.

Takže teď použijeme proměnnou společnou pro modul

Dim ModHodnotaLg As Long Sub PlatnostPromenne11() ModHodnotaLg = ModHodnotaLg + 1 MsgBox "ModHodnotaLg = " & ModHodnotaLg End Sub Sub PlatnostPromenne12() ModHodnotaLg = ModHodnotaLg + 10 MsgBox "ModHodnotaLg = " & ModHodnotaLg End Sub

Teď už se bude ModHodnotaLg zvyšovat o jedna nebo deset v závislosti který příklad spustíte.

Veřejná platnost proměnné

Uvidí ji procedury ve všech modulech.

Public PubHodnotaLg As Long Sub PlatnostPromenne31() PubHodnotaLg = PubHodnotaLg + 1 MsgBox "PubHodnotaLg = " & PubHodnotaLg End Sub

Předpokládám, že příklady objasnily jak platnost proměnné funguje.

Pozor důsledně deklarovat názvy. Protože proměnná v proceduře má vyšší prioritu než ta modulová. Aby při předávání nedošlo k problémum. Z osobní zkušenosti vím, že tato chyba se hledá velice dlouho...

Pozor při deklaraci. ať není jiná deklarace než myslíte..

Dim a, b As Integer

a není typu Integer jak možná myslíte, ale je typu Variant, protože jeho typ nebyl deklarován, b je typu Integer. Správně je následující:

Dim a As Integer, b As Integer

Datové typy

Jak jsem již psal ač Excel umí přiřazovat datum typ automaticky. Nevýhodou je horší využití paměti. Takže představím datové typy jež jsou v Excelu:

Datové typy Počet bajtů Rozsah hodnot
Boolean 2 bajty TRUE/FALSE
Byte 1 bajt 0 – 255
Integer 2 bajty –32.768 – 32.767
Long 4 bajty – 2.147.483.648 – 2.147.483.647
Single 4 bajty  
Double 8 bajtů  
Currency 8 bajtů  
Decimal 14 bajtů  
Date 8 bajtů 1.leden 0100 – 31.prosinec 9999
Object 4 bajty Odkaz
String (proměnná délka) 10 bajtů + délka řetězce 0 – 2miliardy
String (pevná délka) délka řetězce 1 až 65000
Variant (s čísly) 16 bajtů  
Variant (se znaky) 22 bajtů + délka řetězce 0 – 2miliardy

Proměnná Boolean

Obsahuje hodnotu TRUE nebo FALSE. Jako výsledek rozhodovacích procesu, nebo návratová hodnota některých funkcí. Jde o logickou hodnotu (1,0), (PRAVDA,NEPRAVDA.

Příklad využití proměnné Boolean

IF Boolean THEN MsgBox "je TRUE" ELSE MsgBox "je FALSE" END IF

Datový typ Boolean

Proměnné typu Boolean se ukládaji jako 16-bitová (2-bajtová) čísla, ale mohou nabývat pouze hodnot True nebo False.

Proměnné typu Boolean se zobrazují buď jako True nebo False (je-li použit příkaz Print), Použitím klíčových slov True a False se proměnným typu Boolean přiřazuje jeden z těchto stavů.

Jsou-li převáděny jiné číselné typy na typ Boolean, převede se 0 na False a všechny ostatní hodnoty se převedou na True. Jsou-li převáděny hodnoty typu Boolean na jiné datové typy, převede se False na hodnotu 0 a True na hodnotu -1.

Datový typ Byte

Byte se ukládá jako 8-bitová (1-bajtové) číslo bez znamínka, hodnoty jsou v rozsahu od 0 do 255.

Vhodný pro ukládání binárních dat.

Datový typ Currency

Proměnné typu Currency jsou uloženy jako 64-bitová (8-bajtová) čísla, která jsou zvětšena 10.000 krát. Takže máme 15 číslic nalevo a 4 číslic napravo od desetinné čárky. Znázorněníme čísela v rozsahu od -922.337.203.685.477,5808 do 922.337.203.685.477,5807.

Typ Currency je vhdný pro finanční výpočty.

Datový typ Date

Date se ukládá jako 64-bitová (8-bajtová) čísla s pohyblivou desetinnou čárkou. Znázorňuje datum od 1. ledna 100 do 31. prosince 9999 a čas od 0:00:00 do 23:59:59.

Proměnné typu Date zobrazují datumy dle lokálního nastavení v PC. Čas se zobrazuje buď v 12-hodinovém nebo 24-hodinovém taktu.

Jestliže jsou jiné datové typy převáděny na typ Date, potom nalevo od desetinné čárky je datum a napravo od desetinné čas. Půlnoc je 0,0 a poledne hodnotou 0,5.

Datový typ Decimal

Proměnné typu Decimal se ukládají jako 96-bitova (12-bajtová) celá čísla (bez znaménka). Čísla jsou zvětšená proměnlivou mocninou čísla 10, která představuje zvětšovací faktor (určuje počet číslic napravo od desetinné čárky v rozmezí od 0 do 28). Nula = žádná desetinná místa. Rozsah je tedy od +/- 79 228 162 514 264 337 593 543 950 335. Pro 28 desetinných míst je rozsah +/-7,9228162514264337593543950335. nejmenší hodnota je +/-0,0000000000000000000000000001.

Poznámka: V současnosti může být datový typ použit pouze v rámci typu Variant, Tj .vytvořit proměnnou typu Variant, která obsahuje podtyp Decimal, a to použitím funkce CDec.

Datový typ Double

Proměnné typu Double se ukládají jako 64-bitová (8-bajtová) čísla s pohyblivou desetinnou čárkou (standard IEEE) v rozsahu od -1,79769313486232E308 do -4,94065645841247E-324 pro záporná čísla. Od 4,94065645841247E-324 do 1,79769313486232E308 pro kladná čísla.

Datový typ Integer

Proměnné typu Integer se ukládají jako 16-bitová (2-bajtová) čísla v rozsahu hodnot od -32 768 do 32 767.

Proměnná typu Integer se používá pro vyjádření výčtových typů.

Datový typ Long

Proměnná typu Long (dlouhé celé číslo) se ukládá jako 32-bitové (4-bajtové) číslo se znaménkem. Je od - 2 147 483 648 do 2 147 483 647.

Datový typ Object

Proměnná typu Object se ukládá jako 32-bitová (4-bajtové) adresy odkazující na objekty.

Datový typ Single

Proměnná typu Single (s pohyblivou desetinnou čárkou s jednoduchou přesností). Ukládá promměné jako 32-bitová (4-bajtová) čísla s pohyblivou desetinnou čárkou. Rozsahu od -3,402823E38 do -1,401298E-45 pro záporná čísla a od 1,401298E-45 do 3,402823E38 pro kladná čísla.

Datový typ String

Existují dva druhy řetězců:

  • Řetězce s proměnlivou délkou mohou obsahovat přibližně až 2 miliardy (2^31) znaků.
  • Řetězce s pevnou délkou mohou obsahovat od 1 znaku až do přibližně 64K (2^16) znaků.

Poznámka: Řetězec s pevnou délkou typu Public nemůže být použit v modulu třídy.

Kódy znaků pro typ String se nacházejí v rozsahu od 0 do 255. Prvních 128 znaků (0–127) znakové sady odpovídá písmenům a symbolům na standardní americké klávesnice (US). Druhá skupina 128 znaků (128–255) obsahuje zvláštní znaky, jako písmena jiných národních abeced, interpunkční znaménka, měnové symboly a zlomky.

Datový typ Variant

Datový typ Variant je datový typ pro všechny proměnné výslovně nedeklarované jako některý předchozí datový typ.

Typ Variant je zvláštní datový typ, který může obsahovat libovolný druh dat (kromě String s pevnou délkou a uživatelských typů). Navíc může typ Variant obsahovat zvláštní hodnoty Empty, Error, Nothing a Null.

Číselná data mohou být libovolné celé nebo reálné číslo v rozsahu od -1,797693134862315E308 do -4,94066E-324 pro záporné hodnoty a od 4,94066E-324 do 1,797693134862315E308 pro kladné hodnoty.

Proměnná Variant může také obsahovat zvláštní hodnotu Error, která indikuje, že v proceduře. došlo k chybové situaci. Která se dá dále zpracovat.

Uživatelský datový typ

Libovolný datový typ vámi definovaný pomocí příkazu Type.

Závěrem

Další ukázky v přípravě. Konstanty, nepovolené znaky....

Článek byl aktualizován: 19.09.2020 11:07

Odměna

Ušetřil vám tento web čas, peníze? Pomohl vyřešit problém? Jste ochotni poskytnout symbolickou odměnu na další rozvoj? Vybrte si formu odměny, která vám vyhovuje.


Pavel Lasák - autor webu

Pavel Lasák

Microsoft Office (Word, Excel, Google tabulky, PowerPoint) se věnuji od roku 2000 (od 2004 na této doméně) - V roce 2017 jsem od Microsoft získal prestižní ocenění MVP (zatím jsem jediný z ČR v kategorií Excel). Své vědomosti a zkušenosti dávám k dispozici i on-line ve videích pro SEDUO. Ve firmách školím a konzultuji, učím na MUNI. Tento web již tvořím přes 15 let. Zdarma je zde přes 1.000 návodu, tipů a triků, včetně přes 250 různých šablon, sešitů.

   Pavel Lasák LinkedIn Profil    Pavel Lasák Google+ Profil    Pavel Lasák facebook Profil    Pavel Lasák twitter Profil


Komentáře


Sanet

Přidáno: 22.04.12 15:36

Co jsou to přesně strukturované datové typy?

Pavel Lasák

Přidáno: 22.04.12 18:02

To Sanet: Strukturované datové typy jsou skupiny jednodušších typů. Např. strukturovaný datový typ datum se členy den, mesic a rok. Strukturovaný typ osoba se členy jméno, přijmení titul, datum narození.

Sanet

Přidáno: 24.04.12 12:53

Děkuji za odpověď

Petr

Přidáno: 20.06.12 13:26

Dobrý den, prosím poraďte jak vložit aktuální datum do jména souboru např. ve formátu:RRMMDD. Jde mi o generování PDF souboru: Sub TiskDoPdfFaktura() Sheets("Faktura").ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ "C:\MyDokuments\RRMMDD_Soubor.pdf", Quality:= _ xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _ OpenAfterPublish:=True End Sub Děkuji moc.

Sláva

Přidáno: 08.11.12 10:41

Dobrý den, jakým způsobem mohu předat proměnnou, deklarovanou VBA kodem z programu microsoft office(excel, access) do políčka stránky html, aby se tato stránka rovnou načetla. Mám zadanou adresu http metodou navigate, ale potřebuji ještě vložit text do políčka formuláře, aby se stránka rovnou načetla v tomto zadání. Děkuji za odpověď, S.

Rosta

Přidáno: 04.10.13 10:25

Zdravim, Uz si opravdu nevim rady, pomoc! Mam deklarovanou promennou 'nazev' A tuto promennou potrebuji vyfiltrovat ne beznym zpusobem, ale bunka-obsahuje Tzn potrebuji aby tohke fungovalo: ActiveSheet.ListObjects("data").Range.Autofilter 4, *nazev* , xlAnd Jak to napsat?

Pete

Přidáno: 08.11.13 15:36

Pro Petra format(date,"yymmdd")

Pavel

Přidáno: 17.02.14 13:49

@Rosta: Zkusil bych ActiveSheet.ListObjects("data").Range.Autofilter Field:=4, Criteria1:="=*nazev*", xlAnd

Marianus

Přidáno: 22.07.14 13:40

... nenasiel som to tu mozete vysvetlit co presne znamena : "option explicit" pokial je a niej tento prikaz v zosite (na zaciatku sriptu) Ďakujem

Smodrchlik

Přidáno: 15.10.14 11:34

Marianus - Option explicit vynucuje deklaraci všech promennych. Bez jeho pouziti je promennym, které nejsou deklarovany, prirazen datovy typ variant, který se při pouziti muze menit. Při pouziti option explicit musí byt všechny promenne deklarovany prirazenim datového typu.

Karla

Přidáno: 23.10.14 00:32

Dobry den, z jineho vaseho vyborneho clanku jsem si opsala makro, ktere by melo resit muj problem, nicmene mi nefunguje. Pise mi to chybu "argument not valid". Muzete mi prosim poradit? Makro: Sub() rwLast=Range("B"&Rows.Count).End(xlUp).Row+1 Range("B"&rwLast&":G"&rwLast). Value=Application.Transpose(Range("list!Q5:list!W5")) End Sub Melo by to kopirovat vysledky z jednoho radku tabulky do jine, vzdy pod sebe po kazdem spusteni makra. Muze by problem v tom, ze kopirovane/zdrojove bunky obsahuji funkci Napr.v bunce "list!Q5" je zadano: =C4. Diky za pomoc!!

Jojo

Přidáno: 28.10.14 08:33

To Karla: -- Sub Test() rwLast = Range("B" & Rows.Count).End(xlUp).Row + 1 Temp = Sheets("List2").Range("Q5:W5") Sheets("List1").Range("B" & rwLast & ":H" & rwLast).Value = Temp End Sub

Jojo

Přidáno: 28.10.14 13:07

To Karla: -- (pokračovanie) ...stačí takto(POZOR zmenil som aj počet prenesených stĺpcov na rovnaký počet pocZdroj=pocCiel): rwLast = Sheets("List1").Range("B" & Rows.Count).End(xlUp).Row + 1 Sheets("List1").Range("B" & rwLast & ":H" & rwLast).Value = Sheets("List2").Range("Q5:W5").Value ALEBO colPoc = 7 ' počet prenesených stĺpcov (Zdroj = Ciel) rwLast = Sheets("List1").Range("B" & Rows.Count).End(xlUp).Row + 1 Sheets("List1").Cells(rwLast, "B").Resize(, colPoc).Value = _ Sheets("List2").Cells(5, "Q").Resize(, colPoc).Value

Karla

Přidáno: 28.10.14 19:07

To Jojo: Diky moc za radu a rychlou reakci. Trosku jsem si s tim musela pohrat ale uz to jede a dela to co chci ! Jeste jednou diky !!

ksduzg

Přidáno: 01.12.14 11:15

fakt super 8===0 {()}







Sdílejte

Pomohl Vám návod?
Sdílejte na Facebooku, G+
LinkedIn...

Nové články


Reklama


TOPlist Licence Creative Commons webarchiv rss XML

Stránky o MS Office (Excel) produktu společnosti Microsoft. Neslouží jako technická podpora.
| Email na autora: pavel.lasak@gmail.com | Copyright © : Pavel Lasák 2004 - 2021 |