Ïåðåìåííûå VBA
Ïåðåìåííàÿ - ýòî èìÿ, êîòîðîå ïðîãðàììèñò äàåò îáëàñòè êîìïüþòåðíîé ïàìÿòè, èñïîëüçóåìîé äëÿ õðàíåíèÿ äàííûõ êàêîãî-ëèáî òèïà.
Äëÿ ëó÷øåãî ïîíèìàíèÿ ïåðåìåííîé ìîæíî ïðîâåñòè àíàëîãèþ, ñêàæåì, ñ àâòîìàòè÷åñêîé êàìåðîé õðàíåíèÿ íà âîêçàëå. ß÷åéêè êàìåðû, êàê èçâåñòíî, ïðîíóìåðîâàíû - ýòî "èìÿ" ïåðåìåííîé (â îòëè÷èå îò êàìåðû õðàíåíèÿ, ìû ìîæåì ñàìè ïðèñâàèâàòü îïðåäåëåííîå èìÿ ïåðåìåííîé). Òî, ÷òî ëåæèò â ÿ÷åéêå êàìåðû õðàíåíèÿ - ýòî çíà÷åíèå ïåðåìåííîé. Îíî ìîæåò ìåíÿòüñÿ, íî íîìåð ÿ÷åéêè (èìÿ ïåðåìåííîé) îñòàåòñÿ îäíèì è òåì æå.
Èìÿ ïåðåìåííîé
Ïðè âûáîðå èìåíè ïåðåìåííîé íåîáõîäèìî ñîáëþäàòü îïðåäåëåííûå ïðàâèëà:
- Èìÿ ïåðåìåííîé äîëæíî íà÷èíàòüñÿ ñ áóêâû àëôàâèòà;
- Èìåíà ïåðåìåííûõ íå ìîãóò ñîäåðæàòü ïðîáåëû, òî÷êó èëè ëþáîé äðóãîé ñèìâîë, êîòîðûé VBA èñïîëüçóåò äëÿ îáîçíà÷åíèÿ ìàòåìàòè÷åñêèõ îïåðàöèé è îïåðàöèé ñðàâíåíèÿ;
- Èìåíà ïåðåìåííûõ íå ìîãóò ïðåâûøàòü 255 ñèìâîëîâ;
- Èìÿ ïåðåìåííîé äîëæíî áûòü óíèêàëüíûì â ðàìêàõ åãî îáëàñòè äåéñòâèÿ. Îíî äîëæíî áûòü óíèêàëüíûì â ïðåäåëàõ ïðîöåäóðû èëè ìîäóëÿ, â êîòîðîé îáúÿâëåíà ýòà ïåðåìåííàÿ (ïî àíàëîãèè ñ êàìåðîé õðàíåíèÿ: íà îäíîì âîêçàëå íå ìîæåò áûòü äâóõ ÿ÷ååê ñ îäèíàêîâûì íîìåðîì).Èìÿ ïåðåìåííîé íå ìîæåò äóáëèðîâàòü çàðåçåðâèðîâàííûå êëþ÷åâûå ñëîâà VBA;
- Èìåíà ïåðåìåííûõ íå ÷óâñòâèòåëüíû ê ñîñòîÿíèþ ðåãèñòðà. Ò.å. íåò ðàçíèöû ìåæäó MyNumber, mynumber, mYnUmBeR.
Õîðîøèì òîíîì ïðîãðàììèðîâàíèÿ ñ÷èòàåòñÿ, êîãäà èìåíàì ïåðåìåííûì äàþòñÿ îñìûñëåííûå íàçâàíèÿ, îòðàæàþùèå èõ ñóòü â ïðîèçâîäèìûõ ïðîãðàììîé îïåðàöèÿõ. Íàïðèìåð, ëîãè÷íî áóäåò, åñëè ïåðåìåííàÿ, ñîäåðæàùàÿ èòîãîâóþ ñóììó, áóäåò èìåòü íàçâàíèå "AllSum".
Ñîçäàíèå ïåðåìåííîé
Ñàìûì ïðîñòûì ñïîñîáîì ñîçäàíèÿ ïåðåìåííîé ÿâëÿåòñÿ èñïîëüçîâàíèå åå â îïåðàòîðå VBA. Ïðè ýòîì VBA ñîçäàåò ïåðåìåííóþ è ðåçåðâèðóåò ïàìÿòü äëÿ ïåðåìåííîé. Ñîõðàíåíèå çíà÷åíèÿ äàííûõ â ïåðåìåííîé íàçûâàåòñÿ ïðèñâàèâàíèåì ïåðåìåííîé. Äåëàåòñÿ ýòî ñ ïîìîùüþ îïåðàòîðà ïðèñâàèâàíèÿ (=).
Íàïðèìåð: Sum=120
Ýòîò îïåðàòîð ñîõðàíÿåò ÷èñëåííîå çíà÷åíèå 120 â ÿ÷åéêå ïàìÿòè, çàäàííîé ïåðåìåííîé Sum.
Òàêîå îáúÿâëåíèå ïåðåìåííîé íàçûâàåòñÿ "íåÿâíûì îáúÿâëåíèåì ïåðåìåííîé" èëè "îáúÿâëåíèå ïåðåìåííîé íà ëåòó". Âñå ïåðåìåííûå, êîòîðûå VBA ñîçäàåò ïîäîáíûì îáðàçîì, èìåþò òèï äàííûõ Variant.
Íåÿâíîå îáúÿâëåíèå ïåðåìåííîé ìîæåò âûçâàòü ìàññó ïðîáëåì âî âðåìÿ îòëàäêè ïðîãðàììíîãî êîäà, ïîýòîìó, òàêîé ñïîñîá ïðîãðàììèðîâàíèÿ íå ðåêîìåíäóåòñÿ. Â íåêîòîðûõ ÿçûêàõ ïðîãðàììèðîâàíèÿ âîîáùå íåëüçÿ îáúÿâëÿòü ïåðåìåííûå íåÿâíûì ñïîñîáîì.
Ïîýòîìó, VBA ïðåäîñòàâëÿåò âîçìîæíîñòü âûïîëíèòü ÿâíîå îáúÿâëåíèå ïåðåìåííîé. Ýòî íåñåò ñëåäóþùèå ïðåèìóùåñòâà:
- Óñêîðÿåòñÿ âûïîëíåíèå êîäà;
- Óìåíüøàåòñÿ êîëè÷åñòâî ïîòåíöèàëüíûõ îøèáîê ïðè íàïèñàíèè êîäà;
- Óëó÷øàåòñÿ ÷èòàáåëüíîñòü ïðîãðàììíîãî êîäà;
- Íîðìàëèçóåòñÿ âûäåëåíèå çàãëàâíûìè áóêâàìè â èìåíè ïåðåìåííîé (ò.å., åñëè âû ÿâíî îáúÿâèëè èìÿ ïåðåìåííîé êàê "AllSumm", òî ïðè íàïèñàíèè â òåëå êîäà ýòîé ïåðåìåííîé, êàê allsumm, àâòîìàòè÷åñêè ïðîèçîéäåò çàìåíà íà AllSumm)
Äëÿ ÿâíîãî îáúÿâëåíèÿ ïåðåìåííîé èñïîëüçóåòñÿ îïåðàòîð Dim (Dimension).
Ñèíòàêñèñ:
Dim name1 [, name2…]
nameN - ëþáîé äîïóñòèìûé èäåíòèôèêàòîð ïåðåìåííîé.
Èäåíòèôèêàòîð - ýòî èìÿ, êîòîðîå äàåòñÿ ýëåìåíòàì â ñîçäàâàåìûõ ïðîöåäóðàõ è ìîäóëÿõ, òàêèì êàê ïåðåìåííûå. Ýòî îáóñëîâëåíî òåì ôàêòîì, ÷òî ñîçäàâàåìûå èìåíà îïðåäåëÿþò êîíêðåòíûå ó÷àñòêè ïàìÿòè (èìÿ ïåðåìåííîé), ãðóïïû èíñòðóêöèé (ìàêðîñ èëè ïðîöåäóðà).
Íàïðèìåð:
Dim MyValue
Dim Value_1, Value_2
Âñå ïåðåìåííûå, ñîçäàííûå ïîäîáíûì îáðàçîì, ÿâëÿþòñÿ ïåðåìåííûìè òèïà Variant.
Êîãäà VBA ñîçäàåò íîâóþ ïåðåìåííóþ, ýòà ïåðåìåííàÿ èíèöèàëèçèðóåòñÿ (ïåðåìåííîé ïðèñâàèâàåòñÿ íåêîòîðîå çíà÷åíèå "ïî óìîë÷àíèþ"):
- ñòðîêè èíèöèàëèçèðóþòñÿ ïóñòûìè ñòðîêàìè;
- ÷èñëà - çíà÷åíèåì 0;
- ïåðåìåííûå òèïà Boolean - False;
- äàòû - 30 äåêàáðÿ 1899
Ïåðåìåííóþ ìîæíî îáúÿâëÿòü òîëüêî îäèí ðàç â îòäåëüíîé ïðîöåäóðå èëè ìîäóëå. Ôàêòè÷åñêè ïåðåìåííûå ìîæíî îáúÿâëÿòü â ëþáîì ìåñòå êîäà. Îäíàêî, â ïðàêòèêå ïðîãðàììèðîâàíèÿ ïðèíÿòî ñîáèðàòü âñå ÿâíûå îáúÿâëåíèÿ ïåðåìåííûõ â îäíîì ìåñòå, êàê ïðàâèëî, â íà÷àëå ïðîöåäóðû.
Òèïèçèðîâàííûå ïåðåìåííûå
Âñå ïåðåìåííûå â VBA, íåçàâèñèìî îò òîãî, îáúÿâëÿþòñÿ ëè îíè íåÿâíî èëè ÿâíî, ÿâëÿþòñÿ ïåðåìåííûìè òèïà Variant, åñëè òîëüêî íå çàäàåòñÿ òèï ïåðåìåííîé â îáúÿâëÿþùåì åå îïåðàòîðå. Îáúÿâëåíèå òèïèçèðîâàííûõ ïåðåìåííûõ èìååò ðÿä ïðåèìóùåñòâ:
- Òèïèçèðîâàííûå ïåðåìåííûå óñêîðÿþò âûïîëíåíèå êîäà ïðîãðàììû;
- Èñïîëüçîâàíèå òèïèçèðîâàííûõ ïåðåìåííûõ ìîæåò çíà÷èòåëüíî ñîêðàòèòü îáúåì ïàìÿòè, òðåáóåìîé äëÿ âûïîëíåíèÿ ïðîãðàììû;
- Ïðîãðàììíûé êîä ñ òèïèçèðîâàííûìè ïåðåìåííûìè ëåã÷å ÷èòàåòñÿ è ïîíèìàåòñÿ;
-  ïðîãðàììàõ, èñïîëüçóþùèõ òèïèçèðîâàííûå ïåðåìåííûå, ëåã÷å îáíàðóæèòü íåêîòîðûå îøèáêè ïðîãðàììèñòîâ;
- Íå âîçíèêàåò ïðîáëåì ñ äàòàìè.
Òèï ïåðåìåííîé îáúÿâëÿåòñÿ â òîì æå îïåðàòîðå, êîòîðûé èñïîëüçóåòñÿ äëÿ îáúÿâëåíèÿ ñàìîé ïåðåìåííîé. Ìîæíî îáúÿâëÿòü òèïèçèðîâàííóþ ïåðåìåííóþ ëèáî ïðè íåÿâíîì îáúÿâëåíèè, ëèáî ïðè ÿâíîì - ñ ïîìîùüþ îïåðàòîðà Dim.
Äëÿ îáúÿâëåíèÿ ïåðåìåííîé è åå òèïà ñ ïîìîùüþ îïåðàòîðà Dim íåîáõîäèìî äîáàâèòü êëþ÷åâîå ñëîâî As ïåðåä èìåíåì ïåðåìåííîé, à çàòåì ââåñòè èìÿ òèïà äàííûõ äëÿ ýòîé ïåðåìåííîé.
Ñèíòàêñèñ:
Dim varname_1 [As type1] [, varname_2 [As type2]..]
Varname_N - ëþáîå äîïóñòèìîå èìÿ ïåðåìåííîé
Type_N - ëþáîå èç èìåí òèïîâ äàííûõ VBA
Ïîñëå îáúÿâëåíèÿ òèïèçèðîâàííîé ïåðåìåííîé, íåçàâèñèìî îò òîãî, îáúÿâëÿåòñÿ ëè ýòà ïåðåìåííàÿ ÿâíî èëè íåÿâíî, è êàê çàäàåòñÿ åå òèï, ýòà ïåðåìåííàÿ ñîõðàíÿåò òîò æå ñàìûé òèï ñòîëüêî âðåìåíè, ñêîëüêî îíà ñóùåñòâóåò. Íåëüçÿ ïåðåîáúÿâëÿòü ïåðåìåííóþ èëè ïåðåîïðåäåëÿòü åå òèï.
Ñîçäàâàåìûå ñòðîêîâûå ïåðåìåííûå ïî óìîë÷àíèþ ÿâëÿþòñÿ ñòðîêàìè ïåðåìåííîé äëèíû, ò.å. îíè èçìåíÿþò ñâîþ äëèíó, â çàâèñèìîñòè îò äëèíû ñòðîêè, ñîõðàíÿåìîé ïåðåìåííîé. Íî, èíîãäà ìîæåò ïîíàäîáèòüñÿ èñïîëüçîâàòü ñòðîêó ôèêñèðîâàííîé äëèíû. Òàêèå ñòðîêè âñåãäà èìåþò îäíó è òó æå äëèíó. Îíè ïîëåçíû, åñëè íåîáõîäèìî îáåñïå÷èòü, ÷òîáû òåêñò, ñîõðàíåííûé â ñòðîêîâîé ïåðåìåííîé, âñåãäà ñîäåðæàë îäíî è òî æå ÷èñëî ñèìâîëîâ.
Ñèíòàêñèñ:
Dim varname As String * N
Varname - ëþáîå äîïóñòèìîå èìÿ ïåðåìåííîé
N - öåëîå ÷èñëî, óêàçûâàþùåå äëèíó ñòðîêè
Îáëàñòü äåéñòâèÿ ïåðåìåííûõ
Ëþáàÿ ïåðåìåííàÿ èìååò ñâîþ îáëàñòü äåéñòâèÿ.
Òåðìèí îáëàñòü äåéñòâèÿ îòíîñèòñÿ ê îáëàñòè ïðîöåäóðû èëè ìîäóëÿ VBA, ãäå äàííàÿ ïåðåìåííàÿ, ïðîöåäóðà èëè äðóãîé èäåíòèôèêàòîð, ÿâëÿþòñÿ äîñòóïíûìè.
Ïåðåìåííûå, ïðîöåäóðû è èäåíòèôèêàòîðû, êîòîðûå äîñòóïíû òîëüêî â ïðîöåäóðå, èìåþò îáëàñòü äåéñòâèÿ ïðîöåäóðíîãî óðîâíÿ, à òå, êîòîðûå äîñòóïíû äëÿ âñåõ ïðîöåäóð â ìîäóëå, èìåþò îáëàñòü äåéñòâèÿ ìîäóëüíîãî óðîâíÿ.
Îáëàñòü â íà÷àëå ìîäóëÿ ïåðåä ëþáûìè îáúÿâëåíèÿìè ïðîöåäóð íàçûâàþò îáëàñòüþ îáúÿâëåíèé ìîäóëÿ, ïîòîìó ÷òî èìåííî òóäà ñëåäóåò ïîìåùàòü îáúÿâëåíèÿ ïåðåìåííûõ ìîäóëüíîãî óðîâíÿ è äðóãèå äèðåêòèâû VBA, âëèÿþùèå íà âåñü ìîäóëü.
 ïåðâîé ñòðîêå, ïðèâåäåííîãî âûøå ëèñòèíãà, îáúÿâëåíà ïåðåìåííàÿ À ìîäóëüíîãî òèïà. Îäíàêî â ïðîöåäóðå example_02 èìååòñÿ ñâîå îáúÿâëåíèå ïåðåìåííîé À. VBA âûáèðàåò íàèáîëåå ëîêàëüíóþ ïåðåìåííóþ À, îáúÿâëåííóþ êàê ïåðåìåííàÿ ïðîöåäóðíîãî óðîâíÿ.
Ïåðåìåííûå ïðîöåäóðíîãî óðîâíÿ ÷àñòî íàçûâàþò ëîêàëüíûìè ïåðåìåííûìè, ïîòîìó ÷òî èõ îáúÿâëåíèÿ ÿâëÿþòñÿ ëîêàëüíûìè äëÿ âûïîëíÿåìîé â äàííûé ìîìåíò ïðîöåäóðû.
Åñëè âû õîòèòå âñåãäà èñïîëüçîâàòü òîëüêî ÿâíîå îáúÿâëåíèå ïåðåìåííûõ, òî äëÿ òàêèõ öåëåé VBA ïðåäîñòàâëÿåò êîìàíäó Option Explicit. Ïðè èñïîëüçîâàíèè Option Explicit VBA òðåáóåò îáúÿâëåíèÿ âñåõ ïåðåìåííûõ ïåðåä èõ èñïîëüçîâàíèåì.
 íàñòðîéêàõ ðåäàêòîðà VBA ìîæíî óêàçàòü, ÷òîáû êîìàíäà Option Explicit àâòîìàòè÷åñêè âêëþ÷àëàñü â íîâûé ìîäóëü.