Променливи и константи във VBA

Във VBA, както във всеки друг език за програмиране, променливите и константите се използват за съхраняване на всякакви стойности. Както подсказва името, променливите могат да се променят, докато константите съхраняват фиксирани стойности.

Например константа Pi съхранява стойността 3,14159265... Числото "Pi" няма да се промени по време на изпълнение на програмата, но все пак е по-удобно да съхранявате такава стойност като константа.

В същото време можем да използваме променливата sVAT_ставка за съхраняване на ставката на ДДС върху закупените стоки. Променлива стойност sVAT_ставка може да варира в зависимост от закупения продукт.

Типове данни

Всички променливи и константи са от определен тип данни. Таблицата по-долу изброява типовете данни, използвани във VBA, с описание и диапазон от възможни стойности:

Тип данни РазмерОписаниеОбхват на стойностите
Байт1 байтаПоложителни цели числа; често се използва за двоични данниот 0 да 255
Булева2 байтаМоже да бъде True или FalseИстина или лъжа
цяло число2 байтаЦели числа (без дробна част)от -32 до +768
дълго4 байтаГолеми цели числа (без дробна част)от -2 147 483 648 до +2 147 483 647
единичен4 байтаЧисло с плаваща запетая с единична точностот -3.4e38 до +3.4e38
двойно8 байтаЧисло с плаваща запетая с двойна точностот -1.8e308 до +1.8e308
Валута8 байтаЧисло с плаваща запетая с фиксиран брой десетични знациот -922 337 203 685 477.5808 до +922 337 203 685 477.5807
Дата8 байтаДата и час – Данните от тип Дата се представят с число с плаваща запетая. Цялата част на това число изразява датата, а дробната част изразява часа.от 1 януари 100 г. до 31 декември 9999 г
Обект4 байтаОбектна справкаВсяка препратка към обект
Низсе променяНабор от знаци. Типът String може да бъде с фиксирана или променлива дължина. По-често се използва с променлива дължинаФиксирана дължина – до приблизително 65 знака. Променлива дължина – до приблизително 500 милиарда знака
вариантсе променяМоже да съдържа дата, float или символен низ. Този тип се използва в случаите, когато не е известно предварително какъв тип данни ще се въвеждат.Число – Double, низ – String

Очевидно, като използвате таблицата по-горе и изберете правилния тип данни, можете да използвате паметта по-икономично (например изберете типа данни цяло число вместо дълго or единичен вместо двойно). Въпреки това, когато използвате по-компактни типове данни, трябва да внимавате вашият код да не се опитва да вмести непропорционално големи стойности в тях.

Деклариране на променливи и константи

Бележка на преводача: Говорейки за променливи във VBA, си струва да споменем още един много важен момент. Ако декларираме променлива, но не й присвоим никаква стойност, тогава тя се инициализира със стойност по подразбиране:

• текстовите низове се инициализират с празни низове;

• числа — стойност 0;

• тип променливи Булева — Невярно;

• дати – 30 декември 1899г.

Преди да може да се използва променлива или константа, тя трябва да бъде декларирана. За да направите това, добавете следния прост ред код към макроса:

Dim Имя_Переменной As Тип_Данных

В горния ред код Име на променлива е името на променливата, която ще се използва в кода, и Тип_данни е един от типовете данни от таблицата, дадена малко по-рано в тази статия. Например:

Dim sVAT_Rate As Single Dim i As Integer

Константите се декларират по подобен начин, но когато се декларират константи, тяхната стойност трябва да бъде незабавно посочена. Например така:

Const iMaxCount = 5000 Const iMaxScore = 100

Не е необходимо да декларирате променливи в Excel. По подразбиране всички въведени, но недекларирани променливи в Excel ще имат типа вариант и ще може да приема както числова, така и текстова стойност.

Така програмистът може да използва новата променлива по всяко време (дори и да не е декларирана), а Excel ще я третира като променлива от тип вариант. Има обаче няколко причини, поради които това не трябва да се прави:

  1. Използване на паметта и изчислителна скорост. Ако не декларирате променлива с указание за типа данни, тогава по подразбиране тя ще бъде зададена на типа вариант. Този тип данни използва повече памет от другите типове данни. Няколко допълнителни байта на променлива може да не звучат много, но на практика програмите могат да имат хиляди променливи (особено когато работят с масиви). Следователно допълнителната памет, използвана от променливи като вариант, в сравнение с променливи от тип цяло число or единичен, може да добави значителна сума. В допълнение, операции с променливи от тип вариант се изпълняват много по-бавно, отколкото с променливи от други типове, съответно допълнителни хиляда променливи от тип вариант може значително да забави изчисленията.
  2. Предотвратяване на правописни грешки в имена на променливи. Ако всички променливи са декларирани, тогава операторът на VBA може да се използва − Опция Изрично (ще говорим за това по-късно), за да идентифицираме всички недекларирани променливи. Това елиминира появата на грешка в програмата в резултат на неправилно написано име на променлива. Например, използвайки променлива с име sVAT_ставка, можете да направите печатна грешка и, като присвоите стойност на тази променлива, напишете: „VATRate = 0,175“. Очаква се отсега нататък променливата sVAT_ставка трябва да съдържа стойността 0,175 – но, разбира се, не е така. Ако режимът на задължителна декларация на всички използвани променливи е активиран, тогава VBA компилаторът веднага ще посочи грешка, тъй като няма да намери променливата Ставка на ДДС сред обявените.
  3. Маркиране на стойности, които не съответстват на декларирания тип на променлива. Ако декларирате променлива от определен тип и се опитате да й присвоите данни от различен тип, ще получите грешка, която, ако не бъде коригирана, може да доведе до срив на програмата. На пръв поглед това може да изглежда като добра причина да не се декларират променливи, но всъщност, отколкото преди да се окаже, че една от променливите е получила грешни данни, които е трябвало да получи – толкова по-добре! В противен случай, ако програмата продължи да работи, резултатите може да са неправилни и неочаквани и ще бъде много по-трудно да се открие причината за грешките. Също така е възможно макросът да бъде изпълнен „успешно“. В резултат на това грешката ще остане незабелязана и работата ще продължи с некоректни данни!

В тази връзка е желателно да се открие неправилен тип данни и да се коригират такива грешки в кода възможно най-рано. Поради тези причини се препоръчва да декларирате всички променливи, когато пишете VBA макрос.

Опция Изрично

Оператор Опция Изрично кара всички променливи, които ще бъдат използвани във VBA кода, да бъдат декларирани и маркира всички недекларирани променливи като грешки по време на компилация (преди да започне изпълнението на кода). Прилагането на този оператор не е трудно – просто напишете този ред най-отгоре на VBA файла:

Option Explicit

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

Това се прави така:

  • От менюто на редактора на Visual Basic щракнете върху инструментите > Настроики
  • В диалоговия прозорец, който се показва, отворете раздела Редактор
  • Поставете отметка в квадратчето Изискване на декларация на променлива и натиснете OK

Когато е разрешено, низът Опция Изрично ще се вмъква автоматично в началото на всеки нов създаден модул.

Обхват на променливи и константи

Всяка декларирана променлива или константа има свой собствен ограничен обхват, т.е. ограничена част от програмата, в която тази променлива съществува. Обхватът зависи от това къде е направена декларацията на променливата или константата. Вземете например променливата sVAT_ставка, който се използва във функцията Крайна цена. Следната таблица обсъжда две опции за обхват на променлива sVAT_ставкадекларирани в две различни позиции в модула:

Опция Изрично Dim sVAT_Rate Като единична функция Total_Cost() Като двойна ... Крайна функция
Ако променливата sVAT_ставка декларирана в самото начало на модула, тогава обхватът на тази променлива ще бъде целият модул (т.е. променливата sVAT_ставка ще бъдат разпознати от всички процедури в този модул).

Следователно, ако във функцията Крайна цена променлив sVAT_ставка ще бъде присвоена някаква стойност, тогава следващата функция, изпълнена в рамките на същия модул, ще използва променливата sVAT_ставка със същото значение.

Въпреки това, ако се извика някаква функция, намираща се в друг модул, тогава за нея променливата sVAT_ставка няма да се знае.

Опция Изрична функция Total_Cost() As Double Dim sVAT_Rate As Single ... End Function
Ако променливата sVAT_ставка деклариран в началото на функцията Крайна цена, тогава неговият обхват ще бъде ограничен само до тази функция (т.е. в рамките на функцията Крайна цена, можете да използвате променливата sVAT_ставка, но не навън).

При опит за използване sVAT_ставка в друга процедура VBA компилаторът ще докладва грешка, защото тази променлива не е декларирана извън функцията Крайна цена (при условие, че се използва операторът Опция Изрично).

В примера, показан по-горе, променливата е декларирана на ниво модул с ключовата дума блед. Въпреки това може да се наложи декларираните променливи да могат да се използват в други модули. В такива случаи да декларирате променлива вместо ключова дума блед трябва да се използва ключова дума Обществен.

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

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

Следните примери показват използването на ключови думи Обществен и частен приложено към променливи и константи.

Опция Явна публична sVAT_Rate като единична публична конст iMax_Count = 5000 ...    
В този пример ключовата дума Обществен използвани за деклариране на променлива sVAT_ставка и константи iMax_Count. Обхватът на елементите, декларирани по този начин, ще бъде целият текущ проект.

Това означава, че sVAT_ставка и iMax_Count ще бъде наличен във всеки модул на проекта.

Опция Явна частна sVAT_Rate като единична частна конст iMax_Count = 5000 ...    
В този пример, за да декларирате променлива sVAT_ставка и константи iMax_Count използвана ключова дума частен. Обхватът на тези елементи е текущият модул.

Това означава, че sVAT_ставка и iMax_Count ще бъде наличен във всички процедури на текущия модул, но няма да е достъпен за процедури в други модули.

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