Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:
Co je a jak využít pole (Array) ve VBA v Microsoft Excel
Upraveno a podstatně doplněno 6.10.2019
Co se v článku dozvíte. Aneb Pole v Excel VBA od A do Z:
Pole je indexovaná skupina nějakých dat (oddělení, roky, názvy měsíců). Tato skupina se chová jako by šlo o jednu proměnou, která má několik položek. Na jednotlivé položky se poté odkazuje pomocí indexu (pozice na jaké se hodnota v tomto poli nachází).
Pole se začíná standartně indexovat od nuly 0. Je pravda, že tohle lze změnit, ale nedoporučuji to. Udělá to více škody než užitku. Viz kapitola o Option Base.
Typy pole
Rozměry pole
Poznámka: V jazyku Visual Basic, VBA lze deklarovat pole až o 60 rozměrech. Osobně si nedokážu představit, jak s polem o 60-ti rozměrech pracovat. Případně v něm hledat chybu. Dvojrozměrná se ještě dají (trojrozměrná když už musí být také), ale vícerozměrná, osobně jsem zatím nezkoušel a zkoušet nehodlám.
Ukázka indexování dvoujrozměrného pole:
Již víme že jsou typy polí:
Dim arr() As Variant
Dim s As String
Jak na deklaraci statického pole
Dim arr(0 To 5) As Long
Dim arr(2 To 4) As Integer
Dim arr(2) As Integer
'' Pro vícerozměrná pole
Dim arr(0 To 3, 0 To 2) As String
Pokud není nastaveno jinak (Option Base) a potřebuji pole deseti hodnot, od nuly do devíti, mohu zpsat:
Dim MojePole (9) As Boolean
nebo
Dim MojePole (0 To 9) As Boolean
Pole o pevné velikosti (Integer) o 10 řádcích a 10 sloupcích:
Dim MojePole(9, 9) As Integer
nebo:
Dim MojePole(0 To 9, 0 To 9) As Integer
Máme seznam faktur za roky 2009 - 2011, můžeme si indexování pole posunout.
Dim FakturyPole (2009 To 2011) As Double
Základy o trojrozměrném poli:
Dim MojePole(0 To 9, 0 To 9, 0 to 9) As Integer
' nebo
Dim MojePole(9, 9, 9) As Integer
Více informací je v přípravě.
ReDim Preserve arr(0 To 5)
Podobně jako konstanty lze pomocí příkazů Dim, Static, Private, nebo Public nastavit platnost. Toto je popsáno v samostatném článku.
Pokud jde o jednorozměrné pole:
Debug.Print arr(0)
MsgBox (arr(0))
Pokud jde o dvojrozměrné pole:
Debug.Print arr(0, 0)
Případně mohu přečíst v cyklu (pro jednorozměrné pole):
Dim item As Integer
For Each item In arr
Debug.Print item
Next item
Případně mohu přečíst v cyklu (pro dvojrozměrné pole):
v přípravě
Zapisovat mohu po prvku a řeknu ja jakém místě se zapíše, nebo v jednom zápise, kdy jednotlivé položky jsou odděleny čádkou:
arr(0) = "Apple"
arr(1) = 22
arr = Array("Eva", "Jan", "Iva")
Pozor pokud jde o statické pole (má definovaný rozměr) nelze zapsat více prvků
Dim arr(0 To 3) As Long
arr(0) = 99 ' Zapíše do prvního
arr(4) = 99 ' Problém nelze zapsat
'' Prvek 4 je mimo rozsah 0 až 3
Pokud jde o dynamické pole
Dim arr() As Variant
arr = Array("1", "2", "3", "45")
' klidně mohu následně přepsat
arr = Array("1", "2", "3", "45", "4")
arr(0, 0) = "Prvni"
arr(0, 0, 0) = "Prvni"
Více informací jak na trojrozmšrné pole jsou v přípravě.
arr(0, 0) = "Prvni"
arr(0, 0) = "Nový prvni"
Potřebujeme-li indexovat pole od jedničky doporučuji použít kód
Dim MojePole (1 To 10) As String
Je pravda že existuje i jiná možnost v posunutí indexování a to využití Option Base
Option Base 1
Tohle uvádím jen na doplnění v případě, že se s tímto zápisem setkáte u konkurenčních VBA programů. Osobně tohle nedoporučuji.
Potřebujeteli smazat obsah pole.
Erase arr
Často se hodí vědet pozici prvního a posledního prvku v Array (poli). Na to lze využít:
LBound(arr)
Ubound(arr)
První a poslendí prvek v poli lze krásně využít pro vypis prvků:
Dim arr(0 To 5) As Long
MsgBox (LBound(arr))
MsgBox (UBound(arr))
' výpis v cyklu
For i = LBound(arr) To UBound(arr)
Debug.Print i, arr(i)
Next i
Dim s As String
s = "A,B,C,D"
Dim arr() As String
arr = Split(s, ",")
Pracujete li s poli můžete využít i funkci Watch. Menu View > Watch Windows. Pak stačí jen přes menu Debug > Add Watch přidat příslušnou proměnou. Spustit kód až po stopku
Dim Arr(1, 2) As Variant
Arr(0, 0) = "0_0"
Arr(0, 1) = "0_1"
Arr(0, 2) = "0_2"
Arr(1, 0) = "1_0"
Arr(1, 1) = "1_1"
Arr(1, 2) = "1_2"
Třeba třídění (sortování), počítání prvků, ukázky s vícerozměrnými poli, načítaní / plnění buněk, formuářů atd.
Základy k práci s Array (poli) ve VBA Microsoft Excel, jsem probral, na případné typy jak vylepšit o co doplnit prosím využít komentáře.
Článek byl aktualizován: 19.09.2020 11:07
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.
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ů.
Přidáno: 05.02.15 17:39
Dobrý den,
při začátku práce s polem jsem hned narazil na problém. Při proceduře mi vyběhne chybove hlaseni run-time error 9- subscript out of range na řádkujmeno_zamestnance(i) = TextBox1.Text
Private Sub CommandButton1_Click()
Dim i As Integer
Dim jmeno_zamestnance() As String
i = 0
i = i + 1
jmeno_zamestnance(i) = TextBox1.Text
ListBox1.AddItem (jmeno_zamestnance(i))
TextBox1.Text = ""
End Sub
Přidáno: 06.02.15 08:54
To Ondřej: -- Private Sub CommandButton1_Click()
Dim i As Integer
Dim jmeno_zamestnance() As String
i = 1
ReDim jmeno_zamestnance(i)
jmeno_zamestnance(i) = TextBox1.Text
ListBox1.AddItem (jmeno_zamestnance(i))
TextBox1.Text = ""
End Sub
Pomohl Vám návod? Sdílejte na Facebooku, G+ |
||
LinkedIn... |
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 - 2024 |