Зменныя і канстанты ў VBA

У VBA, як і ў любой іншай мове праграмавання, зменныя і канстанты выкарыстоўваюцца для захоўвання любых значэнняў. Як вынікае з назвы, зменныя могуць змяняцца, а канстанты захоўваюць фіксаваныя значэнні.

Напрыклад, канстанта Pi захоўвае значэнне 3,14159265… Лік «Пі» не зменіцца падчас выканання праграмы, але ўсё ж такі зручней захоўваць такое значэнне як канстанту.

У той жа час, мы можам выкарыстоўваць зменную sVAT_Rate захоўваць стаўку ПДВ на набытыя тавары. Пераменнае значэнне sVAT_Rate можа адрознівацца ў залежнасці ад набытага прадукту.

Тыпы дадзеных

Усе зменныя і канстанты адносяцца да пэўнага тыпу дадзеных. У табліцы ніжэй пералічаны тыпы дадзеных, якія выкарыстоўваюцца ў VBA, з апісаннем і дыяпазонам магчымых значэнняў:

Тып дадзеных памерАпісаннеДыяпазон значэнняў
байт1 байтЦэлыя дадатныя лікі; часта выкарыстоўваецца для двайковых дадзеныхад 0 да 255
Boolean2 байтМожа быць True або FalseПраўда ці хлусня
Цэлы лік2 байтЦэлыя лікі (без дробавай часткі)ад -32 да +768
Доўга4 байтВялікія цэлыя лікі (без дробавай часткі)от -2 147 483 648 до +2 147 483 647
14 байтЛік з плаваючай коскай адзінарнай дакладнасціад -3.4e38 да +3.4e38
Двайны8 байтЛік падвойнай дакладнасці з плаваючай коскайад -1.8e308 да +1.8e308
Валюта8 байтЛік з плаваючай кропкай з фіксаванай колькасцю знакаў пасля коскіот -922 337 203 685 477.5808 до +922 337 203 685 477.5807
дата8 байтДата і час – даныя тыпу Date прадстаўлены лікам з плаваючай коскай. Цэлая частка гэтага ліку выражае дату, а дробавая - час.з 1 студзеня 100 г. па 31 снежня 9999 г
Аб'ект4 байтСпасылка на аб'ектСпасылка на любы аб'ект
РадокмяняеццаНабор знакаў. Тып String можа быць фіксаванай або зменнай даўжыні. Часцей выкарыстоўваецца з пераменнай даўжынёйФіксаваная даўжыня - прыблізна да 65 знакаў. Пераменная даўжыня - прыблізна да 500 мільярдаў знакаў
варыянтмяняеццаМожа змяшчаць дату, float або радок сімвалаў. Гэты тып выкарыстоўваецца ў тых выпадках, калі загадзя невядома, які тып даных будзе ўводзіцца.Колькасць – Double, радок – String

Відавочна, што выкарыстоўваючы табліцу вышэй і выбіраючы правільны тып дадзеных, вы можаце выкарыстоўваць памяць больш эканомна (напрыклад, выбраць тып дадзеных Цэлы лік замест Доўга or 1 замест Двайны). Аднак, выкарыстоўваючы больш кампактныя тыпы дадзеных, вы павінны быць асцярожнымі, каб ваш код не спрабаваў змясціць у іх непрапарцыйна вялікія значэнні.

Аб'яўленне зменных і канстант

Заўвага перакладчыка: Гаворачы аб зменных у VBA, варта адзначыць яшчэ адзін вельмі важны момант. Калі мы аб'яўляем зменную, але не прысвойваем ёй ніякага значэння, яна ініцыялізуецца значэннем па змаўчанні:

• тэкставыя радкі ініцыялізуюцца пустымі радкамі;

• лічбы — значэнне 0;

• зменныя тыпу Boolean — Хлусня;

• даты – 30 снежня 1899г.

Перш чым выкарыстоўваць зменную або канстанту, яе трэба аб'явіць. Для гэтага дадайце ў макрас наступны просты радок кода:

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

У прыведзеным вышэй радку кода Імя зменнай гэта імя зменнай, якая будзе выкарыстоўвацца ў кодзе, і Тып_даных з'яўляецца адным з тыпаў дадзеных з табліцы, прыведзенай крыху раней у гэтым артыкуле. Напрыклад:

Dim sVAT_Rate As Single Dim i As Integer

Канстанты аб'яўляюцца аналагічна, але пры аб'яве канстант трэба адразу ж паказваць іх значэнне. Напрыклад, так:

Const iMaxCount = 5000 Const iMaxScore = 100

Неабавязкова аб'яўляць зменныя ў Excel. Па змаўчанні ўсе ўведзеныя, але не аб'яўленыя зменныя ў Excel будуць мець тып варыянт і зможа прымаць як лікавыя, так і тэкставыя значэнні.

Такім чынам, праграміст можа выкарыстоўваць новую зменную ў любы час (нават калі яна не была аб'яўлена), а Excel будзе разглядаць яе як зменную тыпу варыянт. Аднак ёсць некалькі прычын, па якіх гэтага рабіць не варта:

  1. Выкарыстанне памяці і хуткасць вылічэнняў. Калі вы не аб'яўляеце зменную з указаннем тыпу дадзеных, то па змаўчанні яна будзе мець тып варыянт. Гэты тып даных выкарыстоўвае больш памяці, чым іншыя тыпы даных. Некалькі дадатковых байтаў на зменную можа здацца невялікай колькасцю, але на практыцы праграмы могуць мець тысячы зменных (асабліва пры працы з масівамі). Такім чынам, дадатковая памяць выкарыстоўваецца такімі зменнымі, як варыянт, у параўнанні са зменнымі тыпу Цэлы лік or 1, можа скласці значную суму. Акрамя таго, аперацыі са зменнымі тыпу варыянт выконваюцца значна больш павольна, чым са зменнымі іншых тыпаў, адпаведна дадатковая тысяча зменных тыпу варыянт можа значна запаволіць разлікі.
  2. Прадухіленне памылак друку ў назвах зменных. Калі ўсе зменныя аб'яўлены, то можна выкарыстоўваць аператар VBA - Option Explicit (пра гэта мы пагаворым пазней), каб ідэнтыфікаваць усе незаяўленыя зменныя. Гэта выключае з'яўленне памылкі ў праграме ў выніку няправільна напісанага імя зменнай. Напрыклад, з дапамогай зменнай з імем sVAT_Rate, вы можаце зрабіць памылку друку і, прысвоіўшы значэнне гэтай зменнай, напісаць: «VATRate = 0,175». Чакаецца, што з гэтага часу зменная sVAT_Rate павінна ўтрымліваць значэнне 0,175 - але, вядома, гэта не так. Калі ўключаны рэжым абавязковага аб'явы ўсіх выкарыстоўваных зменных, то кампілятар VBA адразу пакажа памылку, так як не знойдзе зменную Стаўка ПДВ сярод абвешчаных.
  3. Вылучэнне значэнняў, якія не адпавядаюць заяўленаму тыпу зменнай. Калі вы аб'явіце зменную пэўнага тыпу і паспрабуеце прысвоіць ёй даныя іншага тыпу, вы атрымаеце памылку, якая, калі яе не выправіць, можа прывесці да збою праграмы. На першы погляд гэта можа здацца добрай прычынай не аб'яўляць зменныя, але на самой справе, чым раней высвятляецца, што адна з зменных атрымала няправільныя дадзеныя, якія павінна была атрымаць - тым лепш! У адваротным выпадку, калі праграма працягвае працаваць, вынікі могуць быць няправільнымі і нечаканымі, і будзе значна цяжэй знайсці прычыну памылак. Таксама магчыма, што макрас будзе «паспяхова» выкананы. У выніку памылка застанецца незаўважанай і праца працягнецца з некарэктнымі дадзенымі!

У сувязі з гэтым пажадана як мага раней выяўляць няправільны тып дадзеных і выпраўляць такія памылкі ў кодзе. Па гэтых прычынах рэкамендуецца аб'явіць усе зменныя пры напісанні макраса VBA.

Option Explicit

аператар Option Explicit выклікае аб'яўленне ўсіх зменных, якія будуць выкарыстоўвацца ў кодзе VBA, і пазначае ўсе неаб'яўленыя зменныя як памылкі падчас кампіляцыі (перад пачаткам выканання кода). Прымяніць гэты аператар не складана - проста напішыце гэты радок у самым версе файла VBA:

Option Explicit

Калі вы хочаце заўсёды ўстаўляць Option Explicit у верхняй частцы кожнага новага створанага модуля VBA, гэта можна зрабіць аўтаматычна. Для гэтага вам трэба ўключыць опцыю Патрабаваць дэкларацыі зменных у наладах рэдактара VBA.

Гэта робіцца так:

  • У меню рэдактара Visual Basic націсніце інструменты > опцыі
  • У дыялогавым акне, якое з'явіцца, адкрыйце ўкладку Рэдактар
  • Пастаўце сцяжок Патрабаваць дэкларацыі зменных і націсніце OK

Калі ўключана, радок Option Explicit будзе аўтаматычна ўстаўляцца ў пачатак кожнага новага створанага модуля.

Вобласць прымянення зменных і канстант

Кожная аб'яўленая зменная або канстанта мае сваю абмежаваную вобласць, гэта значыць абмежаваную частку праграмы, у якой гэтая зменная існуе. Вобласць залежыць ад таго, дзе была зроблена дэкларацыя зменнай або канстанты. Возьмем, напрыклад, зменную sVAT_Rate, які выкарыстоўваецца ў функцыі Агульны кошт. У наступнай табліцы разглядаюцца два варыянты ахопу зменных sVAT_Rateаб'яўлены ў двух розных пазіцыях у модулі:

Параметр Відавочны Dim sVAT_Rate Як адна функцыя Total_Cost() Як Double ... End Function
Калі зменная sVAT_Rate аб'яўлена ў самым пачатку модуля, то вобласцю гэтай зменнай будзе ўвесь модуль (г.зн. зменная sVAT_Rate будзе распазнавацца ўсімі працэдурамі ў гэтым модулі).

Таму, калі ў функ Агульны кошт пераменная sVAT_Rate будзе прысвоена нейкае значэнне, то наступная функцыя, выкананая ў тым жа модулі, будзе выкарыстоўваць зменную sVAT_Rate з такім жа значэннем.

Аднак калі выклікаецца нейкая функцыя, размешчаная ў іншым модулі, то для яе зменная sVAT_Rate не будзе вядома.

Параметр Відавочная функцыя Total_Cost() As Double Dim sVAT_Rate As Single ... End Function
Калі зменная sVAT_Rate абвешчаны ў пачатку функцыі Агульны кошт, то яго вобласць будзе абмежаваная толькі гэтай функцыяй (г.зн. у межах функцыі Агульны кошт, вы можаце выкарыстоўваць зменную sVAT_Rate, але не звонку).

Пры спробе выкарыстаць sVAT_Rate у іншай працэдуры кампілятар VBA паведаміць пра памылку, таму што гэтая зменная не была аб'яўлена па-за функцыяй Агульны кошт (пры ўмове выкарыстання аператара Option Explicit).

У прыкладзе, паказаным вышэй, зменная аб'яўлена на ўзроўні модуля з ключавым словам Dim. Аднак можа спатрэбіцца, каб аб'яўленыя зменныя можна было выкарыстоўваць у іншых модулях. У такіх выпадках, каб аб'явіць зменную замест ключавога слова Dim неабходна выкарыстоўваць ключавое слова грамадскага.

Дарэчы, для таго, каб аб'явіць зменную на ўзроўні модуля, а не ключавое слова Dim можна выкарыстоўваць ключавое слова прыватны, які паказвае, што гэтая зменная прызначана для выкарыстання толькі ў бягучым модулі.

Вы таксама можаце выкарыстоўваць ключавыя словы для аб'яўлення канстант. грамадскага и прыватны, але не замест ключавога слова Const, разам з ім.

Наступныя прыклады паказваюць выкарыстанне ключавых слоў грамадскага и прыватны у дачыненні да зменных і канстант.

Варыянт Відавочны публічны sVAT_Rate як адна агульнадаступная канст iMax_Count = 5000 ...    
У гэтым прыкладзе ключавое слова грамадскага выкарыстоўваецца для аб'яўлення зменнай sVAT_Rate і канстанты iMax_Count. Аб'ём элементаў, заяўленых такім чынам, будзе складаць увесь бягучы праект.

Гэта азначае, што sVAT_Rate и iMax_Count будуць даступныя ў любым модулі праекта.

Option Explicit Private sVAT_Rate As Single Private Const iMax_Count = 5000 ...    
У гэтым прыкладзе, каб аб'явіць зменную sVAT_Rate і канстанты iMax_Count выкарыстоўванае ключавое слова прыватны. Аб'ём гэтых элементаў - бягучы модуль.

Гэта азначае, што sVAT_Rate и iMax_Count будзе даступны ва ўсіх працэдурах бягучага модуля, але не будзе даступны для працэдур у іншых модулях.

Пакінуць каментар