Pole VBA

Ve VBA, an Pole je jedna proměnná, která může obsahovat více hodnot. Představte si pole jako řadu buněk: každá buňka může uložit hodnotu. Pole mohou být jednorozměrná (přemýšlejte o jednom sloupci), dvourozměrná (přemýšlejte o více řádcích a sloupcích) nebo vícerozměrná. K hodnotám pole lze přistupovat podle jejich pozice (indexového čísla) v poli.

Rychlý list pole VBA

Pole

PopisKód VBAVytvořitDim arr (1 To 3) As Variant
arr (1) = „jeden“
arr (2) = „dva“
arr (3) = „tři“Vytvořit z ExceluDim arr (1 To 3) As Variant
Dim buňka jako rozsah, i jako celé číslo
i = LBound (arr)
Pro každou buňku v dosahu („A1: A3“)
i = i + 1
arr (i) = hodnota buňky
Další buňkaPřečtěte si všechny položkyDim i jako Long
For i = LBound (arr) To UBound (arr)
MsgBox arr (i)
Příště jáVymazatVymazat arrPole na řetězecDim sName As String
sName = Připojte se (arr, „:“)Zvětšit velikostZachování aretace ReDim (0 až 100)Nastavit hodnotuarr (1) = 22

Rychlé příklady pole VBA

Podívejme se na úplný příklad, než se ponoříme do specifik:

12345678910 Dílčí polePříklad ()Dim strNames (1 až 4) jako řetězecstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"msgbox strNames (3)End Sub

Zde jsme vytvořili jednorozměrné pole řetězců: strNames o velikosti čtyři (může obsahovat čtyři hodnoty) a přiřadili čtyři hodnoty. Poslední zobrazíme 3. hodnotu ve schránce zpráv.

V tomto případě je výhoda použití pole malá: místo čtyř je vyžadována pouze jedna deklarace proměnné.

Podívejme se však na příklad, který ukáže skutečnou sílu pole:

12345678 Dílčí polePříklad2 ()Dim strNames (1 až 60 000) jako řetězecDim i As LongPro i = 1 až 60 000strNames (i) = Buňky (i, 1). HodnotaPříště jáEnd Sub

Zde jsme vytvořili pole, které pojme 60 000 hodnot, a rychle jsme pole naplnili ze sloupce A listu.

Výhody pole? - Rychlost!

Možná vás napadnou pole podobná pracovním listům Excelu:

  • Každá buňka (nebo položka v poli) může obsahovat svou vlastní hodnotu
  • Ke každé buňce (nebo položce v poli) lze přistupovat podle polohy řádku a sloupce.
    • Pracovní list Př. buňky (1,4) .hodnota = „řádek 1, sloupec 4“
    • Array Ex. arrVar (1,4) = „Řádek 1, Sloupec 4“

Proč se tedy trápit s poli? Proč nečíst a zapisovat hodnoty přímo do buněk v Excelu? Jedno slovo: Rychlost!

Čtení / zápis do buněk aplikace Excel je pomalý proces. Práce s poli je mnohem rychlejší!

Vytvořit / Deklarovat pole (Dim)

Poznámka: Pole mohou mít více „rozměrů“. Abychom měli věci jednoduché, začneme tím, že budeme pracovat pouze s jednorozměrnými poli. Později v tutoriálu vás seznámíme s vícerozměrnými poli.

Statické pole

Statická pole jsou pole, která nemohou měnit velikost. Naopak, Dynamická pole lze změnit velikost. Jsou deklarovány mírně odlišně. Nejprve se podívejme na statická pole.

Poznámka: Pokud se velikost pole nezmění, použijte statické pole.

Deklarace proměnné statického pole je velmi podobná deklaraci běžné proměnné, kromě toho, že musíte definovat velikost pole. Existuje několik různých způsobů, jak nastavit velikost pole.

Počáteční a koncovou pozici pole můžete explicitně deklarovat:

123456789101112 Sub StaticArray1 ()'Vytvoří pole s pozicemi 1,2,3,4Dim arrDemo1 (1 až 4) jako řetězec'Vytvoří pole s pozicemi 4,5,6,7Dim arrDemo2 (4 To 7) As Long'Vytvoří pole s pozicemi 0,1,2,3Dim arrDemo3 (0 To 3) As LongEnd Sub

Nebo můžete zadat pouze velikost pole:

123456 Sub StaticArray2 ()'Vytvoří pole s pozicemi 0,1,2,3Dim arrDemo1 (3) jako řetězecEnd Sub

Důležité! Všimněte si, že ve výchozím nastavení pole začínají na pozici 0. Takže Dim arrDemo1 (3) vytvoří pole s pozicemi 0,1,2,3.

Můžete prohlásit Možnost Základna 1 v horní části modulu, takže pole začíná na pozici 1:

12345678 Možnost Základna 1Sub StaticArray3 ()'Vytvoří pole s pozicemi 1,2,3Dim arrDemo1 (3) jako řetězecEnd Sub

Zjistil jsem však, že je mnohem jednodušší (a méně matoucí) pouze explicitně deklarovat počáteční a koncovou polohu polí.

Už vás nebaví hledat příklady kódu VBA? Zkuste AutoMacro!

Dynamické pole

Dynamická pole jsou pole, jejichž velikost lze změnit (nebo jejichž velikost není třeba definovat).

Dynamické pole lze deklarovat dvěma způsoby.

Pole variant

První způsob, jak deklarovat dynamické pole, je nastavit pole na typ Varianta.

1 Dim arrVar () jako varianta

S Varianta Array, nemusíte definovat velikost pole. Velikost se automaticky upraví. Pamatujte, že pole začíná pozicí 0 (pokud nepřidáte Option Base 1 do horní části modulu)

12345678910111213 Sub VariantArray ()Dim arrVar () jako varianta'Definujte hodnoty (velikost = 0,1,2,3)arrVar = pole (1, 2, 3, 4)'Změnit hodnoty (velikost = 0,1,2,3,4)arrVar = pole („1a“, „2a“, „3a“, „4a“, „5a“)'Výstupní poloha 4 ("5a")MsgBox arrVar (4)End Sub

Nevariantní dynamická pole

U polí jiných než variant musíte před přiřazením hodnot k poli definovat velikost pole. Proces vytváření pole se však mírně liší:

1234567 Sub DynamicArray1 ()Dim arrDemo1 () jako řetězec'Změní velikost pole s pozicemi 1,2,3,4.'ReDim arrDemo1 (1 až 4)End Sub

Nejprve deklarujete pole, podobné statickému poli, kromě toho, že vynecháte velikost pole:

1 Dim arrDemo1 () jako řetězec

Nyní, když chcete nastavit velikost pole, použijte ReDim příkaz pro velikost pole:

12 'Změní velikost pole s pozicemi 1,2,3,4.'ReDim arrDemo1 (1 až 4)

ReDim změní velikost pole. Níže si přečtěte rozdíl mezi ReDim a ReDim Preserve.

ReDim vs. ReDim Preserve

Když použijete ReDim příkaz vymažete všechny existující hodnoty z pole. Místo toho můžete použít Zachovat ReDim zachovat hodnoty pole:

12 'Změní velikost pole s pozicemi 1,2,3,4 (zachování stávajících hodnot)ReDim Zachovat arrDemo1 (1 až 4)

Zjednodušená deklarace polí

Po přečtení všeho výše se můžete cítit zahlceni. Aby to nebylo jednoduché, budeme po zbytek článku většinou pracovat se statickými poli.

Nastavte hodnoty pole

Nastavení hodnot pole je velmi snadné.

U statického pole musíte definovat každou pozici pole, jednu po druhé:

12345678 Dílčí polePříklad ()Dim strNames (1 až 4) jako řetězecstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"End Sub

Pomocí Variant Array můžete definovat celé pole jedním řádkem (praktické pouze pro malá pole):

123456 Dílčí poleExample_1Line ()Dim strNames () jako variantastrNames = Pole („Shelly“, „Steve“, „Neema“, „Jose“)End Sub

Pokud se pokusíte definovat hodnotu pro pole, které neexistuje, zobrazí se chyba Subscript Out of Range:

1 strNames (5) = "Shannon"

V níže uvedené části „Přiřadit rozsah poli“ si ukážeme, jak pomocí smyčky rychle přiřadit poli velký počet hodnot.

Získejte hodnotu pole

Hodnoty pole můžete načíst stejným způsobem. V níže uvedeném příkladu zapíšeme hodnoty polí do buněk:

1234 Rozsah ("A1"). Hodnota = strNames (1)Rozsah ("A2"). Hodnota = strNames (2)Rozsah ("A3"). Hodnota = strNames (3)Rozsah ("A4"). Hodnota = strNames (4)

Programování VBA | Generátor kódu pracuje pro vás!

Přiřaďte rozsah poli

K přiřazení rozsahu k poli můžete použít smyčku:

12345678 Sub RangeToArray ()Dim strNames (1 až 60 000) jako řetězecDim i As LongPro i = 1 až 60 000strNames (i) = Buňky (i, 1). HodnotaPříště jáEnd Sub

Tím se bude procházet buňkami A1: A60000 a přiřazovat hodnoty buněk k poli.

Výstupní pole na rozsah

Nebo můžete použít smyčku k přiřazení pole k rozsahu:

123 Pro i = 1 až 60 000Buňky (i, 1). Hodnota = strNames (i)Příště já

Bude to naopak: přiřadit hodnoty pole buňkám A1: A60000

2D / vícerozměrná pole

Doposud jsme pracovali výhradně s jednorozměrnými (1D) poli. Pole však mohou mít až 32 dimenzí.

Představte si 1D pole jako jeden řádek nebo sloupec buněk aplikace Excel, 2D pole jako celý list aplikace Excel s více řádky a sloupci a 3D pole je jako celý sešit obsahující více listů, z nichž každý obsahuje více řádků a sloupců (vy mohl by také uvažovat o 3D poli jako o Rubikově kostce).

Příklady vícerozměrných polí

Nyní si předveďme příklady práce s poli různých dimenzí.

Programování VBA | Generátor kódu pracuje pro vás!

Příklad 1D pole

Tento postup kombinuje předchozí příklady polí do jedné procedury a ukazuje, jak můžete pole v praxi používat.

1234567891011121314 Dílčí poleEx_1d ()Dim strNames (1 až 60 000) jako řetězecDim i As Long„Přiřaďte hodnoty poliPro i = 1 až 60 000strNames (i) = Buňky (i, 1). HodnotaPříště já„Hodnoty výstupního pole na rozsahPro i = 1 až 60 000Listy („Výstup“). Buňky (i, 1). Hodnota = strNames (i)Příště jáEnd Sub

Příklad 2D pole

Tento postup obsahuje příklad 2D pole:

123456789101112131415161718 Dílčí poleEx_2d ()Dim strNames (1 až 60 000, 1 až 10) jako řetězecDim i As Long, j As Long„Přiřaďte hodnoty poliPro i = 1 až 60 000Pro j = 1 až 10strNames (i, j) = Buňky (i, j). HodnotaDalší jPříště já„Hodnoty výstupního pole na rozsahPro i = 1 až 60 000Pro j = 1 až 10Listy („Výstup“). Buňky (i, j). Hodnota = strNames (i, j)Další jPříště jáEnd Sub

Příklad 3D pole

Tento postup obsahuje příklad 3D pole pro práci s více listy:

12345678910111213141516171819202122 Dílčí poleEx_3d ()Dim strNames (1 až 60 000, 1 až 10, 1 až 3) jako řetězecDim i As Long, j As Long, k As Long„Přiřaďte hodnoty poliPro k = 1 až 3Pro i = 1 až 60 000Pro j = 1 až 10strNames (i, j, k) = Sheets ("Sheet" & k). Cells (i, j) .ValueDalší jPříště jáDalší k„Hodnoty výstupního pole na rozsahPro k = 1 až 3Pro i = 1 až 60 000Pro j = 1 až 10Listy ("Výstup" & k). Buňky (i, j). Hodnota = strNames (i, j, k)Další jPříště jáDalší kEnd Sub

Délka / velikost pole

Zatím jsme vám představili různé typy polí a naučili vás, jak pole deklarovat a získat/nastavit hodnoty polí. Dále se zaměříme na další nezbytná témata pro práci s poli.

Programování VBA | Generátor kódu pracuje pro vás!

Funkce UBound a LBound

Prvním krokem k získání délky / velikosti pole je použití funkcí UBound a LBound k získání horní a dolní hranice pole:

123456 Sub UBoundLBound ()Dim strNames (1 až 4) jako řetězecMsgBox UBound (strNames)MsgBox LBound (strNames)End Sub

Odečtením obou (a přidáním 1) získáte délku:

1 GetArrLength = UBound (strNames) - LBound (strNames) + 1

Funkce délky pole

Zde je funkce pro získání délky jednorozměrného pole:

1234567 Veřejná funkce GetArrLength (jako varianta) jako dlouháIf IsEmpty (a) ThenGetArrLength = 0JinýGetArrLength = UBound (a) - LBound (a) + 1Konec IfKoncová funkce

Potřebujete vypočítat velikost 2D pole? Podívejte se na náš návod: Vypočítejte velikost pole.

Smyčka skrz pole

Pole lze procházet dvěma způsoby. První prochází celými čísly odpovídajícími pozicím čísel v poli. Pokud znáte velikost pole, můžete ji zadat přímo:

12345678910111213 Dílčí polePříklad_Smyčka1 ()Dim strNames (1 až 4) jako řetězecDim i As LongstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"Pro i = 1 až 4MsgBox strNames (i)Příště jáEnd Sub

Pokud však neznáte velikost pole (pokud je pole dynamické), můžete použít funkce LBound a UBound z předchozí části:

12345678910111213 Dílčí poleExample_Loop2 ()Dim strNames (1 až 4) jako řetězecDim i As LongstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"Pro i = LBound (strNames) To UBound (strNames)MsgBox strNames (i)Příště jáEnd Sub

Pro každou smyčku pole

Druhá metoda je pro každou smyčku. Toto prochází každou položkou v poli:

12345678910111213 Dílčí polePříklad_Smyčka3 ()Dim strNames (1 až 4) jako řetězecDim ItemstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"Pro každou položku v strNamesPoložka MsgBoxDalší položkaEnd Sub

Smyčka For Each Array Loop bude kromě jednorozměrných polí fungovat také s vícerozměrnými poli.

Programování VBA | Generátor kódu pracuje pro vás!

Smyčka skrz 2D pole

Pomocí funkcí UBound a LBound můžete také procházet vícerozměrným polem. V tomto případě budeme procházet 2D polem. Všimněte si, že funkce UBound a LBound vám umožňují určit, který rozměr pole má najít horní a dolní hranici (1 pro první dimenzi, 2 pro druhou dimenzi).

1234567891011121314151617181920 Dílčí poleExample_Loop4 ()Dim strNames (1 až 4, 1 až 2) jako řetězecDim i As Long, j As LongstrNames (1, 1) = "Shelly"strNames (2, 1) = "Steve"strNames (3, 1) = "Neema"strNames (4, 1) = "Jose"strNames (1, 2) = "Shelby"strNames (2, 2) = "Steven"strNames (3, 2) = "Nemo"strNames (4, 2) = "Jesse"Pro j = LBound (strNames, 2) Do UBound (strNames, 2)Pro i = LBound (strNames, 1) Do UBound (strNames, 1)MsgBox strNames (i, j)Příště jáDalší jEnd Sub

Další úkoly pole

Vymazat pole

Chcete -li vymazat celé pole, použijte příkaz Erase:

1 Vymazat strNames

Příklad použití:

12345678910 Dílčí polePříklad ()Dim strNames (1 až 4) jako řetězecstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"Vymazat strNamesEnd Sub

Alternativně můžete také změnit velikost pole a vymazat část pole:

1 ReDim strNames (1 až 2)

Tím se změní velikost pole na velikost 2, přičemž se odstraní pozice 3 a 4.

Hrabě Array

Počet pozic v každé dimenzi pole můžete spočítat pomocí funkcí UBound a LBound (popsáno výše).

Můžete také spočítat počet zadaných položek (nebo položek, které splňují určitá kritéria) opakováním v poli.

Tento příklad bude procházet řadou objektů a počítat počet neprázdných řetězců nalezených v poli:

123456789101112131415 Sub ArrayLoopandCount ()Dim strNames (1 až 4) jako řetězecDim i As Long, n As LongstrNames (1) = "Shelly"strNames (2) = "Steve"Pro i = LBound (strNames) To UBound (strNames)Pokud strNames (i) "" Pakn = n + 1Konec IfPříště jáMsgBox n & "nalezeny neprázdné hodnoty."End Sub

Programování VBA | Generátor kódu pracuje pro vás!

Odebrat duplikáty

V určitém okamžiku možná budete chtít odebrat duplikáty z pole. VBA k tomu bohužel nemá vestavěnou funkci. Napsali jsme však funkci pro odstranění duplikátů z pole (zahrnutí do tohoto tutoriálu je příliš dlouhé, ale další informace získáte po kliknutí na odkaz).

Filtr

Funkce filtru VBA vám umožňuje filtrovat pole. Dělá to tak, že vytvoří nové pole pouze s filtrovanými hodnotami. Níže je rychlý příklad, ale přečtěte si článek, kde najdete další příklady pro různé potřeby.

1234567891011121314 Sub Filter_Match ()"Definujte pole."Dim strNames As VariantstrNames = Array („Steve Smith“, „Shannon Smith“, „Ryan Johnson“)„Pole filtrůDim strSubNames jako variantastrSubNames = Filtr (strNames, "Smith")„Hrabě Filtrované poleMsgBox "Found" & UBound (strSubNames) - LBound (strSubNames) + 1 & "names."End Sub

Funkce IsArray

Pomocí funkce IsArray můžete vyzkoušet, zda je proměnná matice:

123456789101112 Sub IsArrayEx ()'Vytvoří pole s pozicemi 1,2,3Dim arrDemo1 (3) jako řetězec'Vytvoří pravidelnou proměnnou řetězceDim str jako řetězecMsgBox IsArray (arrDemo1)MsgBox IsArray (str)End Sub

Připojte se k Array

Pomocí funkce Připojit můžete rychle „připojit“ celé pole:

123456789101112 Sub Array_Join ()Dim strNames (1 až 4) jako řetězecDim joinNames As StringstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"joinNames = Připojit se (strNames, ",")MsgBox joinNamesEnd Sub

Programování VBA | Generátor kódu pracuje pro vás!

Rozdělte řetězec do pole

Funkce rozdělení VBA rozdělí řetězec textu do pole obsahujícího hodnoty z původního řetězce. Podívejme se na příklad:

123456789 Sub Array_Split ()Dim Jména () jako řetězecDim připojilNázvy jako řetězecjoinNames = "Shelly, Steve, Nema, Jose"Jména = Rozdělit (joinNames, ",")Názvy MsgBox (1)End Sub

Zde jsme rozdělili tento řetězec textu „Shelly, Steve, Nema, Jose“ do pole (velikost 4) pomocí oddělovače čárky (, ”).

Const Array

Pole nemůže být deklarován jako konstanta ve VBA. Můžete to však obejít vytvořením funkce, kterou použijete jako pole:

123456789 "Definujte ConstantArray."Funkce ConstantArray ()ConstantArray = Pole (4, 12, 21, 100, 5)Koncová funkce`` Obnovte hodnotu ConstantArraySub RetrieveValues ​​()MsgBox ConstantArray (3)End Sub

Kopírovat pole

Neexistuje žádný vestavěný způsob kopírování pole pomocí VBA. Místo toho budete muset použít smyčku k přiřazení hodnot z jednoho pole do druhého.

12345678910111213141516171819 Dílčí kopie Pole ()Dim Arr1 (1 až 100) jako dlouhýDim Arr2 (1 až 100) jako dlouhýDim i As Long'Vytvořit pole1Pro i = 1 až 100Arr1 (i) = iPříště já'CopyArray1 to Array2Pro i = 1 až 100Arr2 (i) = Arr1 (i)Příště jáMsgBox Arr2 (74)End Sub

Přemístit

Neexistuje žádná vestavěná funkce VBA, která by vám umožnila transponovat pole. Napsali jsme však funkci pro transpozici 2D pole. Přečtěte si článek a dozvíte se více.

Programování VBA | Generátor kódu pracuje pro vás!

Funkce Zpětné pole

Častou otázkou vývojářů VBA je, jak vytvořit funkci, která vrací pole. Myslím, že většina obtíží je vyřešena použitím variantních polí. Napsali jsme článek na téma: Zpětné pole funkcí VBA.

Použití polí v Access VBA

Většina výše uvedených příkladů Array funguje v Access VBA úplně stejně jako v Excel VBA. Jeden zásadní rozdíl je v tom, že když chcete naplnit pole pomocí dat aplikace Access, budete muset procházet objektem RecordSet spíše než objektem Range.

1234567891011121314151617181920212223 Dílčí rozsahToArrayAccess ()Při chybě Pokračovat DalšíDim strNames () jako řetězecDim i As LongDim iCount jako dlouhýDim dbs jako databázeDim první jako sada záznamůNastavit dbs = CurrentDbNastavit rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)S první.MoveLast.MoveFirstiCount = .RecordCountReDim strNames (1 do iCount)Pro i = 1 do iCountstrNames (i) = rst.Fields ("ClientName").MoveNextPříště jáKonec sprvní ZavřítNastavit první = nicNastavit dbs = nicEnd Sub
Array Návody
Array Mega-GuideAno
Získejte velikost pole
Vymazat pole
Pole filtru
Transponovat pole
Funkce Zpětné pole
Odebrat duplikáty
wave wave wave wave wave