Objekt ArrayList je podoben objektu Collection, vendar ima veliko več metod in lastnosti ter zato s programskega vidika veliko večjo prilagodljivost.
Objekt Collection ima samo dve metodi (Add, Remove) in dve lastnosti (Count, Item), medtem ko ima Array List še veliko več. Tudi predmet Zbirka je samo za branje. Ko so vrednosti dodane, indeksirane vrednosti ni mogoče spremeniti, medtem ko je na seznamu nizov mogoče urejanje.
Številne metode seznama nizov uporabljajo parametre. Za razliko od mnogih standardnih metod VBA, noben od teh parametrov ni obvezen. Tudi nekatere metode in lastnosti se pri vnosu na enak način, kot to počnejo v Excelu VBA, ne uporabijo vedno velike. Vendar pa še vedno delujejo.
Objekt ArrayList se razširi in skrči glede na število elementov, ki jih vsebuje. Pred uporabo ga ni treba dimenzionirati kot matriko.
Seznam nizov je enodimenzionalen (enako kot objekt Zbirka), privzeti tip podatkov pa je Variant, kar pomeni, da bo sprejel katero koli vrsto podatkov, pa naj bo to številska, besedilna ali datumska.
Array List na več načinov obravnava številne pomanjkljivosti predmeta Collection. Vsekakor je veliko bolj prilagodljiv glede tega, kar zmore.
Objekt Array List ni del standardne knjižnice VBA. Uporabite ga lahko v kodi Excel VBA s pozno ali zgodnjo vezavo
1234 | Sub LateBindingExample ()Zatemni MyList kot objektNastavi MyList = CreateObject ("System.Collections.ArrayList")End Sub |
123 | Sub EarlyBindingExample ()Zatemni MyList kot nov ArrayListEnd Sub |
Če želite uporabiti primer zgodnje vezave, morate najprej v VBA vnesti sklic na datoteko "mscorlib.tlb"
To naredite tako, da izberete »Orodja | Reference ‘iz okna urejevalnika Visual Basic (VBE). Odpre se pojavno okno z vsemi razpoložljivimi referencami. Pomaknite se navzdol do »mscorlib.dll« in označite polje zraven njega. Kliknite V redu in ta knjižnica je zdaj del vašega projekta:
Ena od velikih pomanjkljivosti predmeta Array List je, da nima "Intellisense". Običajno, če uporabljate predmet v VBA, kot je obseg, boste videli pojavni seznam vseh razpoložljivih lastnosti in metod. Tega ne dobite s predmetom Array List, včasih pa je treba skrbno preveriti, ali je metoda ali lastnost pravilno napisana.
Če pritisnete F2 v oknu VBE in poiščete »arraylist«, se ne prikaže nič, kar razvijalcu ni v veliko pomoč.
Vaša koda bo z zgodnjo vezavo delovala precej hitreje, ker je vsa vnaprej sestavljena. Ob pozni vezavi je treba objekt sestaviti med izvajanjem kode
Distribucija vaše Excelove aplikacije, ki vsebuje matrični seznam
Kot je bilo že poudarjeno, predmet ArrayList ni del Excela VBA. To pomeni, da mora imeti vsak od vaših kolegov, ki jim razdelite aplikacijo, dostop do datoteke »mscorlib.tlb«
Ta datoteka se običajno nahaja v:
C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319
Morda bi bilo vredno napisati kodo (z metodo Dir), da bi preverili, ali ta datoteka obstaja, ko uporabnik naloži aplikacijo, tako da doživi "mehak pristanek", če je ne najde. Če ni in koda teče, se bodo pojavile napake.
Prav tako mora imeti uporabnik nameščeno pravilno različico .Net Framework. Tudi če ima uporabnik novejšo različico, mora biti V3.5 nameščen, sicer aplikacija ne bo delovala
Področje uporabe predmeta seznama nizov
Glede na obseg je predmet Array List na voljo samo, ko je delovni zvezek odprt. Ko se shrani delovni zvezek, se ne shrani. Če se delovni zvezek znova odpre, je treba predmet Array List znova ustvariti s kodo VBA.
Če želite, da je vaš Array List na voljo za vso kodo v vašem kodnem modulu, morate prijaviti objekt Array List v razdelku Declare na samem vrhu okna modula.
S tem boste zagotovili, da lahko vsa vaša koda v tem modulu dostopa do seznama nizov. Če želite, da kateri koli modul v vašem delovnem zvezku dostopa do predmeta Array List, ga definirajte kot globalni objekt
1 | Global MyCollection As New ArrayList |
Prenašanje in branje s seznama nizov
Najosnovnejše dejanje, ki ga želite izvesti, je ustvariti seznam nizov, vanj vnesti nekaj podatkov in nato dokazati, da jih je mogoče prebrati. Vsi primeri kode v tem članku predvidevajo, da uporabljate zgodnjo vezavo, in ste referencam VBA dodali „mscorlib.tlb“, kot je opisano zgoraj
123456789101112 | Sub ArrayListExample ()'Ustvari nov objekt seznama nizovZatemni MyList kot nov ArrayList'Dodaj elemente na seznamMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3""Ponovite seznam nizov, da dokažete vrednostiZa N = 0 na Moj seznam.Število - 1Moj seznam MsgBox (N)Naslednji N.End Sub |
Ta primer ustvari nov predmet ArrayList, ga napolni s 3 elementi in ponovi po seznamu, ki prikazuje vsak element.
Upoštevajte, da se indeks ArrayList začne pri 0, ne pri 1, zato morate od vrednosti Count odšteti 1.
Za branje vrednosti lahko uporabite tudi zanko "Za … Vsak":
123456789101112 | Sub ArrayListExample ()'Ustvari nov objekt seznama nizovZatemni MyList kot nov ArrayList'Dodaj elemente na seznamMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Ponovite seznam nizov, da dokažete vrednostiZa vsakega na mojem seznamuSporočilo INaslednji jazEnd Sub |
Urejanje in spreminjanje elementov na seznamu nizov
Glavna prednost matričnega seznama pred zbirko je, da lahko elemente na seznamu urejate in spreminjate v svoji kodi. Objekt Collection je samo za branje, medtem ko je predmet Array List branje / pisanje
123456789101112131415 | Sub ArrayListExample ()'Ustvari nov objekt seznama nizovZatemni MyList kot nov ArrayList'Dodaj elemente na seznamMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Spremenite 1. element iz„ Postavka2 “v„ Spremenjeno “MyList (1) = "Spremenjeno""Ponovite seznam nizov, da dokažete, da je sprememba delovalaZa vsakega na mojem seznamu"Prikažite ime predmetaSporočilo INaslednji jazEnd Sub |
V tem primeru je druga postavka „postavka 2“ spremenjena v vrednost „spremenjeno“ (ne pozabite, da se indeks začne pri 0). Ko se iteracija izvede na koncu kode, se prikaže nova vrednost
Dodajanje niza vrednosti na seznam nizov
Vrednosti lahko vnesete v svoj seznam nizov z uporabo matrike, ki vsebuje seznam teh vrednosti ali sklice na vrednosti celic na delovnem listu
123456789101112131415161718 | Sub AddArrayExample ()'Ustvari objekt seznama nizovZatemni MyList kot nov ArrayList"Ponovite vrednosti matrike in jih dodajte na seznam nizovZa vsak v nizu ("A1", "A2", "A3")"Dodajte vrednost vsake matrike na seznamMyList.Add vNaslednji"Ponovite po vrednostih matrike z referencami delovnega lista in jih dodajte na seznam nizovZa vsak v matriki v (obseg ("A5"). Vrednost, obseg ("A6"). Vrednost)MyList.Add vNaslednji„Ponovite seznam nizov, da dokažete vrednostiZa N = 0 na Moj seznam.Število - 1"Prikaži element seznamaMsgBox MyList.Item (N)Naslednji N.End Sub |
Branje / pridobivanje vrste elementov s seznama nizov
Z uporabo metode GetRange na seznamu nizov lahko določite niz zaporednih elementov, ki jih je treba pridobiti. Dva zahtevana parametra sta začetni položaj indeksa in število elementov, ki jih je treba pridobiti. Koda zapolni drugi predmet Array List s podnaborom elementov, ki jih je mogoče nato prebrati ločeno.
123456789101112131415161718 | Sub ReadRangeExample ()"Določite predmeteZatemni MyList kot nov ArrayList, MyList1 kot objekt"Dodajte predmete v predmet" MyList "MyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item6"MyList.Add "Item4"MyList.Add "Item7""Zajemite 4 elemente v" MyList ", začenši na mestu indeksa 2Nastavi MyList1 = MyList.GetRange (2, 4)"Ponovite predmet" MyList1 ", da prikažete podnabor elementovZa vsakega na mojem seznamu1"Prikažite ime predmetaSporočilo INaslednji jazEnd Sub |
Iskanje elementov na seznamu nizov
Ali je imenovani element na vašem seznamu, lahko preizkusite z metodo 'Vsebuje'. To bo vrnilo True ali False
1 | MsgBox MyList.Contains ("Item2") |
Dejanski položaj indeksa lahko najdete tudi z metodo 'IndexOf'. Za iskanje morate določiti začetni indeks (običajno 0). Vrnjena vrednost je indeks prvega primerka najdene postavke. Nato lahko z zanko spremenite začetno točko na naslednjo vrednost indeksa in poiščete nadaljnje primere, če je več podvojenih vrednosti.
Če vrednosti ne najdemo, se vrne vrednost -1
Ta primer prikazuje uporabo možnosti »Vsebuje«, elementa ni mogoče najti in prelistati seznam nizov, da bi našli položaj vseh podvojenih elementov:
1234567891011121314151617181920212223242526 | Sub SearchListExample ()"Določite seznam nizov in spremenljivkeDim MyList As New ArrayList, Sp As Integer, Pos As Integer"Dodajte nove elemente, vključno z dvojnikomMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1""Test, da je" Item2 "na seznamu - vrne TrueMsgBox MyList.Contains ("Item2")"Pridobite indeks neobstoječe vrednosti -vrne -1MsgBox MyList.IndexOf ("Postavka", 0)'Nastavite začetni položaj iskanja na ničSp = 0"Ponavljajte se po seznamu, da dobite vse pozicije" postavke 1 "Naredi"Pridobite indeksni položaj naslednje" postavke 1 "na podlagi položaja v spremenljivki" Sp "Pos = MyList.IndexOf ("Item1", Sp)"Če ne najdete nobenega drugega primerka" postavke 1 ", zapustite zankoČe je Pos = -1, potem zapustite Do"Prikažite naslednji najdeni primerek in položaj indeksaMsgBox MyList (Pos) & "at index" & Pos"Zadnji najdeni vrednosti indeksa dodajte 1 - to postane nova začetna pozicija za naslednje iskanjeSp = Pos + 1ZankaEnd Sub |
Upoštevajte, da uporabljeno iskalno besedilo razlikuje med velikimi in malimi črkami in nadomestnih znakov ne sprejema.
Vstavljanje in odstranjevanje predmetov
Če svojih elementov ne želite dodati na konec seznama, jih lahko vstavite na določeno mesto indeksa, tako da je nova postavka na sredini seznama. Številke indeksa se samodejno prilagodijo naslednjim postavkam.
123456789101112131415 | Sub InsertExample ()'Določite objekt seznama nizovZatemni MyList kot nov ArrayList'Dodaj elemente na seznam nizovMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"„Vstavite„ postavko 6 “na indeksno mesto 2MyList.Insert 2, "Item6""Ponovite elemente na seznamu matrik, da prikažete novo vrstni red in položaj indeksaZa N = 0 na Moj seznam.Število - 1MsgBox MyList (N) & "Index" & NNaslednji N.End Sub |
V tem primeru se "element 6" doda na seznam na indeksnem mestu 2, zato se "element3", ki je bil na indeksnem položaju 2, premakne na indeksni položaj 3
Posamezen element lahko odstranite z metodo »Odstrani«.
1 | MyList.Remove "Item" |
Upoštevajte, da ni napake, če imena elementa ne najdete. Vse naslednje številke indeksov bodo spremenjene glede na odstranitev.
Če poznate indeksni položaj predmeta, lahko uporabite metodo "RemoveAt", npr.
1 | MyList.RemoveAt 2 |
Upoštevajte, da če je podani položaj indeksa večji od števila elementov na seznamu nizov, se vrne napaka.
Obseg vrednosti lahko s seznama odstranite z metodo 'RemoveRange'. Parametri so začetni indeks in nato število elementov, ki jih je treba odstraniti npr.
1 | MyList.RemoveRange 3, 2 |
Upoštevajte, da boste v kodi dobili napako, če je število elementov, odmikanih od začetne vrednosti, večje od števila elementov na seznamu matrike.
Pri metodah »RemoveAt« in »RemoveRange« bi bilo priporočljivo, da se določena koda preveri, ali so navedene številke indeksa večje od skupnega števila elementov na seznamu nizov, da se ujamejo morebitne napake. Lastnost 'Count' bo podala skupno število elementov na seznamu nizov.
12345678910111213141516171819202122232425 | Sub RemoveExample ()'Določite objekt seznama nizovZatemni MyList kot nov ArrayList'Dodaj elemente na seznam nizovMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"MyList.Add "Item4"MyList.Add "Item5"„Vstavite„ postavko 6 “na položaj indeksa 2MyList.Insert 2, "Item6""Odstrani" element 2 "MyList.Remove "Item2""Odstrani" element " - to ne obstaja na seznamu matrike, vendar ne povzroča napakMyList.Remove "Item"„Odstranite predmet na indeksnem mestu 2MyList.RemoveAt 2„Odstranite 2 zaporedna elementa, ki se začnejo na indeksnem mestu 2MyList.RemoveRange 3, 2"Ponovite seznam matrik, da pokažete, kaj je še ostalo in v kakšnem položaju indeksa je zdajZa N = 0 na Moj seznam.Število - 1MsgBox MyList (N) & "Index" & NNaslednji N.End Sub |
Upoštevajte, da če z možnostjo »RemoveAt« odstranite element na določenem mestu, se takoj po odstranitvi tega elementa spremenijo vsi poznejši indeksni položaji. Če imate z indeksnim položajem več odstranitev, je dobro, da začnete z najvišjo številko indeksa in stopite nazaj navzdol do ničle, tako da boste vedno odstranili pravilen element. Na ta način ne boste imeli težav
Razvrščanje seznama nizov
Druga velika prednost pred zbirko je, da lahko predmete razvrstite po naraščajočem ali padajočem vrstnem redu.
Objekt Array List je edini objekt v Excelu VBA z metodo razvrščanja. Način razvrščanja je zelo hiter in to je lahko pomemben dejavnik pri uporabi seznama nizov.
V objektu zbiranja je bilo za razvrščanje vseh elementov potrebno nekaj razmišljanja "izven škatle", vendar je s seznamom nizov zelo preprosto.
Metoda 'Sort' razvrsti po naraščajočem vrstnem redu, metoda 'Reverse' pa po padajočem.
12345678910111213141516171819202122 | Sub ArrayListExample ()'Ustvari objekt Seznam nizovZatemni MyList kot nov ArrayList"Dodajte predmete v nerazvrščenem vrstnem reduMyList.Add "Item1"MyList.Add "Item3"MyList.Add "Item2""Postavke razvrstite po naraščajočem vrstnem reduMyList.Sort"Ponovite elemente, da prikažete naraščajoč vrstni redZa vsakega na mojem seznamu"Prikažite ime predmetaSporočilo INaslednji jaz"Postavke razvrstite po padajočem vrstnem reduMyList.Reverse"Ponovite elemente, da prikažete padajoči vrstni redZa vsakega na mojem seznamu"Prikažite ime predmetaSporočilo INaslednji jazEnd Sub |
Kloniranje matričnega seznama
Seznam nizov lahko ustvari klon ali kopijo samega sebe. To je uporabno, če uporabnik spremeni elemente s pomočjo vmesnika in kode VBA, vendar morate kopijo elementov hraniti v prvotnem stanju kot varnostno kopijo.
To bi uporabniku lahko omogočilo funkcijo »Razveljavi«. Morda so naredili spremembe in se želijo vrniti na prvotni seznam.
123456789101112131415 | Sub CloneExample ()"Določite dva predmeta - seznam matrik in predmetZatemni MyList kot nov ArrayList, MyList1 kot objekt"Prvi predmet napolnite s predmetiMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3""Kopiraj moj seznam na seznam My1"Nastavi MyList1 = MyList.Clone"Ponovite MyList1, da dokažete kloniranjeZa vsakega na mojem seznamu1"Prikažite ime predmetaSporočilo INaslednji jazEnd Sub |
'MyList1' zdaj vsebuje vse elemente iz 'MyList' v istem vrstnem redu
Kopiranje matrike seznamov v običajen objekt matrike VBA
Seznam nizov lahko kopirate v običajno matriko VBA s preprosto metodo:
123456789101112131415 | Primer podmočij ()"Ustvari objekt seznama nizov in standardni predmet matrikeDim MyList As New ArrayList, NewArray As Variant'Napolni seznam nizov s predmetiMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3""Kopirajte seznam nizov v novo matrikoNewArray = MyList.ToArray"Ponovite novo matriko - upoštevajte, da število seznamov nizov zagotavlja največji indeksZa N = 0 na Moj seznam.Število - 1"Prikažite ime predmetaMsgBox NewArray (N)Naslednji N.End Sub |
Kopiranje matrike seznamov v obseg delovnega lista
Seznam nizov lahko kopirate na določen delovni list in sklic na celico, ne da bi morali iterirati po seznamu nizov. Določiti morate le prvo referenco celice
123456789101112131415 | Podrazpon Primer ()'Ustvari nov objekt seznama nizovZatemni MyList kot nov ArrayList'Dodaj elemente na seznamMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Počistite ciljni listListi ("List1"). UsedRange.Clear"Kopirajte elemente po vrstiListi ("List1"). Razpon ("A1"). Spreminjanje velikosti (1, MyList.Count) .Value = MyList.toArray"Kopirajte elemente v stolpecListi ("List1"). Razpon ("A5"). Spreminjanje velikosti (MyList.Count, 1) .Vrednost = _Delovni listFunction.Transpose (MyList.toArray)End Sub |
Izpraznite vse elemente s seznama nizov
Obstaja preprosta funkcija (Počisti), da popolnoma počistite seznam nizov
1234567891011121314 | Sub ClearListExample ()'Ustvari objekt seznama nizovZatemni MyList kot nov ArrayList"Dodajte nove postavkeMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3""Pokaži število predmetovMsgBox MyList.Count"Počisti vse elementeMyList.Clear"Pokažite število predmetov, da dokažete, da je jasno delovaloMsgBox MyList.CountEnd Sub |
Ta primer ustvari elemente na seznamu nizov in nato počisti seznam nizov. Okvirji za sporočila dokazujejo število in število elementov na seznamu matrik in za njimi.
Povzetek metod seznamov nizov za Excel VBA
Naloga | Parametri | Primeri |
Dodaj / uredi element | Vrednost | MyList.Add “Item1” |
MyList (4) = “Element2” | ||
Kloniraj seznam nizov | Nobena | Zatemni MyList kot objekt |
Nastavite MyList2 = MyList.Clone | ||
Kopiraj v polje | Nobena | Zatemni MyArray kot varianto |
MyArray = MyList.ToArray | ||
Kopiraj v obseg delovnega lista (vrstica) | Nobena | Listi (»List1«). Razpon (»A1«). Spreminjanje velikosti (1, MyList.Count) .Value = MyList.ToArray |
Kopiraj v obseg delovnega lista (stolpec) | Nobena | Listi (»List1«). Razpon (»A3«). Spreminjanje velikosti (MyList.Count, 1) .Value = Delovni listFunction.Transpose (MyList.ToArray) |
Ustvari | "System.Collections.ArrayList" | Zatemni MyList kot objekt |
Nastavi MyList = CreateObject (“System.Collections.ArrayList”) | ||
Izjaviti | N/A | Zatemni MyList kot objekt |
Poiščite / preverite, ali element obstaja | Predmet za iskanje | MyList.Contains (“Item2”) |
Poiščite položaj predmeta v ArrayList | 1. Predmet za iskanje. | Indeks zatemnitveNi tako dolgo |
2. Položaj, od katerega lahko začnete iskati. | IndexNo = MyList.IndexOf (“Item3”, 0) | |
IndexNo = MyList.IndexOf (“Item5”, 3) | ||
Pridobite število predmetov | Nobena | MsgBox MyList.Count |
Vstavi element | 1. Indeks - položaj za vstavljanje. | MyList.Insert 0, “Item5” |
2 Vrednost - predmet ali vrednost za vstavljanje. | MyList.Insert 4, “Item7” | |
Preberite element | Indeks - dolgo celo število | MsgBox MyList.Item (0) |
MsgBox MyList.Item (4) | ||
Preberite zadnji dodani element | Indeks - dolgo celo število | MsgBox MyList.Item (list.Count - 1) |
Najprej preberite dodani element | Indeks - dolgo celo število | MsgBox MyList.Item (0) |
Preberite vse elemente (za vsakega) | N/A | Dim element kot varianta |
Za vsak element na seznamu MyList | ||
Element MsgBox | ||
Naslednji element | ||
Preberi vse postavke (za) | Indeks - dolgo celo število | Dim i As Long |
Za i = 0 na MyList.Count - 1 | ||
MsgBox i | ||
Naprej i | ||
Odstranite vse elemente | Nobena | MyList.Clear |
Odstranite predmet na mestu | Indeksni položaj, kjer je predmet | MyList.RemoveAt 5 |
Odstranite element po imenu | Element, ki ga želite odstraniti s seznama ArrayList | MyList.Odstranite "predmet 3" |
Odstranite vrsto elementov | 1. Indeks - začetni položaj. | MyList.RemoveRange 4,3 |
2. Count - število elementov, ki jih je treba odstraniti. | ||
Razvrsti po padajočem vrstnem redu | Nobena | MyList.Reverse |
Razvrsti po naraščajočem vrstnem redu | Ne | MyList.Sort |