VBA - Деклариране (Dim), създаване и инициализиране на променлива на масива

Този урок ще покаже как да декларирате (Dim), създавате и инициализирате променливи на масиви във VBA

Какво е променлива VBA масив?

Променлива от масив VBA може да се разглежда като група от променливи, съхранявани под едно и също име и със същия тип данни. Масивът може да съхранява текст, числа или обекти.

Позовавате се на елемент в масив, като използвате неговия индексен номер.

Можете да декларирате променлива на масив по същия начин, както бихте декларирали всяка друга променлива, като използвате ключовата дума Dim, Static, Public или Private.

Статични масиви

Има 2 вида масиви - статичен и динамичен. Статичен масив се декларира с посочен размер, когато първоначално декларирате масива. Нарича се още фиксиран масив.

1 Dim intA (4) като цяло число

Горният масив се декларира с помощта на оператора Dim на ниво процедура или модул, а размерът на масива е 5, тъй като не сме декларирали стойността LBound на масива.

Не, това не е правописна грешка! Размерът на масива е 5, въпреки че е въведен 4 в масива. Това е така, защото индексите на масиви автоматично започват от нула.

Индекси на масиви

Индексите на масиви автоматично започват от нула, освен ако Вариантна база 1 е деклариран в горната част на вашия кодов модул.

Ако Вариантна база 1 е деклариран, тогава масивите автоматично ще започнат от 1.

Намирам обаче, че декларирането на променливи по такъв начин е проблематично. Преглеждащите кодове може да не са наясно, че масивите започват от нула или от декларацията Option Base 1

Вместо това предпочитам изрично да декларирам началната и крайната позиция на масивите:

1 Dim intA (2 до 5) като цяло число

Забележете, че когато го направите, можете да стартирате масива на произволен номер (не само 1 или 0).

Динамични масиви

Променливата Dynamic Array е масив, чийто размер може да се променя по време на изпълнение. Декларирате динамични променливи без размер.

1 Dim intA () като цяло число

Можете да използвате оператора ReDim, за да посочите размера на масива след създаването на масива.

1 ReDim intA (2)

Можете да преоразмерите динамичен масив по всяко време. Когато обаче се използва ReDim Statement, всички съществуващи стойности се изтриват. За да запазите съществуващите стойности на масива, използвайте ReDim Preserve вместо.

1 ReDim Preserve intA (2)

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

Вариантни масиви

Вариантните масиви са динамични масиви, с които е по -лесно да се работи.

1 Dim varNames ()

Забележете, че не е нужно да посочвате типа данни (предполага се, че е вариант) или размера на масива.

Както ще видим по -долу, можете да инициализирате вариационни масиви с помощта на функцията Array (няма нужда първо да преоразмерявате масивите)!

Деклариране на модул и публични масиви

Както е показано по -горе, масивите могат да бъдат декларирани в рамките на процедури, за използване в рамките на тази процедура:

1234 Sub StaticArray ()'декларирайте масива със стойност LBound 1 и UBound стойност 4Dim IntA (1 до 4) като цяло числоEnd Sub

Но те също могат да бъдат декларирани на модулно или глобално ниво.

1234567 Опция Изрично'декларирайте масива със стойност LBound 1 и UBound стойност 4Dim IntA (1 до 4) като цяло числоSub StaticArray ()End Sub

В този пример променливата на масива може да бъде извикана навсякъде в този кодов модул. Вместо това можете да декларирате публичен масив, който може да се използва във вашия VBA проект (вижте следващия раздел).

Деклариране на публичен масив

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

1 Публични strNames (3) като String

Тази декларация трябва да е в горната част на вашия модул, под Option Explicit. След това може да се използва във вашия VBA проект във всеки модул или процедура.

Ако декларирате масива в горната част на модула, но с ключовата дума Dim, тогава използването на този масив е ограничено до този отделен модул. Опитът да се използва масивът в отделен модул би довел до грешка.

Инициализирайте масиви

Можете да присвоите стойности на статичен масив по следния начин.

1234567891011 Sub StaticArray ()'декларирайте масива със стойност LBound 1 и UBound стойност 4Dim IntA (1 до 4) като цяло число'инициализирайте масиваIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'покажете резултата от позиция 2 на масива в непосредствения прозорецDebug.Print IntA (2)End Sub

Ако изпълните горната процедура, стойността на 20 ще се покаже в непосредствения прозорец.

Можете също така да присвоите стойностите на динамичен масив по същия начин

12345678910111213 Поддинамичен масив ()'декларират динамичен масив, но пропускат свързаните стойностиDim IntA () като цяло число'инициализирайте масиваReDim IntA (1 до 4)IntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'покажете резултата от позиция 2 на масива в непосредствения прозорецОтстраняване на грешкиIntA (2)End Sub

Функция масив

Въпреки това, само с вариантния масив, можете да използвате функцията Array, която може да е по -лесна, отколкото използването на стандартния метод.

12 'попълнете масиваintA () = масив (10, 20, 30, 40)

Попълнете масив с цикъл

Можете също така да попълвате масиви, като преминете през диапазон от клетки в Excel

1234567891011121314151617 Sub TestDynamicArrayFromExcel ()'декларирайте масиваDim strNames () Като String'декларирайте цяло число, за да броите редовете в диапазонDim n като цяло число'декларира цяло число за цикълаDim i As Integer'бройте редовете в диапазонn = Диапазон ("A1", Обхват ("A1"). Край (xlDown)). Rows.Count'изрежете масива до размера на редовете в диапазона.ReDim strNames (n)За i = 0 To nstrNames (i) = Range ("A1"). Offset (i + 1, 0)Следва i'покажете стойностите в масиваПрисъединяване към MsgBox (strNames ())End Sub

Повторно инициализиране на масиви

Можете да инициализирате отново вашия масив на всеки етап от кода си, но след това ще загубите първоначалната стойност, съдържаща се в тази позиция във вашия масив.

1234567891011121314 Sub StaticArray ()'декларирайте масива със стойност LBound 1 и UBound стойност 4Dim IntA (1 до 4) като цяло число'инициализирайте масиваIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'покажете резултата от позиция 2 на масива в непосредствения прозорецDebug.Print IntA (2)'отново инициализирайте масиваintA (2) = 200Debug.Print IntA (2)End Sub

В горния пример, статичният масив ще запази всички стойности, с изключение на стойността в позиция 2 - тази стойност ще се промени на 200.

Използване на ReDim

Ако използвате динамичен масив, операторът ReDim се използва за задаване на размера на вашия масив. Можете да използвате оператора ReDim впоследствие във вашия код, за да промените размера на масива толкова пъти, колкото е необходимо. Редът с код по -долу ще преинициализира intA Array с размер 2 (Запомнете - индексът на Array започва с 0!)

1 ReDim intA (1) като цяло число

Така кодът, включващ оператора ReDim, ще изглежда като примера по -долу.

1234567891011121314151617 Sub TestDynamicArray ()'декларирайте масиваDim intA () Като цяло числоReDim intA (2)'попълнете масива с числаintA (0) = 2intA (1) = 5intA (2) = 9'покажете номера в позиция 1Debug.Print intA (1)'повторете масива, за да промените размераReDim intA (3)intA (0) = 6intA (1) = 8'този път покажете номера в позиция 1Debug.Print intA (1)End Sub

Ако изпълните горната процедура, стойността на 5 ще се покаже в непосредствения прозорец, а след това ще се покаже стойност 8, след като сме променихме размера на масива с помощта на ReDim и го заредихме отново. Тъй като обаче не сме попълнили IntA (2) и не сме използвали Re-Dim Preserve, стойността в тази позиция в масива ще бъде премахната и двете позиции 3 и 4 в масива ще бъдат нула.

Използване на ReDim Preserve

Ако използваме ReDim Preserve, той ще запази първоначалните стойности, съдържащи се в масива.

1234567891011121314151617 Sub TestDynamicArray ()'декларирайте масиваDim intA () Като цяло числоReDim intA (2)'попълнете масива с числаintA (0) = 2intA (1) = 5intA (2) = 9'покажете номера в позиция 2Debug.Print intA (2)'повторете масиваReDim intA (3)intA (0) = 6intA (1) = 8'покажете отново номера в позиция 2Debug.Print intA (2)End Sub

И в двете полета за съобщения, показани по -горе, числото 9 ще се появи, тъй като операторът ReDim Preserve запази тази стойност в това положение.

Така ще помогнете за развитието на сайта, сподели с приятелите си

wave wave wave wave wave