Тағирёбандаҳо ва доимӣ дар VBA

Дар VBA, мисли дигар забонҳои барномасозӣ, тағирёбандаҳо ва доимӣ барои нигоҳ доштани ҳама гуна арзишҳо истифода мешаванд. Тавре ки аз ном бармеояд, тағирёбандаҳо метавонанд тағир ёбанд, дар ҳоле ки константаҳо арзишҳои собитро нигоҳ медоранд.

Масалан, доимӣ Pi Қимати 3,14159265-ро нигоҳ медорад… Рақами “Pi” ҳангоми иҷрои барнома тағир намеёбад, аммо нигоҳ доштани чунин арзиш ҳамчун доимӣ ба ҳар ҳол қулайтар аст.

Дар айни замон, мо метавонем тағирёбандаро истифода барем sVAT_Rate барои нигод доштани ставкаи андоз аз арзиши иловашуда ба молдои харидашуда. Арзиши тағирёбанда sVAT_Rate вобаста ба маҳсулоти харидашуда метавонад фарқ кунад.

Намудҳои маълумот

Ҳама тағирёбандаҳо ва доимӣ аз як навъи додаҳо мебошанд. Дар ҷадвали зер намудҳои маълумоте, ки дар VBA истифода мешаванд, бо тавсиф ва диапазони арзишҳои имконпазир номбар шудаанд:

Навъи маълумот андозаТавсифиДиапазони арзишҳо
ByteБайтҳои 1ададҳои мусбат; аксар вақт барои маълумоти дуӣ истифода мешавадаз 0 ба 255
БулӣБайтҳои 2Метавонад Рост ё дурӯғ бошадДуруст ё дурӯғ
ТозакунӣБайтҳои 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Истинод ба объектҲар гуна истинод ба объект
сатриваз шуда истодаастМаҷмӯи аломат. Навъи сатр метавонад дарозии собит ё тағйирёбанда бошад. Бештар бо дарозии тағйирёбанда истифода мешавадДарозии собит - то тақрибан 65 аломат. Дарозии тағирёбанда - то тақрибан 500 миллиард аломат
Вариантииваз шуда истодаастМетавонад сана, шинокунанда ё сатри аломатро дар бар гирад. Ин намуд дар ҳолатҳое истифода мешавад, ки қаблан маълум нест, ки кадом навъи маълумот ворид карда мешавад.Рақам – Дучандон, сатр – сатр

Аён аст, ки бо истифода аз ҷадвали дар боло овардашуда ва интихоби намуди дурусти додаҳо, шумо метавонед хотираро сарфакорона истифода баред (масалан, навъи маълумотро интихоб кунед. Тозакунӣ ба ҷои тӯлонӣ or Ягона ба ҷои Дучандон). Аммо, ҳангоми истифодаи намудҳои бештари маълумот, шумо бояд эҳтиёт бошед, ки рамзи шумо кӯшиш намекунад, ки ба онҳо арзишҳои номутаносиб калон мувофиқат кунанд.

Эълони тағирёбандаҳо ва доимӣ

Эзоҳ аз тарҷумон: Дар бораи тағирёбандаҳо дар VBA сухан ронда, боз як нуктаи муҳимро қайд кардан лозим аст. Агар мо тағирёбандаро эълон кунем, вале ба он ягон арзиш таъин накунем, он бо арзиши пешфарз оғоз карда мешавад:

• сатрҳои матнӣ бо сатрҳои холӣ оғоз карда мешаванд;

• рақамҳо — қимати 0;

• навъи тағирёбанда Булӣ - Дурӯғ;

• сана - 30 декабри соли 1899.

Пеш аз он ки тағирёбанда ё доимӣ истифода шавад, он бояд эълон карда шавад. Барои ин, ба макрос хати оддии зерини кодро илова кунед:

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

Дар сатри боло код Номи тағирёбанда номи тағирёбандаест, ки дар код истифода мешавад ва Намуди маълумот яке аз намудҳои маълумот аз ҷадвал аст, ки каме пештар дар ин мақола дода шудааст. Барои намуна:

Dim sVAT_Rate ҳамчун ягона хира i ҳамчун бутун

Константањо њамин тавр эълон карда мешаванд, вале њангоми эълони константањо ќимати онњо бояд фавран нишон дода шавад. Масалан, ба ин монанд:

Const iMaxCount = 5000 Const iMaxScore = 100

Дар Excel эълон кардани тағирёбандаҳо шарт нест. Ба таври нобаёнӣ, ҳама тағирёбандаҳои воридшуда, вале эълоннашуда дар Excel намуди доранд Варианти ва метавонад ҳам арзиши ададӣ ва ҳам матнро қабул кунад.

Ҳамин тариқ, барномасоз метавонад тағирёбандаи навро дар вақти дилхоҳ истифода барад (ҳатто агар он эълон нашуда бошад) ва Excel онро ҳамчун тағирёбандаи намуд баррасӣ мекунад Варианти. Аммо, якчанд сабабҳо вуҷуд доранд, ки чаро ин корро набояд кард:

  1. Истифодаи хотира ва суръати ҳисоббарорӣ. Агар шумо тағирёбандаро бо нишон додани навъи маълумот эълон накунед, он гоҳ ба таври нобаёнӣ он ба намуди муқаррар карда мешавад Варианти. Ин навъи маълумот нисбат ба дигар намудҳои додаҳо хотираи бештарро истифода мебарад. Якчанд байтҳои изофӣ барои як тағирёбанда шояд чандон зиёд наоянд, аммо дар амал барномаҳо метавонанд ҳазорҳо тағирёбанда дошта бошанд (хусусан ҳангоми кор бо массивҳо). Аз ин рӯ, хотираи иловагӣ аз ҷониби тағирёбандаҳо ба монанди Варианти, нисбат ба тағирёбандаҳои намуд Тозакунӣ or Ягона, метавонад ба маблағи назаррас илова кунед. Илова бар ин, амалиётҳо бо тағирёбандаҳои навъи Варианти нисбат ба тағирёбандаҳои намудҳои дигар хеле сусттар иҷро мешаванд, мутаносибан ҳазор тағирёбандаи иловагӣ Варианти хисобу китобро хеле суст карда метавонад.
  2. Пешгирии хатогиҳо дар номҳои тағирёбанда. Агар ҳамаи тағирёбандаҳо эълон карда шаванд, пас изҳороти VBA -ро истифода бурдан мумкин аст Опсияи равшан (мо дар ин бора баъдтар сӯҳбат хоҳем кард) барои муайян кардани ҳама тағирёбандаҳои эълоннашуда. Ин пайдоиши хатогиро дар барнома дар натиҷаи нодуруст навиштани номи тағирёбанда бартараф мекунад. Масалан, бо истифода аз тағирёбандаи ном sVAT_Rate, шумо метавонед хатои хаттӣ кунед ва ба ин тағирёбанда арзиш таъин карда, нависед: "VATRate = 0,175". Интизор меравад, ки аз ҳоло тағйирёбанда sVAT_Rate бояд арзиши 0,175 -ро дар бар гирад, аммо албатта ин тавр нест. Агар режими эъломияи ҳатмии ҳамаи тағирёбандаҳои истифодашуда фаъол бошад, пас компилятори VBA фавран хаторо нишон медиҳад, зеро он тағирёбандаро намеёбад Нархи VATR дар байни онхое, ки эълон карда шудаанд.
  3. Нишон додани арзишҳое, ки ба навъи эълоншудаи тағирёбанда мувофиқат намекунанд. Агар шумо тағирёбандаи навъи муайянро эълон кунед ва кӯшиш кунед, ки ба он маълумоти навъи дигар таъин кунед, шумо хатогие хоҳед гирифт, ки дар сурати ислоҳ накардани он, метавонад боиси вайрон шудани барнома гардад. Дар назари аввал, ин метавонад сабаби хубе барои эълон накардани тағирёбандаҳо ба назар расад, аммо дар асл, назар ба пештара маълум шуд, ки яке аз тағирёбандаҳо маълумоти нодурустро гирифтаанд, ки бояд қабул карда мешуданд - ин қадар беҳтар аст! Дар акси ҳол, агар барнома идома ёбад, натиҷаҳо метавонанд нодуруст ва ғайричашмдошт бошанд ва пайдо кардани сабаби хатогиҳо хеле мушкилтар мешавад. Инчунин мумкин аст, ки макрос бомуваффақият иҷро карда шавад. Дар натиҷа, хатогӣ нодида гирифта мешавад ва кор бо маълумоти нодуруст идома меёбад!

Дар робита ба ин, матлуб аст, ки намуди нодурусти маълумотро ошкор кунед ва чунин хатогиҳоро дар код ҳарчи зудтар ислоҳ кунед. Бо ин сабабҳо, тавсия дода мешавад, ки ҳангоми навиштани макроси VBA ҳамаи тағирёбандаҳоро эълон кунед.

Опсияи равшан

Оператор Опсияи равшан боиси эълон шудани ҳама тағирёбандаҳое мегардад, ки дар коди VBA истифода хоҳанд шуд ва ҳамаи тағирёбандаҳои эълоннашударо ҳамчун хато ҳангоми тартибдиҳӣ (пеш аз оғози иҷрои код) қайд мекунад. Истифодаи ин оператор душвор нест - танҳо ин сатрро дар болои файли VBA нависед:

Option Explicit

Агар шумо хоҳед, ки ҳамеша ворид кунед Опсияи равшан ба болои ҳар як модули нави VBA сохта шудааст, ин метавонад ба таври худкор анҷом дода шавад. Барои ин, шумо бояд интихобро фаъол созед Эъломияи тағирёбандаро талаб кунед дар танзимоти муҳаррири VBA.

Ин чунин анҷом дода мешавад:

  • Аз менюи Visual Basic Editor, клик кунед асбобҳои > Имконот
  • Дар муколамае, ки пайдо мешавад, ҷадвалро кушоед муҳаррири
  • Қуттиро қайд кунед Эъломияи тағирёбандаро талаб кунед ва пахш кунед OK

Вақте ки фаъол, сатр Опсияи равшан дар оғози ҳар як модули нави сохташуда ба таври худкор ворид карда мешавад.

Доираи тағирёбандаҳо ва доимӣ

Ҳар як тағирёбанда ё доимии эълоншуда доираи маҳдуди худро дорад, яъне қисми маҳдуди барномае, ки дар он ин тағирёбанда мавҷуд аст. Миқёс аз он вобаста аст, ки эъломияи тағирёбанда ё доимӣ дар куҷо сохта шудааст. Масалан, тағирёбандаро гиред sVAT_Rate, ки дар функсия истифода мешавад Маҷмӯи_Арзиш. Дар ҷадвали зерин ду вариант барои миқёси тағирёбанда баррасӣ мешавад sVAT_Rateдар ду мавқеъи гуногун дар модул эълон шудааст:

Опсияи равшани хира sVAT_Rate ҳамчун функсияи ягона Total_Cost() ҳамчун дукарата ... Функсияи ниҳоӣ
Агар тағирёбанда sVAT_Rate ки дар ибтидои модул эълон карда шуда бошад, пас доираи ин тағирёбанда тамоми модул хоҳад буд (яъне тағирёбанда sVAT_Rate бо тамоми расмиёти ин модул эътироф карда мешавад).

Бинобар ин, агар дар функсия Маҷмӯи_Арзиш тағйирёбанда sVAT_Rate ба баъзе арзиш таъин карда мешавад, пас функсияи навбатии дар як модул иҷрошаванда тағирёбандаро истифода мебарад sVAT_Rate бо хамин маънй.

Аммо, агар ягон функсияе, ки дар модули дигар ҷойгир аст, даъват карда шавад, пас барои он тағирёбанда sVAT_Rate маълум нахоҳад шуд.

Опсия Функсияи возеҳ Total_Cost() ҳамчун дучандон хира sVAT_Rate ҳамчун ягона ... Функсияи ниҳоӣ
Агар тағирёбанда sVAT_Rate дар ибтидои вазифа эълон карда шудааст Маҷмӯи_Арзиш, он гоҳ доираи он танҳо бо ин функсия маҳдуд мешавад (яъне дар доираи функсия Маҷмӯи_Арзиш, шумо метавонед тағирёбандаро истифода баред sVAT_Rate, вале на берун).

Ҳангоми кӯшиши истифода бурдан sVAT_Rate дар тартиби дигар, компилятори VBA хатогӣ хабар медиҳад, зеро ин тағирёбанда берун аз функсия эълон нашудааст Маҷмӯи_Арзиш (ба шарте ки оператор истифода шавад Опсияи равшан).

Дар мисоли дар боло нишон додашуда, тағирёбанда дар сатҳи модул бо калимаи калидӣ эълон карда мешавад Дим. Аммо, шояд зарур бошад, ки тағирёбандаҳои эълоншуда метавонанд дар модулҳои дигар истифода шаванд. Дар чунин ҳолатҳо ба ҷои калимаи калидӣ тағирёбанда эълон карда мешавад Дим калимаи калидӣ бояд истифода шавад умумӣ.

Дар омади гап, барои эълон кардани тағирёбанда дар сатҳи модул ба ҷои калимаи калидӣ Дим калимаи калидӣ метавонад истифода шавад бахши хусусї, ки нишон медиҳад, ки ин тағирёбанда танҳо барои истифода дар модули ҷорӣ пешбинӣ шудааст.

Шумо инчунин метавонед калимаҳои калидиро барои эълони доимӣ истифода баред. умумӣ и бахши хусусї, аммо на ба ҷои калимаи калидӣ Конст, дар баробари он.

Намунаҳои зерин истифодаи калимаҳои калидиро нишон медиҳанд умумӣ и бахши хусусї ба тағирёбандаҳо ва доимӣ истифода мешавад.

Опсияи ошкоро sVAT_Rate ҳамчун Const ягонаи ҷамъиятӣ iMax_Count = 5000 ...    
Дар ин мисол калимаи калидӣ умумӣ барои эълон кардани тағирёбанда истифода мешавад sVAT_Rate ва доимӣ iMax_Count. Ҳаҷми унсурҳои бо ин роҳ эълоншуда тамоми лоиҳаи ҷорӣ хоҳад буд.

Ин маънои онро дорад, ки sVAT_Rate и iMax_Count дар ҳама гуна модули лоиҳа дастрас хоҳад буд.

Опсияи возеҳ sVAT_Rate ҳамчун Const Private Private iMax_Count = 5000 ...    
Дар ин мисол, барои эълон кардани тағирёбанда sVAT_Rate ва доимӣ iMax_Count калимаи калидӣ истифода мешавад бахши хусусї. Доираи ин унсурҳо модули ҷорӣ аст.

Ин маънои онро дорад, ки sVAT_Rate и iMax_Count дар ҳама расмиёти модули ҷорӣ дастрас хоҳад буд, аммо барои расмиёти модулҳои дигар дастрас нест.

Дин ва мазҳаб