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 |