Збирке Екцел ВБА

Збирка је објекат који садржи бројне сличне ставке. Њима се лако може приступити и њима се може манипулисати, чак и ако се у збирци налази велики број предмета.

Већ постоје уграђене колекције са Екцел ВБА. Пример је збирка Схеетс. За сваки радни лист у радној свесци постоји ставка у збирци Схеетс.

Уграђене колекције имају далеко више својстава и метода које су вам доступне, али оне нису доступне у вашим властитим колекцијама које креирате.

На пример, можете користити збирку за добијање информација о одређеном радном листу. На пример, можете видети назив радног листа и да ли је видљив или не. Коришћењем петље За сваку, можете да пролазите кроз сваки радни лист у колекцији.

1234567 Под Тест Радни листови ()Дим Сх Ас Радни листЗа сваки Сх Ин СхеетсМсгБок Сх.НамеМсгБок Сх.ВисиблеСледећи ШЕнд Суб

Такође се можете обратити одређеном радном листу у збирци користећи вредност индекса или стварни назив радног листа:

12 МсгБок листови (1). ИмеМсгБок Схеетс ("Схеет1"). Назив

Како се радни листови додају или бришу, тако се и збирка листова повећава или смањује у величини.

Имајте на уму да код ВБА колекција број индекса почиње са 1, а не са 0

Збирке у односу на низове

Низови и збирке су слични по својим функцијама по томе што су обе методологије које омогућавају складиштење велике количине података који се затим могу лако референцирати помоћу кода. Међутим, они имају низ разлика у начину рада:

  1. Низови су вишедимензионални, док су збирке само једнодимензионалне. Можете димензионисати низ са неколико димензија, нпр.
1 Дим МиАрраи (10, 2) Ас Стринг

Ово ствара низ од 10 редова са 2 колоне, скоро као радни лист. Збирка је заправо једна колона. Низ је користан ако требате да сачувате бројне ставке података које се односе једна на другу, нпр. име и адресу. Назив би био у првој димензији низа, а адреса у другој димензији.

  1. Када попуните низ, потребан вам је посебан ред кода да бисте унели вредност у сваки елемент низа. Да имате дводимензионални низ, заправо би вам биле потребне 2 линије кода - један ред за адресу прве колоне и један ред за адресирање друге колоне. Са објектом Цоллецтион једноставно користите методу Адд тако да се нова ставка само додаје у збирку и вредност индекса се аутоматски прилагођава тако да одговара.
  2. Ако требате избрисати ставку података, онда је у низу сложеније. Можете поставити вредности елемента на празну вредност, али сам елемент и даље постоји унутар низа. Ако користите петљу Фор Нект за понављање кроз низ, петља ће вратити празну вредност, за коју ће бити потребно кодирање како би се осигурало да се празна вредност занемарује. У збирци користите методе Додај или Уклони, а за све индексирање и промјену величине се аутоматски брине. Уклоњена ставка потпуно нестаје. Низови су корисни за фиксну величину података, али су збирке боље за места где се количина података може променити.
  3. Колекције су само за читање, док се вредности низа могу променити помоћу ВБА. Са колекцијом, прво бисте морали да уклоните вредност коју желите да промените, а затим додате нову промењену вредност.
  4. У низу можете користити само један тип података за елементе који се постављају приликом димензионисања низа. Међутим, у низу можете користити прилагођене типове података које сте сами дизајнирали. Могли бисте имати врло компликовану структуру низа користећи прилагођени тип података који заузврат има неколико прилагођених типова података. У збирку можете додати корисничке типове података за сваку ставку. Могли бисте имати нумеричку вредност, датум или низ - објекат збирке ће узети било који тип података. Ако покушате да поставите низ вредност у низ који је димензионисан као нумерички, то ће произвести поруку о грешци.
  5. Збирке су генерално лакше користити од низа. У терминима кодирања, када креирате објекат збирке, он има само две методе (Додавање и Уклањање) и два својства (Бројање и Ставка), па објекат ни у ком случају није компликован за програмирање.
  6. Збирке могу користити кључеве за лоцирање података. Низови немају ову функцију и захтевају петљу кода за понављање кроз низ ради проналажења одређених вредности.
  7. Величина низа мора бити дефинисана приликом првог креирања. Морате имати идеју о томе колико ће података складиштити. Ако требате повећати величину низа, можете употријебити „РеДим“ да бисте га промијенили, али морате користити кључну ријеч „Очувај“ ако не желите изгубити податке који се већ држе у низу. Величина збирке не мора бити дефинисана. Он само расте и аутоматски се смањује како се ставке додају или уклањају.

Опсег објекта прикупљања

Што се тиче обима, објекат збирке је доступан само док је радна свеска отворена. Не чува се када се сачува радна свеска. Ако се радна свеска поново отвори, збирку је потребно поново креирати помоћу ВБА кода.

Ако желите да ваша збирка буде доступна свим кодовима у вашем кодном модулу, морате декларисати објекат колекције у одељку Декларисање на врху прозора модула

Ово ће осигурати да сав ваш код унутар тог модула може приступити збирци. Ако желите да било који модул у вашој радној свесци приступа колекцији, дефинишите је као глобални објекат

1 Глобална колекција МиЦоллецтион као нова колекција

Креирање збирке, додавање ставки и приступање ставкама

Једноставан објекат колекције може се креирати у ВБА помоћу следећег кода:

123456 Суб ЦреатеЦоллецтион ()Дим МиЦоллецтион као нова колекцијаМиЦоллецтион.Адд "Итем1"МиЦоллецтион.Адд "Итем2"МиЦоллецтион.Адд "Итем3"Енд Суб

Код димензионише нови објекат под називом „МиЦоллецтион“, а затим следећи редови кода користе методу Адд за додавање 3 нове вредности.

Затим можете да користите код за понављање збирке за приступ вредностима

123 За сваку ставку у МиЦоллецтионМсгБок ИтемСледећа ставка

Такође можете да прођете кроз своју колекцију помоћу Фор Нект Лооп:

123 За н = 1 За МиЦоллецтион.ЦоунтМсгБок МиЦоллецтион (н)Нект н

Код добија величину колекције коришћењем својства Цоунт, а затим користи ову почетну вредност 1 за индексирање сваке ставке

Фор Евери Лооп је бржи од Фор Нект петље, али ради само у једном смеру (од ниског индекса до високог). Фор Нект Лооп има предност што можете користити другачији правац (од високог индекса до ниског), а такође можете користити методу Степ да промените прираст. Ово је корисно када желите да избришете неколико ставки јер ћете морати да покренете брисање од краја збирке до почетка јер ће се индекс мењати како се брисања дешавају.

Метода Адд у колекцији има 3 опциона параметра - Кеи, Бефоре и Афтер

Можете користити параметре „Пре“ ​​и „После“ да бисте дефинисали положај ваше нове ставке у односу на остале који су већ у колекцији

То се постиже навођењем броја индекса за који желите да ваша нова ставка буде релативна.

123456 Суб ЦреатеЦоллецтион ()Дим МиЦоллецтион као нова колекцијаМиЦоллецтион.Адд "Итем1"МиЦоллецтион.Адд "Итем2",, 1МиЦоллецтион.Адд "Итем3"Енд Суб

У овом примеру је наведено да се ставка „ставка 2“ додаје пре прве индексиране ставке у колекцији (која је „ставка 1“). Када прођете кроз ову колекцију, прво ће се појавити „ставка2“, а затим „ставка1“ и „ставка3“

Када наведете параметре „Пре“ ​​или „После“, вредност индекса се аутоматски прилагођава унутар колекције тако да „Ставка2“ постаје вредност индекса 1, а „Ставка1“ се помера на вредност индекса 2

Параметар „кључ“ можете користити и за додавање референтне вредности коју можете користити за идентификацију ставке збирке. Имајте на уму да вредност кључа мора бити низ и мора бити јединствена у колекцији.

1234567 Суб ЦреатеЦоллецтион ()Дим МиЦоллецтион као нова колекцијаМиЦоллецтион.Адд "Итем1"МиЦоллецтион.Адд "Итем2", "МиКеи"МиЦоллецтион.Адд "Итем3"МсгБок МиЦоллецтион ("МиКеи")Енд Суб

Ставка „Ставка 2“ је добила вредност „Кључ“ од „МиКеи“ тако да се можете позивати на ту ставку користећи вредност „МиКеи“ уместо броја индекса (2)

Имајте на уму да вредност „Кључ“ мора бити вредност низа. Не може бити било који други тип података. Имајте на уму да је збирка само за читање и да не можете ажурирати вредност кључа након што је постављена. Такође, не можете проверити да ли постоји вредност кључа за одређену ставку у збирци или прегледати вредност кључа што је помало недостатак.

Параметар „кључ“ има додатну предност што ваш код чини читљивијим, посебно ако се предаје колеги на подршку, а не морате понављати читаву збирку да бисте пронашли ту вредност. Замислите да имате збирку од 10.000 артикала колико би било тешко референцирати једну конкретну ставку!

Уклањање ставке из колекције

Методом „Уклони“ можете да избришете ставке из своје збирке.

1 МиЦоллецтион.Ремове (2)

Нажалост, није лако ако збирка има велики број ставки за израчунавање индекса ставке коју желите да избришете. Овде параметар „кључ“ добро дође приликом стварања колекције

1 МиЦоллецтион.Ремове (“МиКеи”)

Када се ставка уклони из колекције, вредности индекса се аутоматски ресетују до краја кроз збирку. Овде је параметар „кључ“ толико користан када бришете неколико ставки одједном. На пример, могли бисте да избришете индекс ставке 105 и тренутно индекс ставке 106 постаје индекс 105, а вредност индекса свега изнад ове ставке се помера надоле. Ако користите параметар Кеи, нема потребе да бринете о томе коју вредност индекса треба уклонити.

Да бисте избрисали све ставке колекције и креирали нову колекцију, поново користите израз Дим који ствара празну колекцију.

1 Дим МиЦоллецтион као нова колекција

Да бисте у потпуности уклонили стварни објекат колекције, можете га поставити на ништа

1 Постави МиЦоллецтион = Ништа

Ово је корисно ако ваш код више не захтева прикупљање. Постављање објекта колекције на ништа уклања све референце на њега и ослобађа меморију коју је користио. Ово може имати важне импликације на брзину извршавања вашег кода, ако велики објект седи у меморији који више није потребан.

Пребројите број предмета у збирци

Број ставки у вашој колекцији можете лако сазнати помоћу својства „Број“

1 МсгБок МиЦоллецтион.Цоунт

Ово својство бисте користили да користите Фор Нект Лооп за понављање кроз збирку јер ће вам обезбедити горњу границу за број индекса.

Збирка тестова за одређену вредност

Можете прелазити кроз збирку да бисте потражили одређену вредност за ставку помоћу петље За сваку петљу

123456789101112 Суб СеарцхЦоллецтион ()Дим МиЦоллецтион као нова колекцијаМиЦоллецтион.Адд "Итем1"МиЦоллецтион.Адд "Итем2"МиЦоллецтион.Адд "Итем3"За сваку ставку у МиЦоллецтионАко је Итем = "Итем2" ОндаСтавка мсгБок & "Пронађено"Крај АкоСледећиЕнд Суб

Код ствара малу колекцију, а затим се кроз њу понавља тражећи ставку под називом „итем2“. Ако је пронађено, приказује оквир за поруку да је пронашао одређену ставку

Један од недостатака ове методологије је то што не можете приступити вредности индекса или вредности кључа

Ако уместо тога користите Фор Нект Лооп, можете користити бројач Фор Нект да бисте добили вредност индекса, иако још увек не можете добити вредност „Кеи“

123456789101112 Суб СеарцхЦоллецтион ()Дим МиЦоллецтион као нова колекцијаМиЦоллецтион.Адд "Итем1"МиЦоллецтион.Адд "Итем2"МиЦоллецтион.Адд "Итем3"За н = 1 За МиЦоллецтион.ЦоунтАко је МиЦоллецтион.Итем (н) = "Итем2" ЗатимМсгБок МиЦоллецтион.Итем (н) & "пронађено на позицији индекса" & нКрај АкоНект нЕнд Суб

Бројач Фор Нект (н) ће обезбедити позицију индекса

Сортирање збирке

Не постоји уграђена функција за сортирање збирке, али користећи неко размишљање „ван кутије“, код се може написати да би се извршило сортирање, користећи Екцел-ову функцију сортирања радног листа. Овај код користи празан радни лист под називом „СортСхеет“ за стварно сортирање.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 Суб СортЦоллецтион ()Дим МиЦоллецтион као нова колекцијаДим Цоунтер Ас Лонг„Изградите колекцију насумичним ставкама наруџбинеМиЦоллецтион.Адд "Итем5"МиЦоллецтион.Адд "Итем2"МиЦоллецтион.Адд "Итем4"МиЦоллецтион.Адд "Итем1"МиЦоллецтион.Адд "Итем3"„Снимите број ставки у колекцији за будућу употребуБројач = МиЦоллецтион.Цоунт„Поновите колекцију копирањем сваке ставке у узастопну ћелију на„ СортСхеет “(колона А)За н = 1 За МиЦоллецтион.ЦоунтТабеле ("СортСхеет"). Ћелије (н, 1) = Моја збирка (н)Нект н„Активирајте листу за сортирање и користите Екцел рутину сортирања да сортирате податке у растућем редоследуТабеле („СортСхеет“). АктивирајтеОпсег ("А1: А" & МиЦоллецтион.Цоунт) .ИзаберитеАцтивеВоркбоок.Ворксхеетс ("СортСхеет"). Сорт.СортФиелдс.ЦлеарАцтивеВоркбоок.Ворксхеетс ("СортСхеет"). Сортирај.СортФиелдс.Адд2 кључ: = Опсег (_"А1: А5"), СортОн: = клСортОнВалуес, Редослед: = клАсцендинг, ДатаОптион: = _клСортНормалВитх АцтивеВоркбоок.Ворксхеетс ("СортСхеет"). Сорт.СетРанге Ранге ("А1: А5").Хеадер = клГуесс.МатцхЦасе = Нетачно.Оријентација = клТопТоБоттом.СортМетход = клПинИин.ПрименитиЗавршити„Избришите све ставке у колекцији - имајте на уму да се ова Фор Нект Лооп ради обрнутим редоследомЗа н = МиЦоллецтион.Цоунт То 1 Степ -1МиЦоллецтион.Ремове (н)Нект н„Копирајте ћелијске вредности назад у празан објекат колекције користећи сачувану вредност (бројач) за„ петљу “За н = 1 За бројачМиЦоллецтион.Адд Схеетс ("СортСхеет"). Целлс (н, 1) .ВалуеНект н„Поновите збирку како бисте доказали редослед у којем се сада налазе предметиЗа сваку ставку у МиЦоллецтионМсгБок ИтемСледећа ставка„Очистите радни лист (сортирани лист) - ако је потребно, избришите и његаТабеле („СортСхеет“). Опсег (ћелије (1, 1), ћелије (бројач, 1)). ОбришиЕнд Суб

Овај код прво ствара колекцију са ставкама које су додате случајним редоследом. Затим их копира у прву колону на радном листу (СортСхеет).

Цоде затим користи Екцел функцију сортирања за сортирање података у колони према растућем редоследу. Код се такође може изменити како би се сортирао према опадајућем редоследу.

Збирка се затим испразни из података помоћу Фор Нект Лооп. Имајте на уму да се корак опција користи тако да се брише од краја збирке до почетка. То је зато што се током брисања вредности индекса ресетују, ако се очисти од почетка, не би се исправно обрисало (индекс 2 би постао индекс 1)

Коначно, користећи другу Фор Нект Лооп, вредности ставки се враћају назад у празну колекцију

Даље за сваку петљу доказује да је колекција сада у добром растућем редоследу.

Нажалост, ово се не односи на вредности кључа које су можда првобитно унете, јер се вредности кључа не могу прочитати

Прослеђивање збирке под -функцији

Збирка се може проследити под -функцији на исти начин као и било који други параметар

1 Функција МиФунцтион (БиРеф МиЦоллецтион као збирка)

Важно је да збирку проследите користећи „БиРеф“. То значи да се користи оригинална збирка. Ако се збирка прослеђује помоћу „БиВал -а“, ово ствара копију збирке која може имати несрећне последице

Ако се копија креира помоћу „БиВал -а“, све што мења колекцију унутар функције дешава се само на копији, а не и на оригиналу. На пример, ако је унутар функције нова ставка додата у колекцију, то се неће појавити у оригиналној колекцији, што ће створити грешку у вашем коду.

Враћање збирке из функције

Колекцију из функције можете вратити на исти начин као и враћање било ког објекта. Морате да користите кључну реч Сет

12345 Суб РетурнФромФунцтион ()Дим МиЦоллецтион Ас ЦоллецтионСет МиЦоллецтион = ПопулатеЦоллецтионМсгБок МиЦоллецтион.ЦоунтЕнд Суб

Овај код ствара потпрограм који креира објект под називом „МиЦоллецтион“, а затим користи кључну реч „Сет“ за ефикасно позивање функције за попуњавање те збирке. Када се то уради, приказује се оквир са поруком који приказује број од 2 ставке

1234567 Функција ПопулатеЦоллецтион () као збиркаДим МиЦоллецтион као нова колекцијаМиЦоллецтион.Адд "Итем1"МиЦоллецтион.Адд "Итем2"Постави ПопулатеЦоллецтион = Моја збиркаЗавршна функција

Функција ПопулатеЦоллецтион креира нови објекат колекције и попуњава га са 2 ставке. Затим прослеђује овај објекат назад у објекат колекције креиран у оригиналној подрутини.

Претварање збирке у низ

Можда ћете желети да своју збирку претворите у низ. Можда ћете желети да сачувате податке тамо где се могу мењати и манипулисати њима. Овај код ствара малу колекцију, а затим је преноси у низ

Приметите да индекс збирке почиње са 1, док индекс низа почиње са 0. Док збирка има 3 ставке, низ треба само димензионисати на 2 јер постоји елемент 0

1234567891011121314151617 Суб ЦонвертЦоллецтионТоАрраи ()Дим МиЦоллецтион као нова колекцијаДим МиАрраи (2) Ас СтрингМиЦоллецтион.Адд "Итем1"МиЦоллецтион.Адд "Итем2"МиЦоллецтион.Адд "Итем3"За н = 1 За МиЦоллецтион.ЦоунтМиАрраи (н - 1) = МиЦоллецтион (н)Нект нЗа н = 0 до 2МсгБок МиАрраи (н)Нект нЕнд Суб

Претварање низа у збирку

Можда ћете желети да претворите низ у колекцију. На пример, можда ћете желети да приступите подацима на бржи и елегантнији начин помоћу кода за добијање елемента низа.

Имајте на уму да ће ово радити само за једну димензију низа јер колекција има само једну димензију

123456789101112131415 Суб ЦонвертАрраиИнтоЦоллецтион ()Дим МиЦоллецтион као нова колекцијаДим МиАрраи (2) Ас СтрингМиАрраи (0) = "итем1"МиАрраи (1) = "Ставка 2"МиАрраи (2) = "Ставка 3"За н = 0 до 2МиЦоллецтион.Адд МиАрраи (н)Нект нЗа сваку ставку у МиЦоллецтионМсгБок ИтемСледећа ставкаЕнд Суб

Ако сте ипак желели да користите вишедимензионални низ, могли бисте да повежете вредности низа заједно за сваки ред у низу користећи знак разграничења између димензија низа, тако да при читању вредности збирке можете програмски користити знак разграничења за издвојите вредности.

Такође можете преместити податке у збирку на основу тога што се додаје вредност прве димензије (индекс 1), а затим се додаје вредност следеће димензије (индекс 2) итд.

Да низ има, рецимо, 4 димензије, свака четврта вредност у колекцији била би нови скуп вредности.

Такође можете додати вредности низа које ћете користити као кључеве (под условом да су јединствене) што би додало једноставан начин лоцирања одређених података.

Ви ће помоћи развој сајта, дељење страницу са пријатељима

wave wave wave wave wave