Polia VBA

Vo VBA, an Array je jedna premenná, ktorá môže obsahovať viacero hodnôt. Myslite na pole ako na rozsah buniek: každá bunka môže uložiť hodnotu. Polia môžu byť jednorozmerné (myslíme na jeden stĺpec), dvojrozmerné (myslíme na viac riadkov a stĺpcov) alebo viacrozmerné. K hodnotám poľa je možné získať prístup podľa ich polohy (indexového čísla) v poli.

Rýchly list poľa VBA

Polia

PopisKód VBAVytvoriťDim ar (1 až 3) ako variant
arr (1) = „jeden“
arr (2) = „dva“
arr (3) = „tri“Vytvoriť z ExceluDim ar (1 až 3) ako variant
Dim bunka ako rozsah, aj ako celé číslo
i = LViazané (arr)
Pre každú bunku v rozsahu („A1: A3“)
i = i + 1
arr (i) = hodnota bunky
Ďalšia bunkaPrečítajte si všetky položkyDim i as Long
For i = LBound (arr) To UBound (arr)
MsgBox arr (i)
Ďalej iVymazaťVymazať arrPole na reťazecDim sName As String
sName = Pripojte sa (arr, „:“)Zväčšiť veľkosťZachovať aretáciu ReDim (0 až 100)Nastaviť hodnotuarr (1) = 22

Rýchle príklady poľa VBA

Pozrime sa na úplný príklad, než sa ponoríme do špecifík:

12345678910 Sub ArrayPríklad ()Dim strNames (1 až 4) ako reťazecstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"msgbox strNames (3)Koniec pod

Tu sme vytvorili jednorozmerné pole reťazcov: strNames s veľkosťou štyri (môže obsahovať štyri hodnoty) a priradili sme štyri hodnoty. Nakoniec zobrazíme tretiu hodnotu v poli správ.

V tomto prípade je výhoda použitia poľa malá: namiesto štyroch sa vyžaduje iba jedna deklarácia premennej.

Pozrime sa však na príklad, ktorý ukáže skutočnú silu poľa:

12345678 Sub ArrayExample2 ()Dim strNames (1 až 60 000) ako reťazecDim i As LongPre i = 1 až 60 000strNames (i) = Bunky (i, 1). HodnotaĎalej iKoniec pod

Tu sme vytvorili pole, ktoré môže obsahovať 60 000 hodnôt, a pole sme rýchlo vyplnili zo stĺpca A pracovného hárka.

Výhody poľa? - Rýchlosť!

Môžete si myslieť na polia podobné pracovným listom programu Excel:

  • Každá bunka (alebo položka v poli) môže obsahovať svoju vlastnú hodnotu
  • Ku každej bunke (alebo položke v poli) je možné pristupovať podľa polohy riadka a stĺpca.
    • Pracovný list Pr. bunky (1,4) .hodnota = „Riadok 1, Stĺpec 4“
    • Pole Ex. arrVar (1,4) = „Riadok 1, stĺpec 4“

Prečo sa teda trápiť s poliami? Prečo jednoducho nečítate a nepíšete hodnoty priamo do buniek v programe Excel? Jedno slovo: Rýchlosť!

Čítanie / zápis do buniek programu Excel je pomalý proces. Práca s poliami je oveľa rýchlejšia!

Vytvoriť / Vyhlásiť pole (Dim)

Poznámka: Polia môžu mať viacero „dimenzií“. Aby to nebolo jednoduché, začneme tým, že budeme pracovať iba s jednorozmernými poľami. Neskôr v tutoriále vám predstavíme viacrozmerné polia.

Statické pole

Statické polia sú polia, ktoré nemôžu meniť veľkosť. A naopak, Dynamické polia môže zmeniť veľkosť. Sú vyhlásené trochu inak. Najprv sa pozrime na statické polia.

Poznámka: Ak sa veľkosť vášho poľa nezmení, použite statické pole.

Deklarácia statickej premennej poľa je veľmi podobná deklarácii bežnej premennej, ibaže musíte definovať veľkosť poľa. Existuje niekoľko rôznych spôsobov, ako nastaviť veľkosť poľa.

Počiatočnú a koncovú pozíciu poľa môžete explicitne deklarovať:

123456789101112 Sub StaticArray1 ()'Vytvorí pole s pozíciami 1,2,3,4Dim arrDemo1 (1 až 4) ako reťazec'Vytvorí pole s pozíciami 4,5,6,7Dim arrDemo2 (4 až 7) ako dlhý'Vytvorí pole s pozíciami 0,1,2,3Dim arrDemo3 (0 to 3) As LongKoniec pod

Alebo môžete zadať iba veľkosť poľa:

123456 Sub StaticArray2 ()'Vytvorí pole s pozíciami 0,1,2,3Dim arrDemo1 (3) As StringKoniec pod

Dôležité! Všimnite si, že v predvolenom nastavení začínajú polia na pozícii 0. Takže Dim arrDemo1 (3) vytvorí pole s pozíciami 0,1,2,3.

Môžete vyhlásiť Možnosť Základ 1 v hornej časti modulu, aby sa pole namiesto toho začalo na pozícii 1:

12345678 Možnosť Základ 1Sub StaticArray3 ()'Vytvorí pole s pozíciami 1,2,3Dim arrDemo1 (3) As StringKoniec pod

Zistil som však, že je oveľa jednoduchšie (a menej mätúce) iba explicitne deklarovať počiatočnú a koncovú polohu polí.

Ste unavení z hľadania príkladov kódu VBA? Skúste AutoMacro!

Dynamické pole

Dynamické polia sú polia, ktorých veľkosť je možné zmeniť (alebo ktorých veľkosť nie je potrebné definovať).

Dynamické pole je možné deklarovať dvoma spôsobmi.

Variantné polia

Prvý spôsob deklarovania dynamického poľa je nastavenie poľa na typ Varianta.

1 Dim arrVar () ako variant

S Variant Array, nemusíte definovať veľkosť poľa. Veľkosť sa automaticky upraví. Nezabudnite, že pole začína polohou 0 (pokiaľ do hornej časti modulu nepridáte Option Base 1)

12345678910111213 Pole pod variantom ()Dim arrVar () ako variant„Definujte hodnoty (veľkosť = 0,1,2,3)arrVar = pole (1, 2, 3, 4)„Zmeniť hodnoty (veľkosť = 0,1,2,3,4)arrVar = pole („1a“, „2a“, „3a“, „4a“, „5a“)„Výstupná pozícia 4 („ 5a “)MsgBox arrVar (4)Koniec pod

Nevariantné dynamické polia

Pri nevariantných poliach musíte definovať veľkosť poľa pred priradením hodnôt k poľu. Proces vytvárania poľa je však mierne odlišný:

1234567 Sub DynamicArray1 ()Dim arrDemo1 () ako reťazec'Zmení veľkosť poľa s pozíciami 1,2,3,4ReDim arrDemo1 (1 až 4)Koniec pod

Najprv deklarujete pole, podobné statickému poľu, ibaže vynecháte veľkosť poľa:

1 Dim arrDemo1 () ako reťazec

Teraz, keď chcete nastaviť veľkosť poľa, použijete ReDim príkaz na veľkosť poľa:

12 'Zmení veľkosť poľa s pozíciami 1,2,3,4ReDim arrDemo1 (1 až 4)

ReDim zmení veľkosť poľa. Rozdiel medzi ReDim a ReDim Preserve si prečítajte nižšie.

ReDim vs. ReDim Preserve

Keď použijete ReDim príkazom vymažete z poľa všetky existujúce hodnoty. Namiesto toho môžete použiť Zachovať ReDim na zachovanie hodnôt poľa:

12 "Zmení veľkosť poľa s pozíciami 1,2,3,4 (zachovanie existujúcich hodnôt)ReDim Zachovať arrDemo1 (1 až 4)

Zjednodušená deklarácia polí

Po prečítaní všetkého vyššie sa môžete cítiť zahltení. Aby to nebolo jednoduché, po zvyšok článku budeme väčšinou pracovať so statickými poľami.

Nastavte hodnoty poľa

Nastavenie hodnôt poľa je veľmi jednoduché.

Pri statickom poli musíte definovať každú pozíciu poľa, jednu po druhej:

12345678 Sub ArrayPríklad ()Dim strNames (1 až 4) ako reťazecstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"Koniec pod

Pomocou poľa variantov môžete definovať celé pole jedným riadkom (praktické iba pre malé polia):

123456 Sub ArrayExample_1Line ()Dim strNames () ako variantstrNames = Pole („Shelly“, „Steve“, „Neema“, „Jose“)Koniec pod

Ak sa pokúsite definovať hodnotu pre neexistujúce umiestnenie poľa, zobrazí sa chyba dolného indexu mimo rozsah:

1 strNames (5) = "Shannon"

V nižšie uvedenej časti „Priradenie rozsahu k poli“ vám ukážeme, ako použiť slučku na rýchle priradenie veľkého počtu hodnôt k poliam.

Získajte hodnotu poľa

Hodnoty polí môžete načítať rovnakým spôsobom. V nižšie uvedenom príklade napíšeme hodnoty polí do buniek:

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

Programovanie VBA | Generátor kódu pracuje za vás!

Priraďte rozsah k poľu

Na priradenie rozsahu k poli môžete použiť slučku:

12345678 Sub RangeToArray ()Dim strNames (1 až 60 000) ako reťazecDim i As LongPre i = 1 až 60 000strNames (i) = Bunky (i, 1). HodnotaĎalej iKoniec pod

Tým sa bude prechádzať bunkami A1: A60000 a priradia sa hodnoty buniek k poľu.

Výstupné pole na rozsah

Alebo môžete použiť slučku na priradenie poľa k rozsahu:

123 Pre i = 1 až 60 000Bunky (i, 1). Hodnota = strNames (i)Ďalej i

Bude to naopak: priradiť hodnoty poľa k bunkám A1: A60000

2D / viacrozmerné polia

Doteraz sme pracovali výlučne s jednorozmernými (1D) poľami. Polia však môžu mať až 32 rozmerov.

Predstavte si pole 1D ako jeden riadok alebo stĺpec buniek programu Excel, 2D pole ako celý pracovný hárok programu Excel s viacerými riadkami a stĺpcami a pole 3D je ako celý zošit obsahujúci viacero hárkov, z ktorých každý obsahuje viacero riadkov a stĺpcov (vy mohol by tiež uvažovať o 3D poli ako o Rubikovej kocke).

Príklady viacrozmerného poľa

Teraz si ukážme príklady práce s poliami rôznych rozmerov.

Programovanie VBA | Generátor kódu pracuje za vás!

Príklad 1D poľa

Tento postup kombinuje predchádzajúce príklady polí do jedného postupu a ukazuje, ako by ste pole mohli v praxi používať.

1234567891011121314 Sub ArrayEx_1d ()Dim strNames (1 až 60 000) ako reťazecDim i As Long„Priraďte hodnoty k poľuPre i = 1 až 60 000strNames (i) = Bunky (i, 1). HodnotaĎalej i„Hodnoty výstupného poľa na rozsahPre i = 1 až 60 000Tabuľky („Výstup“). Bunky (i, 1). Hodnota = strNames (i)Ďalej iKoniec pod

Príklad 2D poľa

Tento postup obsahuje príklad 2D poľa:

123456789101112131415161718 Sub ArrayEx_2d ()Dim strNames (1 až 60 000, 1 až 10) ako reťazecDim i As Long, j As Long„Priraďte hodnoty k poľuPre i = 1 až 60 000Pre j = 1 až 10strNames (i, j) = Bunky (i, j). HodnotaĎalej jĎalej i„Hodnoty výstupného poľa na rozsahPre i = 1 až 60 000Pre j = 1 až 10Tabuľky („Výstup“). Bunky (i, j). Hodnota = strNames (i, j)Ďalej jĎalej iKoniec pod

Príklad 3D poľa

Tento postup obsahuje príklad 3D poľa na prácu s viacerými listami:

12345678910111213141516171819202122 Sub ArrayEx_3d ()Dim strNames (1 až 60 000, 1 až 10, 1 až 3) ako reťazecDim i As Long, j As Long, k As Long„Priraďte hodnoty k poľuPre k = 1 až 3Pre i = 1 až 60 000Pre j = 1 až 10strNames (i, j, k) = Tabuľky ("List" & k). Bunky (i, j). HodnotaĎalej jĎalej iĎalej k„Hodnoty výstupného poľa na rozsahPre k = 1 až 3Pre i = 1 až 60 000Pre j = 1 až 10Tabuľky ("Výstup" & k). Bunky (i, j). Hodnota = strNames (i, j, k)Ďalej jĎalej iĎalej kKoniec pod

Dĺžka / veľkosť poľa

Doteraz sme vám predstavili rôzne typy polí a naučili vás, ako polia deklarovať a získať/nastaviť hodnoty polí. Ďalej sa zameriame na ďalšie potrebné témy pre prácu s poľami.

Programovanie VBA | Generátor kódu pracuje za vás!

Funkcie UBound a LBound

Prvým krokom k získaniu dĺžky / veľkosti poľa je použitie funkcií UBound a LBound na získanie hornej a dolnej hranice poľa:

123456 Sub UBoundLBound ()Dim strNames (1 až 4) ako reťazecMsgBox UBound (strNames)MsgBox LBound (strNames)Koniec pod

Odčítaním týchto dvoch (a pridaním 1) získate dĺžku:

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

Funkcia dĺžky poľa

Tu je funkcia na získanie dĺžky jednorozmerného poľa:

1234567 Verejná funkcia GetArrLength (ako variant) tak dlhoIf IsEmpty (a) ThenGetArrLength = 0InakGetArrLength = UBound (a) - LBound (a) + 1Koniec AkKoncová funkcia

Potrebujete vypočítať veľkosť 2D poľa? Pozrite sa na náš návod: Vypočítajte veľkosť poľa.

Smyčka cez pole

Existujú dva spôsoby, ako prechádzať poľom. Prvá slučka prechádza celými číslami zodpovedajúcimi číselným polohám poľa. Ak poznáte veľkosť poľa, môžete ho priamo zadať:

12345678910111213 Vedľajšie polePriklad_Smyčka1 ()Dim strNames (1 až 4) ako reťazecDim i As LongstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"Pre i = 1 až 4MsgBox strNames (i)Ďalej iKoniec pod

Ak však nepoznáte veľkosť poľa (ak je pole dynamické), môžete použiť funkcie LBound a UBound z predchádzajúcej časti:

12345678910111213 Vedľajšie polePriklad_Smyčka2 ()Dim strNames (1 až 4) ako reťazecDim i As LongstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"Pre i = LBound (strNames) Do UBound (strNames)MsgBox strNames (i)Ďalej iKoniec pod

Pre každú slučku poľa

Druhá metóda je pre každú slučku. Toto sa opakuje cez každú položku v poli:

12345678910111213 Vedľajšie polePriklad_Smyčka3 ()Dim strNames (1 až 4) ako reťazecTlmená položkastrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"Pre každú položku v strNamesPoložka MsgBoxNasledujúca položkaKoniec pod

Slučka For Every Array Loop bude okrem jednorozmerných polí fungovať aj s viacrozmernými poľami.

Programovanie VBA | Generátor kódu pracuje za vás!

Smyčka cez 2D pole

Môžete tiež použiť funkcie UBound a LBound na prechádzanie viacrozmerným poľom. V tomto prípade sa budeme opakovať v 2D poli. Všimnite si, že funkcie UBound a LBound vám umožňujú určiť, ktorý rozmer poľa má nájsť hornú a dolnú hranicu (1 pre prvú dimenziu, 2 pre druhú dimenziu).

1234567891011121314151617181920 Vedľajšie polePriklad_Smyčka4 ()Dim strNames (1 až 4, 1 až 2) ako reťazecDim 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"Pre j = LBound (strNames, 2) až UBound (strNames, 2)Pre i = LBound (strNames, 1) Do UBound (strNames, 1)MsgBox strNames (i, j)Ďalej iĎalej jKoniec pod

Ďalšie úlohy poľa

Vymazať pole

Ak chcete vymazať celé pole, použite príkaz Vymazať:

1 Vymazať strNames

Príklad použitia:

12345678910 Sub ArrayPríklad ()Dim strNames (1 až 4) ako reťazecstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"Vymazať strNamesKoniec pod

Alternatívne môžete tiež zmeniť veľkosť poľa a vymazať časť poľa:

1 ReDim strNames (1 až 2)

Tým sa zmení veľkosť poľa na veľkosť 2, pričom sa odstránia polohy 3 a 4.

Gróf Array

Počet pozícií v každej dimenzii poľa môžete spočítať pomocou funkcií UBound a LBound (diskutované vyššie).

Môžete tiež vypočítať počet zadaných položiek (alebo položiek, ktoré spĺňajú určité kritériá) opakovaním v poli.

Tento príklad bude prechádzať poľom objektov a počítať počet prázdnych reťazcov nájdených v poli:

123456789101112131415 Sub ArrayLoopandCount ()Dim strNames (1 až 4) ako reťazecDim i As Long, n As LongstrNames (1) = "Shelly"strNames (2) = "Steve"Pre i = LBound (strNames) Do UBound (strNames)Ak strNames (i) "" Potomn = n + 1Koniec AkĎalej iMsgBox n & "nájdené prázdne hodnoty."Koniec pod

Programovanie VBA | Generátor kódu pracuje za vás!

Odstráňte duplikáty

V určitom okamihu budete chcieť odstrániť duplikáty z poľa. Na to bohužiaľ VBA nemá vstavanú funkciu. Napísali sme však funkciu na odstránenie duplikátov z poľa (zahrnutie do tohto tutoriálu je príliš dlhé, ale navštívte odkaz a dozviete sa viac).

Filter

Funkcia filtra VBA vám umožňuje filtrovať pole. Urobí to tak, že vytvorí nové pole iba s filtrovanými hodnotami. Nasleduje rýchly príklad, ale prečítajte si článok, kde nájdete ďalšie príklady rôznych potrieb.

1234567891011121314 Sub Filter_Match ()„Definujte poleDim strNames As VariantstrNames = Pole („Steve Smith“, „Shannon Smith“, „Ryan Johnson“)„Pole filtraDim strSubNames ako variantstrSubNames = Filter (strNames, "Smith")„Gróf filtrované poleMsgBox „Nájdené“ a UBound (strSubNames) - LBound (strSubNames) + 1 & „mená“.Koniec pod

Funkcia IsArray

Pomocou funkcie IsArray môžete otestovať, či je premenná poľom:

123456789101112 Sub IsArrayEx ()'Vytvorí pole s pozíciami 1,2,3Dim arrDemo1 (3) As String'Vytvorí pravidelnú reťazcovú premennúDim str Ako reťazecMsgBox IsArray (arrDemo1)MsgBox IsArray (str)Koniec pod

Pripojte sa k Array

Pomocou funkcie Pripojiť sa môžete rýchlo „spojiť“ s celým poľom:

123456789101112 Sub Array_Join ()Dim strNames (1 až 4) ako reťazecDim joinNames As StringstrNames (1) = "Shelly"strNames (2) = "Steve"strNames (3) = "Neema"strNames (4) = "Jose"joinNames = Pripojiť sa (strNames, ",")MsgBox joinNamesKoniec pod

Programovanie VBA | Generátor kódu pracuje za vás!

Rozdeľte reťazec do poľa

Funkcia rozdelenia VBA rozdelí reťazec textu do poľa obsahujúceho hodnoty z pôvodného reťazca. Pozrime sa na príklad:

123456789 Sub Array_Split ()Dim Names () ako reťazecDim sa pripojil k menám ako reťazecjoinNames = "Shelly, Steve, Nema, Jose"Mená = Rozdeliť (joinNames, ",")Názvy MsgBox (1)Koniec pod

Tu sme rozdelili tento reťazec textu „Shelly, Steve, Nema, Jose“ na pole (veľkosť 4) pomocou oddeľovača čiarok (, ”).

Const Array

Pole nemôže byť deklarovaný ako konštanta vo VBA. Môžete to však obísť vytvorením funkcie, ktorá sa použije ako pole:

123456789 „Definujte ConstantArrayFunkcia ConstantArray ()ConstantArray = Array (4, 12, 21, 100, 5)Koncová funkcia„Obnovte hodnotu ConstantArrayHodnoty čiastkového získavania ()MsgBox ConstantArray (3)Koniec pod

Pole kopírovania

Neexistuje žiadny vstavaný spôsob kopírovania poľa pomocou VBA. Namiesto toho budete musieť použiť slučku na priradenie hodnôt z jedného poľa do druhého.

12345678910111213141516171819 Podradená kópia poľa ()Dim Arr1 (1 až 100) tak dlhoDim Arr2 (1 až 100) tak dlhoDim i As Long„Vytvoriť pole 1Pre i = 1 až 100Arr1 (i) = iĎalej i„CopyArray1 to Array2Pre i = 1 až 100Arr2 (i) = Arr1 (i)Ďalej iMsgBox Arr2 (74)Koniec pod

Transponovať

Neexistuje žiadna vstavaná funkcia VBA, ktorá by vám umožnila transponovať pole. Napísali sme však funkciu na transpozíciu 2D poľa. Ak sa chcete dozvedieť viac, prečítajte si článok.

Programovanie VBA | Generátor kódu pracuje za vás!

Funkcia návratového poľa

Bežnou otázkou pre vývojárov VBA je, ako vytvoriť funkciu, ktorá vracia pole. Myslím si, že väčšina problémov je vyriešená použitím variantných polí. Napísali sme článok na tému: Návratové pole funkcií VBA.

Použitie polí v Access VBA

Väčšina vyššie uvedených príkladov poľa v programe Access VBA funguje úplne rovnako ako v programe Excel VBA. Jeden zásadný rozdiel je v tom, že keď chcete naplniť pole pomocou údajov programu Access, budete musieť prejsť objektom RecordSet a nie objektom Range.

1234567891011121314151617181920212223 Sub RangeToArrayAccess ()Pri chybe Pokračovať ďalejDim strNames () ako reťazecDim i As LongDim iCount ako dlhýDim dbs ako databázaDim first as RecordsetNastaviť dbs = CurrentDbNastaviť rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)S prvým.Pohyb.Pohyb Po prvéiCount = .RecordCountReDim strNames (1 až iCount)Pre i = 1 do iCountstrNames (i) = rst.Fields ("ClientName").MoveNextĎalej iUkončiť snajskôr. ZatvorteNastaviť prvý = ničNastaviť dbs = ničKoniec pod
Array Návody
Array Mega-GuideÁno
Získajte veľkosť poľa
Vymazať pole
Pole filtra
Transponovať pole
Funkcia návratového poľa
Odstráňte duplikáty

Vám pomôže rozvoju miesta, zdieľať stránku s priateľmi

wave wave wave wave wave