Objekt ArrayList je podobný objektu Collection, ale má oveľa viac metód a vlastností, a teda aj väčšiu flexibilitu z hľadiska programovania.
Objekt Collection má iba dve metódy (Add, Remove) a dve vlastnosti (Count, Item), zatiaľ čo zoznam polí má mnoho ďalších. Objekt Collection je tiež len na čítanie. Po pridaní hodnôt nie je možné indexovanú hodnotu zmeniť, zatiaľ čo v zozname polí je možná úprava.
Mnoho z metód zoznamu polí používa parametre. Na rozdiel od mnohých štandardných metód VBA nie je žiadny z týchto parametrov voliteľný. Niektoré metódy a vlastnosti tiež nie sú vždy veľké, ak sú zadané rovnakým spôsobom ako v programe Excel VBA. Napriek tomu stále fungujú.
Objekt ArrayList sa rozširuje a zmenšuje podľa toho, koľko položiek obsahuje. Pred použitím ako Array nemusí byť dimenzovaný.
Zoznam polí je jednorozmerný (rovnaký ako objekt Collection) a predvolený typ údajov je Variant, čo znamená, že bude akceptovať akýkoľvek typ údajov, či už číselné, textové alebo dátumové.
Zoznam polí v mnohých ohľadoch rieši množstvo nedostatkov objektu Collection. Je určite oveľa flexibilnejší v tom, čo dokáže.
Objekt Zoznam polí nie je súčasťou štandardnej knižnice VBA. Môžete ho použiť vo svojom kóde Excel VBA pomocou neskorej alebo skorej väzby
1234 | Sub LateBindingExample ()Dim MyList ako objektNastaviť MyList = CreateObject ("System.Collections.ArrayList")Koniec pod |
123 | Sub EarlyBindingPriklad ()Dim MyList ako nový ArrayListKoniec pod |
Aby ste mohli použiť príklad skorej väzby, musíte vo VBA najskôr zadať odkaz na súbor „mscorlib.tlb“
Vykonáte to výberom položky „Nástroje | Referencie „z okna editora Visual Basic (VBE). Zobrazí sa vyskakovacie okno so všetkými dostupnými referenciami. Prejdite nadol na položku „mscorlib.dll“ a začiarknite políčko vedľa nej. Kliknite na tlačidlo OK a táto knižnica je teraz súčasťou vášho projektu:
Jednou z veľkých nevýhod objektu zoznamu polí je, že nemá „Intellisense“. Bežne tam, kde vo VBA používate objekt, napríklad rozsah, sa zobrazí vyskakovací zoznam všetkých dostupných vlastností a metód. Nezískate to s objektom zoznamu polí a niekedy to vyžaduje starostlivú kontrolu, aby ste sa presvedčili, že ste metódu alebo vlastnosť napísali správne.
Ak v okne VBE stlačíte kláves F2 a vyhľadáte „arraylist“, nič sa nezobrazí, čo vývojárovi veľmi nepomáha.
Váš kód pobeží oveľa rýchlejšie s včasnou väzbou, pretože je celý zostavený vopred. Pri neskorej väzbe musí byť objekt pri spustení kódu skompilovaný
Distribúcia vašej aplikácie Excel obsahujúcej zoznam polí
Ako už bolo uvedené, objekt ArrayList nie je súčasťou programu Excel VBA. To znamená, že každý z vašich kolegov, ktorým distribuujete aplikáciu, musí mať prístup k súboru „mscorlib.tlb“
Tento súbor sa bežne nachádza v:
C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319
Možno by stálo za to napísať nejaký kód (pomocou metódy Dir), aby ste skontrolovali, či tento súbor existuje, keď používateľ načíta aplikáciu, aby v prípade, že sa nenájde, zažil „mäkké pristátie“. Ak nie je k dispozícii a kód sa spustí, dôjde k chybám.
Používateľ musí mať tiež nainštalovanú správnu verziu .Net Framework. Aj keď má používateľ novšiu verziu, musí byť nainštalovaný V3.5, inak vaša aplikácia nebude fungovať
Rozsah objektu zoznamu polí
Pokiaľ ide o rozsah, objekt Zoznam polí je k dispozícii iba vtedy, keď je zošit otvorený. Neuloží sa, keď je uložený zošit. Ak sa zošit znova otvorí, potom je potrebné znova vytvoriť objekt zoznamu polí pomocou kódu VBA.
Ak chcete, aby bol váš zoznam polí dostupný pre všetok kód vo vašom module kódu, musíte objekt Array List deklarovať v sekcii Declare v hornej časti okna modulu.
Tým sa zaistí, že celý váš kód v rámci tohto modulu bude mať prístup k zoznamu polí. Ak chcete, aby akýkoľvek modul vo vašom zošite mal prístup k objektu Zoznam polí, definujte ho ako globálny objekt
1 | Globálna zbierka MyCollection ako nový zoznam polí |
Obyvateľstvo a čítanie z vášho zoznamu polí
Najzákladnejšou činnosťou, ktorú chcete vykonať, je vytvoriť zoznam polí, vložiť doň nejaké údaje a potom dokázať, že sa údaje dajú čítať. Všetky príklady kódu v tomto článku predpokladajú, že používate skorú väzbu, a do odkazov VBA ste pridali príkaz „mscorlib.tlb“, ako je popísané vyššie.
123456789101112 | Sub ArrayListExample ()„Vytvorte nový objekt zoznamu políDim MyList ako nový ArrayList„Pridajte položky do zoznamuMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Opakujte zoznam polí, aby ste dokázali hodnotyPre N = 0 do MyList.Count - 1MsgBox MyList (N)Ďalej N.Koniec pod |
Tento príklad vytvorí nový objekt ArrayList, naplní ho 3 položkami a iteruje zoznamom zobrazujúcim každú položku.
Index ArrayList začína na 0, nie na 1, takže od hodnoty Count musíte odpočítať 1
Na prečítanie hodnôt môžete tiež použiť slučku „Pre … Každý“:
123456789101112 | Sub ArrayListExample ()„Vytvorte nový objekt zoznamu políDim MyList ako nový ArrayList„Pridajte položky do zoznamuMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Opakujte zoznam polí, aby ste dokázali hodnotyZa každý I v MyListMsgBox IDalej jaKoniec pod |
Úprava a zmena položiek v zozname polí
Hlavnou výhodou zoznamu polí oproti kolekcii je, že položky v zozname je možné upravovať a meniť vo vašom kóde. Objekt Collection je iba na čítanie, zatiaľ čo objekt zoznamu polí je na čítanie / zápis
123456789101112131415 | Sub ArrayListExample ()„Vytvorte nový objekt zoznamu políDim MyList ako nový ArrayList„Pridajte položky do zoznamuMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Zmeňte položku 1 z„ položky 2 “na„ zmenené “MyList (1) = "Zmenené"„Opakujte zoznam polí, aby ste dokázali, že zmena fungovalaZa každý I v MyList„Zobraziť názov položkyMsgBox IDalej jaKoniec pod |
V tomto prípade je druhá položka „Položka2“ zmenená na hodnotu „Zmenené“ (pamätajte, že index začína od 0). Keď sa iterácia spustí na konci kódu, zobrazí sa nová hodnota
Pridanie poľa hodnôt do zoznamu polí
Do svojho zoznamu polí môžete zadávať hodnoty pomocou poľa obsahujúceho zoznam týchto hodnôt alebo odkazy na hodnoty buniek v hárku
123456789101112131415161718 | Sub AddArrayExample ()„Vytvorte objekt zoznamu políDim MyList ako nový ArrayList„Iterujte hodnoty poľa a pridajte ich do zoznamu políPre každý v v poli („A1“, „A2“, „A3“)„Pridajte každú hodnotu poľa do zoznamuMyList.Add vĎalšie„Iterujte hodnoty poľa s odkazmi na pracovný hárok a pridajte ich do zoznamu políPre každý v v poli (rozsah („A5“). Hodnota, rozsah („A6“). Hodnota)MyList.Add vĎalšie„Opakujte zoznam polí, aby ste dokázali hodnotyPre N = 0 do MyList.Count - 1„Zobraziť položku zoznamuMsgBox MyList.Item (N)Ďalej N.Koniec pod |
Čítanie / načítanie rozsahu položiek zo zoznamu polí
Použitím metódy GetRange v zozname polí môžete určiť zlosť po sebe nasledujúcich položiek, ktoré sa majú načítať. Dva požadované parametre sú počiatočná pozícia indexu a počet položiek, ktoré sa majú načítať. Kód naplní druhý objekt zoznamu polí podskupinou položiek, ktoré je potom možné čítať oddelene.
123456789101112131415161718 | Vedľajší rozsah čítania Príklad ()„Definujte objektyDim MyList ako nový ArrayList, MyList1 ako objekt„Pridajte položky do objektu„ MyList “MyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item6"MyList.Add "Item4"MyList.Add "Item7"„Zachyťte 4 položky v zozname„ MyList “od pozície indexu 2Nastaviť MyList1 = MyList.GetRange (2, 4)„Opakovaním objektu„ MyList1 “zobrazíte podskupinu položiekZa každé I v MyList1„Zobraziť názov položkyMsgBox IDalej jaKoniec pod |
Hľadanie položiek v zozname polí
To, či je pomenovaná položka vo vašom zozname, môžete otestovať pomocou metódy „Obsahuje“. Vráti to hodnotu True alebo False
1 | MsgBox MyList.Contains ("Item2") |
Skutočnú pozíciu indexu môžete nájsť aj pomocou metódy „IndexOf“. Musíte zadať počiatočný index pre vyhľadávanie (zvyčajne 0). Návratová hodnota je index prvej inštancie nájdenej položky. Potom môžete pomocou slučky zmeniť počiatočný bod na nasledujúcu hodnotu indexu a nájsť ďalšie inštancie, ak existuje niekoľko duplicitných hodnôt.
Ak sa hodnota nenájde, vráti sa hodnota -1
Tento príklad ukazuje použitie položky „Obsahuje“, položka sa nenašla a opakovanie v zozname polí na nájdenie polohy všetkých duplicitných položiek:
1234567891011121314151617181920212223242526 | Sub SearchListExample ()„Definujte zoznam polí a premennéDim MyList ako nový ArrayList, Sp ako celé číslo, Pos ako celé číslo„Pridajte nové položky vrátane duplikátuMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"„Test, či je v zozname uvedená položka„ Item2 “ - vráti hodnotu TrueMsgBox MyList.Contains ("Item2")„Získať index neexistujúcej hodnoty -vráti -1MsgBox MyList.IndexOf ("Item", 0)„Nastavte počiatočnú pozíciu vyhľadávania na nuluSp = 0„Opakujte zoznam, aby ste získali všetky pozície„ položky 1 “Urob„Získajte pozíciu indexu nasledujúcej položky„ Item1 “na základe pozície v premennej„ Sp “Pos = MyList.IndexOf ("Item1", Sp)„Ak sa nenájdu žiadne ďalšie inštancie položky„ Item1 “, opustite slučkuAk je Pos = -1, potom Exit Do„Zobrazte nasledujúcu nájdenú inštanciu a pozíciu indexuMsgBox MyList (Poz) & "pri indexe" & Poz„Pridajte 1 k poslednej nájdenej hodnote indexu - toto sa teraz stane novou štartovacou pozíciou pre ďalšie vyhľadávanieSp = Poz + 1SlučkaKoniec pod |
Použitý hľadaný text rozlišuje malé a veľké písmena a zástupné znaky nie sú akceptované.
Vkladanie a vyberanie položiek
Ak si neželáte pridať svoje položky na koniec zoznamu, môžete ich vložiť na konkrétnu pozíciu indexu, aby sa nová položka nachádzala v strede zoznamu. Indexové čísla sa automaticky upravia pre nasledujúce položky.
123456789101112131415 | Podkladová vložka Príklad ()„Definujte objekt zoznamu políDim MyList ako nový ArrayList„Pridajte položky do zoznamu políMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"„Vložte‘ Item6 ’na pozíciu indexu 2MyList.Insert 2, "Item6"„Opakovaním položiek v zozname polí zobrazíte nové poradie a pozíciu indexuPre N = 0 do MyList.Count - 1MsgBox MyList (N) & "Index" & N.Ďalej N.Koniec pod |
V tomto prípade sa „položka 6“ pridá do zoznamu na pozícii indexu 2, takže položka „3“, ktorá bola na pozícii indexu 2, sa teraz presunie na pozíciu indexu 3
Jednotlivé položky je možné odstrániť pomocou metódy „Odstrániť“.
1 | MyList.Remove "Item" |
Ak sa názov položky nenájde, nevznikne žiadna chyba. Všetky nasledujúce čísla indexov budú zmenené tak, aby vyhovovali odstráneniu.
Ak poznáte pozíciu indexu položky, môžete použiť metódu ‘RemoveAt’ napr.
1 | MyList.RemoveAt 2 |
Upozorňujeme, že ak je daná pozícia indexu väčšia ako počet položiek v zozname polí, vráti sa chyba.
Rozsah hodnôt môžete zo zoznamu odstrániť pomocou metódy „RemoveRange“. Parametre sú počiatočný index a potom počet položiek na odstránenie napr.
1 | MyList.RemoveRange 3, 2 |
Všimnite si toho, že vo vašom kóde sa zobrazí chyba, ak je počet položiek posunutý od počiatočnej hodnoty väčší ako počet položiek v zozname polí.
Pri metódach „RemoveAt“ aj „RemoveRange“ by bolo vhodné nejaký kód skontrolovať, či sú uvedené čísla indexov väčšie ako celkový počet položiek v zozname polí, aby sa zachytili všetky možné chyby. Vlastnosť „Počet“ uvedie celkový počet položiek v zozname polí.
12345678910111213141516171819202122232425 | Sub RemoveExample ()„Definujte objekt zoznamu políDim MyList ako nový ArrayList„Pridajte položky do zoznamu políMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"MyList.Add "Item4"MyList.Add "Item5"„Vložte‘ Item6 ’na pozíciu indexu 2MyList.Insert 2, "Item6"„Odstrániť položku 2“MyList.Remove "Item2"„Odstrániť‘ položku ‘ - neexistuje v zozname polí, ale nemení saMyList.Remove "Item"„Odstráňte položku z pozície indexu 2MyList.RemoveAt 2„Odstráňte 2 po sebe nasledujúce položky začínajúce na pozícii indexu 2MyList.RemoveRange 3, 2„Opakujte zoznam polí, aby ste ukázali, čo zostáva a v akej pozícii indexu sa teraz nachádzaPre N = 0 do MyList.Count - 1MsgBox MyList (N) & "Index" & N.Ďalej N.Koniec pod |
Upozorňujeme, že ak na odstránenie položky na konkrétnej pozícii používate príkaz „RemoveAt“, všetky nasledujúce pozície indexu sa zmenia ihneď po odstránení tejto položky. Ak máte viacnásobné odstránenie pomocou pozície indexu, potom je dobré začať s najvyšším číslom indexu a ustúpiť späť na pozíciu nula, aby ste vždy odstránili správnu položku. Týmto spôsobom nebudete mať problém
Zoradenie zoznamu polí
Ďalšou veľkou výhodou oproti kolekcii je, že položky môžete triediť vzostupne alebo zostupne.
Objekt Zoznam polí je jediným objektom v programe Excel VBA s metódou triedenia. Metóda triedenia je veľmi rýchla a to môže byť dôležitým faktorom pri používaní zoznamu polí.
V predmete zbierky bolo na zoradenie všetkých položiek potrebné určité myslenie „vybalené z krabice“, ale so zoznamom polí je to veľmi jednoduché.
Metóda „Zoradiť“ je zoradená vzostupne a metóda „Spätne“ zoradená zostupne.
12345678910111213141516171819202122 | Sub ArrayListExample ()„Vytvoriť objekt zoznamu políDim MyList ako nový ArrayList„Pridajte položky v netriedenom poradíMyList.Add "Item1"MyList.Add "Item3"MyList.Add "Item2"„Položky zoraďte vzostupneMyList.Sort„Opakujte položky, aby ste zobrazili vzostupné poradieZa každý I v MyList„Zobraziť názov položkyMsgBox IDalej ja„Položky zoraďte zostupneMyList.Reverse„Opakujte položky, aby ste zobrazili zostupné poradieZa každý I v MyList„Zobraziť názov položkyMsgBox IDalej jaKoniec pod |
Klonovanie zoznamu polí
Zoznam polí má možnosť vytvoriť klon alebo vlastnú kópiu. Je to užitočné, ak používateľ robí zmeny v položkách pomocou klientskeho rozhrania a kódu VBA, ale ako zálohu musíte ponechať kópiu položiek v pôvodnom stave.
Používateľovi by to mohlo poskytnúť funkciu „Späť“. Možno vykonali zmeny a chcú sa vrátiť späť k pôvodnému zoznamu.
123456789101112131415 | SubklonPriklad ()„Definujte dva objekty - zoznam polí a objektDim MyList ako nový ArrayList, MyList1 ako objekt„Naplňte prvý predmet položkamiMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Skopírujte zoznam skladieb do MyList1Nastaviť MyList1 = MyList.Clone„Opakujte MyList1, aby ste dokázali klonovanieZa každé I v MyList1„Zobraziť názov položkyMsgBox IDalej jaKoniec pod |
„MyList1“ teraz obsahuje všetky položky z „MyList“ v rovnakom poradí
Skopírovanie poľa zoznamu do konvenčného objektu poľa VBA
Na skopírovanie zoznamu polí do normálneho poľa VBA môžete použiť jednoduchú metódu:
123456789101112131415 | Sub ArrayPríklad ()„Vytvorte objekt zoznamu polí a štandardný objekt poľaDim MyList ako nový ArrayList, NewArray ako variant„Naplňte zoznam polí položkamiMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Skopírujte zoznam polí do nového poľaNewArray = MyList.ToArray„Opakujte nové pole - počet zoznamov polí poskytuje maximálny indexPre N = 0 do MyList.Count - 1„Zobraziť názov položkyMsgBox NewArray (N)Ďalej N.Koniec pod |
Skopírovanie poľa zoznamu do rozsahu pracovného hárka
Zoznam polí môžete skopírovať do konkrétneho odkazu na pracovný hárok a bunku bez toho, aby ste museli iterovať zoznam polí. Musíte zadať iba odkaz na prvú bunku
123456789101112131415 | Sub rangeExample ()„Vytvorte nový objekt zoznamu políDim MyList ako nový ArrayList„Pridajte položky do zoznamuMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Vymažte cieľový hárokListy („List1“). UsedRange.Clear„Skopírujte položky za sebouTabuľky („List1“). Rozsah („A1“). Zmeniť veľkosť (1, MyList.Count). Hodnota = MyList.toArray„Skopírujte položky do stĺpcaListy („List1“). Rozsah („A5“). Zmeniť veľkosť (MyList.Count, 1). Hodnota = _WorksheetFunction.Transpose (MyList.toArray)Koniec pod |
Vyprázdnite všetky položky zo zoznamu polí
Existuje jednoduchá funkcia (Vymazať) na úplné vymazanie zoznamu polí
1234567891011121314 | Sub ClearListExample ()„Vytvorte objekt zoznamu políDim MyList ako nový ArrayList„Pridajte nové položkyMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Ukážte počet položiekMsgBox MyList.Count„Vymažte všetky položkyMyList.Clear„Ukážte počet položiek, aby ste dokázali, že všetko fungovaloMsgBox MyList.CountKoniec pod |
Tento príklad vytvorí položky v zozname polí a potom vymaže zoznam polí. Polia správ sa zobrazujú pred a za počtom položiek v zozname polí.
Súhrn metód zoznamu polí pre Excel VBA
Úloha | Parametre | Príklady |
Pridať / upraviť položku | Hodnota | MyList.Add „Item1“ |
MyList (4) = „Položka2“ | ||
Klonujte zoznam polí | Žiadny | Dim MyList ako objekt |
Nastaviť MyList2 = MyList.Clone | ||
Skopírujte do poľa | Žiadny | Dim MyArray ako variant |
MyArray = MyList.ToArray | ||
Kopírovať do rozsahu pracovného hárka (riadok) | Žiadny | Tabuľky („List1“). Rozsah („A1“). Zmeniť veľkosť (1, MyList.Count). Hodnota = MyList.ToArray |
Kopírovať do rozsahu (stĺpca) pracovného hárka | Žiadny | Listy („List1“). Rozsah („A3“). Zmena veľkosti (MyList.Count, 1). Hodnota = WorksheetFunction.Transpose (MyList.ToArray) |
Vytvoriť | „System.Collections.ArrayList“ | Dim MyList ako objekt |
Nastaviť MyList = CreateObject („System.Collections.ArrayList“) | ||
Vyhlásiť | NIE | Dim MyList ako objekt |
Vyhľadajte / skontrolujte, či položka existuje | Položka na nájdenie | MyList.Contains („Item2“) |
Nájdite pozíciu položky v zozname polí | 1. Položka na nájdenie. | Dim Index Nie tak dlho |
2. Poloha, z ktorej chcete začať hľadať. | IndexNo = MyList.IndexOf („Item3“, 0) | |
IndexNo = MyList.IndexOf („Item5“, 3) | ||
Získajte počet položiek | Žiadny | MsgBox MyList.Count |
Vložiť položku | 1. Index - pozícia, do ktorej sa má vložiť. | MyList.Insert 0, „Item5“ |
2 Hodnota - objekt alebo hodnota, ktorú chcete vložiť. | MyList.Insert 4, „Item7“ | |
Prečítajte si položku | Index - dlhé celé číslo | MsgBox MyList.Item (0) |
MsgBox MyList.Item (4) | ||
Prečítaná položka bola pridaná ako posledná | Index - dlhé celé číslo | MsgBox MyList.Item (list.Count - 1) |
Najprv si prečítajte položku, ktorá bola pridaná | Index - dlhé celé číslo | MsgBox MyList.Item (0) |
Prečítajte si všetky položky (ku každému) | NIE | Dim element As Variant |
Pre každý prvok v MyList | ||
Prvok MsgBox | ||
Ďalší prvok | ||
Prečítajte si všetky položky (pre) | Index - dlhé celé číslo | Dim i As Long |
Pre i = 0 do MyList.Count - 1 | ||
MsgBox i | ||
Ďalej i | ||
Odstráňte všetky položky | Žiadny | MyList.Clear |
Odstráňte položku na mieste | Indexová pozícia, kde sa položka nachádza | MyList.RemoveAt 5 |
Odstráňte položku podľa názvu | Položka, ktorú chcete odstrániť z ArrayList | MyList.Remove "Item3" |
Odstráňte rozsah položiek | 1. Index - počiatočná pozícia. | MyList.RemoveRange 4,3 |
2. Počet - počet položiek, ktoré sa majú odstrániť. | ||
Zoradiť zostupne | Žiadny | MyList.Reverse |
Zoradiť vzostupne | Nie | MyList.Sort |