Zbirke Excel VBA

Zbirka je objekt koji sadrži brojne slične stavke. Njima se lako može pristupiti i njima se može manipulirati, čak i ako se u zbirci nalazi veliki broj predmeta.

Već postoje ugrađene zbirke s Excelom VBA. Primjer je zbirka Sheets. Za svaki radni list u radnoj knjizi postoji stavka u zbirci Sheets.

Ugrađene zbirke imaju daleko više dostupnih svojstava i metoda, ali one nisu dostupne u vašim vlastitim zbirkama koje sami stvarate.

Na primjer, zbirku možete koristiti za dobivanje informacija o određenom radnom listu. Na primjer, možete vidjeti naziv radnog lista te je li vidljiv ili ne. Korištenjem petlje Za svaku, možete proći kroz svaki radni list u zbirci.

1234567 Radni listovi za podtestove ()Dim Sh As Radni listZa svaki Sh In SheetsMsgBox Sh.NameMsgBox Sh.VisibleSljedeći ShKraj podm

Također se možete obratiti određenom radnom listu u zbirci koristeći vrijednost indeksa ili stvarni naziv radnog lista:

12 MsgBox listovi (1). NazivMsgBox listovi ("List1"). Naziv

Kako se radni listovi dodaju ili brišu, tako se zbirka Tablica povećava ili smanjuje u veličini.

Imajte na umu da kod VBA zbirki broj indeksa počinje s 1, a ne s 0

Zbirke u odnosu na nizove

Nizovi i zbirke slični su po svojim funkcijama po tome što su obje metodologije koje omogućuju pohranu velike količine podataka na koje se zatim može lako uputiti pomoću koda. Međutim, oni imaju niz razlika u načinu rada:

  1. Nizovi su višedimenzionalni, dok su zbirke samo jedne dimenzije. Možete dimenzionirati niz s nekoliko dimenzija, npr.
1 Dim MyArray (10, 2) kao niz

Time se stvara niz od 10 redaka s 2 stupca, gotovo poput radnog lista. Zbirka je zapravo jedan stupac. Niz je koristan ako trebate pohraniti brojne stavke podataka koje se međusobno odnose, npr. ime i adresu. Naziv bi bio u prvoj dimenziji niza, a adresa u drugoj dimenziji.

  1. Kada popunite svoj niz, potreban vam je zasebni redak koda da biste unijeli vrijednost u svaki element niza. Da imate dvodimenzionalni niz, zapravo bi vam trebala 2 retka koda - jedan redak za adresiranje prvog stupca i jedan redak za adresiranje drugog stupca. S objektom Zbirka jednostavno koristite metodu Dodaj tako da se nova stavka samo dodaje u zbirku, a vrijednost indeksa automatski prilagođava.
  2. Ako trebate izbrisati stavku podataka, to je složenije u nizu. Vrijednosti elementa možete postaviti na praznu vrijednost, ali sam element i dalje postoji unutar niza. Ako za ponavljanje kroz niz koristite petlju For Next, petlja će vratiti praznu vrijednost, što će zahtijevati kodiranje kako bi se osiguralo da se prazna vrijednost zanemaruje. U zbirci koristite metode Dodaj ili Ukloni, a za sve indeksiranje i promjenu veličine automatski se brine. Uklonjena stavka potpuno nestaje. Nizovi su korisni za fiksnu veličinu podataka, ali zbirke su bolje za mjesta gdje se količina podataka može promijeniti.
  3. Zbirke su samo za čitanje, dok se vrijednosti polja mogu promijeniti pomoću VBA. S zbirkom biste morali prvo ukloniti vrijednost koju želite promijeniti, a zatim dodati novu promijenjenu vrijednost.
  4. U nizu možete koristiti samo jednu vrstu podataka za elemente koji se postavljaju pri dimenzioniranju niza. Međutim, u nizu možete koristiti prilagođene vrste podataka koje ste sami osmislili. Mogli biste imati vrlo kompliciranu strukturu polja koristeći prilagođeni tip podataka koji zauzvrat ima nekoliko prilagođenih vrsta podataka. U zbirku možete dodati korisničke vrste podataka za svaku stavku. Mogli biste imati numeričku vrijednost, datum ili niz - objekt zbirke će uzeti bilo koju vrstu podataka. Ako pokušate unijeti vrijednost niza u niz koji je dimenzioniran kao numerički, to će proizvesti poruku o pogrešci.
  5. Zbirke su općenito lakše koristiti od niza. U smislu kodiranja, kada kreirate objekt zbirke, on ima samo dvije metode (dodavanje i uklanjanje) i dva svojstva (brojanje i stavka), pa objekt nije kompliciran za programiranje.
  6. Zbirke mogu koristiti ključeve za lociranje podataka. Nizovi nemaju tu funkciju i zahtijevaju petlju koda za ponavljanje kroz niz radi pronalaženja određenih vrijednosti.
  7. Veličinu niza potrebno je definirati pri prvom stvaranju. Morate imati predodžbu o tome koliko će podataka pohraniti. Ako trebate povećati veličinu niza, možete upotrijebiti 'ReDim' za njegovu ponovnu veličinu, ali morate upotrijebiti ključnu riječ 'Očuvaj' ako ne želite izgubiti podatke koji se već drže u polju. Veličinu zbirke nije potrebno definirati. Samo raste i automatski se smanjuje kako se stavke dodaju ili uklanjaju.

Opseg objekta zbirke

Što se tiče opsega, objekt zbirke dostupan je samo dok je radna knjiga otvorena. Ne sprema se kada se spremi radna knjiga. Ako se radna knjiga ponovno otvori, zbirku je potrebno ponovno stvoriti pomoću VBA koda.

Ako želite da vaša zbirka bude dostupna cijelom kodu u vašem kodnom modulu, tada morate deklarirati objekt zbirke u odjeljku Declare na vrhu prozora modula

To će osigurati da sav vaš kôd unutar tog modula može pristupiti zbirci. Ako želite da bilo koji modul u vašoj radnoj knjizi pristupa zbirci, definirajte je kao globalni objekt

1 Globalna zbirka MyCollection kao nova zbirka

Stvaranje zbirke, dodavanje stavki i pristup stavkama

Jednostavan objekt zbirke može se stvoriti u VBA pomoću sljedećeg koda:

123456 Sub CreateCollection ()Dim MyCollection kao nova kolekcijaMyCollection.Add "Item1"MyCollection.Add "Item2"MyCollection.Add "Item3"Kraj podm

Kôd dimenzionira novi objekt pod nazivom "MyCollection", a zatim sljedeći retci koda koriste metodu Add za dodavanje 3 nove vrijednosti.

Zatim možete koristiti kôd za ponavljanje zbirke za pristup vrijednostima

123 Za svaku stavku u zbirci MyCollectionStavka msgBoxSljedeća stavka

Također možete ponavljati svoju zbirku pomoću For For Loop:

123 Za n = 1 Za MyCollection.CountMsgBox MyCollection (n)Dalje n

Kôd dobiva veličinu zbirke pomoću svojstva Count, a zatim koristi ovu početnu vrijednost 1 za indeksiranje svake stavke

For Every Loop je brži od For Next petlje, ali radi samo u jednom smjeru (od niskog indeksa do visokog). Petlja For Next ima prednost što možete koristiti drugačiji smjer (od visokog indeksa do niskog), a također možete koristiti i metodu Step za promjenu prirasta. Ovo je korisno kada želite izbrisati nekoliko stavki jer ćete brisanje morati pokrenuti od kraja zbirke do početka jer će se indeks mijenjati kako se brisanja događaju.

Metoda Dodavanje u zbirci ima 3 izborna parametra - Ključ, Prije i Nakon

Pomoću parametara ‘Prije’ i ‘Poslije’ možete definirati položaj svoje nove stavke u odnosu na ostale koji su već u zbirci

To se postiže navođenjem broja indeksa za koji želite da vaša nova stavka bude relativna.

123456 Sub CreateCollection ()Dim MyCollection kao nova kolekcijaMyCollection.Add "Item1"MyCollection.Add "Item2",, 1MyCollection.Add "Item3"Kraj podm

U ovom primjeru "Stavka2" je specificirano za dodavanje prije prve indeksirane stavke u zbirci (koja je "Stavka1"). Prilikom ponovnog kretanja kroz ovu zbirku pojavit će se prije svega "Stavka2", a zatim "Stavka1" i "Stavka3"

Kad navedete parametre "Prije" ili "Nakon", vrijednost indeksa automatski se prilagođava unutar zbirke tako da "Stavka2" postaje vrijednost indeksa 1, a "Stavka1" premještena na vrijednost indeksa 2

Također možete upotrijebiti parametar "ključ" za dodavanje referentne vrijednosti koju možete koristiti za identifikaciju stavke zbirke. Imajte na umu da vrijednost ključa mora biti niz i mora biti jedinstvena unutar zbirke.

1234567 Sub CreateCollection ()Dim MyCollection kao nova kolekcijaMyCollection.Add "Item1"MyCollection.Add "Item2", "MyKey"MyCollection.Add "Item3"MsgBox MyCollection ("MyKey")Kraj podm

Stavka "Stavka 2" dobila je vrijednost "Ključ" od "MyKey" tako da se možete pozivati ​​na tu stavku koristeći vrijednost "MyKey" umjesto broja indeksa (2)

Imajte na umu da vrijednost "Ključ" mora biti vrijednost niza. To ne može biti bilo koja druga vrsta podataka. Imajte na umu da je zbirka samo za čitanje i da ne možete ažurirati vrijednost ključa nakon što je postavljena. Također, ne možete provjeriti postoji li vrijednost ključa za određenu stavku u zbirci niti pregledati vrijednost ključa što je pomalo nedostatak.

Parametar ‘Key’ ima dodatnu prednost što vaš kôd čini čitljivijim, osobito ako se predaje kolegi na podršku, a ne morate ponavljati cijelu zbirku da biste pronašli tu vrijednost. Zamislite da imate zbirku od 10.000 predmeta koliko bi bilo teško uputiti se na jednu određenu stavku!

Uklanjanje stavke iz zbirke

Za brisanje stavki iz zbirke možete koristiti metodu ‘Ukloni’.

1 MyCollection.Remove (2)

Nažalost, nije lako ako zbirka ima veliki broj stavki za izračun indeksa stavke koju želite izbrisati. Ovdje parametar ‘Key’ dobro dođe pri stvaranju zbirke

1 MyCollection.Remove ("MyKey")

Kad se stavka ukloni iz zbirke, vrijednosti indeksa automatski se poništavaju cijelom zbirkom. Ovdje je parametar "ključ" toliko koristan kada brišete nekoliko stavki odjednom. Na primjer, mogli biste izbrisati indeks stavke 105 i odmah indeks stavke 106 postaje indeks 105, a vrijednost indeksa svega iznad ove stavke pomaknuta je prema dolje. Ako koristite parametar Key, ne morate brinuti koja vrijednost indeksa treba biti uklonjena.

Da biste izbrisali sve stavke zbirke i stvorili novu zbirku, ponovno koristite izraz Dim koji stvara praznu zbirku.

1 Dim MyCollection kao nova kolekcija

Da biste potpuno uklonili stvarni objekt zbirke, možete postaviti objekt na ništa

1 Postavi MyCollection = Ništa

To je korisno ako vaš kôd zbirku više ne zahtijeva. Postavljanje objekta zbirke na ništa uklanja sve reference na njega i oslobađa memoriju koju je koristio. To može imati važne posljedice na brzinu izvršavanja vašeg koda, ako veliki objekt sjedi u memoriji koji više nije potreban.

Izbrojite broj predmeta u zbirci

Broj stavki u vašoj zbirci možete jednostavno saznati pomoću svojstva "Broj"

1 MsgBox MyCollection.Count

Ovo biste svojstvo upotrijebili da koristite For Next Loop za ponavljanje kroz zbirku jer će vam pružiti gornju granicu za broj indeksa.

Zbirka testova za određenu vrijednost

Možete ponavljati zbirku da biste potražili određenu vrijednost za stavku pomoću petlje Za svaku petlju

123456789101112 Sub SearchCollection ()Dim MyCollection kao nova kolekcijaMyCollection.Add "Item1"MyCollection.Add "Item2"MyCollection.Add "Item3"Za svaku stavku u zbirci MyCollectionAko je Item = "Item2" TadaStavka MsgBox & "Pronađeno"Završi akoSljedećiKraj podm

Kôd stvara malu zbirku, a zatim ponavlja kroz nju tražeći stavku pod nazivom "item2". Ako se pronađe, prikazuje okvir s porukom da je pronašao određenu stavku

Jedan od nedostataka ove metodologije je što ne možete pristupiti vrijednosti indeksa ili vrijednosti ključa

Ako umjesto toga koristite For Next Loop, možete upotrijebiti brojač For Next za dobivanje vrijednosti indeksa, iako još uvijek ne možete dobiti vrijednost "Key"

123456789101112 Sub SearchCollection ()Dim MyCollection kao nova kolekcijaMyCollection.Add "Item1"MyCollection.Add "Item2"MyCollection.Add "Item3"Za n = 1 Za MyCollection.CountAko je MyCollection.Item (n) = "Item2" ZatimMsgBox MyCollection.Item (n) & "pronađeno na poziciji indeksa" & nZavrši akoDalje nKraj podm

Brojač Za sljedeće (n) osigurat će položaj indeksa

Sortiranje zbirke

Ne postoji ugrađena funkcija za razvrstavanje zbirki, ali pomoću nekog "out of the box" razmišljanja kôd se može napisati za sortiranje pomoću Excel-ove funkcije razvrstavanja radnog lista. Ovaj kôd koristi prazan radni list pod nazivom "SortSheet" za stvarno sortiranje.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 Sub SortCollection ()Dim MyCollection kao nova kolekcijaDim Counter As Long'Izgradite zbirku nasumičnim stavkama narudžbeMyCollection.Add "Item5"MyCollection.Add "Item2"MyCollection.Add "Item4"MyCollection.Add "Item1"MyCollection.Add "Item3"‘Snimite broj stavki u zbirci za buduću uporabuBrojač = MyCollection.Count„Ponavljajte kroz zbirku kopirajući svaku stavku u uzastopnu ćeliju na„ SortSheet “(stupac A)Za n = 1 Za MyCollection.CountListovi ("SortSheet"). Ćelije (n, 1) = MyCollection (n)Dalje n'Aktivirajte tablicu za sortiranje i upotrijebite Excel rutinu sortiranja za sortiranje podataka u rastućem redoslijeduTablice ("SortSheet"). AktivirajteRaspon ("A1: A" & MyCollection.Count). OdaberiteActiveWorkbook.Worksheets ("SortSheet"). Sort.SortFields.ClearActiveWorkbook.Worksheets ("Sortiraj list"). Sortiraj.SortFields.Add2 ključ: = Raspon (_"A1: A5"), SortOn: = xlSortOnValues, Redoslijed: = xlAscending, DataOption: = _xlSortNormalS ActiveWorkbook.Worksheets ("SortSheet"). Sortiraj.Raspon raspona ("A1: A5").Header = xlPogađanje.MatchCase = Netačno.Orijentacija = xlTopToBottom.SortMethod = xlPinYin.Prijavi seZavrši s‘Izbrišite sve stavke u zbirci - imajte na umu da se ova For Next Loop izvodi obrnutim redoslijedomZa n = MyCollection.Obratite do 1 koraka -1MyCollection.Remove (n)Dalje n'Kopirajte vrijednosti ćelije natrag u prazan objekt prikupljanja pomoću pohranjene vrijednosti (Brojač) za' petlju 'Za n = 1 Za odbrojavanjeMyCollection.Add Sheets ("SortSheet"). Cells (n, 1) .VrijednostDalje n'Ponovite zbirku kako biste dokazali redoslijed u kojem se sada nalaze artikliZa svaku stavku u zbirci MyCollectionStavka msgBoxSljedeća stavka‘Očistite radni list (sortsheet) - ako je potrebno, izbrišite i njegaListovi ("SortSheet"). Raspon (ćelije (1, 1), ćelije (brojač, 1)). ObrišiKraj podm

Ovaj kôd najprije stvara zbirku s stavkama dodanim nasumičnim redoslijedom. Zatim ih kopira u prvi stupac na radnom listu (SortSheet).

Code zatim koristi funkciju sortiranja programa Excel za sortiranje podataka u stupcu u rastućem redoslijedu. Kôd se također može promijeniti tako da se sortira prema opadajućem redoslijedu.

Zbirka se zatim isprazni iz podataka pomoću For Next Loop. Imajte na umu da se korak opcija koristi tako da se briše od kraja zbirke do početka. To je zato što se tijekom brisanja vrijednosti indeksa resetiraju, ako se očisti od početka, ne bi se očistio ispravno (indeks 2 postao bi indeks 1)

Konačno, pomoću druge For Next Loop, vrijednosti stavki se prenose natrag u praznu zbirku

Daljnja za svaku petlju dokazuje da je zbirka sada u dobrom uzlaznom redoslijedu.

Nažalost, ovo se ne odnosi na vrijednosti ključa koje su možda izvorno unesene, budući da se vrijednosti ključa ne mogu čitati

Prosljeđivanje zbirke pod -funkciji

Zbirka se može proslijediti pod -funkciji na isti način kao i bilo koji drugi parametar

1 Funkcija MyFunction (ByRef MyCollection kao zbirka)

Važno je proslijediti zbirku koristeći 'ByRef'. To znači da se koristi izvorna zbirka. Ako se zbirka prosljeđuje pomoću 'ByVal -a', tada se stvara kopija zbirke koja može imati nesretne posljedice

Ako se kopija stvori pomoću "ByVal -a", sve što mijenja zbirku unutar funkcije događa se samo na kopiji, a ne i na izvorniku. Na primjer, ako je unutar funkcije nova stavka dodana u zbirku, to se neće pojaviti u izvornoj zbirci, što će stvoriti grešku u vašem kodu.

Vraćanje zbirke iz funkcije

Zbirku možete vratiti iz funkcije na isti način kao i bilo koji objekt. Morate koristiti ključnu riječ Set

12345 Sub ReturnFromFunction ()Dim MyCollection As CollectionPostavi MyCollection = PopulateCollectionMsgBox MyCollection.CountKraj podm

Ovaj kôd stvara potprogram koji stvara objekt pod nazivom "MyCollection", a zatim koristi ključnu riječ "Set" za učinkovito pozivanje funkcije za popunjavanje te zbirke. Nakon što to učinite, prikazuje se okvir s porukom koji prikazuje broj od 2 stavke

1234567 Funkcija PopulateCollection () kao zbirkaDim MyCollection kao nova kolekcijaMyCollection.Add "Item1"MyCollection.Add "Item2"Postavi PopulateCollection = Moja zbirkaZavršna funkcija

Funkcija PopulateCollection stvara novi objekt zbirke i popunjava ga s 2 stavke. Zatim prosljeđuje ovaj objekt natrag u objekt prikupljanja kreiran u izvornoj podrutini.

Pretvaranje zbirke u niz

Možda ćete svoju zbirku htjeti pretvoriti u niz. Možda ćete htjeti pohraniti podatke na kojima se mogu mijenjati i manipulirati njima. Ovaj kôd stvara malu zbirku, a zatim je prenosi u niz

Uočite da indeks zbirke počinje s 1, dok indeks niza počinje s 0. Dok zbirka ima 3 stavke, niz je potrebno dimenzionirati samo na 2 jer postoji element 0

1234567891011121314151617 Sub ConvertCollectionToArray ()Dim MyCollection kao nova kolekcijaDim MyArray (2) Kao nizMyCollection.Add "Item1"MyCollection.Add "Item2"MyCollection.Add "Item3"Za n = 1 Za MyCollection.CountMyArray (n - 1) = MyCollection (n)Dalje nZa n = 0 do 2MsgBox MyArray (n)Dalje nKraj podm

Pretvaranje niza u zbirku

Možda biste željeli pretvoriti niz u zbirku. Na primjer, možda ćete htjeti pristupiti podacima na brži i elegantniji način pomoću koda za dobivanje elementa niza.

Imajte na umu da će ovo funkcionirati samo za jednu dimenziju niza jer zbirka ima samo jednu dimenziju

123456789101112131415 Sub ConvertArrayIntoCollection ()Dim MyCollection kao nova kolekcijaDim MyArray (2) Kao nizMyArray (0) = "item1"MyArray (1) = "Stavka 2"MyArray (2) = "Stavka 3"Za n = 0 do 2MyCollection.Add MyArray (n)Dalje nZa svaku stavku u zbirci MyCollectionStavka msgBoxSljedeća stavkaKraj podm

Ako ste ipak htjeli koristiti višedimenzionalni niz, mogli biste zajedno spojiti vrijednosti niza za svaki redak unutar niza pomoću znaka razdjelnika između dimenzija niza, tako da pri čitanju vrijednosti zbirke možete programski koristiti znak razgraničenja za izdvojiti vrijednosti.

Također možete premjestiti podatke u zbirku na temelju toga što se dodaje vrijednost prve dimenzije (indeks 1), a zatim se dodaje vrijednost sljedeće dimenzije (indeks 2) itd.

Da niz ima, recimo, 4 dimenzije, svaka četvrta vrijednost u zbirci bila bi novi skup vrijednosti.

Također biste mogli dodati vrijednosti niza koje ćete koristiti kao ključeve (pod uvjetom da su jedinstveni) što bi dodalo jednostavan način lociranja određenih podataka.

Vi ćete pomoći u razvoju web stranice, dijeljenje stranicu sa svojim prijateljima

wave wave wave wave wave