Масивите в VBA - макроси и VBA програма - превъзхождат - Статии Directory - перфектен ексел
Защо масиви
Масивите значително опростяват процеса на програмиране. Без тях е почти невъзможно да се напише една универсална програма. Например, представете си, че сте се манипулира информация за жилищната сграда. Вие декларирате променливи K1 - за първи апартамента, К2 - втория и така нататък. K1 = 54 би означавало, че на първия плосък площ от 54 кв.м. К2 = 72 и т.н. Сега си представете, че трябва да се изчисли общата площ на всички апартаменти в къщата. Очевидно е, че това е нещо като Total_S = К1 + К2 +. + Кн. В една къща имаме 36 апартамента, а в другата 144. Представете налудно процес на този програмен? В първия случай ще трябва да използвате 36 отделни променливи, за да се изчисли общата площ, втората къща е 144. Много бързо дойде с идеята, че трябва променлива, която се състои от номерирани клетки. Тогава има смисъл всички цикли на операторите, които са част от всеки език за програмиране. Но по-късно по този въпрос.
Какво е масив
Array - променлива, състояща се от няколко подобни елементи. В масива, като всяка друга променлива, има име. И достъп до определен елемент на масива се извършва, като се посочва в скоби след името на своя индекс. Например, (5) означава, че се отнася до елемент, с индекс масив 5 като името А.
масивни типове
Масивите в VBA, както и много други програмни езици са разделени в 2 класа:
Динамичните масиви. Тези масиви могат да бъдат "отново декларира" в жизнения цикъл на процесите. Това означава, че можем да контролираме броя на елементите на динамичните диапазони покрива, в зависимост от нуждите ни. Това е много удобно, защото в повечето случаи, програмист не може да знае предварително, с който и да е количество данни ще се изправи. Ако имате намерение да пиша повече или по-малко универсални програми, а след това този тип масив е определено си струва да изследвате.
Както можем да видим, че има обяви 2-мерен масив arrTemp и arrTest. Едномерни масиви в програмирането е също често се наричат вектори. Тип елементи от първия масив е дълъг. вторият масив - String. При този вид синтаксис в скоби показва максимален индекс (горна граница) на елемент на масива. Какво да кажем за минимален индекс (долната граница) на масива? По подразбиране, минималната индекса е нула. В този случай, поведението по подразбиране на VBA преводач на езика може да бъде променена с помощта на опцията база оператор. Вариант 1 база причинява VBA да обмисли по-ниска граница на масив - един, а не нула.
По този начин, по подразбиране arrTemp масив има 11 елемента - от 0 до 10. Въпреки това, ако в началото на модула, в която се декларира масив, поставете Вариант базата оператор 1. arrTemp масива ще има 10 елемента - от 1 до 10.
В допълнение към по-горе, можете да използвате следния синтаксис, който не зависи от опцията база:
така че изрично уточнява и долните и горните граници. Както можете да видите, долната граница е не непременно трябва да започва с 0 или 1. Освен това, индексите на граници могат да поемат отрицателни стойности, най-важното, че е по-малко от долната върха.
В допълнение към едномерни, можете да декларират и масиви с размер по-голям от един.
arrMulti - двумерен масив, и arrData3 - триизмерен. Първият съдържа 11 * 31 = 341 елемент, а вторият - 2 * 3 * 10 = 60 елементи. Теоретично оставя да се декларира масив до 60 размери.
Динамичните масиви са декларирани като това:
ReDim [Запазване] VARNAME (индекси) [Както Type]
След това изявление, можете да използвате елементи масив arrOpen 0-ти до 5-ти. Всичко, което сме казали за избор на базата от оператор и долна граница се отнася и за динамични масиви. Да приемем, че сте записали информацията в елементите 0-5 и имате нова информация узрели за елементи от 6-11. За да се постави в масива на нови елементи, а не да губи старото, трябва да направите следното:
тоест, ние сме увеличаване на горната граница на масива и да използвате ключовата дума резерват. че по време на тази операция, не губи съдържанието на текущата arrOpen. тъй като в противен случай (без думата резерват) масив ще бъде удължен, а паметта е пълна с нули. Можете също така да не декларират масив изявление Дим. и да го направи за първи път през ReDim и съща точка липи елементи. Но, ако сте в първата ReDim (или Dim) показват, определен тип елементи, в следните твърдения ReDim този тип отменено не може да бъде - грешка при съставяне на проекта.
Промяна масив
Време е за нас да се наложи да се научите да използвате нашите масиви - това е, за да записва информация в техните елементи, и го прочете от там. Това е доста проста:
Както при конвенционален променлива запис на информация в елемент на масива се осъществява чрез оператора за присвояване (=), но елемент индикация на индекса на масив.
четене масив
Определяне на границите на масива
Подпрограмите често трябва да се справят с файлове, които са прехвърлени на вас, като параметър (как да направите това по-долу), така че в този случай, е много актуален въпрос на определяне на долните и горните граници на индекса на масива. За да направите това, в езика има 2 функции: LBound и UBound. Първият се връща на долната граница на индекса, второ - горната.
LBound (масив [измерение])
UBound (масив [измерение])
За едномерни на параметър измерение може да се пропусне. За многомерни масиви е необходимо да се уточни. Между другото, това означава, че, ако не сте сигурни как да има набор от бизнес, но трябва да го научите първи измерение, най-добре е да се използва вариант UBound (arrTemp, 1). вместо UBound (arrTemp). като последен вариант ще се провали, ако масивът ще бъде многоизмерен.
Ако направите грешка с правилния индекса на масива, там е по време на изпълнение на код за грешка 9. Същата тази грешка възниква, ако LBound функция / UBound уточни несъществуваща измерение масив (например, 3 за двумерен масив).
Се изпълнява за масива
Всъщност масиви са необходими, за да се съхранява и същ вид информация в тях и чрез тях в течение. Като правило, алгоритъмът прави нещо полезно с един от елементите на масива, и цикълът се повтаря тези стъпки за всички стандартни елементи на масива.
Най-удобният оператора да контур чрез елементите на масив - то със сигурност За. Напред.
налице е и начин да не се притеснявате за определяне на долните и горните граници, ако алгоритъмът не изисква познанията ни за индекса на текущия масив:
Разбира се, можете да сортирате чрез масива, а в други видове цикли Do. Loop. но наистина, смисъла и удобство, това не е много. Поне аз не се сблъскате изглежда ситуации, в които да обхождане на масива За контур не се приближи.
Минавайки Масивите в подпрограми
Масивите са най-удобните за предаване на рутината като параметър от тип Variant.
Имайте предвид, че функцията GetResult масиви се предават като параметър. С това, в първия случай е масив от тип дълги предмети. а във втория - низ. Поради факта, че в рамките на една функция използва променливи от тип Variant. първата функция се върнем сумата от масив елементи arrIntegers. и във втория добавянето доведе редове масив (конкатенация) arrStrings. В допълнение, parArray опция не е описан като масив (parArray Като вариант), но ние сме в GetResult функции се държат с него като с множество (за всеки елемент В parArray)! Това е възможно, защото променливите от тип Variant в състояние да определят какво им се дават и продължават да се държат в съответствие с това, което те съдържат. Ако променливата е назначена parArray масив (чрез извикване на функция - линии 17 и 18), той ще се държи като масив.
масив елементи тип масив
Ние показваме как да се съхранява и други масиви от масив елементи.
Резултат за отстраняване на грешки за печат:
Array функция
Тази функция е полезна за създаване на референтен масив. Тя връща променлива от тип Variant. съдържащ едномерен масив тип Вариант елементи.
Array (arglist)
Извикването на функциите без параметри ще доведе да се върне масив с дължина нула. В същото време ще има интересен ефект LBound 0 ще се върне към вас, и UBound върне -1, което означава, че горната граница е по-малко от долната граница.
Сплит функция
Сплит връща едномерен масив, съдържащ поднизове на изразите низ от гледна точка на сепаратора
Сплит (експресия [, разделител [, граница [сравните]]])
изразяване - А низ експресия, съдържащ поднизове и разделители. Задължително.
разделител - разделител на текст. Не е задължително. Ако бъде пропуснат, се приема, че сепаратора е празно място.
ограничение - броят на подниз да бъдат върнати. -1 или липсата му означава, че е необходимо да се върне всички поднизове.
сравнение - Константа, който определя вида на сравнение за разделители. 1 - текстова сравнение (без счетоводни регистри) 0 - двоично сравнение (главни и малки букви).
Резултатът изглежда така:
Ако сте като разделител уточни празен низ, а след това на изхода ще получите масив, който се състои от един елемент. Между другото, сплит винаги връща масив с нулева долната граница без никаква зависимост от наличността опция база 1.
Нюансите на работа с динамични масиви
неподготвена масив
В динамичния масив, има междинно състояние, когато тя вече е обявена, но тя все още не съдържа никакви елементи.
Това означава, че променливата динамичен масив имате състояние, в което не можем да използваме помощни функции LBound / UBound да се определи (масив) Статутът. Това е особено необходимо да се вземат предвид, когато пишете съчетания, които работят с масиви. Преди да започнете работа (да се докоснат) на масива, трябва да гарантира, че тя се инициализира, в противен случай програмата ще вземат с грешка 9.
За тази цел се предлага да се използва функция, подобна на по-долу е описано IsNotEmptyArray:
Разширяване масив
Като правило, което трябва да се разшири динамичния масив в една линия. Има 2 възможни стратегии: разширение от 1 елемент, веднага след като той е необходим и разширението (това гъвкаво разширение наричат) по-рано, когато се увеличи горната граница на скокове, да речем веднъж на 100 артикула. Чрез предоставянето на двете, за себе си, стигнах до извода, че разширението на аванса и са по-малки и по-бързо, тъй като разширяването на дейността като цяло, скъпо и по-рядко ползвана, толкова по-добре.
Първа излезе още по-компактен метод
Евакуация масив
Има Erase изявление. който напълно освобождава паметта от динамичния масив. Като призова за статичен масив го нулира, и ако това е низ, елементът се възлага на празен низ.
Първи масив въз основа на набор Excel
Най-ефективният начин да се получи скоростта на съдържанието на границите Excel за манипулиране на VBA - е да го копирате в масива на Вариант елементи. Това е, както следва:
Дори и да премине в масив на ред или колона, полученият масив винаги ще има две измерения. Измерване 1 е отговорен за линиите, с размери 2 - за колони. Това означава, че C5 клетка ще arrTemp елемент (5,3). Долната граница на такива масиви винаги ще започне с уреда.