Az ArrayList objektum hasonló a Collection objektumhoz, de sokkal több módszerrel és tulajdonsággal rendelkezik, és ennélfogva sokkal rugalmasabb programozási szempontból.
Egy gyűjteményobjektumnak csak két módja van (Hozzáadás, Eltávolítás) és két tulajdonsága (Szám, Tétel), míg a Tömblistában még sok más. Ezenkívül a Collection objektum csak olvasható. Az értékek hozzáadása után az indexelt érték nem módosítható, míg a tömblistán a szerkesztés lehetséges.
Sok tömblista módszer paramétereket használ. Sok szabványos VBA módszerrel ellentétben ezen paraméterek egyike sem opcionális. Ezenkívül egyes módszerek és tulajdonságok nem mindig nagybetűsek, ha az Excel VBA -ban megadott módon adják meg őket. Azonban még mindig működnek.
Az ArrayList objektum kibővül és összehúzódik a méretétől függően, hogy hány elemet tartalmaz. Használat előtt nem kell méretezni, mint egy tömböt.
A tömblista egydimenziós (megegyezik a Gyűjtemény objektummal), az alapértelmezett adattípus pedig Változat, ami azt jelenti, hogy bármilyen típusú adatot elfogad, legyen az numerikus, szöveges vagy dátum.
A tömblista sok szempontból orvosolja a Collection objektum számos hiányosságát. Ez minden bizonnyal sokkal rugalmasabb abban, amit tehet.
A tömblista objektum nem része a szabványos VBA könyvtárnak. Késői vagy korai kötés használatával használhatja Excel VBA -kódjában
1234 | Sub LateBindingExample ()Dim MyList ObjectSet MyList = CreateObject ("System.Collections.ArrayList")End Sub |
123 | Sub EarlyBindingExample ()Dim MyList As New ArrayListEnd Sub |
A korai kötési példa használatához először be kell írnia egy hivatkozást a VBA -ban az „mscorlib.tlb” fájlra
Ezt az „Eszközök | Hivatkozások ’a Visual Basic Editor (VBE) ablakából. Megjelenik egy felugró ablak az összes elérhető hivatkozással. Görgessen le az „mscorlib.dll” mappához, és jelölje be a mellette lévő négyzetet. Kattintson az OK gombra, és ez a könyvtár most része a projektnek:
Egy tömblista objektum egyik nagy hátránya, hogy nem rendelkezik „Intellisense” -vel. Általában, ha egy objektumot használ a VBA-ban, például egy tartományt, megjelenik egy felugró lista az összes rendelkezésre álló tulajdonságról és módszerről. Ezt nem kapja meg egy tömblista objektummal, és néha alapos ellenőrzésre van szüksége, hogy megbizonyosodjon arról, hogy helyesen írta be a módszert vagy a tulajdonságot.
Továbbá, ha megnyomja az F2 billentyűt a VBE ablakban, és rákeres a „tömblistára”, akkor semmi sem fog megjelenni, ami nem túl hasznos a fejlesztők számára.
A kód lényegesen gyorsabban fog futni a korai kötéssel, mert minden előre le van fordítva. Késői kötés esetén az objektumot fordítani kell a kód futása közben
Tömblistát tartalmazó Excel -alkalmazás terjesztése
Amint már említettük, az ArrayList objektum nem része az Excel VBA -nak. Ez azt jelenti, hogy bármely kollégájának, akinek terjesztette az alkalmazást, hozzá kell férnie az „mscorlib.tlb” fájlhoz
Ez a fájl általában a következő helyen található:
C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319
Érdemes néhány kódot írni (a Dir módszerrel) annak ellenőrzésére, hogy ez a fájl létezik -e, amikor a felhasználó betölti az alkalmazást, hogy „puha leszállást” tapasztaljon, ha nem találja. Ha nincs jelen, és a kód fut, akkor hibák lépnek fel.
Ezenkívül a felhasználónak telepítenie kell a megfelelő .Net Framework verziót. Még akkor is, ha a felhasználónak van egy újabb verziója, a V3.5 -öt telepíteni kell, különben az alkalmazás nem fog működni
Egy tömblista objektum hatóköre
Hatókörét tekintve a Tömblista objektum csak akkor érhető el, ha a munkafüzet nyitva van. A munkafüzet mentésekor nem kerül mentésre. Ha a munkafüzetet újra megnyitja, akkor a tömblista objektumot újra kell létrehozni a VBA kód használatával.
Ha azt szeretné, hogy a tömblistája a kódmodul összes kódja számára elérhető legyen, akkor a tömblista objektumot deklarálnia kell a modul ablakának tetején található Nyilatkozat részben
Ez biztosítja, hogy a modulban lévő összes kódja hozzáférjen a tömblistához. Ha azt szeretné, hogy a munkafüzet bármely modulja hozzáférjen a tömblista objektumhoz, akkor határozza meg azt globális objektumként
1 | Globális MyCollection mint új ArrayList |
Kitöltés és olvasás a tömblistából
A legalapvetőbb művelet az, hogy létre kell hoznia egy tömblistát, bele kell helyeznie néhány adatot, majd be kell bizonyítania, hogy az adatok olvashatók. A cikkben szereplő összes kódpélda feltételezi, hogy korai kötést használ, és hozzáadta az „mscorlib.tlb” fájlt a VBA -hivatkozásokhoz, a fent leírtak szerint
123456789101112 | Sub ArrayListExample ()„Hozzon létre új tömblista -objektumotDim MyList As New ArrayList„Tételek hozzáadása a listáhozMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Ismételje meg a tömblistát az értékek bizonyításáhozN = 0 esetén a MyList.Count -hoz - 1MsgBox MyList (N)Következő N.End Sub |
Ez a példa egy új ArrayList objektumot hoz létre, 3 elemmel tölti fel, és az egyes elemeket megjelenítő listán iterál.
Ne feledje, hogy az ArrayList index 0 -tól kezdődik, nem 1 -től, ezért 1 -et kell kivonni a Count értékből
A „For… Each” ciklus segítségével az értékeket is kiolvashatja:
123456789101112 | Sub ArrayListExample ()„Hozzon létre új tömblista -objektumotDim MyList As New ArrayList„Tételek hozzáadása a listáhozMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Ismételje meg a tömblistát az értékek bizonyításáhozFor Every I In MyListMsgBox I.Következő énEnd Sub |
Elemek szerkesztése és módosítása tömblistában
A tömblista fő előnye a gyűjteménnyel szemben, hogy a lista elemei szerkeszthetők és módosíthatók a kódon belül. A Gyűjtemény objektum csak olvasható, míg a Tömblista objektum olvasható / írható
123456789101112131415 | Sub ArrayListExample ()„Hozzon létre új tömblista -objektumotDim MyList As New ArrayList„Tételek hozzáadása a listáhozMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Módosítsa az 1. tételt a„ 2. tételről ”a„ Megváltozott ”elemreMyList (1) = "Megváltozott"„Ismételje meg a tömblistát, hogy bebizonyítsa, a változás működöttFor Every I In MyList„Tétel megjelenítéseMsgBox I.Következő énEnd Sub |
Ebben a példában a második elem, az „Elem2” a „Megváltozott” értékre változik (ne feledje, hogy az index 0 -tól kezdődik). Ha az iterációt a kód végén futtatja, az új érték jelenik meg
Értéktömb hozzáadása tömblistához
Értékeket adhat meg a tömblistájához egy tömb használatával, amely ezen értékek listáját vagy hivatkozásokat tartalmaz a munkalap cella értékeire
123456789101112131415161718 | Sub AddArrayExample ()„Hozzon létre tömblista -objektumotDim MyList As New ArrayList„Iteráljon tömbértékeken keresztül, és adja hozzá őket a tömblistáhozMinden v In Array ("A1", "A2", "A3") esetén„Adja hozzá az egyes tömbértékeket a listáhozMyList.Add vKövetkező'Iteráljon tömbértékeken keresztül munkalap hivatkozásokkal, és adja hozzá őket a tömblistáhozMinden v In Array (tartomány ("A5"). Érték, tartomány ("A6"). Érték)MyList.Add vKövetkező„Ismételje meg a tömblistát az értékek bizonyításáhozN = 0 esetén a MyList.Count -hoz - 1„Listaelem megjelenítéseMsgBox MyList.Item (N)Következő N.End Sub |
Tételek sorának olvasása / lekérése tömblistából
A GetRange módszer használatával egy tömblistában megadhatja a lekérhető egymást követő elemek dühét. A két szükséges paraméter a kezdő index pozíciója és a lekérhető elemek száma. A kód egy második tömblista -objektumot tölt fel az elemek alkészletével, amelyek ezután külön olvashatók.
123456789101112131415161718 | Sub ReadRangeExample ()'Definiálja az objektumokatSaját lista új ArrayListként, MyList1 objektumként„Elemek hozzáadása a„ MyList ”objektumhozMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item6"MyList.Add "Item4"MyList.Add "Item7"„Rögzítsen 4 elemet a„ MyList ”-ben a 2. indexpozíciótól kezdveSet MyList1 = MyList.GetRange (2, 4)„Ismételje meg a„ MyList1 ”objektumot az elemek alkészletének megjelenítéséhezMinden I Saját listában1„Tétel megjelenítéseMsgBox I.Következő énEnd Sub |
Elemek keresése tömblistán belül
A „Tartalmaz” módszerrel tesztelheti, hogy egy megnevezett elem szerepel -e a listájában. Ez visszaadja az Igaz vagy hamis értéket
1 | MsgBox MyList.Contains ("2. tétel") |
Az index pozícióját az „IndexOf” módszerrel is megtalálhatja. Meg kell adnia a keresés kezdőindexét (általában 0). A visszatérési érték a talált elem első példányának indexe. Ezután egy ciklus segítségével megváltoztathatja a kezdőpontot a következő indexértékre, és további példányokat találhat, ha több ismétlődő érték van.
Ha az érték nem található, akkor -1 értéket ad vissza
Ez a példa azt mutatja be, hogy a „Tartalmaz” elemet használja, az elem nem található, és a tömblistában végiglapozva megkeresi az összes ismétlődő elem pozícióját:
1234567891011121314151617181920212223242526 | AlkeresőlistaPélda ()„Határozza meg a tömblistát és a változókatDim MyList As New ArrayList, Sp As Integer, Pos As Integer„Új elemek hozzáadása, beleértve az ismétlődéstMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"„Teszt, hogy a„ 2. tétel ”szerepel -e a listában - igaz értéket ad visszaMsgBox MyList.Contains ("2. tétel")„A nem létező érték indexének lekérése --1MsgBox MyList.IndexOf ("Tétel", 0)„Állítsa a keresés kezdő pozícióját nulláraSp = 0„Ismételje meg a listát, hogy megkapja az„ 1. tétel ”összes pozíciójátTedd„Szerezze meg a következő„ Item1 ”indexpozícióját az„ Sp ”változó pozíciója alapjánPoz = MyList.IndexOf ("Item1", Sp)„Ha nem talál további példányt az„ Item1 ”-ről, lépjen ki a ciklusbólHa Poz = -1, akkor lépjen ki„Jelenítse meg a következő talált példányt és az index pozíciójátMsgBox MyList (Pos) & "at index" & Pos„Adjon hozzá 1 -et az utoljára talált indexértékhez - ez lesz a következő keresés új kezdőpozíciójaSp = Pos + 1HurokEnd Sub |
Vegye figyelembe, hogy a keresési szöveg kis- és nagybetűket megkülönböztet, és a helyettesítő karakterek nem fogadhatók el.
Elemek behelyezése és eltávolítása
Ha nem kívánja hozzáadni az elemeket a lista végéhez, akkor illessze be őket egy adott index pozícióba úgy, hogy az új elem a lista közepén legyen. Az indexszámok automatikusan módosulnak a következő elemekhez.
123456789101112131415 | Sub InsertPélda ()„Definiálja a tömblista objektumotDim MyList As New ArrayList„Tételek hozzáadása a tömblistáhozMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"„Illessze be a„ 6. tételt ”az index 2. pozíciójábaMyList.Insert 2, "Item6"„Ismételje meg a tömblista elemeit az új sorrend és index pozíció megjelenítéséhezN = 0 esetén a MyList.Count -hoz - 1MsgBox MyList (N) & "Index" & NKövetkező N.End Sub |
Ebben a példában a „6. tétel” hozzáadódik a listához a 2. indexpozícióban, így az „3. tétel”, amely a 2. indexpozícióban volt, most a 3. index pozícióba kerül
Az egyes elemeket az „Eltávolítás” módszerrel lehet eltávolítani.
1 | MyList.Remove "Item" |
Ne feledje, hogy nem történik hiba, ha az elem neve nem található. Az ezt követő indexszámok az eltávolításnak megfelelően módosulnak.
Ha ismeri az elem indexpozícióját, használhatja az „RemoveAt” módszert, pl.
1 | MyList.RemoveAt 2 |
Vegye figyelembe, hogy ha a megadott indexpozíció nagyobb, mint a tömblistában szereplő elemek száma, akkor hibaüzenet jelenik meg.
Az „RemoveRange” módszerrel eltávolíthat egy értéktartományt a listából. A paraméterek a kiindulási index, majd az eltávolítandó elemek száma pl.
1 | MyList.RemoveRange 3, 2 |
Ne feledje, hogy hibaüzenetet kap a kódban, ha a kezdőértéktől eltolt elemek száma nagyobb, mint a tömblistában szereplő elemek száma.
Mind az „RemoveAt”, mind az „RemoveRange” módszereknél néhány kód tanácsos lenne ellenőrizni, hogy a megadott indexszámok nagyobbak -e, mint a tömblista összes eleme, hogy az esetleges hibákat befogják. A „Szám” tulajdonság megadja a tömblista összes elemét.
12345678910111213141516171819202122232425 | Sub RemoveExample ()„Definiálja a tömblista objektumotDim MyList As New ArrayList„Tételek hozzáadása a tömblistáhozMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"MyList.Add "Item4"MyList.Add "Item5"„Illessze be a„ 6. tételt ”az index 2. pozíciójábaMyList.Insert 2, "Item6"„Tétel 2 eltávolítása”MyList.Remove "Item2"„Elem eltávolítása” - ez nem létezik a tömblistában, de nem hibázikMyList.Remove "Item"„Távolítsa el az elemet az index 2. pozíciójábólMyList.RemoveAt 2„Távolítson el két egymást követő elemet a 2. indexpozíciótól kezdveMyList.RemoveRange 3, 2„Ismételje meg a tömblistát, hogy megmutassa, mi maradt, és milyen index pozícióban vanN = 0 esetén a MyList.Count -hoz - 1MsgBox MyList (N) & "Index" & NKövetkező N.End Sub |
Ne feledje, hogy ha az „RemoveAt” segítségével eltávolít egy elemet egy adott pozícióból, akkor amint az elemet eltávolítja, az összes későbbi indexpozíció megváltozik. Ha több eltávolítást végez az indexpozíció használatával, akkor jó ötlet a legmagasabb indexszámmal kezdeni, és visszalépni a nulla pozícióba, hogy mindig a megfelelő elemet távolítsa el. Ily módon nem lesz problémája
Tömblista rendezése
Egy másik nagy előnye a gyűjteményekkel szemben, hogy növekvő vagy csökkenő sorrendbe rendezheti az elemeket.
A tömblista objektum az egyetlen objektum az Excel VBA -ban, amely rendezési módszerrel rendelkezik. A rendezési módszer nagyon gyors, és ez fontos szempont lehet a tömblista használatánál.
A gyűjtőobjektumban némi „dobozon kívüli” gondolkodásra volt szükség az összes elem rendezéséhez, de tömblistával ez nagyon egyszerű.
A „Rendezés” módszer növekvő sorrendbe, a „Fordított” pedig csökkenő sorrendbe rendez.
12345678910111213141516171819202122 | Sub ArrayListExample ()„Hozzon létre tömblista objektumotDim MyList As New ArrayList„Tételek hozzáadása nem rendezett sorrendbenMyList.Add "Item1"MyList.Add "Item3"MyList.Add "Item2"'Rendezze az elemeket növekvő sorrendbeMyList.Rendezés„Ismételje meg a tételeket, hogy növekvő sorrendben jelenjen megFor Every I In MyList„Tétel megjelenítéseMsgBox I.Következő én'Rendezze az elemeket csökkenő sorrendbeMyList. Fordított„Ismételje meg a tételeket, hogy csökkenő sorrendet mutassonFor Every I In MyList„Elem nevének megjelenítéseMsgBox I.Következő énEnd Sub |
Tömblista klónozása
A tömblistában lehetőség van klón vagy másolat létrehozására. Ez akkor hasznos, ha a felhasználó módosítja az elemeket a kezelőfelület és a VBA -kód használatával, de meg kell őriznie az elemek másolatát az eredeti állapotukban biztonsági mentésként.
Ez a felhasználó számára biztosíthatja a „Visszavonás” funkciót. Lehet, hogy elvégezték a módosításokat, és vissza akarnak térni az eredeti listához.
123456789101112131415 | AlklónozásPélda ()„Határozzon meg két objektumot - tömblistát és egy objektumotSaját lista új ArrayListként, MyList1 objektumként„Töltse fel az első objektumot elemekkelMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Másolja a Mylistet a MyList1 -beSet MyList1 = MyList.Clone„Ismételje meg a MyList1 -et a klónozás bizonyításáhozMinden I Saját listában1„Tétel megjelenítéseMsgBox I.Következő énEnd Sub |
A „MyList1” most azonos sorrendben tartalmazza a „MyList” összes elemét
Lista tömb másolása hagyományos VBA tömb objektumba
Egy egyszerű módszerrel másolhatja a tömblistát egy normál VBA -tömbbe:
123456789101112131415 | AltömbPélda ()„Hozzon létre tömblista objektumot és egy szabványos tömbobjektumotDim MyList As New ArrayList, NewArray As Variant„Töltse fel a tömblistát elemekkelMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Másolja a tömblistát az új tömbbeNewArray = MyList.ToArray„Ismételje meg az új tömböt - vegye figyelembe, hogy a tömblista száma biztosítja a maximális indexetN = 0 esetén a MyList.Count -hoz - 1„Elem nevének megjelenítéseMsgBox NewArray (N)Következő N.End Sub |
Lista tömb másolása egy munkalaptartományba
A tömblistát másolhatja egy adott munkalapra és cellahivatkozásra anélkül, hogy ismételnie kellene a tömblistát. Csak az első cellahivatkozást kell megadnia
123456789101112131415 | AltartományPélda ()„Hozzon létre új tömblista -objektumotDim MyList As New ArrayList„Tételek hozzáadása a listáhozMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Törölje a céllapotTáblázatok ("Sheet1"). UsedRange.Clear„Elemek másolása sorbanTáblázatok ("Sheet1"). Tartomány ("A1"). Átméretezés (1, MyList.Count) .Value = MyList.toArray„Másolja le az elemeket egy oszlopbaTáblázatok ("Sheet1"). Tartomány ("A5"). Átméretezés (MyList.Count, 1). Value = _WorksheetFunction.Transpose (MyList.toArray)End Sub |
Minden elem kiürítése egy tömblistából
A tömblista teljes törléséhez van egy egyszerű funkció (Törlés)
1234567891011121314 | Clear ClearListExample ()„Hozzon létre tömblista objektumotDim MyList As New ArrayList'Új elemek hozzáadásaMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"„Mutassa meg az elemek számátMsgBox MyList.Count'Törölje az összes elemetSajátLista„Mutassa meg a tételek számát annak bizonyítására, hogy a világos működöttMsgBox MyList.CountEnd Sub |
Ez a példa elemeket hoz létre a tömblistában, majd törli a tömblistát. Az üzenetdobozok a tömblista elemeinek száma előtt és után bizonyítják.
Tömblista módszerek összegzése az Excel VBA számára
Feladat | Paraméterek | Példák |
Elem hozzáadása / szerkesztése | Érték | MyList.Add „Item1” |
Saját lista (4) = “2. tétel” | ||
Tömblista klónozása | Egyik sem | Dim MyList Object |
Állítsa be a MyList2 = MyList.Clone beállítást | ||
Másolás a tömbbe | Egyik sem | Dim MyArray mint változat |
MyArray = MyList.ToArray | ||
Másolás egy munkalaptartományba (sor) | Egyik sem | Táblázatok („Sheet1”). Tartomány („A1”). Átméretezés (1, MyList.Count) .Value = MyList.ToArray |
Másolás a munkalap tartományába (oszlop) | Egyik sem | Táblázatok („Sheet1”). Tartomány („A3”). Átméretezés (MyList.Count, 1). Value = WorksheetFunction.Transpose (MyList.ToArray) |
Teremt | "System.Collections.ArrayList" | Dim MyList Object |
Set MyList = CreateObject („System.Collections.ArrayList”) | ||
Kijelent | N/A | Dim MyList Object |
Keresse meg / ellenőrizze, hogy létezik -e elem | Keresendő elem | MyList.Contains („2. tétel”) |
Keresse meg az elem pozícióját az ArrayListben | 1. Keresendő tétel. | Dim Index No No Long |
2. Pozíció a keresés megkezdéséhez. | IndexNo = MyList.IndexOf („3. tétel”, 0) | |
IndexNo = MyList.IndexOf („5. tétel”, 3) | ||
Szerezze be az elemek számát | Egyik sem | MsgBox MyList.Count |
Elem beszúrása | 1. Index - beillesztési pozíció. | MyList.Insert 0, „5. tétel” |
2 Érték - beszúrandó objektum vagy érték. | MyList. 4. beillesztés, „7. tétel” | |
Tétel olvasása | Index - hosszú egész szám | MsgBox MyList.Item (0) |
MsgBox MyList.Item (4) | ||
Utoljára hozzáadott elem olvasása | Index - hosszú egész szám | MsgBox MyList.Item (list.Count - 1) |
Először olvassa el a hozzáadott elemet | Index - hosszú egész szám | MsgBox MyList.Item (0) |
Az összes elem elolvasása (mindegyikhez) | N/A | Dim elem mint változat |
A MyList minden eleméhez | ||
MsgBox elem | ||
Következő elem | ||
Az összes elem elolvasása (For) | Index - hosszú egész szám | Dim i As Long |
Az i = 0 esetén a Saját listához. Szám - 1 | ||
MsgBox i | ||
Következő i | ||
Távolítsa el az összes elemet | Egyik sem | SajátLista |
Távolítsa el az elemet a pozícióból | Indexelje a pozíciót, ahol az elem található | MyList.RemoveAt 5 |
Elem eltávolítása név szerint | Az ArrayList -ből eltávolítandó elem | Saját lista. Távolítsa el a „3. tételt” |
Távolítson el egy sor elemet | 1. Index - kiinduló helyzet. | MyList.RemoveRange 4,3 |
2. Számlálás - az eltávolítandó elemek száma. | ||
Rendezés csökkenő sorrendben | Egyik sem | MyList. Fordított |
Rendezés növekvő sorrendben | Nem | MyList.Rendezés |