VBA ArrayList

Indholdsfortegnelse

Et ArrayList -objekt ligner et Collection -objekt, men det har langt flere metoder og egenskaber og derfor langt større fleksibilitet set fra et programmeringssynspunkt.

Et samlingsobjekt har kun to metoder (Tilføj, fjern) og to egenskaber (tæl, element), mens en matrilliste har mange flere. Samlingsobjektet er også skrivebeskyttet. Når værdier er tilføjet, kan den indekserede værdi ikke ændres, mens redigering på en matrilliste er mulig.

Mange af Array List -metoderne bruger parametre. I modsætning til mange af standard VBA -metoderne er ingen af ​​disse parametre valgfri. Nogle af metoderne og egenskaberne kapitaliserer ikke altid, når de indtastes på samme måde, som de gør i Excel VBA. De fungerer dog stadig.

ArrayList -objektet udvides og kontrakterer i størrelse alt efter, hvor mange elementer det indeholder. Det behøver ikke at være dimensioneret før brug som et array.

Arraylisten er endimensionel (samme som Collection -objektet), og standard datatypen er Variant, hvilket betyder, at den accepterer enhver form for data, uanset om det er numerisk, tekst eller dato.

På mange måder adresserer Array List en række mangler ved Collection -objektet. Det er bestemt langt mere fleksibelt i, hvad det kan.

Array List -objektet er ikke en del af standard VBA -biblioteket. Du kan bruge den i din Excel VBA -kode ved at bruge sen eller tidlig binding

1234 Sub LateBindingExample ()Dim MyList som objektIndstil MyList = CreateObject ("System.Collections.ArrayList")Afslut Sub
123 Sub EarlyBindingExample ()Dim MyList som ny ArrayListAfslut Sub

For at bruge det tidlige bindingseksempel skal du først indtaste en reference i VBA til filen 'mscorlib.tlb'

Det gør du ved at vælge ‘Værktøjer | Referencer 'fra Visual Basic Editor (VBE) vinduet. Et pop op-vindue vises med alle tilgængelige referencer. Rul ned til ‘mscorlib.dll’, og afkryds feltet ud for det. Klik på OK, og biblioteket er nu en del af dit projekt:

En af de store ulemper ved et Array List -objekt er, at det ikke har 'Intellisense'. Normalt, hvor du bruger et objekt i VBA, f.eks. Et område, vil du se en pop-up-liste over alle tilgængelige egenskaber og metoder. Du får ikke dette med et Array List -objekt, og det kræver nogle gange omhyggelig kontrol for at sikre, at du har stavet metoden eller ejendommen korrekt.

Hvis du også trykker på F2 i VBE -vinduet og søger på 'arraylist', vises der ikke noget, hvilket ikke er særlig nyttigt for en udvikler.

Din kode kører betydeligt hurtigere med tidlig binding, fordi den er samlet på forhånd. Ved sen binding skal objektet kompileres, mens koden kører

Distribuering af din Excel -applikation, der indeholder en matrilliste

Som allerede påpeget er ArrayList -objektet ikke en del af Excel VBA. Det betyder, at alle dine kolleger, som du distribuerer applikationen til, skal have adgang til filen 'mscorlib.tlb'

Denne fil er normalt placeret i:

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

Det kan være værd at skrive en kode (ved hjælp af Dir -metoden) for at kontrollere, at denne fil findes, når en bruger indlæser applikationen, så de oplever en 'blød landing', hvis den ikke findes. Hvis den ikke er til stede, og koden kører, vil der opstå fejl.

Brugeren skal også have den korrekte .Net Framework -version installeret. Selvom brugeren har en senere version, skal V3.5 installeres, ellers fungerer din applikation ikke

Anvendelsesområde for et Array List -objekt

Med hensyn til omfang er Array List -objektet kun tilgængeligt, mens projektmappen er åben. Det gemmes ikke, når projektmappen gemmes. Hvis projektmappen genåbnes, skal Array List-objektet genoprettes ved hjælp af VBA-kode.

Hvis du vil have din Array List til at være tilgængelig for hele koden i dit kodemodul, skal du deklarere Array List -objektet i sektionen Declare i toppen af ​​modulvinduet

Dette sikrer, at al din kode inden for det pågældende modul har adgang til Array List. Hvis du vil have et modul i din projektmappe til at få adgang til Array List -objektet, skal du definere det som et globalt objekt

1 Global MyCollection Som New ArrayList

Befolkning og læsning fra din matrixliste

Den mest grundlæggende handling, du vil foretage, er at oprette en matrixliste, lægge nogle data i den og derefter bevise, at dataene kan læses. Alle kodeeksemplerne i denne artikel antager, at du bruger tidlig binding og har tilføjet 'mscorlib.tlb' til VBA -referencerne, som beskrevet ovenfor

123456789101112 Sub ArrayListExample ()'Opret et nyt matrixlisteobjektDim MyList som ny ArrayList'Tilføj elementer til listenMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"'Skift gennem arrayliste for at bevise værdierFor N = 0 Til MyList.Count - 1MsgBox MyList (N)Næste NAfslut Sub

Dette eksempel opretter et nyt ArrayList -objekt, udfylder det med 3 elementer, og det gentages gennem listen, der viser hvert element.

Bemærk, at ArrayList -indekset starter ved 0, ikke 1, så du skal trække 1 fra Count -værdien

Du kan også bruge en 'For … Hver' sløjfe til at læse værdierne:

123456789101112 Sub ArrayListExample ()'Opret et nyt matrixlisteobjektDim MyList som ny ArrayList'Tilføj elementer til listenMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"'Skift gennem arrayliste for at bevise værdierFor hver I In MyListMsgBox INæste jegAfslut Sub

Redigering og ændring af elementer i en matrilliste

En stor fordel ved en matrilliste frem for en samling er, at elementerne på listen kan redigeres og ændres i din kode. Samlingsobjektet er kun skrivebeskyttet, mens Array List -objektet læses / skrives

123456789101112131415 Sub ArrayListExample ()'Opret et nyt matrixlisteobjektDim MyList som ny ArrayList'Tilføj elementer til listenMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"'Skift element 1 fra' Item2 'til' Ændret 'MyList (1) = "Ændret"'Skift gennem array -listen for at bevise, at ændringen fungeredeFor hver I In MyList'Vis varenavnMsgBox INæste jegAfslut Sub

I dette eksempel ændres det andet element, 'Item2' til værdien 'Ændret' (husk at indekset starter ved 0). Når iterationen køres i slutningen af ​​koden, vises den nye værdi

Tilføjelse af en række værdier til en matrilliste

Du kan indtaste værdier i din matrixliste ved at bruge et array, der indeholder en liste over disse værdier eller referencer til celleværdier i et regneark

123456789101112131415161718 Sub AddArrayExample ()'Opret matrixlisteobjektDim MyList som ny ArrayList'Gentag gennem arrayværdier og tilføj dem til arraylistenFor hver v In Array ("A1", "A2", "A3")'Tilføj hver arrayværdi til listenMyList.Add vNæste'Gentag gennem arrayværdier med regnearksreferencer, der tilføjer dem til arraylistenFor hver v In Array (område ("A5"). Værdi, område ("A6"). Værdi)MyList.Add vNæste'Skift gennem arrayliste for at bevise værdierFor N = 0 Til MyList.Count - 1'Vis listeelementMsgBox MyList.Item (N)Næste NAfslut Sub

Læsning / hentning af en række elementer fra en matrilliste

Ved at bruge GetRange -metoden på en matrilliste kan du angive et raseri af på hinanden følgende elementer, der skal hentes. De to nødvendige parametre er startindekspositionen og antallet af elementer, der skal hentes. Koden udfylder et andet Array List -objekt med delsættet elementer, som derefter kan læses separat.

123456789101112131415161718 Sub ReadRangeExample ()'Definer objekterDim MyList As New ArrayList, MyList1 As Object'Føj elementer til' MyList' -objektMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item6"MyList.Add "Item4"MyList.Add "Item7"'Fang 4 elementer i' MyList ', der starter ved indeksposition 2Indstil MyList1 = MyList.GetRange (2, 4)'Iterer gennem objektet' MyList1 'for at få vist undersættet med elementerFor hver I I MyList1'Vis varenavnMsgBox INæste jegAfslut Sub

Søger efter elementer inden for en matrixliste

Du kan teste, om et navngivet element er på din liste ved hjælp af metoden 'Indeholder'. Dette vil returnere Sandt eller Falsk

1 MsgBox MyList.Contains ("Item2")

Du kan også finde den faktiske indeksposition ved hjælp af 'IndexOf' -metoden. Du skal angive startindekset for søgningen (normalt 0). Returværdien er indekset for den første forekomst af den fundne vare. Du kan derefter bruge en loop til at ændre startpunktet til den næste indeksværdi for at finde yderligere forekomster, hvis der er flere dublerede værdier.

Hvis værdien ikke findes, returneres værdien -1

Dette eksempel demonstrerer brugen af ​​'Indeholder', elementet blev ikke fundet og sløjfe gennem arraylisten for at finde placeringen af ​​alle dublerede elementer:

1234567891011121314151617181920212223242526 Sub SearchListExample ()'Definer matrixliste og variablerDim MyList As New ArrayList, Sp As Integer, Pos As Integer'Tilføj nye varer, herunder et duplikatMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"'Test for "Item2" på listen - returnerer TrueMsgBox MyList.Contains ("Item2")'Få indeks for ikke -eksisterende værdi -returnerer -1MsgBox MyList.IndexOf ("element", 0)'Sæt startpositionen for søgningen til nulSp = 0'Skift igennem listen for at få alle positioner i' Item1 'Gør'Få indekspositionen for det næste' Item1 'baseret på positionen i variablen' Sp 'Pos = MyList.IndexOf ("Item1", Sp)'Hvis der ikke findes flere forekomster af' Item1 ', skal du forlade løkkenHvis Pos = -1 Så afslut Do'Vis den næste fundet forekomst og indekspositionenMsgBox MyList (Pos) & "at index" & Pos'Tilføj 1 til den sidst fundne indeksværdi - dette bliver nu den nye startposition for den næste søgningSp = Pos + 1SløjfeAfslut Sub

Bemærk, at den anvendte søgetekst er store og små bogstaver, og jokertegn accepteres ikke.

Indsættelse og fjernelse af emner

Hvis du ikke ønsker at tilføje dine varer til slutningen af ​​listen, kan du indsætte dem på en bestemt indeksposition, så det nye element er midt på listen. Indeksnumrene justeres automatisk for de efterfølgende poster.

123456789101112131415 Sub InsertExample ()‘Definer arraylisteobjektDim MyList som ny ArrayList'Føj elementer til matrixlisteMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"'Indsæt' Item6 'i indeksposition 2MyList.Insert 2, "Item6"'Skift gennem elementer i matrixlisten for at vise ny ordre og indekspositionFor N = 0 Til MyList.Count - 1MsgBox MyList (N) & "Indeks" & NNæste NAfslut Sub

I dette eksempel tilføjes 'Item6' til listen ved indeksposition 2, så 'item3', der var i indeksposition 2, flyttes nu til indeksposition 3

Et enkelt element kan fjernes ved hjælp af 'Fjern' -metoden.

1 MyList.Remove "Item"

Bemærk, at der ikke opstår en fejl, hvis varens navn ikke findes. Alle de efterfølgende indeksnumre ændres, så de passer til fjernelsen.

Hvis du kender varens indeksposition, kan du bruge metoden ‘RemoveAt’ f.eks.

1 MyList.RemoveAt 2

Bemærk, at hvis den angivne indeksposition er større end antallet af elementer i matrixlisten, returneres en fejl.

Du kan fjerne en række værdier fra listen ved hjælp af metoden 'RemoveRange'. Parametrene er startindekset og derefter antallet af emner, der skal fjernes f.eks.

1 MyList.RemoveRange 3, 2

Bemærk, at du får en fejl i din kode, hvis antallet af poster, der er forskudt fra startværdien, er større end antallet af elementer på matrixlisten.

I både 'RemoveAt' og 'RemoveRange' metoderne ville en vis kode være tilrådelig for at kontrollere, om de angivne indeksnumre er større end det samlede antal elementer i arraylisten for at fange eventuelle fejl. Egenskapen 'Count' angiver det samlede antal elementer på matrixlisten.

12345678910111213141516171819202122232425 Sub RemoveExample ()‘Definer arraylisteobjektDim MyList som ny ArrayList'Føj elementer til matrixlisteMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"MyList.Add "Item4"MyList.Add "Item5"'Indsæt' Item6 'i indeksposition 2MyList.Insert 2, "Item6"'Fjern' Item2 'MyList.Fjerne "Item2"'Fjern' element ' - dette findes ikke på matrixlisten, men fejler ikkeMyList.Remove "Item"'Fjern elementet ved indeksposition 2MyList.RemoveAt 2'Fjern 2 på hinanden følgende emner, der starter ved indeksposition 2MyList.RemoveRange 3, 2'Skift gennem arraylisten for at vise, hvad der er tilbage, og hvilken indeksposition den nu er iFor N = 0 Til MyList.Count - 1MsgBox MyList (N) & "Indeks" & NNæste NAfslut Sub

Bemærk, at hvis du bruger ‘RemoveAt’ til at fjerne et element på en bestemt position, så ændres alle de efterfølgende indekspositioner, så snart elementet er fjernet. Hvis du har flere fjernelser ved hjælp af indekspositionen, er det en god idé at starte med det højeste indeksnummer og gå baglæns ned til position nul, så du altid vil fjerne det korrekte element. På denne måde har du ikke problemet

Sortering af en matrixliste

En anden stor fordel i forhold til en samling er, at du kan sortere emnerne i stigende eller faldende rækkefølge.

Array List -objektet er det eneste objekt i Excel VBA med en sorteringsmetode. Sorteringsmetoden er meget hurtig, og dette kan være en vigtig overvejelse for at bruge en matrilliste.

I indsamlingsobjektet krævede man en 'out of the box' -tankegang for at sortere alle emnerne, men med en matrixliste er det meget enkelt.

'Sorter' -metoden sorterer i stigende rækkefølge, og metoden 'Omvendt' sorterer i faldende rækkefølge.

12345678910111213141516171819202122 Sub ArrayListExample ()'Opret Array List -objektDim MyList som ny ArrayList'Tilføj varer i en ikke-sorteret rækkefølgeMyList.Add "Item1"MyList.Add "Item3"MyList.Add "Item2"'Sorter elementerne i stigende rækkefølgeMyList.Sort'Skift gennem elementerne for at vise stigende rækkefølgeFor hver I In MyList'Vis varenavnMsgBox INæste jeg'Sorter varerne i faldende rækkefølgeMyList. Omvendt'Skift gennem elementerne for at vise faldende rækkefølgeFor hver I In MyList'Vis varenavnMsgBox INæste jegAfslut Sub

Kloning af en matrixliste

En matrixliste har mulighed for at oprette en klon eller kopi af sig selv. Dette er nyttigt, hvis en bruger foretager ændringer af elementerne ved hjælp af en frontend og din VBA -kode, men du skal beholde en kopi af elementerne i deres oprindelige tilstand som en backup.

Dette kan give brugeren en 'Fortryd' -funktion. De har muligvis foretaget ændringerne og ønsker at vende tilbage til den oprindelige liste.

123456789101112131415 Sub CloneExample ()'Definer to objekter - matrixliste og et objektDim MyList As New ArrayList, MyList1 As Object»Befolk det første objekt med genstandeMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"‘Kopiér Mylist til MyList1Indstil MyList1 = MyList.Clone'Iterér gennem MyList1 for at bevise kloningFor hver I I MyList1'Vis varenavnMsgBox INæste jegAfslut Sub

'MyList1' indeholder nu alle emnerne fra 'MyList' i samme rækkefølge

Kopiering af et liste -array til et konventionelt VBA -arrayobjekt

Du kan bruge en simpel metode til at kopiere matrixlisten til et normalt VBA -array:

123456789101112131415 Sub ArrayExample ()'Opret matrixlisteobjekt og et standard arrayobjektDim MyList As New ArrayList, NewArray As Variant'Befolk matrixliste med elementerMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"'Kopier matrixlisten til det nye arrayNewArray = MyList.ToArray'Iterér gennem det nye array - bemærk, at matrixlistetællingen giver det maksimale indeksFor N = 0 Til MyList.Count - 1'Vis varenavnMsgBox NewArray (N)Næste NAfslut Sub

Kopiering af en listeopstilling til et regnearksområde

Du kan kopiere din array -liste til et specifikt regneark og en cellereference uden at skulle gentage arraylisten. Du behøver kun at angive den første cellereference

123456789101112131415 Underområde Eksempel ()'Opret et nyt matrixlisteobjektDim MyList som ny ArrayList'Tilføj elementer til listenMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"'Ryd målarketArk ("Ark1"). UsedRange.Clear'Kopier elementer på tværs af en rækkeArk ("Ark1"). Område ("A1"). Tilpas størrelse (1, MyList.Count) .Value = MyList.toArray'Kopier elementer ned i en kolonneArk ("Ark1"). Område ("A5"). Tilpas størrelse (MyList.Count, 1) .Værdi = _WorksheetFunction.Transpose (MyList.toArray)Afslut Sub

Tøm alle elementer fra en matrilliste

Der er en enkel funktion (Clear) for at rydde arraylisten fuldstændigt

1234567891011121314 Sub ClearListExample ()'Opret matrixlisteobjektDim MyList som ny ArrayList'Tilføj nye varerMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"'Vis antal varerMsgBox MyList.Count'Ryd alle varerMyList.Clear'Vis antal varer for at bevise, at clear har virketMsgBox MyList.CountAfslut Sub

Dette eksempel opretter elementer i en matrixliste og rydder derefter matrixlisten. Meddelelsesbokse beviser før og efter antallet af elementer i matrixlisten.

Array List Methods Resume til Excel VBA

Opgave Parametre Eksempler
Tilføj / rediger element Værdi MyList.Tilføj "Item1"
MyList (4) = “Item2”
Klon en matrixliste Ingen Dim MyList som objekt
Indstil MyList2 = MyList.Clone
Kopiér til Array Ingen Dim MyArray som variant
MyArray = MyList.ToArray
Kopiér til et regnearksområde (række) Ingen Ark ("Ark1"). Område ("A1"). Tilpas størrelse (1, MyList.Count) .Value = MyList.ToArray
Kopiér til et regnearksområde (kolonne) Ingen Ark ("Ark1"). Område ("A3"). Tilpas størrelse (MyList.Count, 1) .Value = WorksheetFunction.Transpose (MyList.ToArray)
skab "System.Collections.ArrayList" Dim MyList som objekt
Indstil MyList = CreateObject (“System.Collections.ArrayList”)
Erklære Ikke relevant Dim MyList som objekt
Find / tjek, om varen findes Vare at finde MyList.Contains (“Item2”)
Find placeringen af ​​et element i ArrayList 1. Vare at finde. Dim IndexNo så længe
2. Position at starte søgningen fra. IndexNo = MyList.IndexOf (“Item3”, 0)
IndexNo = MyList.IndexOf (“Item5”, 3)
Få antal varer Ingen MsgBox MyList.Count
Indsæt element 1. Indeks - position at indsætte på. MyList.Insert 0, “Item5”
2 Værdi - objekt eller værdi, der skal indsættes. MyList.Insert 4, “Item7”
Læs element Indeks - langt heltal MsgBox MyList.Item (0)
MsgBox MyList.Item (4)
Læs element tilføjet sidst Indeks - langt heltal MsgBox MyList.Item (list.Count - 1)
Læs element tilføjet først Indeks - langt heltal MsgBox MyList.Item (0)
Læs alle emner (for hver) Ikke relevant Dim element Som variant
For hvert element i MyList
MsgBox element
Næste element
Læs alle emner (For) Indeks - langt heltal Dim i så længe
For i = 0 Til MyList.Count - 1
MsgBox i
Næste i
Fjern alle varer Ingen MyList.Clear
Fjern elementet på position Indeksposition, hvor varen er MyList.RemoveAt 5
Fjern element ved navn Elementet, der skal fjernes fra ArrayList MyList.Fjern "Item3"
Fjern en række elementer 1. Indeks - startposition. MyList.RemoveRange 4,3
2. Tæl - antallet af genstande, der skal fjernes.
Sorter i faldende rækkefølge Ingen MyList. Omvendt
Sorter i stigende rækkefølge Ikke MyList.Sort
wave wave wave wave wave