Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Èç èñòîðèè VBA
Íåñìîòðÿ íà òî ÷òî Visual Basic for Applications (VBA) — ýòî îòíîñèòåëüíî
íîâûé ïðîäóêò, ïðåäïîñûëêè åãî ïîÿâëåíèÿ èìåþò èñòîðèþ, ïî÷òè ñòîëü æå
äîëãóþ, ÷òî è âñÿ êîìïüþòåðíàÿ èíäóñòðèÿ. ßçûê VBA ÿâëÿåòñÿ ñîâðåìåííûì
äèàëåêòîì ÿçûêà ïðîãðàììèðîâàíèÿ BASIC, êîòîðûé áûë ñîçäàí â íà÷àëå
60-õ ãîäîâ. (BASIC — ýòî ñîêðàùåíèå îò Beginner’s All Purpose Symbolic In-
struction Code.)
Õîòÿ ïî ñåãîäíÿøíèì ñòàíäàðòàì ïåðâîíà÷àëüíûé ÿçûê BASIC èìåë
çíà÷èòåëüíûå îãðàíè÷åíèÿ, èçó÷àòü è ïîíèìàòü åãî áûëî ëåãêî, ÷òî ñïîñîáñò-
âîâàëî åãî áûñòðîìó ðàñïðîñòðàíåíèþ. Âåðñèè ÿçûêà BASIC ñîçäàâàëèñü
(è âñå åùå ñîçäàþòñÿ) äëÿ èñïîëüçîâàíèÿ íà âñåõ òèïàõ êîìïüþòåðîâ. Âåðñèÿ
Microsoft GWBASIC (GW îçíà÷àåò Graphics Workshop) áûëà îäíèì èç ïåðâûõ
ÿçûêîâ ïðîãðàììèðîâàíèÿ, äîñòóïíûõ äëÿ êîìïüþòåðîâ, êîòîðûå ýâîëþöèî-
íèðîâàëè â ñîâðåìåííûå ïåðñîíàëüíûå êîìïüþòåðû. GWBASIC ïîñòàâëÿëñÿ
ñ âåðñèÿìè MS-DOS äî Version 5.0. Ðàííèå ÏÊ, âûïóñêàåìûå IBM, èìåëè äàæå
Ââåäåíèå â ìàêðîñû 17
Ñîçäàíèå ìàêðîñîâ
Ñóùåñòâóåò ìíåíèå, ÷òî èçó÷åíèå ÿçûêà VBA ëåã÷å âñåãî íà÷àòü ñ çàïèñè
íîâîãî ìàêðîñà ïðè ïîìîùè ðåêîðäåðà. Ïîýòîìó áîëüøàÿ ÷àñòü ëèòåðàòóðû ïî
VBA ñëåäóåò ñõåìå, ïî êîòîðîé ÷èòàòåëþ ïðåäëàãàåòñÿ ñíà÷àëà ïîñìîòðåòü,
êàê ìàêðîñû ñîçäàþòñÿ ñàìèìè ïðîäóêòàìè, òàêèìè êàê Word è Excel,
à çàòåì, îñòîðîæíî âíåäðÿÿ ñâîè èíñòðóêöèè â ðàáîòàþùèå ìàêðîñû, èçó÷èòü
Ââåäåíèå â ìàêðîñû 21
Ðèñ. 1.1
×òîáû âêëàäêà Ðàçðàáîò÷èê ïîÿâèëàñü íà ïàíåëè Ribbon, íóæíî, ùåëêíóâ êíîïêó
Office, âûáðàòü Ïàðàìåòðû Word è â ïîÿâèâøåìñÿ îêíå äëÿ ãðóïïû ïàðàìåòðîâ
Îñíîâíûå óñòàíîâèòü ôëàæîê Ïîêàçûâàòü âêëàäêó “Ðàçðàáîò÷èê” íà ëåíòå
Ðèñ. 1.2
Âêëàäêà Ðàçðàáîò÷èê íà ïàíåëè Ribbon
Ðèñ. 1.3
Ìàêðîñ â îêíå Code Ðåäàêòîðà Visual Basic
Ðèñ. 1.5
Âûáåðèòå êîìàíäó Çàïèñü ìàêðîñà íà âêëàäêå Âèä
Ðèñ. 1.6
Âûáåðèòå êîìàíäó Çàïèñü ìàêðîñà íà âêëàäêå Ðàçðàáîò÷èê
Ðèñ. 1.7
Îêíî Çàïèñü ìàêðîñà â Word
26 Ãëàâà 1
Ðèñ. 1.8
Îêíî Çàïèñü ìàêðîñà â Excel
Ðèñ. 1.9
Îêíî Çàïèñü ìàêðîñà â Word,
çàïîëíåííîå äëÿ çàïèñè ìàêðîñà
ÂûäåëèòüÒåêñò
Ðèñ. 1.10
Îêíî Íàñòðîéêà êëàâèàòóðû â
Word äëÿ ìàêðîñà
ÂûäåëèòüÒåêñò
Ðèñ. 1.11
Îêíî Ïî óìîë÷àíèþ äëÿ øàáëîíà â Word äëÿ ìàêðîñà ÂûäåëèòüÒåêñò
30 Ãëàâà 1
Ðèñ. 1.12
Îêíî Ïî óìîë÷àíèþ äëÿ øàáëîíà â Word äëÿ ìàêðîñà ÂûäåëèòüÒåêñò
Ðèñ. 1.14
Êíîïêà ìàêðîñà ÂûäåëèòüÒåêñò íà ïàíåëè
áûñòðîãî äîñòóïà
Ðèñ. 1.15
Îêíî Íàñòîéêà
êëàâèàòóðû â Word
Ðèñ. 1.16
Êíîïêà Çàïèñü ìàêðîñà
Ðèñ. 1.17
Çàïîëíåííîå äèàëîãîâîå îêíî Çàïèñü
ìàêðîñà äëÿ ìàêðîñà-ïðèìåðà
FormatArialBold12
34 Ãëàâà 1
Ðèñ. 1.18
Íà âêëàäêå Ðàçðàáîò÷èê èìååòñÿ êíîïêà Îòíîñèòåëüíûå ññûëêè
Êîä ìàêðîñà
Ïðè çàïèñè ìàêðîñà â Word, Excel (è äðóãèõ ïðèëîæåíèé) ðåêîðäåð
ñîõðàíÿåò ïîñëåäîâàòåëüíîñòü òåêñòîâûõ èíñòðóêöèé, êîòîðûå îïèñûâàþò íà
ÿçûêå ïðîãðàììèðîâàíèÿ Visual Basic for Applications ðàçëè÷íûå äåéñòâèÿ,
âûïîëíÿåìûå âàìè â òî âðåìÿ, êîãäà ðåêîðäåð âêëþ÷åí. Ýòî òåêñòîâîå
îïèñàíèå âàøèõ êîìàíä íàçûâàåòñÿ èñõîäíûì êîäîì (source code) äëÿ ýòîãî
ìàêðîñà. Ïîçæå, êîãäà âû çàïóñêàåòå ìàêðîñ, VBA ñ÷èòûâàåò çàïèñàííûå
â èñõîäíîì êîäå èíñòðóêöèè è âûïîëíÿåò êàæäóþ ïîñëåäîâàòåëüíî, ïîâòîðÿÿ
òàêèì îáðàçîì âñå äåéñòâèÿ, êîòîðûå âû âûïîëíÿëè, êîãäà çàïèñûâàëè
ìàêðîñ.
 ëèñòèíãå 1.2 ïðèâåäåí èñõîäíûé êîä, ïîëó÷åííûé ïðè çàïèñè âàìè
ìàêðîñà ÂûäåëèòüÒåêñò â Word 2007. Îáðàòèòå âíèìàíèå, èìÿ è îïèñàíèå
ìàêðîñà, êîòîðûå âû ââåëè â äèàëîãîâîå îêíî Çàïèñü ìàêðîñà, âêëþ÷åíû
â íà÷àëî èñõîäíîãî êîäà çàïèñàííîãî ìàêðîñà.
Ðèñ. 1.19
Âûáåðèòå ìàêðîñ ÂûäåëèòüÒåêñò â ñïèñêå
Èìÿ à ùåëêíèòå êíîïêó Âûïîëíèòü äëÿ
çàïóñêà ìàêðîñà
Ðèñ. 1.20
Îêíî ñ ñîîáùåíèåì î òîì, ÷òî äîêóìåíò ñîäåðæèò, êðîìå îáû÷íûõ äàííûõ, ìàêðîñ —
ïðîåêò VBA, — è íå ìîæåò áûòü ñîõðàíåí êàê äîêóìåíò áåç ïîääåðæêè ìàêðîñîâ
Ðèñ. 1.21
Îêíî
Ñîõðàíåíèå
äîêóìåíòà â
Excel
Ðèñ. 1.22
Äîêóìåíòû è êíèãè, ñîõðàíåííûå ñ
ïîääåðæêîé ìàêðîñîâ, îòëè÷àþòñÿ îò îáû÷íûõ
ïðåäñòàâëåíèåì èõ â Ïðîâîäíèêå
Ðèñ. 1.23
Ñîîáùåíèå ñèñòåìû
áåçîïàñíîñòè î
íåâîçìîæíîñòè çàïóñêà
ìàêðîñà
Ðèñ. 1.24
Ñîîáùåíèå ñèñòåìû áåçîïàñíîñòè î íåâîçìîæíîñòè çàïóñêà ìàêðîñà
40 Ãëàâà 1
Ìîäóëè
Âû óæå çíàåòå (èç ïåðâîé ãëàâû), ÷òî ìàêðîñû Visual Basic for Applications
ñîõðàíÿþòñÿ êàê ÷àñòü ôàéëîâ, â êîòîðûõ Word, Excel (è, íàïðèìåð, Access)
îáû÷íî ñîäåðæàò ñâîè äàííûå, — ìàêðîñû ñîõðàíÿþòñÿ â ôàéëàõ äîêóìåíòîâ
â Word è â ôàéëàõ êíèã â Excel. Ìàêðîñû ñîõðàíÿþòñÿ â ñïåöèàëüíîé ÷àñòè
ôàéëà äàííûõ, íàçûâàåìîé modules (ìîäóëè). Ìîäóëü VBA ñîäåðæèò èñõîä-
íûé êîä ìàêðîñà — òåêñòîâîå ïðåäñòàâëåíèå èíñòðóêöèé. Êàæäûé äîêóìåíò
Word (èëè øàáëîí äîêóìåíòà) ìîæåò ñîäåðæàòü îäèí èëè íåñêîëüêî ìîäóëåé
èëè íå ñîäåðæàòü íèêàêîãî ìîäóëÿ; àíàëîãè÷íî, êàæäûé ôàéë êíèãè Excel
ìîæåò íå ñîäåðæàòü ìîäóëåé èëè ñîäåðæàòü îäèí èëè íåñêîëüêî ìîäóëåé. Ìî-
äóëè, ñîõðàíÿåìûå â îäíîì äîêóìåíòå Word èëè ðàáî÷åé êíèãå Excel, èìåþò
îáùåå íàçâàíèå Project (ïðîåêò).
Çíàíèå òîãî, êàê Word è Excel èìåíóþò ñîçäàâàåìûå â íèõ ìîäóëè, ïîìî-
æåò âàì íàõîäèòü âàøè çàïèñàííûå ðåêîðäåðîì ìàêðîñû, êîãäà âàì ïîòðåáó-
åòñÿ ïðîñìîòðåòü èëè ðåäàêòèðîâàòü èõ. Â ñëåäóþùèõ íåñêîëüêèõ ïàðàãðàôàõ
îïèñûâàåòñÿ, êàê Word è Excel âûáèðàþò èìåíà ìîäóëåé ïðè çàïèñè ìàêðîñà
ðåêîðäåðîì.
Ìîäóëè â Word
Êàê è â Word, ïðè çàïèñè ìàêðîñà â Excel âû ìîæåòå îïðåäåëÿòü òîëüêî
êíèãó, â êîòîðîé Excel ñîõðàíÿåò çàïèñàííûé ìàêðîñ, — òåêóùóþ êíèãó, íî-
âóþ êíèãó èëè êíèãó Personal.xlsb. Excel âûáèðàåò ìîäóëü, â êîòîðîì ñîõðà-
íÿåòñÿ çàïèñàííûé ìàêðîñ, è ïðè íåîáõîäèìîñòè ñîçäàåò ýòîò ìîäóëü. Ïðàâè-
ëà âûáîðà ìîäóëÿ, â êîòîðîì ñîõðàíÿåòñÿ âàø çàïèñàííûé ìàêðîñ, â Excel ÿâ-
ëÿþòñÿ áîëåå ñëîæíûìè, ÷åì â Word.
Êîãäà Excel ñîçäàåò ìîäóëü, â êîòîðîì ñîõðàíÿåòñÿ çàïèñàííûé ìàêðîñ, ìî-
äóëþ ïðèñâàèâàåòñÿ èìÿ ModuleN, ãäå N — ýòî êîëè÷åñòâî ìîäóëåé, ñîçäàí-
42 Ãëàâà 2
íûõ äëÿ îïðåäåëåííîé ðàáî÷åé êíèãè âî âðåìÿ òåêóùåãî ñåàíñà ðàáîòû. Íà-
ïðèìåð, â ïåðâûé ðàç, êîãäà âû ñîõðàíÿåòå çàïèñàííûé ìàêðîñ â Personal.xlsb
(ëè÷íîé êíèãå ìàêðîñîâ), Excel ñîçäàåò ìîäóëü ñ èìåíåì Module1. Åñëè âû
ïðîäîëæàåòå çàïèñûâàòü ìàêðîñû â òîì æå ñåàíñå ðàáîòû è ñîõðàíÿòü èõ â
Personal.xlsb, Excel ïðîäîëæàåò ñîõðàíÿòü çàïèñàííûå ìàêðîñû â òîì æå ìî-
äóëå (Module1) äî òåõ ïîð, ïîêà âû íå âûáåðåòå äðóãóþ ðàáî÷óþ êíèãó. Åñëè
ïîçæå â òîì æå ñåàíñå ðàáîòû âû îïÿòü çàõîòèòå ñîõðàíèòü çàïèñàííûå ìàêðî-
ñû â Personal.xlsb, Excel äîáàâëÿåò äðóãîé ìîäóëü ñ èìåíåì Module2 â ýòó êíè-
ãó.
Åñëè êàêàÿ-ëèáî ðàáî÷àÿ êíèãà óæå ñîäåðæèò ìîäóëü ñ òåì æå èìåíåì, ÷òî
âûáðàí â Excel äëÿ íîâîãî ìîäóëÿ, Excel óâåëè÷èâàåò ÷èñëî â èìåíè ìîäóëÿ äî
òåõ ïîð, ïîêà èìÿ íîâîãî ìîäóëÿ íå áóäåò îòëè÷àòüñÿ îò èìåí ñóùåñòâóþùèõ
ìîäóëåé. Íàïðèìåð, åñëè âû íà÷íåòå íîâûé ñåàíñ ðàáîòû â Excel è çàòåì çàõî-
òèòå ñîõðàíèòü çàïèñàííûé ðåêîðäåðîì ìàêðîñ â êíèãå Personal.xlsb, Excel
ñíà÷àëà âûáèðàåò èìÿ Module1 äëÿ íîâîãî ìîäóëÿ. Åñëè æå êíèãà
Personal.xlsb óæå ñîäåðæèò ìîäóëè ñ èìåíàìè Module1 è Module2, Excel óâå-
ëè÷èâàåò ÷èñëî â èìåíè ìîäóëÿ, ÷òîáû îíî íå ñîâïàäàëî ñ ñóùåñòâóþùèìè
èìåíàìè; íîâûé ìîäóëü ïîëó÷àåò èìÿ Module3.
Çàïóñê Ðåäàêòîðà VB
Êàê óêàçûâàëîñü â ïðåäûäóùèõ ðàçäåëàõ, ÷òîáû ïðîñìîòðåòü ìîäóëè èëè
èñõîäíûé êîä VBA, êîòîðûé îíè ñîäåðæàò, âàì íåîáõîäèìî ñíà÷àëà çàïóñòèòü
Ðåäàêòîð VB. Íåçàâèñèìî îò òîãî, ðàáîòàåòå ëè âû â Word èëè â Excel (à òàêæå
è Access), Ðåäàêòîð VB çàïóñêàåòñÿ îäíèì è òåì æå ñïîñîáîì. Èñïîëüçóéòå äëÿ
ýòîãî îäèí èç ñëåäóþùèõ ïðèåìîâ:
¨ Âûáåðèòå íà âêëàäêå Ðàçðàáîò÷èê ùåëêíèòå êíîïêó Visual Basic.
¨ Íàæìèòå ñî÷åòàíèå êëàâèø Alt+F11.
Ðåäàêòèðîâàíèå ìàêðîñîâ 43
Îêíà Ðåäàêòîðà VB
 îêíå Ðåäàêòîðà VB èìåþòñÿ òðè äî÷åðíèõ îêíà, êàæäîå èç êîòîðûõ îòî-
áðàæàåò âàæíóþ èíôîðìàöèþ î VBA-ïðîåêòå. [Project (Ïðîåêò) — ýòî ãðóïïà
ìîäóëåé è äðóãèõ îáúåêòîâ, ñîõðàíÿåìûõ â îïðåäåëåííîì äîêóìåíòå, øàáëîíå
äîêóìåíòà, ðàáî÷åé êíèãå èëè øàáëîíå ðàáî÷åé êíèãè.] Êàæäîå èç îêîí Ðå-
äàêòîðà VB îòîáðàæàåòñÿ ïî óìîë÷àíèþ â ïðèêðåïëåííûõ (docked) ïîëîæåíè-
ÿõ, ïîêàçàííûõ íà ðèñ. 2.1.
Ðèñ. 2.1
Òèïè÷íîå îêíî
Ðåäàêòîðà VB â
Microsoft Word
Ðèñ. 2.2
Òèïè÷íîå îêíî
Ðåäàêòîðà VB â
Microsoft Excel
44 Ãëàâà 2
Ðèñ. 2.3
Äëÿ âûáîðà
ðåæèìà
ïðîñìîòðà,
ùåëêàéòå êíîïêè
â íèæíåì ëåâîì
óãëó Code Window
Ìåíþ Ðåäàêòîðà VB
 ýòîì è ïîñëåäóþùèõ ðàçäåëàõ ðàññêàçûâàåòñÿ î ìåíþ è ïàíåëÿõ èíñòðó-
ìåíòîâ Ðåäàêòîðà VB. Ñåé÷àñ âàì íåîáõîäèìî ëèøü ïîçíàêîìèòüñÿ ñ èìåþùè-
ìèñÿ êîìàíäàìè. Ìîæåòå ïîïðîáîâàòü èñïîëüçîâàòü íåêîòîðûå èç ýòèõ êî-
ìàíä, òîëüêî óáåäèòåñü ñíà÷àëà, ÷òî âû ýêñïåðèìåíòèðóåòå ñ äîêóìåíòîì (èëè
ðàáî÷åé êíèãîé), íå ñîäåðæàùèì íåçàìåíèìûõ äàííûõ.
Çàìå÷àíèå
Äàëåå â òåêñòå çíà÷êè <, > ñ íàõîäÿùèìñÿ âíóòðè íèõ òåêñòîì îçíà÷àþò, ÷òî â çàâèñèìîñòè îò ñèòóàöèè
íà ýòî ìåñòî ïîäñòàâëÿåòñÿ èìÿ ôàéëà, ìîäóëÿ, ìàêðîñà, ïðîåêòà è ò.ä.
«Ãîðÿ÷àÿ»
Êîìàíäà Äåéñòâèå
êëàâèøà
«Ãîðÿ÷àÿ»
Êîìàíäà Äåéñòâèå
êëàâèøà
«Ãîðÿ÷àÿ»
Êîìàíäà Äåéñòâèå
êëàâèøà
«Ãîðÿ÷àÿ»
Êîìàíäà Äåéñòâèå
êëàâèøà
Project Explorer
Ctrl+R Îòîáðàæàåò Project Explorer.
(îêíî ïðîåêòà)
Properties Window
F4 Îòîáðàæàåò Properties Window.
(îêíî ñâîéñòâ)
Ðåäàêòèðîâàíèå ìàêðîñîâ 49
Êîìàíäà Äåéñòâèå
Êîìàíäà Äåéñòâèå
Size to Fit
Îäíîâðåìåííî èçìåíÿåò øèðèíó è âûñîòó îáúåêòà äî
(ïîäîãíàòü
ñîîòâåòñòâèÿ ðàçìåðó åãî ñîäåðæèìîãî.
ðàçìåð)
Center in Form
Îòêðûâàåò ïîäìåíþ êîìàíä, ïîçâîëÿþùèõ èçìåíÿòü
(ðàçìåñòèòü
ïîëîæåíèå âûáðàííûõ îáúåêòîâ, ÷òîáû îíè áûëè
ïî öåíòðó
öåíòðèðîâàíû â ôîðìå ãîðèçîíòàëüíî èëè âåðòèêàëüíî.
â ôîðìå)
Ãîðÿ÷àÿ
Êîìàíäà Äåéñòâèå
êëàâèøà
Compile <project>
Êîìïèëèðóåò ïðîåêò, âûáðàííûé â äàííûé
(êîìïèëèðîâàòü
ìîìåíò â Project Explorer.
<ïðîåêò>)
Add Watch
Ïîçâîëÿåò óêàçûâàòü ïåðåìåííûå èëè
(äîáàâèòü
âûðàæåíèÿ, çíà÷åíèÿ êîòîðûõ ìîæíî íàáëþäàòü
êîíòðîëüíîå
âî âðåìÿ âûïîëíåíèÿ èñõîäíîãî êîäà VBA.
çíà÷åíèå)
Quick Watch
Îòîáðàæàåò òåêóùåå çíà÷åíèå âûáðàííîãî
(êîíòðîëüíîå Shift+F9
âûðàæåíèÿ.
çíà÷åíèå)
52 Ãëàâà 2
Ãîðÿ÷àÿ
Êîìàíäà Äåéñòâèå
êëàâèøà
Êîìàíäà Äåéñòâèå
Digital Signature
Îòîáðàæàåò äèàëîãîâîå îêíî Digital Signature, â êîòîðîì
(öèôðîâàÿ
ìîæíî çàäàòü äëÿ ïðîåêòà ñåðòèôèêàò öèôðîâîé ïîäïèñè.
ïîäïèñü)
Ìåíþ Add-Ins
 ýòîì ìåíþ íàõîäèòñÿ âñåãî îäíà êîìàíäà, Add-In Manager, êîòîðàÿ
ïðèâîäèò ê îòîáðàæåíèþ äèàëîãîâîãî îêíà Add-In Manager. Ýòî îêíî ïîçâîëÿåò
ðåãèñòðèðîâàòü, çàãðóæàòü èëè âûãðóæàòü è îïðåäåëÿòü ïîâåäåíèå
äîïîëíåíèé.
54 Ãëàâà 2
Äðóãèå ìåíþ
 Ðåäàêòîðå VB èìåþòñÿ äâà äîïîëíèòåëüíûõ ìåíþ: Window (îêíî) è Help
(ïîìîùü). Îáà ýòèõ ìåíþ ñîäåðæàò êîìàíäû, èäåíòè÷íûå ìåíþ Window è Help,
èìåþùèìñÿ â äðóãèõ ïðèëîæåíèÿõ Microsoft Windows. Êîìàíäû â ìåíþ Win-
dow ïîçâîëÿþò âûáèðàòü àêòèâíîå îêíî, ðàçáèâàòü òåêóùåå îêíî, ðàçìåùàòü
äî÷åðíèå îêíà âåðòèêàëüíî è ãîðèçîíòàëüíî, îðãàíèçîâûâàòü äî÷åðíèå îêíà
VB â âèäå êàñêàäà èëè âûðàâíèâàòü çíà÷êè ìèíèìèçèðîâàííûõ äî÷åðíèõ
îêîí.
Êîìàíäû ìåíþ Help òàêæå èäåíòè÷íû êîìàíäàì ìåíþ Help â Word, Excel è
äðóãèõ ïðèëîæåíèÿõ Microsoft Windows. Ìåíþ Help Ðåäàêòîðà VB ïîçâîëÿåò
ïîëó÷àòü êîíòåêñòíî-çàâèñèìóþ ïîäñêàçêó ïîñðåäñòâîì ñïðàâî÷íîé ñèñòåìû
Microsoft Office è ïðîñìàòðèâàòü ôàéëû ñïðàâî÷íîé ñèñòåìû VBA äëÿ
host-ïðèëîæåíèÿ, èç êîòîðîãî âû çàïóñòèëè Ðåäàêòîð VB. Åñëè ó âàñ èìååòñÿ
ìîäåì èëè äîñòóï ê Internet, âû ìîæåòå èñïîëüçîâàòü Help | MSDN on the Web äëÿ
ñîåäèíåíèÿ ñ ðàçíîîáðàçíûìè ñòðàíèöàìè Web, ñîäåðæàùèìè èíôîðìàöèþ î
ïðîäóêòàõ Microsoft è VBA.
Ïîñëåäíÿÿ êîìàíäà â ìåíþ Help — ýòî êîìàíäà About Microsoft Visual Basic.
Îíà îòîáðàæàåò äèàëîãîâîå îêíî, ñîäåðæàùåå ñâåäåíèÿ îá àâòîðñêèõ ïðàâàõ
íà Microsoft Visual Basic. Äèàëîãîâîå îêíî About Microsoft Visual Basic ñîäåðæèò
òàêæå êîìàíäíóþ êíîïêó System Info, êîòîðàÿ îòîáðàæàåò èíôîðìàöèþ î
âàøåé âû÷èñëèòåëüíîé ñèñòåìå: êàêèå äðàéâåðû âèäåîñèñòåìû, çâóêîâîé
ñèñòåìû è ïðèíòåðà óñòàíîâëåíû, êàêèå ïðîãðàììû çàãðóæåíû â ïàìÿòü â
äàííîå âðåìÿ, êàêèå ïðîãðàììû çàðåãèñòðèðîâàíû â ñèñòåìíîì ðååñòðå (Win-
dows System Registry) è äðóãóþ òåõíè÷åñêóþ èíôîðìàöèþ.
Ðèñ. 2.4
Ïàíåëü Standard Ðåäàêòîðà VB ñîäåðæèò êíîïêè äëÿ âàæíåéøèõ è íàèáîëåå ÷àñòî
èñïîëüçóåìûõ êîìàíä:
1 – View host-ïðèëîæåíèå; 2 – Insert UserForm; 3 – Save <Äîêóìåíò>; 4 – Cut; 5 –
Copy; 6 – Paste; 7 – Find; 8 – Undo; 9 – Redo; 10 – Run Macro/UserForm; 11 – Breake;
12 – Reset; 13 – Design Mode; 14 – Project Explorer; 15 – Properties Window; 16 – Object
Browser; 17 – Toolbox; 18 – Microsoft Visual Basic Help; 19 – More Buttons
Ïàíåëü Standard
Ðèñ. 2.5
Êíîïêà More ïàíåëè Standard ïîçâîëÿåò èçìåíÿòü ñîäåðæèìîå ýòîé ïàíåëè
Íàèìåíîâàíèå
Íàçíà÷åíèå
êíîïêè
Save
Ñîõðàíÿåò òåêóùèé ïðîåêò òàê æå, êàê File | Save.
(ñîõðàíèòü)
Run Macro
(çàïóñê Çàïóñêàåò òåêóùóþ ïðîöåäóðó èëè ôîðìó òàê æå, êàê
ïîäïðîãðàììû/ êîìàíäà Run | Sub/UserForm.
UserForm)
Project Explorer Îòîáðàæàåò Îêíî ïðîåêòà (Project Explorer) òàê æå, êàê
(îêíî ïðîåêòà) êîìàíäà View | Project Explorer (âèä | îêíî ïðîåêòà).
Properties Window Îòîáðàæàåò Properties Window (îêíî ñâîéñòâ) òàê æå, êàê
(îêíî ñâîéñòâ) êîìàíäà View | Properties Window (âèä | îêíî ñâîéñòâ).
Toolbox
Îòîáðàæàåò Toolbox (ïàíåëü ýëåìåíòîâ) òàê æå, êàê
(ïàíåëü
êîìàíäà View | Toolbox (âèä | ïàíåëè ýëåìåíòîâ).
ýëåìåíòîâ)
Íàèìåíîâàíèå
Íàçíà÷åíèå
êíîïêè
Uncomment Block
Óäàëÿåò ñèìâîë êîììåíòàðèÿ èç áëîêà âûäåëåííîãî òåêñòà
(ðàñêîììåíòèðîâàòü
â Code Window. Ýêâèâàëåíòíîé êîìàíäû ìåíþ íåò.
áëîê)
Ðåäàêòèðîâàíèå ìàêðîñîâ
Ïîñëå òîãî êàê âû íåìíîãî îçíàêîìèëèñü ñî ñðåäîé Ðåäàêòîðà VB èëè, ïî
êðàéíåé ìåðå, ñ òåðìèíîëîãèåé, ñâÿçàííîé ñ êîìïîíåíòàìè ðåäàêòîðà, ïîðà
ðàññìîòðåòü áîëåå äåòàëüíî òå ìàêðîñû, êîòîðûå âû äîëæíû áûëè çàïèñàòü
ïðè ïîìîùè ìàêðîðåêîðäåðà, è òå, êîòîðûå áûëè íàïèñàíû áåç ðåêîðäåðà è ñî-
äåðæàëè òîëüêî âûâîä êðàòêîãî ñîîáùåíèÿ.
Íà÷íåì ñ ðåäàêòèðîâàíèÿ ðàíåå çàïèñàííûõ ìàêðîñîâ, òàê êàê, ïî ìíåíèþ
ìíîãèõ àâòîðîâ ðàáîò â ýòîé îáëàñòè, òàêîé ïîäõîä áûñòðî ïðèíîñèò îïðåäå-
ëåííóþ ïîëüçó. Ïåðåä òåì êàê âû ñìîæåòå ðåäàêòèðîâàòü ìàêðîñ, íåîáõîäèìî
îòîáðàçèòü ìîäóëü, ñîäåðæàùèé ýòîò ìàêðîñ. Íàïðèìåð, ÷òîáû ðåäàêòèðîâàòü
ìàêðîñ ÂûäåëèòüÒåêñò â Word, êîòîðûé âû ìîãëè çàïèñàòü ïðè ÷òåíèè ïåðâîé
ãëàâû, âû äîëæíû ñíà÷àëà îòîáðàçèòü ìîäóëü â Normal.dotm (ãäå áûëî ïðåä-
ëîæåíî ñîõðàíèòü çàïèñûâàåìûé ìàêðîñ), ñîäåðæàùèé èñõîäíûé êîä ìàêðîñà
ÂûäåëèòüÒåêñò. Àíàëîãè÷íî, äëÿ ðåäàêòèðîâàíèÿ ìàêðîñà FormatArial-
Bold12 â Excel, êîòîðûé âû òàêæå çàïèñàëè â ãëàâå 1, âû äîëæíû ñíà÷àëà îòî-
áðàçèòü ìîäóëü â ðàáî÷åé êíèãå Personal.xlsb (ãäå áûë ñîõðàíåí çàïèñàííûé
ìàêðîñ), ñîäåðæàùåé èñõîäíûé êîä ìàêðîñà FormatArialBold12.
Îòîáðàæåíèå ìîäóëÿ
Êàê íàéòè ìîäóëü, ñîäåðæàùèé íåîáõîäèìûé ìàêðîñ? Äëÿ ýòîãî â Word
2007 âûïîëíèòå ñëåäóþùèå øàãè:
1. Íàæìèòå Alt+F11, ÷òîáû àêòèâèçèðîâàòü Ðåäàêòîð VB, åñëè îí åùå íå
îòêðûò.
2. Âûáåðèòå êîìàíäó View | Project Explorer (âèä | îêíî ïðîåêòà), ÷òîáû îòîáðàçèòü
Project Explorer.
3. Ïðîñìîòðèòå äåðåâî-ñïèñîê â Project Explorer, ÷òîáû íàéòè ìîäóëü,
êîòîðûé âàì íåîáõîäèìî îòîáðàçèòü. Åñëè îïöèÿ ïðîñìîòðà ïàïîê â Project
Explorer âêëþ÷åíà, âû íàéäåòå âñå ìîäóëè ïðîåêòà â ïàïêå Modules âàøåãî
ïðîåêòà (ðèñ. 2.6).
Ðèñ. 2.6
Âñå ìîäóëè
ïðîåêòà ìîæíî
íàéòè â ïàïêå
Modules
60 Ãëàâà 2
Ðèñ. 2.7
Âûäåëèòå ïðîåêò â Project Explorer ïåðåä ïîèñêîì ìàêðîñà â
îêíå Object Browser
Ðèñ. 2.9
Îêíî Object
Browser ïîñëå
âûïîëíåíèÿ
ïîèñêà ìàêðîñà
Ðèñ. 2.10
Êîä íàéäåííîãî
ìàêðîñà â Code
Window
1: ‘ FormatArialBold12 Ìàêðîñ
2: ‘ Ôîðìàòèðóåò òåêñò äèàïàçîíà: Arial, Bold, 12
3: ‘
4:
5: ‘
6: With Selection.Font
7: .Name = “Arial”
8: .Size = 11
9: .Strikethrough = False
10: .Superscript = False
11: .Subscript = False
12: .OutlineFont = False
13: .Shadow = False
14: .Underline = xlUnderlineStyleNone
15: .ThemeColor = xlThemeColorLight1
16: .TintAndShade = 0
17: .ThemeFont = xlThemeFontNone
18: End With
19: Selection.Font.Bold = True
20: With Selection.Font
21: .Name = “Arial”
64 Ãëàâà 2
22: .Size = 12
23: .Strikethrough = False
24: .Superscript = False
25: .Subscript = False
26: .OutlineFont = False
27: .Shadow = False
28: .Underline = xlUnderlineStyleNone
29: .ThemeColor = xlThemeColorLight1
30: .TintAndShade = 0
31: .ThemeFont = xlThemeFontNone
32: End With
33: End Sub
Ëèñòèíã 2.2. Ìàêðîñ ÂûäåëèòüÒåêñò, çàïèñàííûé â Word
1: Sub ÂûäåëèòüÒåêñò()
2: '
3: ' ÂûäåëèòüÒåêñò Ìàêðîñ
4: ' Óñòàíàâëèâàåò Arial, Bold, 12 äëÿ âûäåëåííîãî òåêñòà
5 :'
6: Selection.Font.Name = "Arial"
7: Selection.Font.Size = 12
8: Selection.Font.Bold = wdToggle
9: End Sub
1: Sub NewBook()
2: '
2: ' NewBook Ìàêðîñ
3: '
4:
5: '
6: Workbooks.Add
7: ActiveWorkbook.SaveAs Filename:= _
8: "H:\Ïðîãðàììèðîâàíèå íà VBA 2007\Äîêóìåíòû\NewBook.xlsx", _
9: FileFormat:= _
10: xlOpenXMLWorkbook, CreateBackup:=False
11: ActiveWorkbook.Close
12: ActiveWindow.Close
13: End Sub
Ëèñòèíã 2.4 ïîêàçûâàåò, êàê ìîæåò âûãëÿäåòü ìàêðîñ NewBook ïîñëå «êîñ-
ìåòè÷åñêîãî» ðåäàêòèðîâàíèÿ. Èñõîäíûé êîä ýòîãî ìàêðîñà áûë îòðåäàêòèðî-
âàí òàê, ÷òîáû îí áûë áîëåå ÷èòàáåëüíûì.
Ðåäàêòèðîâàíèå ìàêðîñîâ 67
Ðèñ. 2.11
Îêíî Ñîçäàíèå êíèãè
Ýêñïîðòèðîâàíèå ìîäóëåé
Äëÿ ýêñïîðòèðîâàíèÿ ìîäóëÿ êàê òåêñòîâîãî ôàéëà âûïîëíèòå ñëåäóþùåå:
1. Âûäåëèòå â Project Explorer ìîäóëü, êîòîðûé õîòèòå ýêñïîðòèðîâàòü.
2. Âûáåðèòå êîìàíäó File | Export File. Ðåäàêòîð VB îòîáðàæàåò äèàëîãîâîå îêíî
Export File (ýêñïîðò ôàéëà), ïîêàçàííîå íà ðèñ. 2.12. Äèàëîãîâîå îêíî Export File
ðàáîòàåò â îñíîâíîì òàê æå, êàê ëþáîå äèàëîãîâîå îêíî File Save (ñîõðàíåíèå
äîêóìåíòà) â Windows.
3. Óáåäèòåñü, ÷òî â ñïèñêå Òèï ôàéëà (Save as type) âûäåëåí ïóíêò Basic Files
(*.bas). Ðàñøèðåíèå .bas îïðåäåëÿåò ýòîò ôàéë êàê ôàéë èñõîäíîãî êîäà VBA
èëè Visual Basic. Èíôîðìàöèÿ, ñîõðàíÿåìàÿ â ýòîì ôàéëå, — ýòî ÷èòàåìûé
òåêñò.
Ðåäàêòèðîâàíèå ìàêðîñîâ 69
4. Ââåäèòå èìÿ ýêñïîðòèðóåìîãî ôàéëà â òåêñòîâîå îêíî Èìÿ ôàéëà (File Name).
Ðåäàêòîð VB ââîäèò èìÿ ìîäóëÿ ïî óìîë÷àíèþ.
Ðèñ. 2.12
Èñïîëüçóéòå îêíî Export File äëÿ
ñîõðàíåíèÿ âñåãî ìîäóëÿ â âèäå
òåêñòîâîãî ôàéëà
Èìïîðòèðîâàíèå ìîäóëåé
Ðèñ. 2.13
Ýêñïîðòèðîâàí-
íûé ìîäóëüíûé
ôàéë,
îòîáðàæàåìûé â
Windows Notepad
Ðèñ. 2.14
Ýêñïîðòèðîâàííûé ìîäóëüíûé ôàéë, îòîáðàæàåìûé â Visual Basic 6
Ðèñ. 2.15
Îêíî Import File ïîçâîëÿåò äîáàâèòü ê
ïðîåêòó ìîäóëü, ðàíåå ýêñïîðòèðîâàííûé
èç Ðåäàêòîðà VB êàê òåêñòîâûé ôàéë
âàìè, Ðåäàêòîð VB äîáàâëÿåò ÷èñëî â êîíåö èìåíè ìîäóëÿ (1, 2, 3 è òàê äàëåå)
äëÿ ñîçäàíèÿ óíèêàëüíîãî èìåíè ìîäóëÿ.
3. Ùåëêíèòå íà êíîïêå Äà, åñëè õîòèòå ýêñïîðòèðîâàòü ìîäóëü ïåðåä åãî óäà-
ëåíèåì. (Íàñòîÿòåëüíî ðåêîìåíäóåòñÿ ýêñïîðòèðîâàòü ìîäóëü êàê ôàéë .bas,
åñëè òîëüêî âû íå óâåðåíû àáñîëþòíî, ÷òî âàì íèêîãäà íå ïîíàäîáÿòñÿ ìàêðî-
ñû, ñîäåðæàùèåñÿ â ýòîì ìîäóëå). Èíà÷å ìîæíî ùåëêíóòü íà êíîïêå Íåò äëÿ
óäàëåíèÿ ìîäóëÿ áåç åãî ýêñïîðòèðîâàíèÿ.
4. Åñëè âû âûáåðèòå ýêñïîðòèðîâàíèå ìîäóëÿ ïåðåä åãî óäàëåíèåì, Ðåäàêòîð
VB îòîáðàæàåò äèàëîãîâîå îêíî Export File, îïèñàííîå ðàíåå â ýòîì ðàçäåëå. Çà-
ïîëíèòå äèàëîãîâîå îêíî Export File, êàê óæå áûëî îïèñàíî, è ùåëêíèòå íà
êíîïêå Ñîõðàíèòü.
 ëþáîì ñëó÷àå Ðåäàêòîð VB óäàëÿåò ìîäóëü èç ïðîåêòà.
3. Â òåêñòîâîå ïîëå Name (èìÿ) â Properties Window ââåäèòå íîâîå èìÿ äëÿ ìîäó-
ëÿ. Êàê òîëüêî âû óáåðåòå êóðñîð âñòàâêè èç òåêñòîâîãî ïîëÿ Name, Ðåäàêòîð
VB ïåðåèìåíóåò ìîäóëü.
Ðèñ. 2.18
Âñïëûâàþùåå
îêíî Auto Quick
Info äëÿ MsgBox
Ðèñ. 2.19
Ðåçóëüòàò âûïîëíåíèÿ ìàêðîñà HelloWorld
Ðèñ. 2.20
Ðåçóëüòàò âûïîëíåíèÿ êîäà ëèñòèíãà 2.6
Îøèáêè ñèíòàêñèñà
Ñèíòàêñèñîì (syntax) — íàçûâàåòñÿ îïðåäåëåííûé ïîðÿäîê ñëîâ è
ñèìâîëîâ, êîòîðûé îáðàçóåò ïðàâèëüíûé îïåðàòîð VBA. Íåêîòîðûå èç
íàèáîëåå îáùèõ îøèáîê, ñ êîòîðûìè âû ñòàëêèâàåòåñü âî âðåìÿ íàïèñàíèÿ
èëè ðåäàêòèðîâàíèÿ ïðîöåäóð VBA, — ýòî îøèáêè ñèíòàêñèñà (syntax errors),
íàïðèìåð, ïðîïóùåííûå çàïÿòûå, êàâû÷êè, àðãóìåíòû è òàê äàëåå.
Âñÿêèé ðàç, êîãäà âû ïèøåòå íîâóþ ñòðîêó êîäà èëè èçìåíÿåòå
ñóùåñòâóþùóþ, VBA àíàëèçèðóåò (parses) ñòðîêó, êàê òîëüêî êóðñîð âñòàâêè
ïåðåìåùàåòñÿ èç íîâîé èëè èçìåíåííîé ñòðîêè. [Ñèíòàêñè÷åñêèé àíàëèç
(parsing) — ïðîöåññ ðàçäåëåíèÿ îïåðàòîðà VBA íà ñîñòàâëÿþùèå ÷àñòè è
îïðåäåëåíèå òîãî, êàêèå ÷àñòè ñòðîêè ÿâëÿþòñÿ êëþ÷åâûìè ñëîâàìè, ïå-
ðåìåííûìè èëè äàííûìè; ýòîò ïðîöåññ ïîäîáåí àíàëèçó ïðåäëîæåíèÿ â
êàêîì-ëèáî ÿçûêå äëÿ îïðåäåëåíèÿ åãî ñîñòàâëÿþùèõ ÷àñòåé — ñóùåñòâè-
òåëüíûõ, ãëàãîëîâ, ïðèëàãàòåëüíûõ è òàê äàëåå]. Ïîñëå âûïîëíåíèÿ àíàëèçà
ñòðîêè êîäà VBA êîìïèëèðóåò ýòó ñòðîêó êîäà. Êîìïèëÿöèÿ (compiling) â
VBA îçíà÷àåò ñîñòàâëåíèå èñõîäíîãî êîäà â ôîðìå, êîòîðóþ VBA ìîæåò
íåïîñðåäñòâåííî âûïîëíÿòü áåç íåîáõîäèìîñòè ñíîâà àíàëèçèðîâàòü êîä.
Ïîñëå òîãî êàê VBA óñïåøíî çàâåðøèò àíàëèç è êîìïèëÿöèþ ñòðîêè êîäà â
ïðîöåäóðå è íå áóäåò îáíàðóæåíî íèêàêèõ îøèáîê, âûïîëíèòñÿ öâåòîâîå
êîäèðîâàíèå ðàçëè÷íûõ ÷àñòåé ñòðîêè. (Ïîìíèòå, êëþ÷åâûå ñëîâà â
Ðåäàêòîðå VB îòîáðàæàþòñÿ ñèíèì öâåòîì, êîììåíòàðèè — çåëåíûì, à
äàííûå èëè äðóãèå îïåðàòîðû îòîáðàæàþòñÿ â âèäå ÷åðíîãî òåêñòà.) Åñëè,
îäíàêî, VBA îáíàðóæèâàåò îøèáêó ñèíòàêñèñà â ñòðîêå â ïðîöåññå àíàëèçà
èëè êîìïèëÿöèè, VBA îòîáðàæàåò âñþ ñòðîêó êðàñíûì öâåòîì è âûâîäèò íà
ýêðàí äèàëîãîâîå îêíî ñ ñîîáùåíèåì îá îøèáêå.
Ðàññìîòðèì ñëåäóþùèé ôðàãìåíò êîäà, ïðåäñòàâëÿþùèé íåïðàâèëüíî
íàïèñàííûé îïåðàòîð ñ èñïîëüçîâàíèåì âûçîâà ïðîöåäóðû MsgBox:
MsgBox “Hello, World!”, , Îêíî ïðèâåòñòâèÿ
 ýòîì ïðèìåðå êàâû÷êè, íåîáõîäèìûå âîêðóã òåêñòà, îïðåäåëÿþùåãî çàãî-
ëîâîê äèàëîãîâîãî îêíà, áûëè ñëó÷àéíî ïðîïóùåíû.  ðåçóëüòàòå VBA íå ìî-
æåò îïðåäåëèòü, ÷òî äâà ñëîâà â ïîñëåäíåì àðãóìåíòå ÿâëÿþòñÿ äàííûìè; âìå-
ñòî ýòîãî VBA âîñïðèíèìàåò ñëîâî Îêíî êàê èìÿ ïåðåìåííîé. [Ïåðåìåííîé
(variable) íàçûâàþò ìåñòî â ïàìÿòè, èñïîëüçóåìîå äëÿ ñîõðàíåíèÿ äàííûõ. Ïå-
ðåìåííûå îïèñûâàþòñÿ â ñëåäóþùåé ãëàâå.]
Ðåäàêòèðîâàíèå ìàêðîñîâ 79
Ðèñ. 2.21
Äèàëîãîâîå
îêíîVBA ñ
óêàçàíèåì îøèáêè
Ðèñ. 2.22
Íåêîòîðûå îøèáêè VBA îáíàðóæèâàåò âî
âðåìÿ âûïîëíåíèÿ ìàêðîñà
Ýòî äèàëîãîâîå îêíî èíôîðìèðóåò î òîì, ÷òî âîçíèêëà îøèáêà ïðè âûïîë-
íåíèè ïðîöåäóðû, è îòîáðàæàåò ñîîáùåíèå, îïèñûâàþùåå ýòó îøèáêó. Â äàí-
íîì ñëó÷àå îøèáêîé ÿâëÿåòñÿ îøèáêà íåñîîòâåòñòâèÿ òèïà (type mismatch
error). Íî ýòî íå îçíà÷àåò, ÷òî âû èñïîëüçîâàëè íåïðàâèëüíûé òèï äàííûõ, ê
ýòîìó íåñîîòâåòñòâèþ ìîãëà ïðèâåñòè êàêàÿ-òî äðóãàÿ îøèáêà.
Åñëè âû åùå ðàç ïîñìîòðèòå íà âûøåïðèâåäåííûé îïåðàòîð MsgBox, òî ìî-
æåòå çàìåòèòü, ÷òî îòñóòñòâóåò çàïÿòàÿ, îòìå÷àþùàÿ ìåñòî äëÿ íåîáÿçàòåëü-
íîãî MsgBox-àðãóìåíòà Buttons.
Êîãäà VBA àíàëèçèðóåò ýòîò îïåðàòîð, çàêëþ÷åííûé â êàâû÷êè òåêñò
«Îêíî ïðèâåòñòâèÿ» êîìïèëèðóåòñÿ êàê âòîðîé àðãóìåíò MsgBox, à íå êàê
òðåòèé àðãóìåíò èç-çà ïðîïóùåííîé çàïÿòîé. Ïîñêîëüêó àðãóìåíò êîìàíäíîé
êíîïêè (âòîðîé ïî ñïèñêó) äîëæåí áûòü ÷èñëîì, à íå òåêñòîì, VBA ñîîáùàåò î
Ðåäàêòèðîâàíèå ìàêðîñîâ 81
Ðèñ. 2.23
Âû ìîæåòå çàäàòü ðàçëè÷íûå ïàðàìåòðû
ïå÷àòè â ýòîì îêíå
Ðàçìåð â
Íàçâàíèå òèïà Îïèñàíèå è äèàïàçîí çíà÷åíèÿ
áàéòàõ
Îò –922337203685477.5808 äî
Currency 8
922337203685477.5807.
Îòðèöàòåëüíûå ÷èñëà:
îò –1.79769313486232E10308 äî
–4.94065645841247E10-324.
Double 8
Ïîëîæèòåëüíûå ÷èñëà:
îò 4.94065645841247E10-324 äî
1.79769313486232E10308.
Îòðèöàòåëüíûå ÷èñëà:
Single 4
îò –3.402823E1038 äî –1.401298E10-45
Ïîëîæèòåëüíûå ÷èñëà:
îò 1.401298E10-45 äî 3.402823E1038
10
String Èñïîëüçóåòñÿ äëÿ õðàíåíèÿ òåêñòà. Ìîæåò
áàéò+äëè
(ïåðåìåííîé ñîäåðæàòü îò 0 ñèìâîëîâ äî (ïðèáëèçèòåëüíî) 2
íà
äëèíû) ìèëëèàðäîâ ñèìâîëîâ.
ñòðîêè
Äëèíà
ñòðîêè
String Èñïîëüçóåòñÿ äëÿ õðàíåíèÿ òåêñòà. Ìîæåò
(îäèí
(ôèêñèðîâàííî ñîäåðæàòü îò îäíîãî äî (ïðèáëèçèòåëüíî) 654000
áàéò íà
é äëèíû) ñèìâîëîâ.
îäèí
ñèìâîë)
Ýêñïîíåíöèàëüíîå ïðåäñòàâëåíèå
 òàáëèöå 3.1 âû âñòðåòèëèñü ñ ïðåäñòàâëåíèåì äàííûõ, íàçûâàåìûì
ýêñïîíåíöèàëüíûì ïðåäñòàâëåíèåì (scientific notation), êîòîðîå èñïîëüçóåò-
ñÿ äëÿ îòîáðàæåíèÿ íà âíåøíèõ óñòðîéñòâàõ (ìîíèòîð, ïðèíòåð è ò.ä.) î÷åíü
áîëüøèõ è î÷åíü ìàëûõ ÷èñåë â êîìïàêòíîì ôîðìàòå.  ýêñïîíåíöèàëüíîì
ïðåäñòàâëåíèè çíà÷åíèÿ çàïèñûâàþòñÿ áåç íà÷àëüíûõ è êîíå÷íûõ íóëåé
è ñëåâà îò äåñÿòè÷íîãî çíàêà èìååòñÿ òîëüêî îäíà öèôðà. ×èñëî óìíîæàåòñÿ
íà 10 â íåêîòîðîé ñòåïåíè, ÷òîáû ïîêàçàòü, ãäå íà ñàìîì äåëå íàõîäèòñÿ
äåñÿòè÷íûé çíàê. Ýêñïîíåíöèàëüíîå ïðåäñòàâëåíèå êîìïàêòíî è ÷èòàáåëüíî
ïî ñðàâíåíèþ ñ îáû÷íûì ïðåäñòàâëåíèåì ÷èñëà ñ 300 íóëÿìè ïîñëå íåãî.
Ïîìíèòå, ÷òî îòðèöàòåëüíàÿ ñòåïåíü ïðèâîäèò â ðåçóëüòàòå ê ìåíüøåìó
÷èñëó, à ïîëîæèòåëüíàÿ — ê áîëüøåìó.  èñõîäíîì êîäå íåâîçìîæíî èñïîëü-
çîâàòü íàäñòðî÷íûå (superscript) ñèìâîëû, ïîýòîìó VBA èñïîëüçóåò âàðè-
àöèþ ýêñïîíåíöèàëüíîãî ïðåäñòàâëåíèÿ, ðàçðàáîòàííóþ ñïåöèàëüíî äëÿ êîì-
ïüþòåðîâ. Â ýêñïîíåíöèàëüíîì ïðåäñòàâëåíèè VBA èñïîëüçóéòå áóêâó Å
ñ ïîñëåäóþùåé ñòåïåíüþ.  ñëåäóþùåé òàáëèöå ïðèâîäÿòñÿ ïðèìåðû ÷èñåë
â ýêñïîíåíöèàëüíîì è îáû÷íîì ïðåäñòàâëåíèè.
–2.43E2 –243
–1.43E–2 –0.0143
5.5E10 55,000,000,000
3E9 3,000,000,000
4.5E–10 0,00000000045
1.6E2 160
Òèï Date
VBA èñïîëüçóåò òèï Date äëÿ õðàíåíèÿ äàò è âðåìåíè. Òèï Date
èñïîëüçóåò âîñåìü áàéòîâ ïàìÿòè äëÿ êàæäîé ñîõðàíÿåìîé êîìáèíàöèè
äàòà/âðåìÿ. Ïðè ðàáîòå ñ äàííûìè òèïà Date ñëåäóåò çíàòü, ÷òî VBA-òèïû
Date íå ÿâëÿþòñÿ îäíèìè è òåìè æå, ÷òî òèïû äàííûõ, èñïîëüçóåìûå â
ðàáî÷èõ ëèñòàõ Excel èëè áàçàõ äàííûõ Access, õîòÿ îíè âî ìíîãîì ïîõîæè.
Íåò íåîáõîäèìîñòè áåñïîêîèòüñÿ î òîì, êàê VBA õðàíèò äàííûå òèïà Date,
— ìîæíî ïðîñòî îòîáðàæàòü, ñîõðàíÿòü èëè ìàíèïóëèðîâàòü äàòàìè; VBA
àâòîìàòè÷åñêè óïðàâëÿåò âñåìè äåòàëÿìè ïðåîáðàçîâàíèÿ ïîñëåäîâàòåëüíîãî
÷èñëà â ãîä, ìåñÿö, äåíü è âðåìÿ. Êîãäà VBA îòîáðàæàåò äàòû, (íàïðèìåð, ïðè
ïðèìåíåíèè MsgBox), äàòà ïðåäñòàâëÿåòñÿ â êîðîòêîì ôîðìàòå, êîòîðûé
èñïîëüçóåòñÿ äàííûì êîìïüþòåðîì. Àíàëîãè÷íî, VBA îòîáðàæàåò
èíôîðìàöèþ î âðåìåíè, ñîõðàíÿåìóþ ñ Date, èñïîëüçóÿ 12- èëè 24-÷àñîâûé
âðåìåííîé ôîðìàò äëÿ äàííîãî êîìïüþòåðà. (Â Windows 98/NT 4.0/2000 âû
ìîæåòå èçìåíÿòü ôîðìàòû äàò è âðåìåíè, âûáðàâ çíà÷îê ßçûê è ñòàíäàðòû íà
Ïàíåëè óïðàâëåíèÿ.)
86 Ãëàâà 3
 ðåçóëüòàòå ðàáîòû ýòîãî ìàêðîñà íà ýêðàí áóäåò âûäàíà áàçîâàÿ äàòà, êàê
ïîêàçàíî íà ðèñ. 3.1.
Ðèñ. 3.1
Áàçîâàÿ äàòà äëÿ VBA-òèïà Date
Àíàëîãè÷íî, åñëè âàì íåîáõîäèìî îïðåäåëèòü äàòó ÷åðåç 60 äíåé ïîñëå äàííîé
äàòû, ïðîñòî ïðèáàâüòå 60 ê ýòîé äàòå.
 VBA èìååòñÿ íåñêîëüêî âñòðîåííûõ ïðîöåäóð (îïèñàííûõ â ñëåäóþùèõ
ãëàâàõ) äëÿ îòäåëüíîãî èçâëå÷åíèÿ ãîäà, ìåñÿöà, äíÿ, ÷àñîâ, ìèíóò è ñåêóíä èç
ïåðåìåííîé òèïà Date.
×èñëà
VBA èìååò øåñòü ðàçëè÷íûõ ÷èñëåííûõ òèïîâ äàííûõ: Byte, Integer,
Long, Single, Double è Currency. ×èñëåííûå òèïû äàííûõ èñïîëüçóþòñÿ
äëÿ õðàíåíèÿ (è ìàíèïóëèðîâàíèÿ) ÷èñåë â ðàçëè÷íûõ ôîðìàòàõ, â çàâèñèìî-
ñòè îò êîíêðåòíîãî òèïà. ×èñëåííûå òèïû ïðåäîñòàâëÿþò êîìïàêòíûé è ýô-
ôåêòèâíûé ñïîñîá õðàíåíèÿ ÷èñåë. ×èñëåííûé òèï, çàïîëíÿþùèé áîëüøóþ
÷àñòü ïàìÿòè (èìåþùèé ñàìûé áîëüøîé äèàïàçîí âîçìîæíûõ çíà÷åíèé), çà-
íèìàåò íå áîëåå âîñüìè áàéòîâ ïàìÿòè äëÿ õðàíåíèÿ ÷èñåë, êîòîðûå ìîãóò
èìåòü äî 300 öèôð.
1 Çäåñü è äàëåå äëÿ îáîçíà÷åíèÿ äåéñòâèòåëüíûõ ÷èñåë èñïîëüçóåòñÿ çíàê çàïÿòîé (,) ïî-
ñêîëüêó èìååòñÿ â âèäó îáû÷íàÿ ìàòåìàòè÷åñêàÿ çàïèñü ÷èñëà.
88 Ãëàâà 3
Òåêñòîâûå ñòðîêè
Ëþáûå òåêñòîâûå äàííûå, ñîõðàíÿåìûå â ïðîãðàììå VBA, íàçûâàþòñÿ
ñòðîêàìè (strings). Ñòðîêè â VBA ñîõðàíÿþòñÿ ñ èñïîëüçîâàíèåì òèïà äàííûõ
String. Ñòðîêè ïîëó÷èëè òàêîå íàçâàíèå, ïîòîìó ÷òî òåêñòîâûå äàííûå îáû÷-
íî ðàññìàòðèâàþòñÿ êàê ñòðîêè ñèìâîëîâ. Ñòðîêà ìîæåò ñîäåðæàòü òåêñòîâûå
ñèìâîëû ëþáûõ òèïîâ: áóêâû àëôàâèòà, öèôðû, çíàêè ïóíêòóàöèè èëè ðàç-
ëè÷íûå ñèìâîëû. Ñòðîêè â êîäå VBA âñåãäà çàêëþ÷àþòñÿ â äâîéíûå êàâû÷êè
(""). "Âàñÿ", "Ïåòð Ïåðâûé", "3,141" è "1 000,00" — ýòî ñòðîêè. Ñóùåñòâóþò
äâå êàòåãîðèè ñòðîê: ñòðîêè ïåðåìåííîé äëèíû, ðàçìåð êîòîðûõ ðàñòåò èëè
óìåíüøàåòñÿ, è ñòðîêè ôèêñèðîâàííîé äëèíû, ðàçìåð êîòîðûõ âñåãäà îñòàåò-
ñÿ îäíèì è òåì æå. Âñå ñòðîêè â VBA ÿâëÿþòñÿ ñòðîêàìè ïåðåìåííîé äëèíû,
åñëè òîëüêî âû íå çàäàåòå ôèêñèðîâàííóþ äëèíó (îá ýòîì áóäåò ðàññêàçàíî äà-
ëåå â ýòîé ãëàâå).
Òèïû String èãðàþò âàæíóþ ðîëü âî ìíîãèõ ïðîãðàììàõ VBA (è íà ëþáûõ
äðóãèõ ÿçûêàõ ïðîãðàììèðîâàíèÿ). Áîëüøèíñòâî äàííûõ ââîäà ïîëüçîâàòå-
ëåé (â äèàëîãîâûõ îêíàõ, ÿ÷åéêàõ ðàáî÷èõ ëèñòîâ) — ýòî ñòðîêîâûå äàííûå.
Êðîìå òîãî, ïîñêîëüêó âû ìîæåòå îòîáðàæàòü íà ýêðàíå òîëüêî òåêñò, âñå äðó-
ãèå òèïû äàííûõ äîëæíû áûòü ïðåîáðàçîâàíû â ñòðîêîâûå äàííûå ïåðåä òåì,
êàê âû ñìîæåòå èõ âûâåñòè íà ýêðàí. Ìíîãèå âñòðîåííûå ïðîöåäóðû VBA (ïî-
äîáíûå MsgBox) èñïîëüçóþò ñòðîêîâûå äàííûå âî âñåõ èëè â íåêîòîðûõ ñâîèõ
àðãóìåíòàõ. Åñëè âû øèðîêî èñïîëüçóåòå Word VBA, òî ìîãëè çàìåòèòü, ÷òî
ïðîöåäóðû ìàíèïóëèðóþò èñêëþ÷èòåëüíî ñòðîêîâûìè äàííûìè.
VBA ïðåäîñòàâëÿåò íåñêîëüêî îïåðàòîðîâ äëÿ êîíêàòåíàöèè (concatenate),
òî åñòü äëÿ ñîåäèíåíèÿ âìåñòå è äëÿ ñðàâíåíèÿ ñòðîê. VBA èìååò òàêæå íå-
ñêîëüêî âñòðîåííûõ ïðîöåäóð, ïîìîãàþùèõ èçâëåêàòü ïîäñòðîêè èç áîëåå
äëèííûõ ñòðîê, íàõîäèòü ñèìâîëû èëè ñëîâà â ñòðîêå, èçìåíÿòü ðåãèñòð áóêâ
â ñòðîêå è òàê äàëåå.
Î÷åíü âàæíî íàó÷èòüñÿ ëåãêî îáðàùàòüñÿ ñî ñòðîêîâûìè äàííûìè è
èñïîëüçîâàòü ôóíêöèè îáðàáîòêè ñòðîê. Â ñëåäóþùèõ ãëàâàõ îïèñûâàþòñÿ
ñòðîêîâûå îïåðàòîðû VBA è ïðîöåäóðû äëÿ ìàíèïóëèðîâàíèÿ ñòðîêàìè VBA.
Ëîãè÷åñêèå çíà÷åíèÿ
Îáû÷íî VBA-ïðîãðàììà (êàê è ëþáûå äðóãèå ïðîãðàììû) «ïðèíèìàåò» ðå-
øåíèÿ, ïðîâåðÿÿ, ÿâëÿþòñÿ ëè èñòèííûìè ðàçëè÷íûå óñëîâèÿ. Äëÿ óïðîùå-
íèÿ òåñòèðîâàíèÿ óñëîâèé è îáåñïå÷åíèÿ ñîõðàíåíèÿ ðåçóëüòàòîâ òàêîãî òåñ-
òèðîâàíèÿ â VBA èìååòñÿ ëîãè÷åñêèé òèï äàííûõ. Ëîãè÷åñêèå çíà÷åíèÿ True
è False íàçûâàþò áóëåâûìè (Boolean) çíà÷åíèÿìè. (Èõ íàçâàíèå ñâÿçàíî ñ
èìåíåì ìàòåìàòèêà, ðàçðàáîòàâøåãî ñèñòåìó ìàòåìàòè÷åñêîé ëîãèêè.) Ëîãè-
÷åñêèé òèï äàííûõ VBA íàçûâàþò òàêæå òèïîì Boolean.
Boolean-òèï VBA òðåáóåò äâóõ áàéòîâ ïàìÿòè è ìîæåò èìåòü îäíî èç äâóõ
çíà÷åíèé: True èëè False. Åñëè âû îòîáðàæàåòå òèï Boolean íà ýêðàíå, VBA
àâòîìàòè÷åñêè ïðåîáðàçóåò åãî â ñòðîêó, ñîäåðæàùóþ ëèáî ñëîâî True, ëèáî
False. Áóëåâû çíà÷åíèÿ ïîëó÷àþò êàê ðåçóëüòàò îïåðàöèè ñðàâíåíèÿ. Îïåðà-
öèÿ ñðàâíåíèÿ (comparison operation) èìååò ìåñòî ïðè ñðàâíåíèè îäíîãî ñ äðó-
90 Ãëàâà 3
ãèì, íàïðèìåð, ïðè ñðàâíåíèè äâóõ ÷èñåë äëÿ îïðåäåëåíèÿ, êîòîðîå èç íèõ
áîëüøå, èëè ñðàâíåíèè äâóõ ñòðîê äëÿ îïðåäåëåíèÿ, êîòîðàÿ èç ñòðîê íàõî-
äèòñÿ íèæå â àëôàâèòíîì ïîðÿäêå.
Ïåðåìåííûå
Ïåðåìåííûå î÷åíü âàæíû, ïîñêîëüêó îíè îáåñïå÷èâàþò âîçìîæíîñòü
â êîìïüþòåðíîé ïðîãðàììå âðåìåííî ñîõðàíÿòü è ìàíèïóëèðîâàòü äàííûìè.
 ýòîì ðàçäåëå îïèñûâàåòñÿ, ÷òî òàêîå ïåðåìåííàÿ è êàê ñîçäàâàòü ïåðåìåí-
íûå.
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 91
Èäåíòèôèêàòîðû
Èäåíòèôèêàòîð (identifier) — ýòî èìÿ, êîòîðîå âû äàåòå ýëåìåíòàì â ñîç-
äàâàåìûõ âàìè ïðîöåäóðàõ è ìîäóëÿõ, òàêèì êàê ïåðåìåííûå. Òåðìèí èäåí-
òèôèêàòîð îñíîâûâàåòñÿ íà òîì ôàêòå, ÷òî èìåíà, êîòîðûå âû ñîçäàåòå, îïðå-
äåëÿþò êîíêðåòíûå ó÷àñòêè ïàìÿòè (â ñëó÷àå èìåíè ïåðåìåííîé), ãðóïïû èí-
ñòðóêöèé (â ñëó÷àå èìåíè ìàêðîñà èëè ïðîöåäóðû) èëè äðóãèå ýëåìåíòû
ïðîãðàììû.
Ïðè âûáîðå èìåíè ïåðåìåííîé íåîáõîäèìî ñîáëþäàòü ñëåäóþùèå ïðàâèëà:
¨ Èìÿ ïåðåìåííîé äîëæíî íà÷èíàòüñÿ ñ áóêâû àëôàâèòà.
¨ Ïîñëå ïåðâîé áóêâû èìÿ ïåðåìåííîé ìîæåò ñîñòîÿòü èç ëþáîé êîìáèíà-
öèè öèôð, áóêâ èëè ñèìâîëîâ ïîä÷åðêèâàíèÿ ( ).
¨ Èìåíà ïåðåìåííûõ íå ìîãóò ñîäåðæàòü ïðîáåëû, òî÷êó (.) èëè ëþáîé äðó-
ãîé ñèìâîë, êîòîðûé VBA èñïîëüçóåò äëÿ îáîçíà÷åíèÿ ìàòåìàòè÷åñêèõ
îïåðàöèé è îïåðàöèé ñðàâíåíèÿ (=, +, – è òàê äàëåå).
¨ Èìåíà ïåðåìåííûõ íå ìîãóò ïðåâûøàòü 255 ñèìâîëîâ.
¨ Èìÿ ïåðåìåííîé íå ìîæåò äóáëèðîâàòü îïðåäåëåííûå êëþ÷åâûå ñëîâà
VBA. Åñëè âû âûáåðåòå èìåíà ïåðåìåííûõ, äóáëèðóþùèå êëþ÷åâûå ñëî-
âà, íàçûâàåìûå îãðàíè÷åííûìè êëþ÷åâûìè ñëîâàìè (restricted keywords),
VBA îòîáðàæàåò îäíî èç íåñêîëüêèõ âîçìîæíûõ ñîîáùåíèé îá îøèáêå
ñèíòàêñèñà.
¨ Èìÿ ïåðåìåííîé äîëæíî áûòü óíèêàëüíûì â ðàìêàõ åãî îáëàñòè äåéñò-
âèÿ (scope). Òî åñòü, èìÿ ïåðåìåííîé äîëæíî áûòü óíèêàëüíûì â ïðåäå-
ëàõ ïðîöåäóðû èëè ìîäóëÿ, â êîòîðîì âû îáúÿâëÿåòå ýòó ïåðåìåííóþ.
Íåêîòîðûå ïðèìåðû ïðàâèëüíûõ èìåí ïåðåìåííûõ:
Var12
Birth_Date
Ald_Item
Percent
Whole
Part
Line12
Ñîçäàíèå ïåðåìåííûõ
Ñàìûì ïðîñòûì ñïîñîáîì ñîçäàíèÿ ïåðåìåííîé ÿâëÿåòñÿ èñïîëüçîâàíèå åå
â îïåðàòîðå VBA. VBA ñîçäàåò ïåðåìåííóþ è ðåçåðâèðóåò ïàìÿòü äëÿ ÿ÷åéêè
ïàìÿòè ïåðåìåííîé, êîãäà ýòà ïåðåìåííàÿ â ïåðâûé ðàç ïîÿâëÿåòñÿ â îïåðàòî-
ðå (îáû÷íî â îïåðàòîðå, ñîõðàíÿþùåì çíà÷åíèå äàííûõ â ïåðåìåííîé).
Ñîõðàíåíèå çíà÷åíèÿ äàííûõ â ïåðåìåííîé íàçûâàåòñÿ ïðèñâàèâàíèåì ïå-
ðåìåííîé (assigning the variable èëè making an assignment). Ïðèñâàèâàíèå âû-
ïîëíÿåòñÿ ñ ïîìîùüþ îïåðàòîðà ïðèñâàèâàíèÿ, ïðåäñòàâëÿåìîãî çíàêîì (=).
Ñëåäóþùàÿ ñòðîêà ÿâëÿåòñÿ ïðèìåðîì ïðèñâàèâàíèÿ çíà÷åíèÿ ïåðåìåííîé:
MyVar = 25
Ýòîò îïåðàòîð ñîõðàíÿåò ÷èñëåííîå çíà÷åíèå 25 â ÿ÷åéêå ïàìÿòè, çàäàííîé
èìåíåì ïåðåìåííîé MyVar. Åñëè îïåðàòîð ïåðâûì èñïîëüçóåò äàííóþ ïåðå-
ìåííóþ â ïðîöåäóðå, òî VBA ñîçäàåò ýòó ïåðåìåííóþ, ðåçåðâèðóåò ÿ÷åéêó ïà-
ìÿòè äëÿ õðàíåíèÿ äàííûõ ýòîé ïåðåìåííîé è çàòåì ñîõðàíÿåò ÷èñëî 25
â ÿ÷åéêå ïàìÿòè, çàäàííîé èìåíåì ïåðåìåííîé.
Åñëè ïåðåìåííàÿ MyVar óæå ñóùåñòâóåò, òî VBA ñîõðàíÿåò ÷èñëî 25
â ÿ÷åéêå ïàìÿòè, íà êîòîðóþ ññûëàåòñÿ MyVar. Íîâîå çíà÷åíèå çàìåíÿåò ëþ-
áîå, ðàíåå ñîõðàíåííîå â MyVar çíà÷åíèå, è ïðåäûäóùåå ñîäåðæèìîå MyVar
òåðÿåòñÿ.
Ñîçäàíèå ïåðåìåííîé ïóòåì åå èñïîëüçîâàíèÿ â îïåðàòîðå íàçûâàåòñÿ íåÿâ-
íûì îáúÿâëåíèåì ïåðåìåííîé (implicit variable declaration). Èñïîëüçóÿ ïåðåìåí-
íóþ â îïåðàòîðå, âû íåÿâíî óêàçûâàåòå (îáúÿâëÿåòå) VBA, ÷òî õîòèòå ñîçäàòü
ýòó ïåðåìåííóþ. Âñå ïåðåìåííûå, êîòîðûå VBA ñîçäàåò íåÿâíûì îáúÿâëåíèåì
ïåðåìåííîé, èìåþò òèï äàííûõ Variant. Íåÿâíîå îáúÿâëåíèå ïåðåìåííûõ èç-
âåñòíî òàêæå êàê îáúÿâëåíèå ïåðåìåííûõ «íà ëåòó» (on-the-fly).
94 Ãëàâà 3
Ðèñ. 3.2
Îêíî ñîîáùåíèé, ïîëó÷åííîå
ïðîöåäóðîé HelloWorld
Çàìå÷àíèå
Êàê òîëüêî âû ââîäèòå êëþ÷åâîå ñëîâî As ïðè îáúÿâëåíèè ïåðåìåííîé, ðåäàêòîð VB
ïðåäëàãàåò ñïèñîê òèïîâ ïåðåìåííûõ, êîòîðûé çàâèñèò îò ïîäêëþ÷åííûõ ê ïðîåêòó
áèáëèîòåê.
Âîò îáùèé ñèíòàêñèñ äëÿ èñïîëüçîâàíèÿ îïåðàòîðà Dim ïðè îáúÿâëåíèè òè-
ïèçèðîâàííûõ ïåðåìåííûõ:
Ñèíòàêñèñ
Dim varname1 [As type1] [, varname2 [As type2]…] [As type]
VarnameN ïðåäñòàâëÿåò ëþáîå äîïóñòèìîå èìÿ ïåðåìåííîé VBA, à type(N) — ëþ-
áîå èç èìåí òèïîâ äàííûõ VBA.
Ýòà âåðñèÿ ïðîöåäóðû HelloWorld ðàáîòàåò âî ìíîãîì òàê æå, êàê è ïðåäû-
äóùèå. Ñòðîêà 1 ñîäåðæèò îáúÿâëåíèå ïðîöåäóðû. Â ñòðîêå 2 îïåðàòîð Dim
ÿâíî îáúÿâëÿåò ïåðåìåííóþ HelloMsg. Ïîñêîëüêó îïåðàòîð Dim âêëþ÷àåò
êëþ÷åâîå ñëîâî As è èìÿ òèïà String, ïåðåìåííàÿ HelloMsg èìååò òèï
String. Ñòðîêà 3 ïðèñâàèâàåò òåêñò ñîîáùåíèÿ ñòðîêîâîé ïåðåìåííîé
HelloMsg.
Ñòðîêà 4 íåÿâíî îáúÿâëÿåò ïåðåìåííóþ Title$ è â òî æå âðåìÿ ïðèñâàèâàåò
ïåðåìåííîé òåêñò çàãîëîâêà îêíà ñîîáùåíèÿ. Ïîñêîëüêó èìÿ ïåðåìåííîé
Title$ èìååò íà êîíöå ñèìâîë îïðåäåëåíèÿ òèïà äëÿ ñòðîêè, ýòà ïåðåìåííàÿ
òàêæå èìååò òèï String. Íàêîíåö, ñòðîêà 5 èñïîëüçóåò îïåðàòîð MsgBox äëÿ
îòîáðàæåíèÿ îêíà ñîîáùåíèÿ; â ýòîì îïåðàòîðå è òåêñò ñîîáùåíèÿ, è ñòðîêà
çàãîëîâêà îêíà ÿâëÿþòñÿ ïåðåìåííûìè: HelloMsg è Title$, ñîîòâåòñòâåííî.
Ïîñëå äîáàâëåíèÿ ñèìâîëà îïðåäåëåíèÿ òèïà ê ïåðåìåííîé íåîáõîäèìî
âêëþ÷àòü ñèìâîë îïðåäåëåíèÿ òèïà êàæäûé ðàç, êîãäà âû èñïîëüçóåòå èìÿ ïå-
ðåìåííîé. Åñëè áû ñèìâîë îïðåäåëåíèÿ òèïà áûë îïóùåí â èìåíè ïåðåìåííîé
Title$ â ñòðîêå 5 (ãäå Title$ èñïîëüçóåòñÿ ïåðâûé ðàç ïîñëå íåÿâíîãî òèïèçè-
ðîâàííîãî îáúÿâëåíèÿ), òî âî âðåìÿ âûïîëíåíèÿ ïðîöåäóðû ïðîèçîøëà áû
runtime-îøèáêà.
Çàìå÷àíèå
Îáëàñòü â íà÷àëå ìîäóëÿ ïåðåä ëþáûìè îáúÿâëåíèÿìè ïðîöåäóð íàçûâàþò îáëàñòüþ
îáúÿâëåíèé (declaration) ìîäóëÿ, ïîòîìó ÷òî èìåííî òóäà ñëåäóåò ïîìåùàòü îáúÿâëåíèÿ
ïåðåìåííûõ ìîäóëüíîãî óðîâíÿ è äðóãèå äèðåêòèâû äëÿ VBA, âëèÿþùèå íà âåñü ìîäóëü. Âû
ìîæåòå ëåãêî ïåðåõîäèòü ê îáëàñòè îáúÿâëåíèé ëþáîãî ìîäóëÿ, âûáèðàÿ (Declarations) â
ñïèñêå Procedure îêíà (Code).
Äëÿ òîãî ÷òîáû ïåðåìåííàÿ áûëà äîñòóïíîé äëÿ âñåõ ïðîöåäóð â îïðåäåëåí-
íîì ìîäóëå, ïîìåñòèòå îïåðàòîð Dim äëÿ íåå â íà÷àëî ìîäóëÿ ïåðåä ëþáûìè
îáúÿâëåíèÿìè ïðîöåäóð. Â ëèñòèíãå 3.4 ïðèâåäåí ìîäóëü, ñîäåðæàùèé äâå
ïðîñòûå ïðîöåäóðû è åäèíñòâåííîå îáúÿâëåíèå ïåðåìåííîé ìîäóëüíîãî óðîâ-
íÿ. Ïðîöåäóðà HelloWorld â ëèñòèíãå 3.4 îòîáðàæàåò òî æå îêíî ñîîáùåíèÿ,
êîòîðîå ïîêàçàíî íà ðèñ. 3.2.
 ëèñòèíãå 3.5 ïðèâåäåíû òðè ðàçëè÷íûå ïðîöåäóðû. Ïåðâûå äâå óæå èñ-
ïîëüçîâàëèñü â ëèñòèíãå 3.4. Òðåòüÿ ïðîöåäóðà AnotherMessage íà÷èíàåòñÿ â
ñòðîêå 13 è çàêàí÷èâàåòñÿ â ñòðîêå 17. AnotherMessage ðàáîòàåò òàê æå, êàê
ïðåäûäóùèå ïðîöåäóðû, îòîáðàæàÿ ñîîáùåíèå â äèàëîãîâîì îêíå ñ èñïîëüçî-
âàíèåì îïåðàòîðà MsgBox.
Çàìåòüòå, ÷òî ñòðîêà 1 ýòîãî ëèñòèíãà îáúÿâëÿåò ïåðåìåííóþ ìîäóëüíîãî
óðîâíÿ HelloMsg. Ñòðîêà 14 â ïðîöåäóðå AnotherMessage òàêæå îáúÿâëÿåò ïå-
ðåìåííóþ ñ èìåíåì HelloMsg. Ïðè âûïîëíåíèè ïðîöåäóðû HelloWorld VBA
èñïîëüçóåò ïåðåìåííóþ HelloMsg, îáúÿâëåííóþ â ñòðîêå 1. HelloWorld íå
èìååò ïåðåìåííûõ, îáúÿâëåííûõ ëîêàëüíî, çäåñü íåâîçìîæíà äâóñìûñëåí-
íîñòü, ïîýòîìó VBA èñïîëüçóåò ïåðåìåííóþ ìîäóëüíîãî óðîâíÿ. Àíàëîãè÷íî,
ïðè âûïîëíåíèè ïðîöåäóðû HelloDave VBA òàêæå èñïîëüçóåò ïåðåìåííóþ
HelloMsg, îáúÿâëåííóþ â ñòðîêå 1.
Çàìå÷àíèå
Ïåðåìåííûå ïðîöåäóðíîãî óðîâíÿ ÷àñòî íàçûâàþò ëîêàëüíûìè (local) ïåðåìåííûìè, ïîòîìó ÷òî
èõ îáúÿâëåíèÿ ÿâëÿþòñÿ ëîêàëüíûìè äëÿ âûïîëíÿåìîé â äàííûé ìîìåíò ïðîöåäóðû.
Êðîìå ñòðîêè 1, âñå â ýòîì ìîäóëå ðàáîòàåò òî÷íî òàê æå, êàê â ëèñòèí-
ãå 3.4. Ñòðîêà 1 ìîäóëÿ â ëèñòèíãå 3.6 ñîäåðæèò êîìàíäó Option Explicit.
Èç-çà ýòîé êîìàíäû âñå ïåðåìåííûå â ìîäóëå äîëæíû îáúÿâëÿòüñÿ îïåðàòîðîì
Dim. Åñëè äîáàâèòü íåÿâíîå îáúÿâëåíèå ïåðåìåííûõ â ýòîò ìîäóëü, VBA îòî-
áðàæàåò ñîîáùåíèå îá îøèáêå âðåìåíè èñïîëíåíèÿ, óòâåðæäàÿ, ÷òî ýòà ïåðå-
ìåííàÿ ÿâëÿåòñÿ íåîáúÿâëåííîé.
Òàêèå êîìàíäû, êàê Option Explicit, íàçûâàþòñÿ äèðåêòèâàìè êîìïè-
ëÿòîðà (compiler directives). Äèðåêòèâû êîìïèëÿòîðà íå âûçûâàþò íèêàêèõ
äåéñòâèé VBA. Êîìïèëÿòîð VBA ÿâëÿåòñÿ ÷àñòüþ VBA, êîòîðàÿ ÷èòàåò èñõîä-
íûé êîä è êîìïèëèðóåò (compiles) åãî â ìàøèííûå èíñòðóêöèè, íåîáõîäèìûå
êîìïüþòåðó äëÿ âûïîëíåíèÿ ïîñòàâëåííîé çàäà÷è. Äèðåêòèâà êîìïèëÿòîðà
ïðîñòî èíñòðóêòèðóåò VBA î ñïåöèôè÷åñêèõ ïðàâèëàõ, êîòîðûì äîëæåí ñëå-
äîâàòü VBA ïðè êîìïèëÿöèè âàøåãî èñõîäíîãî êîäà.
Êîìàíäà Option Explicit äåéñòâóåò òîëüêî íà ìîäóëü, â êîòîðîì îíà ïî-
ÿâëÿåòñÿ. Åñëè ïðîåêò, ñîäåðæàùèé ýòîò ìîäóëü, ñîäåðæèò òàêæå äðóãèå ìî-
äóëè, íà íèõ íå äåéñòâóåò êîìàíäà Option Explicit. Íåîáõîäèìî âêëþ÷àòü
êîìàíäó Option Explicit â êàæäûé ìîäóëü, äëÿ êîòîðîãî òðåáóþòñÿ ÿâíûå
îáúÿâëåíèÿ ïåðåìåííûõ.
Ïîñêîëüêó âêëþ÷åíèå Option Explicit âî âñå ìîäóëè ÿâëÿåòñÿ î÷åíü
ïîëåçíûì, Ðåäàêòîð VB ïðåäîñòàâëÿåò ñïîñîá àâòîìàòè÷åñêè âêëþ÷àòü ýòó
êîìàíäó â êàæäûé íîâûé ìîäóëü ïðè åãî ñîçäàíèè. Äëÿ òîãî ÷òîáû Ðåäàêòîð
VB äîáàâëÿë êîìàíäó Option Explicit â êàæäûé íîâûé ìîäóëü, âûáåðèòå
îïöèþ Require Variable Declaration (ÿâíîå îïèñàíèå ïåðåìåííûõ) íà âêëàäêå Editor
(ðåäàêòîð) äèàëîãîâîãî îêíà Options (ïàðàìåòðû) Ðåäàêòîðà VBA, âûïîëíÿÿ
ñëåäóþùèå øàãè:
1.Âûáåðèòå êîìàíäó Tools | Options (Ñåðâèñ | Ïàðàìåòðû). Ðåäàêòîð VBA
îòîáðàæàåò äèàëîãîâîå îêíî Options.
2. Ùåëêíèòå íà âêëàäêå Editor (Ðåäàêòîð) äëÿ îòîáðàæåíèÿ ïàðàìåòðîâ
ðåäàêòèðîâàíèÿ, åñëè íåîáõîäèìî.
3. Âûáåðèòå ôëàæîê Require Variable Declaration (ÿâíîå îïèñàíèå ïåðåìåííûõ).
4. Âûáåðèòå ÎÊ. Ðåäàêòîð VB çàêðûâàåò äèàëîãîâîå îêíî Options.
Òåïåðü êàæäûé ðàç, êîãäà âû (èëè ìàêðîðåêîðäåð) âñòàâëÿåòå íîâûé ìî-
äóëü â ïðîåêò, Ðåäàêòîð VB àâòîìàòè÷åñêè äîáàâëÿåò êîìàíäó Option
Explicit â íà÷àëî ìîäóëÿ.
Âûáîð îïöèè Require Variable Declaration â äèàëîãîâîì îêíå Options âëèÿåò
òîëüêî íà íîâûå ìîäóëè; åñëè âû õîòèòå çàïðîñèòü ÿâíîå îáúÿâëåíèå
ïåðåìåííûõ â ñóùåñòâóþùåì ìîäóëå, âû äîëæíû äîáàâèòü Option Explicit,
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 105
Êîíñòàíòû
Êîíñòàíòà (constant) — ýòî çíà÷åíèå â ïðîãðàììå VBA, êîòîðîå íå ìåíÿ-
åòñÿ. Ïðèìåðû ïðîöåäóð, óæå ïðèâåäåííûå â ýòîé êíèãå, èñïîëüçóþò ñòðîêî-
âûå êîíñòàíòû òèïà «Hello World!» è «Äðóãîå îêíî ñîîáùåíèÿ». Êîíñòàíòû,
ïîäîáíûå èì, íàçûâàþò ëèòåðàëüíûìè êîíñòàíòàìè (literal constants), ïîòî-
ìó ÷òî ëèòåðàëüíîå çíà÷åíèå çàïèñûâàåòñÿ íåïîñðåäñòâåííî â êîä.
 êîäå VBA ìîæíî òàêæå ïèñàòü ëèòåðàëüíûå ÷èñëåííûå êîíñòàíòû
è äàòû; ïðèìåðû ÷èñëåííûõ ëèòåðàëüíûõ êîíñòàíò âêëþ÷àþò ÷èñëà 36, 3, 14
è 212. Ïðèìåðû ëèòåðàëüíûõ êîíñòàíò-äàò âêëþ÷àþò äàòû #12/31/96# èëè
#îêòÿáðü 28, 1997#. Åñëè ðàññìàòðèâàòü áîëüøèíñòâî çàïèñàííûõ ìàêðîñîâ,
òî ìîæíî íàéòè äðóãèå ïðèìåðû ëèòåðàëüíûõ êîíñòàíò. Êîíñòàíòû ìîæíî èç-
ìåíÿòü òîëüêî ðåäàêòèðîâàíèåì èñõîäíîãî êîäà VBA.
Êîíñòàíòû, ïîäîáíûå ñòðîêîâûì êîíñòàíòàì â ïðîöåäóðå HelloWorld, èñ-
ïîëüçóþòñÿ äëÿ ïðåäîñòàâëåíèÿ äàííûõ, êîòîðûå íå èçìåíÿþòñÿ (â îòëè÷èå îò
ïåðåìåííûõ, êîòîðûå èñïîëüçóþòñÿ äëÿ ïðåäîñòàâëåíèÿ èçìåíÿåìûõ äàí-
íûõ). Ìîæíî èñïîëüçîâàòü êîíñòàíòû êàê àðãóìåíòû äëÿ ïðîöåäóð è â ìàòå-
ìàòè÷åñêèõ èëè îïåðàöèÿõ ñðàâíåíèÿ.
Êîíñòàíòû íå äîëæíû áûòü îáÿçàòåëüíî ëèòåðàëüíûìè. VBA ïîçâîëÿåò ñîç-
äàâàòü èìåíîâàííûå êîíñòàíòû (named constants). Èìåíîâàííàÿ êîíñòàíòà,
ïîäîáíî ïåðåìåííîé, èìååò çàäàííîå åé èìÿ; ýòî èìÿ ïðåäñòàâëÿåò êîíêðåòíîå
íåèçìåíÿåìîå çíà÷åíèå. Òàê æå, êàê è â ñëó÷àå ñ ïåðåìåííîé, VBA ïîäñòàâëÿ-
åò êîíêðåòíîå çíà÷åíèå, íà êîòîðîå ññûëàåòñÿ èìÿ êîíñòàíòû, â îïåðàòîð â òî
ìåñòî, ãäå VBA âñòðå÷àåò èìåíîâàííóþ êîíñòàíòó. Îäíàêî â îòëè÷èå îò ïåðå-
ìåííîé çíà÷åíèå èìåíîâàííîé êîíñòàíòû íèêîãäà íå èçìåíÿåòñÿ; êàê è â ñëó-
÷àå ñ ëèòåðàëüíîé êîíñòàíòîé, åäèíñòâåííûì ñïîñîáîì èçìåíèòü çíà÷åíèå,
ñâÿçàííîå ñ èìåíîâàííîé êîíñòàíòîé, ÿâëÿåòñÿ ðåäàêòèðîâàíèå èñõîäíîãî
êîäà VBA.
Èñïîëüçóéòå èìåíîâàííûå êîíñòàíòû äëÿ ïîâûøåíèÿ ÷èòàáåëüíîñòè
ïðîöåäóð. Íàïðèìåð, ïðîöåäóðà, âûïîëíÿþùàÿ ãåîìåòðè÷åñêèå âû÷èñëåíèÿ,
ëåã÷å ÷èòàåòñÿ è áîëåå ïîíÿòíà, åñëè èñïîëüçîâàòü èìåíîâàííóþ êîíñòàíòó Pi
(p) âìåñòî ëèòåðàëüíîé êîíñòàíòû 3,14. Ê òîìó æå, â òåêñòå ïðîãðàììû
çíà÷åíèå îäíîé è òîé æå êîíñòàíòû ìîæåò âñòðåòèòüñÿ íåñêîëüêî ðàç. Åñëè
ýòî íå òàêàÿ ôóíäàìåíòàëüíàÿ êîíñòàíòà, êàê p, è åå çíà÷åíèå ïðè ðàçíûõ
çàïóñêàõ êîäà ìîæåò áûòü ðàçëè÷íûì, òî, êîíå÷íî, ïðàâèëüíî áóäåò îáúÿâèòü
êîíñòàíòó îäèí ðàç è èñïîëüçîâàòü åå èìÿ â êîäå ñòîëüêî ðàç, ñêîëüêî
íåîáõîäèìî.
Èìåíîâàííûå êîíñòàíòû ìîæíî òàêæå èñïîëüçîâàòü äëÿ áîëåå ïðîñòîãî îá-
íîâëåíèÿ è ñîïðîâîæäåíèÿ ïðîöåäóð è ïðîãðàìì. Íàïðèìåð, â ïðîãðàììå
VBA, âû÷èñëÿþùåé íàëîãîîáëîæåíèå ôèðìû, âîçìîæíî èçìåíåíèå ñòàâêè íà-
ëîãà êîãäà-íèáóäü â áóäóùåì. Åñëè ïîìåñòèòü ñòàâêó íàëîãà â ýòó ïðîãðàììó
êàê ëèòåðàëüíóþ êîíñòàíòó, ìîæåò îêàçàòüñÿ çàòðóäíèòåëüíûì èçìåíèòü ïðî-
106 Ãëàâà 3
Êîíñòàíòû String
Ïðè íàïèñàíèè ëèòåðàëüíûõ ñòðîêîâûõ êîíñòàíò â êîäå VBA âûïîëíÿéòå
ñëåäóþùèå ïðàâèëà:
¨ Ñòðîêîâûå êîíñòàíòû äîëæíû áûòü çàêëþ÷åíû â äâîéíûå êàâû÷êè ("). Ñëå-
äóþùèé ïðèìåð íå ÿâëÿåòñÿ äîïóñòèìûì, ïîòîìó ÷òî íå èìååò êàâû÷åê:
This is not a valid string constant.
¨ Ïóñòàÿ ñòðîêîâàÿ êîíñòàíòà (íàçûâàåìàÿ íóëåâîé ñòðîêîé — null string
èëè empty string) îáîçíà÷àåòñÿ äâóìÿ äâîéíûìè êàâû÷êàìè, ìåæäó êîòî-
ðûìè íè÷åãî íåò ("").
¨ Ñòðîêîâàÿ êîíñòàíòà äîëæíà âñÿ íàõîäèòüñÿ íà îäíîé è òîé æå ñòðîêå.
Íåëüçÿ èñïîëüçîâàòü ñèìâîë ïðîäîëæåíèÿ ñòðîêè äëÿ ïðîäîëæåíèÿ ëè-
òåðàëüíîé ñòðîêîâîé êîíñòàíòû íà äðóãîé ñòðîêå. Íè îäèí èç ñëåäóþùèõ
ïðèìåðîâ íå ÿâëÿåòñÿ ïðàâèëüíûì, ïîòîìó ÷òî ñòðîêîâàÿ êîíñòàíòà íà-
õîäèòñÿ áîëåå, ÷åì íà îäíîé ñòðîêå:
"Ýòî ïðèìåð
íåïðàâèëüíîé ñòðîêîâîé êîíñòàíòû"
"Ýòî ñíîâà íå_
ïðàâèëüíàÿ ñòðîêîâàÿ êîíñòàíòà"
108 Ãëàâà 3
Êîíñòàíòû Boolean
Ñóùåñòâóåò òîëüêî äâå ïðàâèëüíûå êîíñòàíòû òèïà Boolean: True è False.
 îïåðàòîðàõ ïðîãðàìì VBA äëÿ êîíñòàíò òèïà Boolean âû âñåãäà äîëæíû èñ-
ïîëüçîâàòü êëþ÷åâûå ñëîâà True è False. Êîãäà âû çàïèñûâàåòå êëþ÷åâûå ñëî-
âà â ìàêðîñû, ïèøèòå ñëîâà ïîëíîñòüþ è íå èñïîëüçóéòå êàâû÷êè.
Âíóòðåííèå êîíñòàíòû
VBA ïðåäîñòàâëÿåò íåñêîëüêî âíóòðåííèõ êîíñòàíò (intrinsic constants),
íàçûâàåìûõ òàêæå ïðåäîïðåäåëåííûìè êîíñòàíòàìè (predefined constants).
110 Ãëàâà 3
Ðèñ. 3.3
Èñïîëüçóéòå Object Browser
äëÿ ïðîñìîòðà ñïèñêîâ êîíñòàíò,
îïðåäåëåííûõ â VBA è
host-ïðèëîæåíèÿõ
öåäóðàì â òîì æå ìîäóëå ìîæåò ïîíàäîáèòüñÿ äîñòóï ê çíà÷åíèþ Pi, à åùå êà-
êîé-òî ïðîöåäóðå ìîæåò ïîíàäîáèòüñÿ èñïîëüçîâàòü çíà÷åíèå äëÿ ïëîùàäè
êðóãà, ïîñëå òîãî, êàê îíî áóäåò âû÷èñëåíî.
Ñòðîêà 4 ñîäåðæèò ôàêòè÷åñêîå îáúÿâëåíèå ïðîöåäóðû; êàê è ðàíüøå, ýòà
ïðîöåäóðà èìååò èìÿ Calc_CircleArea. Ñòðîêà 5 îáúÿâëÿåò êîíñòàíòó ïðîöå-
äóðíîãî óðîâíÿ BoxTitle; ýòà êîíñòàíòà èìååò òîëüêî ëîêàëüíûé äîñòóï â ïðî-
öåäóðå Calc_CircleArea. BoxTitle áûëà îáúÿâëåíà ëîêàëüíî â ýòîé ïðîöåäóðå,
ïîòîìó ÷òî ìàëîâåðîÿòíî èñïîëüçîâàíèå ýòîé êîíñòàíòû â êàêîé-ëèáî äðóãîé
ïðîöåäóðå; åå íàçíà÷åíèå — ïðåäîñòàâëÿòü ôèêñèðîâàííûé òåêñò äëÿ ñòðîêè
çàãîëîâêà âñåõ äèàëîãîâûõ îêîí, îòîáðàæàåìûõ Calc_CircleArea.
Îáðàòèòå âíèìàíèå íà ñòðîêó 7 ëèñòèíãà 3.8. Ýòîò îïåðàòîð âûçûâàåò ôóíê-
öèþ InputBox. Îíà îòîáðàæàåò ñâîé ïåðâûé àðãóìåíò êàê òåêñò â äèàëîãîâîì
îêíå, çàïðàøèâàÿ ó ïîëüçîâàòåëÿ ââåñòè çíà÷åíèÿ êàêîãî-ëèáî òèïà.  ýòîì
îïåðàòîðå InputBox îòîáðàæàåò òåêñò «Ââåäèòå ðàäèóñ êðóãà», ÷òîáû ñîîá-
ùèòü ïîëüçîâàòåëÿì ïðîöåäóðû, êàêîå çíà÷åíèå îíè äîëæíû ââåñòè. Input-
Box èñïîëüçóåò âòîðîé àðãóìåíò, ïðåäñòàâëåííûé êîíñòàíòîé BoxTitle, â êà÷å-
ñòâå çàãîëîâêà äèàëîãîâîãî îêíà. Ïðè âûïîëíåíèè îïåðàòîðà InputBox îòî-
áðàæàåòñÿ äèàëîãîâîå îêíî, ïîêàçàííîå íà ðèñ. 3.4. Ïîëüçîâàòåëü ââîäèò
÷èñëî â òåêñòîâîå îêíî è âûáèðàåò êîìàíäíóþ êíîïêó OK èëè Cancel, ÷òîáû çà-
êðûòü äèàëîãîâîå îêíî, êàê è ëþáîå äðóãîå îêíî Windows.
Ðèñ. 3.4
Äèàëîãîâîå îêíî ââîäà,
îòîáðàæàåìîå ôóíêöèåé InputBox
(â ñòðîêå 7 ëèñòèíãà 3.8)
Âûðàæåíèå Îïèñàíèå
7 Ñîäåðæèò îäíî çíà÷åíèå è èìååò ðåçóëüòàòîì ÷èñëî 7.
Ñîäåðæèò îäíî çíà÷åíèå è èìååò ðåçóëüòàòîì ñèìâîëüíóþ ñòðîêó
«25»
«25».
Ñîäåðæèò äâà ñòðîêîâûõ çíà÷åíèÿ è çíàê îïåðàöèè; èìååò
«To» & «day»
ðåçóëüòàòîì îäíó ñòðîêó «Today».
Âîçâðàùàåò ÷èñëî, ïîëó÷åííîå äåëåíèåì ñîäåðæèìîãî ïåðåìåííîé b
b / (p*10) íà çíà÷åíèå, ïîëó÷åííîå ïîñëå óìíîæåíèÿ ñîäåðæèìîãî ïåðåìåííîé
p íà êîíñòàíòó 10.
Âû÷èñëÿåòñÿ äî ëîãè÷åñêîãî çíà÷åíèÿ; â ýòîì ñëó÷àå óêàçûâàÿ,
Value <= 17 ÿâëÿåòñÿ ëè ñîäåðæèìîå ïåðåìåííîé Value ìåíüøèì èëè ðàâíûì
êîíñòàíòíîìó ÷èñëåííîìó çíà÷åíèþ 17.
Î÷åíü âàæíî êîíòðîëèðîâàòü è çíàòü òèï âûðàæåíèÿ, ïîòîìó ÷òî åñëè âû-
ðàæåíèÿ ñîäåðæàò íåñîâìåñòèìûå òèïû, VBA âûäàåò îøèáêó âðåìåíè èñïîë-
íåíèÿ — îøèáêó íåñîâïàäåíèÿ òèïîâ (type-mismatch). Èíîãäà, âïðî÷åì,
òàêàÿ îøèáêà ÿâëÿåòñÿ ðåçóëüòàòîì íåïðàâèëüíîé èíòåðïðåòàöèè îïåðàòîðîâ,
íàïðèìåð, èìåþùèõ íåñêîëüêî àðãóìåíòîâ.
Ïðè îáðàáîòêå âûðàæåíèÿ, ñîäåðæàùåãî ðàçëè÷íûå òèïû äàííûõ VBA ñíà-
÷àëà «ïûòàåòñÿ» óñòðàíèòü ëþáîå ðàçëè÷èå òèïîâ, ïðåîáðàçóÿ çíà÷åíèÿ â âû-
ðàæåíèè â ñîâìåñòèìûå òèïû äàííûõ. Åñëè óñòðàíèòü êàêèå-ëèáî ðàçëè÷èÿ
ïðåîáðàçîâàíèåì òèïîâ íå óäàåòñÿ, îòîáðàæàåòñÿ îøèáêà âðåìåíè èñïîëíåíèÿ
è ïðîöåäóðà ïðåêðàùàåò âûïîëíÿòüñÿ.
Åñëè âû ïðèñâàèâàåòå ðåçóëüòàò êàêîãî-ëèáî âûðàæåíèÿ ïåðåìåííîé, à òèï
ïåðåìåííîé íåñîâìåñòèì ñ òèïîì ðåçóëüòàòà ýòîãî âûðàæåíèÿ, VBA òàêæå
îòîáðàæàåò îøèáêó íåñîâïàäåíèÿ òèïîâ. Àíàëîãè÷íî, èñïîëüçîâàíèå òàêîãî
ðåçóëüòàòà âûðàæåíèÿ â êà÷åñòâå àðãóìåíòà äëÿ ôóíêöèè èëè ïðîöåäóðû òàê-
æå ïðèâîäèò ê îøèáêå íåñîâïàäåíèÿ òèïîâ, åñëè òèï äàííûõ àðãóìåíòîâ è òèï
ðåçóëüòàòà âûðàæåíèÿ ÿâëÿþòñÿ íåñîâìåñòèìûìè.
VBA ïðåäîñòàâëÿåò ðàçëè÷íûå ôóíêöèè äëÿ ïðåîáðàçîâàíèÿ èíôîðìàöèè
îäíîãî òèïà â äðóãîé, íàïðèìåð, ñòðîê â ÷èñëà, ÷èñåë â ñòðîêè è òàê äàëåå (ðà-
íåå óæå èñïîëüçîâàëàñü ôóíêöèÿ CSng, èñïîëüçóåìàÿ äëÿ ïðåîáðàçîâàíèÿ
òèïà String â ÷èñëåííûé Single). Ôóíêöèè ïðåîáðàçîâàíèÿ äàííûõ VBA
îïèñûâàþòñÿ áîëåå ïîäðîáíî â ñëåäóþùåé ãëàâå.
Îïåðàòîð ïðèñâàèâàíèÿ
Ðàíåå óæå èñïîëüçîâàëñÿ îïåðàòîð (statement) ïðèñâàèâàíèÿ. Ýòîò îïåðà-
òîð èñïîëüçóåòñÿ äëÿ ïðèñâàèâàíèÿ ðåçóëüòàòà âûðàæåíèÿ ïåðåìåííîé. Îïå-
Àðèôìåòè÷åñêèå îïåðàöèè
VBA ìîæåò âûïîëíÿòü âñå îáû÷íûå àðèôìåòè÷åñêèå îïåðàöèè (ðåàëèçóå-
ìûå ïîñðåäñòâîì àðèôìåòè÷åñêèõ âûðàæåíèé): ñëîæåíèå, âû÷èòàíèå, óìíî-
æåíèå è äåëåíèå, à òàêæå âîçâåäåíèå ÷èñåë â óêàçàííóþ ñòåïåíü è ïðåäîñòàâ-
ëÿåò äîïîëíèòåëüíûå îñîáûå ìàòåìàòè÷åñêèå îïåðàöèè äëÿ öåëî÷èñëåííîãî
äåëåíèÿ è äåëåíèÿ ïî ìîäóëþ. Â òàáë. 3.3 ïðèâîäÿòñÿ çíàêè îïåðàöèé, êîòî-
ðûå ìîæíî èñïîëüçîâàòü ïðè íàïèñàíèè àðèôìåòè÷åñêèõ VBA-âûðàæåíèé.
( ýòîé òàáëèöå Ni — ýòî ëþáîå äîïóñòèìîå ÷èñëåííîå âûðàæåíèå VBA.)
Òàáëèöà 3.3. Çíàêè îïåðàöèé (îáîçíà÷åíèÿ), èñïîëüçóåìûå â àðèôìåòè÷åñêèõ
VBA-âûðàæåíèÿõ
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 121
Ñëîæåíèå (+)
Çíàê îïåðàöèè ñëîæåíèÿ (+) èñïîëüçóåòñÿ äëÿ âûïîëíåíèÿ îïåðàöèè ïðî-
ñòîãî ñëîæåíèÿ. Îáà îïåðàíäà äîëæíû áûòü ÷èñëåííûìè âûðàæåíèÿìè èëè
ñòðîêàìè, êîòîðûå VBA ìîæåò ïðåîáðàçîâàòü â ÷èñëî. Çíàê îïåðàöèè ñëîæå-
íèÿ ìîæíî òàêæå èñïîëüçîâàòü äëÿ ïîñòðîåíèÿ àðèôìåòè÷åñêèõ âûðàæåíèé ñ
äàííûìè òèïà Date.
Äëÿ áîëüøåãî ïîíèìàíèÿ ñëåäóþùåãî ìàòåðèàëà âîéäèòå â Ðåäàêòîð VB
(â Word èëè Excel âûáåðèòå Ðàçðàáîò÷èê | Visual Basic). Äàëåå ùåëêíèòå íà êíîï-
êå View Code â Project Window. Â ïîÿâèâøåìñÿ Code Window íàáèðàéòå ïðåäëàãàå-
ìûå äàëåå íåáîëüøèå ïðîãðàììû è, åñëè âàì ýòîãî áóäåò íå äîñòàòî÷íî, ìîæå-
òå ïðîâîäèòü ñâîè ñîáñòâåííûå ýêñïåðèìåíòû ñ êîäîì.
Ââåäèòå â Code Window êîä ëèñòèíãà 3.9.
Ïîíÿòíî, ÷òî ïðè çàïóñêå ýòîãî êîäà (Run | Run Sub/UserForm) íà ýêðàíå ïîÿ-
âèòñÿ äèàëîãîâîå îêíî ñ ÷èñëîì 3.
Òèï äàííûõ ðåçóëüòàòà âûðàæåíèÿ ñëîæåíèÿ îáû÷íî òîò æå, ÷òî è íàèáîëåå
òî÷íûé òèï â ýòîì âûðàæåíèè. Íàïðèìåð, åñëè âûðàæåíèå ñîäåðæèò îáà òèïà
Integer è Long, ðåçóëüòàòîì òàêîãî âûðàæåíèÿ áóäåò òèï Long. Îäíàêî
ñóùåñòâóþò íåêîòîðûå èñêëþ÷åíèÿ, â ÷àñòíîñòè, åñëè âûðàæåíèå âêëþ÷àåò
ïåðåìåííûå òèïà Variant. Äàëåå ïåðå÷èñëÿþòñÿ ýòè èñêëþ÷åíèÿ:
1. Ðåçóëüòàòîì ñëîæåíèÿ òèïà Single è Long ÿâëÿåòñÿ Double.
122 Ãëàâà 3
2. Åñëè ñêëàäûâàòü òèï Date ñ ëþáûì äðóãèì òèïîì äàííûõ, ðåçóëüòàòîì âû-
ðàæåíèÿ âñåãäà áóäåò òèï Date.
3. Åñëè ðåçóëüòàò âûðàæåíèÿ ñëîæåíèÿ ïðèñâàèâàåòñÿ ïåðåìåííîé Variant,
èìåþùåé â äàííûé ìîìåíò òèï Integer, è åñëè ðåçóëüòàò âûðàæåíèÿ áîëüøå,
÷åì (ïåðåïîëíÿåò) äèàïàçîí çíà÷åíèé äëÿ òèïà Integer, òî VBA ïðåîáðàçóåò
ðåçóëüòàò â Long. Ïîñëå ïðèñâàèâàíèÿ ïåðåìåííàÿ Variant òàêæå èìååò òèï
Long.
4. Åñëè ðåçóëüòàò âûðàæåíèÿ ñëîæåíèÿ ïðèñâàèâàåòñÿ ïåðåìåííîé Variant,
èìåþùåé â äàííûé ìîìåíò òèï Long, Single èëè Date, è åñëè ðåçóëüòàò
âûðàæåíèÿ ïåðåïîëíÿåò äèàïàçîí ÷èñëåííîãî òèïà, VBA ïðåîáðàçóåò
ðåçóëüòàò â Double. Ïîñëå ïðèñâàèâàíèÿ ïåðåìåííàÿ òèïà Variant òàêæå
èìååò òèï äàííûõ Double.
5. Åñëè ëþáîé îïåðàíä â âûðàæåíèè ñëîæåíèÿ ÿâëÿåòñÿ ðàâíûì Null èëè
âû÷èñëÿåòñÿ äî Null, òî ðåçóëüòàòîì âûðàæåíèÿ ñëîæåíèÿ òàêæå áóäåò Null.
(Null — ýòî îñîáîå çíà÷åíèå, êîòîðîå ìîæíî ïðèñâàèâàòü òîëüêî ïåðåìåííûì
òèïà Variant äëÿ îáîçíà÷åíèÿ òîãî, ÷òî îíè íå ñîäåðæàò äåéñòâèòåëüíûõ
äàííûõ.)
Çàìå÷àíèå
Ïîðÿäîê òî÷íîñòè äëÿ ÷èñëåííûõ òèïîâ äàííûõ VBA îò íàèìåíåå òî÷íîãî äî íàèáîëåå òî÷íîãî
ñëåäóþùèé: Byte, Integer, Long, Single, Double, Currency.
Dim S1 As Single
Dim L1 As Long
Dim I1 As Integer
Dim D1 As Date
Dim V1, V2 As Variant
'èíèöèàëèçàöèÿ ïåðåìåííûõ
S1 = 3.333
L1 = 3.333
I1 = 1111
D1 = Now 'ïîëó÷èòü çíà÷åíèå òåêóùåé äàòû è âðåìåíè
End Sub
Âû÷èòàíèå (–)
Çíàê îïåðàöèè âû÷èòàíèÿ (–) âûïîëíÿåò äâå çàäà÷è: îí èñïîëüçóåòñÿ ëèáî
äëÿ ïîñòðîåíèÿ àðèôìåòè÷åñêèõ âûðàæåíèé âû÷èòàíèÿ, ëèáî äëÿ îáîçíà÷å-
íèÿ óíàðíîãî ìèíóñà.
Óíàðíûé ìèíóñ (unary minus) — ýòî çíàê ìèíóñ, êîòîðûé ïîìåùàþò ïåðåä
÷èñëîì äëÿ óêàçàíèÿ òîãî, ÷òî ýòî — îòðèöàòåëüíîå ÷èñëî. Çíàê ìèíóñ ìîæ-
íî òàêæå ïîìåùàòü ïåðåä ïåðåìåííîé èëè äðóãèì âûðàæåíèåì äëÿ îáîçíà÷å-
íèÿ òîãî, ÷òî çíà÷åíèå ïåðåìåííîé èëè âûðàæåíèÿ äîëæíî áûòü îòðèöàòåëü-
íûì. Ïîìåñòèòü óíàðíûé ìèíóñ ïåðåä ïåðåìåííîé èëè âûðàæåíèåì îçíà÷àåò
òî æå, ÷òî óìíîæèòü ýòî ÷èñëî íà –1. Ñëåäóþùèå âûðàæåíèÿ ñîäåðæàò óíàð-
íûé ìèíóñ:
íûõ ðåçóëüòàòà âûðàæåíèÿ âû÷èòàíèÿ îáû÷íî ÿâëÿåòñÿ òåì æå, ÷òî è íàèáî-
ëåå òî÷íûé òèï äàííûõ â ýòîì âûðàæåíèè.
VBA ñëåäóåò òåì æå ïðàâèëàì äëÿ îïðåäåëåíèÿ òèïà äàííûõ ðåçóëüòàòà âû-
ðàæåíèÿ âû÷èòàíèÿ, ÷òî è äëÿ âûðàæåíèé, èñïîëüçóþùèõ çíàê îïåðàöèè ñëî-
æåíèÿ, íî èìåþòñÿ ñëåäóþùèå äîïîëíèòåëüíûå ïðàâèëà:
¨ Åñëè îäèí èç îïåðàíäîâ â âûðàæåíèè âû÷èòàíèÿ ÿâëÿåòñÿ òèïîì Date,
òî ðåçóëüòàò âûðàæåíèÿ èìååò òèï Date.
¨ Åñëè îáà îïåðàíäà â âûðàæåíèè ÿâëÿþòñÿ òèïîì Date, òî ðåçóëüòàò âû-
ðàæåíèÿ èìååò òèï Double.
 ëèñòèíãå 3.11 ïðèâåäåí êîä, äåìîíñòðèðóþùèé ýòè äîïîëíèòåëüíûå ïðà-
âèëà.
Çàìå÷àíèå
Íåñìîòðÿ íà òî, ÷òî ìîæíî êîíêàòåíèðîâàòü (îáúåäèíÿòü) äâå (è áîëåå) ñòðîêè âìåñòå ñ ïîìîùüþ
çíàêà (+), íåëüçÿ èñïîëüçîâàòü çíàê (–), ÷òîáû îòäåëèòü êàêóþ-ëèáî ñòðîêó. Âìåñòî ýòîãî äëÿ
îòäåëåíèÿ ñòðîê ìîæíî èñïîëüçîâàòü VBA-ôóíêöèè Mid, Left èëè Right.
Óìíîæåíèå (*)
Çíàê îïåðàöèè óìíîæåíèÿ (*) èñïîëüçóåòñÿ äëÿ ïîñòðîåíèÿ àðèôìåòè÷å-
ñêèõ âûðàæåíèé ñ óìíîæåíèåì; ðåçóëüòàòîì âûðàæåíèÿ óìíîæåíèÿ ÿâëÿåòñÿ
ïðîèçâåäåíèå äâóõ îïåðàíäîâ. Îáà îïåðàíäà â âûðàæåíèè óìíîæåíèÿ äîëæíû
áûòü ÷èñëåííûìè âûðàæåíèÿìè èëè ñòðîêàìè, êîòîðûå VBA ìîæåò ïðåîáðà-
çîâàòü â ÷èñëà. Ñëåäóþùèå ïðèìåðû èëëþñòðèðóþò ïðàâèëüíûé ñèíòàêñèñ
äëÿ àðèôìåòè÷åñêèõ âûðàæåíèé ñ óìíîæåíèåì:
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 125
Äåëåíèå (/)
Çíàê îïåðàöèè äåëåíèÿ (/) èíîãäà íàçûâàþò çíàêîì äåëåíèÿ ÷èñåë ñ ïëà-
âàþùåé òî÷êîé èëè äåéñòâèòåëüíûõ ÷èñåë, ÷òîáû îòëè÷àòü îò çíàêà öåëî-
÷èñëåííîãî äåëåíèÿ, êîòîðûé îïèñàí â ñëåäóþùåì ðàçäåëå.  âûðàæåíèÿõ äå-
ëåíèÿ ïåðâûé îïåðàíä äåëèòñÿ íà âòîðîé îïåðàíä; ðåçóëüòàòîì äåëåíèÿ ÿâëÿ-
åòñÿ ÷àñòíîå. Îáà îïåðàíäà â âûðàæåíèè äåëåíèÿ ñ ïëàâàþùåé òî÷êîé äîëæíû
áûòü ÷èñëåííûìè âûðàæåíèÿìè èëè ñòðîêàìè, êîòîðûå VBA ìîæåò ïðåîáðà-
çîâàòü â ÷èñëà. Ñëåäóþùèå âûðàæåíèÿ èëëþñòðèðóþò èñïîëüçîâàíèå çíàêà
îïåðàöèè äåëåíèÿ:
27 / 3 'äåëåíèå 27 íà 3
MyNumVar / 20 'äåëåíèå çíà÷åíèÿ â ïåðåìåííîé MyNumVar íà 20
MyNumVar / MyOtherVar 'äåëèò çíà÷åíèå â ïåðåìåííîé MyNumVar
'íà çíà÷åíèå â ïåðåìåííîé MyOtherVar
Åñëè ëþáîé îïåðàíä â âûðàæåíèè äåëåíèÿ èìååò çíà÷åíèå Null, òî ðåçóëüòà-
òîì âûðàæåíèÿ òàêæå ÿâëÿåòñÿ Null. Òèï äàííûõ âûðàæåíèÿ ñî çíàêîì äåëå-
íèÿ ñ ïëàâàþùåé òî÷êîé — îáû÷íî Double, íî èìååòñÿ ñëåäóþùåå èñêëþ÷åíèå:
¨ Åñëè îáà îïåðàíäà â âûðàæåíèè äåëåíèÿ èìåþò òèï Integer èëè
Single, òî ðåçóëüòàò âûðàæåíèÿ äåëåíèÿ ñ ïëàâàþùåé òî÷êîé èìååò òèï
Single, åñëè òîëüêî ðåçóëüòàò âûðàæåíèÿ íå ïåðåïîëíÿåò äèàïàçîí çíà-
÷åíèé äëÿ òèïà Single. Åñëè ðåçóëüòàò ïåðåïîëíÿåò äèàïàçîí äëÿ òèïà
Single, òî VBA ïðåîáðàçóåò ðåçóëüòàò â òèï Double.
Îïåðàöèè ñðàâíåíèÿ
Îïåðàöèè ñðàâíåíèÿ èíîãäà òàêæå íàçûâàþò îïåðàöèÿìè îòíîøåíèÿ (relati-
onal operators). ×àùå âñåãî îïåðàöèè ñðàâíåíèÿ èñïîëüçóþòñÿ äëÿ òîãî, ÷òîáû
çàäàòü êðèòåðèè äëÿ ïðèíÿòèÿ ðåøåíèÿ èëè ñôîðìóëèðîâàòü îïèñàíèå óñëî-
âèé, ïðè êîòîðûõ ãðóïïà êîìàíä äîëæíà áûòü ïîâòîðåíà (îðãàíèçàöèÿ öèêëîâ).
Ðåçóëüòàòîì ëþáîé îïåðàöèè ñðàâíåíèÿ ÿâëÿåòñÿ çíà÷åíèå òèïà Boolean:
True èëè False. Îïåðàöèè ñðàâíåíèÿ èñïîëüçóþòñÿ äëÿ ñðàâíåíèÿ ëèòåðàëü-
íûõ, êîíñòàíòíûõ èëè ïåðåìåííûõ çíà÷åíèé ëþáîãî ñõîäíîãî òèïà.
 òàáëèöå 3.4 ïåðå÷èñëåíû èìåþùèåñÿ â VBA çíàêè îïåðàöèé ñðàâíåíèÿ è
îïèñàíî èõ íàçíà÷åíèå (Å â ýòîé òàáëèöå ïðåäñòàâëÿåò ëþáîå äåéñòâèòåëüíîå
âûðàæåíèå VBA).
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 127
Îïåðàöèÿ/ Ñèíòàêñè
Íàèìåíîâàíèå/îïèñàíèå
Îïåðàòîð ñ
= Å1 = Å2 Ðàâåíñòâî. True, åñëè Å1 ðàâíî Å2, èíà÷å — False.
Ìåíüøå, ÷åì. True, åñëè Å1 ìåíüøå, ÷åì Å2, èíà÷å —
< Å1 < Å2
False.
Ìåíüøå, ÷åì èëè ðàâíî. True, åñëè Å1 ìåíüøå èëè ðàâíî
<= <=
Å2, èíà÷å — False.
> > Áîëüøå, ÷åì. True, åñëè Å1 áîëüøå, ÷åì Å2, èíà÷å — False.
Áîëüøå, ÷åì èëè ðàâíî. True, åñëè Å1 áîëüøå èëè ðàâíî
>= >=
Å2, èíà÷å — False.
<> <> Íå ðàâíî. True, åñëè Å1 íå ðàâíî Å2, èíà÷å — False.
Îáà îïåðàíäà äîëæíû áûòü çíà÷åíèÿìè òèïà Object. True,
Is E1 is E2 åñëè Å1 ññûëàåòñÿ íà òîò æå ñàìûé îáúåêò, ÷òî è Å2,
èíà÷å — False.
Ïîäîáèå. Îáà îïåðàíäà äîëæíû áûòü çíà÷åíèÿìè òèïà String.
E1 Like
Like True, åñëè Å1 ñîâïàäàåò ñ îáðàçöîì, ñîäåðæàùèìñÿ â Å2,
E2
èíà÷å — False.
Åñëè îáà îïåðàíäà â âûðàæåíèè ñðàâíåíèÿ èìåþò îäèí è òîò æå òèï äàí-
íûõ, VBA âûïîëíÿåò ïðîñòîå ñðàâíåíèå äëÿ ýòîãî òèïà. Åñëè, íàïðèìåð, îáà
îïåðàíäà ÿâëÿþòñÿ ñòðîêàìè, VBA âûïîëíÿåò ñðàâíåíèå ñòðîê; åñëè îáà îïå-
ðàíäà ÿâëÿþòñÿ äàòàìè, òî VBA âûïîëíÿåò ñðàâíåíèå äàò è òàê äàëåå.
Ñëåäóþùèå âûðàæåíèÿ èëëþñòðèðóþò èñïîëüçîâàíèå ðàçëè÷íûõ îïåðàòî-
ðîâ ñðàâíåíèÿ:
Ñðàâíåíèå ñòðîê
Ñðàâíåíèå ñòðîê íåìíîãî ñëîæíåå, ÷åì ñðàâíåíèå ÷èñåë.  VBA ñòðîêà ðàâ-
íà äðóãîé ñòðîêå, òîëüêî êîãäà îáå ñòðîêè ñîäåðæàò òî÷íî òàêèå æå ñèìâîëû â
òî÷íî òàêîì æå ïîðÿäêå è îáå ñòðîêè èìåþò îäíó è òó æå äëèíó.
Ðàññìîòðèì ñëåäóþùèå âûðàæåíèÿ:
Ñèìâîë
Ñîîòâåòñòâèå
îáðàçöà
# Ëþáàÿ îäèíî÷íàÿ öèôðà îò 0 äî 9.
Ëþáîå êîëè÷åñòâî ñèìâîëîâ â ëþáîé êîìáèíàöèè èëè îòñóòñòâèå
*
ñèìâîëîâ.
? Ëþáîé îäèíî÷íûé ñèìâîë.
list — ýòî ñïèñîê îïðåäåëåííûõ ñèìâîëîâ. Ñîâïàäåíèå ñ ëþáûì
[list]
îäèíî÷íûì ñèìâîëîì â ñïèñêå.
list — ýòî ñïèñîê îïðåäåëåííûõ ñèìâîëîâ. Ñîâïàäåíèå ñ ëþáûì
[!list]
îäèíî÷íûì ñèìâîëîì, íå èìåþùèìñÿ â ñïèñêå.
Åùå îäíî âûðàæåíèå ÿâëÿåòñÿ ðàâíûì True, åñëè AnyStr ñîäåðæèò «bin»
èëè «bit», èëè — False, åñëè AnyStr ñîäåðæèò «bid» èëè «big»:
AnyStr Like "bi[!dg]"
Ìîæíî òàêæå èñïîëüçîâàòü êâàäðàòíûå ñêîáêè äëÿ óêàçàíèÿ äèàïàçîíà
ñèìâîëîâ, ñîâïàäåíèå èëè íåñîâïàäåíèå ñ êîòîðûìè íåîáõîäèìî:
AnyStr Like "ci[a-f]"
AnyStr Like "ci[!a-f]"
Ðåçóëüòàò ïåðâîãî èç ïðèâåäåííûõ âûøå ïðèìåðîâ ÿâëÿåòñÿ ðàâíûì True,
åñëè AnyStr ñîäåðæèò «cia», «cib», «cic», «cid», «cie» èëè «cif» è False —
èíà÷å. Âòîðîå âûðàæåíèå îáðàòíî ïåðâîìó è ÿâëÿåòñÿ ðàâíûì False, åñëè
AnyStr ñîäåðæèò îäíó èç ñòðîê «cia», «cib», «cic», «cid», «cie», «cif». Âòîðîå
âûðàæåíèå ÿâëÿåòñÿ ðàâíûì True äëÿ ëþáîé ñòðîêè, ñîäåðæàùåé ïåðâûå äâå
áóêâû ci è íå çàêàí÷èâàåòñÿ íà áóêâû îò a äî f.
Êîãäà âû óêàçûâàåòå äèàïàçîí ñèìâîëîâ, íåîáõîäèìî óêàçûâàòü äèàïàçîí
îò íàèìåíüøåãî äî íàèáîëüøåãî ñèìâîëà. Íàïðèìåð, [a–f] — ïðàâèëüíûé äèà-
ïàçîí, íî [f–a] — íåò. VBA èãíîðèðóåò ïàðû êâàäðàòíûõ ñêîáîê, â êîòîðûõ
íè÷åãî íå çàêëþ÷åíî ([]).
Ïîñêîëüêó ëåâàÿ êâàäðàòíàÿ ñêîáêà ([), çíàê âîïðîñà (?), ñèìâîë íîìåðà (#)
è ñèìâîë (*) èìåþò îñîáîå çíà÷åíèå â ñòðîêå øàáëîíà, íåîáõîäèìî çàêëþ÷àòü
èõ â êâàäðàòíûå ñêîáêè, åñëè âû õîòèòå, ÷òîáû îíè áûëè ÷àñòüþ øàáëîíà. Íà-
ïðèìåð, åñëè íåîáõîäèìî óçíàòü, çàêàí÷èâàåòñÿ ëè ñòðîêà âîïðîñèòåëüíûì
çíàêîì, èñïîëüçóéòå ñëåäóþùåå âûðàæåíèå (êîòîðîå ÿâëÿåòñÿ ðàâíûì True,
åñëè AnyStr ñîäåðæèò ëþáîå ÷èñëî èëè êîìáèíàöèþ ñèìâîëîâ, çàêàí÷èâàþ-
ùóþñÿ çíàêîì âîïðîñà):
AnyStr Like "*[?]"
Ïðàâàÿ ñêîáêà (]) è âîñêëèöàòåëüíûé çíàê (!) òàêæå èìåþò îñîáîå çíà÷åíèå
â ñòðîêå øàáëîíà; äëÿ äîñòèæåíèÿ ñîâïàäåíèÿ ñ ýòèìè ñèìâîëàìè íåîáõîäèìî
ïîìåùàòü èõ âíå êâàäðàòíûõ ñêîáîê ñïèñêà ñèìâîëîâ. Íàïðèìåð, ÷òîáû îïðå-
äåëèòü, çàêàí÷èâàåòñÿ ëè ñòðîêà âîñêëèöàòåëüíûì çíàêîì, èñïîëüçóéòå ñëå-
äóþùåå âûðàæåíèå (êîòîðîå ÿâëÿåòñÿ ðàâíûì True, åñëè AnyStr ñîäåðæèò
ëþáîå ÷èñëî èëè êîìáèíàöèþ ñèìâîëîâ, çàêàí÷èâàþùóþñÿ âîñêëèöàòåëüíûì
çíàêîì):
AnyStr Like "*!"
Äëÿ ñîâïàäåíèÿ ñî çíàêîì äåôèñà â ñòðîêå øàáëîíà ïîìåñòèòå äåôèñ â íà÷à-
ëî èëè â êîíåö ñïèñêà ñèìâîëîâ âíóòðè êâàäðàòíûõ ñêîáîê. Ïîìåùåíèå äåôè-
ñà â ëþáîå äðóãîå ìåñòî çàäàåò äèàïàçîí ñèìâîëîâ. Ñëåäóþùåå âûðàæåíèå ïî-
êàçûâàåò, êàê ñîïîñòàâëÿòü ñ ñèìâîëîì äåôèñà (ýòî âûðàæåíèå ÿâëÿåòñÿ True,
åñëè AnyStr ñîäåðæèò «big-headed», «pig-headed», «plug-ugly», «tag-along»
è òàê äàëåå):
AnyStr Like "*g[-]*" 'True
Íà ðåçóëüòàò ñðàâíåíèÿ ñòðîê, êîòîðîå èñïîëüçóåò îïåðàòîð Like, îêàçûâà-
åò òàêæå âëèÿíèå èíñòðóêöèÿ Option Compare. Åñëè çàäàíî äâîè÷íîå ñðàâíå-
íèå ñòðîê, òî îïåðàòîð Like ðàçëè÷àåò áóêâû âåðõíåãî è íèæíåãî ðåãèñòðà.
Åñëè âûáðàíà óñòàíîâêà òåêñòîâîãî ñðàâíåíèÿ, îïåðàòîð Like íå ÷óâñòâèòåëåí
ê ñîñòîÿíèþ ðåãèñòðà.
Èñïîëüçóåò ëè VBA â äàííûé ìîìåíò äâîè÷íîå èëè òåêñòîâîå ñðàâíåíèå,
òàêæå âëèÿåò íà òî, êàêèå ñèìâîëû îïåðàòîð Like âêëþ÷àåò â ðàçëè÷íûå
132 Ãëàâà 3
Çàìå÷àíèå
Îïåðàòîð ñðàâíåíèÿ Like ïîëåçåí åùå è òåì, ÷òî îí èñïîëüçóåòñÿ â ñèíòàêñèñå ÿçûêà çàïðîñîâ
SQL. È ïîñêîëüêó âàì ñêîðåå âñåãî ïðèäåòñÿ çàíèìàòüòñÿ ïðîãðàììèðîâàíèåì áàç äàííûõ —
ñàìûìè ðàñïðîñòðàíåííûìè VBA-ïðèëîæåíèÿìè — ñëåäóåò ñ îñîáûì òåðïåíèåì ðàçîáðàòüñÿ ñî
âñåìè òîíêîñòÿìè èñïîëüçîâàíèÿ ýòîãî îïåðàòîðà.
Ñðàâíåíèå îáúåêòîâ
VBA èìååò ñëåäóþùèé îïåðàòîð ñðàâíåíèÿ — Is. Ýòîò îïåðàòîð ìîæíî èñ-
ïîëüçîâàòü òîëüêî äëÿ ñðàâíåíèÿ âûðàæåíèé òèïà Object. Âûðàæåíèÿ, âêëþ-
÷àþùèå îïåðàòîð Is, âñåãäà èìåþò ðåçóëüòàòîì çíà÷åíèå òèïà Boolean.
Ðåçóëüòàòîì îïåðàòîðà Is ÿâëÿåòñÿ True, åñëè îáà âûðàæåíèÿ òèïà Object
ññûëàþòñÿ íà îäèí è òîò æå îáúåêò; â ïðîòèâíîì ñëó÷àå ðåçóëüòàòîì ÿâëÿåòñÿ
False. VBA ïðåäîñòàâëÿåò îïåðàòîð Is, ïîòîìó ÷òî íèêàêîé äðóãîé èç îïåðà-
òîðîâ ñðàâíåíèÿ íå ÿâëÿåòñÿ çíà÷àùèì, êîãäà îí èñïîëüçóåòñÿ ñ âûðàæåíèÿ-
ìè òèïà Object. Âûðàæåíèÿ òèïà Object, íà ñàìîì äåëå, ÿâëÿþòñÿ àäðåñàìè
â ïàìÿòè, ññûëàþùèìèñÿ íà îïðåäåëåííûé îáúåêò â host-ïðèëîæåíèè (Excel,
Word, Access èëè êàêîì-ëèáî äðóãîì ïðèëîæåíèè, ðåàëèçóþùåì VBA).
Ëîãè÷åñêèå îïåðàòîðû
×àùå âñåãî ëîãè÷åñêèå îïåðàòîðû VBA èñïîëüçóþòñÿ äëÿ îáúåäèíåíèÿ ðå-
çóëüòàòîâ îòäåëüíûõ âûðàæåíèé ñðàâíåíèÿ, ÷òîáû ñîçäàòü ñëîæíûå êðèòåðèè
äëÿ ïðèíÿòèÿ ðåøåíèé â ïðîöåäóðå, èëè äëÿ ñîçäàíèÿ óñëîâèé, ïðè êîòîðûõ
ãðóïïà îïåðàòîðîâ äîëæíà ïîâòîðÿòüñÿ.
Ìîæíî èñïîëüçîâàòü ëþáîå äåéñòâèòåëüíîå âûðàæåíèå, èìåþùåå ðåçóëüòàò
òèïà Boolean, â êà÷åñòâå îïåðàíäà äëÿ ëîãè÷åñêîãî îïåðàòîðà èëè ÷èñëî, êî-
òîðîå VBA ìîæåò ïðåîáðàçîâàòü â çíà÷åíèå òèïà Boolean. Äëÿ VBA 0 ÿâëÿåò-
ñÿ ýêâèâàëåíòíûì Boolean-çíà÷åíèþ False, à ëþáîå äðóãîå ÷èñëåííîå çíà÷å-
íèå — çíà÷åíèþ True.
Îáû÷íî ðåçóëüòàòîì ëîãè÷åñêîé îïåðàöèè ÿâëÿåòñÿ çíà÷åíèå òèïà Boo-
lean, õîòÿ íåêîòîðûå ëîãè÷åñêèå îïåðàöèè ìîãóò èìåòü ðåçóëüòàòîì îñîáîå
çíà÷åíèå Null, åñëè îäèí èëè áîëüøå îïåðàíäîâ èìåþò çíà÷åíèå Null. Ïî-
ñêîëüêó VBA èíòåðïðåòèðóåò îñîáîå çíà÷åíèå Empty êàê 0, îïåðàíäû â ëîãè÷å-
ñêèõ âûðàæåíèÿõ, ñîäåðæàùèå Empty, îáðàáàòûâàþòñÿ òàê, êàê åñëè áû îíè
ñîäåðæàëè Boolean-çíà÷åíèå False.
 òàáëèöå. 3.6 ïðèâåäåíû ëîãè÷åñêèå îïåðàòîðû, èìåþùèåñÿ â VBA, âìåñòå
ñ ñèíòàêñèñîì è êðàòêèì îïèñàíèåì ðàáîòû. (Å â ýòîé òàáëèöå ïðåäñòàâëÿåò
ñîáîé ëþáîå äîïóñòèìîå âûðàæåíèå ñ ðåçóëüòàòîì òèïà Boolean, òàêîå êàê
îïåðàöèÿ ñðàâíåíèÿ.)
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 133
Ñèíòàêñè
Îïåðàòîð Èìÿ/Îïèñàíèå
ñ
E1 And Êîíúþíêöèÿ. True, åñëè îáà E1è E2 èìåþò çíà÷åíèå True,
And
E2 èíà÷å — False.
Äèçúþíêöèÿ. True, åñëè îäíî âûðàæåíèå èëè îáà (E1 è E2)
Or E1 Or E2
ÿâëÿþòñÿ ðàâíûìè True; èíà÷å — False.
Îòðèöàíèå. True, åñëè E1 èìååò çíà÷åíèå False; False, åñëè
Not Not E1
E1 ÿâëÿåòñÿ ðàâíûì True.
Èñêëþ÷åíèå. True, åñëè E1 ÿâëÿåòñÿ ðàâíûì True èëè E2
Xor E1 Xor E2
ÿâëÿåòñÿ ðàâíûì True; èíà÷å — False.
Ýêâèâàëåíòíîñòü. True, åñëè E1 èìååò òî æå ñàìîå
Eqv E1 Eqv E2
çíà÷åíèå, ÷òî è E2; èíà÷å — False.
Èìïëèêàöèÿ. False, êîãäà E1 ÿâëÿåòñÿ ðàâíûì True è E2
Imp E1 Imp E2
ðàâíî False; èíà÷å — True.
Òàáëèöû èñòèííîñòè
Òàáëèöà èñòèííîñòè (truth table) — ýòî òàáëèöà, ïîêàçûâàþùàÿ âñå âîç-
ìîæíûå êîìáèíàöèè çíà÷åíèé äëÿ îïðåäåëåííîãî òèïà ëîãè÷åñêîãî âûðàæå-
íèÿ è åãî ðåçóëüòàòû. Áîëüøèíñòâî òàáëèö èñòèííîñòè èìåþò òðè ñòîëáöà.
Ïåðâûé ñòîëáåö ïðåäíàçíà÷åí äëÿ çíà÷åíèÿ ïåðâîãî îïåðàíäà, âòîðîé — äëÿ
çíà÷åíèÿ âòîðîãî îïåðàíäà, à ïîñëåäíèé ñòîëáåö âñåãäà ñîäåðæèò çíà÷åíèå ðå-
çóëüòàòà âûðàæåíèÿ. Êàæäàÿ ñòðîêà â òàáëèöå ïðåäíàçíà÷åíà äëÿ îïðåäåëåí-
íîé êîìáèíàöèè çíà÷åíèé. Ðàññìîòðèì ñëåäóþùóþ ñòðîêó èç òàáëèöû èñòèí-
íîñòè îïåðàòîðà And:
False True False
 ýòîé ñòðîêå ïåðâûé îïåðàíä — ýòî False, âòîðîé îïåðàíä — True, à ðå-
çóëüòàò îïåðàöèè And ÿâëÿåòñÿ ðàâíûì False. Ýòà ñòðîêà â òàáëèöå èñòèííî-
ñòè îçíà÷àåò, ÷òî ðåçóëüòàòîì âûðàæåíèÿ False And True ÿâëÿåòñÿ False.
And
Îïåðàòîð And âûïîëíÿåò ëîãè÷åñêóþ êîíúþíêöèþ. Ðåçóëüòàòîì îïåðàöèè
And ÿâëÿåòñÿ çíà÷åíèå True, òîëüêî êîãäà îáà îïåðàíäà ÿâëÿþòñÿ ðàâíûìè
True; èíà÷å — False.
Îïåðàòîð And èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Operand1 And Operand2
Operand1 è Operand2 ÿâëÿþòñÿ ëþáûìè äîïóñòèìûìè ëîãè÷åñêèìè âûðàæåíèÿìè
VBA. [Ëîãè÷åñêîå âûðàæåíèå (logical expression) — ýòî ëþáîå âûðàæåíèå VBA,
êîòîðîå èìååò ðåçóëüòàòîì çíà÷åíèå òèïà Boolean: True èëè False.]
134 Ãëàâà 3
Or
Îïåðàòîð Or âûïîëíÿåò ëîãè÷åñêóþ äèçúþíêöèþ è åãî ÷àñòî íàçûâàþò
âêëþ÷àþùèì «ÈËÈ» (inclusive or). Ðåçóëüòàòîì îïåðàöèè Or ÿâëÿåòñÿ çíà÷å-
íèå True, êîãäà õîòÿ áû îäèí èç îïåðàíäîâ ðàâåí çíà÷åíèþ True; èíà÷å (åñëè
âñå îïåðàíäû — False) ðåçóëüòàòîì ÿâëÿåòñÿ çíà÷åíèå False.
Îïåðàòîð Or èìååò ñëåäóþùèé îáùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Operand1 Or Operand2
Operand1 è Operand2 ÿâëÿþòñÿ ëþáûìè äîïóñòèìûìè ëîãè÷åñêèìè âûðàæåíèÿìè
VBA.
Ñëåäóþùàÿ òàáëèöà èñòèííîñòè ïîêàçûâàåò ðåçóëüòàòû îïåðàöèè Or.
Not
Îïåðàòîð Not âûïîëíÿåò ëîãè÷åñêîå îòðèöàíèå; îí èíâåðòèðóåò ëþáîå çíà-
÷åíèå, ê êîòîðîìó ïðèìåíÿåòñÿ. Îïåðàòîð Not èñïîëüçóåò òîëüêî îäèí îïå-
ðàíä è èìååò ðåçóëüòàòîì çíà÷åíèå True, åñëè îïåðàíä ÿâëÿåòñÿ ðàâíûì
False, èëè — False, åñëè îïåðàíä — True.
Îïåðàòîð Not èìååò ñëåäóþùèé îáùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Not Operand
Operand — ýòî ëþáîå äîïóñòèìîå ëîãè÷åñêîå âûðàæåíèå VBA.
Xor
Îïåðàòîð Xor âûïîëíÿåò ëîãè÷åñêîå èñêëþ÷åíèå. ×àùå åãî íàçûâàþò èñ-
êëþ÷àþùèì «ÈËÈ» (exclusive or). Ðåçóëüòàòîì îïåðàöèè Xor ÿâëÿåòñÿ True,
êîãäà êàêîé-ëèáî îïåðàíä (íî íå îáà), ÿâëÿåòñÿ ðàâíûì True; èíà÷å ðåçóëüòà-
òîì áóäåò çíà÷åíèå False.
Îïåðàòîð Xor èìååò ñëåäóþùèé îáùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Operand1 Xor Operand2
136 Ãëàâà 3
Eqv
Îïåðàòîð Eqv ÿâëÿåòñÿ îïåðàöèåé ëîãè÷åñêîé ýêâèâàëåíòíîñòè; èñïîëüçî-
âàíèå îïåðàòîðà Eqv ïîäîáíî òåñòèðîâàíèþ íà ðàâåíñòâî. Ðåçóëüòàòîì îïåðà-
öèè Eqv ÿâëÿåòñÿ çíà÷åíèå True, êîãäà îáà îïåðàíäà áóäóò ðàâíûìè True;
èíà÷å — False.
Îïåðàòîð Eqv èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Operand1 Eqv Operand2
Operand1 è Operand2 — ýòî ëþáûå äîïóñòèìûå ëîãè÷åñêèå âûðàæåíèÿ VBA.
Imp
Îïåðàòîð Imp âûïîëíÿåò ëîãè÷åñêóþ îïåðàöèþ èìïëèêàöèè. Îïåðàòîð Imp
òåñòèðóåò âçàèìîñâÿçü ìåæäó äâóìÿ ëîãè÷åñêèìè çíà÷åíèÿìè, êîãäà ñïðàâåä-
ëèâîñòü îäíîãî çíà÷åíèÿ ïîäðàçóìåâàåò ñïðàâåäëèâîñòü äðóãîãî çíà÷åíèÿ; â
êà÷åñòâå ðåçóëüòàòà îïåðàöèÿ Imp èìååò çíà÷åíèå True, òîëüêî êîãäà âòîðîé
îïåðàíä íå ïðîòèâîðå÷èò ïåðâîìó. Îïåðàòîð Imp èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Operand1 Imp Operand2
Operand1 è Operand2 — ýòî ëþáûå äîïóñòèìûå ëîãè÷åñêèå âûðàæåíèÿ VBA.
Êîíêàòåíàöèÿ ñòðîê
VBA äàåò âîçìîæíîñòü îáúåäèíÿòü (ñêëåèâàòü) ñòðîêè âìåñòå äëÿ îáðàçîâà-
íèÿ áîëåå äëèííûõ ñòðîê. Ïðèñîåäèíåíèå îäíîé ñòðîêè ê äðóãîé íàçûâàåòñÿ
êîíêàòåíàöèåé (concatenation) ñòðîê. Êîíêàòåíàöèÿ ñòðîê ÷ðåçâû÷àéíî ïî-
ëåçíà è äîâîëüíî ïðîñòà, õîòÿ èìåþòñÿ íåêîòîðûå òðóäíîñòè, î êîòîðûõ íåîá-
õîäèìî çíàòü.
3:
4: Const BoxTitle = "Óñòàíîâêà èñõîäíûõ äàííûõ"
5: Const ShtName = "Îò÷åò î ïðîäàæàõ"
6:
7: Dim Fname As String
8:
9: 'ïîëó÷èòü îò ïîëüçîâàòåëÿ èìÿ ðàáî÷åé êíèãè
10: Fname = InputBox("Ââåäèòå èìÿ ðàáî÷åé êíèãè:", BoxTitle)
11:
12: Workbooks.Open FileName:=Fname 'îòêðûòü êíèãó
13:
14: ActiveWorkbook.Sheets(ShtName).Select 'âûáðàòü ðàáî÷èé ëèñò
15:
16: 'ñîîáùåíèå ïîëüçîâàòåëþ î òîì, ÷òî êíèãà îòêðûòà
17: MsgBox "Ðàáî÷àÿ êíèãà " & Fname & " îòêðûòà, " & ShtName & _
18: " âûáðàí.", , BoxTitle & " çàâåðøåíà"
19: End Sub
Ëèñòèíã 3.15.
1: Sub list5_07()
2: dd& = 99
3: gg = MsgBox(TypeName(dd), vbOKOnly, " dd& = 99 ")
4: End Sub
Ðèñ. 3.8
Ðåçóëüòàò âûïîëíåíèÿ êîäà ëèñòèíãà 3.15
Îïåðàòîð/çíà
Êîììåíòàðèè
ê
^ Âîçâåäåíèå â ñòåïåíü, íàèâûñøèé ïðèîðèòåò
– Óíàðíûé ìèíóñ
Óìíîæåíèå è äåëåíèå èìåþò ðàâíûå ïðèîðèòåòû; îíè
*,/
âû÷èñëÿþòñÿ ïî ìåðå ïîÿâëåíèÿ â âûðàæåíèè ñëåâà íàïðàâî.
\
Mod
Ñëîæåíèå è âû÷èòàíèå èìåþò ðàâíûé ïðèîðèòåò; îíè
+, -
âû÷èñëÿþòñÿ ïî ìåðå ïîÿâëåíèÿ â âûðàæåíèè ñëåâà íàïðàâî.
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 141
Îïåðàòîð/çíà
Êîììåíòàðèè
ê
Âñÿêàÿ êîíêàòåíàöèÿ ñòðîê âûïîëíÿåòñÿ ïîñëå ëþáûõ
& àðèôìåòè÷åñêèõ îïåðàöèé â âûðàæåíèè è ïåðåä ëþáûìè
îïåðàöèÿìè ñðàâíåíèÿ èëè ëîãè÷åñêèìè îïåðàöèÿìè.
Âñå îïåðàòîðû ñðàâíåíèÿ èìåþò ðàâíûå ïðèîðèòåòû è
<, <=, >, >=, âû÷èñëÿþòñÿ ïî ìåðå ïîÿâëåíèÿ â âûðàæåíèè ñëåâà íàïðàâî.
Like=, <>, Is Èñïîëüçóéòå êðóãëûå ñêîáêè äëÿ ãðóïïèðîâàíèÿ îïåðàòîðîâ
ñðàâíåíèÿ â âûðàæåíèÿõ.
Not
And
Or
Xor
Eqv
Imp
Ôóíêöèè â Visual Basic
4
Âû óæå ïîëüçîâàëèñü âñòðîåííûìè VBA-ôóíêöèÿìè: InputBox è MsgBox.
Òåïåðü, êîãäà âû çíàåòå âñå î âûðàæåíèÿõ, ïîðà íàó÷èòüñÿ âêëþ÷àòü ôóíêöèè
â âûðàæåíèÿ. Ïðè ÷òåíèè ýòîé ãëàâû íå î÷åíü ïîëàãàéòåñü íà ïðàâèëüíîñòü
ñèíòàêñèñà ïðèâåäåííûõ çäåñü ôóíêöèé. Ïå÷àòíûå èçäàíèÿ ÷àñòî ñîäåðæàò
îøèáêè. Îøèáêè âñòðå÷àþòñÿ è â ñïðàâî÷íûõ ñèñòåìàõ ëîêàëèçîâàííûõ ïðî-
äóêòîâ. Ïðàâèëüíåå áóäåò ðàññìàòðèâàòü ýòó ãëàâó êàê ââåäåíèå â ìèð ôóíê-
öèé è ïîëó÷åíèå îáùåãî ïðåäñòàâëåíèÿ î ôóíêöèÿõ êàê íåîáõîäèìûõ ñîñòàâ-
ëÿþùèõ ñèñòåìû ïðîãðàììèðîâàíèÿ. Òî÷íûé ñèíòàêñèñ êàæäîé ôóíêöèè ñëå-
äóåò ïðîâåðÿòü â ñïðàâî÷íîé ñèñòåìå VBA.
Ôóíêöèÿ (function) — ýòî âñòðîåííàÿ ôîðìóëà, âûïîëíÿþùàÿ äåéñòâèÿ íàä
âûðàæåíèÿìè è ãåíåðèðóþùàÿ çíà÷åíèå. Ôóíêöèÿ âñåãäà âîçâðàùàåò çíà÷å-
íèå, êîòîðîå VBA âñòàâëÿåò â ïðîãðàììó â òîì ìåñòå, ãäå ïîÿâëÿåòñÿ èìÿ
ôóíêöèè. Ôóíêöèè VBA äåëÿòñÿ íà íåñêîëüêî ãðóïï â çàâèñèìîñòè îò òèïà
îïåðàöèè èëè âû÷èñëåíèÿ, êîòîðîå îíè âûïîëíÿþò. Ôóíêöèè èñïîëüçóþòñÿ
äëÿ âûïîëíåíèÿ òàêèõ çàäà÷, êàê:
w Ïðåîáðàçîâàíèå òåêñòîâûõ ñòðîê â äðóãèå òèïû äàííûõ.
w Ïîëó÷åíèå äàííûõ î òåêñòîâûõ ñòðîêàõ.
w Ïðåîáðàçîâàíèå äðóãèõ òèïîâ â òåêñòîâûå ñòðîêè.
w Ôîðìàòèðîâàíèå ÷èñåë èëè äðóãèõ òèïîâ äàííûõ äëÿ îòîáðàæåíèÿ.
w Ìàíèïóëèðîâàíèå èëè ãåíåðèðîâàíèå çíà÷åíèé äàííûõ.
w Ïîëó÷åíèå èíôîðìàöèè î ôàéëàõ, äðàéâåðàõ äèñêà èëè ñðåäå, â êîòî-
ðîé VBA ðàáîòàåò â äàííûé ìîìåíò âðåìåíè.
 ýòîé ãëàâå ðàññêàçûâàåòñÿ î ðàçëè÷íûõ êàòåãîðèÿõ ôóíêöèé è îïèñûâà-
þòñÿ ïîäðîáíî íàèáîëåå âàæíûå ôóíêöèè VBA è èõ èñïîëüçîâàíèå. Â ïîñëå-
äóþùèõ ãëàâàõ îïèñûâàþòñÿ äðóãèå ôóíêöèè VBA, ïåðå÷èñëåííûå â ýòîé ãëà-
âå è ñâÿçàííûå ñ òåìàìè ïîñëåäóþùèõ ãëàâ. Êðîìå òîãî, âû óçíàåòå, ÷òî ìîæ-
íî ñîçäàâàòü ñîáñòâåííûå ôóíêöèè äëÿ èñïîëüçîâàíèÿ â ïðîöåäóðàõ VBA.
 ýòîé êíèãå âû óæå âñòðå÷àëèñü ñ ïðèìåðàìè ïðîöåäóð è ôóíêöèé VBA.
Íå ïóòàéòå òåðìèíû ôóíêöèÿ è ïðîöåäóðà. Îáû÷íî ïðîöåäóðà âûïîëíÿåò îï-
ðåäåëåííóþ çàäà÷ó (èëè ãðóïïó çàäà÷) ïîäîáíî òîìó, êàê îïðåäåëåííàÿ êîìàí-
äà ìåíþ â Excel, Word èëè äðóãîì ïðèëîæåíèè âûïîëíÿåò êîíêðåòíóþ çàäà-
÷ó. Ôóíêöèÿ îïåðèðóåò îäíèì èëè áîëåå çíà÷åíèÿìè è âîçâðàùàåò íåêîòîðîå
ðåçóëüòèðóþùåå çíà÷åíèå (êàê ôîðìóëà â ÿ÷åéêå ðàáî÷åãî ëèñòà Excel).
144 Ãëàâà 4
Ðèñ. 4.1
Ðåçóëüòàò âûïîëíåíèÿ êîäà
ëèñòèíãà 4.1
Ôóíêöèè â Visual Basic 145
Äî ñèõ ïîð âî âñåõ ïðèìåðàõ ýòîé êíèãè àðãóìåíò êîìàíäíûõ êíîïîê â îïå-
ðàòîðàõ MsgBox áûë îïóùåí. Åñëè ïðè âûçîâå MsgBox àðãóìåíò êîìàíäíûõ
êíîïîê íå óêàçûâàåòñÿ, MsgBox îòîáðàæàåò äèàëîãîâîå îêíî, ñîäåðæàùåå
òîëüêî îäíó êíîïêó. Ïîñêîëüêó äèàëîãîâîå îêíî MsgBox äî ñèõ ïîð ñîäåðæàëî
òîëüêî îäíó êíîïêó, íå èìåëî çíà÷åíèÿ, êàêîâ ðåçóëüòàò ôóíêöèè MsgBox, è
ïîýòîìó ðåçóëüòàò ôóíêöèè MsgBox èãíîðèðîâàëñÿ â êîäå.
VBA ïðåäîñòàâëÿåò íåñêîëüêî âñòðîåííûõ êîíñòàíò äëÿ îïðåäåëåíèÿ êíîïîê
â îêíå ñîîáùåíèÿ MsgBox. Îäíà èç ýòèõ êîíñòàíò (vbYesNî) óêàçûâàåò MsgBox,
÷òî â îòîáðàæàåìîå îêíî ñîîáùåíèÿ ñëåäóåò âêëþ÷èòü êíîïêó Äà (Yes) è êíîïêó
Íåò (No). Ñëåäóþùèé îïåðàòîð âûâîäèò äèàëîãîâîå îêíî, ïîêàçàííîå íà ðèñ.
4.2:
MsgBox "Âàì âèäíû äâå êíîïêè?" , vbYesNo, "Äåìîíñòðàöèÿ êíîïîê"
Ïðè èñïîëüçîâàíèè ýòîãî îïåðàòîðà èìååòñÿ îäíà ïðîáëåìà: ðåçóëüòàò
ïîëüçîâàòåëüñêîãî âûáîðà íèêàêèì îáðàçîì íå âîçâðàùàåòñÿ; êîä ïî-ïðåæíå-
ìó íå èñïîëüçóåò ðåçóëüòàò ôóíêöèè MsgBox.
Äëÿ âûáîðêè ðåçóëüòàòà ôóíêöèè Msgbox íåîáõîäèìî èçìåíèòü ýòîò îïåðà-
òîð: íóæíî çàêëþ÷èòü ñïèñîê àðãóìåíòîâ â êðóãëûå ñêîáêè è èçìåíèòü îïåðà-
òîð òàê, ÷òîáû îí êàêèì-òî îáðàçîì èñïîëüçîâàë ðåçóëüòàò ôóíêöèè. Îáû÷íî
ðåçóëüòàò ôóíêöèè MsgBox ïðèñâàèâàåòñÿ êàêîé-ëèáî ïåðåìåííîé è ìîæíî
ïîçæå òåñòèðîâàòü ýòîò ðåçóëüòàò â äðóãîì îïåðàòîðå, ÷òîáû îïðåäåëèòü, êà-
êóþ êíîïêó, ôàêòè÷åñêè, âûáðàë ïîëüçîâàòåëü ïðîöåäóðû. Ñëåäóþùàÿ ñòðîêà
ïîêàçûâàåò îïåðàòîð MsgBox, èçìåíåííûé òàê, ÷òî îí âîçâðàùàåò çíà÷åíèå:
Êîä_îòâåòà = MsgBox ("Âàì âèäíû äâå êíîïêè?" , vbYesNo, _
"Äåìîíñòðàöèÿ êíîïîê")
Ïðè âûïîëíåíèè ýòîãî îïåðàòîðà VBA îòîáðàæàåò òî æå ñàìîå äèàëîãîâîå
îêíî, ïîêàçàííîå íà ðèñ. 4.2. Êîãäà ïîëüçîâàòåëü âûáèðàåò êíîïêó Äà (Yes)
èëè Íåò (No), VBA çàêðûâàåò äèàëîãîâîå îêíî è ñîõðàíÿåò ÷èñëî,
ñîîòâåòñòâóþùåå âûáðàííîé êíîïêå, â ïåðåìåííîé Êîä_îòâåòà.
Ðèñ. 4.2
Äèàëîãîâîå îêíî MsgBox, äåìîíñòðèðóþùåå ðåçóëüòàò âêëþ÷åíèÿ â
ñïèñîê ïàðàìåòðîâ àðãóìåíòà êíîïîê
Êîíñòàíòà Íàçíà÷åíèå
Îòîáðàæàåò êîìàíäíûå êíîïêè Ñòîï, Ïîâòîð, Ïðîïóñòèòü
vbAbortRetryIgnore
(Abort, Retry, Ignore)
Äëÿ ïðîäîëæåíèÿ ðàáîòû ñ ïðèëîæåíèåì ïîëüçîâàòåëü
äîëæåí îòâåòèòü íà çàïðîñ (èëè çàêðûòü) ýòîãî äèàëîãîâîãî
vbApplicationModal
îêíà. Ëþáûå äðóãèå ïðèëîæåíèÿ Windows, ðàáîòàþùèå â
ôîíîâîì ðåæèìå, ïðîäîëæàþò âûïîëíÿòüñÿ.
Îòîáðàæàåò â äèàëîãå çíà÷îê êðèòè÷åñêîãî
vbCritical ïðåäóïðåäèòåëüíîãî ñîîáùåíèÿ (Critical Message) Windows
(êðàñíûé êðóæîê).
Ïåðâàÿ êîìàíäíàÿ êíîïêà â äèàëîãîâîì îêíå ÿâëÿåòñÿ
vbDefaultButton1
êíîïêîé ïî óìîë÷àíèþ.
Âòîðàÿ êîìàíäíàÿ êíîïêà â äèàëîãîâîì îêíå ÿâëÿåòñÿ
vbDefaultButton2
êíîïêîé ïî óìîë÷àíèþ.
Òðåòüÿ êîìàíäíàÿ êíîïêà â äèàëîãîâîì îêíå ÿâëÿåòñÿ
vbDefaultButton3
êíîïêîé ïî óìîë÷àíèþ.
×åòâåðòàÿ êîìàíäíàÿ êíîïêà â äèàëîãîâîì îêíå ÿâëÿåòñÿ
vbDefaultButton4
êíîïêîé ïî óìîë÷àíèþ.
Îòîáðàæàåò çíà÷îê («!») ïðåäóïðåæäåíèÿ (Warning Message);
vbExclamation îáû÷íî èñïîëüçóåòñÿ äëÿ îòîáðàæåíèÿ âàæíîé èíôîðìàöèè
èëè ïðåäóïðåæäåíèÿ, íå òðåáóþùåãî îòâåòà.
Îòîáðàæàåò çíà÷îê («I») èíôîðìàöèè (Information Message);
vbInformation îáû÷íî èñïîëüçóåòñÿ äëÿ îòîáðàæåíèÿ âàæíîé èíôîðìàöèè,
êðîìå ïðåäóïðåæäåíèÿ.
Äîáàâëÿåò ê äèàëîãîâîìó îêíó êíîïêó Ñïðàâêà (Help); ïðè
ùåë÷êå íà êíîïêå Ñïðàâêà îòêðûâàåòñÿ ôàéë, êîòîðûé
vbMsgBoxHelpButton
çàäàí â àðãóìåíòå HelpFile, â ðàçäåëå, çàäàííîì àðãóìåíòîì
Context.
vbOKCancel Îòîáðàæàåò êíîïêè ÎÊ è Îòìåíà (OK, Cancel).
Îòîáðàæàåò òîëüêî êíîïêó ÎÊ; òî æå ñàìîå ïðîèñõîäèò ïðè
vbOKOnly
îïóñêàíèè àðãóìåíòà Buttons.
Îòîáðàæàåò çíà÷îê çàïðîñà (Query icon) Windows («?»);
îáû÷íî èñïîëüçóåòñÿ, ÷òîáû çàäàòü ïîëüçîâàòåëþ î÷åíü
vbQuestion
âàæíûé âîïðîñ èëè âûäàòü ïðåäóïðåäèòåëüíîå ñîîáùåíèå,
òðåáóþùåå îòâåòà.
vbRetryCancel Îòîáðàæàåò êíîïêè Ïîâòîð è Îòìåíà (Retry, Cancel).
Ïðè îòîáðàæåíèè äèàëîãîâîå îêíî îñòàåòñÿ âïåðåäè äðóãèõ
vbSystemModal îêîí (äàæå ïðè ïåðåêëþ÷åíèè íà äðóãîå ïðèëîæåíèå), ïîêà
íå áóäåò çàêðûòî.
vbYesNo Îòîáðàæàåò êíîïêè Äà è Íåò (Yes, No).
vbYesNoCancel Îòîáðàæàåò êíîïêè Äà, Íåò è Îòìåíà (Yes, No, Cancel).
Ðèñ. 4.3
Èñïîëüçóéòå íåîáÿçàòåëüíûå àðãóìåíòû
ôóíêöèè InputBox äëÿ çàäàíèÿ çíà÷åíèÿ ïî
óìîë÷àíèþ
ãîâîå îêíî ñîâñåì íå ïîÿâèòñÿ íà ýêðàíå, ïîòîìó ÷òî åãî ïîëîæåíèå âûéäåò çà ïðà-
âûé èëè íèæíèé êðàé îêíà. Ïðè ýòîì, õîòÿ äèàëîãîâîå îêíî è íåâèäèìî, îíî ÿâ-
ëÿåòñÿ àêòèâíûì, íè îäèí èç ýëåìåíòîâ óïðàâëåíèÿ, êîòîðûå âû âèäèòå íà ýêðàíå,
íå áóäåò ðàáîòàòü äî òåõ ïîð, ïîêà âû íå îòðåàãèðóåòå íà «íåâèäèìîå» äèàëîãîâîå
îêíî.
Ïîñëåäíèå äâà íåîáÿçàòåëüíûõ àðãóìåíòà äëÿ ôóíêöèè InputBox — ýòî HelpFile è
Context. Îíè èìåþò òî æå íàçíà÷åíèå, ÷òî è ïîäîáíûå àðãóìåíòû ôóíêöèè
MsgBox.
Åñëè âû çàäàåòå HelpFile èëè Context, íåîáõîäèìî çàäàâàòü îáà àðãóìåíòà (ýòè àðãó-
ìåíòû çàêëþ÷åíû â îäíè êâàäðàòíûå ñêîáêè). Âñÿêèé ðàç, êîãäà óêàçûâàåòñÿ ñïðà-
âî÷íûé ôàéë äëÿ îêíà ââîäà, VBA àâòîìàòè÷åñêè äîáàâëÿåò êîìàíäíóþ êíîïêó ïî-
ìîùè â äèàëîãîâîå îêíî. VBA íå âêëþ÷àåò Windows Help Compiler; åñëè âû õîòèòå
ñîçäàòü ñîáñòâåííûå ïîëüçîâàòåëüñêèå ñïðàâî÷íûå ôàéëû, íåîáõîäèìî îò Microsoft
ïîëó÷èòü Windows Help Compiler îòäåëüíî èëè èñïîëüçîâàòü ñðåäñòâà íåçàâèñèìûõ
ïîñòàâùèêîâ ïðîãðàììíîãî îáåñïå÷åíèÿ.
áîòêè ñòðîê èìåþò âàæíîå çíà÷åíèå, ïîýòîìó îòäåëüíûé ðàçäåë ýòîé ãëàâû ïî-
ñâÿùåí ñïîñîáàì èõ èñïîëüçîâàíèÿ.
Ìàòåìàòè÷åñêèå ôóíêöèè
VBA ïðåäîñòàâëÿåò ñòàíäàðòíûé íàáîð ìàòåìàòè÷åñêèõ ôóíêöèé.  òàáë. 4.3
ïðèâåäåíû ìàòåìàòè÷åñêèå ôóíêöèè, èìåþùèåñÿ â VBA.  ýòîé òàáëèöå N îçíà-
÷àåò ëþáîå ÷èñëåííîå âûðàæåíèå; âñå àðãóìåíòû ôóíêöèé ÿâëÿþòñÿ îáÿçàòåëü-
íûìè, åñëè òîëüêî íå óêàçàíî èíà÷å.
Òàáëèöà 4.3. Ìàòåìàòè÷åñêèå ôóíêöèè VBA
Ôóíêöèè
Âîçâðàùàåò/äåéñòâèå
(àðãóìåíòû)
Abs(N) Âîçâðàùàåò àáñîëþòíîå çíà÷åíèå N.
Atn(N) Âîçâðàùàåò àðêòàíãåíñ N êàê óãîë â ðàäèàíàõ.
Cos(N) Êîñèíóñ óãëà N, ãäå N — ýòî óãîë, èçìåðåííûé â ðàäèàíàõ.
Âîçâðàùàåò êîíñòàíòó å, âîçâåäåííóþ â ñòåïåíü N. (å — ýòî îñíîâàíèå
Exp(N)
íàòóðàëüíûõ ëîãàðèôìîâ è îíà (ïðèáëèçèòåëüíî) ðàâíà 2,718282).
Âîçâðàùàåò öåëóþ ÷àñòü N. Fix íå îêðóãëÿåò ÷èñëî, à îòáðàñûâàåò
ëþáóþ äðîáíóþ ÷àñòü. Åñëè N ÿâëÿåòñÿ îòðèöàòåëüíûì, Fix
Fix(N)
âîçâðàùàåò áëèæàéøåå îòðèöàòåëüíîå öåëîå áîëüøåå, ÷åì èëè ðàâíîå
N.
Âîçâðàùàåò öåëóþ ÷àñòü N. Int íå îêðóãëÿåò ÷èñëî, à îòáðàñûâàåò
ëþáóþ äðîáíóþ ÷àñòü. Åñëè N ÿâëÿåòñÿ îòðèöàòåëüíûì, Int
Int(N)
âîçâðàùàåò áëèæàéøåå îòðèöàòåëüíîå öåëîå ìåíüøåå, ÷åì èëè ðàâíîå
N.
Log(N) Âîçâðàùàåò íàòóðàëüíûé ëîãàðèôì N.
Âîçâðàùàåò ñëó÷àéíîå ÷èñëî; àðãóìåíò ÿâëÿåòñÿ íåîáÿçàòåëüíûì.
Rnd(N) Èñïîëüçóéòå ôóíêöèþ Rnd òîëüêî ïîñëå èíèöèàëèçàöèè
VBA-ãåíåðàòîðà ñëó÷àéíûõ ÷èñåë îïåðàòîðîì Randomize.
Âîçâðàùàåò çíàê ÷èñëà: –1, åñëè N — îòðèöàòåëüíîå; 1, åñëè N —
Sgn(N)
ïîëîæèòåëüíîå; 0, åñëè N ðàâíî 0.
Sin(N) Âîçâðàùàåò ñèíóñ óãëà; N — ýòî óãîë, èçìåðåííûé â ðàäèàíàõ.
Âîçâðàùàåò êîðåíü êâàäðàòíûé èç N. VBA îòîáðàæàåò îøèáêó
Sqr(N)
âðåìåíè èñïîëíåíèÿ, åñëè N — îòðèöàòåëüíîå.
Tan(N) Âîçâðàùàåò òàíãåíñ óãëà; N — óãîë â ðàäèàíàõ.
Ôóíêöèÿ
Âîçâðàùàåò/äåéñòâèå
(àðãóìåíòû)
Âîçâðàùàåò ÷èñëî êîäà ñèìâîëà, ñîîòâåòñòâóþùåå ïåðâîé áóêâå
Asc(S)
ñòðîêè S. Áóêâà «A», íàïðèìåð, èìååò êîä ñèìâîëà 65.
Âîçâðàùàåò ñòðîêó èç îäíîãî ñèìâîëà, ñîîòâåòñòâóþùåãî êîäó
Chr(N) ñèìâîëà N, êîòîðûé äîëæåí áûòü ÷èñëîì ìåæäó 0 è 255,
âêëþ÷èòåëüíî. Êîä ñèìâîëà 65, íàïðèìåð, âîçâðàùàåò áóêâó «A».
Âîçâðàùàåò ñòðîêó, ñîäåðæàùóþ çíà÷åíèå, ïðåäñòàâëåííîå
Format(E, S) âûðàæåíèåì Å, â ôîðìàòå â ñîîòâåòñòâèè ñ èíñòðóêöèÿìè,
ñîäåðæàùèìèñÿ â S.
Âîçâðàùàåò ñòðîêó, ñîäåðæàùóþ øåñòíàäöàòèðè÷íîå
Hex(N)
ïðåäñòàâëåíèå N.
Oct(N) Âîçâðàùàåò ñòðîêó, ñîäåðæàùóþ âîñüìåðè÷íîå ïðåäñòàâëåíèå N.
Âîçâðàùàåò öåëîå òèïà Long, ïðåäñòàâëÿþùåå çíà÷åíèå îñíîâíûõ
öâåòîâ èçîáðàæåíèÿ. N â êàæäîì àðãóìåíòå äîëæíî áûòü öåëûì â
RGB(N, N, N)
äèàïàçîíå 0–255, âêëþ÷èòåëüíî. Àðãóìåíòû (ñëåâà íàïðàâî) — ýòî
çíà÷åíèÿ äëÿ êðàñíîãî, çåëåíîãî è ñèíåãî öâåòà.
Str(N) Âîçâðàùàåò ñòðîêó, ýêâèâàëåíòíóþ ÷èñëåííîìó âûðàæåíèþ N.
154 Ãëàâà 4
Ôóíêöèÿ
Âîçâðàùàåò/äåéñòâèå
(àðãóìåíòû)
Âîçâðàùàåò ÷èñëåííîå çíà÷åíèå, ñîîòâåòñòâóþùåå ÷èñëó,
ïðåäñòàâëåííîìó ñòðîêîé S, êîòîðàÿ äîëæíà ñîäåðæàòü òîëüêî
Val(S) öèôðû è îäíó äåñÿòè÷íóþ òî÷êó, èíà÷å VBA íå ìîæåò
ïðåîáðàçîâàòü åå â ÷èñëî. Åñëè VBA íå ìîæåò ïðåîáðàçîâàòü
ñòðîêó â S, òî ôóíêöèÿ Val âîçâðàùàåò 0.
CBool(N) Âîçâðàùàåò Boolean-ýêâèâàëåíò ÷èñëåííîãî âûðàæåíèÿ N.
Âîçâðàùàåò ÷èñëåííîå çíà÷åíèå òèïà Byte (îò 0 äî 255); Å —
CByte(E) ëþáîå äîïóñòèìîå ÷èñëåííîå èëè ñòðîêîâîå âûðàæåíèå, êîòîðîå
ìîæåò áûòü ïðåîáðàçîâàíî â ÷èñëî.
Âîçâðàùàåò ÷èñëåííîå çíà÷åíèå òèïà Currency; Å — ëþáîå
CCur(E) äîïóñòèìîå ÷èñëåííîå èëè ñòðîêîâîå âûðàæåíèå, êîòîðîå ìîæåò
áûòü ïðåîáðàçîâàíî â ÷èñëî.
Âîçâðàùàåò çíà÷åíèå òèïà Date. Å ìîæåò áûòü ëþáûì äîïóñòèìûì
CDate(E) âûðàæåíèåì (ñòðîêîé èëè ÷èñëîì), ïðåäñòàâëÿþùèì äàòó â
äèàïàçîíå 1/1/100 — 12/31/9999, âêëþ÷èòåëüíî.
Âîçâðàùàåò ÷èñëåííîå çíà÷åíèå òèïà Double; Å — ëþáîå
CDbl(E) äîïóñòèìîå ÷èñëåííîå èëè ñòðîêîâîå âûðàæåíèå, êîòîðîå ìîæåò
áûòü ïðåîáðàçîâàíî â ÷èñëî.
Âîçâðàùàåò ÷èñëåííîå çíà÷åíèå òèïà Integer; Å — ëþáîå
Cint(E) äîïóñòèìîå ÷èñëåííîå èëè ñòðîêîâîå âûðàæåíèå, êîòîðîå ìîæåò
áûòü ïðåîáðàçîâàíî â ÷èñëî.
Âîçâðàùàåò ÷èñëåííîå çíà÷åíèå òèïà Long; Å — ëþáîå äîïóñòèìîå
CLng(E) ÷èñëåííîå èëè ñòðîêîâîå âûðàæåíèå, êîòîðîå ìîæåò áûòü
ïðåîáðàçîâàíî â ÷èñëî.
Âîçâðàùàåò ÷èñëåííîå çíà÷åíèå òèïà Single; Å — ëþáîå
CSng(E) äîïóñòèìîå ÷èñëåííîå èëè ñòðîêîâîå âûðàæåíèå, êîòîðîå ìîæåò
áûòü ïðåîáðàçîâàíî â ÷èñëî.
Âîçâðàùàåò çíà÷åíèå òèïà String; Å — ëþáîå äîïóñòèìîå
CStr(E)
÷èñëåííîå èëè ñòðîêîâîå âûðàæåíèå.
Âîçâðàùàåò çíà÷åíèå òèïà Variant; Å — ëþáîå äîïóñòèìîå
CVar(E)
÷èñëåííîå èëè ñòðîêîâîå âûðàæåíèå.
Ôóíêöèè
Âîçâðàùàåò/äåéñòâèå
(àðãóìåíòû)
Âîçâðàùàåò ñèñòåìíóþ äàòó. Ìîæíî òàêæå èñïîëüçîâàòü ýòó
ôóíêöèþ êàê ïðîöåäóðó äëÿ óñòàíîâêè ñèñòåìíûõ ÷àñîâ
Date
êîìïüþòåðà. Áîëåå ïîäðîáíî ìîæíî óçíàòü èç ñïðàâî÷íîé
ñèñòåìû VBA.
Âîçâðàùàåò ñèñòåìíîå âðåìÿ êîìïüþòåðà êàê çíà÷åíèå òèïà
Date. Ìîæíî òàêæå èñïîëüçîâàòü ýòó ôóíêöèþ êàê ïðîöåäóðó
Time
äëÿ óñòàíîâêè ñèñòåìíûõ ÷àñîâ. Áîëåå ïîäðîáíî ìîæíî
óçíàòü èç ñïðàâî÷íîé ñèñòåìû VBA.
Now Âîçâðàùàåò ñèñòåìíóþ äàòó è âðåìÿ.
Âîçâðàùàåò öåëîå, ÿâëÿþùååñÿ ÷àñòüþ âûðàæåíèÿ òèïà Date
Year(D) è ñîäåðæàùåå ãîä. Ãîä âîçâðàùàåòñÿ êàê ÷èñëî ìåæäó 100 è
9999.
Âîçâðàùàåò öåëîå, ÿâëÿþùååñÿ ÷àñòüþ âûðàæåíèÿ òèïà Date,
Month(D) ñîäåðæàùåå ìåñÿö. Ìåñÿö âîçâðàùàåòñÿ êàê ÷èñëî ìåæäó 1 è
12, âêëþ÷èòåëüíî.
Âîçâðàùàåò öåëîå, ÿâëÿþùååñÿ ÷àñòüþ âûðàæåíèÿ òèïà Date
Day(D) è ñîäåðæàùåå äåíü. Äåíü âîçâðàùàåòñÿ êàê ÷èñëî ìåæäó 1 è
31, âêëþ÷èòåëüíî.
Âîçâðàùàåò öåëîå, ñîäåðæàùåå äåíü íåäåëè äëÿ âûðàæåíèÿ
òèïà Date. Äåíü íåäåëè âîçâðàùàåòñÿ êàê ÷èñëî ìåæäó 1 è 7,
Weekday(D)
âêëþ÷èòåëüíî; 1 — ýòî âîñêðåñåíüå, 2 — ïîíåäåëüíèê è òàê
äàëåå.
WeekdayName(N1, Âîçâðàùàåò ñòðîêó c íàèìåíîâàíèåì äíÿ íåäåëè, íîìåð
B, N) êîòîðîãî çàäàåòñÿ ïàðàìåòðîì N1.
Âîçâðàùàåò öåëîå, ñîäåðæàùåå ÷àñû êàê ÷àñòü âðåìåíè,
ñîäåðæàùåãîñÿ â âûðàæåíèè òèïà Date. ×àñû âîçâðàùàþòñÿ
Hour(D)
êàê ÷èñëî ìåæäó 0 è 23, âêëþ÷èòåëüíî. Åñëè âûðàæåíèå D íå
ñîäåðæèò çíà÷åíèÿ âðåìåíè, òî Hour âîçâðàùàåò 0.
Âîçâðàùàåò öåëîå, ñîäåðæàùåå ìèíóòû êàê ÷àñòü âðåìåíè â
âûðàæåíèè òèïà Date. Ìèíóòû âîçâðàùàþòñÿ êàê ÷èñëî
Minute(D)
ìåæäó 0 è 59, âêëþ÷èòåëüíî. Åñëè âûðàæåíèå D íå ñîäåðæèò
çíà÷åíèÿ âðåìåíè, Minute âîçâðàùàåò 0.
Âîçâðàùàåò öåëîå, ñîäåðæàùåå ñåêóíäû êàê ÷àñòü âðåìåíè â
âûðàæåíèè òèïà Date. Ñåêóíäû âîçâðàùàþòñÿ êàê ÷èñëî
Second(D)
ìåæäó 0 è 59, âêëþ÷èòåëüíî. Åñëè âûðàæåíèå D íå ñîäåðæèò
çíà÷åíèÿ âðåìåíè, Second âîçâðàùàåò 0.
Âîçâðàùàåò çíà÷åíèå [òèï Variant (Date)], ñîäåðæàùåå äàòó,
DateAdd(S, N, D)
ê êîòîðîé äîáàâëåí çàäàííûé èíòåðâàë âðåìåíè.
DateDiff(S, D1, D2[, Âîçâðàùàåò çíà÷åíèå [òèï Variant (Long)] ÷èñëà âðåìåííûõ
N1 [, N2 ]]) èíòåðâàëîâ ìåæäó äâóìÿ îïðåäåëåííûìè äàòàìè.
156 Ãëàâà 4
Ôóíêöèè
Âîçâðàùàåò/äåéñòâèå
(àðãóìåíòû)
DatePart(S, D,[, N1 Âîçâðàùàåò îïðåäåëåííóþ ÷àñòü [òèï Variant (Integer)]
[, N2]]) çàäàííîé äàòû.
Âîçâðàùàåò çíà÷åíèå ïîñëåäîâàòåëüíîé äàòû äëÿ çàäàííîé
äàòû. Ñëåâà íàïðàâî àðãóìåíòû ïðåäñòàâëÿþò ãîä, ìåñÿö è
DateSerial(N, N, N) äåíü. Àðãóìåíò ãîäà äîëæåí áûòü öåëûì ÷èñëîì ìåæäó 100 è
9999, ìåñÿöà — ìåæäó 1 è 12, äíÿ — ìåæäó 1 è 31 (âñå
äèàïàçîíû ÿâëÿþòñÿ âêëþ÷àþùèìè).
Âîçâðàùàåò çíà÷åíèå ïîñëåäîâàòåëüíîãî âðåìåíè. Cëåâà
íàïðàâî àðãóìåíòû ïðåäñòàâëÿþò ÷àñû, ìèíóòû è ñåêóíäû.
TimeSerial (N, N,
Àðãóìåíò ÷àñîâ äîëæåí áûòü öåëûì ÷èñëîì ìåæäó 0 è 23,
N)
àðãóìåíòû ìèíóò è ñåêóíä äîëæíû îáà áûòü ÷èñëàìè 0 è 59
(âñå äèàïàçîíû ÿâëÿþòñÿ âêëþ÷àþùèìè).
Âîçâðàùàåò çíà÷åíèå òèïà Date, ýêâèâàëåíòíîå äàòå, çàäàííîé
DateValue(E) àðãóìåíòîì Å, êîòîðûé äîëæåí áûòü ñòðîêîé, ÷èñëîì èëè
êîíñòàíòîé, ïðåäñòàâëÿþùåé äàòó.
Âîçâðàùàåò çíà÷åíèå òèïà Date, ñîäåðæàùåå âðåìÿ, çàäàííîå
TimeValue(E) àðãóìåíòîì Å, êîòîðûé ìîæåò áûòü ñòðîêîé, ÷èñëîì èëè
êîíñòàíòîé, ïðåäñòàâëÿþùåé âðåìÿ.
Âîçâðàùàåò ÷èñëî, ïðåäñòàâëÿþùåå êîëè÷åñòâî ñåêóíä îò
Timer
ïîëóíî÷è â ñîîòâåòñòâèè ñ ñèñòåìíûì âðåìåíåì êîìïüþòåðà.
Ñòðîêîâûå ôóíêöèè
Ñòðîêîâûå ôóíêöèè VBA ÷àñòî ïðèìåíÿþòñÿ äëÿ íàõîæäåíèÿ çàäàííûõ
ñòðîê âíóòðè äðóãèõ ñòðîê, äëÿ ñðàâíåíèÿ îäíîé ñòðîêè ñ äðóãîé è êîïèðîâà-
íèÿ âûáðàííûõ ÷àñòåé ñòðîê. Ñòðîêîâûå ôóíêöèè VBA èñïîëüçóþòñÿ äîâîëü-
íî ÷àñòî, ïîòîìó ÷òî ñòðîêîâûå äàííûå î÷åíü âàæíû è âñòðå÷àþòñÿ â êàæäîì
ïðèëîæåíèè VBA — Word, Excel, Access èëè äðóãîì host-ïðèëîæåíèè VBA.
×àñòî íåîáõîäèìî ìàíèïóëèðîâàòü ñòðîêîâûìè äàííûìè, ïîëó÷åííûìè êàê
ïîëüçîâàòåëüñêèé ââîä ôóíêöèåé InputBox.  äðóãèõ ñëó÷àÿõ ñòðîêîâûå äàí-
íûå ïîÿâëÿþòñÿ â êîäå VBA êàê èìåíà ôàéëîâ äëÿ äîêóìåíòîâ Word, ðàáî÷èõ
êíèã Excel, áàç äàííûõ Access è äðóãèõ òèïîâ äàííûõ, ñîõðàíÿåìûõ â ôàéëàõ
íà äèñêàõ.
 Word âàæíîñòü ìàíèïóëèðîâàíèÿ ñòðîêîâûìè äàííûìè î÷åâèäíà: äàí-
íûå, ñîõðàíÿåìûå â äîêóìåíòàõ Word, â îñíîâíîì ÿâëÿþòñÿ íè÷åì èíûì, êàê
ñòðîêîâûìè äàííûìè. Ñòðîêîâûå äàííûå òàêæå âàæíû â Excel â êà÷åñòâå
èìåí ðàáî÷èõ ëèñòîâ, èìåíîâàííûõ äèàïàçîíîâ äàííûõ è òàê äàëåå.  ýòîì
ðàçäåëå ïðèâîäÿòñÿ èìåþùèåñÿ â VBA ñòðîêîâûå ôóíêöèè; â ïîñëåäóþùåì
ðàçäåëå áîëåå ïîäðîáíî îïèñûâàåòñÿ, êàê èñïîëüçîâàòü íàèáîëåå âàæíûå è ïî-
ëåçíûå ñòðîêîâûå ôóíêöèè.
 òàáë. 4.6, ãäå ïðèâåäåíû îñíîâíûå ñòðîêîâûå ôóíêöèè VBA, N — ýòî ëþ-
áîå äîïóñòèìîå ÷èñëåííîå âûðàæåíèå, à S — ýòî ëþáîå äîïóñòèìîå ñòðîêîâîå
Ôóíêöèè â Visual Basic 157
Ðèñ. 4.4
Äèàëîãîâûå îêíà êàê ðåçóëüòàò âûïîëíåíèÿ êîäà
ëèñòèíãà 4.3
5: Title:="Ñðàâíåíèå ñòðîê", _
6: Default:= Óìîë÷àíèå)
7: MsgBox InStr(1, ÑòðîêàÂâîäà, Óìîë÷àíèå, vbTextCompare)
8: End Sub
Ôóíêöèÿ Left
VBA èìååò òðè ôóíêöèè äëÿ âûäåëåíèÿ ïîäñòðîê èç áîëüøèõ ñòðîê.
(Ïîäñòðîêà — ýòî ëþáàÿ ñòðîêà, êîòîðàÿ ÿâëÿåòñÿ èëè ìîæåò áûòü ÷àñòüþ
áîëüøåé ñòðîêè). Ïåðâàÿ èç íèõ — ýòî ôóíêöèÿ Left, âîçâðàùàþùàÿ êîïèþ
îïðåäåëåííîé ÷àñòè ñòðîêè. Äàëåå ñëåäóåò ñèíòàêñèñ ôóíêöèè Left:
Ñèíòàêñèñ
Left(String, Length)
Çäåñü String — ëþáîå äîïóñòèìîå ñòðîêîâîå âûðàæåíèå, à Length — ëþáîå ÷èñëåí-
íîå âûðàæåíèå. Ôóíêöèÿ Left âîçâðàùàåò êîïèþ String, íà÷èíàÿ ñ ïåðâîãî ñèìâî-
ëà è âêëþ÷àÿ êîëè÷åñòâî ñèìâîëîâ, çàäàííûõ ñ ïîìîùüþ Length. Åñëè Length ÿâëÿ-
åòñÿ ÷èñëîì, áîëüøèì, ÷åì ôàêòè÷åñêàÿ äëèíà String, òî Left âîçâðàùàåò âñå ñòðî-
êîâîå âûðàæåíèå String.
Ôóíêöèÿ Right
Äðóãàÿ VBA-ôóíêöèÿ ïîäñòðîêè — ýòî ôóíêöèÿ Right. Äàëåå ñëåäóåò ñèí-
òàêñèñ Right:
Ñèíòàêñèñ
Right(String, Length)
Çäåñü String ïðåäñòàâëÿåò ëþáîå äîïóñòèìîå ñòðîêîâîå âûðàæåíèå, à Length —
ëþáîå ÷èñëåííîå âûðàæåíèå. Ôóíêöèÿ Right âîçâðàùàåò êîïèþ String, íà÷èíàÿ ñ
ïîñëåäíåãî ñèìâîëà â ñòðîêå è âêëþ÷àÿ ñïðàâà íàëåâî êîëè÷åñòâî ñèìâîëîâ,
óêàçàííîå ñ ïîìîùüþ Length. Åñëè Length ÿâëÿåòñÿ ÷èñëîì, áîëüøèì, ÷åì
ôàêòè÷åñêàÿ äëèíà String, òî Right âîçâðàùàåò âñå ñòðîêîâîå âûðàæåíèå String.
164 Ãëàâà 4
Ôóíêöèÿ Mid
Ìîæíî èçâëå÷ü ïîäñòðîêó èç ñåðåäèíû ñòðîêè, à íå èç ïðàâîé èëè ëåâîé åå
÷àñòè. Òàêàÿ ñèòóàöèÿ ìîæåò âîçíèêíóòü ïðè èçâëå÷åíèè îòäåëüíûõ ñëîâ èç
ñòðîêè òåêñòà. Äëÿ èçâëå÷åíèÿ ïîäñòðîêè èç ñåðåäèíû äðóãîé ñòðîêè VBA
èìååò ôóíêöèþ Mid. Ôóíêöèÿ Mid èìååò ñëåäóþùèé îáùèé ñèíòàêñèñ:
ÑÈÍÒÀÊÑÈÑ
Mid(String, Start [, Length])
Çäåñü String — ëþáîå ñòðîêîâîå âûðàæåíèå, òîãäà êàê Start è Length — ýòî ëþáûå
÷èñëåííûå âûðàæåíèÿ. Ôóíêöèÿ Mid âîçâðàùàåò êîïèþ String, íà÷èíàÿ ñ
ïîëîæåíèÿ ñèìâîëà â String, çàäàâàåìîãî ñ ïîìîùüþ àðãóìåíòà Start.
Íåîáÿçàòåëüíûé àðãóìåíò Length îïðåäåëÿåò êîëè÷åñòâî êîïèðóåìûõ â Mid
ñèìâîëîâ èç String. Åñëè Start ñîäåðæèò áîëüøåå ÷èñëî, ÷åì ôàêòè÷åñêàÿ äëèíà
String, òî Mid âîçâðàùàåò ïóñòóþ ñòðîêó.
Ðèñ. 4.5
Ïðèìåð èñïîëüçîâàíèÿ ôóíêöèè Chr
Ðèñ. 4.6
Èñïîëüçîâàíèå ôóíêöèè Chr ñ êîíñòàíòîé 13
â êà÷åñòâå ïàðàìåòðà îêðûâàåò âîçìîæíîñòè ôîðìàòèðîâàíèÿ
òåêñòà â îêíå ôóíêöèè MsgBox
Ðèñ. 4.7
Èñïîëüçîâàíèå ôóíêöèè Format
äëÿ èçìåíåíèÿ ñòðîêîâîãî ôîðìàòà
çíà÷åíèÿ äàòû
Èìåíîâàííûé
Äåéñòâèå
ôîðìàò
Ôîðìàòèðóåò èíôîðìàöèþ î äàòå è âðåìåíè â ïîñëåäîâàòåëüíîå
÷èñëî äàòû, èñïîëüçóÿ óñòàíîâêè ôîðìàòà äàòû è âðåìåíè äëÿ
General Date
âàøåãî êîìïüþòåðà. Òî æå, ÷òî VBA-ïðåîáðàçîâàíèå ïî
óìîë÷àíèþ ïîñëåäîâàòåëüíûõ äàò â ñòðîêè.
Ôîðìàòèðóåò â ïîñëåäîâàòåëüíîé äàòå òîëüêî ÷àñòü, ñîäåðæàùóþ
Long Date
äàòó, èñïîëüçóÿ óñòàíîâêè êîìïüþòåðà äëÿ Long-ôîðìàòà äàòû.
Ôîðìàòèðóåò â ïîñëåäîâàòåëüíîé äàòå òîëüêî ÷àñòü, ñîäåðæàùóþ
Medium Date äàòó, èñïîëüçóÿ óñòàíîâêè êîìïüþòåðà äëÿ Medium-ôîðìàòà äàòû
Èìåíîâàííûé
Äåéñòâèå
ôîðìàò
Ôîðìàòèðóåò â ïîñëåäîâàòåëüíîé äàòå òîëüêî ÷àñòü, ñîäåðæàùóþ
Medium Time âðåìÿ, èñïîëüçóÿ óñòàíîâêè êîìïüþòåðà äëÿ Medium-ôîðìàòà
âðåìåíè.
Ôîðìàòèðóåò â ïîñëåäîâàòåëüíîé äàòå òîëüêî ÷àñòü, ñîäåðæàùóþ
Short Time âðåìÿ, èñïîëüçóÿ óñòàíîâêè êîìïüþòåðà äëÿ Short-ôîðìàòà
âðåìåíè.
Ôîðìàòèðóåò ÷èñëî â ñòðîêó áåç êàêèõ-ëèáî îñîáûõ ñèìâîëîâ.
General Number
Äåéñòâèå òàêîå æå, êàê VBA-ïðåîáðàçîâàíèå ïî óìîë÷àíèþ ÷èñåë
â ñòðîêè.
Ôîðìàòèðóåò ÷èñëî ñ ñèìâîëîì äåíåæíîé åäèíèöû, ðàçäåëèòåëåì
òûñÿ÷ è òîëüêî äâóìÿ äåñÿòè÷íûìè ðàçðÿäàìè. Ñèìâîë äåíåæíîé
Currency
åäèíèöû è äåñÿòè÷íûé ðàçäåëèòåëü îïðåäåëÿþòñÿ ëîêàëüíûìè
óñòàíîâêàìè Windows.
Ôîðìàòèðóåò ÷èñëî òàê, ÷òîáû âñåãäà áûëà, ïî êðàéíåé ìåðå,
Fixed îäíà öèôðà ïåðåä äåñÿòè÷íûì ðàçäåëèòåëåì è, ïî êðàéíåé ìåðå,
äâå öèôðû ïîñëå íåãî.
Ôîðìàòèðóåò ÷èñëî ñ ðàçäåëèòåëåì òûñÿ÷ òàê, ÷òîáû áûëà, ïî
Standard êðàéíåé ìåðå, îäíà öèôðà ïåðåä äåñÿòè÷íûì ðàçäåëèòåëåì è, ïî
êðàéíåé ìåðå, äâå öèôðû ïîñëå íåãî.
Ôîðìàòèðóåò ÷èñëî êàê ïðîöåíòíîå îòíîøåíèå, óìíîæàÿ åãî íà
Percent 100 è äîáàâëÿÿ ñèìâîë ïðîöåíòà. Íàïðèìåð, 0.21 âîçâðàùàåòñÿ
êàê 21%.
Scientific Ôîðìàòèðóåò ÷èñëî â îáû÷íûé ýêñïîíåíöèàëüíûé ôîðìàò.
Èñïîëüçîâàíèå ýòîãî ôîðìàòà ïðèâîäèò ê òîìó, ÷òî ôóíêöèÿ
Format âîçâðàùàåò ñòðîêó «Äà» («Yes»), åñëè ôîðìàòèðóåìîå
Yes/No ÷èñëî íåíóëåâîå, è âîçâðàùàåò ñòðîêó «Íåò» («No») äëÿ ëþáîãî
íóëåâîãî çíà÷åíèÿ. Ýòîò èìåíîâàííûé ôîðìàò íàèáîëåå ÷àñòî
èñïîëüçóåòñÿ ñî çíà÷åíèÿìè òèïà Boolean.
Èñïîëüçîâàíèå ýòîãî ôîðìàòà ïðèâîäèò ê òîìó, ÷òî ôóíêöèÿ
Format âîçâðàùàåò ñòðîêó «Èñòèíà» («True»), åñëè
True/False ôîðìàòèðóåìîå ÷èñëî íåíóëåâîå, è ñòðîêó «Ëîæü» («False») äëÿ
ëþáîãî íóëåâîãî çíà÷åíèÿ. Ýòîò èìåíîâàííûé ôîðìàò íàèáîëåå
ïîëåçåí ñî çíà÷åíèÿìè òèïà Boolean.
Èñïîëüçîâàíèå ýòîãî ôîðìàòà ïðèâîäèò ê òîìó, ÷òî ôóíêöèÿ
Format âîçâðàùàåò ñòðîêó «Âêë» («On»), åñëè ôîðìàòèðóåìîå
On/Off
÷èñëî íåíóëåâîå, è ñòðîêó «Âûêë» («Off») äëÿ ëþáîãî íóëåâîãî
çíà÷åíèÿ. Íàèáîëåå ÷àñòî èñïîëüçóåòñÿ ñî çíà÷åíèÿìè Boolean.
Ôîðìàòû long, medium è short date è time ìîæíî èçìåíÿòü ïîñðåäñòâîì Ïà-
íåëè óïðàâëåíèÿ (Windows Control Panel). Ìîæíî òàêæå èçìåíÿòü ñèìâîëû, èñ-
ïîëüçóåìûå äëÿ ðàçäåëèòåëÿ òûñÿ÷ è äåñÿòè÷íîãî ðàçäåëèòåëÿ (íà Ïàíåëè
óïðàâëåíèÿ).
Åñëè âàì íåîáõîäèìî ñîçäàâàòü ïîëüçîâàòåëüñêèå ôîðìàòû äëÿ ÷èñåë, äàò
èëè âðåìåíè, íóæíî ñîçäàòü ñòðîêó, ñîäåðæàùóþ ñèìâîëû-çàïîëíèòåëè, äëÿ
çàäàíèÿ îáðàçà ôîðìàòèðîâàíèÿ, êîòîðûé äîëæíà áóäåò èñïîëüçîâàòü ôóíê-
öèÿ Format ïðè ïðåîáðàçîâàíèè çíà÷åíèé â ñòðîêó.  òàáë. 4.8 ïðèâåäåíû
170 Ãëàâà 4
Ñèìâîë-
Äåéñòâèå
çàïîëíèòåëü
Öèôðîâîé ñèìâîë, îòîáðàæàåò öèôðó, åñëè òàêîâàÿ íàõîäèòñÿ â ýòîé
ïîçèöèè, èëè 0, åñëè — íåò. Ìîæíî èñïîëüçîâàòü ñèìâîë 0 äëÿ
0
îòîáðàæåíèÿ íà÷àëüíûõ íóëåé äëÿ öåëûõ ÷èñåë è êîíå÷íûõ íóëåé â
äåñÿòè÷íûõ äðîáÿõ; 00000.000 îòîáðàæàåò 00124,500.
Öèôðîâîé ñèìâîë, îòîáðàæàåò öèôðó, åñëè òàêîâàÿ íàõîäèòñÿ â ýòîé
ïîçèöèè, èíà÷å — íå îòîáðàæàåò íè÷åãî. Ñèìâîë-çàïîëíèòåëü #
#
ýêâèâàëåíòåí 0, êðîìå òîãî, ÷òî íà÷àëüíûå è êîíå÷íûå íóëè íå
îòîáðàæàþòñÿ; #####.### îòîáðàæàåò 1234,5.
$ Îòîáðàæàåò çíàê äîëëàðà; $###,###.00 îòîáðàæàåò $1 234,50.
Äåñÿòè÷íûé ñèìâîë-çàïîëíèòåëü, îòîáðàæàåò äåñÿòè÷íóþ òî÷êó â
. îáîçíà÷åííîé ïîçèöèè â ñòðîêå ñèìâîëîâ-çàïîëíèòåëåé 0; #.##.##
îòîáðàæàåò 1234,5
Ñèìâîë ïðîöåíòà, óìíîæàåò çíà÷åíèå íà 100 è äîáàâëÿåò çíàê
ïðîöåíòà â ïîçèöèþ, óêàçàííóþ ñèìâîëàìè-çàïîëíèòåëÿìè 0;
%
#0.00% îòîáðàæàåò ÷èñëî 0.12345 êàê 12,35% (12,345 îêðóãëÿåòñÿ
äî 12,35).
Ðàçäåëèòåëü òûñÿ÷, äîáàâëÿåò çàïÿòûå êàê ðàçäåëèòåëè òûñÿ÷ â
, (çàïÿòàÿ) ñòðîêàõ ñèìâîëîâ-çàïîëíèòåëåé 0 è #. ###,###,###.00 îòîáðàæàåò
1 234,50.
Îòîáðàæàåò çíà÷åíèÿ â ýêñïîíåíöèàëüíîì ôîðìàòå ñî çíàêîì
E– e– ïîðÿäêà òîëüêî äëÿ îòðèöàòåëüíûõ çíà÷åíèé; #.####E–00
îòîáðàæàåò 1,2345Å03; 0,12345 îòîáðàæàåòñÿ êàê 1,2345Å–01.
Îòîáðàæàåò çíà÷åíèÿ â ýêñïîíåíöèàëüíîì ôîðìàòå ñî çíàêîì
E+ e+ ïîðÿäêà äëÿ ïîëîæèòåëüíûõ è îòðèöàòåëüíûõ çíà÷åíèé;
#.####E+00 îòîáðàæàåò 1,2345Å+03.
Îòäåëÿåò äåíü, ìåñÿö è ãîä äëÿ ôîðìàòèðîâàíèÿ çíà÷åíèé äàò.
/ mm/dd/yy îòîáðàæàåò 06/06/97. Ñèìâîëû «/» ìîæíî çàìåíÿòü íà
ñèìâîëû äåôèñà äëÿ îòîáðàæåíèÿ êàê 06-06-97.
Óêàçûâàåò, êàê îòîáðàæàòü ìåñÿöû â äàòàõ; m îòîáðàæàåò 2, mm —
m
02, mmm — ôåâ, mmmm — Ôåâðàëü.
Óêàçûâàåò, êàê îòîáðàæàòü äíè â äàòàõ; d îòîáðàæàåò 1, dd
d
îòîáðàæàåò 01, ddd — Ïò, dddd — ïÿòíèöà.
y Îòîáðàæàåò äåíü ãîäà êàê ÷èñëî îò 1 äî 366.
Óêàçûâàåò, êàê îòîáðàæàòü ãîäû â äàòàõ; yy îòîáðàæàåò 99, yyyy —
yy
1999.
q Îòîáðàæàåò êâàðòàë ãîäà êàê ÷èñëî îò 1 äî 4.
w Îòîáðàæàåò äåíü íåäåëè êàê ÷èñëî (1 — ýòî âîñêðåñåíüå).
Ôóíêöèè â Visual Basic 171
Ñèìâîë-
Äåéñòâèå
çàïîëíèòåëü
ww Îòîáðàæàåò íåäåëþ ãîäà êàê ÷èñëî îò 1 äî 54.
Îòäåëÿåò ÷àñû, ìèíóòû è ñåêóíäû â çíà÷åíèÿõ ôîðìàòà âðåìåíè;
: (äâîåòî÷èå)
hh:mm:ss îòîáðàæàåò 02:02:02.
Óêàçûâàåò, êàê îòîáðàæàòü ÷àñû; äëÿ çíà÷åíèÿ âðåìåíè 02:01:38 h
h
îòîáðàæàåò 2, hh îòîáðàæàåò 02.
Ìèíóòíûé ñèìâîë-çàïîëíèòåëü äëÿ âðåìåíè; äëÿ çíà÷åíèÿ âðåìåíè
n
02:01:08 n îòîáðàæàåò 1, à nn îòîáðàæàåò 01.
Ñåêóíäíûé ñèìâîë-çàïîëíèòåëü äëÿ âðåìåíè; äëÿ çíà÷åíèÿ âðåìåíè
s
02:01:08 s îòîáðàæàåò 8, è ss îòîáðàæàåò 08.
Îòîáðàæàåò âðåìÿ â 12-÷àñîâîì ôîðìàòå âðåìåíè ñ äîáàâëåííûìè
AM/PM AM è PM; h:nn AM/PM îòîáðàæàåò 4:00 PM. Àëüòåðíàòèâíûå
ôîðìàòû âêëþ÷àþò am/pm, A/P è a/p.
Ñèìâîëüíûé çàïîëíèòåëü, îòîáðàæàåò ïðîáåë, åñëè íå èìååòñÿ
ñîîòâåòñòâóþùåãî ñèìâîëà â ôîðìàòèðóåìîé ñòðîêå. @@@@
@
îòîáðàæàåò ñòðîêó Hi ñ äâóìÿ íà÷àëüíûìè ïðîáåëàìè. (ïîðÿäîê
çàïîëíåíèÿ ïî óìîë÷àíèþ — ñïðàâà íàëåâî).
< Îòîáðàæàåò âñå ñèìâîëû â âåðõíåì ðåãèñòðå.
> Îòîáðàæàåò âñå ñèìâîëû â íèæíåì ðåãèñòðå.
Ôóíêöèÿ Íàçíà÷åíèå
Âîçâðàùàåò âûðàæåíèå, îòôîðìàòèðîâàííîå êàê
äåíåæíîå (âàëþòíîå) âûðàæåíèå ñ èñïîëüçîâàíèåì
FormatCurrency (E[, N [, I [,U
çíà÷åíèÿ, çàäàííîãî íà âêëàäêå Äåíåæíàÿ åäèíèöà
[, G]]]])
îêíà Ñâîéñòâà: ßçûê è ñòàíäàðòû, äîñòóïíîãî èç
Ïàíåëè óïðàâëåíèÿ.
Âîçâðàùàåò âûðàæåíèå, îòôîðìàòèðîâàííîå, êàê
FormatDateTime (D[,N])
äàòà èëè âðåìÿ.
FormatNumber (E [, N [, I [, U Âîçâðàùàåò âûðàæåíèå, îòôîðìàòèðîâàííîå, êàê
[, G]]]]) ÷èñëî.
Âîçâðàùàåò âûðàæåíèå, îòôîðìàòèðîâàííîå, êàê
FormatPercent (E [, N [, I [, U
ïðîöåíòíîå îòíîøåíèå (óìíîæåííîå íà 100) ñ
[, G]]]])
êîíå÷íûì çíàêîì ïðîöåíòà ( %).
1:Sub MyMacro()
2:'Ïðèìåð èñïîëüçîâàíèÿ ôóíêöèè FormatCurrency
3: Dim MyDouble1 As Double, MyDouble2 As Double
4: MyDouble1 = -22323.123
5: MyDouble2 = 0.000123
6:
7: MsgBox FormatCurrency(MyDouble1, 7)
8:
9: MsgBox FormatCurrency(MyDouble2, 7, vbTrue)
10: MsgBox FormatCurrency(MyDouble2, 7, vbFalse)
11:
12: MsgBox FormatCurrency(MyDouble1, 7, vbTrue, vbTrue)
13: MsgBox FormatCurrency(MyDouble1, 7, vbTrue, vbFalse)
14: MsgBox FormatCurrency(MyDouble1, 7, vbTrue, vbTrue, vbTrue)
15:
16:End Sub
Ðèñ. 4.8
Ïðèìåð èñïîëüçîâàíèÿ ôóíêöèè
FormatCurrency
1:Sub MyMacro()
2:'Ïðèìåð èñïîëüçîâàíèÿ ôóíêöèè FormatDateTime
3: Dim MyDate As Date
4: MyDate = Now()
5:
6: MsgBox FormatDateTime(MyDate, vbGeneralDate)
7: MsgBox FormatDateTime(MyDate, vbLongDate)
8: MsgBox FormatDateTime(MyDate, vbShortDate)
9: MsgBox FormatDateTime(MyDate, vbLongTime)
10: MsgBox FormatDateTime(MyDate, vbShortTime)
11:
12:End Sub
Ñèíòàêñèñ ôóíêöèè FormatNumber ñëåäóþùèé (ïðèâåäåí èç ñïðàâî÷íîé
ñèñòåìû VBA):
Ñèíòàêñèñ
FormatNumber(Expression[,NumDigitsAfterDecimal [,IncludeLeadingDigit
[,UseParensForNegativeNumbers [,GroupDigits]]]])
Ðèñ. 4.10
Ïðèìåð èñïîëüçîâàíèÿ ôóíêöèè
FormatNumber
176 Ãëàâà 4
ðàáî÷èõ ëèñòîâ. Äðóãèå host-ïðèëîæåíèÿ VBA, òàêèå êàê Access, òàêæå ïîçâî-
ëÿþò ïðèìåíÿòü ñîçäàâàåìûå âàìè VBA-ôóíêöèè äëÿ ðàñøèðåíèÿ è óëó÷øå-
íèÿ âñòðîåííîé êîëëåêöèè ôóíêöèé.
Ñ «òî÷êè çðåíèÿ» Excel èñïîëüçóåìûå èì ôóíêöèè-ïðîöåäóðû VBA ÿâëÿ-
þòñÿ îïðåäåëåííûìè ïîëüçîâàòåëåì ôóíêöèÿìè (user-defined functions). Ýòîò
òåðìèí ïîçâîëÿåò îòëè÷àòü ôóíêöèè, íàïèñàííûå ïîëüçîâàòåëåì, îò âñòðîåí-
íûõ ôóíêöèé Excel. Õîòÿ âñå îïðåäåëåííûå ïîëüçîâàòåëåì ôóíêöèè ÿâëÿþòñÿ
òàêæå ôóíêöèÿìè-ïðîöåäóðàìè, íå âñå ôóíêöèè-ïðîöåäóðû îòâå÷àþò òðåáî-
âàíèÿì îïðåäåëåííîé ïîëüçîâàòåëåì ôóíêöèè.
Ôóíêöèÿ-ïðîöåäóðà — ýòî íàèáîëåå îáùèé òåðìèí äëÿ ñîçäàâàåìûõ ïîëü-
çîâàòåëåì ôóíêöèé; òåðìèí «îïðåäåëåííàÿ ïîëüçîâàòåëåì ôóíêöèÿ» îïèñûâà-
åò îïðåäåëåííûé òèï ôóíêöèè-ïðîöåäóðû, êîòîðûé ìîæåò èñïîëüçîâàòü Ex-
cel. Íåëüçÿ èñïîëüçîâàòü ôóíêöèþ-ïðîöåäóðó, êîòîðàÿ íå îòâå÷àåò òðåáîâàíè-
ÿì îïðåäåëåííîé ïîëüçîâàòåëåì ôóíêöèè â ôîðìóëàõ ðàáî÷èõ ëèñòîâ Excel;
ìîæíî èñïîëüçîâàòü òàêèå ôóíêöèè òîëüêî â îïåðàòîðàõ âàøèõ ñîáñòâåííûõ
ïðîöåäóð. Äàëåå â ýòîé ãëàâå áóäåò èñïîëüçîâàòüñÿ òåðìèí «ôóíêöèÿ» âìåñòî
«ôóíêöèÿ-ïðîöåäóðà», êîãäà áóäåò ïîíÿòíî, î ÷åì èäåò ðå÷ü.
Äëÿ çàïèñè ôóíêöèè-ïðîöåäóðû íåëüçÿ èñïîëüçîâàòü ìàêðîðåêîðäåð, õîòÿ
ìîæíî ðåäàêòèðîâàòü çàïèñàííûé ðåêîðäåðîì ìàêðîñ è ïðåâðàùàòü åãî â
ôóíêöèþ-ïðîöåäóðó.
Íàïèñàíèå ôóíêöèè-ïðîöåäóðû
Ôóíêöèè-ïðîöåäóðû î÷åíü ïîõîæè íà ïðîöåäóðû VBA, êîòîðûå âû óæå
óìååòå çàïèñûâàòü. Îñíîâíîå ðàçëè÷èå ìåæäó ôóíêöèåé-ïðîöåäóðîé è äðóãè-
ìè ïðîöåäóðàìè, ïîìèìî òîãî, ÷òî ôóíêöèè âîçâðàùàþò çíà÷åíèå, à ïðîöåäó-
ðû — íåò, ñîñòîèò â òîì, ÷òî âìåñòî êëþ÷åâûõ ñëîâ Sub è End Sub, ñ êîòîðûìè
âû óæå çíàêîìû, â ôóíêöèè-ïðîöåäóðå èñïîëüçóþòñÿ êëþ÷åâûå ñëîâà Func-
tion è End Function.
Ôóíêöèÿ-ïðîöåäóðà èìååò ñëåäóþùèé ñèíòàêñèñ:
Cèíòàêñèñ
Function Name([Arglist]) [As Type]
' VBA Statements
[Name = expression]
End Function
Êàæäàÿ ôóíêöèÿ-ïðîöåäóðà íà÷èíàåòñÿ êëþ÷åâûì ñëîâîì Function, çà êîòîðûì
ñëåäóåò èìÿ ôóíêöèè, Name ïðåäñòàâëÿåò èìÿ, âûáðàííîå äëÿ ýòîé ôóíêöèè. Ïðè
íàïèñàíèè èìåí ôóíêöèé íåîáõîäèìî ñîáëþäàòü òå æå ïðàâèëà, ÷òî è ïðè íàïèñà-
íèè èìåí äðóãèõ èäåíòèôèêàòîðîâ â VBA: îíè äîëæíû íà÷èíàòüñÿ ñ áóêâû, íå ìî-
ãóò ñîäåðæàòü ïðîáåëîâ èëè êàêèõ-ëèáî ñèìâîëîâ àðèôìåòè÷åñêèõ, ëîãè÷åñêèõ
îïåðàòîðîâ èëè îïåðàòîðîâ îòíîøåíèÿ è íå ìîãóò äóáëèðîâàòü êëþ÷åâûå ñëîâà
VBA.
Ïîñëå èìåíè ôóíêöèè ñëåäóåò ñïèñîê åå àðãóìåíòîâ, êîòîðûé çàêëþ÷àåòñÿ â êðóã-
ëûå ñêîáêè. Çäåñü Arglist ïðåäñòàâëÿåò ñïèñîê àðãóìåíòîâ ôóíêöèè è ÿâëÿåòñÿ íå-
îáÿçàòåëüíûì.
Type — ëþáîé òèï âîçâðàùàåìîãî çíà÷åíèÿ ôóíêöèè. Åñëè òîëüêî íå îïðåäåëÿåòñÿ
èíà÷å, ðåçóëüòàò, êîòîðûé âîçâðàùàåò ôóíêöèÿ-ïðîöåäóðà, èìååò òèï Variant.
Êàê âû óçíàëè ðàíåå, çíà÷åíèÿ, ñîõðàíÿåìûå èëè îáðàáàòûâàåìûå êàê òèï
Variant, çàíèìàþò áîëüøå ïàìÿòè, ÷åì ëþáîé äðóãîé òèï äàííûõ, è íà èõ îáðà-
áîòêó óõîäèò áîëüøå âðåìåíè.
180 Ãëàâà 4
âòîðÿòü çàïèñü âëîæåííîãî âûçîâà ôóíêöèè. Ëèñòèíã 4.9 ïîêàçûâàåò êàê ðàç
òàêóþ ïðîñòóþ ôóíêöèþ-ïðîöåäóðó LenTrim, êîòîðàÿ âîçâðàùàåò äëèíó ñòðî-
êè, èñêëþ÷àÿ íà÷àëüíûå è êîíå÷íûå ïðîáåëû.
öèþ, ìîæíî èñïîëüçîâàòü Object Browser äëÿ îïðåäåëåíèÿ òîãî, êàêèå èç âà-
øèõ ôóíêöèé-ïðîöåäóð äîñòóïíû â äàííûé ìîìåíò, è äëÿ áûñòðîãî îòîáðàæå-
íèÿ èñõîäíîãî VBA-êîäà âàøåé ôóíêöèè.
×òîáû èñïîëüçîâàòü Object Browser, çàïóñòèòå åãî, êàê âû óæå íàó÷èëèñü ýòî
äåëàòü: âûáåðèòå êîìàíäó View | Object Browser (Âèä | Ïðîñìîòð îáúåêòîâ) èëè
ùåëêíèòå êíîïêó Object Browser íà ïàíåëè Ðåäàêòîðà VB äëÿ îòîáðàæåíèÿ îêíà
Object Browser.
Âû óæå çíàåòå, êàê èñïîëüçîâàòü Object Browser äëÿ îòîáðàæåíèÿ äîñòóïíûõ
ôóíêöèé VBA èëè ôóíêöèé host-ïðèëîæåíèé. Ðàñêðûâàþùèéñÿ ñïèñîê
Project/Library (Ïðîåêò/Áèáëèîòåêà) îòîáðàæàåò âñå îòêðûòûå â äàííûé ìîìåíò
ôàéëû ïðèëîæåíèÿ, êàê è âñåãäà ïðèñóòñòâóþùóþ îïöèþ VBA. Äëÿ îòîáðàæå-
íèÿ ïîëüçîâàòåëüñêèõ ôóíêöèé (è äðóãèõ ïðîöåäóð) â îïðåäåëåííîì ïðîåêòå
VBA (äîêóìåíòå Word, ðàáî÷åé êíèãå Excel èëè êàêîì-ëèáî äðóãîì äîêóìåíòå
host-ïðèëîæåíèÿ) âûïîëíÿéòå ñëåäóþùèå øàãè:
Ôóíêöèè â Visual Basic 185
Ìîæíî òàêæå êîïèðîâàòü òåêñò èç îêíà Object Browser äëÿ ñâîèõ ôóíêöèé è
ïðîöåäóð â áóôåð Windows (Clipboard) òàê æå, êàê è â ñëó÷àå ñî âñòðîåííûìè
ôóíêöèÿìè VBA.
Ïîìíèòå, ÷òî êíîïêà Show â îêíå Object Browser âêëþ÷àåòñÿ, òîëüêî åñëè èñ-
õîäíûé êîä äëÿ âûáðàííîé ôóíêöèè èëè äðóãîé ïðîöåäóðû äîñòóïåí.
Íå ïûòàéòåñü èñïîëüçîâàòü äèàëîãîâîå îêíî Ìàêðîñ (îòêðûâàåìîå ñ
ïîìîùüþ êîìàíäû Ðàçðàáîò÷èê | Ìàêðîñû) äëÿ âûïîëíåíèÿ ôóíêöèè-ïðîöåäó-
ðû. VBA «îæèäàåò», ÷òî ôóíêöèÿ-ïðîöåäóðà ïðåäíàçíà÷åíà äëÿ òîãî, ÷òîáû
âîçâðàùàòü çíà÷åíèå, ïîýòîìó íåò ñìûñëà òîëüêî â âûïîëíåíèè ôóíêöèè. Ïî
ýòîé ïðè÷èíå VBA íå ïåðå÷èñëÿåò ôóíêöèè-ïðîöåäóðû â ñïèñêå Èìÿ ìàêðîñà
â äèàëîãîâîì îêíå Ìàêðîñ. Ýòî äåìîíñòðèðóåòñÿ íà ðèñ. 4.13, ãäå â ñïèñêå
ìàêðîñîâ èìååòñÿ òîëüêî ïðîöåäóðà (ïðîãðàììà) Test_LenTrim.
186 Ãëàâà 4
Ðèñ. 4.13
VBA íå ïåðå÷èñëÿåò ôóíêöèè-ïðîöåäóðû
â ñïèñêå Èìÿ ìàåðîñà
îêíà Ìàêðîñ
Ðèñ. 4.14
Ââîäèòå ïîëåçíûå îïèñàíèÿ
äëÿ ôóíêöèé è ïðîöåäóð â äèàëîãîâîå
îêíî Member Options
Ðèñ. 4.16
Òàáëèöà
ñ èíôîðìàöèåé
î òîâàðàõ (êîä,
íàèìåíîâàíèå,
öåíû: â $ è ðóá.)
Ðèñ. 4.17
Ôóíêöèè CENA
è new_name
â ìîäóëå
ïðîåêòà äëÿ
ôîðìàòèðîâàíèÿ
äàííûõ â âèäå
«öåííèêîâ»
Ðèñ. 4.18
Íåîáõîäèìî
çàïîëíèòü òîëüêî
ïåðâûå íåñêîëüêî
ñòðîê ñ
èñïîëüçîâàíèåì
ôóíêöèé CENA
è new_name äëÿ
ôîðìàòèðîâàíèÿ
äàííûõ â âèäå
«öåííèêîâ»
Ðèñ. 4.19
Çàäà÷à
ôîðìàòèðîâàíèÿ
äàííûõ â âèäå
«öåííèêîâ»
ðåøåíà
Èçìåíåíèå
5
ïîðÿäêà âûïîëíåíèÿ
îïåðàòîðîâ â VBA
Äî ñèõ ïîð ìû èìåëè äåëî ñ ïðîöåäóðàìè è ôóíêöèÿìè, êîòîðûå VBA âû-
ïîëíÿåò òîëüêî â ëèíåéíîì ïîðÿäêå. Âî ìíîãîì òàê æå VBA âûïîëíÿåò çàïè-
ñàííûé ðåêîðäåðîì ìàêðîñ: VBA íà÷èíàåò âûïîëíåíèå êîäà ñ ïåðâîãî îïåðà-
òîðà ïîñëå ñòðîêè îáúÿâëåíèÿ ïðîöåäóðû èëè ôóíêöèè è ïðîäîëæàåò âûïîë-
íÿòü êàæäûé îïåðàòîð ïîñòðî÷íî äî òåõ ïîð, ïîêà íå áóäåò äîñòèãíóò îïåðàòîð
End Sub èëè End Function, îòìå÷àþùèé êîíåö îïðåäåëåíèÿ ýòîé ïðîöåäóðû
èëè ôóíêöèè, èëè äî òåõ ïîð, ïîêà íå âîçíèêíåò runtime-îøèáêà (íà ýòî, î÷å-
âèäíî, ïîëàãàòüñÿ íå ñòîèò).
Ïîäîáíûå ïðîöåäóðû è ôóíêöèè, õîòÿ è ìîãóò âûïîëíÿòü î÷åíü ñëîæíûå
çàäà÷è, íî íå ìîãóò ìåíÿòü ïîðÿäîê âûïîëíåíèÿ îïåðàòîðîâ-èíñòðóêöèé ïðè
îïðåäåëåííûõ îáñòîÿòåëüñòâàõ. Íà ñàìîì äåëå, î÷åíü ÷àñòî âñòðå÷àþòñÿ òàêèå
ñèòóàöèè, êîãäà íåîáõîäèìî, ÷òîáû ïðîöåäóðû èëè ôóíêöèè âûïîëíÿëè ðàç-
ëè÷íûå äåéñòâèÿ ïðè ðàçíûõ óñëîâèÿõ. Íàïðèìåð, åñëè âû ïèøèòå ïðîöåäó-
ðó, êîòîðàÿ ïîëó÷àåò èìÿ ðàáî÷åé êíèãè îò ïîëüçîâàòåëÿ, à çàòåì îòêðûâàåò
ýòó ðàáî÷óþ êíèãó, ìîæåò ïîíàäîáèòüñÿ, ÷òîáû âàøà ïðîöåäóðà èìåëà âîç-
ìîæíîñòü ñîçäàòü ðàáî÷óþ êíèãó, åñëè êíèãà åùå íå ñóùåñòâóåò. Â ïîäîáíîé
ñèòóàöèè íåîáõîäèìî, ÷òîáû ïðîöåäóðà âûïîëíÿëà òå èëè èíûå îïåðàòîðû,
ïðåäîñòàâëÿÿ ïîëüçîâàòåëþ âîçìîæíîñòü ñîçäàòü ðàáî÷óþ êíèãó èëè
îòêàçàòüñÿ îò ïðîäîëæåíèÿ âûïîëíåíèÿ êîäà, åñëè, íàïðèìåð, ïîëüçîâàòåëü
ïðîñòî åùå íå ïåðåçàïèñàë íåîáõîäèìóþ åìó ðàáî÷óþ êíèãó ñ ïåðåíîñíîãî
íàêîïèòåëÿ.
Êîìàíäû, èçìåíÿþùèå ïîðÿäîê âûïîëíåíèÿ îïåðàòîðîâ, ÷àñòî èñïîëüçóþò
îöåíêó êîíêðåòíûõ ýëåìåíòîâ äàííûõ äëÿ âûáîðà ðàçëè÷íûõ ïðåäîïðåäåëåííûõ
äåéñòâèé. Íàïðèìåð, ìîæíî íàïèñàòü ïðîöåäóðó, ïðîâåðÿþùóþ, âñå ëè ÷èñëà
ñòîëáöà â ðàáî÷åì ëèñòå íàõîäÿòñÿ â äèàïàçîíå îò 1 äî 10. Ýòà ïðîöåäóðà ìîæåò
ïðîâåðÿòü êàæäûé ýëåìåíò ââîäà â ñòîëáöå îòäåëüíî è âûïîëíÿòü íåêîòîðûé íà-
áîð îïåðàòîðîâ, êîãäà âñòðå÷àåòñÿ ýëåìåíò ââîäà âíå óêàçàííîãî äèàïàçîíà.
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ íå âñåãäà ñâÿçàíî ñ ðåàêöèåé
íà âîçíèêàþùèå â ïðîöåññå ðàáîòû ïðîãðàììû ïðîáëåìû. Åñëè âàì íåîáõîäè-
ìî, ÷òîáû ïîëüçîâàòåëü ïðîöåäóðû äåëàë íåêîòîðûé âûáîð ïî ïîâîäó ïîñëå-
äóþùåãî äåéñòâèÿ ïðîöåäóðû, ìîæíî èñïîëüçîâàòü ôóíêöèþ InputBox äëÿ
ïîëó÷åíèÿ òåêñòîâîãî ââîäà îò ïîëüçîâàòåëÿ èëè èñïîëüçîâàòü ôóíêöèþ
MsgBox, äàâàÿ âîçìîæíîñòü ïîëüçîâàòåëþ äåëàòü âûáîð ùåë÷êîì íà êîìàíä-
194 Ãëàâà 5
Ïðîñòîé âûáîð
Ïðîñòåéøèìè VBA-îïåðàòîðàìè èçìåíåíèÿ ïîðÿäêà âûïîëíåíèÿ êîäà ÿâ-
ëÿþòñÿ îïåðàòîðû If…Then è If…Then…Else. Îïåðàòîð If…Then ïîçâîëÿåò
VBA âûáðàòü åäèíñòâåííóþ àëüòåðíàòèâíóþ âåòâü âûïîëíåíèÿ ïðîöåäóðû.
Ñâÿçàííûé ñ íèì îïåðàòîð If…Then…Else äàåò âîçìîæíîñòü VBA âûáèðàòü èç
äâóõ àëüòåðíàòèâíûõ âåòâåé êîäà ïðîöåäóðû íà îñíîâå îöåíêè òîãî, ÿâëÿåòñÿ
ëè óêàçàííîå óñëîâèå ðàâíûì True.
Îïåðàòîð If…Then ïîçâîëÿåò âûáðàòü åäèíñòâåííóþ àëüòåðíàòèâíóþ âåòâü
êîäà â ïðîöåäóðå èëè ôóíêöèè.
Îïåðàòîð If…Then èìååò äâå ðàçëè÷íûå ôîðìû ñèíòàêñèñà. Ïðîñòàÿ ôîð-
ìà — ýòî îäíîñòðî÷íûé îïåðàòîð If…Then:
Ñèíòàêñèñ
If Condition Then Statements
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 195
12: Title:=lTitle, _
13: Default:=lDflt))
14:
15: 'ïðîâåðèòü íàëè÷èå ñòðîêè ââîäà
16: If Len(lVar) = 0 Then
17: MsgBox "Íàèìåíîâàíèå íå ââåäåíî!"
18: GetBookName4 = lDflt 'èìÿ ïî óìîë÷àíèþ
19: Else
20: GetBookName4 = lVar
21: End If
22:
23: End Function 'GetBookName
Ñëîæíûé âûáîð
Âû óçíàëè, êàê ñîçäàâàòü îïåðàòîðû ïåðåõîäà, âûáèðàþùèå îäíó èëè îäíó
èç äâóõ àëüòåðíàòèâíûõ âåòâåé êîäà ïðîöåäóðû. Îäíàêî ÷àñòî áûâàåò íåîáõî-
äèìî âûïîëíèòü áîëåå ñëîæíûé âûáîð â ïðîöåäóðàõ, âûáèðàÿ ìåæäó òðåìÿ,
÷åòûðüìÿ è áîëåå âåòâÿìè.
1 Sub EvalDiscount()
2 'Îïðåäåëåíèå ñêèäêè (â %) â çàâèñèìîñòè îò
3 'êîëè÷åñòâà ïðîäàâàåìîãî òîâàðà
4 Dim lStr As String
5 Dim IntNum
6 IntNum = Application.InputBox( _
7 prompt:="Ââåäèòå êîëè÷åñòâî òîâàðà", _
8 Title:="Ïðîöåäóðà EvalDiscount", _
9 Type:=1)
10 If Not (TypeName(IntNum) = "Boolean") Then
11
12 If IntNum > 1000 Then
13 lStr = "10"
14 Else
15 If IntNum > 500 Then
16 lStr = "6"
17 Else
18 lStr = "0"
19 End If
20 End If
21 MsgBox "Ñêèäêà " & lStr & "%"
22 Else
23 MsgBox "Êîëè÷åñòâî íå óêàçàíî"
24 End If
25
26 End Sub
Íàïèñàííàÿ òàê ïðîöåäóðà áóäåò ðàáîòàòü òîëüêî â Excel, òàê êàê îíà èñ-
ïîëüçóåò ìåòîä Application.InputBox. Ýòîò ìåòîä ïðèìåíåí äëÿ òîãî, ÷òîáû
íå äàòü ïîëüçîâàòåëþ âî âðåìÿ ðàáîòû ôóíêöèè InputBox ââåñòè ÷òî-ëèáî,
êðîìå ÷èñëà. VBA îòîáðàæàåò ñîîáùåíèå îá îøèáêå, åñëè ïîëüçîâàòåëü ââîäèò
íå ÷èñëî (ðèñ.5.1), è îæèäàåò äî òåõ ïîð, ïîêà ïîëüçîâàòåëü íå ââåäåò ÷èñëåí-
íîå çíà÷åíèå èëè íå âûáåðåò êíîïêó Cancel. Åñëè ïîëüçîâàòåëü, íå ââîäÿ äàí-
íûå â îêíå ôóíêöèè Application.InputBox, ùåëêíåò íà êíîïêå ÎÊ, VBA
òàêæå âûäàñò ñîîáùåíèå îá îøèáêå (ðèñ.5.2).
Ðèñ. 5.1
Ñîîáùåíèå Excel ïðè íåïðàâèëüíîì ââîäå â îêíå ôóíêöèè
Application.InputBox
Ðèñ. 5.2
Ñîîáùåíèå Excel ïðè
ùåë÷êå íà êíîïêå ÎÊ áåç ââîäà äàííûõ â îêíå ôóíêöèè Application.InputBox
Èñïîëüçîâàíèå If…Then…ElseIf
VBA ïðåäîñòàâëÿåò ñîêðàùåííóþ âåðñèþ îïåðàòîðà If…Then…Else, ÿâëÿþ-
ùóþñÿ ñæàòûì ýêâèâàëåíòîì âëîæåííûõ îïåðàòîðîâ If…Then…Else, ïîêàçàí-
íûõ â ëèñòèíãå 5.5. Òàêîé êðàòêîé ôîðìîé ÿâëÿåòñÿ îïåðàòîð
If…Then…ElseIf.
Îïåðàòîð If…Then…ElseIf èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
If Condition1 Then
Statements
ElseIf Condition2
ElseIfStatements
[Else
ElseStatements]
End If
Condition1 è Condition2 — ëþáûå ëîãè÷åñêèå âûðàæåíèÿ; Statements, ElseIfState-
ments è ElseStatements — îäèí, íåñêîëüêî èëè íè îäíîãî îïåðàòîðà VBA.
Ïðè âûïîëíåíèè îïåðàòîðà If…Then…ElseIf VBA ñíà÷àëà îöåíèâàåò ëîãè÷åñêîå
âûðàæåíèå, ïðåäñòàâëåííîå ñ ïîìîùüþ Condition1. Åñëè ýòî âûðàæåíèå ðàâíî
True, òî VBA âûïîëíÿåò âñå îïåðàòîðû (ïðåäñòàâëåííûå ñ ïîìîùüþ Statements)
ìåæäó êëþ÷åâûìè ñëîâàìè Then è ElseIf. Çàòåì VBA âîçîáíîâëÿåò âûïîëíåíèå
êîäà ñ ïåðâîãî îïåðàòîðà ïîñëå êëþ÷åâûõ ñëîâ End If, êîòîðûå óêàçûâàþò íà
êîíåö îïåðàòîðà If…Then…ElseIf.
Åñëè ëîãè÷åñêîå âûðàæåíèå Condition1 ðàâíî False, VBA îöåíèâàåò ëîãè÷åñêîå
âûðàæåíèå, ïðåäñòàâëåííîå ñ ïîìîùüþ Condition2. Åñëè âûðàæåíèå Condition2
ðàâíî True, VBA âûïîëíÿåò âñå îïåðàòîðû (ïðåäñòàâëåííûå ñ ïîìîùüþ
ElseIfStatements) ìåæäó êëþ÷åâûì ñëîâîì ElseIf è êëþ÷åâûìè ñëîâàìè End If
(èëè íåîáÿçàòåëüíûì Else). Çàòåì VBA ïðîäîëæàåò âûïîëíåíèå êîäà ñ ïåðâîãî
îïåðàòîðà, ïîÿâëÿþùåãîñÿ ïîñëå êëþ÷åâûõ ñëîâ EndIf. Êëþ÷åâûå ñëîâà End If
äîëæíû íàõîäèòüñÿ íà îòäåëüíîé ñòðîêå.
Åñëè ëîãè÷åñêîå âûðàæåíèå Condition2 ðàâíî False, òî VBA ïðîïóñêàåò
ElseIfStatements è ïðîäîëæàåò âûïîëíåíèå êîäà ñ ïåðâîãî îïåðàòîðà ïîñëå
êëþ÷åâûõ ñëîâ End If. Ìîæíî ïî æåëàíèþ âêëþ÷àòü îïåðàòîð Else â îïåðàòîð
If…Then…ElseIf. Åñëè ëîãè÷åñêîå âûðàæåíèå Condition1 è ëîãè÷åñêîå âûðàæåíèå
Condition2 ðàâíû False è èìååòñÿ îïåðàòîð Else, òî VBA âûïîëíÿåò îïåðàòîðû,
ïðåäñòàâëåííûå ñ ïîìîùüþ ElseStatements. Ïîñëå âûïîëíåíèÿ îïåðàòîðîâ
ElseStatements VBA ïðîäîëæàåò âûïîëíåíèå êîäà ñ ïåðâîãî îïåðàòîðà ïîñëå
êëþ÷åâûõ ñëîâ End If (ñì. ñõåìó 5.4).
204 Ãëàâà 5
Îïåðàòîð Select…Case
Ïðèìåðû èñïîëüçîâàíèÿ âëîæåííûõ îïåðàòîðîâ If…Then…Else è If…
Then…ElseIf ïîêàçûâàþò, ÷òî ýòè îïåðàòîðû ïîçâîëÿþò âûáèðàòü èç òðåõ âåò-
âåé êîäà, íî ÷òî åñëè íåîáõîäèìî âûáðàòü ìåæäó 5, 8 èëè 10 ðàçëè÷íûìè âîç-
ìîæíûìè äåéñòâèÿìè?
Äëÿ âûïîëíåíèÿ âûáîðà èç íåñêîëüêèõ âîçìîæíûõ âåòâåé êîäà ìîæíî
âêëàäûâàòü îïåðàòîðû If…Then…Else íà ìíîãî óðîâíåé âãëóáü, íî óñëåäèòü çà
õîäîì âûïîëíåíèÿ âåòâåé ñòàíîâèòñÿ ïðîãðåññèðóþùå òðóäíåå. Àëüòåðíàòèâ-
íî, ìîæíî áûëî áû äîáàâèòü äîïîëíèòåëüíûå îïåðàòîðû ElseIf â îïåðàòîð
If…Then…ElseIf ñ îïåðàòîðîì ElseIf äëÿ êàæäîé óñëîâíîé âåòâè. Îïåðàòîð
If…Then…ElseIf èìååò ïîäîáíóþ ïðîáëåìó: êîãäà èìååòñÿ ìíîãî îïåðàòîðîâ
ElseIf, îïåðàòîð If…Then…ElseIf ñòàíîâèòñÿ òðóäíî ÷èòàòü è ñîïðîâîæäàòü.
Ê «ñ÷àñòüþ», VBA èìååò óñëîâíûé îïåðàòîð ïåðåõîäà äëÿ èñïîëüçîâàíèÿ â
ñëó÷àÿõ, êîãäà íåîáõîäèìî âûáèðàòü èç áîëüøîãî êîëè÷åñòâà ðàçëè÷íûõ âåò-
âåé êîäà: îïåðàòîð Select Case. Îí ðàáîòàåò âî ìíîãîì òàê æå, êàê ìíîæåñò-
âî íåçàâèñèìûõ îïåðàòîðîâ If, íî îí áîëåå ïîíÿòåí äëÿ òîãî, êòî ïèøåò êîä, è
òîãî, êòî ÷èòàåò ýòîò êîä. Êëþ÷åâûå ñëîâà Select Case èñïîëüçóþòñÿ ñî ìíî-
ãèìè îïåðàòîðàìè Case, ãäå êàæäûé îïåðàòîð Case ïðîâåðÿåò ïîÿâëåíèå äðó-
ãîãî óñëîâèÿ è âûïîëíÿåòñÿ òîëüêî îäíà èç âåòâåé Case. Âåòâü Case ìîæåò ñî-
äåðæàòü îäèí, íåñêîëüêî èëè íè îäíîãî îïåðàòîðà VBA.
Îïåðàòîð Select Case èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Select Case TestExpression
Case ExpressionList1
statements1
Case ExpressionList2
206 Ãëàâà 5
statements2
.
.
.
Case ExpressionListN
statementsN
[Case Else
ElseStatements]
End Select
TestExpression — ëþáîå ÷èñëåííîå èëè ñòðîêîâîå âûðàæåíèå. ExpressionList1,
ExpressionList2 è ExpressionListN — (êàæäûé) ïðåäñòàâëÿþò ñïèñîê ëîãè÷åñêèõ
âûðàæåíèé, îòäåëåííûõ çàïÿòûìè. Statements1, statements2, statementsN è
ElseStatements (êàæäûé) ïðåäñòàâëÿþò îäèí, íåñêîëüêî èëè íè îäíîãî îïåðàòîðà
VBA.  Select Case ìîæíî âêëþ÷àòü ñòîëüêî îïåðàòîðîâ Case ExpressionList,
ñêîëüêî íåîáõîäèìî (ñì. ñõåìó 5.5) .
íèÿ Case. Åñëè çíà÷åíèå TestExpression ñîâïàäàåò áîëåå, ÷åì ñ îäíèì îïåðàòî-
ðîì Case, VBA âûïîëíÿåò òîëüêî îïåðàòîðû â ïåðâîì ñîâïàäàþùåì
ïðåäëîæåíèè Case. ×àñòî TestExpression — ýòî ïðîñòî èìÿ îäíîé ïåðåìåííîé,
ìàòåìàòè÷åñêîå èëè ÷èñëåííîå, à íå ëîãè÷åñêîå âûðàæåíèå. Âûðàæåíèÿ
â ExpressionList — ýòî îáû÷íî ëîãè÷åñêèå âûðàæåíèÿ.
Ïîñëå çàâåðøåíèÿ âûïîëíåíèÿ îïåðàòîðîâ â ïåðâîì ñîâïàäàþùåì îïåðàòî-
ðå Case VBA ïðîäîëæàåò âûïîëíåíèå êîäà ñ ïåðâîãî îïåðàòîðà ïîñëå êëþ÷å-
âûõ ñëîâ End Select, êîòîðûå îáîçíà÷àþò êîíåö Select Case.
Åñëè çíà÷åíèå TestExpression íå ñîâïàäàåò íè ñ êàêèì èç Case, à íåîáÿçà-
òåëüíûé Case Else ïðèñóòñòâóåò, VBA âûïîëíÿåò îïåðàòîðû, ïðåäñòàâëåí-
íûå ñ ïîìîùüþ ElseStatements ïåðåä ïåðåõîäîì ê îïåðàòîðó ïîñëå Select
Case.
 îòäåëüíûõ îïåðàòîðàõ Case âûðàæåíèå ExpressionList ìîæåò ñîñòîÿòü èç
îäíîãî èëè áîëåå âûðàæåíèé, îòäåëÿåìûõ çàïÿòîé. Ñïèñîê ExpressionList
èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
expression1, expression2, ..., expressionN
Âûðàæåíèÿ â ExpressionList ìîãóò áûòü ëþáûìè ÷èñëåííûìè, ñòðîêîâûìè èëè
ëîãè÷åñêèìè âûðàæåíèÿìè. Âûðàæåíèå â ExpressionList ìîæåò òàêæå îïðåäåëÿòü
äèàïàçîí çíà÷åíèé ïðè èñïîëüçîâàíèè îïåðàòîðà To:
expression1 To expression2
1 Sub EvalDiscount3()
2 'Îïðåäåëåíèå ñêèäêè (â %) â çàâèñèìîñòè îò
3 'êîëè÷åñòâà ïðîäàâàåìîãî òîâàðà
4 Dim lStr As String
208 Ãëàâà 5
5 Dim IntNum
6 IntNum = Application.InputBox( _
7 prompt:="Ââåäèòå êîëè÷åñòâî òîâàðà", _
8 Title:="Ïðîöåäóðà EvalDiscount3", _
9 Type:=1)
10 If Not (TypeName(VarWeight) = "Boolean") Then
11 Select Case IntNum
12 Case Is > 1000
13 lStr = "10"
14 Case Is > 500
15 lStr = "5 "
16 Case Else
17 lStr = "0 "
18 End Select
19 MsgBox "Ñêèäêà " & lStr & "%"
20 Else
21 MsgBox "Êîëè÷åñòâî íå óêàçàíî"
22 End If
23 End Sub
Áåçóñëîâíûé ïåðåõîä
Îïåðàòîð áåçóñëîâíîãî ïåðåõîäà, ïîæàëóé, ñàìûé ñïîðíûé îïåðàòîð âî
âñåõ ÿçûêàõ ïðîãðàììèðîâàíèÿ. Â ðàííèõ ÿçûêàõ îí ÿâëÿëñÿ ïî÷òè åäèíñò-
âåííûì ñðåäñòâîì îðãàíèçàöèè öèêëè÷åñêèõ âûïîëíåíèé áëîêîâ êîäà. Ñòî-
ðîííèêè ñòðóêòóðíîãî ïðîãðàììèðîâàíèÿ ïîñâÿùàþò ìíîãî âðåìåíè êðèòèêå
ïðîãðàìì è ÿçûêîâ ïðîãðàììèðîâàíèÿ, â êîòîðûõ èñïîëüçóåòñÿ ýòîò îïåðàòîð.
Ïîýòîìó íå î÷åíü óâëåêàéòåñü ïðèìåíåíèåì ýòîãî îïåðàòîðà â ñâîåì êîäå è
ñòàðàéòåñü âñïîìèíàòü î íåì òîëüêî â ÷ðåçâû÷àéíûõ ñèòóàöèÿõ, êîãäà âñå
äðóãèå ñðåäñòâà óæå èñïðîáîâàíû è íå ïîìîãëè.
Îïåðàòîð áåçóñëîâíîãî ïåðåõîäà âñåãäà èçìåíÿåò ïîðÿäîê âûïîëíåíèÿ îïå-
ðàòîðîâ â ïðîöåäóðå èëè ôóíêöèè VBA. Ïðè ýòîì VBA íå ïðîâåðÿåò íèêàêèõ
óñëîâèé (îòñþäà òåðìèí áåçóñëîâíûé (unconditional)), à ïðîñòî ïåðåõîäèò
ê âûïîëíåíèþ êîäà ñ äðóãîãî ìåñòà.
VBA èìååò òîëüêî îäèí îïåðàòîð áåçóñëîâíîãî ïåðåõîäà: GoTo. Ñóùåñòâóåò
î÷åíü ìàëî ïðè÷èí äëÿ èñïîëüçîâàíèÿ îïåðàòîðà GoTo; â äåéñòâèòåëüíîñòè,
ïðîöåäóðû, êîòîðûå èñïîëüçóþò íåñêîëüêî îïåðàòîðîâ GoTo, òðóäíû äëÿ ïî-
íèìàíèÿ. Ïî÷òè â êàæäîì ñëó÷àå, êîãäà âû ìîæåòå èñïîëüçîâàòü îïåðàòîð
GoTo, ìîæíî èñïîëüçîâàòü îäèí èç îïåðàòîðîâ If, îïåðàòîð Select Case èëè
îäíó èç ñòðóêòóð îðãàíèçàöèè öèêëîâ, î êîòîðûõ âû óçíàåòå â ãëàâå 7, äëÿ âû-
ïîëíåíèÿ òîé æå çàäà÷è ñ áîëüøåé ëåãêîñòüþ è ÿñíîñòüþ.
Îïåðàòîð GoTo îñòàëñÿ îò ðàííèõ âåðñèé ÿçûêà ïðîãðàììèðîâàíèÿ BASIC,
êîòîðûå íå èìåëè ñëîæíîãî îïåðàòîðà ïðèíÿòèÿ ðåøåíèé Select Case, îïè-
ñàííîãî â ýòîé ãëàâå, èëè ìîùíûõ ñòðóêòóð îðãàíèçàöèè öèêëîâ. Ïðîãðàììè-
ñòû, ðàáîòàâøèå ñ ðàííèìè âåðñèÿìè BASIC, èñïîëüçîâàëè GoTo äëÿ èìèòà-
öèè ðåçóëüòàòîâ áîëåå ñëîæíûõ îïåðàòîðîâ VBA.
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 209
Ìåòêà ñòðîêè (line label) — ýòî îñîáûé òèï èäåíòèôèêàòîðà, êîòîðûé çàäàåò
îïðåäåëåííóþ ñòðîêó ïî èìåíè. Ìåòêè ñòðîê èìåþò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Name:
Âûðàæåíèå name — ëþáîé äîïóñòèìûé èäåíòèôèêàòîð VBA. Ìåòêà ñòðîêè ìîæåò
íà÷èíàòüñÿ â ëþáîì ñòîëáöå â ñòðîêå, åñëè îíà ÿâëÿåòñÿ ïåðâûì íåïóñòûì ñèìâî-
ëîì â ñòðîêå. Íîìåð ñòðîêè (line number) — â îñíîâíîì, òî æå ñàìîå, ÷òî è ìåòêà
ñòðîêè, íî îí ÿâëÿåòñÿ ïðîñòî íîìåðîì, à íå èäåíòèôèêàòîðîì. Èñïîëüçîâàíèå íî-
ìåðîâ ñòðîê â ïðîöåäóðàõ VBA ÿâëÿåòñÿ êðàéíå íåæåëàòåëüíûì, ñëåäóåò âñåãäà
èñïîëüçîâàòü ìåòêó ñòðîêè âìåñòî íèõ.
24
25 EndSubCancel: 'îáðàáîòêà îòìåíû ââîäà â îêíå InputBox
26 MsgBox "Êîëè÷åñòâî íå óêàçàíî"
27
28 EndSub: 'óñïåøíîå îêîí÷àíèå ðàáîòû
29
30 End Sub
1: Sub Demo_MsgBoxFunction()
2: 'Ïðîöåäóðà äåìîíñòðèðóåò MsgBox, èñïîëüçóåìóþ êàê ôóíêöèÿ
3:
4: Const mTitle = "Äåìîíñòðàöèÿ êíîïîê MsgBox"
5: Dim Resp As Integer
6:
7: Resp = MsgBox(prompt:="Âûáåðèòå êíîïêó", _
8: Title:=mTitle, _
9: Buttons:=vbYesNoCancel + vbQuestion)
10: Select Case Resp
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 211
Ðèñ. 5.4. Òàêèå ñîîáùåíèÿ ìîæíî ïîëó÷èòü ïðè âûáîðå ðàçëè÷íûõ êíîïîê â
äèàëîãîâîì îêíå ôóíêöèè MsgBox
áûñòðåå è ëåã÷å, ÷åì ïåðåìåñòèòü ìûøü (íå âñåãäà â õîðîøåì ñîñòîÿíèè) â îï-
ðåäåëåííîå ìåñòî íà ýêðàíå è ùåëêíóòü ëåâîé êëàâèøåé.
 ñòðîêå 9 (÷àñòü îïåðàòîðà âûçîâà ôóíêöèè MsgBox, íà÷èíàþùåãîñÿ â
ñòðîêå 7) êîíñòàíòà vbYesNoCancel îïðåäåëÿåò, ÷òî äèàëîãîâîå îêíî MsgBox
äîëæíî ñîäåðæàòü òðè êîìàíäíûå êíîïêè: êíîïêó Yes (Äà), êíîïêó No (Íåò) è
êíîïêó Cancel (Îòìåíà). Êîíñòàíòà vbQuestion îïðåäåëÿåò, ÷òî îêíî ñîîáùå-
íèÿ äîëæíî ñîäåðæàòü çíà÷îê ñîîáùåíèÿ çàïðîñà (Query message) Windows.
Êàê òîëüêî ïîëüçîâàòåëü âûáèðàåò êîìàíäíóþ êíîïêó â îêíå ñîîáùåíèÿ,
VBA âîçâðàùàåò ÷èñëåííîå çíà÷åíèå, ñîîòâåòñòâóþùåå âûáîðó ïîëüçîâàòåëÿ.
 ñòðîêå 7 ðåçóëüòàò ôóíêöèè MsgBox ïðèñâàèâàåòñÿ ïåðåìåííîé Resp. VBA
èñïîëüçóåò ðàçëè÷íûå çíà÷åíèÿ â çàâèñèìîñòè îò òîãî, êàêóþ êîìàíäíóþ
êíîïêó âûáðàë ïîëüçîâàòåëü: îäíî çíà÷åíèå äëÿ îáîçíà÷åíèÿ êíîïêè Yes, äðó-
ãîå — äëÿ îáîçíà÷åíèÿ êíîïêè No è åùå îäíî — äëÿ êíîïêè Cancel. Ôóíêöèÿ
MsgBox ìîæåò òàêæå îòîáðàæàòü îêíà ñ êíîïêàìè Abort (Ñòîï), Retry (Ïîâòîð) è
Ignore (Ïðîïóñòèòü) â ðàçëè÷íûõ êîìáèíàöèÿõ. Ïîñêîëüêó êàæäàÿ êíîïêà
èìååò ñâîå îïðåäåëåííîå âîçâðàùàåìîå çíà÷åíèå, VBA èìååò íåñêîëüêî âíóò-
ðåííèõ êîíñòàíò äëÿ ïðåäñòàâëåíèÿ âîçìîæíûõ âîçâðàùàåìûõ çíà÷åíèé
ôóíêöèè MsgBox. Ïîëíûé ñïèñîê çíà÷åíèé êîíñòàíò VBA, êîòîðûå ìîæåò
âîçâðàùàòü MsgBox, ïðèâåäåí â ãëàâå 4.
 ñòðîêå 10 íà÷èíàåòñÿ îïåðàòîð Select Case, êîòîðûé îöåíèâàåò çíà÷å-
íèå, âîçâðàùàåìîå ôóíêöèåé MsgBox â ñòðîêå 7 è ñîõðàíÿåìîå â ïåðåìåííîé
Resp. Òåñòîâîå âûðàæåíèå äëÿ îïåðàòîðà Select Case — ýòî ñàìà ïåðåìåííàÿ
Resp, ïîýòîìó VBA ñðàâíèâàåò çíà÷åíèå â ïåðåìåííîé Resp, ÷òîáû ïðîâåðèòü,
ñîâïàäàåò ëè îíî ñ êàêèì-ëèáî óñëîâèåì Case â îïåðàòîðå Select Case.
Ïîìíèòå, ÷òî ìîæíî óâèäåòü âñå äîñòóïíûå âíóòðåííèå êîíñòàíòû, èìåþùèå
îòíîøåíèå ê MsgBox, â îêíå Object Browser (Ïðîñìîòð îáúåêòîâ). Äëÿ ïðîñìîòðà
âíóòðåííèõ êîíñòàíò àðãóìåíòà Buttons âûáåðèòå VBA â ñïèñêå Project/Library
(Ïðîåêò | Áèáëèîòåêà) â îêíå Object Browser, à çàòåì âûáåðèòå VbMsgBoxStyle â ñïè-
ñêå Classes (Êëàññû); ñïèñîê Members of ‘VbMsgBoxStyle’ (Êîìïîíåíò) îòîáðàæàåò
âíóòðåííèå êîíñòàíòû äëÿ çíà÷åíèé àðãóìåíòà Buttons. Åñëè âû âûáåðåòå
VbMsgBoxResult â ñïèñêå Classes, ñïèñîê Members of ‘VbMsgBoxResult’ îòîáðàæàåò
âíóòðåííèå êîíñòàíòû äëÿ âîçâðàùàåìîãî çíà÷åíèÿ ôóíêöèè MsgBox.
Îñòàåòñÿ îäèí ýëåìåíò, êîòîðûé ìîæíî çàäàòü ñ ïîìîùüþ àðãóìåíòà
Buttons äëÿ MsgBox è êîòîðûé íå áûë âêëþ÷åí â ëèñòèíã 5.9: ìîæíî óêàçàòü,
ÿâëÿåòñÿ ëè ïåðâàÿ, âòîðàÿ, òðåòüÿ èëè ÷åòâåðòàÿ êîìàíäíàÿ êíîïêà â îêíàõ
MsgBox êíîïêîé ïî óìîë÷àíèþ.
Êàê âû âèäåëè äî ñèõ ïîð, MsgBox îáû÷íî äåëàåò ïåðâóþ êîìàíäíóþ êíîï-
êó â ñâîåì îêíå êíîïêîé ïî óìîë÷àíèþ. Ïîñìîòðèòå íà ðèñ. 5.3 è îáðàòèòå
âíèìàíèå, ÷òî êíîïêà Äà (Yes) ïîìå÷åíà êàê êíîïêà ïî óìîë÷àíèþ. Åñëè ïîñëå
òîãî, êàê VBA îòîáðàçèò ýòî äèàëîãîâîå îêíî, ïîëüçîâàòåëü íàæèìàåò íà êëà-
âèøó Enter, VBA äåéñòâóåò òàê, êàê åñëè áû ïîëüçîâàòåëü âûáðàë êëàâèøó Äà.
Âàì ìîæåò ïîíàäîáèòüñÿ, ÷òîáû êíîïêîé ïî óìîë÷àíèþ áûëà êàêàÿ-ëèáî
äðóãàÿ êíîïêà, à íå ïåðâàÿ â ñïèñêå â îêíå ñîîáùåíèÿ. Íàïðèìåð, åñëè âû èñ-
ïîëüçóåòå MsgBox äëÿ çàïðîñà îò ïîëüçîâàòåëÿ ïîäòâåðæäåíèÿ óäàëèòü ðàáî-
÷èé ëèñò â ðàáî÷åé êíèãå, ìîæåò áûòü ïðåäïî÷òèòåëüíåå, ÷òîáû êîìàíäíîé
êíîïêîé ïî óìîë÷àíèþ áûëà êíîïêà No, à íå êíîïêà Yes; ïîñêîëüêó óäàëåí-
íûé ðàáî÷èé ëèñò íå ìîæåò áûòü âîññòàíîâëåí, èìååò ñìûñë ïîìî÷ü ïîëüçîâà-
òåëþ èçáåæàòü íå÷àÿííîãî ïîäòâåðæäåíèÿ óäàëåíèÿ ïðè ïðîñòîì íàæàòèè íà
êëàâèøó Enter.
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 213
Ðèñ. 5.5
Ñðàâíèòå ýòî äèàëîãîâîå îêíî ñ îêíîì, ïîêàçàííûì íà
ðèñ. 5.3. Çàìåòüòå, ÷òî
êíîïêà No ÿâëÿåòñÿ òåïåðü êîìàíäíîé
êíîïêîé ïî óìîë÷àíèþ êàê ðåçóëüòàò
äîáàâëåíèÿ vbDefaultButton2 ê àðãóìåíòó Buttons
Exit Sub è Exit Function ðàáîòàþò îäèíàêîâî è èìåþò îäèí è òîò æå ðå-
çóëüòàò; Exit Sub èñïîëüçóåòñÿ äëÿ îêîí÷àíèÿ ïðîöåäóðû, à Exit Function —
äëÿ îêîí÷àíèÿ ôóíêöèè.
Ñíà÷àëà ðàññìîòðèì ïðîñòîé ïðèìåð — ëèñòèíã 5.10, êîòîðûé îòëè÷àåòñÿ
îò ëèñòèíãà 5.8 òåì, ÷òî â íåì íåò îïåðàòîðà GoTo.
End Sub
Sub Ïðîöåäóðà1()
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 217
'Êîä ïðîöåäóðû
End Sub
Sub Ïðîöåäóðà2()
'Êîä ïðîöåäóðû
End Sub
Sub Ïðîöåäóðà3()
'Êîä ïðîöåäóðû
End Sub
Ìîæíî òàêæå âñòðåòèòü è ñëåäóþùèé êîä:
Sub ÃëàâíàÿÏðîöåäóðà()
End Sub
Sub Ïðîöåäóðà1()
'Âûçîâ ïðîöåäóðû Ïðîöåäóðà2
Call Ïðîöåäóðà2
End Sub
Sub Ïðîöåäóðà2()
'Âûçîâ ïðîöåäóðû Ïðîöåäóðà3
Call Ïðîöåäóðà3
End Sub
Sub Ïðîöåäóðà3()
'Êîä ïðîöåäóðû
End Sub
Îáðàòèòå âíèìàíèå íà òî, ÷òî â ýòèõ ôðàãìåíòàõ êîäà ïðîöåäóðû íå âîçâðà-
ùàþò íèêàêèõ ðåçóëüòàòîâ ñâîé ðàáîòû. Ýòî ìîæåò áûòü òîëüêî â ñëó÷àå, êî-
ãäà ýòè ïðîöåäóðû ïî î÷åðåäè îáðàáàòûâàþò êàêèå-òî îáùèå äàííûå, âûïîë-
íÿÿ íàä íèìè îïðåäåëåííûå äåéñòâèÿ. Ðåçóëüòàòàìè ýòèõ äåéñòâèé ìîãóò áûòü
ëèáî ñàìè ïðåîáðàçîâàííûå äàííûå, ëèáî íîâûå (è òîæå îáùèå) äàííûå.
Ïðåäñòàâèì òàêóþ ñèòóàöèþ, êîãäà îáðàáîòêà äàííûõ îäíîé ïðîöåäóðîé
çàâèñèò îò ðåçóëüòàòîâ îáðàáîòêè ýòèõ äàííûõ äðóãîé ïðîöåäóðîé, âûïîëíÿå-
ìîé ðàíüøå. Âïîëíå âîçìîæíî, ÷òî ïî êàêèì-òî ïðè÷èíàì (ïîëüçîâàòåëü íå-
ïðàâèëüíî ââåë èìÿ ëèñòà ñ äàííûìè, âîîáùå îòêàçàëñÿ îò ââîäà, íåïðàâèëüíî
ââåäåíû ÷èñëîâûå è äðóãèå äàííûå) îäíà èç ïðîöåäóð íå ïîäãîòîâèëà äàííûå
äëÿ îáðàáîòêè ñëåäóþùåé ïðîöåäóðîé.  ýòîì ñëó÷àå âåñü ïðîöåññ îáðàáîòêè
äàííûõ ñëåäóåò ïðåêðàòèòü è â äàëüíåéøåì íèêàêèõ ïðîöåäóð íå âûçûâàòü,
ò.å. ïðîñòî çàêîí÷èòü ðàáîòó âñåé ïðîãðàììû. Ïðè ýòîì äàæå íåîáÿçàòåëüíî
âîçâðàùàòüñÿ â âûçûâàþùóþ ïðîöåäóðó, îñîáåííî åñëè ïðåäóñìîòðåòü ïåðåä
êàæäûì âûõîäîì èç ïðîãðàììû âûâîä îêíà ñ ñîîáùåíèåì î òîì, ïî÷åìó è ãäå
áûëî ïðåðâàíî âûïîëíåíèå êîäà.
Äëÿ ïîëíîãî çàâåðøåíèÿ âûïîëíåíèÿ ïðîãðàììû ñ ïîìîùüþ VBA èñïîëü-
çóéòå êëþ÷åâîå ñëîâî End îäíî â îòäåëüíîé ñòðîêå:
End
Ïðè âûïîëíåíèè ýòîãî îïåðàòîðà VBA ïðåêðàùàåò âñå âûïîëíåíèå îïåðàòî-
ðîâ ïðîöåäóðû è ôóíêöèè. Ëþáûå èìåþùèåñÿ ïåðåìåííûå ïåðåñòàþò ñóùåñò-
âîâàòü, è èõ çíà÷åíèÿ òåðÿþòñÿ.
 ëèñòèíãå 5.12 ïîêàçàíà ôóíêöèÿ GetBookName, êîòîðàÿ ïîëíîñòüþ çà-
êàí÷èâàåò ëþáóþ ïðîãðàììó, âûïîëíÿåìóþ VBA, åñëè ïîëüçîâàòåëü îòìåíÿåò
îêíî ââîäà.
218 Ãëàâà 5
Ñðàâíèòå ýòîò êîä ñ êîäîì ëèñòèíãà 5.4. Íåïðàâäà ëè, ýòîò êîä áîëåå èçÿùåí?
7: Sub Test_Sconcat()
8: Dim a1 As String, a2 As String
9: a1 = " Çíà÷åíèå à1: "
10: a2 = " Çíà÷åíèå à2: "
11: MsgBox a1 & a2, , "Äî âûçîâà Sconcat"
12: MsgBox Sconcat(a1, a2), , "Ïðè âûçîâå Sconcat"
13: MsgBox a1 & a2, , "Ïîñëå âûçîâà Sconcat"
14: End Sub
Èç ðèñ. 5.6 âèäíî, ÷òî ïîñëå âûçîâà ôóíêöèè Sconcat çíà÷åíèÿ ïåðåìåííûõ
a1 è a2 èçìåíèëèñü.
Ðèñ. 5.6.
Ðåçóëüòàòû
òåñòèðîâàíèÿ
ôóíêöèè Sconcat èç
ëèñòèíãà 5.14
Ðåêóðñèÿ
 êîíöå ýòîé ãëàâû, ïîñâÿùåííîé íàïèñàíèþ ïîëüçîâàòåëüñêèõ ôóíê-
öèé-ïðîöåäóð, íåîáõîäèìî îáúÿñíèòü åùå îäíî âàæíîå ïîíÿòèå, õîòÿ îíî è íå
ÿâëÿåòñÿ íåïîñðåäñòâåííî ÷àñòüþ ïðîöåññà ñîçäàíèÿ ôóíêöèé-ïðîöåäóð VBA.
Áîëåå òîãî, ýòîò ìàòåðèàë ïðåäíàçíà÷åí íå äëÿ íà÷èíàþùèõ ïðîãðàììèñòîâ è
ìîæåò áûòü ïðîïóùåí ïðè ïåðâîì ÷òåíèè äàííîé êíèãè.
Ðåêóðñèâíàÿ (recursive) ôóíêöèÿ èëè ïðîöåäóðà — ýòî ôóíêöèÿ èëè ïðîöå-
äóðà, êîòîðàÿ âûçûâàåò ñàìà ñåáÿ. Ïî÷òè âî âñåõ ñëó÷àÿõ, ðåêóðñèÿ ÿâëÿåòñÿ
îøèáêîé ïðîãðàììèðîâàíèÿ è ïðèâîäèò ê ïîëíîìó ñáîþ ïðîãðàììû. Íàèáîëåå
îáùèì ñèìïòîìîì âîçíèêíîâåíèÿ ýòîé ïðîáëåìû ÿâëÿåòñÿ îøèáêà èç-çà íå-
õâàòêè ïàìÿòè èëè îøèáêà èç-çà íåõâàòêè ïàìÿòè â ñòåêå. Ñòåê (stack) — ýòî
âðåìåííàÿ ðàáî÷àÿ îáëàñòü êîìïüþòåðíîé ïàìÿòè. VBA èñïîëüçóåò ñòåêîâóþ
ïàìÿòü äëÿ ñîõðàíåíèÿ âíóòðåííèõ ðåçóëüòàòîâ âûðàæåíèé, êîïèé àðãóìåí-
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 223
Ðèñ. 5.8.
Îêíà ñ
ïðîìåæóòî÷íûìè
ðåçóëüòàòàìè ðàáîòû
ôóíêöèè fPower
Îáúåêòû
 ñåðåäèíå 80-õ ãîäîâ áûëà ðàçðàáîòàíà íîâàÿ êîíöåïöèÿ â êîìïüþòåðíîì
ïðîãðàììèðîâàíèè, èçâåñòíàÿ êàê îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðî-
âàíèå (object-oriented programming, OOP). Ïîïóëÿðíîñòü îáúåêòíî-îðèåíòèðî-
âàííîãî ïðîãðàììèðîâàíèÿ ñ ãîäàìè âîçðàñòàåò; íîâûé Ðàáî÷èé ñòîë (desktop)
â Windows 95, Windows NT 4.0 è Active Desktop â Windows 98/2000/XP, ôàê-
òè÷åñêè âîïëîùàþò ìíîãèå îáúåêòíî-îðèåíòèðîâàííûå ïðèíöèïû. Öåíòðàëü-
íàÿ èäåÿ îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ çàêëþ÷àåòñÿ â òîì,
÷òî ïðîãðàììíîå ïðèëîæåíèå (êàê è ðåàëüíûé ìèð âîêðóã íàñ) äîëæíî ñîñòî-
228 Ãëàâà 6
Ñâîéñòâà îáúåêòà
Êàê è îáúåêòû ðåàëüíîãî ìèðà, îáúåêòû VBA èìåþò ðàçëè÷íûå ïðèñóùèå
èì êà÷åñòâà èëè ñâîéñòâà (properties). Îáúåêòû â Word è Excel èìåþò
ñâîéñòâà, îïðåäåëÿþùèå èõ âèä è ïîâåäåíèå: òåêñò â äîêóìåíòå Word ìîæåò
îòîáðàæàòüñÿ èëè íå îòîáðàæàòüñÿ ïîëóæèðíûì øðèôòîì èëè êóðñèâîì,
ðàáî÷èé ëèñò Excel ìîæåò áûòü âèäèìûì èëè íåò, ñòðîêè â ðàáî÷åì ëèñòå èëè
òàáëèöå èìåþò ñâîéñòâî âûñîòû, ñòîëáöû èìåþò ñâîéñòâî øèðèíû è òàê
äàëåå.
Ñâîéñòâà ðåãóëèðóþò âèä è ïîâåäåíèå îáúåêòà. ×òîáû èçìåíèòü âèä è ïîâå-
äåíèå îáúåêòà, íåîáõîäèìî èçìåíèòü åãî ñâîéñòâà. Â Excel ìîæíî èçìåíèòü ïî-
âåäåíèå ðàáî÷åãî ëèñòà, èçìåíÿÿ ñâîéñòâî âû÷èñëåíèÿ ñ àâòîìàòè÷åñêîãî íà
ðó÷íîå, èëè ìîæíî èçìåíèòü âèä ðàáî÷åãî ëèñòà, çàäàâ íîâûé öâåò äëÿ òåêñòà
èëè ãðàôèêè â ëèñòå. Â Word ìîæíî èçìåíèòü ïîâåäåíèå äîêóìåíòà, èçìåíÿÿ
ñâîéñòâî, êîòîðîå ðåãóëèðóåò ïîêàç îðôîãðàôè÷åñêèõ îøèáîê âî âðåìÿ íàáîðà
òåêñòà; ìîæíî èçìåíèòü âèä äîêóìåíòà, çàäàâ íîâûå çíà÷åíèÿ äëÿ ñâîéñòâ ðàç-
ìåòêè ñòðàíèöû.
×òîáû óçíàòü î òåêóùåì âèäå è ïîâåäåíèè îáúåêòà, íåîáõîäèìî óçíàòü
î åãî ñâîéñòâàõ. Âû ìîæåòå îïðåäåëèòü äèñê, ïàïêó è èìÿ ðàáî÷åé êíèãè
Excel èëè äîêóìåíòà Word, ðàññìîòðåâ ñâîéñòâî FullName ýòîé ðàáî÷åé êíè-
ãè èëè äîêóìåíòà.
Íåêîòîðûå ñâîéñòâà îáúåêòà ìîæíî èçìåíÿòü, íåêîòîðûå — íåò. Íàïðèìåð,
â ðàáî÷åé êíèãå Excel ìîæíî èçìåíèòü èìÿ àâòîðà êíèãè, èçìåíÿÿ ñâîéñòâî
Author, íî íåëüçÿ èçìåíèòü ñâîéñòâî Name ðàáî÷åé êíèãè. (Ñâîéñòâî Name
ðàáî÷åé êíèãè ñîäåðæèò èìÿ ôàéëà íà äèñêå è íå ìîæåò áûòü èçìåíåíî áåç
Ââåäåíèå â îáúåêòû è êîëëåêöèè 229
Ìåòîäû îáúåêòà
Îáúåêòû ðåàëüíîãî ìèðà ïî÷òè âñåãäà èìåþò òîò òèï ïðèñóùåãî èì ïîâåäå-
íèÿ èëè äåéñòâèÿ, êîòîðûé îíè ìîãóò âûïîëíèòü. Îáúåêòû VBA òàêæå èìåþò
ïîâåäåíèå è âîçìîæíîñòè, íàçûâàåìûå ìåòîäàìè (methods). Îáúåêò ðàáî÷åé
êíèãè Excel, íàïðèìåð, èìååò âñòðîåííóþ ñïîñîáíîñòü äîáàâëÿòü ê ñåáå íîâûé
ðàáî÷èé ëèñò — ìåòîä äîáàâëåíèÿ ðàáî÷èõ ëèñòîâ (íàçûâàåìûé Add). Äðóãîé
ïðèìåð: äîêóìåíò Word èìååò âñòðîåííóþ ñïîñîáíîñòü ïðîâåðÿòü îðôîãðàôèþ
òåêñòà â äîêóìåíòå — ìåòîä ïðîâåðêè îðôîãðàôèè (íàçûâàåìûé, êàê âû ìîã-
ëè äîãàäàòüñÿ, CheckSpelling).
Ìåòîäû èçìåíÿþò çíà÷åíèÿ ñâîéñòâ îáúåêòîâ; ìåòîäû âûïîëíÿþò òàêæå
äåéñòâèÿ ñ äàííûìè (èëè íàä äàííûìè), ñîõðàíÿåìûìè îáúåêòîì. Ìåòîäû âî
ìíîãîì ïîõîæè íà ïðîöåäóðû VBA, ñ êîòîðûìè âû óæå çíàêîìû, íî ñâÿçàíû
ñ îáúåêòîì; ê ìåòîäàì îáúåêòà ìîæíî îáðàòèòüñÿ, òîëüêî èñïîëüçóÿ îáúåêò.
Ýòî ìîæåò êàçàòüñÿ ñëîæíûì, íî íà äåëå âñå ïðîùå. Äëÿ âûçîâà ìåòîäà îáúåê-
òà (ôóíêöèè îáðàáîòêè äàííûõ îáúåêòà) óêàçûâàåòñÿ íå òîëüêî íàèìåíîâàíèå
ìåòîäà, íî è îáúåêò (èìÿ), êîòîðîìó ïðèíàäëåæèò ìåòîä.
Îäíîé èç ïðè÷èí òîãî, ÷òî îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå
ñòàëî ïîïóëÿðíîé òåõíèêîé ïðîåêòèðîâàíèÿ, ÿâëÿåòñÿ òî, ÷òî îíî ïîçâîëÿåò
ðàçðàáîò÷èêàì ïðîãðàììíîãî îáåñïå÷åíèÿ ñîçäàâàòü áîëåå ýôôåêòèâíûå ïðî-
ãðàììû ñ ñîâìåñòíî èñïîëüçóåìûì êîäîì. Âìåñòî ñîõðàíåíèÿ îòäåëüíîé êî-
ïèè êîäà äëÿ êàæäîãî ìåòîäà êàæäîãî îáúåêòà VBA-îáúåêòû îäíîãî è òîãî æå
òèïà ñîâìåñòíî èñïîëüçóþò êîä ñâîèõ ìåòîäîâ.
Íåñìîòðÿ íà òî, ÷òî îáúåêòû îäíîãî è òîãî æå òèïà ñîâìåñòíî èñïîëüçóþò
êîä äëÿ ñâîèõ ìåòîäîâ, ìåòîä ñ÷èòàåòñÿ ÷àñòüþ îáúåêòà; êîãäà âû âûçûâàåòå
îïðåäåëåííûé ìåòîä äëÿ êîíêðåòíîãî îáúåêòà, ìåòîä âîçäåéñòâóåò òîëüêî íà
îáúåêò, ïîñðåäñòâîì êîòîðîãî âû îáðàùàåòåñü ê ýòîìó ìåòîäó.
Ïîñëå òîãî êàê îáúåêò ñîçäàí (åñëè ýòî — íå âñòðîåííûé îáúåêò), íåò íåîá-
õîäèìîñòè áåñïîêîèòüñÿ î òîì, êàê ðàáîòàþò åãî ìåòîäû è êàê îáúåêò ñîõðàíÿ-
åò èëè ìàíèïóëèðóåò äàííûìè. Âñå, ÷òî íóæíî çíàòü, — êàê óêàçàòü îáúåêò
è êàê óêàçàòü ìåòîä, êîòîðûé íåîáõîäèìî èñïîëüçîâàòü (èëè îïðåäåëåííîå
ñâîéñòâî, êîòîðîå íóæíî âûáðàòü è èçìåíèòü). Âñòðîåííûé êîä äëÿ îáúåêòà
VBA âûïîëíÿåò îñòàëüíóþ ðàáîòó àâòîìàòè÷åñêè.
Êëàññû îáúåêòà
Ïðîãðàììíûå îáúåêòû ãðóïïèðóþòñÿ â èåðàðõè÷åñêèå êëàññû èëè êîëëåê-
öèè îáúåêòîâ, êàê îáúåêòû ðåàëüíîãî ìèðà âîêðóã íàñ. Âñå îáúåêòû â îäíîì
è òîì æå êëàññå èìåþò îäíè è òå æå (èëè ïîäîáíûå) ñâîéñòâà è ìåòîäû. Êàæ-
230 Ãëàâà 6
äûé êëàññ îáúåêòîâ ìîæåò ñîäåðæàòü îäèí èëè íåñêîëüêî ïîäêëàññîâ. Îáúåê-
òû, ïðèíàäëåæàùèå ê îïðåäåëåííîìó êëàññó îáúåêòîâ, íàçûâàþòñÿ ÷ëåíàìè
(members) ýòîãî êëàññà.
MS Word, Excel, Access, PowerPoint, Outlook è ò.ä. ïðèíàäëåæàò ê îáùåìó
êëàññó îáúåêòîâ — host-ïðèëîæåíèé VBA. Ïðè çàïóñêå Word íà âàøåì
êîìïüþòåðå âû ñîçäàåòå ýêçåìïëÿð Word. Ïðè íàëè÷èè äîñòàòî÷íûõ ðåñóðñîâ
ïàìÿòè â êîìïüþòåðå âû ìîæåòå çàïóñòèòü Word áîëåå îäíîãî ðàçà; êàæäûé
ðàç ïðè çàïóñêå Word áóäåò ñîçäàâàòüñÿ åùå îäèí ýêçåìïëÿð Word. Êàæäûé
ðàç ïðè ñîçäàíèè èëè îòêðûòèè äîêóìåíòà â Word ñîçäàåòñÿ ýêçåìïëÿð
îáúåêòà Document. Àíàëîãè÷íî, êàæäàÿ êîïèÿ Excel, âûïîëíÿåìàÿ íà
êîìïüþòåðå, ÿâëÿåòñÿ ýêçåìïëÿðîì ïðèëîæåíèÿ Excel, à êàæäàÿ ðàáî÷àÿ
êíèãà, îòêðûòàÿ â äàííûé ìîìåíò, ÿâëÿåòñÿ ýêçåìïëÿðîì îáúåêòà Workbook.
VBA äàåò âîçìîæíîñòü ïîëüçîâàòåëþ ñîçäàâàòü ñîáñòâåííûå êëàññû îáúåê-
òîâ äîáàâëåíèåì ìîäóëÿ êëàññà â ïðîåêò. Âàø ìîäóëü êëàññà äîëæåí ñîäåð-
æàòü âñå îïðåäåëåíèÿ ñâîéñòâ è ìåòîäîâ äëÿ îáúåêòà. Ïîñëå îïèñàíèÿ íîâîãî
êëàññà âû ìîæåòå ñîçäàâàòü åãî ýêçåìïëÿðû (îáúåêòû ýòîãî òèïà).
Èñïîëüçîâàíèå îáúåêòîâ
Îïåðàòîðû ïðîãðàìì VBA, èñïîëüçóþùèå îáúåêòû, îáû÷íî âûïîëíÿþò
îäíî èëè íåñêîëüêî èç ñëåäóþùèõ äåéñòâèé:
¨ îïðåäåëÿþò òåêóùåå ñîñòîÿíèå èëè ñòàòóñ îáúåêòà ïóòåì âûáîðêè çíà÷å-
íèÿ, ñîõðàíÿåìîãî â îïðåäåëåííîì ñâîéñòâå;
¨ èçìåíÿþò ñîñòîÿíèå èëè ñòàòóñ îáúåêòà óñòàíîâêîé çíà÷åíèÿ, ñîõðàíåí-
íîãî â îïðåäåëåííîì ñâîéñòâå;
¨ èñïîëüçóþò îäèí èç ìåòîäîâ îáúåêòà, îáåñïå÷èâàÿ âûïîëíåíèå îáúåêòîì
îäíîé èç åãî âñòðîåííûõ çàäà÷.
Íàïðèìåð, ìîæíî îïðåäåëèòü èìÿ àêòèâíîãî â äàííûé ìîìåíò ðàáî÷åãî
ëèñòà â Excel, âûïîëíÿÿ âûáîðêó ñòðîêè, ñîõðàíÿåìîé â ñâîéñòâå Name
ðàáî÷åãî ëèñòà. (Ñâîéñòâî Name ðàáî÷åãî ëèñòà ñîäåðæèò èìÿ ðàáî÷åãî ëèñòà,
êàê ïîêàçàíî íà ÿðëû÷êå ëèñòà.) ×òîáû èçìåíèòü èìÿ ðàáî÷åãî ëèñòà,
íåîáõîäèìî ïðèñâîèòü íîâóþ ñòðîêó ñâîéñòâó Name ýòîãî ðàáî÷åãî ëèñòà. Äëÿ
äîáàâëåíèÿ ðàáî÷åãî ëèñòà â ðàáî÷óþ êíèãó èñïîëüçóåòñÿ ìåòîä Add ðàáî÷åé
êíèãè.
Ïðåæäå ÷åì ïðèìåíÿòü ñâîéñòâà è ìåòîäû íåêîòîðîãî îáúåêòà, èõ ñëåäóåò
ñíà÷àëà îïðåäåëèòü.
 îïåðàòîðàõ VBA èñïîëüçóéòå ñëåäóþùèé îáùèé ñèíòàêñèñ äëÿ îïðåäåëå-
íèÿ ñâîéñòâà èëè ìåòîäà îáúåêòà:
Ñèíòàêñèñ
Object.identifier
Object — ëþáàÿ äîïóñòèìàÿ ññûëêà íà îáúåêò. Îáúåêòíûå ññûëêè ñîçäàþòñÿ çàäà-
íèåì ïåðåìåííîé äëÿ ññûëêè íà îáúåêò èëè èñïîëüçîâàíèåì ìåòîäîâ èëè ñâîéñòâ
îáúåêòîâ, âîçâðàùàþùèõ îáúåêòíóþ ññûëêó. Identifier — ëþáîå äîïóñòèìîå èìÿ
ñâîéñòâà èëè ìåòîäà; VBA îòîáðàæàåò ñîîáùåíèå î runtime-îøèáêå ïðè ïîïûòêå
èñïîëüçîâàòü ñâîéñòâà èëè ìåòîäû, êîòîðûå íå ÿâëÿþòñÿ â äåéñòâèòåëüíîñòè ÷à-
ñòüþ óêàçàííîãî îáúåêòà.
Ââåäåíèå â îáúåêòû è êîëëåêöèè 231
1: Sub ActDocum()
2: MsgBox "Àêòèâíûé äîêóìåíò: " & ActiveDocument.Name
3: End Sub
Îáðàòèòå âíèìàíèå íà òî, ÷òî òî÷êà (.) îòäåëÿåò îáúåêòíóþ ññûëêó îò èìåíè
ñâîéñòâà èëè ìåòîäà.  íåêîòîðîì ñìûñëå ýòà òî÷êà-ðàçäåëèòåëü òàêæå
ñîåäèíÿåò îáúåêòíóþ ññûëêó ñ èäåíòèôèêàòîðîì ñâîéñòâà èëè ìåòîäà.
Ïîñêîëüêó âû îáðàùàåòåñü ê ñâîéñòâó èëè ìåòîäó ïîñðåäñòâîì îáúåêòà,
íåîáõîäèìî îïðåäåëÿòü îáúåêòíóþ ññûëêó è èäåíòèôèêàòîð ñâîéñòâà èëè
ìåòîäà âìåñòå. Òî÷êà-ðàçäåëèòåëü óêàçûâàåò VBA, ãäå çàêàí÷èâàåòñÿ
îáúåêòíàÿ ññûëêà è ãäå íà÷èíàåòñÿ èäåíòèôèêàòîð ñâîéñòâà èëè ìåòîäà.  òî
æå ñàìîå âðåìÿ òî÷êà-ðàçäåëèòåëü ñîåäèíÿåò îáúåêòíóþ ññûëêó è èìÿ
ñâîéñòâà èëè ìåòîäà äëÿ îáðàçîâàíèÿ åäèíîãî èäåíòèôèêàòîðà â îïåðàòîðå
VBA.
Ðèñ. 6.1
Ðåçóëüòàò âûïîëíåíèÿ êîäà ëèñòèíãà 6.1
Îáúåêò Îïèñàíèå
Application Ñàìî ïðèëîæåíèå Excel (host-ïðèëîæåíèå)
Chart Äèàãðàììà â ðàáî÷åé êíèãå
Ýòîò îáúåêò ñîäåðæèò àòðèáóòû øðèôòà è ñòèëÿ äëÿ òåêñòà,
Font
îòîáðàæàåìîãî â ðàáî÷åì ëèñòå
Name Çàäàííîå èìÿ äëÿ äèàïàçîíà ÿ÷ååê ðàáî÷åãî ëèñòà
Äèàïàçîí ÿ÷ååê (îäíà èëè áîëåå) èëè èìåíîâàííûé äèàïàçîí
Range
â ðàáî÷åì ëèñòå
Ëþáîå îêíî â Excel; îêíà èñïîëüçóþòñÿ äëÿ îòîáðàæåíèÿ
Window
ðàáî÷èõ ëèñòîâ, äèàãðàìì è ò.ä.
Workbook Îòêðûòàÿ ðàáî÷àÿ êíèãà
Worksheet Ðàáî÷àÿ òàáëèöà â êíèãå
232 Ãëàâà 6
Îáúåêò Îïèñàíèå
Application Ñàìî ïðèëîæåíèå Word (host-ïðèëîæåíèå)
Bookmark Îòäåëüíàÿ çàêëàäêà â äîêóìåíòå
Document Îòêðûòûé äîêóìåíò
Ñîäåðæèò àòðèáóòû øðèôòà è ñòèëÿ äëÿ òåêñòà, îòîáðàæàåìîãî
Font
â îáúåêòå
Paragraph Îòäåëüíûé ïàðàãðàô â äîêóìåíòå
Range Íåïðåðûâíàÿ îáëàñòü â äîêóìåíòå
Âñòðîåííûé èëè îïðåäåëåííûé ïîëüçîâàòåëåì ôîðìàòèðóþùèé
Style
ñòèëü â äîêóìåíòå
Table Îòäåëüíàÿ òàáëèöà â äîêóìåíòå
TableOfContent
Îòäåëüíàÿ òàáëèöà ñîäåðæàíèÿ äîêóìåíòà
s
Template Øàáëîí äîêóìåíòà
Window Ëþáîå îêíî â Windows
Èç òàáëèö 6.1 è 6.2 âèäíî, ÷òî Excel è Windows èìåþò ïîõîæèå îáúåêòû.
Ðèñ. 6.2
Ñðåäà Excel
ïîäãîòîâëåíà äëÿ
çàïóñêà êîäà
ëèñòèíãà 10
Ðèñ. 6.3
Ðåçóëüòàò
âûïîëíåíèÿ êîäà
ëèñòèíãà 6.2
Ââåäåíèå â îáúåêòû è êîëëåêöèè 237
1: Sub ActDocum()
2:
3: MsgBox ActiveDocument.Name, , _
4: "Íàèìåíîâàíèå àêòèâíîãî äîêóìåíòà"
5:
6: MsgBox ActiveDocument.Path, , _
7: "Ïóòü ñîõðàíåíèÿ äîêóìåíòà"
8:
9: ActiveDocument.Close 'çàêðûòü àêòèâíûé äîêóìåíò
10:
11: MsgBox ActiveDocument.Name, , _
12: "Íàèìåíîâàíèå àêòèâíîãî äîêóìåíòà"
13: End Sub
Ðèñ. 6.4
Ðåçóëüòàò
ðàáîòû êîäà ëèñòèíãà
6.3
a) b)
c)
Ïðèìåð: ðàáî÷èå êíèãè Excel èìåþò ìåòîä Activate, êîòîðûé äåëàåò ðàáî-
÷óþ êíèãó àêòèâíîé è àêòèâèçèðóåò ïåðâûé ëèñò â êíèãå. Åñëè çàäàòü ïåðå-
ìåííóþ InstBook äëÿ ññûëêè íà îáúåêò ðàáî÷åé êíèãè, òî ïðèâåäåííûé íèæå
îïåðàòîð àêòèâèçèðóåò ýòó ðàáî÷óþ êíèãó (â ïîñëåäóþùèõ ðàçäåëàõ ýòîé ãëà-
âû îïèñûâàåòñÿ, êàê çàäàòü ïåðåìåííóþ äëÿ ññûëêè íà îáúåêò):
InstBook.Activate
Õîòÿ ìåòîä Activate íå èìååò àðãóìåíòîâ, ìíîãèå ìåòîäû îáúåêòîâ èìåþò
îäèí èëè áîëåå àðãóìåíòîâ. Â ñëåäóþùåì ïðèìåðå âûçûâàåòñÿ ìåòîä SaveAs
îáúåêòà ðàáî÷åé êíèãè Excel; èñïîëüçóåòñÿ îäèí îáÿçàòåëüíûé àðãóìåíò
è îäèí èç íåñêîëüêèõ íåîáÿçàòåëüíûõ àðãóìåíòîâ.
ActiveWorkbook.SaveAs Filename:="D\VBA2000\NEWFILE.xls", _
FileFormat:=xlNormal
Word-îáúåêòû Document òàêæå èìåþò ìåòîäû Activate è SaveAs ñ ïîõî-
æèìè àðãóìåíòàìè. Ïåðâûé îïåðàòîð, ïðèâåäåííûé íèæå, àêòèâèçèðóåò äîêó-
ìåíò, íà êîòîðûé ññûëàåòñÿ ïåðåìåííàÿ InstDoc, à âòîðîé — èñïîëüçóåò ìåòîä
SaveAs äîêóìåíòà äëÿ ñîõðàíåíèÿ àêòèâíîãî äîêóìåíòà ïîä äðóãèì èìåíåì:
InstDoc.Activate
ActiveDocument.SaveAs Filename:="E:\VBA2000\Chap10.doc"
Ìíîãèå îáúåêòû èìåþò ìåòîäû, êîòîðûå âîçâðàùàþò çíà÷åíèÿ òàê æå, êàê
ýòî äåëàåò ôóíêöèÿ. ×òîáû èñïîëüçîâàòü çíà÷åíèå, âîçâðàùàåìîå ìåòîäîì, íå-
îáõîäèìî ïîìåñòèòü ñïèñîê àðãóìåíòîâ ìåòîäà â êðóãëûå ñêîáêè è âêëþ÷èòü
âûçîâ ìåòîäà â îïåðàòîð ïðèñâàèâàíèÿ èëè äðóãîå âûðàæåíèå, òî÷íî òàê æå,
êàê ïðè èñïîëüçîâàíèè ôóíêöèè. Ìîæíî òàêæå èãíîðèðîâàòü ðåçóëüòàò, âîç-
âðàùàåìûé ìåòîäîì. ×òîáû èãíîðèðîâàòü ðåçóëüòàò ìåòîäà (åñëè îí èìååò ðå-
çóëüòàò), âûçîâèòå ìåòîä áåç êðóãëûõ ñêîáîê âîêðóã ñïèñêà àðãóìåíòîâ, êàê
åñëè áû ìåòîä íå âîçâðàùàë ðåçóëüòàòà.
Ïðèìåð: Excel-ìåòîä Address (êîòîðûé ïðèíàäëåæèò îáúåêòó Range) âîç-
âðàùàåò àäðåñ äèàïàçîíà ÿ÷ååê â ðàáî÷åì ëèñòå êàê ñòðîêó.  ñëåäóþùåì ïðè-
ìåðå ïîêàçàí îïåðàòîð VBA, êîòîðûé èñïîëüçóåò ìåòîä Address (myRange —
ýòî îáúåêòíàÿ ïåðåìåííàÿ, êîòîðàÿ ññûëàåòñÿ íà äèàïàçîí ÿ÷ååê â ðàáî÷åì
ëèñòå):
MsgBox myRange.Address
Åñëè ïåðåìåííàÿ myRange ññûëàåòñÿ íà ïåðâóþ ÿ÷åéêó â ðàáî÷åì ëèñòå, òî
îïåðàòîð MsgBox â ïðèâåäåííîé âûøå ñòðîêå ïðèìåðà îòîáðàæàåò ñòðîêó $A$1.
Ââåäåíèå â îáúåêòû è êîëëåêöèè 239
Âåðíèòåñü ê ëèñòó ñ èìåíåì Ëèñò äëÿ òåñòîâ â ðàáî÷åé êíèãå Excel, çàíåñè-
òå êàêóþ-ëèáî èíôîðìàöèþ â ÿ÷åéêè ëèñòà è âûäåëèòå êàêóþ-íèáóäü ÿ÷åéêó,
íàïðèìåð, êàê ïîêàçàíî íà ðèñ. 6.5. Âûïîëíèòå êîä ëèñòèíãà 6.4.
1: Sub TestMethods01()
2: 'òåñòèðîâàíèå ìåòîäà Clear
3:
4: 'ñîäåðæèìîå àêòèâíîé ÿ÷åéêè
5: 'äî ïðèìåíåíèÿ ìåòîäà Clear
6: MsgBox ActiveCell.Formula, , "Äî ìåòîäà Clear"
7:
8: 'âûïîëíåíèÿ Clear
9: ActiveCell.Clear
10:
11: 'ñîäåðæèìîå àêòèâíîé ÿ÷åéêè
12: 'ïîñëå ïðèìåíåíèÿ ìåòîäà Clear
13: MsgBox ActiveCell.Formula, , "Ïîñëå ìåòîäà Clear"
14:
15: 'Î÷èñòèòü äèàïàçîí ÿ÷ååê:
16: Range("C6:D7").Clear
17:
Ââåäåíèå â îáúåêòû è êîëëåêöèè 241
Ðèñ. 6.5
Ñîäåðæèìîå ëèñòà äî
âûïîëíåíèÿ êîäà
ëèñòèíãà 6.4
Ðèñ. 6.6
Ñîäåðæèìîå ëèñòà
ïîñëå âûïîëíåíèÿ
êîäà ëèñòèíãà 6.4
w LineEnding — àðãóìåíò òèïà Variant. Ñïîñîá, ïðè ïîìîùè êîòîðîãî Word îò-
ìå÷àåò êîíåö ñòðîêè èëè ïàðàãðàôà â äîêóìåíòå, ñîõðàíÿåìîì êàê òåêñòîâûé
ôàéë. Ìîæíî èñïîëüçîâàòü ñëåäóþùèå WdLineEndingType-êîíñòàíòû:
wdCRLF (çíà÷åíèå ïî óìîë÷àíèþ) èëè wdCROnly.
w AddBiDiMarks — àðãóìåíò òèïà Variant. Çíà÷åíèå True äîáàâëÿåò óïðàâëÿþ-
ùèå ñèìâîëû â âûõîäíîé ôàéë äëÿ ñîõðàíåíèÿ äâóñòîðîííåãî ðàñïîëîæåíèÿ
(bi-directional layout) òåêñòà â îðèãèíàëüíîì äîêóìåíòå.
 ñïðàâî÷íîé ñèñòåìå î÷åíü ïîäðîáíî ïðèâåäåíî îïèñàíèå êàæäîãî ìåòîäà, è ñëå-
äóåò ïî÷àùå ïðèáåãàòü ê åå óñëóãàì. Âïðî÷åì, Ðåäàêòîð VBA ïîñòîÿííî ïðåäëàãà-
åò ýòó ïîìîùü â ïðîöåññå âàøåé ðàáîòû ñ íèì.
Ðèñ. 6.7. Ñèñòåìà Auto Quick Info äëÿ ìåòîäîâ ðàáîòàåò òàê æå, êàê è äëÿ ôóíêöèé
Îáúåêòû â âûðàæåíèÿõ
Îáúåêòíîå âûðàæåíèå (object expression) — ýòî ëþáîå âûðàæåíèå VBA, êî-
òîðîå îïðåäåëÿåò îòäåëüíûé îáúåêò. Âñå îáúåêòíûå âûðàæåíèÿ äîëæíû âû-
÷èñëÿòüñÿ äî åäèíñòâåííîé îáúåêòíîé ññûëêè (ññûëêè íà îáúåêò); îáúåêòíûå
âûðàæåíèÿ èñïîëüçóþòñÿ ñ åäèíñòâåííîé öåëüþ — ñîçäàíèå ññûëîê íà ñïåöè-
ôè÷åñêèå îáúåêòû â âàøèõ ïðîãðàììàõ VBA.
Îáúåêòíîå âûðàæåíèå ìîæåò ñîñòîÿòü èç îáúåêòíûõ ïåðåìåííûõ, îáúåêò-
íûõ ññûëîê èëè îáúåêòíîãî ìåòîäà èëè ñâîéñòâà, êîòîðîå âîçâðàùàåò îáúåêò.
Âñå ïîñëåäóþùèå ïðèìåðû ÿâëÿþòñÿ ïðàâèëüíûìè îáúåêòíûìè âûðàæåíèÿ-
ìè (èñïîëüçóþùèìè îáúåêòû Excel):
åêò. Ðåçóëüòàò îïåðàöèè ñðàâíåíèÿ Is ðàâåí True, åñëè îáúåêòíûå ññûëêè ÿâëÿþò-
ñÿ îäíèìè è òåìè æå, èíà÷å — False.
MsgBox ActiveWorkBook.Comments
 ñòðîêàõ 17–19 ôîðìèðóåòñÿ èìÿ íîâîãî ôàéëà èç èìåíè òåêóùåãî. Ýòîò
îïåðàòîð èñïîëüçóåò ôóíêöèè Left è InStr, ïîìîãàÿ ñîçäàòü íîâîå èìÿ ôàéëà
äëÿ ðåçåðâíîé êîïèè àêòèâíîé ðàáî÷åé êíèãè. Ôóíêöèÿ InStr âîçâðàùàåò ïî-
ëîæåíèå ðàçäåëèòåëÿ èìåíè ôàéëà (.) â ñâîéñòâå Name îáúåêòà
ActiveWorkbook. (Ñâîéñòâî Name ðàáî÷åé êíèãè ñîäåðæèò èìÿ ôàéëà ðàáî÷åé
êíèãè). Ðåçóëüòàò ôóíêöèè InStr îïðåäåëÿåò, ñêîëüêî ñèìâîëîâ ôóíêöèÿ
Left êîïèðóåò èç ñâîéñòâà Name îáúåêòà ActiveWorkbook. Ïîñêîëüêó ôóíê-
öèÿ InStr âîçâðàùàåò ïîçèöèþ ðàçäåëèòåëÿ èìåíè ôàéëà (.), Left âîçâðàùà-
åò èìÿ ôàéëà, íå âêëþ÷àÿ ðàçäåëèòåëü è ðàñøèðåíèå. Ê ïîëó÷åííîìó èìåíè
äîáàâëÿåòñÿ ñòðîêà "_bp.xlsm".
Ðèñ. 6.8
Óáåäèòåñü â ïðàâèëüíîñòè êîììåíòàðèåâ ïðè
ðåçåðâíîì êîïèðîâàíèè àêòèâíîé ðàáî÷åé
êíèãè
Ýòà âåðñèÿ ïðîöåäóðû ðàáîòàåò òî÷íî òàê æå, êàê ïîêàçàííàÿ â ëèñòèí-
ãå 6.5. Çäåñü èñïîëüçóåòñÿ ñòðóêòóðà With…End With. Ñòðîêà 8 íà÷èíàåòñÿ
ñ êëþ÷åâîãî ñëîâà With, çà êîòîðûì ñëåäóåò îáúåêòíàÿ ññûëêà ActiveWork-
book, íà÷èíàÿ òàêèì îáðàçîì âñþ ñòðóêòóðó With…End With.
 ñòðîêå 10 ñîäåðæèìîå ñâîéñòâà ActiveWorkbook.Comments ïðèñâàèâà-
åòñÿ ñòðîêîâîé ïåðåìåííîé OldComment. Çàìåòèì, ÷òî íà ýòîò ðàç òîëüêî òî÷-
êà-ðàçäåëèòåëü (.) âêëþ÷àåòñÿ â íà÷àëî ñâîéñòâà Comments. Ïîñêîëüêó ýòîò
250 Ãëàâà 6
Êîëëåêöèÿ Íàçíà÷åíèå
AddIns Êîëëåêöèÿ íàäñòðîåê ïðèëîæåíèÿ.
Charts Êîëëåêöèÿ âñåõ òàáëèö (Chart sheets) â ðàáî÷åé êíèãå.
ChartObjects Êîëëåêöèÿ âñåõ îáúåêòîâ Chart â ðàáî÷åì ëèñòå.
Dialogs Êîëëåêöèÿ âñåõ äèàëîãîâ â ïðèëîæåíèè.
Êîëëåêöèÿ âñåõ îêîí â ïðèëîæåíèè, íåçàâèñèìî îò òîãî,
Windows
îòîáðàæàåòñÿ ëè îêíî íà ýêðàíå.
Êîëëåêöèÿ âñåõ îòêðûòûõ â äàííûõ ìîìåíò ðàáî÷èõ êíèã
Workbooks
â ïðèëîæåíèè.
Worksheets Êîëëåêöèÿ âñåõ ðàáî÷èõ ëèñòîâ â ðàáî÷åé êíèãå.
Ââåäåíèå â îáúåêòû è êîëëåêöèè 253
Êîëëåêöèÿ Íàçíà÷åíèå
AddIns Êîëëåêöèÿ íàäñòðîåê ïðèëîæåíèÿ.
Êîëëåêöèÿ âñåõ çàêëàäîê â äîêóìåíòå, ðàçäåëå èëè äèàïàçîíå
Bookmarks
(â çàâèñèìîñòè îò êîíòåéíåðà).
Êîëëåêöèÿ âñåõ ñèìâîëîâ â äîêóìåíòå, ðàçäåëå èëè äèàïàçîíå
Characters (â çàâèñèìîñòè îò êîíòåéíåðà). Êàæäûé ýëåìåíò â êîëëåêöèè
Characters ÿâëÿåòñÿ îáúåêòîì Range, ñîäåðæàùèì îäèí ñèìâîë.
Comments Êîëëåêöèÿ âñåõ êîììåíòàðèåâ äîêóìåíòà.
Dialogs Êîëëåêöèÿ äèàëîãîâ ïðèëîæåíèÿ.
Documents Êîëëåêöèÿ âñåõ îòêðûòûõ â äàííûé ìîìåíò äîêóìåíòîâ.
Êîëëåêöèÿ îáúåêòîâ Paragraph â äîêóìåíòå, ðàçäåëå èëè äèàïàçîíå
Paragraphs
(â çàâèñèìîñòè îò êîíòåéíåðà).
Êîëëåêöèÿ ðàçäåëîâ â äîêóìåíòå, ðàçäåëå èëè äèàïàçîíå
Sections
(â çàâèñèìîñòè îò êîíòåéíåðà).
Êîëëåêöèÿ îïèñàíèé ñòèëåé â äîêóìåíòå äëÿ âñòðîåííûõ
Styles
è îïðåäåëåííûõ ïîëüçîâàòåëåì ñòèëåé.
Templates Êîëëåêöèÿ âñåõ øàáëîíîâ ïðèëîæåíèÿ.
Êîëëåêöèÿ âñåõ îêîí â ïðèëîæåíèè èëè êîëëåêöèÿ âñåõ îêîí
Windows
(îòîáðàæàþùèõ äîêóìåíò â çàâèñèìîñòè îò êîíòåéíåðà).
1: Sub ActDocumShapes()
2: 'äîáàâëåíèå ôèãóð ê äîêóìåíòó
3:
4: 'äîáàâèòü ê êîëëåêöèè Shapes ïðÿìîóãîëüíèê:
5: ActiveDocument.Shapes.AddShape(msoShapeRectangle, _
6: 150, 150, 70, 70).Name = "Rectangle"
7:
8: 'äîáàâèòü ê êîëëåêöèè Shapes ïðàâûé òðåóãîëüíèê:
9: ActiveDocument.Shapes.AddShape(msoShapeRightTriangle, _
10: 300, 150, 70, 40).Name = "RightTriangle"
11:
12: 'äîáàâèòü "ãîðèçîíòàëüíî ðàêðó÷èâàþùèéñÿ ëèñò":
13: ActiveDocument.Shapes.AddShape(msoShapeHorizontalScroll, _
14: 450, 150, 70, 90).Name = "HorizontalScroll"
15:
16: 'âûäåëèòü âñå ôèãóðû êîëëåêöèè:
17: ActiveDocument.Shapes.SelectAll
18:
19: End Sub
11:
12: End Sub
Ðèñ. 6.10. Äîáàâëåííûå ê êîëëåêöèè Shapes ôèãóðû çàêðàøåíû êîäîì ëèñòèíãà 6.8
Ðèñ. 6.12
Ââîä òåêñòà äëÿ
îáúåêòà êîëëåêöèè
Shapes êîäîì
ëèñòèíãà 6.11
Ââåäåíèå â îáúåêòû è êîëëåêöèè 267
Ðèñ. 6.13
Èñïîëüçóéòå Object Browser äëÿ îïðåäåëåíèÿ
òîãî, êàêèå îáúåêòû
äîñòóïíû è êàêèå ñâîéñòâà è ìåòîäû
ïðèíàäëåæàò îïðåäåëåííîìó îáúåêòó
Ðèñ. 6.14
 îêíå Available References
îòìå÷åíû ÷åòûðå áèáëèîòåêè
îáúåêòîâ, ê îáúåêòàì êîòîðûõ âû
èìååòå äîñòóï ïî óìîë÷àíèþ — îíè
ïîäêëþ÷åíû
1  îáùåì ñëó÷àå äëÿ êàæäîé ïîçèöèè â ñòðîêå ìîæíî çàäàâàòü ñâîé äèàïàçîí äîïóñòèìûõ
ñèìâîëîâ. Â ðàññìàòðèâàåìîì êîäå òîëüêî ïåðâûé ñèìâîë âûõîäíîé ñòðîêè èìååò
äèàïàçîí ñèìâîëîâ, îòëè÷íûé îò äèàïàçîíà äëÿ îñòàëüíûõ ñèìâîëîâ, ÷òî îïðåäåëÿëîñü
ñïåöèôèêîé ðåàëüíîé çàäà÷è, êîòîðàÿ ïîñëóæèëà ïîâîäîì äëÿ âêëþ÷åíèÿ ýòîãî êîäà â
êíèãó.
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 277
Öèêëû Do
VBA èìååò ÷ðåçâû÷àéíî ìîùíûé îïåðàòîð öèêëà äëÿ ñîçäàíèÿ íåîïðåäå-
ëåííûõ ñòðóêòóð öèêëà â ïðîöåäóðàõ è ôóíêöèÿõ. Îáû÷íî âñå VBA-íåîïðåäå-
ëåííûå öèêëû ñòðîÿòñÿ ñ ïîìîùüþ îäíîãî îïåðàòîðà íåîïðåäåëåííîãî öèêëà:
îïåðàòîðà Do. Îïåðàòîð Do èìååò òàê ìíîãî îïöèé è ÿâëÿåòñÿ íàñòîëüêî ãèá-
êèì, ÷òî, â äåéñòâèòåëüíîñòè, îí ïðåäîñòàâëÿåò ÷åòûðå ðàçëè÷íûõ êîíñòðóê-
öèè öèêëà â äâóõ áàçîâûõ êàòåãîðèÿõ.
Äâå áàçîâûå êàòåãîðèè êîíñòðóêöèé öèêëà Do — ýòî öèêëû, êîòîðûå òåñòè-
ðóþò óñëîâèå äåòåðìèíàíòà äî âûïîëíåíèÿ òåëà öèêëà, è öèêëû, êîòîðûå òåñ-
òèðóþò óñëîâèå äåòåðìèíàíòà ïîñëå âûïîëíåíèÿ òåëà öèêëà.
Óñëîâèå äåòåðìèíàíòà äëÿ íåîïðåäåëåííîãî öèêëà çàäàåòñÿ ñ ïîìîùüþ ëî-
ãè÷åñêîãî âûðàæåíèÿ òàêèì æå îáðàçîì, êàêèì ñîçäàþòñÿ ëîãè÷åñêèå âûðà-
æåíèÿ äëÿ èñïîëüçîâàíèÿ ñ îïåðàòîðàìè If…Then.
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 281
Ðèñ. 7.2
VBA îòîáðàæàåò ýòî îêíî, êîãäà âû
íàæèìàåòå Esc èëè Ctrl+Break äëÿ
ïðåðûâàíèÿ âûïîëíÿþùåéñÿ
ïðîöåäóðû (èëè ìàêðîñà)
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 283
Öèêëû Do While
Ïåðâîé êîíñòðóêöèåé öèêëà, òåñòèðóþùåé ñâîå óñëîâèå äåòåðìèíàíòà äî
âûïîëíåíèÿ öèêëà, ÿâëÿåòñÿ Do While ñî ñëåäóþùèì ñèíòàêñèñîì:
Ñèíòàêñèñ
Do While Condition
Statements
Loop
Condition — ëîãè÷åñêîå âûðàæåíèå äëÿ äåòåðìèíàíòà öèêëà; Statements — îäèí,
íè îäíîãî èëè íåñêîëüêî îïåðàòîðîâ, êîòîðûå ñîñòàâëÿþò òåëî öèêëà. Êëþ÷åâîå
ñëîâî Loop ïîñëå Statements óêàçûâàåò íà îêîí÷àíèå òåëà öèêëà è îáîçíà÷àåò ìå-
ñòî, èç êîòîðîãî VBA âîçâðàùàåòñÿ â íà÷àëî öèêëà äëÿ ïðîâåðêè óñëîâèÿ äåòåðìè-
íàíòà (ñì. ñõåìó 7.2).
â ýòîé ôîðìå èñïîëüçóåòñÿ êëþ÷åâîå ñëîâî While, VBA âûïîëíÿåò öèêë, ïîêà
ëîãè÷åñêîå âûðàæåíèå, ïðåäñòàâëåííîå ñ ïîìîùüþ Condition, ðàâíî True.
Ïðè âûïîëíåíèè öèêëà Do While ñíà÷àëà òåñòèðóåòñÿ ëîãè÷åñêîå âûðàæå-
íèå, ïðåäñòàâëåííîå ñ ïîìîùüþ Condition; åñëè îíî ðàâíî True, VBA âûïîëíÿ-
åò îïåðàòîðû, ïðåäñòàâëåííûå ñ ïîìîùüþ Statements. Ïðè äîñòèæåíèè êëþ-
÷åâîãî ñëîâà Loop VBA âîçâðàùàåòñÿ â íà÷àëî öèêëà è ñíîâà ïðîâåðÿåò, ðàâíî
ëè True ëîãè÷åñêîå âûðàæåíèå Condition (ðåçóëüòàò îöåíêè). Åñëè Condition
ðàâíî True, VBA âûïîëíÿåò öèêë ñíîâà; åñëè âûðàæåíèå Condition ðàâíî
False, VBA ïðîäîëæàåò âûïîëíåíèå êîäà ñ ëþáûõ îïåðàòîðîâ ïîñëå êëþ÷åâî-
ãî ñëîâà Loop, ò.å. ïðåêðàùàåò ðàáîòó öèêëà.
Çàìåòüòå, ÷òî åñëè ëîãè÷åñêîå âûðàæåíèå, ïðåäñòàâëåííîå ñ ïîìîùüþ
Condition, ðàâíî False, êîãäà VBA âûïîëíÿåò îïåðàòîð Do While â ïåðâûé
ðàç, VBA ïðîñòî ïðîïóñêàåò öèêë, íå âûïîëíÿÿ åãî íè îäíîãî ðàçà. Ò.å. öèêë
Do While ïîçâîëÿåò íè ðàçó íå âûïîëíÿòü îïåðàòîðû âíóòðè íåãî.
 ëèñòèíãå 7.6 ïîêàçàí ïðîñòîé ïðèìåð öèêëà Do While, êîòîðûé íåîäíî-
êðàòíî ïîëó÷àåò íåêîòîðîå ÷èñëî îò ïîëüçîâàòåëÿ, îñòàíàâëèâàÿñü òîëüêî ïî-
ñëå òîãî, êàê ïîëüçîâàòåëü ââåäåò ñòîëüêî íå÷åòíûõ ÷èñåë, ÷òî èõ ñóììà ïðå-
âûñèò ÷èñëî 100.
1: Sub Test_DoWhile2()
2: 'ñ÷èòàåò íå÷åòíûå ÷èñëà, ââîäèìûå ïîëüçîâàòåëåì;
3: 'çàïîìèíàåò ñòðîêó ñ íå÷åòíûìè ÷èñëàìè;
4: 'îñòàíàâëèâàåòñÿ, êîãäà èõ ñóììà íå÷åòíûõ ÷èñåë ïðåâûñèò ÷èñëî,
5: 'ââîäèìîå â äèàëîãîâîì îêíå ïåðâûì;
6: 'âûâîäèò ñòðîêó ñ íå÷åòíûìè ÷èñëàìè â äèàëîãîâîì îêíå
7:
8: Const ocTitle = "Ñóììàòîð íå÷åòíûõ ÷èñåë"
9:
10: Dim Limit 'ïðåäåë ñóììû íå÷åòíûõ ÷èñåë
11: Dim OddSum As Integer 'ñóììà íå÷åòíûõ ÷èñåë
12: Dim OddStr As String 'ñòðîêà ñ íå÷åòíûìè ÷èñëàìè
13: Dim Num 'äëÿ ïðèåìà äàííûõ ïîëüçîâàòåëÿ
14:
15: OddStr = "" 'èíèöèàëèçàöèÿ âûõîäíîé ñòðîêè
16: OddSum = 0 'èíèöèàëèçàöèÿ ñóììû OddSum
17:
18: Limit = InputBox("Ââåäèòå ìàêñèìàëüíóþ ñóììó:", ocTitle)
19: If Len(Limit) = 0 Then Exit Sub
20:
21: Do While OddSum < Limit 'íà÷àëî öèêëà
22: Num = InputBox("Ââåäèòå ÷èñëî:", ocTitle)
23: If Len(Num) = 0 Then Exit Do
24: If (Num Mod 2) <> 0 Then 'ïðîâåðêà íà ÷åòíîñòü
25: OddSum = OddSum + Num 'èçìåíåíèå ñóììû OddSum
26: OddStr = OddStr & Num & " "
27: End If
28: Loop
29:
30: 'âûâîä ñòðîêè ñ íå÷åòíûìè ÷èñëàìè:
31: MsgBox prompt:="Âû ââåëè ñëåäóþùèå íå÷åòíûå " & _
32: "÷èñëà: " & Chr(13) & OddStr, _
33: Title:=ocTitle
34: End Sub
286 Ãëàâà 7
Öèêëû Do Until
Âàðèàíò Do While îïåðàòîðà Do — ýòî îäèí èç ñïîñîáîâ ñîçäàíèÿ îïåðàòîðà
Do, òåñòèðóþùåãî óñëîâèå äåòåðìèíàíòà äî âûïîëíåíèÿ òåëà öèêëà. Ìîæíî
òàêæå èñïîëüçîâàòü ôîðìó Do Until îïåðàòîðà Do äëÿ ñîçäàíèÿ öèêëà, òåñòè-
ðóþùåãî óñëîâèå äåòåðìèíàíòà äî âûïîëíåíèÿ òåëà öèêëà.
Îïåðàòîð Do Until èìååò ñëåäóþùèé îáùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Do Until Condition
Statements
Loop
Condition — ëîãè÷åñêîå âûðàæåíèå äëÿ äåòåðìèíàíòà öèêëà, a Statements — ýòî
îïåðàòîðû VBA, ñîñòàâëÿþùèå òåëî öèêëà. Êëþ÷åâîå ñëîâî Loop ïîñëå Statements
óêàçûâàåò íà êîíåö òåëà öèêëà è òàêæå îáîçíà÷àåò ìåñòî, èç êîòîðîãî VBA âîçâðà-
ùàåòñÿ â íà÷àëî öèêëà äëÿ ïðîâåðêè óñëîâèÿ äåòåðìèíàíòà (ñì. äèàãðàììó ñèí-
òàêñèñà öèêëà Do While).
Åñëè Condition ðàâíî True, VBA âûïîëíÿåò öèêë ñíîâà; åñëè — íåò, VBA ïðî-
äîëæàåò âûïîëíåíèå êîäà ñ ëþáûõ îïåðàòîðîâ ïîñëå ñòðîêè, ñîäåðæàùåé êëþ-
÷åâîå ñëîâî Loop, ò.å. ïðåêðàùàåò ðàáîòó öèêëà.
Çàìåòüòå, ÷òî íåçàâèñèìî îò çíà÷åíèÿ ëîãè÷åñêîãî âûðàæåíèÿ, ïðåäñòàâ-
ëåííîãî ñ ïîìîùüþ âûðàæåíèÿ Condition, ýòîò öèêë âñåãäà âûïîëíÿåòñÿ, ïî
êðàéíåé ìåðå, îäèí ðàç. (Ñðàâíèòå ñ öèêëàìè, ïðîâåðÿþùèìè óñëîâèå äåòåð-
ìèíàíòà äî âûïîëíåíèÿ òåëà öèêëà.)
Ïðîöåäóðà Test_DoLoopWhile â ëèñòèíãå 7.9 èñïîëüçóåò êîíñòðóêöèþ öèê-
ëà Do…Loop While äëÿ ïîëó÷åíèÿ â äèàëîãîâîì îêíå äàííûõ îò ïîëüçîâàòåëÿ
äî òåõ ïîð, ïîêà ïîëüçîâàòåëü íå ââåäåò ñëîâî «exit», óêàçûâàÿ íà òî, ÷òî ââîä
äàííûõ çàâåðøåí.
Âëîæåííûå öèêëû
Ìîæíî ïîìåùàòü öèêëû âíóòðü äðóãèõ öèêëîâ, àíàëîãè÷íî òîìó, êàê ìîæ-
íî ïîìåùàòü îïåðàòîðû If…Then îäèí â äðóãîé. Ïîìåùåíèå îäíîé ñòðóêòóðû
öèêëà â äðóãóþ íàçûâàþò âëîæåíèåì (nesting) öèêëîâ. Ìîæíî ïîìåùàòü
ñòðóêòóðû öèêëîâ ëþáîãî òèïà (ñìåøàííûå For è Do öèêëû) â ëþáîé óðîâåíü.
¨ Ïðè âëîæåíèè öèêëîâ íåîáõîäèìî ñîáëþäàòü ñëåäóþùèå ïðàâèëà:
¨ Ïðè âëîæåíèè öèêëîâ For…Next êàæäûé öèêë äîëæåí èìåòü ñâîþ óíè-
êàëüíóþ ïåðåìåííóþ ñ÷åò÷èêà.
¨ Ïðè âëîæåíèè öèêëîâ For Each…Next êàæäûé öèêë äîëæåí èìåòü ñâîþ
óíèêàëüíóþ element-ïåðåìåííóþ.
¨ Åñëè âû èñïîëüçóåòå îïåðàòîð Exit For èëè Exit Do âî âëîæåííîì öèê-
ëå, ýòèì îïåðàòîðîì çàêàí÷èâàåòñÿ òîëüêî âûïîëíÿåìûé â äàííûé ìî-
ìåíò öèêë; VBA ïðîäîëæàåò âûïîëíåíèå ñëåäóþùåãî öèêëà áîëåå âûñî-
êîãî óðîâíÿ.
Ðèñ. 7.3
Excel-ìåòîä Application.InputBox íå
ïîçâîëÿåò ââîäèòü íè÷åãî, êðîìå òîãî, ÷òî
îïðåäåëåíî åãî íåîáÿçàòåëüíûì
àðãóìåíòîì Type
Âëîæåííûå öèêëû Do
 ëèñòèíãå 7.9 ïîêàçàíà ïðîöåäóðà, èñïîëüçóþùàÿ âëîæåííûå öèêëû Do,
÷òîáû ïîëüçîâàòåëü ìîã âûïîëíèòü ââîä äàííûõ, íåîáõîäèìûõ äëÿ ïîëó÷åíèÿ
íàêëàäíîé. Âíåøíèé öèêë â ïðîöåäóðå MakeInv ïîëó÷àåò íîìåðà íàêëàäíûõ
îò ïîëüçîâàòåëÿ äî òåõ ïîð, ïîêà ïîëüçîâàòåëü íå îòìåíèò îêíî ââîäà. Âíóò-
ðåííèé öèêë â ïðîöåäóðå MakeInv ïîëó÷àåò ýëåìåíòû çàïèñåé íàêëàäíîé äî
òåõ ïîð, ïîêà ïîëüçîâàòåëü íå îòìåíèò îêíî ââîäà. Êîãäà âû áóäåòå èçó÷àòü ýòó
ïðîöåäóðó, ïîìíèòå, ÷òî ýòî ïðîñòî ýñêèçíàÿ ïðîöåäóðà. Íà ñàìîì äåëå âàì,
âåðîÿòíî, ïîòðåáóåòñÿ ïîëó÷èòü ãîðàçäî áîëüøå èíôîðìàöèè, ÷åì èñïîëüçóåò-
ñÿ çäåñü. Âàì, êîíå÷íî, ïðåäñòîèò òàêæå ñàìèì ïèñàòü êîä äëÿ çàíåñåíèÿ ââî-
äèìîé èíôîðìàöèè â êàêèå-ëèáî õðàíèëèùà äàííûõ. (Ëèñòèíã 7.12 áóäåò âû-
ïîëíÿòüñÿ è â Excel, è â Word).
28: pos = 1
29: Do Until False 'öèêë äëÿ ïîëó÷åíèÿ ýëåìåíòà ñòðîêè
30:
31: 'Ââîä íàèìåíîâàíèÿ òîâàðà
32: ItemNum1 = InputBox(prompt:= _
33: "Ââåäèòå íàèìåíîâàíèå òîâàðà", _
34: Title:="Íàêëàäíàÿ ¹" & InvcNum & "Ïîçèöèÿ ¹" & pos)
35: If Trim(ItemNum1) = "" Then
36: MsgBox prompt:="Ââîä ïîçèöèé äëÿ íàêëàäíîé ¹" & _
37: InvcNum & " çàâåðøåí.", _
38: Title:=miTitle
39: Exit Do
40: End If
41:
42: 'ââîä êîëè÷åñòâà òîâàðà
43: ItemNum2 = InputBox(prompt:= _
44: "Ââåäèòå êîëè÷åñòâî òîâàðà", _
45: Title:="Íàêëàäíàÿ ¹" & InvcNum & "Ïîçèöèÿ ¹" & pos)
46: If Trim(ItemNum2) = "" Then
47: MsgBox prompt:="Ââîä ïîçèöèé äëÿ íàêëàäíîé ¹" & _
48: InvcNum & " çàâåðøåí.", _
49: Title:=miTitle
50: Exit Do
51: End If
52:
53: 'îïåðàòîðû äëÿ ñîõðàíåíèÿ ââîäèìûõ äàííûõ, ïîëó÷åíèÿ
54: 'áîëüøåé èíôîðìàöèè îá ýëåìåíòå çàïèñè è ò.ä.
55: MsgBox prompt:="Ââåäåííûé ýëåìåíò ¹" & pos & " " & _
56: ItemNum1 & " êîë-âî " & ItemNum2 & _
57: " â íàêëàäíîé ¹" & InvcNum, _
58: Title:="Êîíòðîëüíàÿ âûäà÷à "
59:
60: pos = pos + 1
61: Loop
62: Loop
63:
64: MsgBox prompt:="Ââîä íàêëàäíîé çàâåðøåí", Title:=miTitle
65: End Sub
Ìàññèâû
Ìàññèâ (array) — ýòî êîëëåêöèÿ ïåðåìåííûõ, êîòîðûå èìåþò îáùèå èìÿ
è áàçîâûé òèï. Ìàññèâ ÿâëÿåòñÿ óäîáíûì ñïîñîáîì õðàíåíèÿ íåñêîëüêèõ ñâÿ-
çàííûõ ýëåìåíòîâ äàííûõ â åäèíîì êîíòåéíåðå äëÿ áîëüøåãî óäîáñòâà è ýô-
296 Ãëàâà 7
Ðàçìåðíîñòü ìàññèâà
 ÿçûêàõ ïðîãðàììèðîâàíèÿ îáû÷íî èñïîëüçóþòñÿ îäíîìåðíûå è ìíîãî-
ìåðíûå ìàññèâû, îäíè èç êîòîðûõ îïèñûâàþò îòíîñèòåëüíî ïðîñòûå, à äðó-
ãèå — áîëåå ñëîæíûå îáúåêòû.
Îäíîìåðíûå ìàññèâû
Íàèìåíåå ñëîæíûé ìàññèâ — ýòî ïðîñòî ñïèñîê ýëåìåíòîâ äàííûõ; òàêîãî
ðîäà ìàññèâ íàçûâàåòñÿ ïðîñòûì (simple) èëè îäíîìåðíûì (single-dimensional)
ìàññèâîì. Òàêîé ìàññèâ ìîæíî ïðåäñòàâèòü â âèäå òàáëèöû (ðèñ. 7.5). Êàæäûé
ýëåìåíò äàííûõ, õðàíèìûõ â ìàññèâå, íàçûâàåòñÿ ýëåìåíòîì (element) ìàññè-
âà. Ìàññèâ íà ðèñ. 7.5 èìååò 8 ýëåìåíòîâ; êàæäûé ýëåìåíò ñîõðàíÿåò ÷èñëî
òèïà Double. Çàìåòüòå, ÷òî ýëåìåíòû â ìàññèâå ïðîíóìåðîâàíû îò 0 äî 7, ÷òî ñî-
ñòàâëÿåò 8 ýëåìåíòîâ. Òàêàÿ ñèñòåìà íóìåðàöèè äîâîëüíî ðàñïðîñòðàíåíà â ïðî-
ãðàììèðîâàíèè è íàçûâàåòñÿ íóìåðàöèåé c íóëåâîé áàçîé (zero-based).
Äëÿ äîñòóïà ê äàííûì, õðàíÿùèìñÿ â îïðåäåëåííîì ýëåìåíòå ìàññèâà, ñëå-
äóåò óêàçûâàòü èìÿ ìàññèâà ñ ïîñëåäóþùèì ÷èñëîì, íàçûâàåìûì èíäåêñîì
(subscript èëè index) ýëåìåíòà. Èíäåêñ âñåãäà çàêëþ÷àåòñÿ â êðóãëûå ñêîáêè.
Íàïðèìåð, åñëè ìàññèâ íà ðèñ. 7.4 èìååò èìÿ DoubleArray, òî ñëåäóþùèé îïå-
ðàòîð ïðèñâàèâàåò ÷èñëî 0.11 ïåðåìåííîé DoubleAny:
DoubleAny = DoubleArray (6)
 ýòîì îïåðàòîðå ÷èñëî 6 ÿâëÿåòñÿ èíäåêñîì ìàññèâà; çàìåòüòå, ÷òî îí çà-
êëþ÷åí â êðóãëûå ñêîáêè è íå îòäåëÿåòñÿ ïðîáåëàìè îò èìåíè ìàññèâà. Ïî-
ñêîëüêó íóìåðàöèÿ ýëåìåíòîâ íà÷èíàåòñÿ ñ íóëÿ, ýëåìåíò, íà êîòîðûé ññûëà-
åòñÿ ýòîò îïåðàòîð, ÿâëÿåòñÿ, ôàêòè÷åñêè, ñåäüìûì ýëåìåíòîì ìàññèâà
DoubleArray.
Ðèñ. 7.4. Îäíîìåðíûé ÷èñëîâîé ìàññèâ; îäíîìåðíûå ìàññèâû — ýòî, â îñíîâíîì, ïðîñòî
ñïèñêè äàííûõ îäíîãî è òîãî æå òèïà
Ìíîãîìåðíûå ìàññèâû
Îäíîìåðíûå ìàññèâû õîðîøî ïîäõîäÿò äëÿ ïðåäñòàâëåíèÿ ïðîñòûõ ñïèñêîâ
äàííûõ. Îäíàêî ÷àñòî áûâàåò íåîáõîäèìî ïðåäñòàâèòü òàáëèöû äàííûõ â ïðî-
ãðàììàõ ñ îðãàíèçàöèåé äàííûõ â ôîðìàòå ñòðîê è ñòîëáöîâ, ïîäîáíî ÿ÷åéêàì
â ðàáî÷èõ ëèñòàõ Excel. Äëÿ ýòîãî íåîáõîäèìî èñïîëüçîâàòü ìíîãîìåðíûå
(multi-dimensional) ìàññèâû. Ïîñêîëüêó âû óæå èìååòå îïûò ðàáîòû ñ ÿ÷åéêà-
ìè Excel, òî íåò íåîáõîäèìîñòè â ïîäðîáíîì ðàçúÿñíåíèè ñóùíîñòè äâóìåðíî-
ãî ìàññèâà. Àäðåñ êàæäîé ÿ÷åéêè ëèñòà ñîñòîèò èç äâóõ ÷èñåë (èçìåðåíèé),
îäíî èç êîòîðûõ (íîìåð ñòðîêè) ÿâëÿåòñÿ ïåðâûì èíäåêñîì, à âòîðîå (íîìåð
ñòîëáöà) — âòîðûì èíäåêñîì ìàññèâà. Íà ïðèìåðå îðãàíèçàöèè ëèñòîâ Excel
ìîæíî ïðåäñòàâèòü è òðåõìåðíûå ìàññèâû. Çäåñü òðåòüèì èíäåêñîì ìàññèâà
ìîæåò áûòü íîìåð ëèñòà.
 VBA ìîæíî òàêæå ñîçäàâàòü ìàññèâû, èìåþùèå áîëåå òðåõ èçìåðåíèé;
ôàêòè÷åñêè, VBA ïîçâîëÿåò ñîçäàâàòü ìàññèâû, èìåþùèå äî 60 èçìåðåíèé. Ðà-
áîòà ñ ìàññèâàìè, èìåþùèìè 4 èëè áîëåå èçìåðåíèé, áûñòðî ñòàíîâèòñÿ çàïó-
òàííîé; ê ñ÷àñòüþ, âàì, âåðîÿòíî, íå ïðèäåòñÿ ðàáîòàòü ñ òàêèìè ìàññèâàìè.
×àùå âñåãî â ïðîãðàììèðîâàíèè èñïîëüçóþòñÿ îäíî- è äâóìåðíûå ìàññèâû.
Îáúÿâëåíèå ìàññèâîâ
Âû óæå çíàêîìû ñ îïåðàòîðîì Dim, èñïîëüçóåìûì äëÿ îáúÿâëåíèÿ ïåðå-
ìåííûõ. Ýòîò æå îïåðàòîð èñïîëüçóåòñÿ è äëÿ îáúÿâëåíèÿ ìàññèâîâ. Â äåéñò-
âèòåëüíîñòè, êëþ÷åâîå ñëîâî Dim ÿâëÿåòñÿ ñîêðàùåíèåì ñëîâà dimension (èç-
ìåðåíèå).  îðèãèíàëüíîì ÿçûêå ïðîãðàììèðîâàíèÿ BASIC êëþ÷åâîå ñëîâî
Dim èñïîëüçîâàëîñü èñêëþ÷èòåëüíî äëÿ èçìåíåíèÿ ðàçìåðîâ ìàññèâîâ
(dimensioning), îòñþäà è ñîêðàùåíèå Dim. Îäíàêî ñîâðåìåííûé ÿçûê VBA ðàñ-
øèðèë èñïîëüçîâàíèå êëþ÷åâîãî ñëîâà Dim äî èñïîëüçîâàíèÿ ñî âñåìè ïåðå-
ìåííûìè. Ñ ïîìîùüþ Dim ìîæíî îáúÿâëÿòü êàê îäíîìåðíûå, òàê è ìíîãîìåð-
íûå ìàññèâû.
Îáúÿâëåíèå ìàññèâà ñ ïîìîùüþ îïåðàòîðà Dim èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Dim VarName([Subscripts]) [As Type]
VarName — ëþáîå èìÿ äëÿ ìàññèâà, óäîâëåòâîðÿþùåå VBA-ïðàâèëàì äëÿ èìåí
èäåíòèôèêàòîðîâ. Subscripts — èçìåðåíèå (èçìåðåíèÿ) ìàññèâà. Ìîæíî îáúÿâëÿòü
ìàññèâû, èìåþùèå äî 60 èçìåðåíèé. Äëÿ îäíîìåðíîãî ìàññèâà âêëþ÷àåòñÿ îäèí
Subscripts; äëÿ äâóìåðíîãî ìàññèâà — äâà (îòäåëåííûå äðóã îò äðóãà çàïÿòîé) è òàê
äàëåå. Êàæäûé Subscripts äîáàâëÿåò íîâîå èçìåðåíèå â ìàññèâ.
Èñïîëüçîâàíèå ìàññèâîâ
Ïîñëå îáúÿâëåíèÿ ìàññèâà èñïîëüçîâàòü åãî â êîäå VBA äîâîëüíî ïðîñòî.
Êàê óæå îáúÿñíÿëîñü â íà÷àëå ýòîé ãëàâû, äëÿ äîñòóïà ê ýëåìåíòó ìàññèâà íå-
îáõîäèìî óêàçàòü èìÿ ìàññèâà, çà êîòîðûì ñëåäóåò çíà÷åíèå èíäåêñà, çàêëþ-
÷åííîå â êðóãëûå ñêîáêè.
Îáðàùåíèå ê ýëåìåíòó ìàññèâà èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
arrayName(validIndex1, [validIndex2]…)
Çäåñü arrayName — èìÿ ìàññèâà; validIndex1 — äîïóñòèìîå çíà÷åíèå èíäåêñà äëÿ
ïåðâîãî èçìåðåíèÿ ìàññèâà; validIndex2 — äîïóñòèìîå çíà÷åíèå èíäåêñà äëÿ âòî-
ðîãî èçìåðåíèÿ ìàññèâà, åñëè òàêîâîå èìååòñÿ. Íåîáõîäèìî ïðåäîñòàâëÿòü çíà÷å-
íèå èíäåêñà äëÿ êàæäîãî èçìåðåíèÿ ìàññèâà ïðè êàæäîì îáðàùåíèè ê êàêîìó-ëè-
áî ýëåìåíòó â ìàññèâå.
Ðèñ. 7.5
Ôðàãìåíò ââîäà 3-ãî ýëåìåíòà
ìàññèâà
Ðèñ. 7.6
Ðåçóëüòàò ðàáîòû êîäà ëèñòèíãà 7.14
Ðèñ. 7.7
Äðóæåñòâåííûé èíòåðôåéñ äëÿ ââîäà
ýëåìåíòà äâóìåðíîãî ìàññèâà
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 303
23: Loop
24:
25: For j = 1 To i - 1
26: str_msg = str_msg & Int_Array(j) & ", "
27: Next
28:
29: MsgBox "Ââåäåíî: " & str_msg, _
30: , "Âûâîä ðàíåå ââåäåííîãî ìàññèâà"
31:
32: End Sub
48:
49: 'ïîäãîòîâêà ñòðîêè âûäà÷è
50: For i = 1 To n
51: For j = 1 To m
52: str_msg = str_msg & Int_Array(i, j) & ", "
53: Next j
54:
55: str_msg = str_msg & Chr(13) 'ïåðåâîä ñòðîêè
56: Next i
57:
58: MsgBox "Ââåäåíî: " & Chr(13) & str_msg, _
59: , "Âûâîä ðàíåå ââåäåííîãî ìàññèâà"
60:
61: End Sub
Òèï ñòàòè÷åñêîãî
Äåéñòâèå îïåðàòîðà Erase
ìàññèâà
Ëþáîé ÷èñëîâîé òèï Óñòàíàâëèâàåò ýëåìåíòû ìàññèâà íà 0.
Óñòàíàâëèâàåò ýëåìåíòû ìàññèâà íà ñòðîêó íóëåâîé
Ëþáîé ñòðîêîâûé òèï äëèíû (""); óñòàíàâëèâàåò ñòðîêè ôèêñèðîâàííîé äëèíû
êàê âñå ñèìâîëû ïðîáåëîâ.
Variant Óñòàíàâëèâàåò ýëåìåíòû ìàññèâà íà Empty.
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 311
Òèï ñòàòè÷åñêîãî
Äåéñòâèå îïåðàòîðà Erase
ìàññèâà
Object Óñòàíàâëèâàåò ýëåìåíòû ìàññèâà íà Nothing.
Óñòàíàâëèâàåò êàæäóþ ïåðåìåííóþ â ïîëüçîâàòåëüñêîì
Ëþáîé òèïå èíäèâèäóàëüíî: ÷èñëåííûå òèïû óñòàíàâëèâàþòñÿ
ïîëüçîâàòåëüñêèé òèï íà 0, ñòðîêîâûå — íà ñòðîêè íóëåâîé äëèíû, Variant —
íà Empty, Object — íà Nothing.
Ðèñ. 7.9
Ðàçìåðíîñòü ìàññèâà, ïåðåäàâàåìîãî
â êà÷åñòâå àðãóìåíòà, ëåãêî îïðåäåëÿåòñÿ
â âûçûâàþùåé ïðîöåäóðå
Óïðàâëåíèå ôàéëàìè
8
ñ ïîìîùüþ VBA
Óïðàâëåíèå ôàéëàìè — ýòî îäíà èç èíòåðåñíåéøèõ çàäà÷ äëÿ ïðîãðàììè-
ñòà â ëþáîé ñèñòåìå ïðîãðàììèðîâàíèÿ. Áîëååå òîãî, ïðîãðàììèðîâàòü â ñðå-
äå, ñîñòîÿùåé èç ôàéëîâ, è íå óìåòü ðàáîòàòü ñ ýòèìè ôàéëàìè (íàõîäèòü, êî-
ïèðîâàòü èëè óäàëÿòü äîêóìåíò, ðàáî÷óþ êíèãó èëè äðóãîé ôàéë, çàïèñûâàòü
â ôàéë èëè ÷èòàòü èç íåãî äàííûå) — íå î÷åíü ïîëåçíîå çàíÿòèå. Visual Basic
for Applications ïðåäîñòàâëÿåò ðàçëè÷íûå îïåðàòîðû, ôóíêöèè è ìåòîäû äëÿ
âûïîëíåíèÿ îáùèõ çàäà÷ óïðàâëåíèÿ ôàéëàìè.
Óïðàâëåíèå ôàéëàìè
 ýòîì ðàçäåëå îïèñûâàåòñÿ, ÷òî òàêîå óïðàâëåíèå ôàéëàìè, îáñóæäàþòñÿ
íåêîòîðûå èç òèïè÷íûõ äåéñòâèé, êîòîðûå ìîæíî âûïîëíÿòü êàê ÷àñòü çàäà÷
óïðàâëåíèÿ ôàéëàìè, à òàêæå îïèñûâàþòñÿ VBA-ôóíêöèè, îïåðàòîðû è ìåòî-
äû óïðàâëåíèÿ ôàéëàìè.
Àòðèáóòû ôàéëà
Êàæäûé ôàéë, ñîõðàíåííûé íà ëþáîì äèñêå Windows (èëè áîëåå ðàííåé
âåðñèè DOS), èìååò àòðèáóòû (attributes). Íåçàâèñèìî îò êîíêðåòíîãî òèïà
äðàéâåðà äèñêà (æåñòêèé äèñê, ãèáêèé äèñê, RAM-drive, ZIP-drive, Syquest-
drive è òàê äàëåå) Windows è DOS èñïîëüçóþò àòðèáóòû ôàéëà äëÿ îïðåäåëå-
íèÿ òîãî, êàêèå äåéñòâèÿ ïî óïðàâëåíèþ ôàéëàìè äîïóñêàþòñÿ äëÿ ýòîãî ôàé-
ëà. Íàïðèìåð, Windows (èëè ëþáàÿ äðóãàÿ îïåðàöèîííàÿ ñèñòåìà) çàïðåùàåò
âàì (è ëþáûì ïðîãðàììàì ïðèëîæåíèé) óäàëÿòü, ìîäèôèöèðîâàòü èëè ïåðå-
èìåíîâûâàòü ôàéëû ñ àòðèáóòîì read-only.
Windows ñîçäàåò èíôîðìàöèþ îá àòðèáóòàõ ôàéëà, êîãäà âû èëè ïðîãðàììà
ïðèëîæåíèÿ, ðàáîòàþùàÿ íà âàøåì êîìïüþòåðå, ñîçäàåò íîâûé ôàéë. Â êà-
êîì-òî ñìûñëå, àòðèáóòû ôàéëà ïîäîáíû ñâîéñòâàì îáúåêòà: àòðèáóòû ôàéëà
äàþò ôàéëó íåêîòîðóþ õàðàêòåðèñòèêó â çàâèñèìîñòè îò êîíêðåòíûõ àòðèáó-
òîâ, êîòîðûå îí èìååò. Àòðèáóòû ôàéëà ÿâëÿþòñÿ ÷àñòüþ èíôîðìàöèè ôàéëà,
êîòîðóþ Windows ñîõðàíÿåò íà äðàéâåðå äèñêà. Windows ñîõðàíÿåò èíôîðìà-
öèþ îá àòðèáóòàõ ôàéëà âìåñòå ñ èíôîðìàöèåé îá èìåíè ôàéëà, ðàçìåðå, äàòå
è âðåìåíè.
Windows àâòîìàòè÷åñêè îáíîâëÿåò è ñîïðîâîæäàåò èíôîðìàöèþ îá àòðèáó-
òàõ ôàéëà. ×àùå âñåãî ïîëüçîâàòåëè íè÷åãî íå çíàþò îá àòðèáóòàõ ôàéëà,
è îáû÷íî íåò ïðè÷èíû, ïî êîòîðîé èì áûëî áû íåîáõîäèìî çíàòü, ÷òî òàêîå àò-
ðèáóòû.  íåêîòîðûõ æå ñëó÷àÿõ áûâàåò ïîëåçíî ïîíèìàòü è èñïîëüçîâàòü àò-
ðèáóòû ôàéëà.  ÷àñòíîñòè, íåîáõîäèìî ïîíèìàòü àòðèáóòû ôàéëà è èõ çíà÷å-
íèå äëÿ òîãî, ÷òîáû èñïîëüçîâàòü âñå ïðåèìóùåñòâà VBA-ôóíêöèè Dir.
Windows èñïîëüçóåò âñåãî ñåìü àòðèáóòîâ ôàéëà äëÿ îïðåäåëåíèÿ ðàçëè÷-
íûõ õàðàêòåðèñòèê ôàéëà. Êàæäûé îòäåëüíûé àòðèáóò ìîæåò îáúåäèíÿòüñÿ
ñ äðóãèìè àòðèáóòàìè, êðîìå àòðèáóòà Volume Label, íàïðèìåð, ôàéë ìîæåò
èìåòü îäíîâðåìåííî àòðèáóòû Hidden, System, Directory, Archive
è Read-Only. Â ñëåäóþùåì ñïèñêå ñîäåðæèòñÿ èìÿ êàæäîãî àòðèáóòà ôàéëà
è îïèñûâàåòñÿ åãî çíà÷åíèå.
w Archive. Àòðèáóò Archive óêàçûâàåò, èçìåíÿëñÿ ëè ôàéë ñî âðåìåíè,
êîãäà åãî ðåçåðâèðîâàëè ïîñëåäíèé ðàç ñ ïîìîùüþ backup-ïðîãðàììû,
òàêîé êàê BACKUP Windows, èëè backup-ïðîãðàììû äðóãèõ ïîñòàâ-
ùèêîâ, òàêèõ êàê Fastback!, BackIt, Norton Backup è äðóãèõ. Åñëè
ôàéë èìååò àòðèáóò Archive, ýòî îçíà÷àåò, ÷òî äëÿ ýòîãî ôàéëà íåîá-
316 Ãëàâà 8
Êîíñòàíòà
Çíà÷åíèå ×òî îçíà÷àåò
VBA
vbNormal 0 Normal.
vbReadOnly 1 Read-Only.
vbHidden 2 Hidden.
vbSystem 4 System.
vbVolume 8 Volume Label.
vbDirectory 16 Êàòàëîã èëè ïîäêàòàëîã äèñêà.
Archive. Åñëè óñòàíîâëåí, óêàçûâàåò, ÷òî ýòîò ôàéë
vbArchive 32
áûë èçìåíåí ñî âðåìåíè ïîñëåäíåãî ðåçåðâèðîâàíèÿ.
Óêàçàííîå èìÿ ôàéëà ÿâëÿåòñÿ àëèàñíûì. Äîñòóïíà
vbAlias 64
òîëüêî â Macintosh.
Ðèñ. 8.1
Ñîîáùåíèÿ VBA ïðè îøèáêå
â àðãóìåíòå ôóíêöèè GetAttr
ìè. Çíà÷åíèå â fAttr òåñòèðóåòñÿ øåñòü ðàç — îäèí ðàç äëÿ êàæäîãî âîçìîæ-
íîãî çíà÷åíèÿ àòðèáóòà. Ïîìíèòå, ÷òî çíà÷åíèå àòðèáóòà, êîòîðîå Windows
95/98 ñîõðàíÿåò ñ ôàéëîì, ÿâëÿåòñÿ ñóììîé âñåõ êîäîâûõ ÷èñåë äëÿ êàæäîãî
èç àòðèáóòîâ, êîòîðûå èìååò ôàéë. Åñëè àòðèáóò, íàëè÷èå êîòîðîãî ïðîâåðÿåò
îïðåäåëåííûé îïåðàòîð If…Then, ïðèñóòñòâóåò, òî ñòðîêà, ñîäåðæàùàÿ ñîîò-
âåòñòâóþùåå èìÿ àòðèáóòà, äîáàâëÿåòñÿ â ñòðîêó ñîîáùåíèÿ, ñîõðàíÿåìóþ
â mStr. Îïåðàòîð MsgBox â ñòðîêå 23 îòîáðàæàåò ñòðîêó ñîîáùåíèÿ, êîòîðóþ
ôîðìèðóþò ïðåäûäóùèå îïåðàòîðû.
 ñòðîêå 26 ñîäåðæèòñÿ îáúÿâëåíèå ïðîöåäóðû ListFileAttr, êîòîðàÿ ïðîñòî
âûçûâàåò ïðîöåäóðó ShowFA íåñêîëüêî ðàç, ïåðåäàâàÿ åé ðàçëè÷íûå èìåíà
ôàéëîâ. Âûïîëíåíèå ñòðîêè 30 ïðèâîäèò ê òîìó, ÷òî ShowFA îòîáðàæàåò àòðè-
áóòû ôàéëà äëÿ ôàéëà IO.Sys. Ýòîò ôàéë ÿâëÿåòñÿ ÷àñòüþ îïåðàöèîííîé ñèñòå-
ìû Windows è âñåãäà íàõîäèòñÿ â êîðíåâîì êàòàëîãå äèñêà àâòîçàãðóçêè. Ïî-
ñêîëüêó IO.SYS ÿâëÿåòñÿ ÷àñòüþ îïåðàöèîííîé ñèñòåìû Windows, îí èìååò àò-
ðèáóò ôàéëà System; îí èìååò òàêæå àòðèáóò Read-Only äëÿ ïðåäîòâðàùåíèÿ
íå÷àÿííîãî óäàëåíèÿ ýòîãî âàæíîãî ôàéëà; êðîìå òîãî, ýòîò ôàéë èìååò àòðèáóò
Hidden, ÷òîáû îí îáû÷íî íå ïîÿâëÿëñÿ â ïàïêå ðàáî÷åãî ñòîëà Windows èëè
â ñïèñêàõ êàòàëîãà Ïðîâîäíèêà. Ïðè âûïîëíåíèè ïðîöåäóðû ListFileAttr ïî-
ñëåäîâàòåëüíî îòîáðàæàþòñÿ äèàëîãîâûå îêíà, ïîêàçàííûå íà ðèñ. 8.2.
Ðèñ. 8.2
Òàêèå îêíà
ïîñëåäîâàòåëüíî
îòîáðàæàþòñÿ êîäîì
ëèñòèíãà 8.1
Ïðè òàêèõ àòðèáóòàõ Dir áóäåò íàõîäèòü ëþáîé ôàéë â çàäàííîì êàòàëîãå,
âêëþ÷àÿ ëþáûå ïîäêàòàëîãè â íåì.
 ñòðîêå 45 âûïîëíÿåòñÿ ïåðâûé âûçîâ ôóíêöèè Dir ñ èñïîëüçîâàíèåì
ïóòè êàòàëîãà â pName ñ äîáàâëåííîé â íåãî ñòðîêîé "*.*" (äëÿ íàõîæäåíèÿ
âñåõ ôàéëîâ) è ïåðåìåííîé sAttr (ñ àòðèáóòàìè ôàéëîâ). Ðåçóëüòàò ôóíêöèè
Dir ïðèñâàèâàåòñÿ ïåðåìåííîé fName.
 ñòðîêàõ 46–50 ñîäåðæèòñÿ îïåðàòîð If...Then, êîòîðûé îöåíèâàåò ñòðî-
êó, âîçâðàùàåìóþ ôóíêöèåé Dir è ñîõðàíåííóþ â ïåðåìåííîé fName. Îïåðà-
òîð ïðîâåðÿåò: 1) ÿâëÿåòñÿ ëè ïåðåìåííàÿ fName ïóñòîé ñòðîêîé, 2) íå ñîäåð-
æèò ëè fName ñòðîêó, ñîñòîÿùóþ èç îäíîé òî÷êè (.), 3) íå ñîäåðæèò ëè fName
ñòðîêó, ñîñòîÿùóþ èç äâóõ òî÷åê (..). Ýòè îñîáûå ñòðîêè èñïîëüçóþòñÿ ñèñòå-
ìîé ôàéëîâ Windows äëÿ îáîçíà÷åíèÿ òåêóùåãî (.) è ðîäèòåëüñêîãî êàòàëî-
ãà (..). Õîòÿ òàêèå îñîáûå èìåíà ôàéëîâ ÿâëÿþòñÿ êàòàëîãàìè è ôóíêöèÿ Dir
áóäåò ñîîáùàòü îá èõ ñóùåñòâîâàíèè ñ òàêèì àòðèáóòîì è ñïåöèôèêàöèåé óíè-
âåðñàëüíîãî ñîïîñòàâëåíèÿ, êàêèå èñïîëüçóþòñÿ â äàííîì ïðèìåðå, îíè, íà ñà-
ìîì äåëå, íå ñóùåñòâóþò íà äèñêå, è ëþáàÿ ïîïûòêà ïîëó÷èòü èõ àòðèáóòû
ñ ïîìîùüþ GetAttr ïðèâåäåò ê âîçíèêíîâåíèþ runtime-îøèáêè.
Åñëè fName íå ÿâëÿåòñÿ ïóñòîé ñòðîêîé è íå ñîäåðæèò ñïåöèàëüíûõ ýëåìåí-
òîâ (. èëè ..), VBA âûïîëíÿåò îïåðàòîð â ñòðîêå 48, êîòîðûé óñòàíàâëèâàåò ñ÷åò-
÷èê íàéäåííûõ ôàéëîâ â 1 (ïåðåìåííàÿ fCount), è âûïîëíÿåò îïåðàòîð â ñòðîêå
49, êîòîðûé âûçûâàåò ïðîöåäóðó ShowFA äëÿ çàïèñè â î÷åðåäíóþ ÿ÷åéêó òåêó-
ùåãî ëèñòà îòêðûòîé ðàáî÷åé êíèãè èìåíè ôàéëà è åãî ôàêòè÷åñêèõ àòðèáóòîâ.
Òåïåðü, êîãäà ïåðâûé ñîâïàäàþùèé ôàéë íàéäåí, íåîáõîäèìî èñïîëüçîâàòü
ôîðìàò âòîðîé ñòóïåíè ôóíêöèè Dir, ÷òîáû íàéòè îñòàëüíûå ôàéëû â êàòàëî-
ãå. Â ñòðîêàõ 52–60 ñîäåðæèòñÿ öèêë Do, êîòîðûé âûïîëíÿåòñÿ, ïîêà fName
íå ÿâëÿåòñÿ ïóñòîé ñòðîêîé. Åñëè õîòÿ áû îäèí ñîâïàäàþùèé ôàéë áûë íàé-
äåí â âûçîâå ôóíêöèè Dir (â ñòðîêå 45), òî ýòîò öèêë áóäåò âûïîëíÿòüñÿ, ïî
êðàéíåé ìåðå, îäèí ðàç.
Îáðàòèòå îñîáîå âíèìàíèå íà ñòðîêó 53. Ýòîò îïåðàòîð ñíîâà âûçûâàåò
ôóíêöèþ Dir áåç àðãóìåíòîâ. Ïðè òàêîì âûçîâå ôóíêöèè Dir VBA «ïîëàãà-
åò», ÷òî ïîëüçîâàòåëü õî÷åò íàéòè áîëüøå ôàéëîâ, ñîâïàäàþùèõ ñî ñïåöèôè-
êàöèåé äëÿ àðãóìåíòîâ ïóòè è àòðèáóòîâ, êîòîðûå èñïîëüçîâàëèñü â ïîñëåä-
íåì âûçîâå Dir. Ôóíêöèÿ Dir âîçâðàùàåò ñëåäóþùèé ôàéë â êàòàëîãå, ñîâïà-
äàþùèé ñ ïðåäûäóùèìè ñïåöèôèêàöèÿìè èìåíè è àòðèáóòîâ. Åñëè ôàéëîâ
áîëüøå íåò, Dir âîçâðàùàåò ïóñòóþ ñòðîêó.
Êîãäà âñå ñîâïàäàþùèå ôàéëû â êàòàëîãå áóäóò íàéäåíû, Dir âîçâðàùàåò ïóñ-
òóþ ñòðîêó è öèêë ïðåêðàùàåò âûïîëíÿòüñÿ. Îïåðàòîð â ñòðîêå 62 îòîáðàæàåò
îêíî ñîîáùåíèÿ, óêàçûâàþùåå, ñêîëüêî ñîâïàäàþùèõ ôàéëîâ áûëî íàéäåíî. Íà
ðèñ. 8.3 ïðåäñòàâëåí ðåçóëüòàò ðàáîòû êîäà ýòîãî ëèñòèíãà ïðè ââåäåííîé â îêíå
InputBox ñòðîêå «H:\JURNALs\Delphi» (êîíå÷íî, íà êàêîì-òî ñëó÷àéíîì êîì-
ïüþòåðå).
21: Title:=iTitle
22: Exit Sub
23: End If
24:
25: Workbooks.Open Filename:=fName
26:
27: ShtName = InputBox("Ââåäèòå íàèìåíîâàíèå ëèñòà")
28: ActiveWorkbook.Sheets(ShtName).Select
29: MsgBox prompt:="Êíèãà " & fName & _
30: " îòêðûòà, ëèñò " & ShtName & _
31: " âûáðàí ", _
32: Title:=iTitle & " (Çàâåðøåíèå)"
33: End Sub
Èìÿ â äèàëîãîâîì îêíå ìîæíî âûáðàòü òî÷íî òàê æå, êàê â Excel-îêíå Open.
Êîãäà âû âûáèðàåòå êíîïêó Open (Îòêðûòü), ìåòîä GetOpenFilename âîçâðàùà-
åò ñòðîêó, ñîäåðæàùóþ èìÿ ôàéëà, áóêâåííóþ ìåòêó äèñêà è ïîëíûé ïóòü êàòà-
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 329
æàåìîå Excel, êîãäà ïîëüçîâàòåëü âûáèðàåò êîìàíäó File | Save As…. Ìåòîä
GetSaveAsFilename òàêæå âîçâðàùàåò ñòðîêó, ñîäåðæàùóþ èìÿ ôàéëà, êîòî-
ðîå âûáèðàåò ïîëüçîâàòåëü, âêëþ÷àÿ áóêâåííóþ ìåòêó äèñêà è ïîëíûé ïóòü
êàòàëîãà. Åñëè ïîëüçîâàòåëü îòìåíÿåò äèàëîãîâîå îêíî, GetSaveAsFilename
âîçâðàùàåò Boolean-çíà÷åíèå False.
Ìåòîä GetSaveAsFilename èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
object.GetSaveAsFilename(initialFilename, fileFilter, filterIndex, ti-
tle,buttonText)
Ìåòîä GetSaveAsFilename èìååò ïî÷òè òàêèå æå àðãóìåíòû è ñèíòàêñèñ, êàê ìå-
òîä GetOpenFilename.  ýòîé ñèíòàêñè÷åñêîé êîíñòðóêöèè object — ýòî ññûëêà íà
îáúåêò Application, fileFilter — âûðàæåíèå String, ôîðìàòèðîâàííîå äëÿ çàäàíèÿ
ôèëüòðîâ ôàéëà, ïåðå÷èñëåííûõ â ðàñêðûâàþùåìñÿ ñïèñêå Save as type;
filterIndex — ÷èñëåííîå âûðàæåíèå, óêàçûâàþùåå, êàêîé ôèëüòð ôàéëà äîëæåí
èñïîëüçîâàòü VBA â êà÷åñòâå ôèëüòðà ïî óìîë÷àíèþ, à title — âûðàæåíèå String
äëÿ ñòðîêè çàãîëîâêà äèàëîãîâîãî îêíà. Åñëè ïðîïóñêàåòñÿ àðãóìåíò title, VBA
îòîáðàæàåò äèàëîãîâîå îêíî ñ îáû÷íûì çàãîëîâêîì SaveAs.
Àðãóìåíò buttonText — íåîáÿçàòåëüíûé ïàðàìåòð òèïà Variant. Èñïîëüçóåòñÿ
òîëüêî â Macintosh.
Ìåòîä GetSaveAsFilename èìååò åùå îäèí àðãóìåíò — initialFilename, êîòîðûé
ïðåäñòàâëÿåò ëþáîå äîïóñòèìîå èìÿ ôàéëà. Åñëè óêàçàòü ýòîò íåîáÿçàòåëüíûé àð-
ãóìåíò, èìÿ ôàéëà, êîòîðîå çàäàåòñÿ äëÿ initialFilename, ïîÿâëÿåòñÿ â òåêñòîâîì
îêíå File Name, êîãäà äèàëîãîâîå îêíî Save As îòîáðàæàåòñÿ ïåðâûé ðàç.
×èñëîâîå
×òî îçíà÷àåò
çíà÷åíèå
–2 Äèàëîãîâîå îêíî áûëî çàêðûòî ñ ïîìîùüþ êíîïêè Îòìåíà.
Äèàëîãîâîå îêíî áûëî çàêðûòî ùåë÷êîì êíîïêè Îòêðûòü
–1
â äèàëîãîâûõ îêíàõ wdDialogFileOpen è wdDialogFileSaveAs.
0 Äèàëîãîâîå îêíî áûëî îòìåíåíî.
Êîìàíäíàÿ êíîïêà; 1 — äëÿ ïåðâîé êîìàíäíîé êíîïêè, 2 —
>0
äëÿ âòîðîé è òàê äàëåå.
1: Sub OpenWordFile()
2: 'îòêðûâàåò óêàçàííûé äîêóìåíò è ïåðåìåùàåò
3: 'óêàçàòåëü âñòàâêè â êîíåö äîêóìåíòà
4:
5: Const iTitle = "Îòêðûòèå ôàéëà"
6:
7: Dim fName As String
8: Dim lRetVal As Long
9:
10: With Application.Dialogs(wdDialogFileOpen)
11: lRetVal = .Display
12: fName = .Name
13: End With
14:
334 Ãëàâà 8
Ðèñ. 8.7.
Word-äèàëîãîâîå îêíî
Open (Îòêðûòèå
äîêóìåíòà),
îòîáðàæàåìîå
îïåðàòîðîì â ñòðîêå 11
ëèñòèíãà 8.7
âàåò, ÷òî äèàëîãîâîå îêíî áûëî çàêðûòî ùåë÷êîì íà êíîïêå Îòêðûòü (èëè ýêâè-
âàëåíòíûì äåéñòâèåì, òàêèì êàê äâîéíîé ùåë÷îê íà èìåíè ôàéëà). Åñëè îêíî
íå áûëî çàêðûòî ùåë÷êîì íà êíîïêå Îòêðûòü èëè åå ýêâèâàëåíòå, òî îòîáðàæà-
åòñÿ ñîîáùåíèå î òîì, ÷òî îïåðàöèÿ áûëà îòìåíåíà, èíà÷å — âûïîëíåíèå êîäà
ïðîäîëæàåòñÿ ñî ñòðîêè 21.
 ñòðîêå 21 âûáðàííûé ôàéë îòêðûâàåòñÿ, à â ñòðîêå 22 êóðñîð ïîìåùàåòñÿ
â êîíåö äîêóìåíòà. Íàêîíåö, â ñòðîêàõ 24–26 îòîáðàæàåòñÿ ñîîáùåíèå îá óñ-
ïåøíîì çàâåðøåíèè îïåðàöèè.
Ðèñ. 8.8.
Word-äèàëîãîâîå
îêíî, îòîáðàæàåìîå
îïåðàòîðîì â ñòðîêå
21 ëèñòèíãà 8.8
(current folder) — ýòî ïàïêà äèñêà, êîòîðóþ Excel (èëè Word) èñïîëüçóåò, åñëè
íå óêàçûâàåòñÿ îïðåäåëåííàÿ ïàïêà.
1: Sub ShowCurDriveDir()
2: 'îòîáðàæàåò òåêóùèé äðàéâåð è êàòàëîã
3:
4: Dim DirName As String 'äëÿ èìåíè êàòàëîãà
5: Dim DirLetter As String 'äëÿ áóêâû äèñêà
6:
7: DirName = CurDir() 'ïîëó÷èòü òåêóùóþ ïàïêó äèñêà
8:
9: 'âçÿòü ïåðâûé ñèìâîë èç DirName - áóêâà äèñêà:
10: DirLetter = Left(DirName, 1)
11:
12: 'âûâîä íà ýêðàí:
13: MsgBox "Òåêóùèé äðàéâåð: " & DirLetter & _
14: Chr(13) & "Òåêóùèé êàòàëîã: " & DirName
15:
16: 'ïîëó÷èòü òåêóùèé êàòàëîã íà äðàéâåðå C:
17: DirName = CurDir("C") '
18: MsgBox "Òåêóùèé êàòàëîã íà äðàéâåðå C: " & _
19: DirName
20: End Sub
DOS-êîìàíäû MKDIR èëè MD èëè êîìàíäà WINDOWS File | New | Folder (Ôàéë |
Ñîçäàòü | Ïàïêà). (MkDir — ýòî àááðåâèàòóðà ñëîâ make directory.)
Îïåðàòîð MkDir èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
MkDir path
Àðãóìåíò path ïðåäñòàâëÿåò ëþáîå âûðàæåíèå òèïà String, êîòîðîå èìååò ðåçóëü-
òàòîì äîïóñòèìûé ïóòü ïàïêè; path ìîæåò (íåîáÿçàòåëüíî) ñîäåðæàòü áóêâåííóþ
ìåòêó äèñêà. Åñëè áóêâåííàÿ ìåòêà äèñêà íå âêëþ÷åíà â àðãóìåíò path, MkDir ñîç-
äàåò íîâóþ ïàïêó íà òåêóùåì äèñêå. Åñëè path óêàçûâàåò èìåþùóþñÿ óæå ïàïêó
èëè âêëþ÷àåò íåäîïóñòèìûå ñèìâîëû èìåíè ôàéëà, VBA îòîáðàæàåò ñîîáùåíèå
î runtime-îøèáêå. Ïðè ïîïûòêå ñîçäàòü ïîäïàïêó â ïàïêå, êîòîðîé íå ñóùåñòâóåò,
VBA òàêæå îòîáðàæàåò ñîîáùåíèå î runtime-îøèáêå. Èñïîëüçîâàíèå MkDir íå èçìå-
íÿåò òåêóùåãî äèñêà èëè ïàïêè.
ïðè ïîïûòêå êîïèðîâàòü ôàéë, êîãäà íåò äîñòàòî÷íîãî äèñêîâîãî ïðîñòðàíñòâà äëÿ
ñîõðàíåíèÿ êîïèðóåìîãî ôàéëà.
Êîãäà VBA âûïîëíÿåò îïåðàòîð FileCopy â ñòðîêå 22, ôàéë (èìÿ êîòîðîãî
ñîõðàíåíî â sName) êîïèðóåòñÿ ñ íîâûì èìåíåì íà íîâûé äèñê è â íîâóþ ïàï-
êó, ñîõðàíåííûå â dName. Ïîñëå êîïèðîâàíèÿ ôàéëà öèêë Do ïîâòîðÿåòñÿ.
Óäàëåíèå ôàéëà
Äëÿ óäàëåíèÿ ôàéëà èñïîëüçóéòå îïåðàòîð ñ äðàìàòè÷åñêèì èìåíåì Kill.
Îïåðàòîð Kill âûïîëíÿåò òó æå çàäà÷ó, ÷òî DOS-êîìàíäà DEL èëè êîìàíäà
File | Delete (Ôàéë | Óäàëèòü) â Windows.
Îïåðàòîð Kill èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Kill pathname
Àðãóìåíò pathname — ýòî ëþáîå âûðàæåíèå òèïà String, èìåþùåå ðåçóëüòàòîì
äîïóñòèìóþ ñïåöèôèêàöèþ èìåíè ôàéëà; pathname ìîæåò âêëþ÷àòü áóêâåííóþ
ìåòêó äèñêà, ïîëíûé ïóòü ïàïêè è ñèìâîëû óíèâåðñàëüíîãî ñîïîñòàâëåíèÿ (* è ?).
Åñëè pathname âêëþ÷àåò ñèìâîëû óíèâåðñàëüíîãî ñîïîñòàâëåíèÿ, Kill óäàëÿåò
âñå ôàéëû, ñîâïàäàþùèå ñî ñïåöèôèêàöèåé â pathname.
Ðèñ. 8.10
Ïðîöåäóðà ShowFDS èñïîëüçóåò ôóíêöèè
FileLen è FileDateTime äëÿ ñáîðà èíôîðìàöèè
î ðàçìåðå ôàéëà è î òîì, êîãäà îí áûë
ìîäèôèöèðîâàí ïîñëåäíèé ðàç
êîíåö, îïåðàòîð MsgBox â ñòðîêàõ 16–18 îòîáðàæàåò èìÿ ôàéëà, åãî ðàçìåð
è äàòó è âðåìÿ, êîãäà ýòîò ôàéë ìîäèôèöèðîâàëñÿ ïîñëåäíèé ðàç.
 ñòðîêàõ 21–30 ñîäåðæèòñÿ ïðîöåäóðà, òåñòèðóþùàÿ ïðîöåäóðó
ShowFDS. Ýòà ïðîöåäóðà èñïîëüçóåò ìåòîä GetOpenFilename, ÷òîáû ïîëüçî-
âàòåëü ìîã âûáðàòü ôàéë, à çàòåì âûçûâàåò ïðîöåäóðó ShowFDS.
Ýëåìåíòû äèàëîãîâûõ
9
îêîí
Äî ñèõ ïîð âû ó÷èëèñü èñïîëüçîâàòü äèàëîãîâûå îêíà, êîòîðûå âñòðîåíû
â VBA, à èìåííî, ôóíêöèè MsgBox è InputBox. Õîòÿ MsgBox è InputBox ïðè-
äàþò âàøèì ïðîãðàììàì ãèáêîñòü, êîòîðîé ìîãóò îáëàäàòü òîëüêî èíòåðàê-
òèâíûå ïðîãðàììû, èõ âîçìîæíîñòè â èçâåñòíîé ñòåïåíè îãðàíè÷åíû. Ïðè
ðàçðàáîòêå áîëåå ñëîæíûõ ïðîãðàìì âû çàõîòèòå âûâîäèòü äèàëîãîâûå îêíà,
êîòîðûå äàþò âîçìîæíîñòü ïîëüçîâàòåëÿì âàøèõ ïðîãðàìì çàäàâàòü ïðè ïî-
ìîùè îäíîãî äèàëîãîâîãî îêíà ñðàçó íåñêîëüêî îïöèé, âûáèðàòü ïóíêòû èç
ñïèñêà èëè ââîäèòü â îäíîì îêíå íåñêîëüêî çíà÷åíèé ïîäîáíî òîìó, êàê ýòî
ìîæíî äåëàòü ñ ïîìîùüþ äèàëîãîâûõ îêîí, âûâîäèìûõ Word, Excel è äðóãè-
ìè ïðèëîæåíèÿìè Windows. ×àñòî ó âàñ áóäåò âîçíèêàòü íåîáõîäèìîñòü âìå-
ñòî âñòðîåííûõ îêîí, ïðèíàäëåæàùèõ Word èëè Excel, èñïîëüçîâàòü äèàëîãî-
âûå îêíà, ñîçäàííûå ñïåöèàëüíî äëÿ âàøåé ïðîãðàììû.
VBA ïîçâîëÿåò ñîçäàâàòü è ïðèìåíÿòü ïîëüçîâàòåëüñêèå1 äèàëîãîâûå îêíà
â íàïèñàííûõ âàìè ïðîãðàììàõ è ïðîöåäóðàõ ïðè ïîìîùè äîáàâëåíèÿ â ïðî-
åêò îáúåêòà UserForm. Èñïîëüçóÿ VBA-ôîðìû ïîëüçîâàòåëÿ (VBA User
Forms), âû ìîæåòå ñîçäàâàòü äèàëîãîâûå îêíà äëÿ âûâîäà äàííûõ èëè ïîëó÷å-
íèÿ çíà÷åíèé îò ïîëüçîâàòåëÿ âàøåé ïðîãðàììû èìåííî â òîì âèäå, êîòîðûé
òðåáóåòñÿ âàøåé ïðîãðàììå. Íàïðèìåð, âû ìîæåòå âûâåñòè íà ýêðàí äèàëîãî-
âîå îêíî ñî ñïèñêîì ðàçëè÷íûõ âàðèàíòîâ ôîðìàòà äàòû è ïðåäîñòàâèòü ïîëü-
çîâàòåëþ âîçìîæíîñòü âûáðàòü èç ñïèñêà îäèí èç ôîðìàòîâ.
Äèàëîãîâûå îêíà ïîçâîëÿþò âàøåé ïðîãðàììå îáùàòüñÿ ñ ïîëüçîâàòåëåì
íàèáîëåå óäîáíûì îáðàçîì, îáåñïå÷èâàÿ ãèáêóþ ôîðìó ââîäà è âûâîäà äàí-
íûõ. Èç ýòîé ãëàâû âû óçíàåòå îá îñíîâíûõ ýëåìåíòàõ äèàëîãîâûõ îêîí è èõ
ñâîéñòâàõ, íàó÷èòåñü ñîçäàâàòü ïðîñòûå äèàëîãîâûå îêíà.
Ôîðìû ïîëüçîâàòåëÿ
Äèàëîãîâîå îêíî â VBA ñîçäàåòñÿ äîáàâëåíèåì â ïðîåêò îáúåêòà UserForm.
Îáúåêò UserForm — ýòî ïóñòîå äèàëîãîâîå îêíî. Íàñòðîéêó äèàëîãîâîãî îêíà
ìîæíî âûïîëíèòü äîáàâëåíèåì ê îáúåêòó UserForm (îáû÷íî íàçûâàþò ïðîñòî
ôîðìà) ýëåìåíòîâ óïðàâëåíèÿ. Êàæäîìó îáúåêòó UserForm ïðèñóùè îïðåäå-
ëåííûå ñâîéñòâà, ìåòîäû è ñîáûòèÿ, êîòîðûå îí íàñëåäóåò îò êëàññà îáúåêòîâ
UserForm. Êàæäûé îáúåêò UserForm âêëþ÷àåò â ñåáÿ òàêæå ìîäóëü êëàññà,
Ðèñ. 9.1
Íîâàÿ UserForm
â ðåæèìå ðàçðàáîòêè
Ýëåìåíòû äèàëîãîâûõ îêîí 351
Ñâîéñòâî Îïèñàíèå
Âîçâðàùàåò îáúåêòíóþ ññûëêó íà ýëåìåíò óïðàâëåíèÿ,
ActiveControl
íàõîäÿùèéñÿ â ôîêóñå â äàííûé ìîìåíò. Òîëüêî äëÿ ÷òåíèÿ.
Öåëîå òèïà Long îïðåäåëÿåò öâåò ôîíà ôîðìû. Ñàìûé ïðîñòîé
ñïîñîá óñòàíîâèòü ýòî ñâîéñòâî — èñïîëüçîâàòü Properties Window;
BackColor
÷òîáû âûáðàòü æåëàåìûé öâåò (åñëè íåîáõîäèìî), ìîæíî
ñêîïèðîâàòü íîìåð öâåòà èç Properties Window â ñâîþ ïðîãðàììó.
Caption Òåêñò, âûâîäèìûé â êà÷åñòâå çàãîëîâêà ôîðìû. Çàïèñü/×òåíèå.
Âîçâðàùàåò êîëëåêöèþ âñåõ ýëåìåíòîâ óïðàâëåíèÿ ôîðìû. Òîëüêî
Controls
äëÿ ÷òåíèÿ.
Îïðåäåëÿåò, äîëæíî ëè íàæàòèå êëàâèøè òàáóëÿöèè âûçûâàòü
ïîñëåäîâàòåëüíûé âûáîð âñåõ ýëåìåíòîâ óïðàâëåíèÿ âî âñåõ
ãðóïïàõ è íà êàæäîé ñòðàíèöå ìíîãîñòðàíè÷íûõ ýëåìåíòîâ
Cycle
óïðàâëåíèÿ èëè òîëüêî â ïðåäåëàõ òåêóùåé ãðóïïû èëè ñòðàíèöû.
Ìîæåò ñîäåðæàòü îäíó èç äâóõ âñòðîåííûõ êîíñòàíò:
fmCycleAllForms èëè fmCycleCurrentForm. ×òåíèå/Çàïèñü.
352 Ãëàâà 9
Ñâîéñòâî Îïèñàíèå
Ñîäåðæèò çíà÷åíèå òèïà Boolean, óêàçûâàþùåå, äîñòóïíà ëè
Enabled ôîðìà. Åñëè åãî çíà÷åíèå ðàâíî False, íè îäèí èç ýëåìåíòîâ
óïðàâëåíèÿ ôîðìû íå äîñòóïåí. ×òåíèå/Çàïèñü.
Âîçâðàùàåò ññûëêó íà îáúåêò Font, ïîñðåäñòâîì êîòîðîãî âû
Font ìîæåòå âûáðàòü ïàðàìåòðû øðèôòà ôîðìû èëè ýëåìåíòà
óïðàâëåíèÿ.
Òî æå ñàìîå, ÷òî è ñâîéñòâî BackColor, íî óñòàíàâëèâàåò öâåò
ForeColor èñïîëüçóåìûé äëÿ ïåðåäíåãî ïëàíà (îáû÷íî — ýòî öâåò òåêñòà)
îáúåêòà ôîðìû.
Ìåòîä Íàçíà÷åíèå
Êîïèðóåò âûäåëåííûé â ýëåìåíòå óïðàâëåíèÿ òåêñò â áóôåð îáìåíà
Copy
Windows.
Âûðåçàåò âûäåëåííûé â ýëåìåíòå óïðàâëåíèÿ òåêñò è ïîìåùàåò åãî
Cut
â áóôåð îáìåíà Windows.
Ñêðûâàåò UserForm, íå âûãðóæàÿ åå èç ïàìÿòè, ñîõðàíÿÿ çíà÷åíèÿ
Hide ýëåìåíòîâ óïðàâëåíèÿ ôîðìû è âñåõ ïåðåìåííûõ, îáúÿâëåííûõ
â ìîäóëå êëàññà ôîðìû.
Âñòàâëÿåò ñîäåðæèìîå áóôåðà îáìåíà Windows â òåêóùèé ýëåìåíò
Paste
óïðàâëåíèÿ.
Âûâîäèò íà èñïîëüçóåìûé â Windows ïî óìîë÷àíèþ ïðèíòåð
PrintForm èçîáðàæåíèå ôîðìû, âêëþ÷àÿ âñå äàííûå, ââåäåííûå â ýëåìåíòû
óïðàâëåíèÿ.
Ïåðåðèñîâûâàåò ôîðìó, âûâåäåííóþ íà ýêðàí. Èñïîëüçóéòå ýòîò ìåòîä,
Repaint åñëè õîòèòå ïåðåðèñîâàòü ôîðìó, íå îæèäàÿ, êîãäà îíà áóäåò
ïåðåðèñîâàíà ÷åðåç îáû÷íûé ïåðèîä âðåìåíè.
Ýëåìåíòû äèàëîãîâûõ îêîí 353
Ìåòîä Íàçíà÷åíèå
Âûâîäèò ôîðìó íà ýêðàí. Åñëè ôîðìà åùå íå çàãðóæåíà â ïàìÿòü, òî
Show
äàííûé ìåòîä ñíà÷àëà åå çàãðóæàåò.
 ýòîé ãëàâå ïðè íàïèñàíèè ïðèìåðîâ ïðîöåäóð îáðàáîòêè ñîáûòèé íàì ïî-
íàäîáèòñÿ ìåòîä Show. Ïîýòîìó ðàññìîòðèì åãî ïîäðîáíåå.
Ñèíòàêñèñ ìåòîäà Show:
Ñèíòàêñèñ
FormName.Show
 äàííîé ñèíòàêñè÷åñêîé êîíñòðóêöèè FormName ìîæåò áûòü ëþáûì îáúåêòîì
UserForm òåêóùåãî ïðîåêòà. FormName — èìÿ ôîðìû â òîì âèäå, êàê îíî îòîáðà-
æàåòñÿ â Project Explorer. Íàïðèìåð, åñëè ó âàñ åñòü ôîðìà frmInsertFigure,
âûâåñòè åå íà ýêðàí ìîæíî ñ ïîìîùüþ îïåðàòîðà:
frmInsertFigure.Show
Åñëè ôîðìà â äàííûé ìîìåíò íå çàãðóæåíà â ïàìÿòü, ìåòîä Show çàãðóçèò åå è âû-
âåäåò íà ýêðàí. Åñëè ôîðìà óæå çàãðóæåíà, ìåòîä Show ïðîñòî âûâåäåò åå íà ýêðàí.
 ëþáîì ñëó÷àå ìåòîä Show âûâîäèò ôîðìó è çàòåì ïåðåäàåò åé óïðàâëåíèå. Ôîðìà
áóäåò îñòàâàòüñÿ íà ýêðàíå äî òåõ ïîð, ïîêà íå áóäåò âûïîëíåí ìåòîä Hide îáúåêòà
UserForm èëè ôîðìà íå áóäåò âûãðóæåíà ïðè ïîìîùè îïåðàòîðà Unload.
Ñèíòàêñèñ çàãîëîâêà
Ñîáûòèå ïðîöåäóðû îáðàáîòêè Îïèñàíèå
ñîáûòèÿ
Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà îêíî
ôîðìû ñòàíîâèòñÿ àêòèâíûì. Èñïîëüçóéòå
ýòî ñîáûòèå äëÿ îáíîâëåíèÿ ñîäåðæèìîãî
Private Sub
Activate äèàëîãîâûõ ýëåìåíòîâ óïðàâëåíèÿ, ÷òîáû
object_Activate()
îòðàçèòü ëþáûå èçìåíåíèÿ, êîòîðûå
ïðîèçîøëè, ïîêà îêíî ôîðìû áûëî
íåàêòèâíûì.
Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà ïî
Private Sub
ôîðìå (ëþáîé åå ÷àñòè, íå çàíÿòîé
Click object_Click(index As
ýëåìåíòàìè óïðàâëåíèÿ) ùåëêàþò
Long)
ìûøüþ.
Private Sub
Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà ïî
object_DblClick(index
ôîðìå (ëþáîé åå ÷àñòè, íå çàíÿòîé
DblClick As Long, ByVal Cancel
ýëåìåíòàìè óïðàâëåíèÿ) äâàæäû
As
ùåëêàþò ìûøüþ.
MSForms.ReturnBoolean)
Private Sub Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà ôîðìà
Deactivate
object_Deactivate() ïåðåñòàåò áûòü àêòèâíîé.
Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà ôîðìà
âïåðâûå çàãðóæàåòñÿ â ïàìÿòü
ïîñðåäñòâîì âûïîëíåíèÿ îïåðàòîðà Load
Private Sub
Initialize èëè ñ ïîìîùüþ ìåòîäà Show. Èñïîëüçóéòå
object_Initialize()
ýòî ñîáûòèå äëÿ èíèöèàëèçàöèè
ýëåìåíòîâ óïðàâëåíèÿ ôîðìû ïðè åå
ïîÿâëåíèè íà ýêðàíå.
Private Sub Èíèöèèðóåòñÿ ïðè èçìåíåíèè ðàçìåðîâ
Resize
UserForm_Resize() ôîðìû.
Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà ôîðìà
âûãðóæàåòñÿ èç ïàìÿòè. Èñïîëüçóéòå ýòî
Private Sub ñîáûòèå äëÿ îñóùåñòâëåíèÿ ëþáûõ
Terminate
object_Terminate() ñïåöèàëüíûõ ñëóæåáíûõ çàäà÷, êîòîðûå
íåîáõîäèìî âûïîëíèòü ïðåæäå, ÷åì
ïåðåìåííûå ôîðìû áóäóò âûãðóæåíû.
Ñèíòàêñèñ Load/Unload
Ñèíòàêñè÷åñêèå êîíñòðóêöèè äëÿ èñïîëüçîâàíèÿ îïåðàòîðîâ Load è Un-
load âûãëÿäÿò ñëåäóþùèì îáðàçîì:
Ñèíòàêñèñ
Load Object
Unload Object
Çäåñü Object ïðåäñòàâëÿåò ëþáóþ äîïóñòèìóþ ññûëêó íà îáúåêò UserForm.
End Sub
Çàïèøèòå ïîñëå çàãîëîâêà ïðîöåäóðû ñëåäóþùèé îïåðàòîð
MsgBox("Ñîáûòèå: Click")
Çàïóñòèòå ôîðìó íà âûïîëíåíèå êîìàíäîé Run | Run Sub/UserForm. Ïîñëå ïî-
ÿâëåíèÿ ôîðìû íà ýêðàíå ùåëêíèòå íà íåé ìûøüþ, íà ýêðàíå îòîáðàçèòñÿ ñî-
îáùåíèå, ïîäîáíîå ïðèâåäåííîìó íà ðèñ. 9.2.
Åñëè äàæå âàì íå ÷àñòî áóäåò íóæíî èñïîëüçîâàòü ïîäîáíîå ñîáûòèå äëÿ
ôîðìû, íå çàáûâàéòå î òàêîé âîçìîæíîñòè. À åùå ëó÷øå ïîñòóïàéòå ñëåäóþ-
ùèì îáðàçîì. Âñåãäà èñïîëüçóéòå ýòî ñîáûòèå íà ñëó÷àé, êîãäà ïîëüçîâàòåëü
âàøèõ ôîðì ïðè ïîïûòêå ùåëêíóòü íà êàêîì ëèáî ýëåìåíòå óïðàâëåíèÿ íå ñî-
âñåì òî÷íî ïîçèöèîíèðóåò êóðñîð ìûøè. Åñëè ïðè ýòîì áóäåò âûïîëíÿòüñÿ
ïðîöåäóðà îáðàáîòêè ñîáûòèÿ Click äëÿ ôîðìû ñ âûâîäîì øóòëèâîãî ñîîáùå-
íèÿ î íåäîñòàòî÷íîé óâåðåííîñòè â äåéñòâèÿõ ïîëüçîâàòåëÿ, ñ âàøèì ïðèëî-
æåíèåì ñòàíåò ïðèÿòíî ðàáîòàòü. Âû òàêæå íèêîãäà íå çàáóäåòå î âîçìîæíî-
ñòè èñïîëüçîâàòü ýòî ñîáûòèå, êîãäà äëÿ ýòîãî ïîÿâÿòñÿ ñåðüåçíûå ïðè÷èíû.
Ïðîäîëæèì ðàññìîòðåíèå ñîáûòèé è ïðîòåñòèðóåì ñîáûòèå Activate. Çà-
ïèøèòå â ìîäóëå ðàññìàòðèâàåìîé ôîðìû ñëåäóþùóþ ïðîöåäóðó:
356 Ãëàâà 9
Ðèñ. 9.2
Âûïîëíåíèå ïðîöåäóðû îáðàáîòêè ñîáûòèÿ
Click
Ðèñ. 9.3
Ñðàçó ïîñëå çàãðóçêè ôîðìû
ïðîèçîøëî ñîáûòèå Activate
òîâ óïðàâëåíèÿ. Â ñëåäóþùåì ïðèìåðå (ëèñòèíã 9.2) äëÿ ýòîãî ñîáûòèÿ óñòà-
íàâëèâàåòñÿ ñâîéñòâî ôîðìû BackColor.
Ðèñ. 9.4
Ïîñëå ñîçäàíèÿ
íîâîé ôîðìû
î÷åíü ëåãêî
«ïîòåðÿòü»
ïðåäûäóùóþ
Àðãóìåíò Îïèñàíèå
Îáÿçàòåëüíûé; òèï: Variant (Integer). ×èñëî â äèàïàçîíå 0–255;
Red
ïðåäñòàâëÿåò êðàñíûé êîìïîíåíò öâåòà.
Îáÿçàòåëüíûé; òèï: Variant (Integer). ×èñëî â äèàïàçîíå 0–255;
Green
ïðåäñòàâëÿåò çåëåíûé êîìïîíåíò öâåòà.
Îáÿçàòåëüíûé; òèï: Variant (Integer). ×èñëî â äèàïàçîíå 0–255;
Blue
ïðåäñòàâëÿåò ñèíèé êîìïîíåíò öâåòà.
Ýëåìåíòû óïðàâëåíèÿ
Îáúåêò UserForm ìîæåò ñîäåðæàòü òå æå ýëåìåíòû óïðàâëåíèÿ, ÷òî è íàõîäÿ-
ùèåñÿ â äèàëîãîâûõ îêíàõ Word, Excel èëè äðóãèõ ïðèëîæåíèé Windows. Ýëå-
360 Ãëàâà 9
Ýëåìåíò
Íàçíà÷åíèå
óïðàâëåíèÿ
Ïîçâîëÿåò ñîçäàâàòü çàãîëîâêè ýëåìåíòîâ óïðàâëåíèÿ,
êîòîðûå íå èìåþò ñîáñòâåííûõ âñòðîåííûõ çàãîëîâêîâ.
Label
Èñïîëüçóéòå ýòîò ýëåìåíò äëÿ òîãî, ÷òîáû ïîìåñòèòü íà ôîðìó
(íàäïèñü, ìåòêà)
ñòàòè÷åñêèé òåêñò, íàïðèìåð, èíñòðóêöèè, ñîâåòû ïî
çàïîëíåíèþ äðóãèõ äèàëîãîâûõ ýëåìåíòîâ óïðàâëåíèÿ.
TextBox Îêíî ðåäàêòèðóåìîãî òåêñòà ñâîáîäíîé ôîðìû äëÿ ââîäà
(òåêñòîâîå ïîëå) äàííûõ. Ìîæåò áûòü îäíî- èëè ìíîãîñòðî÷íûì.
Ýòîò ýëåìåíò óïðàâëåíèÿ îáúåäèíÿåò îêíî ðåäàêòèðîâàíèÿ
è îêíî ñïèñêà. Èñïîëüçóéòå åãî, êîãäà õîòèòå ïðåäëîæèòü
ïîëüçîâàòåëþ âûáðàòü çíà÷åíèå, íî ïðè ýòîì äàòü åìó
ComboBox
âîçìîæíîñòü ââåñòè äàííûå, îòñóòñòâóþùèå â ñïèñêå. Âû
(ïîëå ñî ñïèñêîì)
ìîæåòå òàêæå îãðàíè÷èòü âûáîð òîëüêî òåìè çíà÷åíèÿìè,
êîòîðûå ïîÿâëÿþòñÿ â ComboBox äëÿ ýìóëÿöèè íèñïàäàþùåãî
ñïèñêà.
Îòîáðàæàåò ñïèñîê çíà÷åíèé, èç êîòîðûõ ïîëüçîâàòåëü ìîæåò
ListBox ñäåëàòü âûáîð. Îêíà ñïèñêà ìîæíî èñïîëüçîâàòü, ÷òîáû äàòü
(ñïèñîê) âîçìîæíîñòü ïîëüçîâàòåëþ âûáðàòü òîëüêî îäíî çíà÷åíèå èëè
æå íåñêîëüêî.
Ýëåìåíòû äèàëîãîâûõ îêîí 361
Ýëåìåíò
Íàçíà÷åíèå
óïðàâëåíèÿ
Ñòàíäàðòíûé ôëàæîê (êâàäðàòíîå îêíî, ñîäåðæàùåå
CheckBox «ãàëî÷êó», åñëè ýëåìåíò âûáðàí). Èñïîëüçóéòå ôëàæêè äëÿ
(ôëàæîê) âûáîðà âàðèàíòîâ, êîòîðûå íå ÿâëÿþòñÿ
âçàèìîèñêëþ÷àþùèìè.
Ñòàíäàðòíàÿ êíîïêà-ïåðåêëþ÷àòåëü (êðóãëîå îêíî, ïðè âûáîðå
â öåíòðå íåãî íàõîäèòñÿ ÷åðíàÿ òî÷êà). Èñïîëüçóéòå
OptionButton OptionButton, êîãäà ïîëüçîâàòåëþ íåîáõîäèìî ñäåëàòü âûáîð
(ïåðåêëþ÷àòåëü) ìåæäó «âêëþ÷åíî/âûêëþ÷åíî», «èñòèíà/ëîæü».
Êíîïêè-ïåðåêëþ÷àòåëè, êàê ïðàâèëî, îáúåäèíÿþòñÿ âìåñòå
ïðè ïîìîùè ðàìêè äëÿ ñîçäàíèÿ ãðóïïû ïåðåêëþ÷àòåëåé.
Âûêëþ÷àòåëè ñëóæàò äëÿ òîé æå öåëè, ÷òî è ôëàæêè, íî
ToggleButton
âûâîäÿò óñòàíîâêè â âèäå êíîïêè íàõîäÿùåéñÿ â «íàæàòîì»
(âûêëþ÷àòåëü)
èëè «îòæàòîì» ñîñòîÿíèè.
Âèçóàëüíî è ëîãè÷åñêè îáúåäèíÿåò íåêîòîðûå ýëåìåíòû
óïðàâëåíèÿ (îñîáåííî ôëàæêè, ïåðåêëþ÷àòåëè
è âûêëþ÷àòåëè). Èñïîëüçóéòå Frame, ÷òîáû ïîêàçàòü
Frame
ïîëüçîâàòåëþ, êàêèå ýëåìåíòû óïðàâëåíèÿ â äèàëîãîâîì îêíå
(ðàìêà)
ñâÿçàíû ìåæäó ñîáîé, èëè ÷òîáû âûäåëèòü ãðóïïó ýëåìåíòîâ
óïðàâëåíèÿ, îòäåëÿÿ åå îò îñòàëüíûõ ýëåìåíòîâ óïðàâëåíèÿ,
íàõîäÿùèõñÿ â äèàëîãîâîì îêíå.
Èñïîëüçóéòå êíîïêè äëÿ âûïîëíåíèÿ òàêèõ äåéñòâèé, êàê
Cancel (Îòìåíà), Save (Ñîõðàíèòü), OK è òàê äàëåå. Êîãäà
CommandButton
ïîëüçîâàòåëü ùåëêàåò ïî êíîïêå, âûïîëíÿåòñÿ
(êíîïêà)
VBA-ïðîöåäóðà, çàêðåïëåííàÿ çà äàííûì ýëåìåíòîì
óïðàâëåíèÿ.
Ýòîò ýëåìåíò óïðàâëåíèÿ ñîñòîèò èç îáëàñòè, â êîòîðóþ
ñëåäóåò ïîìåùàòü äðóãèå ýëåìåíòû óïðàâëåíèÿ (òàêèå êàê
TabStrip
òåêñòîâûå ïîëÿ, ôëàæêè è òàê äàëåå). Èñïîëüçóéòå ýëåìåíò
(íàáîð âêëàäîê)
óïðàâëåíèÿ TabStrip äëÿ ñîçäàíèÿ äèàëîãîâûõ âêëàäîê,
îòîáðàæàþùèõ îäíè è òå æå äàííûå â ðàçëè÷íûõ êàòåãîðèÿõ.
Ýòîò ýëåìåíò óïðàâëåíèÿ ñîñòîèò èç íåñêîëüêèõ ñòðàíèö. Âû
ìîæåòå âûáðàòü ëþáóþ èç íèõ, ùåëêíóâ ïî ñîîòâåòñòâóþùåé
MultiPage âêëàäêå. Èñïîëüçóéòå ýëåìåíò óïðàâëåíèÿ MultiPage äëÿ
(íàáîð ñòðàíèö) ñîçäàíèÿ äèàëîãîâûõ îêîí ñ âêëàäêàìè, òàêèìè, íàïðèìåð,
êàê äèàëîãîâîå îêíî, ïîÿâëÿþùååñÿ ïðè âûáîðå êîìàíäû
Tools | Options (ïàíåëè èíñòðóìåíòîâ | íàñòðîéêà).
Ýëåìåíò óïðàâëåíèÿ ScrollBar ïîçâîëÿåò âûáèðàòü ëèíåéíîå
ScrollBar
çíà÷åíèå, àíàëîãè÷íî òîìó, êàê ýòî ìîæíî ñäåëàòü ïðè
(ïîëîñà ïðîêðóòêè)
ïîìîùè ñ÷åò÷èêà.
Ýëåìåíò óïðàâëåíèÿ SpinButton ÿâëÿåòñÿ ñïåöèàëüíîé
ðàçíîâèäíîñòüþ òåêñòîâîãî ïîëÿ. Îáû÷íî ñ÷åò÷èêè
èñïîëüçóþòñÿ äëÿ òîãî, ÷òîáû ââåñòè ÷èñëî, äàòó èëè
SpinButton êàêèå-ëèáî èíûå ïîñëåäîâàòåëüíûå âåëè÷èíû, êîòîðûå
(ñ÷åò÷èê) çàâåäîìî íàõîäÿòñÿ â îïðåäåëåííîì èíòåðâàëå çíà÷åíèé.
Ùåë÷îê ïî óêàçûâàþùåé ââåðõ ñòðåëêå ñ÷åò÷èêà óâåëè÷èâàåò
çíà÷åíèå â îêîøêå, à ùåë÷îê ïî ñòðåëêå, íàïðàâëåííîé âíèç,
ñîîòâåòñòâåííî, óìåíüøàåò åãî.
362 Ãëàâà 9
Ýëåìåíò
Íàçíà÷åíèå
óïðàâëåíèÿ
Ýëåìåíò óïðàâëåíèÿ Image ïîçâîëÿåò âûâåñòè íà ôîðìå
ãðàôè÷åñêîå èçîáðàæåíèå. Èñïîëüçóéòå Image äëÿ âûâîäà
ãðàôè÷åñêèõ èçîáðàæåíèé â ëþáîì èç ñëåäóþùèõ ôîðìàòîâ:
*.bmp, *.cur, *.gif, *.ico, *.jpg, èëè *.wmf. Âû ìîæåòå îáðåçàòü
Image
è ìàñøòàáèðîâàòü ãðàôè÷åñêîå èçîáðàæåíèå, ÷òîáû ïîäîáðàòü
(ðèñóíîê)
ðàçìåð ýëåìåíòà Image, íî òîëüêî íå ðåäàêòèðîâàòü
ãðàôè÷åñêîå èçîáðàæåíèå. Ìîæíî äàæå íàïèñàòü ñïåöèàëüíóþ
VBA-ïðîöåäóðó, âûïîëíÿþùóþñÿ, åñëè ïîëüçîâàòåëü ùåëêíåò
ïî ýëåìåíòó óïðàâëåíèÿ Image.
Ðèñ. 9.5.
Èñïîëüçóéòå Toolbox äëÿ ðàçìåùåíèÿ íà ôîðìå ýëåìåíòîâ óïðàâëåíèÿ:
1 — Select Objects (âûáîð îáúåêòîâ), 2 — Label (íàäïèñü), 3 — TextBox (ïîëå), 4 — ComboBox
(ïîëå ñî ñïèñêîì), 5 — ListBox (ñïèñîê), 6 — CheckBox (ôëàæîê), 7 — OptionButton
(ïåðåêëþ÷àòåëü), 8 — ToggleButton (âûêëþ÷àòåëü), 9 — Frame (ðàìêà), 10 — CommandButton
(êíîïêà), 11 — TabStrip (íàáîð âêëàäîê), 12 — MultiPage (íàáîð ñòðàíèö), 13 — ScrollBar
(ïîëîñà ïðîêðóòêè), 14 — SpinButton (ñ÷åò÷èê), 15 — Image (ðèñóíîê), 16 — RefEdit, 17 —
DataGrid (ñåòêà äàííûõ), 18 — MSFlexGrid
âàìè êíîïêà áóäåò CommandButton2 è òàê äàëåå. Åñëè ïîñëå ýòîãî âû äîáàâèòå
ïîëå, îíî ïîëó÷èò èìÿ TextBox1.
Ïåðåä òåì êàê ïðîäîëæèòü ðàáîòó ñ ôîðìàìè, äàâàéòå äîãîâîðèìñÿ î íå-
ñëîæíûõ ïðàâèëàõ, êîòîðûå ïîìîãóò âàì ñ ïåðâûõ øàãîâ ñîçäàâàòü äèàëîãî-
âûå îêíà, ïî÷òè ïîõîæèå íà ïðîôåññèîíàëüíûå. Åñëè âû äî ñèõ ïîð íå îáðàùà-
ëè âíèìàíèÿ íà òî, ÷òî âñå îêíà «ñîëèäíûõ» ðàçðàáîò÷èêîâ èìåþò îáùèå ÷åð-
òû, òî ñåé÷àñ êàê ðàç òî âðåìÿ, êîãäà ýòî íóæíî ñäåëàòü. Íà ðèñ. 9.7 ïðèâåäåíà
ñõåìà, êîòîðîé ìîæíî ïðèäåðæèâàòüñÿ ïðè ðàçðàáîòêå ñâîèõ ïåðâûõ ôîðì.
Íàèìåíîâàíèå îêíà, êàê âû óæå çíàåòå, çàäàåòñÿ ñâîéñòâîì Caption ôîð-
ìû. Êíîïêà çàêðûòèÿ îêíà, åñëè íè÷åãî ñïåöèàëüíî íå ïðåäïðèíèìàòü, ïî
Ðèñ. 9.7
Ñõåìà òèïè÷íîãî
äèàëîãîâîãî
Windows-îêíà
óìîë÷àíèþ âñåãäà áóäåò â îêíå ïðèëîæåíèÿ. Åñëè îíà âàì íå íóæíà, òî ëó÷øå
îò íåå èçáàâèòüñÿ.
 «ïîëåçíîé» ÷àñòè îêíà ïîìåùàþòñÿ ôóíêöèîíàëüíî íåîáõîäèìûå ýëå-
ìåíòû óïðàâëåíèÿ, êîòîðûå îïðåäåëÿþòñÿ íàçíà÷åíèåì îêíà. Çäåñü ìîãóò
370 Ãëàâà 9
Ñâîéñòâî,
Òèï ýëåìåíòà êîòîðîå Çíà÷åíèå Ïðèìå÷àíèå
èçìåíåíî
Èìÿ ôîðìû, íà êîòîðîå ìîæíî
UserForm Name Frmfirst
ññûëàòüñÿ â êîäå.
Òåñòèðîâàíèå Çàãîëîâîê îêíà (ôîðìû)
Caption
êíîïîê â âåðõíåé ÷àñòè.
Èìÿ êíîïêè, íà êîòîðîå ìîæíî
CommandButton Name CmdOK
ññûëàòüñÿ â êîäå.
Caption OK Òåêñò íà êíîïêå.
Ïðè íàæàòèè íà êëàâèøó Enter
Default True èíèöèèðóåòñÿ ñîáûòèå Click
êíîïêè.
372 Ãëàâà 9
Ñâîéñòâî,
Òèï ýëåìåíòà êîòîðîå Çíà÷åíèå Ïðèìå÷àíèå
èçìåíåíî
Èìÿ êíîïêè, íà êîòîðîå ìîæíî
CommandButton Name CmdCancel
ññûëàòüñÿ â êîäå.
Caption Îòìåíà Òåêñò íà êíîïêå.
Ïðè íàæàòèè íà êëàâèøó Esc
Cancel True èíèöèèðóåòñÿ ñîáûòèå Click
êíîïêè.
Èìÿ êíîïêè, íà êîòîðîå ìîæíî
CommandButton Name CmdHelp
ññûëàòüñÿ â êîäå.
Caption Ñïðàâêà Òåêñò íà êíîïêå.
Ðèñ. 9.9
Òàêîå îêíî òîæå «èìååò ïðàâî»
íàçûâàòüñÿ «äèàëîãîâûì»
Ðèñ. 9.11
Ôîðìà äëÿ òåñòèðîâàíèÿ
ñîáûòèÿ Change äëÿ TextBox
Ýëåìåíòû äèàëîãîâûõ îêîí 375
Ñâîéñòâî,
Òèï ýëåìåíòà êîòîðîå Çíà÷åíèå Ïðèìå÷àíèå
èçìåíåíî
Èìÿ ãëàâíîé ôîðìû, íà êîòîðîå
UserForm Name UserForm1
ìîæíî ññûëàòüñÿ â êîäå.
Òåñòèðîâàíèå
Çàãîëîâîê îêíà (ôîðìû)
Caption ñîáûòèÿ
â âåðõíåé ÷àñòè.
Change
Èìÿ, íà êîòîðîå ìîæíî
Frame Name Frame1
ññûëàòüñÿ â êîäå.
Äàííûå
Caption
î ïîëüçîâàòåëå
Èìÿ, íà êîòîðîå ìîæíî
TextBox Name TextBox1
ññûëàòüñÿ â êîäå.
Label Name Label1
376 Ãëàâà 9
Ñâîéñòâî,
Òèï ýëåìåíòà êîòîðîå Çíà÷åíèå Ïðèìå÷àíèå
èçìåíåíî
Çàãîëîâîê äëÿ òåêñòîâîãî îêíà
Caption Ôàìèëèÿ
TextBox1.
Èìÿ, íà êîòîðîå ìîæíî
TextBox Name TextBox2
ññûëàòüñÿ â êîäå.
Label Name Label2
Çàãîëîâîê äëÿ òåêñòîâîãî îêíà
Caption Èìÿ
TextBox2.
Èìÿ êíîïêè, íà êîòîðîå ìîæíî
CommandButton Name Cancel_button
ññûëàòüñÿ â êîäå.
Òåêñò íà êíîïêå: êíîïêà äëÿ
Caption Îòìåíà
îêîí÷àíèÿ ðàáîòû ïðèëîæåíèÿ.
CommandButton Name OK_button
Òåêñò íà êíîïêå: êíîïêà äëÿ
Caption ÎÊ ïðîäîëæåíèÿ ðàáîòû
ïðèëîæåíèÿ.
Êíîïêà íåäîñòóïíà äëÿ
ïîëüçîâàòåëÿ ñðàçó ïîñëå
Enabled False
âûäà÷è äèàëîãîâîãî îêíà íà
ýêðàí.
Èìÿ ôîðìû, çàãðóæàåìîé èç
UserForm Name UserForm2 ãëàâíîé ïðè ùåë÷êå íà êíîïêå
ÎÊ.
Ðèñ. 9.12
Èñïîëüçîâàíèå äèàëîãîâîãî
îêíà Tab Order äëÿ èçìåíåíèÿ
ïîñëåäîâàòåëüíîñòè ïåðåõîäà ê ýëåìåíòàì
óïðàâëåíèÿ ôîðìû
5. Âûáåðèòå â äèàëîãîâîì îêíå Tab Order êíîïêó OK, ÷òîáû ïîäòâåðäèòü ñäå-
ëàííûå âàìè èçìåíåíèÿ, ïîñëå ÷åãî çàêðîéòå îêíî.
Õîòÿ ýëåìåíòû Label òîæå ïîÿâëÿþòñÿ â äèàëîãîâîì îêíå Tab Order è âû
ìîæåòå ïîìåíÿòü èõ ïîëîæåíèå â ñïèñêå, â VBA íåëüçÿ âûáðàòü ýëåìåíò
óïðàâëåíèÿ Label. Ýòîò ýëåìåíò ïðåäíàçíà÷åí èñêëþ÷èòåëüíî äëÿ âûâîäà
òåêñòà.
Ðèñ. 9.13
Properties Window äëÿ êíîïêè, ïîêàçûâàþùåå
ñïèñîê ñâîéñòâ â àëôàâèòíîì ïîðÿäêå
Ðèñ. 9.14
Properties Window äëÿ êíîïêè, ïîêàçûâàþùåå
ñïèñîê ñâîéñòâ ïî êàòåãîðèÿì
Ðèñ. 9.15
Äëÿ äîáàâëåíèÿ âêëàäêè
ê Toolbox ïðàâûì ùåë÷êîì
íà ïóñòîì ìåñòå ýòîé ïàíåëè
âûçîâèòå êîíòåêñòíîå ìåíþ
è âûáåðèòå êîìàíäó New Page
Ðèñ. 9.16
 ðåçóëüòàòå âûïîëíåíèÿ
êîìàíäû New Page ê Toolbox
áóäåò äîáàâëåíà âêëàäêà ñ èìåíåì ïî
óìîë÷àíèþ
Ðèñ. 9.17
 ýòîì îêíå ìîæíî ïåðåèìåíîâàòü
ëþáóþ âêëàäêó
Ðèñ. 9.18
Âêëàäêà èìååò
íàèìåíîâàíèå Ñåòêè
Çàìå÷àíèå
Íàèìåíîâàíèå îêíà Additional Controls, âîîáùå-òî, íå îçíà÷àåò, ÷òî îíî óïðàâëÿåò íàëè÷è-
åì íà ïàíåëè Toolbox òîëüêî äîïîëíèòåëüíûõ (additional) ýëåìåíòîâ. Îòêðîéòå îêíî
Additional Controls äëÿ âêëàäêè Controls è ìîæåòå óâèäåòü ñïèñîê âñåõ âûäåëåííûõ ôëàæ-
êîâ äëÿ ýëåìåíòîâ óïðàâëåíèÿ, ïîìåùåííûõ íà ýòó âêëàäêó ïî óìîë÷àíèþ.
Íà ðèñ 9.21 ïîêàçàíà ôîðìà ñ ýëåìåíòîì óïðàâëåíèÿ MSFlexGrigd,
çàïîëíåííûì äàííûìè èç ðàáî÷åãî ëèñòà. Êîä ìîäóëÿ ôîðìû ïðèâåäåí
â ëèñòèíãå 9.7. Êîä ÿâëÿåòñÿ äîâîëüíî ïðîñòûì: ñíà÷àëà â ñòðîêàõ (6–9)
îïèñûâàþòñÿ ñâîéñòâà ñåòêè (ýëåìåíòà MSFlexGrigd) — êîëè÷åñòâî ñòðîê è
êîëîíîê, øèðèíà è ðàñïîëîæåíèå äàííûõ ïåðâîé êîëîíêè.
384 Ãëàâà 9
Ðèñ. 9.19
 îêíå Additional Controls
ñëåäóåò óêàçàòü ãðóïïó
íåîáõîäèìûõ ýëåìåíòîâ
óïðàâëåíèÿ
Ðèñ. 9.20
Âêëàäêà Ñåòêè ïàíåëè Toolbox
ñîäåðæèò ýëåìåíòû DataGrid
è MSFlexGrid, êîòîðûå âûáðàíû
ïðè ïîìîùè ôëàæêîâ Microsoft
DataGrig Control 6.0 è Microsoft
FlexGrig Control, version 6.0,
ñîîòâåòñòâåííî
Ðàáîòà ñ Excel
 ïåðâîé ÷àñòè ýòîé ãëàâû âû óçíàåòå, êàê óïðàâëÿòü íàèáîëåå âàæíûìè
è îñíîâíûìè îáúåêòàìè Excel. Âî-ïåðâûõ, âû óçíàåòå îá îáúåêòàõ Workbook
è Worksheet, à çàòåì íàó÷èòåñü óïðàâëÿòü èíôîðìàöèåé, ñîäåðæàùåéñÿ
â îáúåêòå Worksheet. Äàëåå èç ýòîé æå ãëàâû âû óçíàåòå, êàê óïðàâëÿòü àíà-
ëîãè÷íûìè îáúåêòàìè â Word.
Ñèíòàêñèñ
Workbooks(Index)
Index ìîæåò áûòü:
÷èñëåííûì âûðàæåíèåì, ïðåäñòàâëÿþùèì êíèãó, êîòîðóþ íåîáõîäèìî èñïîëüçî-
âàòü (÷èñëî 1 îçíà÷àåò ïåðâóþ êíèãó, îòêðûòóþ â òåêóùåì ðàáî÷åì ñåàíñå, 2 —
âòîðóþ è òàê äàëåå);
ñòðîêîâûì âûðàæåíèåì, ïðåäñòàâëÿþùèì èìÿ îòêðûòîé êíèãè, êîòîðóþ âû õîòè-
òå èñïîëüçîâàòü.
Ðèñ. 10.1
Ñîîáùåíèå î ðåçóëüòàòå âûïîëíåíèÿ êîäà ëèñòèíãà
10.1
1: Sub OpenWorkbook()
2: 'Ïðåäëàãàåò îòêðûòü è çàòåì îòêðûâàåò åå
3:
4: Dim Workbookname As String
5:
6: Workbookname = _
7: InputBox("Ââåäèòå ïîëíûé ïóòü ê êíèãå:")
8: If Workbookname <> "" Then
9: Workbooks.Open FileName:=Workbookname
10: End If
11: End Sub
1: Sub CreateMonthlyReport()
2:'Ñîçäàíèå íîâîé êíèãè íà îñíîâå ôàéëà-øàáëîíà
3:
4: Dim FilePath As String, FileName As String
5:
6: FilePath = "H:\Ïðîãðàììèðîâàíèå íà VBA 2007\VBA_BookVentura\3"
7:
390 Ãëàâà 10
Ðèñ. 10.2
Îáùóþ èíôîðìàöèþ î ôàéëå ìîæíî
óâèäåòü, åñëè ïðîñòî íà íåêîòîðîå âðåìÿ
ïîìåñòèòü íà åãî çíà÷êå êóðñîð ìûøè
13:
14: Workbooks(SaveBook).Activate
15: Application.ScreenUpdating = True
16: End Sub
Ðèñ. 10.3
Êîïèÿ àêòèâíîé êíèãè íà äèñêå Í —
äîïîëíèòåëüíàÿ ãàðàíòèÿ ñîõðàíåíèÿ
ðåçóëüòàòîâ âàøåé ðàáîòû
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 393
Òåñò If...Then (ñòðîêà 7) ïðîâåðÿåò ñâîéñòâî Saved êíèãè. Åñëè îíî ðàâíî
False, â êíèãå èìåþòñÿ èçìåíåíèÿ, êîòîðûå åùå íå áûëè ñîõðàíåíû, ïîýòîìó
ïðîöåäóðà âûçûâàåò ìåòîä Save.
Èìÿ ðåçåðâíîé êîïèè ôàéëà ñîçäàåòñÿ êîíêàòåíàöèåé çíà÷åíèÿ êîíñòàíòû
SaveDrv, ëèòåðàëüíîé êîíñòàíòû "\Copy of "è ñâîéñòâà Name êíèãè. Ðåçóëüòàò
èñïîëüçóåòñÿ â êà÷åñòâå àðãóìåíòà Name ìåòîäà SaveCopyAs (ñòðîêà 8), êîòî-
ðûé ñîõðàíÿåò êîïèþ êíèãè.
Ìåòîä Save íå ñëåäóåò èñïîëüçîâàòü äëÿ íîâîé êíèãè (êîòîðàÿ ïðåæäå íè
ðàçó íå ñîõðàíÿëàñü). Åñëè âû âñå æå ñäåëàåòå ýòî, Excel ñîõðàíèò íîâóþ êíèãó
ïîä åå òåêóùèì èìåíåì, íàïðèìåð, ÊÍÈÃÀ1.XLS. ×òîáû ïðè ñîõðàíåíèè
ïðèñâîèòü êíèãå èìÿ èñïîëüçóéòå ìåòîä SaveAs:
Ñèíòàêñèñ
Object.SaveAs([FileName] [,FileFormat] [,Password] [, WriteResPassword]
[, ReadOnlyRecommended] [, CreateBackup] [, AccessMode] [,
ConflictResolution] [, AddToMru])
Object — ýòî îáúåêòíàÿ ññûëêà íà îáúåêò Workbook, à Filename — ñòðîêîâîå âûðà-
æåíèå äëÿ èìåíè, êîòîðîå ñëåäóåò èñïîëüçîâàòü ïðè ñîõðàíåíèè êîïèè êíèãè.
FileFormat (òèï Variant) — ïðèìåíÿåìûé ïðè ñîõðàíåíèè ôàéëà ôîðìàò. Äëÿ ñó-
ùåñòâóþùåãî íà äèñêå ôàéëà ïî óìîë÷àíèþ èñïîëüçóåòñÿ ïîñëåäíèé çàäàííûé
ôîðìàò, äëÿ íîâîãî ôàéëà — ôîðìàò èñïîëüçóåìîé âåðñèè Excel.
Password (òèï Variant) — ñòðîêà (íå áîëåå 15-òè ñèìâîëîâ), êîòîðàÿ èñïîëüçóåòñÿ
â êà÷åñòâå ïàðîëÿ ïðè îòêðûòèè ôàéëà.
ReadOnlyRecommended (òèï Variant) — àðãóìåíò, êîòîðûé ïðè çíà÷åíèè, ðàâíîì
True, ïðèâîäèò ê ïîÿâëåíèþ äèàëîãîâîãî îêíà ñ ðåêîìåíäàöèåé îòêðûâàòü ôàéë
òîëüêî íà ÷òåíèå.
CreateBackup (òèï Variant) — àðãóìåíò, êîòîðûé ïðè çíà÷åíèè, ðàâíîì True,
ïðèâîäèò ê ñîçäàíèþ ðåçåðâíîé êîïèè ñîõðàíÿåìîé êíèãè.
AccessMode — çíà÷åíèå îäíîé èç ñëåäóþùèõ êîíñòàíò:
w xlExclusive (ìîíîïîëüíûé äîñòóï);
w xlNoChange (íå ìåíÿòü ðåæèì äîñòóïà, äåéñòâóåò ïî óìîë÷àíèþ);
w xlShared (ìíîãîïîëüçîâàòåëüñêèé äîñòóï).
Ïðè èñïîëüçîâàíèè êîíñòàíòû xlExclusive ôàéë ìîæåò áûòü îòêðûò äëÿ çàïèñè
òîëüêî îäíèì ïîëüçîâàòåëåì. Äðóãîé ïîëüçîâàòåëü ïîëó÷èò â äèàëîãîâîì îêíå ñî-
îáùåíèå î òîì, ÷òî ôàéë óæå îòêðûò. Ñ äðóãîé ñòîðîíû, êîíñòàíòà xlShared äàåò
âîçìîæíîñòü ñðàçó íåñêîëüêèì ïîëüçîâàòåëÿì ðàáîòàòü ñ îäíèì ôàéëîì.
Ïðè îäíîâðåìåííîé ðàáîòå íåñêîëüêèõ ïîëüçîâàòåëåé ñ îäíèì ôàéëîì â ëþáîé ìî-
ìåíò âðåìåíè ëþáîé ïîëüçîâàòåëü ìîæåò ñîõðàíÿòü ñâîè èçìåíåíèÿ â ôàéëå. Ïðè
ýòîì, åñëè êàêîé-ëèáî äðóãîé ïîëüçîâàòåëü óæå ñîõðàíÿë äàííûå íà äèñêå, ýòè
äàííûå ïîïàäàþò â ôàéë òîãî, êòî äåëàåò â äàííûé ìîìåíò ñîõðàíåíèå ñâîèõ äàí-
íûõ. Îäíàêî ïðè òàêîé ñîâìåñòíîé ðàáîòå ñ îäíèì ôàéëîì íå âñåãäà ìîæíî ïðîñòî
ñîõðàíèòü ñâîè äàííûå â ôàéëå íà äèñêå. Åñëè âû, íàïðèìåð, ïûòàåòåñü îäíîâðå-
ìåííî ñ äðóãèì ïîëüçîâàòåëåì èçìåíèòü ñîäåðæèìîå îäíîé è òîé æå ÿ÷åéêè, ìî-
æåòå ïîëó÷èòü ñîîáùåíèå î êîíôëèêòå äîñòóïà.
ConflictResolution — îäíà èç ñëåäóþùèõ êîíñòàíò:
w xlUserResolution (îòîáðàæàòü äèàëîãîâîå îêíî ðàçðåøåíèÿ êîíôëèêòîâ);
w xlLocalSessionChanges (àâòîìàòè÷åñêè ïðèíèìàòü ïîëüçîâàòåëüñêèå èçìå-
íåíèÿ);
w xlOtherSessionChanges (ïðèíèìàòü äðóãèå èçìåíåíèÿ âìåñòî ëîêàëüíûõ
ïîëüçîâàòåëüñêèõ).
394 Ãëàâà 10
23: End If
24: Next Book
25: End Sub
w Èìÿ ëèñòà, êîòîðûé ñëåäóåò èñïîëüçîâàòü, â âèäå ñòðîêè. Ýòî èìÿ, êîòîðîå ïî-
ÿâëÿåòñÿ íà âêëàäêå ëèñòà.
Object.Select
Äàííûé ìåòîä ïîëåçåí äëÿ ñîçäàíèÿ òðåõìåðíûõ ññûëîê è îïðåäåëåíèÿ
ëèñòîâ, êîòîðûå ñëåäóåò âûâåñòè íà ïå÷àòü. Òðåõìåðíàÿ ññûëêà (three-
dimensional reference) — ýòî ññûëêà íà äèàïàçîí ÿ÷ååê áîëåå ÷åì îäíîãî ëèñòà.
Íå ñëåäóåò áåç íåîáõîäèìîñòè äåëàòü ëèñò àêòèâíûì. Äëÿ áîëüøèíñòâà
ñâîéñòâ è ìåòîäîâ îáúåêòà Worksheet âû ìîæåòå ïðîñòî âîñïîëüçîâàòüñÿ ìåòî-
äîì Worksheets äëÿ ññûëîê íà ëèñò, êîòîðûé íóæíî èñïîëüçîâàòü. Íàïðè-
ìåð, ñëåäóþùèé îïåðàòîð âîçâðàùàåò ñòàíäàðòíóþ øèðèíó ëèñòà Ãðàôèê áà-
ëàíñà, íå äåëàÿ ýòîò ëèñò àêòèâíûì:
StdWidth = Worksheets("Ãðàôèê áàëàíñà").StandardWidth
Ñ ïîìîùüþ ìåòîäà Add â êíèãó äîáàâëÿåòñÿ ëèñò (ñòðîêà 7). Â äàííîì ñëó-
÷àå ìåòîä Add âûçûâàåòñÿ ñ íåîáÿçàòåëüíûì àðãóìåíòîì Before äëÿ òîãî, ÷òî-
áû äîáàâèòü íîâûé ëèñò íåïîñðåäñòâåííî ïåðåä ïîñëåäíèì ëèñòîì êíèãè. Íî-
ìåð ïîñëåäíåãî ëèñòà êíèãè îïðåäåëÿåòñÿ â ñòðîêå 7 ñ ïîìîùüþ ñâîéñòâà
Count, êîòîðîå âîçâðàùàåò êîëè÷åñòâî ëèñòîâ â êíèãå. Ïîñëå ÷åãî íîâîå íàçâà-
íèå ëèñòà ñîõðàíÿåòñÿ â ïåðåìåííîé NewSheet.
 ñòðîêå 10 ñ ïîìîùüþ ìåòîäà Move, íîâûé ëèñò ïîìåùàåòñÿ çà ïîñëåäíèì
ëèñòîì êíèãè. (Äëÿ òîãî ÷òîáû ïîëó÷èòü êîëè÷åñòâî ëèñòîâ â êíèãå, âíîâü èñ-
ïîëüçóåòñÿ ñâîéñòâî Count.) Ïîñëå ýòîãî íîâûé ëèñò óñòàíàâëèâàåòñÿ àêòèâ-
íûì (ñòðîêà 11).
Åñëè âû ðàçðàáàòûâàåòå ïðèëîæåíèå, â êîòîðîì ÷àñòî ïðèõîäèòñÿ ñîçäà-
âàòü è ïåðåìåùàòü ëèñòû, áóäåò íåïëîõîé ïðàêòèêîé óñòàíàâëèâàòü ïåðåä ýòè-
ìè îïåðàöèÿìè êîìàíäû îòêëþ÷åíèÿ îáíîâëåíèÿ ýêðàíà (Application.Scre-
enUpdating = False). Ïðè ýòîì ñëåäóåò íå çàáûâàòü âêëþ÷àòü îáíîâëåíèå ýêðà-
íà, åñëè âàøà ïðîöåäóðà åãî îòêëþ÷àëà (Application.ScreenUpdating = True).
Ïîìíèòå, ÷òî âû ìîæåòå äîáàâèòü ëèñò è ïîñëå ëþáîãî çàäàííîãî ëèñòà.
Ïðîöåäóðà â ëèñòèíãå 10.10 äîáàâëÿåò ëèñò ïåðåä ïîñëåäíèì ëèñòîì è çàòåì
ïåðåìåùàåò åãî, ïîñêîëüêó Excel íå ïîçâîëÿåò äîáàâëÿòü ëèñòû â êîíåö êíèãè.
Èñïîëüçîâàíèå àðãóìåíòà After, ñîâìåñòíî ñ ìåòîäîì Add ïîçâîëÿåò äîáàâèòü
íîâûé ëèñò ïîñëå ëþáîãî ñóùåñòâóþùåãî ëèñòà, çà èñêëþ÷åíèåì ïîñëåäíåãî.
Ýòà ïðîöåäóðà ïðîâåðÿåò êàæäûé ëèñò êíèãè è óäàëÿåò âñå ðàíåå ñîçäàííûå
âðåìåííûå ëèñòû. Ïðîöåäóðà «ïîëàãàåò», ÷òî âðåìåííûå ëèñòû äîëæíû íàçû-
âàòüñÿ Âðåìåííûé1, Âðåìåííûé2 è òàê äàëåå.
Ïðîöåäóðà îáúÿâëÿåò îáúåêòíóþ ïåðåìåííóþ Sheet (òèïà Worksheet) è çà-
äàåò ñâîéñòâî DisplayAlerts îáúåêòà Application, ðàâíûì çíà÷åíèþ False
(ñòðîêà 6). Òàêèì îáðàçîì ïîäàâëÿåòñÿ îáû÷íîå äèàëîãîâîå Excel-îêíî ïîä-
òâåðæäåíèÿ, êîòîðîå ïîÿâëÿåòñÿ âñÿêèé ðàç, êîãäà âû ïûòàåòåñü óäàëèòü
ëèñò.  ñòðîêå 8 íà÷èíàåòñÿ öèêë For Each, ïåðåáèðàþùèé âñå ëèñòû êíèãè
Áàëàíñîâûé îò÷åò 1202.xlsx. Ôóíêöèÿ InStr ïðîâåðÿåò êàæäûé ëèñò íà íàëè-
÷èå â íàçâàíèè ëèñòà ñòðîêè «Âðåìåííûé». Åñëè òàêàÿ ñòðîêà îáíàðóæèâàåò-
ñÿ, òî (â ñòðîêå 10 êîäà) ýòîò ëèñò óäàëÿåòñÿ. Êîãäà äàííûé ïðîöåññ çàâåðøàåò-
ñÿ, ñâîéñòâî DisplayAlerts âíîâü ïîëó÷àåò çíà÷åíèå True (ñòðîêà 14).
Ïðîöåäóðà â ëèñòèíãå 10.11 áóäåò ðàáîòàòü ïðàâèëüíî, åñëè Option
Compare Text ÿâëÿåòñÿ òåêóùåé ãëîáàëüíîé óñòàíîâêîé ñðàâíåíèÿ.
1 Äëÿ òîãî ÷òîáû ïðîñìîòðåòü ïîëíûé ñïèñîê ñâîéñòâ Font, èñïîëüçóéòå èíñòðóìåíò Ob-
ject Browser.
402 Ãëàâà 10
3:
4: Dim I As Integer
5: Dim DBNewRow As Integer
6: Dim NewRange As String
7:
8: With Range("Áàçà_äàííûõ")
9: 'íàõîäèòñÿ íîâàÿ ñòðîêà äàííûõ
10: DBNewRow = .Row + .Rows.Count
11:
12: 'ââîä äàííûõ èç äèàëîãîâîãî îêíà â ÿ÷åéêè íîâîé ñòðîêè
13: For I = 1 To .Columns.Count
14: Cells(DBNewRow, (I + .Column) - 1).Value = _
15: UserForm1.Controls("TextBox" & CStr(I)).Text
16: Next I
17:
18: 'ðàñøèðåíèå äèàïàçîíà áàçû äàííûõ
19: NewRange = "=" & .Parent.Name & "!"
20: NewRange = NewRange & Cells(.Row, .Column).Address & ":"
21: NewRange = NewRange & _
22: Cells(DBNewRow, (.Column + .Columns.Count) - 1).Address
23: Names("Áàçà_äàííûõ").RefersTo = NewRange
24: End With
25: End Sub
Ðèñ. 10.4
Äèàëîãîâîå îêíî (â ðåæèìå
ðàçðàáîòêè) äëÿ ââîäà äàííûõ
Ñâîéñòâ
Òèï ýëåìåíòà Çíà÷åíèå Ïðèìå÷àíèå
î
Èìÿ ôîðìû, íà êîòîðîå ìîæíî ññûëàòüñÿ
UserForm Name UserForm1
â êîäå.
Çàïèñü
Caption Çàãîëîâîê îêíà (ôîðìû) â âåðõíåé ÷àñòè.
äàííûõ
CommandButto Èìÿ êíîïêè, íà êîòîðîå ìîæíî ññûëàòüñÿ
Name CmdWrite
n â êîäå.
Caption Çàïèñü Òåêñò íà êíîïêå.
Ïðè íàæàòèè íà êëàâèøó Enter
Default True
èíèöèèðóåòñÿ ñîáûòèå Click êíîïêè.
404 Ãëàâà 10
Ñâîéñòâ
Òèï ýëåìåíòà Çíà÷åíèå Ïðèìå÷àíèå
î
CommandButto Èìÿ êíîïêè, íà êîòîðîå ìîæíî ññûëàòüñÿ
Name CmdExit
n â êîäå.
Caption Âûõîä Òåêñò íà êíîïêå.
Ïðè íàæàòèè íà êëàâèøó Esc
Cancel True
èíèöèèðóåòñÿ ñîáûòèå Click êíîïêè.
Èìÿ ìåòêè, íà êîòîðîå ìîæíî ññûëàòüñÿ
Label Name Label1
â êîäå.
Caption Ôàìèëèÿ Òåêñò íà ìåòêå.
Èìÿ ìåòêè, íà êîòîðîå ìîæíî ññûëàòüñÿ
Label Name Label2
â êîäå.
Caption Èìÿ Òåêñò íà ìåòêå.
Èìÿ ìåòêè, íà êîòîðîå ìîæíî ññûëàòüñÿ
Label Name Label3
â êîäå.
Caption Îò÷åñòâî Òåêñò íà ìåòêå.
Èìÿ ïîëÿ, íà êîòîðîå ìîæíî ññûëàòüñÿ
TextBox Name TextBox1
â êîäå.
Èìÿ ïîëÿ, íà êîòîðîå ìîæíî ññûëàòüñÿ
TextBox Name TextBox2
â êîäå.
Èìÿ ïîëÿ, íà êîòîðîå ìîæíî ññûëàòüñÿ
TextBox Name TextBox3
â êîäå.
Ïðèìåð ðàáîòàþùåãî îêíà äëÿ ââîäà äàííûõ ïðè ïîìîùè êîäà ëèñòèí-
ãà 10.13 ïðèâåäåí íà ðèñ. 10.5.
Ðèñ. 10.5
Ïðîöåäóðà CmdWrite_Click ëèñòèíãà 10.13
ðàáîòàåò ñ äàííûìè, ââîäèìûìè
ñ èñïîëüçîâàíèåì äèàëîãîâîãî îêíà, ïîäîáíîãî
ýòîìó
òîäà Resize ìîæíî âîçâðàòèòü äèàïàçîí çàäàííîãî ðàçìåðà. Âîò ëèøü íåêîòî-
ðûå ìåòîäû è ñâîéñòâà, âîçâðàùàþùèå îáúåêòû òèïà Range:
¨ [cellRef]. Âû ìîæåòå âîçâðàòèòü îäíó ÿ÷åéêó, ïîìåñòèâ ññûëêó íà íåå
â êâàäðàòíûå ñêîáêè. Íàïðèìåð, [A1].Font.Size=16 óñòàíàâëèâàåò ðàçìåð
øðèôòà ÿ÷åéêè A1 â çíà÷åíèå 16. Îáðàòèòå âíèìàíèå íà òî, ÷òî â äàííîì
ñëó÷àå äëÿ ññûëêè íà ÿ÷åéêó íå èñïîëüçóåòñÿ íèêàêèõ êàâû÷åê.
¨ Object.Rows(Index). Äàííûé ìåòîä âîçâðàùàåò ñòðîêó ëèñòà èëè äèàïàçîíà
ÿ÷ååê, çàäàííûõ ïðè ïîìîùè Object. Åñëè âû îïóñòèòå Object, VBA èñïîëü-
çóåò ActiveSheet. Index — íîìåð ñòðîêè. Åñëè Object ÿâëÿåòñÿ ëèñòîì,
Index, ðàâíûé 1, ññûëàåòñÿ íà ñòðîêó 1 ëèñòà. Åñëè æå Object ÿâëÿåòñÿ äèà-
ïàçîíîì, òî Index, ðàâíûé 1, ññûëàåòñÿ íà ïåðâóþ ñòðîêó äèàïàçîíà.
¨ Object.EntireRow. Äàííîå ñâîéñòâî âîçâðàùàåò öåëóþ ñòðîêó èëè ñòðîêè,
ñîäåðæàùèå äèàïàçîí ÿ÷ååê, çàäàííûõ ïðè ïîìîùè Object.
¨ Object.Columns(Index). Äàííûé ìåòîä âîçâðàùàåò ñòîëáåö ëèñòà èëè äèà-
ïàçîíà ÿ÷ååê, çàäàííûõ ïðè ïîìîùè Object. Åñëè âû îïóñêàåòå Object,
VBA èñïîëüçóåò ActiveSheet. Index — áóêâà èëè íîìåð ñòîëáöà. Åñëè
Object ÿâëÿåòñÿ ëèñòîì, Index, ðàâíûé "A" èëè 1, ññûëàåòñÿ íà ñòîëáåö
A ëèñòà. Åñëè æå Object ÿâëÿåòñÿ äèàïàçîíîì ÿ÷ååê, òî Index, ðàâíûé
"A" èëè 1, ññûëàåòñÿ íà ïåðâûé ñòîëáåö äèàïàçîíà.
¨ Object.EntireColumn. Äàííîå ñâîéñòâî âîçâðàùàåò öåëûé ñòîëáåö èëè
ñòîëáöû, ñîäåðæàùèå äèàïàçîí ÿ÷ååê, çàäàííûõ ïðè ïîìîùè Object.
¨ Object.CurrentRegion. Äàííîå ñâîéñòâî âîçâðàùàåò òåêóùóþ îáëàñòü
äèàïàçîíà Object. Òåêóùàÿ îáëàñòü îïðåäåëÿåòñÿ êàê îáëàñòü, îêðóæàþ-
ùàÿ òåêóùóþ ÿ÷åéêó èëè äèàïàçîí ÿ÷ååê, îãðàíè÷åííûé ïóñòûìè ñòðî-
êàìè ñâåðõó è ñíèçó è ïóñòûìè ñòîëáöàìè ñëåâà è ñïðàâà.
3:
4: With Workbooks("Îò÷åòû.xlsx").Worksheets("Ëèñò2")
5: .Activate
6: .Range("Ïðîäàæà").Select
7: End With
8:
9: Charts.Add
10: End Sub
Äëÿ òîãî ÷òîáû ââåñòè äàííûå â ÿ÷åéêó èëè äèàïàçîí ÿ÷ååê, âû ìîæåòå
ïðèìåíÿòü êàê Value, òàê è Formula. Ëèñòèíã 10.16 äåìîíñòðèðóåò íåñêîëü-
êî ïðèìåðîâ òàêîãî èñïîëüçîâàíèÿ.
Ñèíòàêñèñ
Documents.Add([Template], [NewTemplate])
Îáà àðãóìåíòà ìåòîäà Documents.Add íå ÿâëÿþòñÿ îáÿçàòåëüíûìè. Template ïðåä-
ñòàâëÿåò ñòðîêîâîå âûðàæåíèå, çàäàþùåå èìÿ øàáëîíà äîêóìåíòà, íà êîòîðîì
äîëæåí îñíîâûâàòüñÿ íîâûé äîêóìåíò. Àðãóìåíò Template íàðÿäó ñ èìåíåì ôàéëà
ìîæåò âêëþ÷àòü èìÿ äèñêà è ïóòü ê ïàïêå. Âêëþ÷àòü ïîëíûé ïóòü íåîáõîäèìî,
åñëè øàáëîí äîêóìåíòà ðàñïîëîæåí â ïàïêå, îòëè÷íîé îò òîé, â êîòîðîé ïî óìîë-
÷àíèþ õðàíÿòñÿ øàáëîíû Word. Åñëè âû îïóñòèòå àðãóìåíò Template, Word ñîç-
äàñò íîâûé äîêóìåíò, îñíîâûâàÿñü íà øàáëîíå Normal.dot.
Àðãóìåíò NewTemplate ìîæåò áûòü ëþáûì âûðàæåíèåì òèïà Boolean. Åñëè îí ðà-
âåí çíà÷åíèþ True, Word ñîçäàåò íîâûé äîêóìåíò â âèäå øàáëîíà. Ïî óìîë÷àíèþ
çíà÷åíèå ýòîãî àðãóìåíòà ðàâíî çíà÷åíèþ False.
Object.Activate
Object ïðåäñòàâëÿåò ñîáîé ññûëêó íà äîêóìåíò, êîòîðûé ñëåäóåò ñäåëàòü àêòèâíûì.
Ðèñ. 10.6
 ðåçóëüòàòå ðàáîòû
êîäà ïðîöåäóðû
CreateNewLetter íà
ýêðàíå ïîÿâëÿåòñÿ
çàãîòîâêà ïèñüìà
1: Sub CreateTemplate()
2: 'Íà áàçå àêòèâíîãî äîêóìåíòà ñîçäàåòñÿ íîâûé øàáëîí äîêóìåíòà
3:
4: Dim NewName As String
5:
6: With ActiveDocument
7: If Not .Saved Then .Save
8: NewName = Left(.Name, Len(.Name) - 3) & "dot"
9: .SaveAs FileName:=NewName, FileFormat:=wdFormatTemplate
10: End With
11:
12: End Sub
Äëÿ òîãî ÷òîáû âûãðóçèòü îáùèé øàáëîí, èñïîëüçóéòå ìåòîä Delete êîë-
ëåêöèè AddIns â ñëåäóþùåé ñèíòàêñè÷åñêîé ôîðìå:
Ñèíòàêñèñ
AddIns(Name).Delete
Name — ñòðîêîâîå âûðàæåíèå, çàäàþùåå èìÿ øàáëîíà, êîòîðûé íóæíî âûãðó-
çèòü, èëè ÷èñëåííîå âûðàæåíèå, óêàçûâàþùåå íîìåð èíäåêñà øàáëîíà â êîëëåê-
öèè. Êàê è äëÿ áîëüøèíñòâà äðóãèõ êîëëåêöèé, ñëåäóåò ïîëüçîâàòüñÿ èìåíàìè
øàáëîíîâ, ÷òîáû ñîçäàâàòü óäîáî÷èòàåìûå è íàäåæíûå ïðîãðàììû.
Ðèñ. 10.7.
 ðåçóëüòàòå
ðàáîòû êîäà
ïðîöåäóðû
TestRange
â àêòèâíîì
äîêóìåíòå ïåðâîå
ñëîâî êàæäîãî
àáçàöà,
èìåþùåãî ñòèëü
«Îñíîâíîé
òåêñò» è äëèíó
íå ìåíåå òðåõ
ñëîâ, âûäåëÿåòñÿ
êóðñèâîì
Êîíñòàíòà Îïèñàíèå
wdCell ß÷åéêà òàáëèöû.
wdCharacter Ñèìâîë, âêëþ÷àÿ ñêðûòûå è íåïå÷àòàåìûå ñèìâîëû.
wdColumn Ñòîëáåö òàáëèöû.
Ñòðîêà òåêñòà. Âû ìîæåòå èñïîëüçîâàòü äàííóþ êîíñòàíòó òîëüêî
wdLine äëÿ àðãóìåíòà Unit, åñëè èñïîëüçóåìûé ìåòîä ïðèìåíÿåòñÿ
ê îáúåêòó Selection.
Àáçàö. Àáçàö îãðàíè÷èâàåòñÿ ñèìâîëîì êîíåö àáçàöà (¶). Ñèìâîë
êîíöà àáçàöà íå îòîáðàæàåòñÿ íà ýêðàíå ïîêà âû íå ùåëêíèòå
wdParagraph
êíîïêó Ïîêàçàòü âñå ñèìâîëû (Show All) ïàíåëè èíñòðóìåíòîâ
Word.
wdRow Ñòðîêà òàáëèöû.
wdSection Ðàçäåë äîêóìåíòà.
Ïðåäëîæåíèå. Ïðåäëîæåíèå îãðàíè÷èâàåòñÿ çíàêàìè ïóíêòóàöèè,
wdSentence
òàêèìè êàê òî÷êà (.), çíàê âîïðîñà (?) è âîñêëèöàòåëüíûé çíàê (!).
wdStory Îáëàñòü äîêóìåíòà.
wdTable Òàáëèöà.
wdWord Ñëîâî. Ñëîâî îãðàíè÷åíî ïðîáåëàìè è ñèìâîëàìè ïóíêòóàöèè.
Êîíñòàíòà Îïèñàíèå
wdGoToBookmar
Çàêëàäêà.
k
wdGoToField Ïîëå, íàïðèìåð ïîëå äàòû èëè íîìåðà ñòðàíèöû.
Çàãîëîâîê, òî åñòü òåêñò, îòôîðìàòèðîâàííûé ñ ïîìîùüþ îäíîãî
wdGoToHeading
èç ñòèëåé çàãîëîâêà: Çàãîëîâîê1, Çàãîëîâîê2 è òàê äàëåå.
wdGoToLine Ñòðîêà äîêóìåíòà.
wdGoToPage Ñòðàíèöà äîêóìåíòà.
Ìåñòîïîëîæåíèå â äîêóìåíòå, âûðàæåííîå â ïðîöåíòàõ îò äëèíû
wdGoToPercent
äîêóìåíòà.
Äîáàâëåíèå òåêñòà
Îñíîâíûì íàçíà÷åíèåì ïðîãðàìì ïîäãîòîâêè òåêñòà ÿâëÿåòñÿ õðàíåíèå
è îáðàáîòêà òåêñòà. Îäíîé èç îñíîâíûõ çàäà÷, âûïîëíÿåìûõ ïðè èíòåðàêòèâ-
íîé ðàáîòå ñ Word, ÿâëÿåòñÿ ââîä òåêñòà â äîêóìåíò. Òî÷íî òàêæå, îäíà èç
íàèáîëåå ðàñïðîñòðàíåííûõ çàäà÷, êîòîðóþ âàì ïðèäåòñÿ âûïîëíÿòü ïîä
óïðàâëåíèåì VBA-êîäà, áóäåò çàêëþ÷àòüñÿ â òîì, ÷òîáû äîáàâëÿòü òåêñò. Îáú-
åêòû Selection è Range èìåþò íåñêîëüêî ìåòîäîâ, ïðåäîñòàâëÿþùèõ âîç-
ìîæíîñòü äîáàâëÿòü òåêñò.  ïåðâóþ î÷åðåäü ðàññìîòðèì ìåòîäû äîáàâëåíèÿ
òåêñòà îáúåêòà Selection, ïîñêîëüêó âàì ÷àùå âñåãî ïðèäåòñÿ èìåòü äåëî
èìåííî ñ ýòèì îáúåêòîì.
Ïðîñòåéøèé ñïîñîá äîáàâèòü òåêñò â äîêóìåíò ñîñòîèò â èñïîëüçîâàíèè ìå-
òîäà TypeText îáúåêòà Selection, ñäåëàòü ýòî ìîæíî ïðè ïîìîùè ñëåäóþùåé
ñèíòàêñè÷åñêîé êîíñòðóêöèè:
Ñèíòàêñèñ
Object.TypeText([Text])
Object — ëþáàÿ ññûëêà íà îáúåêò Selection. Àðãóìåíò Text ÿâëÿåòñÿ îáÿçàòåëü-
íûì, îí ìîæåò áûòü ëþáûì ñòðîêîâûì âûðàæåíèåì, è ýòî èìåííî òîò òåêñò, êîòî-
ðûé äîáàâëÿåòñÿ â äîêóìåíò. Ìåòîä TypeText ïîìåùàåò òåêñò â òî ìåñòî, ãäå ðàñ-
ïîëîæåí êóðñîð âñòàâêè, êàê åñëè áû âû ââåëè åãî ñ êëàâèàòóðû. Åñëè Selection
ñîäåðæèò äèàïàçîí è ñâîéñòâî ReplaceSelection ðàâíî çíà÷åíèþ True, òî äîáàâ-
ëÿåìûé òåêñò çàìåíÿåò âûäåëåííûé ôðàãìåíò.  ïðîòèâíîì ñëó÷àå òåêñò ïîìåùà-
åòñÿ ïåðåä êóðñîðîì âñòàâêè îáúåêòà Selection. Ïðè óñòàíîâêå Word ñâîéñòâî
ReplaceSelection ïî óìîë÷àíèþ ïðèíèìàåò çíà÷åíèå True.
Òàê æå, êàê ìåòîä TypeText èìååò ñîïóòñòâóþùèé åìó ìåòîä TypePara-
graph, êîòîðûé ìîæíî èñïîëüçîâàòü äëÿ äîáàâëåíèÿ íîâîãî àáçàöà, ìåòîäû
InsertBefore è InsertAfter èìåþò ñîïóòñòâóþùèå ìåòîäû äëÿ äîáàâëåíèÿ
íîâîãî àáçàöà ïåðåä îáëàñòüþ èëè ïîñëå îáëàñòè, íà êîòîðóþ ññûëàåòñÿ îïðå-
äåëåííûé äèàïàçîí:
Ñèíòàêñèñ
Object.InsertParagraphBefore
Object.InsertParagraphAfter
 êàæäîé ñèíòàêñè÷åñêîé êîíñòðóêöèè Object — ññûëêà íà îáúåêò Selection èëè
íà îáúåêò Range. Ìåòîä InsertParagraphBefore äîáàâëÿåò ñèìâîë êîíöà àáçàöà
ïåðåä äèàïàçîíîì èëè âûäåëåííûì ôðàãìåíòîì, â òî âðåìÿ êàê ìåòîä
InsertParagraphAfter äîáàâëÿåò ñèìâîë êîíöà àáçàöà â êîíåö äèàïàçîíà èëè
âûäåëåííîãî ôðàãìåíòà. Íè òîò, íè äðóãîé ìåòîä íå èìååò àðãóìåíòîâ. Êàê è â ñëó-
÷àå ñ äðóãèìè ìåòîäàìè Insert…, äèàïàçîí èëè âûäåëåííûé ôðàãìåíò ðàñøèðÿ-
åòñÿ äëÿ âêëþ÷åíèÿ äîáàâëåííîãî ñèìâîëà êîíöà àáçàöà.
434 Ãëàâà 10
1: Sub InsertDocumentInformation()
2: 'Ïîìåùàåò â íà÷àëî äîêóìåíòà äâà àáçàöà
3: 'Ïåðâûé àáçàö ñîäåðæèò èìÿ ôàéëà, â êîòîðîì õðàíèòñÿ äîêóìåíò
4: 'Âòîðîé àáçàö ñîäåðæèò èìÿ ôàéëà-øàáëîíà äîêóìåíòà
5:
6: Dim aRange As Range
7:
8: Set aRange = ActiveDocument.Range(Start:=0, End:=0)
9:
10: With aRange
11: .InsertBefore Text:="Èìÿ ôàéëà äîêóìåíòà: " & _
12: ActiveDocument.FullName
13: .InsertParagraphAfter
14: .InsertAfter Text:="Ïðèñîåäèíåííûé ê äîêóìåíòó øàáëîí: " & _
15: ActiveDocument.AttachedTemplate.FullName
16: .InsertParagraphAfter
17: End With
18:
19: End Sub
Ðèñ. 10.8
Êîä ïðîöåäóðû InsertDocument-Information ïîìåùàåò â íà÷àëî òåêóùåãî äîêóìåíòà äâà
àáçàöà: ïåðâûé àáçàö ñîäåðæèò èìÿ ôàéëà, â êîòîðîì õðàíèòñÿ äîêóìåíò, âòîðîé àáçàö
ñîäåðæèò èìÿ ôàéëà-øàáëîíà äîêóìåíòà
Ðèñ. 10.9.
Êîä ïðîöåäóðû
TransposeParag
rahs ìåíÿåò
ìåñòàìè
òåêóùèé àáçàö
è àáçàö,
ñëåäóþùèé çà
íèì (äîêóìåíò
äî ïðèìåíåíèÿ
ïðîöåäóðû
TransposeParag
rahs)
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 437
Ðèñ. 10.10.
Êîä ïðîöåäóðû
TransposeParag
rahs ìåíÿåò
ìåñòàìè
òåêóùèé àáçàö
è àáçàö,
ñëåäóþùèé çà
íèì (äîêóìåíò
ïîñëå
ïðèìåíåíèÿ
ïðîöåäóðû
TransposeParag
rahs)
Îòëàäêà VB-êîäà.
11
Ïîèñê è óñòðàíåíèå
îøèáîê
Ê ñîæàëåíèþ, íà÷èíàþùèå ïðîãðàììèðîâàòü íåäîñòàòî÷íî ñåðüåçíî ïîäõî-
äÿò ê âîïðîñàì, î êîòîðûõ ïîéäåò ðå÷ü â ýòîé ãëàâå. Äàæå íåêîòîðûå îïûòíûå
ïðîãðàììèñòû óòâåðæäàþò, ÷òî â ìåòîäàõ îòëàäêè íåò íåîáõîäèìîñòè —
«íóæíî ïðîñòî ïèñàòü êîä áåç îøèáîê». Íà ïðàêòèêå æå ïîëó÷àåòñÿ, ÷òî îò-
ñóòñòâèå íàâûêîâ â âîïðîñàõ îòëàäêè ïðèâîäèò ê áîëüøèì ïîòåðÿì âðåìåíè.
Êàê áû âû íè ñòàðàëèñü, êîäà áåç îøèáîê íå áûâàåò. Êàæäàÿ ïîñëåäíÿÿ
íàéäåííàÿ âàìè îøèáêà äîëæíà âñåãî ëèøü ïðèäàâàòü âàì óâåðåííîñòè â òîì,
÷òî ñêîðî âû íàéäåòå åùå îäíó (ñíîâà «ïîñëåäíþþ») îøèáêó.
Ïðîöåññ íàõîæäåíèÿ îøèáîê (bugs) â ïðèëîæåíèè íàçûâàåòñÿ îòëàäêîé
(debugging). Â ýòîé ãëàâå ðàññìàòðèâàþòñÿ ñðåäñòâà îòëàäêè Visual Basic è âî-
ïðîñû «óïðàâëåíèÿ» îøèáêàìè âðåìåíè èñïîëíåíèÿ.
Òèïû îøèáîê
Âñå îøèáêè, êîòîðûå ìîãóò âîçíèêàòü ïðè ñîçäàíèè è ýêñïëóàòàöèè ïðèëî-
æåíèÿ, ìîæíî ðàçäåëèòü íà: cèíòàêñè÷åñêèå îøèáêè (syntax errors), îøèáêè
êîìïèëÿöèè (compile errors), îøèáêè âðåìåíè èñïîëíåíèÿ èëè runtime-îøèáêè
(runtime errors). Èíîãäà ãîâîðÿò åùå è î ëîãè÷åñêèõ îøèáêàõ, êîòîðûå ñâÿçû-
âàþò ñ òåì, ÷òî ïðîãðàììà âûïîëíÿåò íå òî, ÷òî õîòåë ðàçðàáîò÷èê, íî äëÿ ñèñ-
òåìû ïðîãðàììèðîâàíèÿ ýòî íå ÿâëÿåòñÿ îøèáêîé.
Ñèíòàêñè÷åñêèå îøèáêè âîçíèêàþò â ðåçóëüòàòå íåïðàâèëüíîãî ââîäà
êîäà. Ýòî ñàìûå ïðîñòûå îøèáêè: îíè îáíàðóæèâàþòñÿ ðåäàêòîðîì êîäà
Visual Basic ñðàçó è ÿâëÿþòñÿ ðåçóëüòàòîì íåñîáëþäåíèÿ ðàçðàáîò÷èêîì ñèí-
òàêñèñà ÿçûêà èëè ïðîñòî íåâíèìàòåëüíîñòè ïðè ââîäå êîäà. Íàïðèìåð, ìîæ-
íî ñëó÷àéíî íàïèñàòü èäåíòèôèêàòîð äëÿ êàêîé-ëèáî ïåðåìåííîé, ñîâïàäàþ-
ùèé ñ êëþ÷åâûì ñëîâîì, èëè íåïðàâèëüíî óêàçàòü àðãóìåíòû äëÿ âñòðîåííîé
ôóíêöèè. Ê ñèíòàêñè÷åñêèì, íàïðèìåð, îòíîñÿòñÿ îðôîãðàôè÷åñêèå îøèáêè
ïðè ââîäå êëþ÷åâîãî ñëîâà VBA, èìåíè ïåðåìåííîé èëè ïîäïðîãðàììû. Ðå-
äàêòîð VB «ñïîñîáåí» ðàñïîçíàâàòü áîëüøèíñòâî ñèíòàêñè÷åñêèõ îøèáîê ïî
ìåðå òîãî, êàê âû ðåäàêòèðóåòå èëè ââîäèòå òåêñò ïðîãðàììû. (VBA âûïîëíÿ-
åò ïðîâåðêó ñèíòàêñèñà, êîãäà âû ïåðåìåùàåòå êóðñîð âñòàâêè ñ âíîâü îòðå-
äàêòèðîâàííîé èëè íàáðàííîé ñòðîêè). Äðóãèå ñèíòàêñè÷åñêèå îøèáêè ìîãóò
440 Ãëàâà 11
ïðîÿâëÿòüñÿ êàê îøèáêè ïðè òðàíñëÿöèè. Â îáùåì, âñå, íà ÷òî ðåäàêòîð êîäà
Visual Basic (âî âðåìÿ ââîäà êîäà) ðåàãèðóåò âûâîäîì îêíà ñîîáùåíèÿ
(ðèñ. 11.1), ñîïðîâîæäàåìûì çâóêîâûì ñèãíàëîì, — ýòî ñèíòàêñè÷åñêèå
îøèáêè. Îáðàòèòå âíèìàíèå íà òî, ÷òî ñàì ðåäàêòîð VB íàçûâàåò ñèíòàêñè÷å-
ñêóþ îøèáêó îøèáêîé êîìïèëÿöèè (compile error) — ðåäàêòîð VB ïðîâåðÿåò
ñèíòàêñèñ çàïóñêîì êîìïèëÿòîðà, è îøèáêà ïðîèñõîäèò âî âðåìÿ êîìïèëÿ-
öèè, õîòÿ ýòî íå îçíà÷àåò, ÷òî îøèáêà íå ñèíòàêñè÷åñêàÿ.
Ðèñ. 11.1
Îáû÷íî òàê
ðåäàêòîð VB
ñîîáùàåò
îá îøèáêàõ
ñèíòàêñèñ
Ðèñ. 11.2
Ýòà îøèáêà áûëà
îáíàðóæåíà
ïðè ïîïûòêå
âûïîëíèòü êîä
ïðîöåäóðû
Îòëàäêà VB-êîäà. Ïîèñê è óñòðàíåíèå îøèáîê 441
Ðèñ. 11.3
Îøèáêà â âûçîâå
ïðîöåäóðû
Ðèñ. 11.4
Îøèáêà äåëåíèÿ íà íîëü
Ñðåäñòâà îòëàäêè
Ðàññìîòðèì ñðåäñòâà îòëàäêè êîäà, ïðåäîñòàâëÿåìûå ñèñòåìîé VBA. Êàê
è âñå ñîâðåìåííûå ñèñòåìû, VBA èìååò ôóíêöèè èíòåðàêòèâíîé îòëàäêè
êîäà. Âî-ïåðâûõ, ýòî — ïàíåëü Debug, êîòîðàÿ ïðåäñòàâëåíà íà ðèñ. 11.5. Ïà-
íåëü èíñòðóìåíòîâ Debug íå âûâîäèòñÿ íà ýêðàí àâòîìàòè÷åñêè. ×òîáû åå âû-
âåñòè, âûáåðèòå â ìåíþ êîìàíäó View | Toolbars | Debug (Âèä | Ïàíåëè èíñòðóìåí-
òîâ | Îòëàäêà). (Êîãäà ïàíåëü èíñòðóìåíòîâ âûâåäåíà íà ýêðàí, â ìåíþ ñëåâà îò
îïöèè Debug ïîÿâëÿåòñÿ «ãàëî÷êà».) Ïàíåëü èíñòðóìåíòîâ Debug ìîæíî ïåðå-
ìåùàòü òàê æå, êàê è ëþáóþ äðóãóþ ïàíåëü èíñòðóìåíòîâ è íàñòðàèâàòü åå ïî-
äîáíî ïàíåëÿì èíñòðóìåíòîâ Windows-ïðèëîæåíèé.
Ðèñ. 11.5.
Ïàíåëü Debug
1 – Exit Design Mode; 2 – Run Sub/UserForm; 3
– Break; 4 – Reset; 5 – Toggle Breakpoint; 6 –
Step Into; 7 – Step Over; 8 – Step Out; 9 – Locals
Window; 10 – Immediate Window; 11 – Watch
Window; 12 – Quick Window; 13 – Call Stack
Êíîïêà Íàçíà÷åíèå
Exit Design Mode Ïåðåâîäèò design-ðåæèì â ñîñòîÿíèå off èëè on.
Ñëóæèò äëÿ ïåðåêëþ÷åíèÿ èç ðåæèìà ðàçðàáîòêè â ðåæèì
âûïîëíåíèÿ (Run) èëè èç ðåæèìà ïðåðûâàííèÿ â ðåæèì
Run Sub/UserForm
âûïîëíåíèÿ (Continue). Â ðåæèìå ïðåðûâàíèÿ íàçâàíèå
êíîïêè ìåíÿåòñÿ íà Continue.
Îñòàíàâëèâàåò âûïîëíåíèå ïðèëîæåíèÿ è ïåðåêëþ÷àåò
Break
ñèñòåìó îòëàäêè â ðåæèì ïðåðûâàíèÿ.
Î÷èùàåò ñòåê âûïîëíåíèÿ è ïåðåìåííûå ìîäóëüíîãî óðîâíÿ.
Reset
Çàâåðøàåò âûïîëíåíèå êîäà.
Îòëàäêà VB-êîäà. Ïîèñê è óñòðàíåíèå îøèáîê 443
Êíîïêà Íàçíà÷åíèå
Óñòàíàâëèâàåò èëè îòìåíÿåò â òåêóùåé ñòðîêå òî÷êó
Toggle Breakpoint îñòàíîâà. Çäåñü ìîæíî ïðåðâàòü ïðîãðàììó, ïðîñìîòðåòü
íåêîòîðûå äàííûå è ïîñëå ïðîäîëæèòü âûïîëíåíèå êîäà.
Âûïîëíÿåò ñëåäóþùóþ ñòðîêó êîäà ñ çàõîäîì â ïðîöåäóðû.
Step Into Êîä ïðîöåäóðû âûïîëíÿåòñÿ ïî øàãàì, êàê è äî âõîäà
â ïðîöåäóðó.
Âûïîëíÿåò ñëåäóþùóþ ñòðîêó êîäà áåç çàõîäà â ïðîöåäóðû.
Step Over
Êîä ïðîöåäóðû âûïîëíÿåòñÿ êàê îäíà êîìàíäà.
Âûïîëíÿåò îñòàâøóþñÿ ÷àñòü òåêóùåé ïðîöåäóðû
Step Out è îñòàíàâëèâàåò ðàáîòó ïðîãðàììû íà ñëåäóþùåé ñòðîêå
âûçûâàþùåé ïðîöåäóðû.
Îòîáðàæàåò òåêóùèå çíà÷åíèÿ ëîêàëüíûõ ïåðåìåííûõ
Locals Window
â îòäåëüíîì îêíå.
Ïîçâîëÿåò âûïîëíèòü íóæíûå îïåðàòîðû èëè ïðîñìîòðåòü
Immediate Window
çíà÷åíèÿ ïåðåìåííûõ â ðåæèìå ïðåðûâàíèÿ.
Îòêðûâàåò îêíî ñ òåêóùèìè çíà÷åíèÿìè âûáðàííûõ
Watch Window
âûðàæåíèé.
Îòîáðàæàåò òåêóùåå çíà÷åíèå âûðàæåíèÿ â ðåæèìå
Quick Watch
ïðåðûâàíèÿ.
Îòîáðàæàåò â ðåæèìå ïðåðûâàíèÿ îêíî ñî ñïèñêîì
Call Stack âûçâàííûõ, íî åùå íå âûïîëíåííûõ ïðîöåäóð (ñòåê
âûçîâîâ).
Çàìå÷àíèå
Ïàíåëü Debug ïî óìîë÷àíèþ íå ïîÿâëÿåòñÿ íà ýêðàíå. Âû ñàìè ìîæåòå âûçâàòü åå, âûïîë-
íèâ êîìàíäû: View, Toolbars, Debug.
Ðåæèìû îòëàäêè
×òîáû òåñòèðîâàòü è îòëàæèâàòü (íàõîäèòü îøèáêè) ïðèëîæåíèå, âàì
íåîáõîäèìî ïîíÿòü, êàêèå ðåæèìû ðàáîòû èñïîëüçóþòñÿ ïðè ñîçäàíèè íîâîãî
ïðèëîæåíèÿ. Îñíîâíàÿ ÷àñòü ðàáîòû ïðîèñõîäèò â ðåæèìå ðàçðàáîòêè (design
time). Ïîñëå òîãî êàê ðàçðàáîò÷èê ïðèëîæåíèÿ âûáèðàåò êîìàíäû Run, Start,
ðåäàêòîð VB ïåðåõîäèò â ðåæèì èñïîëíåíèÿ (run time). Ýòîò ðåæèì åùå íå
ÿâëÿåòñÿ «áîåâûì», ïîñêîëüêó ïîääåðæèâàåòñÿ ñðåäîé ðåäàêòîðà VB
è ðàçðàáîò÷èê èìååò âîçìîæíîñòü òåì èëè èíûì ñïîñîáîì ïðèîñòàíîâèòü
âûïîëíåíèå êîäà â îïðåäåëåííîì ìåñòå äëÿ âûïîëíåíèÿ îòëàäî÷íûõ
îïåðàöèé, ò.å. ïåðåéòè â ðåæèì ïðåðûâàíèÿ. Â ðåæèìå ïðåðûâàíèÿ (break
mode) ïðîãðàììà íå âûïîëíÿåòñÿ, íî çàíèìàåò ïàìÿòü; çäåñü âû ìîæåòå
ïðîñìàòðèâàòü è èçìåíÿòü çíà÷åíèÿ ïåðåìåííûõ è âûðàæåíèé è äàæå
ïåðåìåùàòüñÿ ïî êîäó, âûïîëíÿÿ îäèí èëè ãðóïïó îïåðàòîðîâ.
Îñíîâíîå âðåìÿ ïðè ñîçäàíèè ïðèëîæåíèÿ çàíèìàåò ðåæèì ðàçðàáîòêè.
Çäåñü ê ïðèëîæåíèþ äîáàâëÿþòñÿ ôîðìû, ýëåìåíòû óïðàâëåíèÿ íà ôîðìàõ,
ìîäóëè êîäà è òàê äàëåå. Â ýòîì ðåæèìå èñïîëüçóåòñÿ òîëüêî îäíî ñðåäñòâî îò-
444 Ãëàâà 11
ëàäêè — ðåäàêòîð êîäà, íî, êðîìå òîãî, âû ìîæåòå ðàññòàâèòü òî÷êè îñòàíîâà
è îïðåäåëèòü êîíòðîëüíûå âûðàæåíèÿ.
 çàãîëîâêå ãëàâíîãî îêíà Visual Basic âñåãäà îòîáðàæàåòñÿ ðåæèì, â êîòî-
ðîì â äàííûé ìîìåíò âðåìåíè íàõîäèòñÿ ñèñòåìà: â çàãîëîâêå îêíà ïðèëîæå-
íèÿ ïîñëå èìåíè äîêóìåíòà â êâàäðàòíûõ ñêîáêàõ ïîìåùàþòñÿ ñëîâà design,
running, break. Äëÿ ïåðåêëþ÷åíèÿ ðåæèìîâ ìîæíî, êðîìå ìåíþ, èñïîëüçîâàòü
êíîïêè Start, Break è End ïàíåëè Debug.
Ðåæèì îñòàíîâà
 ïðîöåññå îòëàäêè ïðîãðàììû ó âàñ ÷àñòî áóäåò âîçíèêàòü ïîòðåáíîñòü,
ïðîñëåäèòü çà òåì, êàê èìåííî VBA âûïîëíÿåò îïåðàòîðû âàøåé ïðîãðàììû
è êàêèå çíà÷åíèÿ ïðèíèìàþò íåêîòîðûå ïåðåìåííûå íà ðàçíûõ ýòàïàõ åå âû-
ïîëíåíèÿ. Ðåæèì îñòàíîâà ðåäàêòîðà VB ïðåäîñòàâëÿåò âîçìîæíîñòü áîëåå
áëèçêîãî «âçàèìîäåéñòâèÿ» ñ íàïèñàííûì âàìè VBA-êîäîì ïî ñðàâíåíèþ
ñ îáû÷íûì åãî âûïîëíåíèåì (êîãäà êîä âûïîëíÿåòñÿ îò íà÷àëà äî êîíöà ñ ìàê-
ñèìàëüíîé ñêîðîñòüþ, êîòîðóþ ìîæåò îáåñïå÷èòü VBA, è âû íå â ñîñòîÿíèè
óñëåäèòü íè çà òåì, êàêèå ÷àñòè êîäà èñïîëíÿþòñÿ â äàííûé êîíêðåòíûé ìî-
ìåíò, íè çà òåì, ÷åìó â ýòîò ìîìåíò ðàâíû çíà÷åíèÿ èíòåðåñóþùèõ âàñ ïåðå-
ìåííûõ).  ðåæèìå æå îñòàíîâà âû ïîëó÷àåòå âîçìîæíîñòü èñïîëíåíèÿ êîäà
âàøåé ïðîãðàììû èëè îòäåëüíûõ åãî ÷àñòåé ïîñòðî÷íî èëè ïî îäíîé ïîäïðî-
ãðàììå çà øàã, êàê â çàìåäëåííîé ñúåìêå. Ïîîïåðàòîðíîå âûïîëíåíèå ïðî-
ãðàììû íàçûâàåòñÿ ïîøàãîâûì (single-stepping) ïðîõîäîì.
 VBA ïåðåâåñòè ðåäàêòîð VB â ðåæèì îñòàíîâà ìîæíî ñëåäóþùèìè ñïîñî-
áàìè:
¨ Ùåë÷êîì íà êíîïêå Debug (Îòëàäêà) â äèàëîãîâîì îêíå runtime-îøèáêè.
¨ Çàäàâ îäíó èëè íåñêîëüêî òî÷åê îñòàíîâà.
¨ Âñòàâèâ â òåêñò ïðîãðàììû îïåðàòîð Stop.
¨ Âîñïîëüçîâàâøèñü êîìàíäîé Debug | Step Into (Îòëàäêà | Øàã ñ çàõîäîì),
êíîïêîé Break èëè Step Into íà ïàíåëè Debug (èëè íàæàâ F8).
¨ Íàæàâ Esc èëè Ctrl+Break, ÷òîáû ïðåðâàòü âûïîëíåíèå ïðîãðàììû.
Òî÷êè îñòàíîâà
Äëÿ òîãî ÷òîáû îáíàðóæèòü ïðè÷èíó ïîÿâëåíèÿ runtime- è ëîãè÷åñêèõ
îøèáîê, â áîëüøèíñòâå ñëó÷àåâ ïðèõîäèòñÿ ïðèáåãàòü ê ïîøàãîâîìó âûïîëíå-
íèþ îïåðàòîðîâ ðàçðàáàòûâàåìîé ïðîãðàììû. Ïîøàãîâûé ïðîõîä ïðîãðàììû,
ïîçâîëÿåò ëèáî òî÷íî óçíàòü, êàêîé îïåðàòîð âûïîëíÿëñÿ â ìîìåíò âîçíèêíî-
âåíèÿ runtime-îøèáêè, ëèáî äàåò âîçìîæíîñòü ïðîêîíòðîëèðîâàòü âûïîëíå-
íèå ãðóïïû îïåðàòîðîâ, â êîððåêòíîñòè èñïîëíåíèÿ êîòîðûõ ðàçðàáîò÷èê ñî-
ìíåâàåòñÿ.
Ïîøàãîâûé ïðîõîä âñåõ îïåðàòîðîâ ïîäïðîãðàììû, à òåì áîëåå ïðîãðàììû
â öåëîì, ìîæåò îêàçàòüñÿ çàíÿòèåì äîâîëüíî óòîìèòåëüíûì è òðåáóþùèì
áîëüøèõ çàòðàò âðåìåíè. Æåëàíèå èëè âîçìîæíîñòü âûïîëíèòü ïîøàãîâûé
ïðîõîä âñåõ îïåðàòîðîâ ïðîãðàììû âîçíèêàåò íå÷àñòî. Ðåäàêòîð VB ïîçâîëÿåò
âûïîëíèòü áîëüøóþ ÷àñòü êîäà ñ ìàêñèìàëüíîé ñêîðîñòüþ, ïåðåõîäÿ â ðåæèì
îñòàíîâà òîëüêî òîãäà, êîãäà ýòî íåîáõîäèìî äëÿ âûïîëíåíèÿ îòäåëüíûõ
îïåðàòîðîâ êîäà. (Ïîìíèòå, ÷òîáû âûïîëíèòü ïîøàãîâûé ïðîõîä êîäà,
íåîáõîäèìî íàõîäèòüñÿ â ðåæèìå îñòàíîâà.)
Òî÷êà îñòàíîâà (breakpoint) — ýòî ñïåöèàëüíî ïîìå÷åííàÿ ñòðîêà ïðîãðàì-
ìû. Êîãäà VBA äîõîäèò äî òî÷êè îñòàíîâà, ïðîèñõîäèò åãî ïåðåêëþ÷åíèå èç
ðåæèìà îáû÷íîãî âûïîëíåíèÿ ïðîãðàììû â ðåæèì îñòàíîâà. Èñïîëüçîâàíèå
òî÷åê îñòàíîâà ïîçâîëÿåò âûïîëíèòü áîëüøóþ ÷àñòü ïðîãðàììû ñ ïîëíîé ñêî-
ðîñòüþ ñ ïåðåõîäîì â ðåæèì îñòàíîâà, òîëüêî êîãäà VBA äîñòèãàåò îïðåäåëåí-
íûõ îïåðàòîðîâ, âûïîëíåíèå êîòîðûõ âû õîòèòå ïðîâåðèòü áîëåå òùàòåëüíî.
Òî÷êà îñòàíîâà «äåéñòâóåò» äî òåõ ïîð, ïîêà âû åå íå óäàëèòå èëè íå çàêðîåòå
ïðîåêò, ñîäåðæàùèé ìîäóëü, â êîòîðîì îíà óñòàíîâëåíà.
Òî÷êó îñòàíîâà ìîæíî ïîìåñòèòü â ëþáîé ñòðîêå èñõîäíîãî êîäà, ñîäåðæà-
ùåé èñïîëíÿåìûé îïåðàòîð. Îáû÷íî òî÷êà îñòàíîâà çàäàåòñÿ ïåðåä îïåðàòî-
ðîì, êîòîðûé, êàê âû çíàåòå (èëè ïðåäïîëàãàåòå), ÿâëÿåòñÿ ïðè÷èíîé âîçíèê-
íîâåíèÿ ïðîáëåì. Äëÿ òîãî ÷òîáû çàäàòü òî÷êó îñòàíîâà, íåîáõîäèìî âûïîë-
íèòü ñëåäóþùèå øàãè:
446 Ãëàâà 11
Ðèñ. 11.7
 ðåæèìå
îñòàíîâà òåêóùèé
èñïîëíÿåìûé
îïåðàòîð
âûäåëÿåòñÿ â Code
Window æåëòûì
öâåòîì è ñòðåëêîé
ó ëåâîé ãðàíèöû
òåêñòà êîäà
Ðèñ. 11.9
Äèàëîãîâîå îêíî Add Watch, â êîòîðîì
â ñàìîì ïðîñòîì ñëó÷àå ìîæíî ïðîñòî
ùåëêíóòü íà êíîïêå OK
Âåðíåìñÿ ê îêíó Add Watch. Êàê óæå ìîæíî ïîíÿòü, â ñåêöèè Expression óêà-
çûâàåòñÿ âûðàæåíèå (ïåðåìåííàÿ), â ñåêöèè Context — íàèìåíîâàíèå ïðîöåäó-
ðû è ìîäóëÿ, ãäå íàõîäèòñÿ âûðàæåíèå. Åñëè ïåðåä âûçîâîì îêíà Add Watch äî-
450 Ãëàâà 11
Ðèñ. 11.10
 ðåæèìå ïîøàãîâîãî
âûïîëíåíèÿ êîäà
â îêíå Watch
ìîæíî íàáëþäàòü
çà èçìåíåíèåì çíà÷åíèé
âûðàæåíèé (ïåðåìåííûõ)
Ðèñ. 11.11
Îêíî Code è Watches
ïðè ïîøàãîâîì
âûïîëíåíèè êîäà
ïðèâåäåííîãî íèæå
ëèñòèíãà
4. Ùåëêíóâ êíîïêó OK, çàêðîéòå äèàëîãîâîå îêíî Edit Watch. VBA âíåñåò
â îêíî Watches ñîîòâåòñòâóþùèå èñïðàâëåíèÿ.
Ðèñ. 11.12
Îêíî Edit Watch îòëè÷àåòñÿ îò îêíà Add
Watch òîëüêî çàãîëîâêîì
è äîïîëíèòåëüíîé êíîïêîé Delete
(â ðåæèìå îñòàíîâà), ëèáî âûáåðèòå êîìàíäó View | Call Stack (Âèä | Ñòåê âûçîâà),
ëèáî ùåëêíèòå ìûøüþ ïî êíîïêå Call Stack íà ïàíåëè èíñòðóìåíòîâ Debug,
ëèáî íàæìèòå Ctrl+L. Íà ýêðàíå ïîÿâèòñÿ äèàëîãîâîå îêíî Call Stack, ïðèìåð
êîòîðîãî ïîêàçàí íà ðèñ. 11.14 (ïîñëåäîâàòåëüíîñòü âûçîâîâ ïðîöåäóð ìîæåò
áûòü èíîé). Êàê âèäíî èç ðèñ. 11.14, äèàëîãîâîå îêíî Call Stack âûâîäèò ñïèñîê
ïîñëåäîâàòåëüíîñòè âûçîâîâ ïðîöåäóð, ïðèâîäÿùåé ê âûïîëíÿåìîé â äàííûé
ìîìåíò ïðîöåäóðå èëè ôóíêöèè.
Ðèñ. 11.13
Îêíî Locals ïðè
ïîøàãîâîì
âûïîëíåíèè êîäà
ïðèâåäåííîãî
ðàíåå ëèñòèíãà
Âû, íàâåðíîå, óæå çàìåòèëè, ÷òî äèàëîãîâîå îêíî Call Stack ñîäåðæèò äâå
êíîïêè — Show (Ïîêàçàòü) è Close (Çàêðûòü). Êíîïêà Close ïðîñòî çàêðûâàåò
äèàëîãîâîå îêíî. Êíîïêà Show âûïîëíÿåò î÷åíü ïîëåçíóþ ôóíêöèþ è ñëóæèò
äëÿ òîãî, ÷òîáû ìîæíî áûëî íàéòè îïåðàòîð, âûçâàâøèé èñïîëíÿåìóþ â äàí-
íûé ìîìåíò ïîäïðîãðàììó. Êíîïêîé Show ìîæíî âîñïîëüçîâàòüñÿ äëÿ ïðîâåð-
êè çíà÷åíèé àðãóìåíòîâ, ïåðåäàííûõ âûïîëíÿåìîé ïðîöåäóðå. Äëÿ ýòîãî îò-
êðîéòå äèàëîãîâîå îêíî Call Stack, âûáåðèòå èìÿ ïðîöåäóðû, êîòîðàÿ âûçâàëà
òåêóùóþ ïðîöåäóðó, è ùåëêíèòå êîìàíäíóþ êíîïêó Show. VBA çàêðîåò äèàëî-
ãîâîå îêíî Call Stack è îòìåòèò â îêíå Code îïåðàòîð, ñîäåðæàùèé âûçîâ òåêó-
ùåé ïðîöåäóðû. Èñïîëüçóÿ êíîïêó Show è äèàëîãîâîå îêíî Call Stack, ìîæíî
ïðîéòè â îáðàòíîì íàïðàâëåíèè âäîëü âñåé öåïî÷êè âûçîâîâ ïîäïðîãðàìì.
Ðèñ. 11.14
Îêíî Call Stack è êîä,
ïîñðåäñòâîì êîòîðîãî
ìîæíî ïîëó÷èòü òàêîå îêíî
Îïåðàòîð Debug.Print
Îáúåêò VBA Debug èìååò ìåòîä Print, ïîçâîëÿþùèé âûâåñòè èíôîðìàöèþ
â îêíî Immediate â ïðîöåññå âûïîëíåíèÿ ïðîãðàììû. Äëÿ ýòîãî íåîáõîäèìî äî-
áàâèòü â ïðîãðàììó VBA îïåðàòîðû, âûçûâàþùèå ìåòîä Debug.Print.
Ìåòîä Debug.Print èñïîëüçóåòñÿ, êàê ïðàâèëî, â ñî÷åòàíèè ñ óæå èçó÷åí-
íûì â ýòîé ãëàâå îïåðàòîðîì Stop. Ñî÷åòàíèå ýòèõ äâóõ ýëåìåíòîâ ïîçâîëÿåò
âûïîëíÿòü ïðîãðàììû â îáû÷íîì (íåîòëàäî÷íîì) ðåæèìå, ïîëó÷àÿ ïðè ýòîì
îòëàäî÷íóþ èíôîðìàöèþ àíàëîãè÷íóþ òîé, êîòîðóþ äàåò èñïîëüçîâàíèå íà-
456 Ãëàâà 11
Îïåðàòîð Debug.Assert
Îáúåêò VBA Debug èìååò ìåòîä Assert, ïðèîñòàíàâëèâàþùèé âûïîëíåíèå
êîäà íà ñòðîêå, ñîäåðæàùåé ýòîò ìåòîä, ïðè âûïîëíåíèè íåêîòîðîãî óñëîâèÿ.
Ñèíòàêñèñ ìåòîäà ñëåäóþùèé:
Ñèíòàêñèñ
Debug.Assert Booleanexpression
Àðãóìåíò Booleanexpression — ëîãè÷åñêîå âûðàæåíèå, èìåþùåå ðåçóëüòàòîì çíà-
÷åíèå True èëè False.
Îáðàáîò÷èê îøèáîê
Îáðàáîò÷èê îøèáîê — ýòî êîä äëÿ ïåðåõâàòà è îáðàáîòêè îøèáîê â âàøåì
ïðèëîæåíèè. Èñïîëüçîâàíèå âàøèõ ñîáñòâåííûõ îáðàáîò÷èêîâ îøèáîê
ãîâîðèò î òîì, ÷òî âû çàìåòíî ïðîäâèíóëèñü ïî ïóòè èçó÷åíèÿ ïðîãðàì-
ìèðîâàíèÿ â ñèñòåìå Windows è î÷åíü ñêîðî ïîëüçîâàòåëè âàøèõ ïðîãðàìì
ïåðåñòàíóò ïîëó÷àòü ñîîáùåíèÿ îá îøèáêàõ íà íåïîíÿòíîì ÿçûêå ñîîáùåíèé
Windows.
Ñîçäàíèå ñâîåãî ñîáñòâåííîãî îáðàáîò÷èêà îøèáîê ñîñòîèò èç ñëåäóþùèõ
øàãîâ:
¨ Óñòàíîâêè ëîâóøêè ïðåðûâàíèé (error trap) ñîîáùåíèåì ìåñòà êîäà,
êóäà ñëåäóåò ïåðåéòè ïðè âîçíèêíîâåíèè îøèáêè (àäðåñ îáðàáîò÷èêà).
Ýòîò øàã îñóùåñòâëÿåòñÿ ïîñðåäñòâîì îïåðàòîðà On Error, êîòîðûé äå-
ëàåò äîñòóïíûì ïåðåõâàò ïðåðûâàíèé è óêàçûâàåò ìåòêó, çà êîòîðîé íà-
÷èíàåòñÿ îáðàáîò÷èê ïðåðûâàíèé.
¨ Íàïèñàíèÿ ïðîöåäóðû îáðàáîòêè ïðåðûâàíèé, ñâÿçàííûõ ñ îøèáêàìè
âàøåãî ïðèëîæåíèÿ.
¨ Îáåñïå÷åíèÿ âûõîäà èç ïðîöåäóðû îáðàáîòêè ïðåðûâàíèÿ.
Óñòàíîâêà ëîâóøêè ïðåðûâàíèé îñóùåñòâëÿåòñÿ ïðè ïîìîùè îïåðàòîðà On
Error, êîòîðûé ïðè ýòîì óêàçûâàåò íà îáðàáîò÷èê ïðåðûâàíèÿ. Ëîâóøêà îñ-
òàåòñÿ àêòèâíîé íà âðåìÿ ðàáîòû ïðîöåäóðû (ôóíêöèè), â êîòîðîé îíà óñòà-
íîâëåíà, ò.å. äî òîãî, êàê âûïîëíèòñÿ îäèí èç îïåðàòîðîâ Exit Sub, Exit
Function, Exit Property, End Sub, End Function èëè End Property ýòîé
ïðîöåäóðû (ôóíêöèè). Â ëþáîé ìîìåíò âðåìåíè ìîæåò áûòü äîñòóïíà òîëüêî
îäíà ëîâóøêà â äàííîé ïðîöåäóðå. Íî âû ìîæåòå ñîçäàâàòü ìíîãî ëîâóøåê
è àêòèâèçèðîâàòü èõ â ðàçíîå âðåìÿ. Ëîâóøêó ìîæíî ñäåëàòü íåàêòèâíîé ïðè-
ìåíåíèåì ñïåöèàëüíîãî òèïà êîìàíäû On Error — On Error GoTo 0.
Ïðîñòîé ñèíòàêñèñ îïåðàòîðà On Error GoTo èìååò âèä:
Ñèíòàêñèñ
On Error GoTo label
Çäåñü label — ìåòêà (îòìå÷àåìàÿ â êîäå äâîåòî÷èåì çà íåé), çà êîòîðîé íà÷èíàåòñÿ
îáðàáîò÷èê.
Îïåðàòîð Îïèñàíèå
Âûïîëíåíèå êîäà âîçîáíîâëÿåòñÿ ñ òîãî îïåðàòîðà, êîòîðûé
Resume [0] âûçâàë îøèáêó. Èñïîëüçóéòå ýòîò îïåðàòîð äëÿ ïîâòîðåíèÿ êîäà
ïîñëå èñïðàâëåíèÿ îøèáêè.
Âîçîáíîâëÿåò âûïîëíåíèå êîäà ñ îïåðàòîðà, ñëåäóþùåãî
íåïîñðåäñòâåííî çà îïåðàòîðîì, âûçâàâøèì îøèáêó. Åñëè
îøèáêà ïðîèçîøëà âíå ïðîöåäóðû, ñîäåðæàùåé áëîê îáðàáîòêè
Resume Next
îøèáîê, âûïîëíåíèå êîäà âîçîáíîâëÿåòñÿ ñ îïåðàòîðà,
íàõîäÿùåãîñÿ çà âûçîâîì ïðîöåäóðû, âûçâàâøåé îøèáêó, åñëè
â ýòîé ïðîöåäóðå íåò ñâîåãî îáðàáîò÷èêà.
Âîçîáíîâëÿåò âûïîëíåíèå êîäà ñ óêàçàííîé ìåòêè line. Ìåòêà
Resume line äîëæíà íàõîäèòüñÿ â ïðîöåäóðå, ñîäåðæàùåé îáðàáîò÷èê
îøèáîê.
Ýìóëèðóåò îøèáêó âðåìåíè èñïîëíåíèÿ. Êîãäà ýòîò îïåðàòîð
Err.Raise
âûïîëíÿåòñÿ âíóòðè áëîêà îáðàáîòêè îøèáîê, Visual Basic
Number:=
îáðàùàåòñÿ ê ñïèñêó âûçîâîâ (ïîñëåäîâàòåëüíîñòü âûçîâà
number
ïðîöåäóð) äëÿ ïîèñêà äðóãîãî îáðàáîò÷èêà.
10:
11: err:
12: If err.Number = 13 Then
13: MsgBox ("Ïðîñèëè æå Âàñ ââåñòè ÷èñëî!")
14: Resume
15: End If
16: End Sub
14: If co = 2 Then
15: MsgBox ("Ñ Âàøåãî ðàçðåøåíèÿ ââåäåì 9999")
16: y = 9999
17: Resume Next
18: Else
19: co = co + 1
20: MsgBox ("Ó Âàñ îñòàëîñü " & _
21: (3 - co) & " ïîïûòêè")
22: Resume
23: End If
24: End If
25: End Sub
26:
27: Private Sub Form_Load()
28: co = 0
29: End Sub
1: Sub TestError()
2: Dim xlApp As Object
3: Dim xlSheet As Object
4: On Error Resume Next
464 Ãëàâà 11