Excel VBA kolekcijas

Kolekcija ir objekts, kurā glabājas vairāki līdzīgi priekšmeti. Tiem var viegli piekļūt un ar tiem manipulēt, pat ja kolekcijā ir liels skaits priekšmetu.

Ar Excel VBA jau ir iebūvētas kolekcijas. Piemērs ir Sheets kolekcija. Katrai darbgrāmatas darblapai ir vienums izklājlapu kolekcijā.

Iebūvētajām kolekcijām ir pieejams daudz vairāk īpašību un metožu, taču tās nav pieejamas jūsu izveidotajās kolekcijās.

Piemēram, jūs varat izmantot kolekciju, lai iegūtu informāciju par konkrētu darblapu. Piemēram, jūs varat redzēt darblapas nosaukumu un arī to, vai tā ir redzama vai nē. Izmantojot cilpu Katrai cilpai, varat atkārtot katru kolekcijas darblapu.

1234567 Apakštesta darba lapas ()Dim Sh kā darblapaPar katru Sh In SheetsMsgBox Sh.NameMsgBox Sh.VisibleNākamais ŠBeigu apakš

Varat arī adresēt konkrētu kolekcijas darblapu, izmantojot indeksa vērtību vai darblapas faktisko nosaukumu:

12 MsgBox Sheets (1). NosaukumsMsgBox Sheets ("Sheet1"). Nosaukums

Pievienojot vai dzēšot darblapas, izklājlapu kolekcija palielinās vai samazinās.

Ņemiet vērā, ka ar VBA kolekcijām indeksa numurs sākas ar 1, nevis ar 0

Kolekcijas pret masīviem

Masīvu un kolekciju funkcijas ir līdzīgas, jo tās abas ir metodes, kas ļauj uzglabāt lielu datu apjomu, uz kuru pēc tam var viegli atsaukties, izmantojot kodu. Tomēr tiem ir vairākas atšķirības to darbībā:

  1. Masīvi ir daudzdimensionāli, turpretī kolekcijas ir tikai viena dimensija. Jūs varat izmērīt masīvu ar vairākām dimensijām, piem.
1 Dim MyArray (10, 2) kā virkne

Tādējādi tiek izveidots 10 rindu masīvs ar 2 kolonnām, gandrīz kā darblapa. Kolekcija faktiski ir viena kolonna. Masīvs ir noderīgs, ja jums ir jāsaglabā vairāki datu elementi, kas attiecas viens uz otru, piem. vārds un adrese. Nosaukums būtu masīva pirmajā dimensijā un adrese otrajā dimensijā.

  1. Aizpildot masīvu, jums ir nepieciešama atsevišķa koda rinda, lai katrā masīva elementā ievietotu vērtību. Ja jums būtu divdimensiju masīvs, jums faktiski būtu vajadzīgas 2 koda rindas - viena rinda, lai adresētu pirmo kolonnu, un viena rinda, lai adresētu otro kolonnu. Izmantojot kolekcijas objektu, jūs vienkārši izmantojat pievienošanas metodi, lai jaunais vienums tikko tiktu pievienots kolekcijai un indeksa vērtība tiktu automātiski pielāgota atbilstoši.
  2. Ja jums ir jāizdzēš datu vienums, tad masīvā tas ir sarežģītāk. Jūs varat iestatīt elementa vērtības uz tukšu vērtību, bet pats elements joprojām pastāv masīvā. Ja jūs izmantojat cilni Nākotne, lai atkārtotu masīvu, cilpa atgriež tukšu vērtību, kurai būs nepieciešama kodēšana, lai pārliecinātos, ka tukšā vērtība tiek ignorēta. Kolekcijā tiek izmantotas metodes Pievienot vai Noņemt, un par visu indeksēšanu un izmēru maiņu tiek automātiski atbildēts. Noņemtais vienums pilnībā pazūd. Masīvi ir noderīgi noteikta lieluma datiem, bet kolekcijas ir labākas vietās, kur datu daudzums var mainīties.
  3. Kolekcijas ir tikai lasāmas, turpretī masīva vērtības var mainīt, izmantojot VBA. Izmantojot kolekciju, vispirms jānoņem maināmā vērtība un pēc tam jāpievieno jaunā mainītā vērtība.
  4. Masīvā elementiem varat izmantot tikai vienu datu tipu, kas tiek iestatīts, veicot masīva dimensiju. Tomēr masīvā varat izmantot pielāgotus datu veidus, kurus esat izstrādājis pats. Jums varētu būt ļoti sarežģīta masīva struktūra, izmantojot pielāgotu datu tipu, kam savukārt ir vairāki pielāgoti datu tipi. Kolekcijā katram vienumam varat pievienot lietošanas datu veidus. Jums var būt skaitliska vērtība, datums vai virkne - savākšanas objekts ņems jebkāda veida datus. Ja jūs mēģinātu ievietot virknes vērtību masīvā, kas tika klasificēts kā skaitlisks, tas parādītu kļūdas ziņojumu.
  5. Kolekcijas parasti ir vieglāk izmantot nekā masīvus. Kodēšanas ziņā, veidojot kolekcijas objektu, tam ir tikai divas metodes (pievienot un noņemt) un divi rekvizīti (skaits un vienums), tāpēc objekts nekādā ziņā nav sarežģīts programmēšanā.
  6. Kolekcijas var izmantot atslēgas, lai atrastu datus. Masīviem nav šīs funkcijas, un, lai atrastu noteiktas vērtības, masīvam ir jāatkārto kodēšanas kods.
  7. Masīva lielums ir jānosaka, kad tas pirmo reizi tiek izveidots. Jums ir jābūt priekšstatam par to, cik daudz datu tas glabās. Ja jums ir jāpalielina masīva izmērs, varat izmantot “ReDim”, lai to mainītu, bet jums ir jāizmanto atslēgvārds “Saglabāt”, ja nevēlaties zaudēt masīvā jau esošos datus. Kolekcijas lielums nav jānosaka. Tas vienkārši aug un sarūk automātiski, pievienojot vai noņemot vienumus.

Kolekcijas objekta darbības joma

Apjoma ziņā kolekcijas objekts ir pieejams tikai tad, kad darbgrāmata ir atvērta. Saglabājot darbgrāmatu, tā netiek saglabāta. Ja darbgrāmata tiek atkārtoti atvērta, kolekcija ir jāizveido atkārtoti, izmantojot VBA kodu.

Ja vēlaties, lai jūsu kolekcija būtu pieejama visiem kodiem jūsu koda modulī, kolekcijas objekts ir jādeklarē moduļa loga augšdaļā esošajā sadaļā Deklarēt

Tas nodrošinās, ka viss jūsu kods šajā modulī var piekļūt kolekcijai. Ja vēlaties, lai kāds darbgrāmatas modulis piekļūtu kolekcijai, definējiet to kā globālu objektu

1 Globālā MyCollection kā jauna kolekcija

Kolekcijas izveide, vienumu pievienošana un piekļūšana vienumiem

Vienkāršu kolekcijas objektu var izveidot VBA, izmantojot šādu kodu:

123456 Sub CreateCollection ()Dim MyCollection kā jauna kolekcijaMana kolekcija. Pievienot vienumu1MyCollection.Add "Item2"Mana kolekcija. Pievienot vienumu3Beigu apakš

Kods izmēra jaunu objektu ar nosaukumu “Mana kolekcija” un pēc tam sekojošās koda rindas izmanto metodi Pievienot, lai pievienotu 3 jaunas vērtības.

Pēc tam varat izmantot kodu, lai atkārtotu kolekciju, lai piekļūtu vērtībām

123 Par katru vienumu MyCollectionMsgBox vienumsNākamais vienums

Varat arī atkārtot savu kolekciju, izmantojot For Next Loop:

123 Ja n = 1 uz MyCollection.CountMsgBox MyCollection (n)Nākamais n

Kods iegūst kolekcijas lielumu, izmantojot rekvizītu Count, un pēc tam izmanto šo sākuma vērtību 1, lai indeksētu katru vienumu

Katra cilpa ir ātrāka par cilni Nākamā, taču tā darbojas tikai vienā virzienā (no zema indeksa līdz augstam). For Next Loop priekšrocība ir tā, ka jūs varat izmantot citu virzienu (no augsta indeksa līdz zemam), un jūs varat arī izmantot Step metodi, lai mainītu pieaugumu. Tas ir noderīgi, ja vēlaties dzēst vairākus vienumus, jo jums būs jāveic dzēšana no kolekcijas beigām līdz sākumam, jo, mainoties dzēšanai, indekss mainīsies.

Kolekcijas pievienošanas metodei ir 3 izvēles parametri - atslēga, pirms un pēc

Varat izmantot parametrus “Pirms” un “Pēc”, lai definētu jaunā vienuma pozīciju attiecībā pret citiem kolekcijā jau esošajiem.

Tas tiek darīts, norādot indeksa numuru, kuram vēlaties pievienot savu jauno vienumu.

123456 Sub CreateCollection ()Dim MyCollection kā jauna kolekcijaMana kolekcija. Pievienot vienumu1MyCollection.Add "Item2",, 1Mana kolekcija. Pievienot vienumu3Beigu apakš

Šajā piemērā ir norādīts, ka “Item2” jāpievieno pirms kolekcijas pirmā indeksētā vienuma (kas ir “Item1”). Atkārtojot šo kolekciju, vispirms tiks parādīts vienums2, kam seko vienums1 un vienums3

Norādot parametru “Pirms” vai “Pēc”, indeksa vērtība kolekcijā tiek automātiski pielāgota tā, lai “2. vienums” kļūtu par indeksa vērtību 1 un “Vienums 1” tiktu pārvietots uz indeksa vērtību 2

Varat arī izmantot parametru “Atslēga”, lai pievienotu atsauces vērtību, ko varat izmantot kolekcijas vienuma identificēšanai. Ņemiet vērā, ka atslēgas vērtībai ir jābūt virknei, un tai jābūt unikālai kolekcijā.

1234567 Sub CreateCollection ()Dim MyCollection kā jauna kolekcijaMana kolekcija. Pievienot vienumu1MyCollection.Add "Item2", "MyKey"Mana kolekcija. Pievienot vienumu3MsgBox MyCollection ("MyKey")Beigu apakš

Vienumam2 ir piešķirta atslēgas vērtība “MyKey”, lai jūs varētu atsaukties uz šo vienumu, izmantojot indeksa numura vietā vērtību “MyKey” (2)

Ņemiet vērā, ka atslēgas vērtībai ir jābūt virknes vērtībai. Tas nevar būt cita veida dati. Ņemiet vērā, ka kolekcija ir tikai lasāma un jūs nevarat atjaunināt atslēgas vērtību, tiklīdz tā ir iestatīta. Tāpat jūs nevarat pārbaudīt, vai kādai kolekcijas vienībai pastāv atslēgas vērtība, vai apskatīt atslēgas vērtību, kas ir neliels trūkums.

Parametram “Atslēga” ir papildu priekšrocība, jo tas padara jūsu kodu lasāmāku, it īpaši, ja tas tiek nodots kolēģim, lai to atbalstītu, un jums nav jāatkārto visa kolekcija, lai atrastu šo vērtību. Iedomājieties, ja jums būtu 10 000 priekšmetu kolekcija, cik grūti būtu atsaukties uz vienu konkrētu vienumu!

Vienuma noņemšana no kolekcijas

Lai dzēstu vienumus no savas kolekcijas, varat izmantot metodi “Noņemt”.

1 Mana kolekcija. Noņemt (2)

Diemžēl nav viegli, ja kolekcijā ir liels vienumu skaits, lai izstrādātu dzēšamā vienuma indeksu. Šeit ir noderīgs parametrs “Atslēga”, kad kolekcija tiek veidota

1 MyCollection.Remove (“MyKey”)

Kad vienums tiek noņemts no kolekcijas, indeksa vērtības tiek automātiski atiestatītas līdz kolekcijai. Šeit parametrs “Atslēga” ir tik noderīgs, ja vienlaikus dzēšat vairākus vienumus. Piemēram, jūs varat izdzēst vienumu indeksu 105, un uzreiz vienuma rādītājs 106 kļūst par indeksu 105, un visa virs šī vienuma indeksa vērtība tiek pārvietota uz leju. Ja izmantojat parametru Key, nav jāuztraucas par to, kura indeksa vērtība ir jānoņem.

Lai dzēstu visus kolekcijas vienumus un izveidotu jaunu kolekciju, vēlreiz izmantojiet priekšrakstu Dim, kas izveido tukšu kolekciju.

1 Dim MyCollection kā jauna kolekcija

Lai pilnībā noņemtu faktisko kolekcijas objektu, varat iestatīt objektu uz neko

1 Set MyCollection = Nekas

Tas ir noderīgi, ja jūsu kods vairs neprasa kolekciju. Kolekcijas objekta iestatīšana uz neko nenoņem visas atsauces uz to un atbrīvo izmantoto atmiņu. Tas var būtiski ietekmēt jūsu koda izpildes ātrumu, ja atmiņā sēž liels objekts, kas vairs nav nepieciešams.

Saskaitiet kolekcijas priekšmetu skaitu

Izmantojot rekvizītu “Skaits”, varat viegli uzzināt kolekcijas priekšmetu skaitu

1 MsgBox MyCollection.Count

Jūs izmantotu šo rekvizītu, ja kolekcijas atkārtošanai izmantotu funkciju “Nākamā cilpa”, jo tā nodrošinās indeksa numura augšējo robežu.

Konkrētas vērtības testa kolekcija

Jūs varat atkārtot kolekciju, lai meklētu vienumam noteiktu vērtību, izmantojot katrai cilpai

123456789101112 Sub SearchCollection ()Dim MyCollection kā jauna kolekcijaMana kolekcija. Pievienot vienumu1MyCollection.Add "Item2"Mana kolekcija. Pievienot vienumu3Par katru vienumu MyCollectionJa vienums = "Vienums2" TadMsgBox vienums un "Atrasts"Beigas JaNākamaisBeigu apakš

Kods izveido nelielu kolekciju un pēc tam to atkārto, meklējot vienumu ar nosaukumu “item2”. Ja tas tiek atrasts, tiek parādīts ziņojuma lodziņš, ka tas ir atradis konkrēto vienumu

Viens no šīs metodikas trūkumiem ir tas, ka jūs nevarat piekļūt indeksa vērtībai vai atslēgas vērtībai

Ja tā vietā izmantojat cilpu “Nākamā cilpa”, varat izmantot skaitītāju “Nākamais”, lai iegūtu indeksa vērtību, lai gan jūs joprojām nevarat iegūt vērtību “Atslēga”

123456789101112 Sub SearchCollection ()Dim MyCollection kā jauna kolekcijaMana kolekcija. Pievienot vienumu1MyCollection.Add "Item2"Mana kolekcija. Pievienot vienumu3Ja n = 1 uz MyCollection.CountJa MyCollection.Item (n) = "Item2" TadMsgBox MyCollection.Item (n) & "found on index position" & nBeigas JaNākamais nBeigu apakš

Nākamais skaitītājs (n) nodrošinās indeksa pozīciju

Kolekcijas kārtošana

Kolekcijas kārtošanai nav iebūvētas funkcionalitātes, taču, izmantojot domāšanas veidu, var rakstīt kodu, lai veiktu kārtošanu, izmantojot Excel darblapu šķirošanas funkciju. Šis kods izmanto tukšu darblapu ar nosaukumu “SortSheet”, lai veiktu faktisko šķirošanu.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 Apakššķirot ()Dim MyCollection kā jauna kolekcijaDim skaitītājs tik ilgi“Veidojiet kolekciju ar nejaušas secības vienumiemMana kolekcija. Pievienot vienumu5MyCollection.Add "Item2"MyCollection.Pievienot "Item4"Mana kolekcija. Pievienot vienumu1Mana kolekcija. Pievienot vienumu3“Uzņemiet kolekcijā esošo priekšmetu skaitu turpmākai lietošanaiSkaitītājs = MyCollection.Count“Atkārtojiet kolekciju, kopējot katru vienumu“ SortSheet ”secīgā šūnā (A sleja)Ja n = 1 uz MyCollection.CountIzklājlapas ("SortSheet"). Šūnas (n, 1) = Mana kolekcija (n)Nākamais n“Aktivizējiet šķirnes lapu un izmantojiet Excel kārtošanas kārtību, lai sakārtotu datus augošā secībāIzklājlapas ("SortSheet"). AktivizētDiapazons ("A1: A" un MyCollection.Count). AtlasietActiveWorkbook.Worksheets ("SortSheet"). Sort.SortFields.ClearActiveWorkbook.Worksheets ("SortSheet"). Kārtot.SortFields.Add2 atslēga: = Diapazons (_"A1: A5"), SortOn: = xlSortOnValues, secība: = xlAscending, DataOption: = _xlSortNormalAr ActiveWorkbook.Worksheets ("SortSheet"). Kārtot.SetRange diapazons ("A1: A5").Galva = xlGuess.MatchCase = Nepareizi.Orientation = xlTopToBottom.SortMethod = xlPinYin.PiesakiesBeigt ar“Dzēsiet visus kolekcijas vienumus - ņemiet vērā, ka šī sadaļa“ Nākamā cilpa ”darbojas apgrieztā secībāJa n = Mana kolekcija. Saskaitiet līdz 1. solim -1Mana kolekcija. Noņemt (n)Nākamais n“Kopējiet šūnu vērtības atpakaļ tukšajā savākšanas objektā, izmantojot cilpas saglabāto vērtību (skaitītāju)Par n = 1 uz skaitītājuMyCollection.Add Sheets ("SortSheet"). Šūnas (n, 1). VērtībaNākamais n“Atkārtojiet kolekciju, lai pierādītu kārtību, kādā preces tagad atrodasPar katru vienumu MyCollectionMsgBox vienumsNākamais vienums“Notīriet darblapu (šķirnes lapu) - ja nepieciešams, izdzēsiet arī toIzklājlapas ("SortSheet"). Diapazons (šūnas (1, 1), šūnas (skaitītājs, 1)). SkaidrsBeigu apakš

Šis kods vispirms izveido kolekciju ar vienumiem, kas pievienoti nejaušā secībā. Pēc tam tā tos kopē darblapas pirmajā kolonnā (SortSheet).

Pēc tam kods izmanto Excel kārtošanas funkciju, lai slejā esošos datus sakārtotu augošā secībā. Kodu var arī mainīt, lai sakārtotu dilstošā secībā.

Pēc tam kolekcija tiek iztukšota no datiem, izmantojot For Next Loop. Ņemiet vērā, ka soļa opcija tiek izmantota, lai tā tiktu notīrīta no kolekcijas beigām līdz sākumam. Tas notiek tāpēc, ka, dzēšot, indeksa vērtības tiek atiestatītas; ja tas tiktu notīrīts no sākuma, tas netiktu notīrīts pareizi (2. indekss kļūtu par indeksu 1)

Visbeidzot, izmantojot citu For Next Loop, vienumu vērtības tiek nodotas atpakaļ tukšajā kolekcijā

Vēl viena par katru cilpu pierāda, ka kolekcija tagad ir labā augošā secībā.

Diemžēl tas neattiecas uz galvenajām vērtībām, kas varētu būt ievadītas sākotnēji, jo tās nevar nolasīt

Kolekcijas nodošana apakš / funkcijai

Kolekciju var nodot apakšvienībai vai funkcijai tāpat kā jebkuru citu parametru

1 Funkcija MyFunction (ByRef MyCollection kā kolekcija)

Ir svarīgi nodot kolekciju, izmantojot “ByRef”. Tas nozīmē, ka tiek izmantota oriģinālā kolekcija. Ja kolekcija tiek nodota, izmantojot “ByVal”, tiek izveidota kolekcijas kopija, kurai var būt nepatīkamas sekas

Ja kopija tiek izveidota, izmantojot “ByVal”, viss, kas maina kolekciju funkcijas ietvaros, notiek tikai uz kopijas, nevis uz oriģināla. Piemēram, ja funkcijas ietvaros kolekcijai tiek pievienots jauns vienums, tas netiks parādīts sākotnējā kolekcijā, kas radīs kļūdu jūsu kodā.

Kolekcijas atgriešana no funkcijas

Jūs varat atgriezt kolekciju no funkcijas tāpat kā jebkura objekta atgriešanu. Jums ir jāizmanto atslēgvārds

12345 Sub ReturnFromFunction ()Dim MyCollection kā kolekcijaIestatīt MyCollection = PopulateCollectionMsgBox MyCollection.CountBeigu apakš

Šis kods izveido apakšprogrammu, kas izveido objektu ar nosaukumu “Mana kolekcija” un pēc tam izmanto atslēgvārdu “Iestatīt”, lai efektīvi izsauktu funkciju, lai aizpildītu šo kolekciju. Kad tas ir izdarīts, tiek parādīts ziņojumu lodziņš, kurā parādīts 2 vienumu skaits

1234567 Funkcija PopulateCollection () kā kolekcijaDim MyCollection kā jauna kolekcijaMana kolekcija. Pievienot vienumu1MyCollection.Add "Item2"Iestatīt PopulateCollection = Mana kolekcijaBeigu funkcija

Funkcija PopulateCollection izveido jaunu kolekcijas objektu un aizpilda to ar 2 vienumiem. Pēc tam tas nodod šo objektu atpakaļ kolekcijas objektam, kas izveidots sākotnējā apakšprogrammā.

Kolekcijas pārvēršana masīvā

Iespējams, vēlēsities pārvērst savu kolekciju masīvā. Iespējams, vēlēsities saglabāt datus tur, kur tos varēs mainīt un ar tiem manipulēt. Šis kods izveido nelielu kolekciju un pēc tam pārsūta to masīvā

Ņemiet vērā, ka kolekcijas indekss sākas ar 1, bet masīva indekss sākas ar 0. Kamēr kolekcijā ir 3 vienumi, masīvam ir jābūt tikai izmēriem līdz 2, jo ir elements 0

1234567891011121314151617 Sub ConvertCollectionToArray ()Dim MyCollection kā jauna kolekcijaDim MyArray (2) kā virkneMana kolekcija. Pievienot vienumu1MyCollection.Add "Item2"Mana kolekcija. Pievienot vienumu3Ja n = 1 uz MyCollection.CountMyArray (n - 1) = Mana kolekcija (n)Nākamais nJa n = 0 līdz 2MsgBox MyArray (n)Nākamais nBeigu apakš

Masīva pārveidošana par kolekciju

Iespējams, vēlēsities masīvu pārvērst kolekcijā. Piemēram, iespējams, vēlēsities piekļūt datiem ātrāk un elegantāk, izmantojot kodu, lai iegūtu masīva elementu.

Paturiet prātā, ka tas darbosies tikai vienai masīva dimensijai, jo kolekcijai ir tikai viena dimensija

123456789101112131415 Sub ConvertArrayIntoCollection ()Dim MyCollection kā jauna kolekcijaDim MyArray (2) kā virkneMyArray (0) = "item1"MyArray (1) = "Vienums2"MyArray (2) = "3. vienums"Ja n = 0 līdz 2MyCollection. Pievienot MyArray (n)Nākamais nPar katru vienumu MyCollectionMsgBox vienumsNākamais vienumsBeigu apakš

Ja vēlaties izmantot daudzdimensiju masīvu, varat sasaistīt masīva vērtības katrai masīva rindai, izmantojot atdalītāja rakstzīmi starp masīva izmēriem, lai, lasot kolekcijas vērtību, varētu programmiski izmantot atdalītāja rakstzīmi, lai atdaliet vērtības.

Jūs varētu arī pārvietot datus kolekcijā, pamatojoties uz to, ka tiek pievienota pirmās dimensijas vērtība (1. indekss) un pēc tam tiek pievienota nākamās kategorijas vērtība (2. indekss) utt.

Ja masīvam būtu, teiksim, 4 dimensijas, katra ceturtā kolekcijas vērtība būtu jauna vērtību kopa.

Varat arī pievienot masīva vērtības, ko izmantot kā atslēgas (ar nosacījumu, ka tās ir unikālas), kas pievienotu vienkāršu veidu, kā atrast konkrētus datus.

Jums palīdzēs attīstību vietā, daloties lapu ar draugiem

wave wave wave wave wave