Zoznam polí VBA

Obsah

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
wave wave wave wave wave