Масиви във Visual Basic for Application

Масивите във Visual Basic for Application са структури, които обикновено съхраняват набори от свързани променливи от един и същи тип. Записите в масива са достъпни чрез техния цифров индекс.

Например, има екип от 20 души, чиито имена трябва да бъдат запазени за по-късна употреба във VBA код. Човек може просто да декларира 20 променливи, които да съдържат всяко име, така:

Dim Team_Member1 като низ Dim Team_Member2 като низ ... Dim Team_Member20 като низ

Но можете да използвате много по-прост и организиран начин – да съхраните списък с имена на членове на екипа в масив от 20 променливи като Низ:

Dim Team_Members(1 To 20) като низ

В показания по-горе ред сме декларирали масив. Сега нека напишем стойност на всеки от неговите елементи, както следва:

Team_Members(1) = "Джон Смит"

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

Как работи е демонстрирано по-долу с примерен код, който отпечатва имената на всеки член на екипа последователно в клетките на колоните. A активен работен лист на Excel.

За i = 1 до 20 клетки (i,1). Стойност = Team_Members (i) Следващ i

Очевидно работата с масив, който съхранява 20 имена, е много по-малко тромава и по-точна от използването на 20 отделни променливи. Но какво ще стане, ако тези имена не са 20, а 1000? И ако освен това се изисква да се пазят отделно фамилиите и бащините имена?! Ясно е, че скоро ще стане напълно невъзможно да се борави с такъв обем данни във VBA код без помощта на масив.

Многомерни масиви в Excel Visual Basic

Обсъдените по-горе масиви на Visual Basic се считат за едномерни. Това означава, че те съхраняват прост списък с имена. Масивите обаче могат да имат множество измерения. Например, двуизмерен масив може да се сравни с решетка от стойности.

Да приемем, че искате да запазите дневните данни за продажбите за януари за 5 различни отбора. Това ще изисква двуизмерен масив, състоящ се от 5 комплекта показатели за 31 дни. Нека декларираме масив по следния начин:

Dim Jan_Sales_Figures(1 до 31, 1 до 5) като валута

За достъп до елементите на масива Януари_Продажби_Цифри, трябва да използвате два индекса, указващи деня от месеца и номера на командата. Например адресът на елемент, съдържащ данни за продажби за 2-о екипи за 15-та януари ще бъде написан така:

Януари_Продажби_Цифри(15, 2)

По същия начин можете да декларирате масив с 3 или повече измерения – просто добавете допълнителни измерения към декларацията на масива и използвайте допълнителни индекси, за да се обърнете към елементите на този масив.

Деклариране на масиви в Excel Visual Basic

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

Dim Team_Members(1 To 20) като низ

Такава декларация казва на VBA компилатора, че масивът Членове на отбора се състои от 20 променливи, които могат да бъдат достъпни с индекси от 1 до 20. Може обаче да помислим да номерираме променливите на нашия масив от 0 до 19, в който случай масивът трябва да бъде деклариран по следния начин:

Dim Team_Members(0 To 19) като низ

Всъщност по подразбиране номерирането на елементите на масива започва от 0 и в декларацията на масива началният индекс може изобщо да не е посочен, както следва:

Dim Team_Members(19) като низ

Компилаторът на VBA ще третира такъв запис като деклариращ масив от 20 елемента с индекси от 0 до 19.

Същите правила се прилагат при деклариране на многомерни Visual Basic масиви. Както вече беше показано в един от примерите, когато се декларира двумерен масив, индексите на неговите измерения се разделят със запетая:

Dim Jan_Sales_Figures(1 до 31, 1 до 5) като валута

Ако обаче не посочите начален индекс за двете измерения на масива и го декларирате по следния начин:

Dim Jan_Sales_Figures(31, 5) Като валута

тогава този запис ще се третира като двумерен масив, чието първо измерение съдържа 32 елемента с индекси от 0 до 31, а второто измерение на масива съдържа 6 елемента с индекси от 0 до 5.

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

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

Динамичен масив се декларира с празни скоби, както следва:

Dim Team_Members() като низ

След това ще трябва да декларирате размерността на масива по време на изпълнение на кода, като използвате израза ReDim:

ReDim Team_Members (1 до 20)

И ако по време на изпълнението на кода трябва отново да промените размера на масива, тогава можете отново да използвате израза ReDim:

If Team_Size > 20 Then ReDim Team_Members(1 To Team_Size) End If

Имайте предвид, че преоразмеряването на динамичен масив по този начин ще доведе до загуба на всички стойности, съхранени в масива. За да съхранявате данни, които вече са в масива, трябва да използвате ключовата дума резерваткакто е показано по-долу:

If Team_Size > 20 Then ReDim Preserve Team_Members(1 To Team_Size) End If

За съжаление ключовата дума резерват може да се използва само за промяна на горната граница на измерение на масив. Долната граница на масив не може да се променя по този начин. Освен това, ако масивът има множество измерения, тогава използвайте ключовата дума резерват, само последното измерение на масива може да бъде преоразмерено.

Оставете коментар