Разуменне зменных і канстант у макрасах Excel

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

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

Канстанты могуць быць карысныя, калі вам трэба выкарыстоўваць адно і тое ж вялікае значэнне некалькі разоў. Замест таго, каб капіяваць лік, вы можаце проста напісаць назву канстанты. Напрыклад, вы можаце выкарыстоўваць канстанту "Pi" для захоўвання Pi, якая з'яўляецца пастаянным значэннем. Ён вельмі вялікі, і кожны раз яго даволі складана пісаць ці шукаць і капіяваць. І так, дастаткова напісаць два знака, і асяроддзе аўтаматычна выкарыстоўвае патрэбны лік.

Карыстальнік Excel павінен аб'явіць зменныя, калі яму трэба час ад часу змяняць значэнне, якое захоўваецца ў іх. Напрыклад, вы можаце ўсталяваць зменную пад назвай sVAT_Rate, якая будзе захоўваць бягучую стаўку ПДВ для прадукту. Калі ён зменіцца, вы можаце хутка гэта выправіць. Гэта асабліва карысна для тых, хто вядзе бізнес у Злучаных Штатах, дзе некаторыя тавары могуць наогул не абкладацца ПДВ (і гэты падатак таксама адрозніваецца ад штата да штата).

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

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

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

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

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

Каб аб'явіць зменную, выкарыстоўваецца аператар Dim. Напрыклад, так:

Dim Variable_Name As Integer

Імя_зменнай - гэта імя зменнай. Далей пішацца аператар As, які паказвае тып дадзеных. Замест радкоў «Variable_Name» і «Integer» вы можаце ўставіць сваё імя і тып дадзеных.

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

Const iMaxCount = 5000

Справядлівасці дзеля, у некаторых выпадках можна абысціся без аб'яўлення зменных, але ў гэтым выпадку ім будзе аўтаматычна прысвоены тып Variant. Аднак гэта не рэкамендуецца па наступных прычынах:

  1. Варыянт апрацоўваецца нашмат павольней, і калі такіх зменных шмат, на слабых кампутарах апрацоўка інфармацыі можа істотна запаволіцца. Здавалася б, што вырашаць гэтыя секунды? Але калі вам давядзецца напісаць вялікую колькасць радкоў кода, а потым яшчэ і запусціць яго на слабых кампутарах (якія ўсё ж прадаюцца, улічваючы, што сучасныя офісныя пакеты патрабуюць шмат аператыўнай памяці), можна цалкам спыніць працу. Вядомыя выпадкі, калі непрадуманае напісанне макрасаў прыводзіла да завісання смартбуков, якія маюць малы аб'ём аператыўнай памяці і не прызначаныя для выканання складаных задач. 
  2. Памылкі друку ў імёнах дапускаюцца, чаго можна прадухіліць, выкарыстоўваючы аператар Option Explicit, які дазваляе знайсці незаяўленую зменную, калі такая знойдзена. Гэта просты спосаб выявіць памылкі, бо найменшая памылка друку прыводзіць да таго, што інтэрпрэтатар не можа вызначыць зменную. А калі вы ўключыце рэжым аб'явы зменных, то інтэрпрэтатар проста не дазволіць вам запусціць макрас, калі будуць знойдзены кантэйнеры дадзеных, якія не былі аб'яўлены ў самым пачатку модуля.
  3. Пазбягайце памылак, выкліканых значэннямі зменных, якія не адпавядаюць тыпу дадзеных. Звычайна прысваенне тэкставага значэння цэлалікавай зменнай прывядзе да памылкі. Так, з аднаго боку, агульны тып прысвойваецца без дэкларацыі, але калі яны аб'яўлены загадзя, то выпадковых памылак можна пазбегнуць.

Таму, нягледзячы ні на што, настойліва рэкамендуецца аб'яўляць усе зменныя ў макрасах Excel.

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

  1. Радкі робяцца пустымі.
  2. Лічбы прымаюць значэнне 0.
  3. Зменныя тыпу Boolean першапачаткова лічацца ілжывымі.
  4. Дата па змаўчанні - 30 снежня 1899 года.

Напрыклад, вам не трэба прысвойваць значэнне 0 цэлалікавай зменнай, калі значэнне не было пазначана раней. Яна ўжо змяшчае гэты нумар.

Варыянт Яўнае выказванне

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

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

  1. Перайдзіце ў асяроддзе распрацоўкі па шляху - Інструменты > Параметры.
  2. У якое адкрылася пасля гэтага акне адкрыйце ўкладку «Рэдактар».
  3. І, нарэшце, пастаўце галачку побач з пунктам «Патрабаваць дэкларацыю зменнай».

Пасля завяршэння гэтых дзеянняў націсніце кнопку «ОК». 

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

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

Кожная зменная або канстанта мае толькі абмежаваную вобласць. Гэта залежыць ад таго, дзе вы гэта дэкларуеце.

Дапусцім, у нас ёсць функцыя Агульны кошт(), і ён выкарыстоўвае зменную sVAT_Rate. У залежнасці ад пазіцыі ў модулі ён будзе мець розны аб'ём:

Option Explicit

Dim sVAT_Rate As Single

Функцыя Total_Cost() Як Double

.

.

.

End Function

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

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

Option Explicit

Функцыя Total_Cost() Як Double

Dim sVAT_Rate As Single

   .

   .

   .

End Function

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

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

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

Вось табліца з добрым прыкладам таго, як гэта працуе з канстантамі і зменнымі.

Option Explicit

Публічная стаўка sVAT_Rate як адна

Public Const iMax_Count = 5000

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

Прыватная стаўка sVAT_Rate як адзіная

Private Const iMax_Count = 5000

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

Навошта патрэбны канстанты і зменныя

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

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

Гэта асабліва важна, калі макрас пішацца некалькімі праграмістамі. Можна ведаць, што нейкая зменная не павінна змяняцца. А іншага няма. Калі вы ўкажаце аператар Const, іншы распрацоўшчык будзе ведаць, што гэта значэнне не зменіцца.

Ці, калі ёсць канстанта з адным імем, а зменная мае іншае, але падобнае імя. Забудоўшчык можа іх проста пераблытаць. Напрыклад, адна зменная, якую не трэба змяняць, называецца Variable11, а іншая, якую можна рэдагаваць, называецца Variable1. Чалавек можа аўтаматычна пры напісанні кода выпадкова прапусціць лішні блок і не заўважыць гэтага. У выніку будзе зменены кантэйнер для значэнняў, які не варта чапаць.

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

Так, у гэтай сітуацыі можна абысціся каментарамі, але ці не прасцей указаць слова Const?

Высновы

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

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

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