VBA ArrayList

Lang L: none (table-of-contents)

ArrayListi objekt sarnaneb kollektsiooniobjektiga, kuid sellel on palju rohkem meetodeid ja omadusi ning seega programmeerimise seisukohast palju suurem paindlikkus.

Kogumisobjektil on ainult kaks meetodit (lisamine, eemaldamine) ja kaks atribuuti (loend, üksus), samas kui massiiviloendis on palju muud. Lisaks on kogumisobjekt ainult lugemiseks. Kui väärtused on lisatud, ei saa indekseeritud väärtust muuta, samas kui massiivi loendis on redigeerimine võimalik.

Paljud massiivi loendi meetodid kasutavad parameetreid. Erinevalt paljudest VBA standardmeetoditest pole ükski neist parameetritest valikuline. Samuti ei saa mõned meetodid ja atribuudid alati suurtähtedega, kui need sisestatakse samal viisil kui Excel VBA -s. Siiski töötavad nad endiselt.

ArrayListi objekt laieneb ja tõmbub kokku vastavalt sellele, kui palju objekte see sisaldab. Seda ei pea enne massiivi mõõtmeid mõõtma.

Massiivi loend on ühemõõtmeline (sama mis kogumisobjekt) ja vaikimisi andmetüüp on Variant, mis tähendab, et see võtab vastu igat tüüpi andmeid, olgu need numbrilised, tekstilised või kuupäevad.

Massiiviloend lahendab mitmel viisil kogumisobjekti mitmeid puudusi. See on kindlasti palju paindlikum, mida ta saab teha.

Massiivloendi objekt ei kuulu standardse VBA teeki. Saate seda kasutada oma Exceli VBA -koodis, kasutades hilist või varajast sidumist

1234 Sub LateBindingExample ()Dim MyList kui objektMäära MyList = CreateObject ("System.Collections.ArrayList")End Sub
123 Sub EarlyBindingExample ()Dim MyList kui uus ArrayListEnd Sub

Varase sidumise näite kasutamiseks peate esmalt sisestama VBA -s viite failile „mscorlib.tlb”

Selleks tehke valik „Tööriistad | Viited "Visual Basic Editori (VBE) aknast. Ilmub hüpikaken koos kõigi saadaolevate viidetega. Kerige alla jaotisse „mscorlib.dll” ja märkige selle kõrval olev ruut. Klõpsake nuppu OK ja see raamatukogu on nüüd teie projekti osa:

Massiivloendi objekti üks suur puudus on see, et sellel pole „Intellisense”. Tavaliselt, kui kasutate VBA-s mõnda objekti, näiteks vahemikku, kuvatakse kõigi saadaolevate atribuutide ja meetodite hüpikloend. Te ei saa seda massiivloendi objektiga ja mõnikord tuleb seda hoolikalt kontrollida, et veenduda, kas olete meetodi või atribuudi õigesti kirjutanud.

Samuti, kui vajutate VBE aknas F2 ja otsite „arraylist”, ei kuvata midagi, mis pole arendajale eriti kasulik.

Varajase sidumise korral töötab teie kood märgatavalt kiiremini, kuna see on kõik eelnevalt kompileeritud. Hilise sidumise korral tuleb objekt koodi koostamisel kompileerida

Massiivi loendit sisaldava Exceli rakenduse levitamine

Nagu juba märgitud, ei kuulu ArrayListi objekt Excel VBA -sse. See tähendab, et kõigil teie kolleegidel, kellele rakendust levitate, peab olema juurdepääs failile „mscorlib.tlb”

See fail asub tavaliselt:

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

Võib -olla tasub kirjutada mõni kood (kasutades Dir -meetodit), et kontrollida, kas see fail on olemas, kui kasutaja rakenduse laadib, nii et kui nad ei leia, kogevad nad pehmet maandumist. Kui seda pole ja kood töötab, ilmnevad vead.

Samuti peab kasutajal olema installitud õige .Net Framework versioon. Isegi kui kasutajal on hilisem versioon, tuleb V3.5 installida, vastasel juhul teie rakendus ei tööta

Massiivi loendi objekti ulatus

Ulatuselt on massiivloendi objekt saadaval ainult siis, kui töövihik on avatud. Töövihiku salvestamisel seda ei salvestata. Kui töövihik avatakse uuesti, tuleb massiivi loendi objekt uuesti luua, kasutades VBA-koodi.

Kui soovite, et teie massiivi loend oleks kõigile teie koodimooduli koodidele kättesaadav, peate massiivi loendi objekti deklareerima mooduli akna ülaosas asuvas jaotises Deklareeri

See tagab, et kogu teie moodulis olev kood pääseb massiivi loendile juurde. Kui soovite, et mõni töövihiku moodul pääseks juurde massiiviloendi objektile, määratlege see globaalse objektina

1 Globaalne MyCollection kui uus ArrayList

Täitmine ja lugemine teie massiivi loendist

Kõige elementaarsem toiming, mida soovite teha, on luua massiiviloend, panna sinna mõned andmed ja seejärel tõestada, et andmeid saab lugeda. Kõik selle artikli koodinäited eeldavad, et kasutate varajast sidumist ja olete lisanud VBA viidetele „mscorlib.tlb”, nagu eespool kirjeldatud

123456789101112 AlammassiiviListeNäide ()„Loo uus massiivi loendi objektDim MyList kui uus ArrayList„Lisage üksused loendisseMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Väärtuste tõestamiseks korrake massiivi loenditN = 0 MyList.Count jaoks - 1MsgBoxi MyList (N)Järgmine N.End Sub

See näide loob uue ArrayList objekti, täidab selle 3 elemendiga ja kordab loendit, kus kuvatakse iga üksus.

Pange tähele, et ArrayList indeks algab 0 -st, mitte 1 -st, seega peate loendusväärtusest lahutama 1

Väärtuste lugemiseks saate kasutada ka tsüklit „Iga… jaoks”.

123456789101112 AlammassiiviListExample ()„Loo uus massiivi loendi objektDim MyList kui uus ArrayList„Lisage üksused loendisseMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Väärtuste tõestamiseks korrake massiivi loenditIga I MyListisMsgBox IEdasi minaEnd Sub

Massiivi loendi üksuste muutmine ja muutmine

Massiiviloendi suur eelis kollektsiooni ees on see, et loendis olevaid üksusi saab muuta ja muuta teie koodi piires. Kogumisobjekti loetakse ainult lugemiseks, samas kui massiivloendi objekti loetakse / kirjutatakse

123456789101112131415 AlammassiiviListeNäide ()„Loo uus massiivi loendi objektDim MyList kui uus ArrayList„Lisage üksused loendisseMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Muuda üksus 1 väärtusest„ Üksus 2 ”asendisse„ Muudetud ”MyList (1) = "Muudetud"„Muutuste toimimise tõestamiseks korrake massiivi loenditIga I MyListis„Kuva üksuse nimiMsgBox IEdasi minaEnd Sub

Selles näites muudetakse teine ​​kirje „Item2” väärtuseks „Changed” (pidage meeles, et indeks algab 0 -st). Kui iteratsioon käivitatakse koodi lõpus, kuvatakse uus väärtus

Väärtuste massiivi lisamine massiivi loendisse

Väärtusi saate sisestada massiivi loendisse, kasutades massiivi, mis sisaldab nende väärtuste loendit või viiteid töölehe lahtriväärtustele

123456789101112131415161718 Sub AddArrayExample ()„Loo massiivi loendi objektDim MyList kui uus ArrayList„Korda massiivi väärtuste kaudu, lisades need massiivi loendisseIga massiivi jaoks ("A1", "A2", "A3")„Lisage iga massiivi väärtus loendisseMyList.Add vEdasi„Itereerige massiiviväärtuste kaudu, lisades tööleheviited massiivi loendisseIga v massiivi jaoks (vahemik ("A5"). Väärtus, vahemik ("A6"). Väärtus)MyList.Add vEdasi„Väärtuste tõestamiseks korrake massiivi loenditN = 0 MyList.Count jaoks - 1„Kuva loendiüksusMsgBox MyList.Item (N)Järgmine N.End Sub

Üksuste hulga lugemine / toomine massiivi loendist

Kasutades massiivi loendis GetRange meetodit, saate määrata allalaaditavate järjestikuste üksuste arvu. Vajalikud kaks parameetrit on lähteindeksi positsioon ja allalaaditavate üksuste arv. Kood täidab teise massiivi loendi objekti üksuste alamkomplektiga, mida saab seejärel eraldi lugeda.

123456789101112131415161718 Sub ReadRangeExample ()"Määratle objektidDim MyList kui uus ArrayList, MyList1 kui objekt„Lisage objekte„ MyList ”MyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Ad "Item6"MyList.Ad "Item4"MyList.Add "Item7"„Jäädvustage jaotises„ MyList ”4 üksust, alustades indeksikohast 2Määra MyList1 = MyList.GetRange (2, 4)Üksuste alamkomplekti kuvamiseks „korrake objekti„ MyList1 ”Iga I MyListis 1„Kuva üksuse nimiMsgBox IEdasi minaEnd Sub

Massiivi loendis olevate üksuste otsimine

Saate kontrollida, kas nimega üksus on teie loendis, kasutades meetodit „Sisaldab”. See tagastab tõese või vale

1 MsgBox MyList.Contains ("Üksus2")

Indeksi tegeliku positsiooni leiate ka meetodi „IndexOf” abil. Otsingu algusindeksi peate määrama (tavaliselt 0). Tagastusväärtus on leitud üksuse esimese eksemplari indeks. Seejärel saate kasutada tsüklit, et muuta lähtepunkt järgmiseks indeksiväärtuseks, et leida täiendavaid eksemplare, kui dubleerivaid väärtusi on mitu.

Kui väärtust ei leita, tagastatakse väärtus -1

See näide demonstreerib „Sisaldab”, üksuse leidmata jätmist ja massiiviloendi sirvimist kõigi dubleerivate üksuste asukoha leidmiseks:

1234567891011121314151617181920212223242526 Alamotsingu loendNäide ()„Määratlege massiivi loend ja muutujadDim MyList As New ArrayList, Sp As Integer, Pos As Integer„Lisage uusi üksusi, sealhulgas duplikaatMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"„Testige, et loendis„ Üksus 2 ”oleks - tagastab tõeseMsgBox MyList.Contains ("Üksus2")„Hankige olematu väärtuse indeks -tagastab -1MsgBox MyList.IndexOf ("Üksus", 0)„Määrake otsingu algusasend nulliksSp = 0„Korda loendit, et saada kõik üksuse 1 positsioonidTehke„Hankige järgmise„ Üksuse1 ”indekspositsioon, mis põhineb muutuja„ Sp ”positsioonilPos = MyList.IndexOf ("Item1", Sp)„Kui täiendavaid üksuse 1 üksusi ei leita, väljuge tsüklistKui Pos = -1, siis Välju Do„Kuvage järgmine leitud eksemplar ja indeksi asukohtMsgBox MyList (Pos) & "at index" & Pos„Lisage viimati leitud indeksi väärtusele 1 - sellest saab nüüd järgmise otsingu uus alguspositsioonSp = Pos + 1LoopEnd Sub

Pange tähele, et kasutatud otsingutekst on tõstutundlik ja metamärke ei aktsepteerita.

Üksuste sisestamine ja eemaldamine

Kui te ei soovi oma üksusi loendi lõppu lisada, saate need sisestada teatud indeksikohta nii, et uus üksus oleks loendi keskel. Indeksinumbreid kohandatakse automaatselt järgnevate üksuste jaoks.

123456789101112131415 Sub InsertExample ()„Määrake massiivi loendi objektDim MyList kui uus ArrayList„Lisage üksused massiivi loendisseMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Ad "Item1"„Sisestage punkt 6.“ indeksi positsiooni 2MyList.Insert 2, "Item6"„Uue järjekorra ja indeksi positsiooni kuvamiseks sirvige massiiviloendi üksusiKui N = 0 MyList.Count - 1MsgBox MyList (N) & "Index" & NJärgmine N.End Sub

Selles näites lisatakse loendisse indeks 6. positsioonil punkt „6”, nii et üksus 3, mis oli indeksipositsioonil 2, liigub nüüd indeksipositsiooni 3

Üksiku üksuse saab eemaldada meetodiga „Eemalda”.

1 MyList.Eemalda "Üksus"

Pange tähele, et kui üksuse nime ei leita, ei teki viga. Kõik järgnevad registrinumbrid muudetakse eemaldamiseks sobivaks.

Kui teate üksuse indekspositsiooni, võite kasutada meetodit „RemoveAt”, nt

1 MyList.RemoveAt 2

Pange tähele, et kui antud indeksi positsioon on suurem kui massiiviloendi üksuste arv, tagastatakse tõrge.

Saate väärtuste vahemiku loendist eemaldada, kasutades meetodit „RemoveRange”. Parameetriteks on lähteindeks ja seejärel eemaldatavate üksuste arv nt.

1 MyList.RemoveRange 3, 2

Pange tähele, et kui teie algväärtusest nihutatud üksuste arv on suurem kui massiivide loendi üksuste arv, saate oma koodis vea.

Nii meetodite „RemoveAt” kui ka „RemoveRange” puhul oleks mõningate koodide puhul soovitatav kontrollida, kas määratud indeksinumbrid on suuremad kui massiiviloendi üksuste koguarv, et püüda kinni kõik võimalikud vead. Atribuut „Count” annab massiiviloendis olevate üksuste koguarvu.

12345678910111213141516171819202122232425 Sub RemoveExample ()„Määrake massiivi loendi objektDim MyList kui uus ArrayList„Lisage üksused massiivi loendisseMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Ad "Item1"MyList.Add "Item4"MyList.Ad "Item5"„Sisestage punkt 6“ indeksi positsiooni 2MyList.Insert 2, "Item6"„Eemalda element“ 2 ”MyList.Eemalda "Item2"„Eemalda„ üksus ” - seda pole massiiviloendis, kuid see ei veaMyList.Eemalda "Üksus"„Eemaldage üksus indeksi positsioonilt 2MyList.RemoveAt 2„Eemaldage 2 järjestikust eset, alustades indeksipositsioonist 2MyList.RemoveRange 3, 2„Korda massiivi loendit, et näidata, mis on alles ja mis indeksi positsioonil see praegu onN = 0 MyList.Count jaoks - 1MsgBox MyList (N) & "Index" & NJärgmine N.End Sub

Pange tähele, et kui kasutate elemendi eemaldamiseks konkreetselt positsioonilt nuppu „RemoveAt”, muudetakse kohe pärast selle üksuse eemaldamist kõiki järgnevaid indeksipositsioone. Kui teil on indeksi positsiooni kasutades mitu eemaldamist, siis on hea mõte alustada kõrgeima indeksinumbriga ja astuda tagasi nullpositsiooni, nii et eemaldate alati õige üksuse. Sel moel pole teil probleemi

Massiivi loendi sortimine

Teine suur eelis kollektsiooni ees on see, et saate esemeid sortida kasvavas või kahanevas järjekorras.

Massiivloendi objekt on ainus Excel VBA sortimismeetodiga objekt. Sorteerimismeetod on väga kiire ja see võib olla massiivi loendi kasutamisel oluline kaalutlus.

Kogumisobjektis oli kõikide esemete sortimiseks vaja natuke karbist välja mõelda, kuid massiivide loendiga on see väga lihtne.

Sortimismeetod sorteerib kasvavas järjekorras ja vastupidine meetod kahanevas järjekorras.

12345678910111213141516171819202122 AlammassiiviListeNäide ()„Loo massiivi loendi objektDim MyList kui uus ArrayList„Lisage esemeid sorteerimata järjekorrasMyList.Add "Item1"MyList.Add "Item3"MyList.Add "Item2"„Sorteerige esemed kasvavas järjekorrasMyList. Sorteeri„Korda üksusi kasvava järjekorra kuvamiseksIga I MyListis„Kuva üksuse nimiMsgBox IEdasi mina„Sorteerige esemed kahanevasse järjekordaMyList. Tagurpidi„Korda üksusi läbi, et näidata kahanevat järjekordaIga I MyListis„Kuva üksuse nimiMsgBox IEdasi minaEnd Sub

Massiivi loendi kloonimine

Massiivide loendis on võimalus ise kloon või koopia luua. See on kasulik juhul, kui kasutaja muudab esemeid kasutajaliidese ja teie VBA -koodi abil, kuid peate varukoopiana säilitama üksuste koopia nende algses olekus.

See võib pakkuda kasutajale funktsiooni „Võta tagasi”. Võimalik, et nad on muudatused teinud ja soovivad esialgse loendi juurde tagasi pöörduda.

123456789101112131415 AlamkloonNäide ()„Määratlege kaks objekti - massiivi loend ja objektDim MyList kui uus ArrayList, MyList1 kui objekt„Täida esimene objekt esemetegaMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Kopeeri Mylist MyList1Määra MyList1 = MyList.Clone„Kloonimise tõestamiseks korrake MyList1Iga I MyListis 1„Kuva üksuse nimiMsgBox IEdasi minaEnd Sub

„MyList1” sisaldab nüüd kõiki „MyList” üksusi samas järjekorras

Loendimassiivi kopeerimine tavapärasesse VBA massiiviobjekti

Massiivi loendi kopeerimiseks tavalisse VBA massiivi saate kasutada lihtsat meetodit:

123456789101112131415 AlammassNäide ()„Looge massiivi loendi objekt ja tavaline massiiviobjektDim MyList as New ArrayList, NewArray As Variant„Täitke massiivi loend üksustegaMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Kopeerige massiivide loend uude massiiviNewArray = MyList.ToArray„Korda uut massiivi - pange tähele, et massiivide loendite arv annab maksimaalse indeksiN = 0 MyList.Count jaoks - 1„Kuva üksuse nimiMsgBox NewArray (N)Järgmine N.End Sub

Loendimassiivi kopeerimine töölehevahemikku

Massiivi loendi saate kopeerida kindlale töölehele ja lahtri viitele, ilma et peaksite massiivi loendit kordama. Peate määrama ainult esimese lahtri viite

123456789101112131415 AlamvahemikNäide ()„Loo uus massiivi loendi objektDim MyList kui uus ArrayList„Lisage üksused loendisseMyList.Ad "Item1"MyList.Add "Item2"MyList.Add "Item3"„Tühjendage sihtlehtSheets ("Sheet1"). UsedRange.Clear„Kopeerige üksused järjestArvutustabelid ("Sheet1"). Vahemik ("A1"). Suuruse muutmine (1, MyList.Count) .Value = MyList.toArray„Kopeerige üksused veerguArvutustabelid ("Sheet1"). Vahemik ("A5"). Suuruse muutmine (MyList.Count, 1) .Väärtus = _WorksheetFunction.Transpose (MyList.toArray)End Sub

Tühjendage kõik üksused massiivi loendist

Massiivide loendi täielikuks kustutamiseks on lihtne funktsioon (Kustuta)

1234567891011121314 Alam ClearListExample ()„Loo massiivi loendi objektDim MyList kui uus ArrayList„Lisage uusi üksusiMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Kuva üksuste arvMsgBox MyList.Count'Kustuta kõik üksusedMyList. Selge„Näidake üksuste arvu, et tõestada, et tühjendus on toiminudMsgBox MyList.CountEnd Sub

See näide loob massiiviloendisse üksused ja seejärel tühjendab massiiviloendi. Sõnumikastid tõestavad massiiviloendi üksuste arvu enne ja pärast.

Massiivi loendi meetodite kokkuvõte Exceli VBA jaoks

Ülesanne Parameetrid Näited
Üksuse lisamine / muutmine Väärtus MyList.Add „Item1”
MyList (4) = “Üksus2”
Massiivi loendi kloonimine Puudub Dim MyList kui objekt
Määra MyList2 = MyList.Clone
Kopeeri massiivi Puudub Dim MyArray kui variant
MyArray = MyList.ToArray
Kopeeri töölehe vahemikku (rida) Puudub Arvutustabelid („Sheet1”). Vahemik („A1”). Suuruse muutmine (1, MyList.Count) .Value = MyList.ToArray
Kopeeri töölehe vahemikku (veergu) Puudub Arvutustabelid („leht 1”). Vahemik („A3”). Muuda suurust (MyList.Count, 1) .Value = WorksheetFunction.Transpose (MyList.ToArray)
Loo "System.Collections.ArrayList" Dim MyList kui objekt
Määra MyList = CreateObject ("System.Collections.ArrayList")
Kuulutama Ei ole Dim MyList kui objekt
Leidke / kontrollige, kas üksus on olemas Otsitav objekt MyList.Contains („Üksus2”)
Leidke ArrayListist üksuse asukoht 1. Otsitav objekt. Hämardatud indeks Ei ole nii kaua
2. Asend, kust otsimist alustada. IndexNo = MyList.IndexOf („Üksus3”, 0)
IndexNo = MyList.IndexOf („Üksus5”, 3)
Hankige üksuste arv Puudub MsgBox MyList.Count
Lisa üksus 1. Indeks - asukoht, kuhu sisestada. MyList.Insert 0, “Item5”
2 Väärtus - lisatav objekt või väärtus. MyList.Insert 4, „Item7”
Loe üksust Indeks - pikk täisarv MsgBox MyList.Item (0)
MsgBox MyList.Item (4)
Loe viimati lisatud üksust Indeks - pikk täisarv MsgBox MyList.Item (list.Count - 1)
Lugege esmalt lisatud üksust Indeks - pikk täisarv MsgBox MyList.Item (0)
Lugege kõiki üksusi (igaühe kohta) Ei ole Dim element Variantina
Iga MyListi elemendi jaoks
MsgBox element
Järgmine element
Loe kõiki üksusi (jaoks) Indeks - pikk täisarv Dim i As Long
Kui i = 0 MyList.Count - 1
MsgBox i
Edasi i
Eemaldage kõik üksused Puudub MyList. Selge
Eemaldage ese positsioonilt Indeksi positsioon, kus objekt asub MyList.RemoveAt 5
Eemaldage üksus nime järgi Üksus ArrayListist eemaldamiseks MyList. Eemaldage üksus 3
Eemaldage valik üksusi 1. Indeks - lähtepositsioon. MyList.RemoveRange 4,3
2. Loendus - eemaldatavate üksuste arv.
Sorteeri kahanevas järjekorras Puudub MyList. Tagurpidi
Sorteeri kasvavas järjekorras Mitte MyList. Sorteeri
wave wave wave wave wave