VBA ArrayList

Tartalomjegyzék

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

Segít a fejlesztés a helyszínen, megosztva az oldalt a barátaiddal

wave wave wave wave wave