Објекат АрраиЛист је сличан објекту Цоллецтион, али има далеко више метода и својстава, па самим тим и далеко већу флексибилност са програмске тачке гледишта.
Објекат Цоллецтион има само две методе (Адд, Ремове) и два својства (Цоунт, Итем), док Арраи Лист има много више. Такође, објекат Цоллецтион је само за читање. Након додавања вредности, индексирана вредност се не може променити, док је на листи низа могуће уређивање.
Многе методе листе низа користе параметре. За разлику од многих стандардних ВБА метода, ниједан од ових параметара није опциони. Такође, неки од метода и својстава не пишу увек велика слова када се унесу на исти начин као у Екцел ВБА. Међутим, они и даље раде.
Објекат АрраиЛист се проширује и сужава у величини према броју ставки које садржи. Не треба га димензионисати пре употребе као низ.
Листа низа је једнодимензионална (иста као и објект Цоллецтион) и подразумевани тип података је Вариант, што значи да ће прихватити било коју врсту података, било да су нумеричке, текстуалне или датумске.
На много начина Арраи Лист адресира бројне недостатке објекта Цоллецтион. Свакако је далеко флексибилнији у својим могућностима.
Објекат Арраи Лист није део стандардне ВБА библиотеке. Можете га користити у Екцел ВБА коду помоћу касног или раног везивања
1234 | Суб ЛатеБиндингЕкампле ()Дим МиЛист Ас ОбјецтПостави МиЛист = ЦреатеОбјецт ("Систем.Цоллецтионс.АрраиЛист")Енд Суб |
123 | Суб ЕарлиБиндингЕкампле ()Дим МиЛист Ас Нев АрраиЛистЕнд Суб |
Да бисте користили пример раног везивања, прво морате да унесете референцу у ВБА на датотеку „мсцорлиб.тлб“
То можете учинити избором „Алати | Референце ‘из прозора Висуал Басиц Едитор (ВБЕ). Појавиће се искачући прозор са свим доступним референцама. Померите се надоле до „мсцорлиб.длл“ и означите поље поред ње. Притисните ОК и та библиотека је сада део вашег пројекта:
Један од великих недостатака објекта Арраи Лист је то што нема „Интеллисенсе“. Обично, тамо где користите објекат у ВБА, као што је опсег, видећете искачућу листу свих доступних својстава и метода. Ово не добијате помоћу објекта Арраи Лист, а понекад је потребна пажљива провера да бисте се уверили да сте правилно написали метод или својство.
Такође, ако притиснете Ф2 у прозору ВБЕ и потражите „арраилист“, ништа се неће приказати, што програмерима није од велике помоћи.
Ваш код ће се изводити знатно брже са раним везивањем, јер је све унапред компајлирано. Са касним везивањем, објекат се мора компајлирати док се код извршава
Дистрибуција ваше Екцел апликације која садржи листу низа
Као што је већ истакнуто, објекат АрраиЛист није део Екцел ВБА. То значи да било која од ваших колега којима дистрибуирате апликацију мора имати приступ датотеци „мсцорлиб.тлб“
Ова датотека се обично налази на:
Ц: \ Виндовс \ Мицрософт.НЕТ \ Фрамеворк \ в4.0.30319
Могло би бити вредно написати неки код (коришћењем Дир методе) да бисте проверили да ли ова датотека постоји када корисник учита апликацију тако да доживи „меко слетање“ ако није пронађено. Ако није присутан, а код ради, доћи ће до грешака.
Такође, корисник мора имати инсталирану исправну .Нет Фрамеворк верзију. Чак и ако корисник има новију верзију, В3.5 мора бити инсталиран иначе ваша апликација неће радити
Опсег објекта листе арраи
Што се тиче обима, објекат Арраи Лист је доступан само док је радна свеска отворена. Не чува се када се сачува радна свеска. Ако се радна свеска поново отвори, потребно је поново креирати објект Арраи Лист помоћу ВБА кода.
Ако желите да ваша листа низова буде доступна свим кодовима у вашем кодном модулу, тада морате да декларишете објекат листе низа у одељку Декларација на самом врху прозора модула
Ово ће осигурати да сав ваш код унутар тог модула може приступити Арраи Лист. Ако желите да било који модул у вашој радној свесци приступа објекту Арраи Лист, дефинишите га као глобални објекат
1 | Глобал МиЦоллецтион Ас Нев АрраиЛист |
Попуњавање и читање са ваше листе поља
Најосновнија радња коју желите да предузмете је да направите листу низа, у њу унесете неке податке, а затим докажете да се подаци могу читати. Сви примери кода у овом чланку претпостављају да користите рано везивање и додали су „мсцорлиб.тлб“ у ВБА референце, као што је горе описано
123456789101112 | Суб АрраиЛистЕкампле ()„Направи нови објекат листе пољаДим МиЛист Ас Нев АрраиЛист„Додајте ставке на листуМиЛист.Адд "Итем1"МиЛист.Адд "Итем2"МиЛист.Адд "Итем3"„Поновите листу низа да бисте доказали вредностиЗа Н = 0 до МиЛист.Цоунт - 1МсгБок МиЛист (Н)Следећи Н.Енд Суб |
Овај пример ствара нови АрраиЛист објекат, попуњава га са 3 ставке и понавља кроз листу која приказује сваку ставку.
Имајте на уму да индекс АрраиЛист почиње са 0, а не са 1, па морате одузети 1 од вредности Цоунт
Такође можете да користите петљу „За … свако“ да бисте прочитали вредности:
123456789101112 | Суб АрраиЛистЕкампле ()„Направи нови објекат листе пољаДим МиЛист Ас Нев АрраиЛист„Додајте ставке на листуМиЛист.Адд "Итем1"МиЛист.Адд "Итем2"МиЛист.Адд "Итем3"„Поновите листу низа да бисте доказали вредностиЗа свакога на мојој листиМсгБок ИЗатим самЕнд Суб |
Уређивање и промена ставки на листи низа
Главна предност Арраи Лист -а над Цоллецтион -ом је то што се ставке на листи могу уређивати и мењати унутар вашег кода. Објекат Цоллецтион је само за читање, док се објекат Арраи Лист чита / пише
123456789101112131415 | Суб АрраиЛистЕкампле ()„Направи нови објекат листе пољаДим МиЛист Ас Нев АрраиЛист„Додајте ставке на листуМиЛист.Адд "Итем1"МиЛист.Адд "Итем2"МиЛист.Адд "Итем3"„Промените ставку 1 из„ Ставка 2 “у„ Промењено “МиЛист (1) = "Промењено"„Поновите листу низова да бисте доказали да је промена успелаЗа свакога на мојој листи„Прикажите назив ставкеМсгБок ИЗатим самЕнд Суб |
У овом примеру, друга ставка, „Ставка2“ је промењена у вредност „Промењено“ (запамтите да индекс почиње на 0). Када се итерација покрене на крају кода, приказаће се нова вредност
Додавање низа вредности на листу низа
Можете унети вредности у своју листу низа помоћу низа који садржи листу ових вредности или референце на вредности ћелија на радном листу
123456789101112131415161718 | Суб АддАрраиЕкампле ()„Направи објекат листе арраиДим МиЛист Ас Нев АрраиЛист„Понављајте низ вредности низа додајући их на листу низаЗа сваки в низу ("А1", "А2", "А3")„Додајте сваку вредност низа на листуМиЛист.Адд вСледећи„Пролазите кроз вредности низа са референцама радног листа додајући их на листу низаЗа сваки низ у низу (опсег ("А5"). Вредност, опсег ("А6"). Вредност)МиЛист.Адд вСледећи„Поновите листу низа да бисте доказали вредностиЗа Н = 0 до МиЛист.Цоунт - 1„Прикажи ставку листеМсгБок МиЛист.Итем (Н)Следећи Н.Енд Суб |
Читање / Преузимање низа ставки са листе поља
Коришћењем методе ГетРанге на листи низа, можете одредити низ узастопних ставки које треба преузети. Два потребна параметра су почетна позиција индекса и број ставки које треба преузети. Код попуњава други објект Арраи Лист са подскупом ставки које се затим могу засебно читати.
123456789101112131415161718 | Суб РеадРангеЕкампле ()‘Дефинишите објектеДим МиЛист Ас Нев АрраиЛист, МиЛист1 Ас Објецт„Додајте ставке објекту„ Моја листа “МиЛист.Адд "Итем1"МиЛист.Адд "Итем2"МиЛист.Адд "Итем3"МиЛист.Адд "Итем6"МиЛист.Адд "Итем4"МиЛист.Адд "Итем7"„Снимите 4 ставке на„ МиЛист “почевши од индексне позиције 2Постави МиЛист1 = МиЛист.ГетРанге (2, 4)„Поновите кроз објекат„ МиЛист1 “да бисте приказали подскуп ставкиЗа свакога на мојој листи1„Прикажите назив ставкеМсгБок ИЗатим самЕнд Суб |
Тражење ставки унутар листе низа
Можете тестирати да ли се именована ставка налази на вашој листи помоћу методе „Садржи“. Ово ће вратити Тачно или Нетачно
1 | МсгБок МиЛист.Цонтаинс ("Итем2") |
Стварну позицију индекса можете пронаћи и помоћу методе „ИндекОф“. За претрагу морате навести почетни индекс (обично 0). Повратна вредност је индекс прве инстанце пронађене ставке. Затим можете помоћу петље променити почетну тачку на следећу вредност индекса да бисте пронашли даље инстанце ако постоји неколико дуплираних вредности.
Ако вредност није пронађена, враћа се вредност -1
Овај пример демонстрира коришћење ставке „Садржи“, ставка није пронађена и петља кроз листу низа да би се пронашао положај свих дуплираних ставки:
1234567891011121314151617181920212223242526 | Суб СеарцхЛистЕкампле ()„Дефинишите листу низа и променљивеДим МиЛист Ас Нев АрраиЛист, Сп Ас Интегер, Пос Ас Интегер„Додајте нове ставке, укључујући и дупликатМиЛист.Адд "Итем1"МиЛист.Адд "Итем2"МиЛист.Адд "Итем3"МиЛист.Адд "Итем1"„Тест да ли је„ Итем2 “на листи - враћа ТруеМсгБок МиЛист.Цонтаинс ("Итем2")„Набавите индекс непостојеће вредности -враћа -1МсгБок МиЛист.ИндекОф ("Ставка", 0)„Подесите почетну позицију претраживања на нулуСп = 0„Поновите листу да бисте добили све позиције„ ставке 1 “Урадити„Добијте индексну позицију следеће„ ставке1 “на основу позиције у променљивој„ Сп “Пос = МиЛист.ИндекОф ("Итем1", Сп)„Ако се не пронађу додатне инстанце„ ставке 1 “, изађите из петљеАко је Пос = -1, изађите из До„Прикажите следећу пронађену инстанцу и положај индексаМсгБок МиЛист (Пос) & "ат индек" & Пос„Додајте 1 последњој пронађеној вредности индекса - ово сада постаје нова почетна позиција за следећу претрагуСп = Пос + 1ЛоопЕнд Суб |
Имајте на уму да се у тексту за претрагу разликују велика и мала слова и да се не прихватају.
Уметање и уклањање ставки
Ако не желите да додате своје ставке на крај листе, можете их уметнути на одређену позицију индекса тако да се нова ставка налази на средини листе. Индексни бројеви ће се аутоматски прилагодити за наредне ставке.
123456789101112131415 | Суб ИнсертЕкампле ()„Дефинишите објекат листе пољаДим МиЛист Ас Нев АрраиЛист„Додајте ставке на листу низаМиЛист.Адд "Итем1"МиЛист.Адд "Итем2"МиЛист.Адд "Итем3"МиЛист.Адд "Итем1"„Уметните„ Ставка 6 “на позицију индекса 2МиЛист.Инсерт 2, "Итем6"„Поновите ставке на листи поља да бисте приказали нови редослед и позицију индексаЗа Н = 0 до МиЛист.Цоунт - 1МсгБок МиЛист (Н) & "Индек" & НСледећи Н.Енд Суб |
У овом примеру, „Ставка6“ се додаје на листу на позицији индекса 2, тако да се „ставка3“ која је била на позицији индекса 2 сада помера на позицију индекса 3
Појединачна ставка може се уклонити методом „Уклони“.
1 | МиЛист.Ремове "Итем" |
Имајте на уму да нема грешке ако назив ставке није пронађен. Сви накнадни индексни бројеви биће промењени тако да одговарају уклањању.
Ако знате индексни положај ставке, можете користити методу „РемовеАт“, нпр.
1 | МиЛист.РемовеАт 2 |
Имајте на уму да ће, ако је дата позиција индекса већа од броја ставки у листи низа, бити враћена грешка.
Опсег вредности можете уклонити са листе помоћу методе „РемовеРанге“. Параметри су почетни индекс, а затим и број ставки за уклањање, нпр.
1 | МиЛист.РемовеРанге 3, 2 |
Имајте на уму да ћете добити грешку у коду ако је број ставки помакнут од почетне вредности већи од броја ставки на листи низа.
И у методама „РемовеАт“ и „РемовеРанге“ било би упутно проверити да ли су наведени индексни бројеви већи од укупног броја ставки на листи низа како би се ухватиле могуће грешке. Својство „Цоунт“ ће дати укупан број ставки на листи низа.
12345678910111213141516171819202122232425 | Суб РемовеЕкампле ()„Дефинишите објекат листе пољаДим МиЛист Ас Нев АрраиЛист„Додајте ставке на листу низаМиЛист.Адд "Итем1"МиЛист.Адд "Итем2"МиЛист.Адд "Итем3"МиЛист.Адд "Итем1"МиЛист.Адд "Итем4"МиЛист.Адд "Итем5"„Уметните„ Ставка 6 “на позицију индекса 2МиЛист.Инсерт 2, "Итем6"„Уклоните„ ставку 2 “МиЛист.Ремове "Итем2"„Уклони„ ставку “ - ово не постоји на листи низа, али не грешиМиЛист.Ремове "Итем"„Уклоните ставку на позицији индекса 2МиЛист.РемовеАт 2„Уклоните 2 узастопне ставке почевши од индексне позиције 2МиЛист.РемовеРанге 3, 2„Поновите листу поља да бисте приказали шта је преостало и у којој се позицији индекса сада налазиЗа Н = 0 до МиЛист.Цоунт - 1МсгБок МиЛист (Н) & "Индек" & НСледећи Н.Енд Суб |
Имајте на уму да ако користите „РемовеАт“ за уклањање ставке на одређеној позицији, чим се та ставка уклони, све наредне позиције индекса се мењају. Ако имате више уклањања помоћу индексне позиције, добра идеја је да почнете са највећим бројем индекса и да се вратите назад до нуле, тако да ћете увек уклањати исправну ставку. На овај начин нећете имати проблема
Сортирање листе низова
Још једна велика предност у односу на колекцију је то што ставке можете сортирати према растућем или опадајућем редоследу.
Објекат Арраи Лист је једини објекат у Екцел ВБА са методом сортирања. Метода сортирања је веома брза и ово може бити важан фактор за коришћење листе низа.
У објекту за прикупљање било је потребно неко размишљање „ван кутије“ за сортирање свих ставки, али са листом низа је врло једноставно.
Метода „Сортирај“ сортира се узлазним редоследом, а метода „Обрни“ сортира се опадајућим редоследом.
12345678910111213141516171819202122 | Суб АрраиЛистЕкампле ()„Направи објекат листе арраиДим МиЛист Ас Нев АрраиЛист„Додајте ставке неразврстаним редоследомМиЛист.Адд "Итем1"МиЛист.Адд "Итем3"МиЛист.Адд "Итем2"„Сортирајте ставке у растућем редоследуМиЛист.Сорт„Поновите ставке да бисте приказали растући редоследЗа свакога на мојој листи„Прикажите назив ставкеМсгБок ИЗатим сам„Сортирајте ставке у опадајућем редоследуМиЛист.Реверсе„Поновите ставке да бисте приказали опадајући редоследЗа свакога на мојој листи„Прикажите назив ставкеМсгБок ИЗатим самЕнд Суб |
Клонирање листе низова
Листа низа има могућност стварања клона или копије себе. Ово је корисно ако корисник унесе измене у ставке помоћу предњег краја и вашег ВБА кода, али морате да чувате копију ставки у њиховом изворном стању као резервну копију.
Ово би кориснику могло омогућити функцију „Поништи“. Можда су унели измене и желе да се врате на оригиналну листу.
123456789101112131415 | Суб ЦлонеЕкампле ()„Дефинишите два објекта - листу низа и објекатДим МиЛист Ас Нев АрраиЛист, МиЛист1 Ас Објецт„Напуните први објекат ставкамаМиЛист.Адд "Итем1"МиЛист.Адд "Итем2"МиЛист.Адд "Итем3"„Копирајте моју листу на МиЛист1Постави МиЛист1 = МиЛист.Цлоне„Поновите МиЛист1 да бисте доказали клонирањеЗа свакога на мојој листи1„Прикажите назив ставкеМсгБок ИЗатим самЕнд Суб |
„МиЛист1“ сада садржи све ставке из „МиЛист“ истим редоследом
Копирање листе листе у конвенционални ВБА објект низа
Можете користити једноставан метод за копирање листе низа у уобичајени ВБА низ:
123456789101112131415 | Пример подмаре ()„Креирајте објекат листе поља и стандардни објекат низаДим МиЛист Ас Нев АрраиЛист, НевАрраи Ас Вариант„Попуни листу поља са ставкамаМиЛист.Адд "Итем1"МиЛист.Адд "Итем2"МиЛист.Адд "Итем3"„Копирајте листу низа у нови низНевАрраи = МиЛист.ТоАрраи„Итерација кроз нови низ - имајте на уму да број листа поља пружа максимални индексЗа Н = 0 до МиЛист.Цоунт - 1„Прикажите назив ставкеМсгБок НевАрраи (Н)Следећи Н.Енд Суб |
Копирање поља листе у опсег радног листа
Можете да копирате листу низа на одређени радни лист и референцу ћелије без потребе за понављањем кроз листу низа. Потребно је само да наведете прву референцу ћелије
123456789101112131415 | Пример под опсега ()„Направи нови објекат листе пољаДим МиЛист Ас Нев АрраиЛист„Додајте ставке на листуМиЛист.Адд "Итем1"МиЛист.Адд "Итем2"МиЛист.Адд "Итем3"„Очистите циљни листСхеетс ("Схеет1"). УседРанге.Цлеар„Копирајте ставке у низТабеле („Лист1“). Опсег („А1“). Промена величине (1, МиЛист.Цоунт) .Валуе = МиЛист.тоАрраи„Копирајте ставке у колонуТабеле („Лист1“). Распон („А5“). Промена величине (МиЛист.Цоунт, 1) .Вредност = _ВорксхеетФунцтион.Транспосе (МиЛист.тоАрраи)Енд Суб |
Испразните све ставке са листе низова
Постоји једноставна функција (Цлеар) за потпуно брисање листе низа
1234567891011121314 | Суб ЦлеарЛистЕкампле ()„Направи објекат листе пољаДим МиЛист Ас Нев АрраиЛист„Додајте нове ставкеМиЛист.Адд "Итем1"МиЛист.Адд "Итем2"МиЛист.Адд "Итем3"„Прикажи број ставкиМсгБок МиЛист.Цоунт‘Обриши све ставкеМиЛист.Цлеар„Покажите број ставки да бисте доказали да је јасно радилоМсгБок МиЛист.ЦоунтЕнд Суб |
Овај пример ствара ставке на листи поља, а затим брише листу поља. Оквири за поруке доказују пре и после броја ставки на листи поља.
Резиме метода листе низова за Екцел ВБА
Задатак | Параметри | Примери |
Додај / измени ставку | Вредност | МиЛист.Адд “Итем1” |
МиЛист (4) = „Ставка 2“ | ||
Клонирајте листу низа | Ниједан | Дим МиЛист Ас Објецт |
Поставите МиЛист2 = МиЛист.Цлоне | ||
Копирај у поље | Ниједан | Дим МиАрраи као варијанта |
МиАрраи = МиЛист.ТоАрраи | ||
Копирај у опсег радног листа (ред) | Ниједан | Табеле („Лист 1“). Распон („А1“). Промена величине (1, МиЛист.Цоунт) .Валуе = МиЛист.ТоАрраи |
Копирај у опсег радног листа (колона) | Ниједан | Табеле („Схеет1“). Распон („А3“). Промена величине (МиЛист.Цоунт, 1) .Валуе = ВорксхеетФунцтион.Транспосе (МиЛист.ТоАрраи) |
Креирај | „Систем.Цоллецтионс.АрраиЛист“ | Дим МиЛист Ас Објецт |
Постави МиЛист = ЦреатеОбјецт (“Систем.Цоллецтионс.АрраиЛист”) | ||
Децларе | Н/А | Дим МиЛист Ас Објецт |
Пронађите / проверите да ли ставка постоји | Ставка за проналажење | МиЛист.Цонтаинс („Итем2“) |
Пронађите позицију ставке у АрраиЛист | 1. Ставка за проналажење. | Дим ИндекНо Ас Лонг |
2. Положај одакле ћете започети претрагу. | ИндекНо = МиЛист.ИндекОф (“Итем3”, 0) | |
ИндекНо = МиЛист.ИндекОф (“Итем5”, 3) | ||
Добијте број ставки | Ниједан | МсгБок МиЛист.Цоунт |
Уметни ставку | 1. Индекс - позиција за уметање. | МиЛист.Инсерт 0, „Итем5“ |
2 Вредност - објекат или вредност за уметање. | МиЛист.Инсерт 4, „Итем7“ | |
Прочитајте ставку | Индекс - дугачак цео број | МсгБок МиЛист.Итем (0) |
МсгБок МиЛист.Итем (4) | ||
Прочитана ставка последња додата | Индекс - дугачак цео број | МсгБок МиЛист.Итем (лист.Цоунт - 1) |
Прво прочитајте ставку која је додата | Индекс - дугачак цео број | МсгБок МиЛист.Итем (0) |
Прочитајте све ставке (за сваку) | Н/А | Затамњени елемент као варијанта |
За сваки елемент у МиЛист | ||
МсгБок елемент | ||
Следећи елемент | ||
Прочитајте све ставке (За) | Индекс - дугачак цео број | Дим и Ас Лонг |
За и = 0 до МиЛист.Цоунт - 1 | ||
МсгБок и | ||
Затим сам | ||
Уклоните све ставке | Ниједан | МиЛист.Цлеар |
Уклоните ставку на месту | Индексна позиција на којој се налази ставка | МиЛист.РемовеАт 5 |
Уклоните ставку по имену | Ставка за уклањање са АрраиЛист | МиЛист.Ремове “Итем3” |
Уклоните низ ставки | 1. Индекс - почетна позиција. | МиЛист.РемовеРанге 4,3 |
2. Цоунт - број ставки које треба уклонити. | ||
Сортирај опадајућим редоследом | Ниједан | МиЛист.Реверсе |
Сортирајте по растућем редоследу | Нон | МиЛист.Сорт |