Sei sulla pagina 1di 451

Ââåäåíèå

Íåñìîòðÿ íà òî, ÷òî ìíîãèå çàäà÷è Microsoft Office ïîçâîëÿåò âûïîëíèòü


è áåç ïðîãðàììèðîâàíèÿ, îäíèì èç íàèáîëåå âàæíûõ è ïîëåçíûõ åãî ñâîéñòâ
ÿâëÿåòñÿ âîçìîæíîñòü àâòîìàòèçàöèè ïðîöåññîâ âçàèìîäåéñòâèÿ ïîëüçîâàòå-
ëÿ è ïðèëîæåíèé Microsoft Office, êîòîðàÿ ïîçâîëÿåò ðåøàòü, ïðàêòè÷åñêè,
âñå ñîâðåìåííûå áèçíåñ-çàäà÷è: îò ñîçäàíèÿ ïðîñòûõ äîêóìåíòîâ è îò÷åòîâ äî
ïîëíîé àâòîìàòèçàöèè äîêóìåíòîîáîðîòà ñ èñïîëüçîâàíèåì ñèñòåì óïðàâëå-
íèÿ áàçàìè äàííûõ. Ýòî îáñòîÿòåëüñòâî ñâÿçàíî ñ òåì, ÷òî âñå ïðèëîæåíèÿ
Microsoft Office ïîääåðæèâàþò ÿçûê ïðîãðàììèðîâàíèÿ Visual Basic for Appli-
cations (VBA), ñîâìåñòèìûé ñ Visual Basic 6. Âàæíåéøèì äîñòîèíñòâîì VBA
ÿâëÿåòñÿ âîçìîæíîñòü îáúåäèíÿòü ëþáûå ïðèëîæåíèÿ Microsoft Office äëÿ
âûïîëíåíèÿ îäíîé èëè íåñêîëüêèõ çàäà÷.
Ïðèâëåêàòåëüíàÿ îñîáåííîñòü VBA â òîì, ÷òî îí î÷åíü óäîáåí äëÿ ïåðâîãî
çíàêîìñòâà ñ ïðîãðàììðîâàíèåì â ñðåäå Windows. Â íàèáîëåå èñïîëüçóåìûõ
ïðèëîæåíèÿõ Microsoft Office èìååòñÿ Ðåäàêòîð VB (Visual Basic Editor)
è ìàêðîðåêîðäåð — ñðåäñòâî êîäèðîâàíèÿ äåéñòâèé ïîëüçîâàòåëÿ äëÿ ïîñëå-
äóþùåãî èõ ïîâòîðåíèÿ. Ýòè èíñòðóìåíòû, êðîìå âñåãî ïðî÷åãî, ìîãóò ñ óñïå-
õîì èñïîëüçîâàòüñÿ äëÿ îáó÷åíèÿ ïðîãðàììèðîâàíèþ — áåç óòîìèòåëüíîãî ïî-
èñêà èíôîðìàöèè ïî ðàçëè÷íîãî ðîäà ñïðàâî÷íèêàì âû ìîæåòå «çàïèñàòü»
ìíîãèå ñâîè äåéñòâèÿ ïîñðåäñòâîì ìàêðîðåêîðäåðà, à çàòåì ðàññìîòðåòü ðå-
çóëüòðóþùèé êîä. Ðåäàêòîð VB — ýòî íå òîëüêî ñðåäñòâî ðåäàêòèðîâàíèÿ
êîäà, íî è çàìå÷àòåëüíîå ñðåäñòâî îòëàäêè êîäà è èçó÷åíèÿ ÿçûêà Visual
Basic, òàê êàê âû ìîæåòå â èíòåðàêòèâíîì ðåæèìå ïðîâåðèòü äåéñòâèå ëþáîé
ñèíòàêñè÷åñêîé êîíñòðóêöèè.
 íàñòîÿùåå âðåìÿ Microsoft Office ÿâëÿåòñÿ íå íàáîðîì ïðîãðàììíûõ ïðî-
äóêòîâ èíäèâèäóàëüíîãî ïðèìåíåíèÿ, à êîìïëåêñíîé èíòåãðèðîâàííîé ñèñòå-
ìîé, â êîòîðóþ, êðîìå óæå çíàêîìûõ ìíîãèì ïîëüçîâàòåëÿì ñðåäñòâ (Word,
Excel è ò.ä.), âõîäÿò ñåðâåðû, ñëóæáû è ïðèëîæåíèÿ äëÿ íàñòîëüíûõ êîìïüþ-
òåðîâ, ïðåäíàçíà÷åííûå äëÿ èñïîëüçîâàíèÿ ïðè ðåøåíèè øèðîêîãî ñïåêòðà
áèçíåñ-çàäà÷. Íåñìîòðÿ íà òî, ÷òî ìíîãèå ïðàêòè÷åñêèå çàäà÷è ñ èñïîëüçîâà-
íèåì Microsoft Office ìîæíî âûïîëíèòü áåç ïðîãðàììèðîâàíèÿ, èìååò ñìûñë
èçó÷åíèÿ ÿçûêà VBA äëÿ ðàñøèðåíèÿ ñïåêòðà ðåøàåìûõ ïðîáëåì.
Ïðèëîæåíèÿ Microsoft Office îáåñïå÷èâàþò äîñòóï êî ìíîãèì ñîâðåìåííûì
ñèñòåìàì áàç äàííûõ. Ïîëüçîâàòåëü ìîæåò âíåñòè ðåçóëüòàòû ñëîæíîãî SQL-
çàïðîñà èç óäàëåííîé áàçû äàííûõ êîëëåêòèâíîãî äîñòóïà â ëþáîé ñîçäà-
âàåìûé èì îò÷åò èëè ïðîåêò. Ïðèìåíåíèå äëÿ ýòèõ öåëåé VBA-êîäà ðàñøè-
ðÿåò òàêèå âîçìîæíîñòè è óëó÷øàåò ïîëüçîâàòåëüñêèé èíòåðôåéñ.
 ýòîé êíèãå ñîäåðæèòñÿ ââîäíûé êóðñ ïî èñïîëüçîâàíèþ ÿçûêà è ñèñòåìû
VBA â îñíîâíîì äëÿ Microsoft Word 2007, Microsoft Excel 2007, õîòÿ ìíîãèå
Word/Excel-ïðîãðàììû (ïðîöåäóðû) áóäóò ðàáîòàòü è äëÿ Word/Excel 2000/3.
Êíèãà ïðåäíàçíà÷åíà äëÿ íà÷èíàþùèõ ïðîãðàììèðîâàòü â ñðåäå Windows
2000/XP ñ èñïîëüçîâàíèåì â êà÷åñòâå áàçîâûõ îáúåêòîâ Word è Excel, òàêèõ
êàê äîêóìåíòû, ðàáî÷èå êíèãè, ëèñòû, ïðåçåíòàöèè è òàê äàëåå, ò.å. îáúåêòû,
êîòîðûå õîðîøî èçâåñòíû ïîëüçîâàòåëÿì ýòèõ ïðèëîæåíèé. Òîëüêî òåïåðü
14 Ãëàâà

èìååòñÿ âîçìîæíîñòü ïîñìîòðåòü íà ýòè îáúåêòû «èçíóòðè», óçíàòü èõ ñòðî-


åíèå: ñâîéñòâà, ìåòîäû, âçàèìîñâÿçè.
Ïîðàáîòàâ ñ ýòîé êíèãîé, âû ñìîæåòå ñîçäàâàòü êàê ïðîñòûå ìàêðîñû,
ïîìîãàþùèå àâòîìàòèçèðîâàòü ðóòèííóþ ïîâòîðÿþùóþñÿ ðàáîòó íàä äîêó-
ìåíòàìè è ýëåêòðîííûìè òàáëèöàìè, òàê è äîñòàòî÷íî ñëîæíûå ïðèëîæåíèÿ,
îáðàáàòûâàþùèå äàííûå â äèàëîãîâûõ îêíàõ, îáåñïå÷èâàþùèõ ïîëüçîâàòåëÿ
ñàìûìè ñîâðåìåííûìè èíòåðôåéñíûìè ñðåäñòâàìè. Äàëåå âàì íè÷òî íå ïîìå-
øàåò íà÷àòü èçó÷åíèå ñèñòåìû Visual Basic (ñèñòåìû ïðîãðàììèðîâàíèÿ ïî-
äîáíîé C++Buider èëè Delphi) è Visual Basic .NET, îòêðûâàþùèõ ïåðåä âàìè
åùå áîëüøèå ãîðèçîíòû è ïîçâîëÿþùèõ òàêæå èñïîëüçîâàòü îáúåêòû ïðèëî-
æåíèé Microsoft Office.
Áîëüøóþ ïîëüçó ýòà êíèãà ìîæåò ïðèíåñòè ìåíåäæåðàì, êîòîðûå â ñâîåé
ïðîôåññèîíàëüíîé äåÿòåëüíîñòè ìíîãî âðåìåíè ðàáîòàþò çà êîìïüþòåðàìè
è ðåøàþò çàäà÷è, â êîòîðûõ íåò ìåñòà òàêèì ñèñòåìàì ïðîãðàììèðîâàíèÿ,
êàê Visual C++, Delphi è òàê äàëåå. Áîëåå òîãî, ïîñêîëüêó ìåíåäæåðàì ÷àùå
âñåãî ïðèõîäèòñÿ èñïîëüçîâàòü ïðîäóêòû Microsoft Office, èìåííî VBA èì
ìîæåò ïðèãîäèòüñÿ áîëüøå âñåãî, ïîòîìó ÷òî ýòî — «ðîäíîé» ÿçûê äëÿ ýòèõ
ïðîäóêòîâ. Ê òîìó æå âîçìîæíîñòè VBA ñîâñåì íå óñòóïàþò äðóãèì ÿçûêàì
ïðîãðàììèðîâàíèÿ â Windows è ïîñòîÿííî ðàñòóò.
Ýëåìåíòû îôîðìëåíèÿ êíèãè
Äëÿ óëó÷øåíèÿ âîñïðèÿòèÿ ìàòåðèàëà êíèãè â íåé èñïîëüçóþòñÿ ñëåäóþ-
ùèå ýëåìåíòû îôîðìëåíèÿ:
¨ âïåðâûå âñòðå÷àþùèåñÿ òåðìèíû âûäåëåíû êóðñèâîì;
¨ êëþ÷åâûå ñëîâà ÿçûêà ïðîãðàììèðîâàíèÿ, íàèìåíîâàíèÿ ýëåìåíòîâ óï-
ðàâëåíèÿ âûäåëåíû øðèôòîì Courier New, Bold;
¨ êîìàíäû ìåíþ, íàèìåíîâàíèÿ êíîïîê, îêîí è äðóãèõ ýëåìåíòîâ óïðàâëå-
íèÿ äèàëîãîâûõ îêîí âûäåëåíû øðèôòîì Arial, Bold;
¨ èìåíà ïåðåìåííûõ VB-êîäà, íàèìåíîâàíèÿ ôàéëîâ è ïðîñòî òåêò, íà
êîòîðûé ñëåäóåò îáðàòèòü âíèìàíèå, îòìå÷åí êàê Bold.
Ââåäåíèå â ìàêðîñû
1
Äàëåêî íå âñå ïîëüçîâàòåëè Word è Excel è äðóãèõ ïðîäóêòîâ Microsoft Of-
fice çíàþò î òîì, ÷òî ýòè ïðèëîæåíèÿ ñîâåðøåííî íå íàñòðîåíû äëÿ âûïîë-
íåíèÿ òåõ çàäà÷, äëÿ êîòîðûõ ïðåäíàçíà÷åíû. Ìàëî êòî èç ïîëüçîâàòåëåé,
àêòèâíî ðàáîòàþùèõ, íàïðèìåð, ñ Word èëè Excel, êîãäà-ëèáî âîîáùå ÷èòàë
ïîñîáèå ïî ðàáîòå ñ ýòèìè ïðîäóêòàìè — ïðîñòî óñòàíîâèëè èõ (ìîæåò áûòü,
ïðè ïîìîùè êîãî-íèáóäü ïîîïûòíåå, ÷åì ñàìè) è íà÷àëè ñîçäàâàòü ïîëåçíûå
(è íå î÷åíü) äîêóìåíòû. Ìåæäó òåì, âñå ïðèëîæåíèÿ Microsoft Office ÿâëÿ-
þòñÿ òàêèìè æå êîíñòðóêòîðàìè, êàê è òå êîìïüþòåðû, êîòîðûå ìû îáû÷íî
èñïîëüçóåì ñ ýòèìè ïðèëîæåíèÿìè. Äëÿ ìíîãèõ òèïîâ çàäà÷, ðåøàåìûõ ïðè
ïîìîùè ýòèõ ïðèëîæåíèé, èõ íóæíî íàñòðàèâàòü. Ïðèìåðîì íàñòðîåê ìîãóò
ñëóæèòü ìíîãî÷èñëåííûå øàáëîíû äîêóìåíòîâ â Word, î êîòîðûõ, âïðî÷åì,
òîæå çíàþò äàëåêî íå âñå ïîëüçîâàòåëè. Äàæå ñðåäè çíàþùèõ î ñóùåñòâîâàíèè
øàáëîíîâ è ñòèëåé (!) ìíîãèå íå çíàþò ñàìûõ ïðîñòûõ äîïîëíèòåëüíûõ
âîçìîæíîñòåé ýòèõ ïðîäóêòîâ, êîòîðûå ðåàëèçóþòñÿ ïîñðåäñòâîì ìàêðîñîâ.
Êîíå÷íî, è Word, è Excel ïðåäîñòàâëÿþò äîñòàòî÷íî øèðîêèé íàáîð ôóíêöèé
äëÿ âûïîëíåíèÿ ñàìûõ ðàçíîîáðàçíûõ îôèñíûõ çàäà÷, íî âñå æå çíàíèå
è èñïîëüçîâàíèå ìàêðîñîâ VBA äàåò òàêèå ïðåèìóùåñòâà, êîòîðûå íåâîç-
ìîæíî ïåðåîöåíèòü.
Ïåðåä òåì êàê âû íà÷íåòå ïèñàòü ñîáñòâåííûå ìàêðîñû, âàì ñëåäóåò õîðîøî
ïîíÿòü, ÷òî òàêîå ìàêðîñû è ÷åì îòëè÷àåòñÿ VBA-ïðîãðàììèðóåìûé ìàêðîñ
îò çàïèñàííîãî ìàêðîðåêîðäåðîì.
Íåçàâèñèìî îò èñïîëüçóåìûõ âàìè îïåðàöèîííîé ñèñòåìû è ïðîãðàììíûõ
ïðèëîæåíèé âû ÷àñòî âûïîëíÿåòå îäíè è òå æå ïîñëåäîâàòåëüíîñòè êîìàíä
äëÿ ìíîãèõ ðóòèííûõ çàäà÷. Âìåñòî ïîâòîðåíèÿ ïîñëåäîâàòåëüíîñòè êîìàíä
êàæäûé ðàç, êîãäà âàì íåîáõîäèìî âûïîëíèòü êàêóþ-ëèáî çàäà÷ó, âû ìîæåòå
ñîçäàòü ìàêðîñ (macro), êîòîðûé âìåñòî âàñ áóäåò âûïîëíÿòü ýòó ïîñëåäî-
âàòåëüíîñòü. Ìàêðîñû ïîçâîëÿþò ââîäèòü îäèíî÷íóþ êîìàíäó, âûïîëíÿþùóþ
òó æå çàäà÷ó, äëÿ ðåàëèçàöèè êîòîðîé âàì áûëî áû íåîáõîäèìî ââîäèòü
íåñêîëüêî êîìàíä âðó÷íóþ. Íàïðèìåð, åñëè âàì íóæíî äëÿ ìíîãèõ àáçàöåâ
áîëüøîãî äîêóìåíòà èçìåíèòü ñòèëè íà äðóãèå (ñòàíäàðòíûå, ðàíåå âàìè
ïîäãîòîâëåííûå èëè ýêñïîðòèðîâàííûå èç äðóãèõ äîêóìåíòîâ), âû ìîãëè áû
çàïèñàòü äåéñòâèÿ, ñâÿçàííûå ñ ïîèñêîì è âûáîðîì ñòèëÿ, ïðè ïîìîùè
ìàêðîðåêîðäåðà ñ íàçíà÷åíèåì çàïèñàííîìó ìàêðîñó «ãîðÿ÷èõ êëàâèø».
 ýòîì ñëó÷àå äëÿ èçìåíåíèÿ ñòèëÿ àáçàöà âàì äîñòàòî÷íî áûëî áû ïîìåñòèòü
êóðñîð âñòàâêè íà íóæíûé àáçàö è íàæàòü êîìáèíàöèþ êëàâèø. ×åì áîëüøå
ïîäîáíûõ èçìåíåíèé íåîáõîäèìî âíåñòè â äîêóìåíò, òåì áîëüøèé ýôôåêò
ìîæíî ïîëó÷èòü îò òàêîãî ýëåìåíòàðíîãî çàïèñàííîãî ìàêðîñà èëè íåñêîëü-
êèõ: ñêîëüêî èñïîëüçóåìûõ ñòèëåé — ñòîëüêî è ìàêðîñîâ ñ «ãîðÿ÷èìè
êëàâèøàìè».
16 Ãëàâà 1

Çàïèñàííûå ìàêðîðåêîðäåðîì ïîñëåäîâàòåëüíîñòè êîìàíä ïåðâîíà÷àëüíî


íàçûâàëèñü ìàêðîêîìàíäàìè (macro-commands). Ñåé÷àñ ýòîò òåðìèí
ñîêðàòèëñÿ äî áîëåå ïðîñòîãî ñëîâà ìàêðîñ. (Òåðìèí macro èñïîëüçóåòñÿ êàê
ïðåôèêñ â íåñêîëüêèõ ñëîâàõ â àíãëèéñêîì ÿçûêå; îí ïðîèçîøåë îò
ãðå÷åñêîãî ñëîâà, îçíà÷àþùåãî ðàñøèðåííûé èëè ðàñòÿíóòûé).
Ïðèìåíèòåëüíî ê èíôîðìàòèêå è ïðîãðàììíûì ïðèëîæåíèÿì ïîä ñëîâîì
ìàêðîñ âñåãäà ïîäðàçóìåâàåòñÿ ìàêðîêîìàíäà.
Ìàêðîñû, êðîìå óäîáñòâà, èìåþò è äðóãèå ïðåèìóùåñòâà. Ïîñêîëüêó
êîìïüþòåðû ïðèñïîñîáëåíû äëÿ âûïîëíåíèÿ ïîâòîðÿþùèõñÿ çàäà÷ áîëüøå,
÷åì ëþäè, çàïèñü ìàêðîðåêîðäåðîì íåîäíîêðàòíî âûïîëíÿåìûõ êîìàíä
ïîâûøàåò òî÷íîñòü è ñêîðîñòü ðàáîòû. Äðóãèì ïðåèìóùåñòâîì èñïîëüçîâàíèÿ
ìàêðîñîâ ÿâëÿåòñÿ òî, ÷òî ïðè èõ âûïîëíåíèè îáû÷íî íåò íåîáõîäèìîñòè
â ïðèñóòñòâèè ÷åëîâåêà-îïåðàòîðà.  ñëó÷àå, åñëè ìàêðîñ î÷åíü äëèííûé èëè
âûïîëíÿåò îïåðàöèè, òðåáóþùèå çíà÷èòåëüíîãî âðåìåíè (íàïðèìåð, ïîèñê
â áàçå äàííûõ è ñîðòèðîâêà), âû ìîæåòå îñòàâèòü ðàáîòàþùèé êîìïüþòåð è,
íàïðèìåð, ïîïèòü êîôå èëè ïåðåêëþ÷èòüñÿ íà äðóãîå ïðèëîæåíèå, åñëè, êî-
íå÷íî, âû ñâÿòî âåðèòå â òî, ÷òî Windows — ìíîãîçàäà÷íàÿ ñèñòåìà.
Ìàêðîðåêîðäåð (èëè ïðîñòî «ðåêîðäåð») çàïèñûâàåò âñå äåéñòâèÿ ïîëüçîâà-
òåëÿ, âêëþ÷àÿ îøèáêè è íåïðàâèëüíûå çàïóñêè. Êîãäà ïðîãðàììà âîñïðîèçâî-
äèò ìàêðîñ, îíà âûïîëíÿåò êàæäóþ çàïèñàííóþ ðåêîðäåðîì êîìàíäó òî÷íî
â òàêîé ïîñëåäîâàòåëüíîñòè, â êîòîðîé âû èõ âûïîëíÿëè âî âðåìÿ çàïèñè.
Ïåðâûå ìàêðîðåêîðäåðû èìåëè ñåðüåçíûé íåäîñòàòîê. Åñëè âû çàïèñûâàëè
äëèííóþ ñåðèþ äåéñòâèé, ñîäåðæàùóþ íåáîëüøóþ îøèáêó, åäèíñòâåííîé
âîçìîæíîñòüþ óäàëèòü ýòó îøèáêó ÿâëÿëàñü ïîâòîðíàÿ çàïèñü ìàêðîñà. Êðîìå
òîãî, åñëè âàì áûëî íåîáõîäèìî âíåñòè íåáîëüøîå èçìåíåíèå â äëèííûé
ìàêðîñ, òî òàêæå ïðèõîäèëîñü ïåðåçàïèñûâàòü âåñü ìàêðîñ. Ïåðåçàïèñü
äëèííîãî ìàêðîñà ÷àñòî ïðèâîäèëà ê äîïîëíèòåëüíûì îøèáêàì â íîâîé
çàïèñè. Ïî ýòèì ïðè÷èíàì ðàçðàáîò÷èêè ïðîãðàììíîãî îáåñïå÷åíèÿ äîáàâèëè
ìàêðîðåêîðäåðàì âîçìîæíîñòü ðåäàêòèðîâàíèÿ ìàêðîñîâ, ÷òîáû âû ìîãëè
ëåãêî èñïðàâëÿòü íåáîëüøèå îøèáêè èëè âíîñèòü äðóãèå èçìåíåíèÿ â ìàêðîñ
áåç åãî ïîëíîé ïåðåçàïèñè.

Èç èñòîðèè 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

âåðñèþ BASIC, âñòðîåííóþ â ìèêðîñõåìû ROM (Read Only Memory)


êîìïüþòåðà.
Ñ ãîäàìè ïåðâîíà÷àëüíàÿ ñòðóêòóðà è ñïåöèôèêàöèè BASIC áûëè
óëó÷øåíû. Ïî ìåðå óñîâåðøåíñòâîâàíèÿ è èçìåíåíèÿ òåõíîëîãèè äëÿ ÿçûêîâ
ïðîãðàììèðîâàíèÿ ðàçëè÷íûå ñîçäàòåëè ïðîãðàììíîãî îáåñïå÷åíèÿ
äîáàâëÿëè íåêîòîðûå âîçìîæíîñòè ê ïåðâîíà÷àëüíîìó BASIC. Ñîâðåìåííûå
äèàëåêòû BASIC îáû÷íî èìåþò ìíîãèå èëè âñå ñâîéñòâà, ñóùåñòâóþùèå
â äðóãèõ áîëåå ïîçäíèõ ÿçûêàõ ïðîãðàììèðîâàíèÿ, òàêèõ êàê Pascal èëè C.
 êîíöå 80-õ ãîäîâ Microsoft îïóáëèêîâàëà çíà÷èòåëüíî óëó÷øåííóþ
âåðñèþ ÿçûêà BASIC, íàçâàííóþ QuickBASIC. QuickBASIC âêëþ÷àë ïî÷òè âñå
âîçìîæíîñòè ñîâðåìåííûõ ñèñòåì ðàçðàáîòêè ïðîãðàììíîãî îáåñïå÷åíèÿ.
Microsoft ïîñòàâëÿëà âåðñèþ QuickBASIC ñ DOS Version 6.0 è áîëåå ïîçäíèìè
âåðñèÿìè (íî íå Windows 95).
Ïîñëå íåñêîëüêèõ âåðñèé QuickBASIC â 1992 ãîäó Microsoft ïðåäñòàâèëà
Visual Basic for Windows. Êàê è â ñëó÷àå ñ QuickBASIC, Visual Basic for Win-
dows áûë äîïîëíåí ñîâðåìåííûìè âîçìîæíîñòÿìè è òåñíî èíòåãðèðîâàí
â ñðåäó Windows. Visual Basic ïðåäîñòàâëÿåò êîìàíäû äëÿ ñîçäàíèÿ
è óïðàâëåíèÿ íåîáõîäèìûìè ýëåìåíòàìè ïðîãðàììû â Windows: äèàëîãîâûìè
îêíàìè, ëèíåéêàìè ìåíþ, ðàñêðûâàþùèìèñÿ ñïèñêàìè, êîìàíäíûìè
êíîïêàìè, ôëàæêàìè, ïàíåëÿìè èíñòðóìåíòîâ è òàê äàëåå.  ÷àñòíîñòè, Vi-
sual Basic âêëþ÷àåò íåîáõîäèìûå êîìàíäû äëÿ èñïîëüçîâàíèÿ Object Linking
and Embedding (OLE) è Dynamic Data Exchange (DDE) äëÿ ñâÿçè èëè
ñîâìåñòíîãî èñïîëüçîâàíèÿ äàííûõ ñ äðóãèìè ïðèëîæåíèÿìè Windows. Visual
Basic ÿâëÿåòñÿ ñóùåñòâåííî íîâûì ÿçûêîì ïðîãðàììèðîâàíèÿ äëÿ Windows ñî
ñâîèìè êîðíÿìè â BASIC.
 òî âðåìÿ êàê BASIC ðàçâèâàëñÿ è óëó÷øàëñÿ, èçìåíÿëèñü ìàêðîðåêîðäå-
ðû, èñïîëüçóåìûå â ïðîãðàììíûõ ïðèëîæåíèÿõ. Ñ ãîäàìè ìàêðîñû ïðèëîæå-
íèé ïîñòåïåííî ñòàíîâèëèñü âñå ñëîæíåå â îòâåò íà ïîæåëàíèÿ ïîëüçîâàòåëåé
ñäåëàòü ìàêðîñû áîëåå ãèáêèìè â äåéñòâèè è áîëåå ëåãêèìè äëÿ ñîïðîâîæäå-
íèÿ. Ìíîãèå ìàêðîÿçûêè ñòàëè âêëþ÷àòü âîçìîæíîñòè, ïîäîáíûå òåì,
êîòîðûå îáû÷íî èìåþòñÿ òîëüêî â çàêîí÷åííûõ ÿçûêàõ ïðîãðàììèðîâàíèÿ.
Ìàêðîÿçûêè ìíîãèõ ïðèëîæåíèé çíà÷èòåëüíî èçìåíÿþòñÿ îò ïðîäóêòà
ê ïðîäóêòó. Ýòî îçíà÷àåò, ÷òî âàì ìîæåò ïîíàäîáèòüñÿ èçó÷èòü íåñêîëüêî
ðàçëè÷íûõ ìàêðîÿçûêîâ; â ðåçóëüòàòå ýôôåêòèâíîñòü âàøåé ðàáîòû ìîæåò
ñíèçèòüñÿ âî âðåìÿ èçó÷åíèÿ íîâîãî ìàêðîÿçûêà. ×òîáû èçáåæàòü
íåîáõîäèìîñòè èçó÷åíèÿ íîâîãî ìàêðîÿçûêà äëÿ êàæäîãî ïðîäóêòà, Microsoft
íà÷àëà âêëþ÷àòü ýëåìåíòû ÿçûêà BASIC â ìàêðîÿçûêè ñâîèõ ïðîäóêòîâ.
Ïðèìåðîì ìîæåò ñëóæèòü ìàêðîÿçûê äëÿ Word for Windows ôèðìû Microsoft
(äî Word 97), èçâåñòíûé êàê WordBASIC, òîãäà êàê ÿçûê ïðîãðàììèðîâàíèÿ
äëÿ Access ôèðìû Microsoft áûë èçâåñòåí êàê Access Basic.
Äëÿ óíèôèêàöèè ìàêðîÿçûêîâ â ñâîèõ ïðèëîæåíèÿõ Windows è äëÿ
èíòåãðàöèè ïðèëîæåíèé íà ýòèõ ìàêðîÿçûêàõ ñ DDE è OLE Microsoft ñîçäàëà
ñïåöèàëüíóþ âåðñèþ ÿçûêà Visual Basic, íàçâàííóþ Visual Basic for Applica-
tions (ñîêðàùåííî VBA). Excel 5 áûë ïåðâûì ïðîäóêòîì, âêëþ÷àþùèì Visual
Basic for Applications (VBA). Ñ ïîÿâëåíèåì Microsoft Office 97 VBA
ðåàëèçóåòñÿ â Word, Excel, Access. Â îñíîâíûå ïðèëîæåíèÿ Office (Word, Ex-
cel, PowerPoint), íà÷èíàÿ ñ âåðñèè 2000, âêëþ÷åí ðåäàêòîð ñöåíàðèåâ —
Microsoft Visual Basic Script Editor, êîòîðûé ïîçâîëÿåò ðåäàêòèðîâàòü
Web-ñòðàíèöû (íàïðèìåð, â Word) è ïðèäàòü èì äèíàìèêó. ßçûê VBScript
18 Ãëàâà 1

(Visual Basic Scripting Edition) âõîäèò â ñåìåéñòâî ÿçûêîâ Visual Basic è,


ÿâëÿÿñü óïðîùåííîé âåðñèåé ÿçûêà Visual Basic, ïîçâîëÿåò ïðîãðàììèðîâàòü
äîêóìåíòû, îòîáðàæàåìûå áðàóçåðàìè World Wide Web.
Visual Basic for Applications â îñíîâíîì ÿâëÿåòñÿ òåì æå, ÷òî è Visual Basic
for Windows, ñ íåêîòîðûìè íåáîëüøèìè ðàçëè÷èÿìè. Ìàêðîïðîãðàììû VBA
ñîõðàíÿþòñÿ â ôàéëîâîì ôîðìàòå, èñïîëüçóåìîì ïðèëîæåíèåì, â êîòîðîì âû
íàïèñàëè ìàêðîñ Visual Basic for Applications, à íå â îòäåëüíûõ òåêñòîâûõ
ôàéëàõ. Íàïðèìåð, ìàêðîïðîãðàììû VBA, ñîçäàííûå â Excel, ñîõðàíÿþòñÿ
â ôàéëå ðàáî÷åé êíèãè Excel, ïðîãðàììû VBA â Word ñîõðàíÿþòñÿ â ôàéëå
äîêóìåíòà, à ïðîãðàììû VBA â Access — â ôàéëå äàííûõ Access. Äëÿ
âûïîëíåíèÿ ìàêðîïðîãðàììû VBA âû äîëæíû ñíà÷àëà çàïóñòèòü
ïðèëîæåíèå, â êîòîðîì íàïèñàëè ýòîò ìàêðîñ. Íàïðèìåð, âû íå ìîæåòå
çàïóñòèòü ìàêðîñ Excel VBA èç ëþáîé äðóãîé ïðîãðàììû, êðîìå Excel.
Íåñìîòðÿ íà òî, ÷òî îñíîâíûå âîçìîæíîñòè VBA îñòàþòñÿ òåìè æå
â ïðèëîæåíèÿõ, êàæäîå ïðèëîæåíèå äîáàâëÿåò ñïåöèàëüíûå êîìàíäû
è îáúåêòû (â çàâèñèìîñòè îò êîíêðåòíîãî ïðèëîæåíèÿ) â Visual Basic for Ap-
plications. Íàïðèìåð, VBA â Excel ñîäåðæèò ìíîãî êîìàíä, êîòîðûå îòíîñÿòñÿ
òîëüêî ê ðàáî÷èì ëèñòàì è çàäà÷àì, êîòîðûå âû ìîæåòå âûïîëíèòü ñ ðàáî÷èì
ëèñòîì. Àíàëîãè÷íî, VBA â Word ñîäåðæèò êîìàíäû, îòíîñÿùèåñÿ òîëüêî
ê îïåðàöèÿì íàä òåêñòîì â äîêóìåíòå, òîãäà êàê VBA â Access ñîäåðæèò
êîìàíäû, îòíîñÿùèåñÿ òîëüêî ê îïåðàöèÿì ñ áàçîé äàííûõ, è òàê äàëåå.
Åñëè äî ïîÿâëåíèÿ MS Office 97 ñðåäñòâà ïðîãðàììèðîâàíèÿ â îôèñíûõ
ïàêåòàõ ïðåäíàçíà÷àëèñü â îñíîâíîì äëÿ ñîçäàíèÿ ìàêðîêîìàíä,
ðàñøèðÿþùèõ âîçìîæíîñòè êîíêðåòíûõ ïðèëîæåíèé, òî ñ âûõîäîì MS Office
97 ñïåöèàëèñòû ïîëó÷èëè óíèâåðñàëüíóþ ñèñòåìó ïðîãðàììèðîâàíèÿ äëÿ
ïðèêëàäíûõ ïðîãðàìì íà áàçå Visual Basic. Âïåðâûå MS Office áûë
ïðåäñòàâëåí êàê åäèíàÿ ïëàòôîðìà äëÿ ñîçäàíèÿ áèçíåñ-ïðèëîæåíèé,
ïðåäíàçíà÷åííûõ äëÿ ðåøåíèÿ ñïåöèàëèçèðîâàííûå çàäà÷è ïîëüçîâàòåëåé.
Ýòî íîâîå êà÷åñòâî MS Office îáóñëàâëèâàëîñü ñïåöèàëüíûì âûïóñêîì äëÿ
ðàçðàáîò÷èêîâ — Developer Edition. Ïî ñâåäåíèÿì Microsoft, â íàñòîÿùåå
âðåìÿ MS Office â êà÷åñòâå ïëàòôîðìû ñîçäàíèÿ áèçíåñ-ïðèëîæåíèé
èñïîëüçóþò íåñêîëüêî ìèëëèîíîâ ïðîôåññèîíàëüíûõ ðàçðàáîò÷èêîâ.
Ïàêåò Microsoft Office ïî ìåðå ðàçâèòèÿ èç íàáîðà ïðèëîæåíèé
èíäèâèäóàëüíîãî ïðèìåíåíèÿ ïðåâðàòèëñÿ â êîìïëåêñíóþ èíòåãðèðîâàííóþ
ñèñòåìó, â êîòîðîé åå ðàçðàáîò÷èêè áîëüøîå âíèìàíèå óäåëèëè èìåííî
ñîâìåñòíîé ðàáîòå ïîëüçîâàòåëåé. Â Microsoft Office System, êðîìå
ïðèâû÷íûõ ïîëüçîâàòåëÿì ñðåäñòâ (Word, Excel è ò.ä.), âõîäÿò ñåðâåðû,
ñëóæáû è ïðèëîæåíèÿ, ðàçðàáîòàííûå äëÿ ñîâìåñòíîãî ïðèìåíåíèÿ ïðè
ðåøåíèè øèðîêîãî êðóãà áèçíåñ-çàäà÷. Microsoft Office 2007 ïîçâîëÿåò
ýôôåêòèâíî ðàçðàáàòûâàòü ìîùíûå è óäîáíûå ïðèëîæåíèÿ è ïðåäîñòàâëÿòü
ïîëüçîâàòåëÿì èíôîðìàöèþ èç ëþáûõ èñòî÷íèêîâ â ðàìêàõ óäîáíîãî
è ìíîãîôóíêöèîíàëüíîãî èíòåðôåéñà. Ðàçðàáîò÷èêè ìîãóò ñîçäàâàòü ïðèëî-
æåíèÿ, èñïîëüçóþùèå ñðåäñòâà ÿçûêà XML è Web-ñëóæá, âîçìîæíîñòè
ñìàðò-òåãîâ èíñòðóìåíòû Visual Studio .NET è èíôîðìàöèþ èç áàç äàííûõ
òàêèõ ñèñòåì, êàê Microsoft Access 2007 è Microsoft SQL Server 2000/5.
Ïîñêîëüêó êíèãà àäðåñîâàíà â îñíîâíîì òåì, êòî òîëüêî íà÷èíàåò
ïðîãðàììèðîâàòü â ñðåäå Windows, çäåñü ðàññìàòðèâàåòñÿ VBA-ïðîãðàì-
ìèðîâàíèå òîëüêî äëÿ äâóõ íàèáîëåå èñïîëüçóåìûõ ïðèëîæåíèé — Word
è Excel. Îñíîâíîé öåëüþ, êîòîðóþ ïðåñëåäóåò àâòîð êíèãè, ÿâëÿåòñÿ
Ââåäåíèå â ìàêðîñû 19

ïðåäñòàâëåíèå îñíîâ ÿçûêà VBA, êîòîðûé, êàê óòâåðæäàåò Microsoft, íà÷èíàÿ


ñ âåðñèè MS Office 2000, íå îòëè÷àåòñÿ îò îáû÷íîãî Visual Basic 6.
VBA-ïðîãðàììèðîâàíèå (ðàçðàáîòêà ìàêðîñîâ) ðàññìàòðèâàåòñÿ äëÿ ñàìîãî
ðàñïðîñòðàíåííîãî (ïî êðàéíåé ìåðå, â Ðîññèè) ïàêåòà MS Office 2007, â ñîñòàâ
êîòîðîãî âõîäÿò òàêèå ïðèëîæåíèÿ, êàê Microsoft Office Access, Microsoft Of-
fice Word, Microsoft Office Excel, Microsoft Office Outlook, Microsoft Office
PowerPoint, Microsoft Office InfoPath, Microsoft Office OneNote, Microsoft Of-
fice Publisher.

Äëÿ ÷åãî íóæåí ÿçûê ïðîãðàììèðîâàíèÿ VBA


Ïîñêîëüêó âû ìîæåòå èñïîëüçîâàòü ìàêðîðåêîðäåð â Word èëè Excel äëÿ
çàïèñè âàøèõ äåéñòâèé â ìàêðîñ (à â Access äëÿ ýòîé öåëè èñïîëüçîâàòü ñâîåãî
ðîäà êîíñòðóêòîð) è çàòåì âîñïðîèçâîäèòü èõ, ñíà÷àëà ìîæåò ïîêàçàòüñÿ, ÷òî
èçó÷àòü VBA íåîáÿçàòåëüíî. Îäíàêî îäíè çàïèñàííûå ìàêðîñû íå ìîãóò
óäîâëåòâîðèòü âñå âàøè ïîòðåáíîñòè. Çàïèñàííûé ìàêðîðåêîðäåðîì ìàêðîñ
ìîæåò òîëüêî âîñïðîèçâîäèòü áåç îòêëîíåíèé êàæäîå äåéñòâèå â òîé æå ïîñëå-
äîâàòåëüíîñòè, â êîòîðîé âû ïåðâîíà÷àëüíî âûïîëíÿëè ýòè äåéñòâèÿ. VBA
ìîæíî èñïîëüçîâàòü äëÿ óëó÷øåíèÿ ìàêðîñîâ, çàïèñàííûõ ìàêðî-
ðåêîðäåðîì, çíà÷èòåëüíî ïîâûøàÿ èõ ìîùü è âîçìîæíîñòè.
Çàïèñàííûå ìàêðîðåêîðäåðîì ìàêðîñû ëèøåíû ãèáêîñòè, ïîýòîìó îíè íå
ìîãóò ðåàãèðîâàòü íà èçìåíèâøèåñÿ èëè ìåíÿþùèåñÿ óñëîâèÿ. Íà ÿçûêå VBA
âû ìîæåòå íàïèñàòü ìàêðîñ, êîòîðûé ïðîâåðÿåò ñîîòâåòñòâèå ðàçëè÷íûì
ïðåäîïðåäåëåííûì óñëîâèÿì è âûáèðàåò ïîñëåäîâàòåëüíîñòü äåéñòâèé íà
îñíîâå ýòèõ óñëîâèé. Åñëè âû, íàïðèìåð, âûïîëíÿåòå êàêîé-ëèáî Ex-
cel-ìàêðîñ, êîòîðûé ïûòàåòñÿ âûáðàòü ðàáî÷èé ëèñò ñ èìåíåì «Ïðîäàæè»,
â òî âðåìÿ, êîãäà â êíèãå íåò òàêîãî ðàáî÷åãî ëèñòà, çàïèñàííûé âàìè ìàêðîñ
áóäåò âûïîëíÿòüñÿ íåïðàâèëüíî è Excel âûâåäåò íà ýêðàí ñîîáùåíèå îá
îøèáêå. Äîáàâèâ VBA-êîìàíäû ê ýòîìó çàïèñàííîìó ìàêðîñó, âû ìîãëè áû
ñ åãî ïîìîùüþ âûïîëíèòü ïðîâåðêó íàëè÷èÿ ýòîãî îïðåäåëåííîãî ðàáî÷åãî
ëèñòà ïåðåä åãî âûáîðîì èëè äàæå âñòàâèòü íîâûé ðàáî÷èé ëèñò è äàòü åìó
ñîîòâåòñòâóþùåå èìÿ, åñëè íóæíûé ðàáî÷èé ëèñò íå ñóùåñòâóåò.
×òî êàñàåòñÿ ïîâòîðÿþùèõñÿ äåéñòâèé â ñàìîì ìàêðîñå, çàïèñàííûå
ðåêîðäåðîì ìàêðîñû èìåþò çíà÷èòåëüíûå îãðàíè÷åíèÿ. Åñëè âàì íåîáõîäèìî,
÷òîáû çàïèñàííûé ìàêðîñ ïîâòîðÿë êàêîå-ëèáî äåéñòâèå íåñêîëüêî ðàç, âû
äîëæíû âðó÷íóþ ïîâòîðèòü ýòî äåéñòâèå íóæíîå êîëè÷åñòâî ðàç, êîãäà
çàïèñûâàåòå ìàêðîñ. Òàêîé ìàêðîñ âñåãäà ïîâòîðÿåò ýòî äåéñòâèå îäèíàêîâîå
êîëè÷åñòâî ðàç, âñÿêèé ðàç, êîãäà âû åãî çàïóñêàåòå, äî òåõ ïîð, ïîêà âû íå
îòðåäàêòèðóåòå èëè íå ïåðåçàïèøåòå åãî. Íàïðîòèâ, VBA-ìàêðîñ, íàïèñàííûé
ïîëüçîâàòåëåì, ìîæåò èñïîëüçîâàòü ïðåäîïðåäåëåííûå óñëîâèÿ èëè ââîäèìûå
ïîëüçîâàòåëåì äàííûå äëÿ ïîâòîðåíèÿ äåéñòâèÿ ðàçëè÷íîå êîëè÷åñòâî ðàç èëè
äëÿ ïðèíÿòèÿ ðåøåíèÿ î íåîáõîäèìîñòè âûïîëíåíèÿ ýòîãî äåéñòâèÿ.
 êà÷åñòâå ïðèìåðà âû ìîæåòå çàïèñàòü ðåêîðäåðîì ìàêðîñ äëÿ èçìåíåíèÿ
øèðèíû íåñêîëüêèõ ñìåæíûõ ñòîëáöîâ â ðàáî÷åì ëèñòå Excel. Åñëè âàì
íåîáõîäèìî, ÷òîáû ìàêðîñ èçìåíÿë øèðèíó ïåðâûõ òðåõ ñòîëáöîâ â ðàáî÷åì
ëèñòå, âû äîëæíû âðó÷íóþ ïîâòîðèòü îïåðàöèþ èçìåíåíèÿ ðàçìåðà äëÿ
êàæäîãî èç òðåõ ñòîëáöîâ ïðè çàïèñè ìàêðîñà. Çàïèñàííûé ìàêðîñ áóäåò
òîëüêî (è âñåãäà) èçìåíÿòü øèðèíó ïåðâûõ òðåõ ñòîëáöîâ â ðàáî÷åì ëèñòå. Âû
20 Ãëàâà 1

íå ìîæåòå èñïîëüçîâàòü òîò æå ìàêðîñ äëÿ èçìåíåíèÿ øèðèíû äâóõ èëè


÷åòûðåõ ñòîëáöîâ. Êðîìå òîãî, åñëè âû èçìåíèëè øèðèíó ïåðâûõ òðåõ
ñòîëáöîâ, çàïèñàííûé ìàêðîñ áóäåò âûïîëíÿòü äåéñòâèå òîëüêî íàä òðåìÿ
ïåðâûìè ñòîëáöàìè. Âû íå ñìîæåòå èñïîëüçîâàòü òîò æå ìàêðîñ äëÿ
èçìåíåíèÿ øèðèíû ñòîëáöîâ ñî âòîðîãî ïî ÷åòâåðòûé. Äîáàâèâ êîìàíäû VBA
ê ýòîìó çàïèñàííîìó ðåêîðäåðîì ìàêðîñó, âû ìîæåòå ñîçäàòü ìàêðîñ, êîòîðûé
çàïðàøèâàåò, ðàçìåð ñêîëüêèõ è êàêèõ ñòîëáöîâ íåîáõîäèìî èçìåíèòü,
è äàæå ïîçâîëÿåò çàäàâàòü íîâóþ øèðèíó ñòîëáöîâ.
Ýòè äâà ïðèìåðà ïðåäñòàâëÿþò ïàðó ïðîñòåéøèõ çàäà÷, êîòîðûå âû ìîæåòå
âûïîëíèòü ñ êîìàíäàìè VBA â ìàêðîñàõ. Ñóùåñòâóåò ìíîãî îáñòîÿòåëüñòâ,
ïðè êîòîðûõ âàì ìîæåò ïîíàäîáèòüñÿ äîáàâëÿòü êîìàíäû ïðèíÿòèÿ ðåøåíèé
ê ìàêðîñàì, çàïèñàííûì ìàêðîðåêîðäåðîì. Åäèíñòâåííûé ñïîñîá ïîëó÷èòü
òàêèå âîçìîæíîñòè — ýòî âðó÷íóþ äîáàâèòü îïåðàòîðû VBA ê çàïèñàííîìó
ìàêðîñó.
Êðîìå óëó÷øåíèÿ îïðåäåëåííûõ ìàêðîñîâ, çàïèñàííûõ ìàêðîðåêîðäåðîì,
âû ìîæåòå èñïîëüçîâàòü VBA äëÿ ñîåäèíåíèÿ, îðãàíèçàöèè è óïðàâëåíèÿ
íåñêîëüêèìè çàïèñàííûìè ìàêðîñàìè, ñ ïîìîùüþ êîòîðûõ âû âûïîëíÿåòå
ñëîæíóþ îáùóþ çàäà÷ó, ñîñòîÿùóþ èç íåñêîëüêèõ ìåíüøèõ çàäà÷. Íàïðèìåð,
âû ìîæåòå ðåãóëÿðíî èìïîðòèðîâàòü äàííûå èç áàçû äàííûõ â ðàáî÷èé ëèñò
Excel, ôîðìàòèðîâàòü ýòè äàííûå äëÿ âûâîäà íà ýêðàí, ãåíåðèðîâàòü
äèàãðàììó èç ýòèõ äàííûõ è çàòåì ðàñïå÷àòûâàòü ýòó äèàãðàììó
è îòôîðìàòèðîâàííûé îò÷åò.
Äëÿ òîãî ÷òîáû îáúåäèíèòü ýòè îòäåëüíûå çàäà÷è äëÿ ñîçäàíèÿ
åäèíñòâåííîé çàäà÷è, âûïîëíÿåìîé îäíèì ìàêðîñîì, âû ìîæåòå ñíà÷àëà
íàïèñàòü îòäåëüíûé ìàêðîñ äëÿ êàæäîé èç îòäåëüíûõ çàäà÷: äëÿ
èìïîðòèðîâàíèÿ äàííûõ, ôîðìàòèðîâàíèÿ ýòèõ äàííûõ äëÿ ïîñëåäóþùåãî
îòîáðàæåíèÿ, ñîçäàíèÿ äèàãðàììû è ïå÷àòè äàííûõ. Äàëåå âû ìîãëè áû
îðãàíèçîâàòü çàïèñàííûå ìàêðîñû òàê, ÷òîáû îíè âûïîëíÿëèñü â íóæíîé
ïîñëåäîâàòåëüíîñòè îäíèì ìàêðîñîì, êîòîðûé âû íàïèøåòå ïîñðåäñòâîì
êîìàíä VBA.
Ñ ïîìîùüþ ìàêðîñîâ ìîæíî ñîçäàâàòü ïîëüçîâàòåëüñêèå ìåíþ, äèàëîãîâûå
îêíà, êîòîðûå ìîãóò äî íåóçíàâàåìîñòè èçìåíèòü èíòåðôåéñ âñåì èçâåñòíûõ
ïðîäóêòîâ Word è Excel. Óìåñòíî çäåñü îòìåòèòü òàêæå è âîçìîæíîñòü
ñîçäàíèÿ ðàçíîîáðàçíîé ñèñòåìû ïðîâåðêè äàííûõ, ââîäèìûõ ïîëüçîâàòåëåì
â äèàëîãîâûõ îêíàõ. Êîãäà âû íàó÷èòåñü ïèñàòü ïðîãðàììû íà ÿçûêå VBA,
âû, ñêîðåå âñåãî, óæå íèêîãäà íå ñòàíåòå íà÷èíàòü ñîçäàíèå ìàêðîñà
ñ èñïîëüçîâàíèÿ ðåêîðäåðà. Ñ äðóãîé ñòîðîíû, äîâîëüíî ÷àñòî áóäåòå
îáðàùàòüñÿ ê íåìó çà ïîìîùüþ ïðè âûïîëíåíèè çàäà÷, êîòîðûå ðàíüøå
äåëàòü íå ïðèõîäèëîñü: ðåêîðäåð çàïèøåò ìàêðîñ, à âû óçíàåòå, ðàíåå íå
èñïîëüçóåìûå âàìè ñâîéñòâà èëè ìåòîäû.

Ñîçäàíèå ìàêðîñîâ
Ñóùåñòâóåò ìíåíèå, ÷òî èçó÷åíèå ÿçûêà VBA ëåã÷å âñåãî íà÷àòü ñ çàïèñè
íîâîãî ìàêðîñà ïðè ïîìîùè ðåêîðäåðà. Ïîýòîìó áîëüøàÿ ÷àñòü ëèòåðàòóðû ïî
VBA ñëåäóåò ñõåìå, ïî êîòîðîé ÷èòàòåëþ ïðåäëàãàåòñÿ ñíà÷àëà ïîñìîòðåòü,
êàê ìàêðîñû ñîçäàþòñÿ ñàìèìè ïðîäóêòàìè, òàêèìè êàê Word è Excel,
à çàòåì, îñòîðîæíî âíåäðÿÿ ñâîè èíñòðóêöèè â ðàáîòàþùèå ìàêðîñû, èçó÷èòü
Ââåäåíèå â ìàêðîñû 21

íîâûé äëÿ íèõ ÿçûê. Ìíå æå ïðåäñòàâëÿåòñÿ áîëåå ïðîäóêòèâíûì äðóãîé


ïîäõîä, ïðè êîòîðîì âû íà÷íåòå ïèñàòü ìàêðîñû (ñ èñïîëüçîâàíèåì Visual Ba-
sic Editor — Ðåäàêòîðà), êàê îáû÷íûå ïðîãðàììû íà íîâîì äëÿ âàñ ÿçûêå ïðî-
ãðàììèðîâàíèÿ, è êàæäûé ñâîé øàã áóäåòå ïðîâåðÿòü êîíòðîëüíûìè
çàïóñêàìè êîäà.

Ñîçäàíèå ìàêðîñà â Word


Çàïóñòèòå Microsoft Office Word 2007, äîáàâüòå ê ïàíåëè Ribbon âêëàäêó
Ðàçðàáîò÷èê (Developer), äëÿ ÷åãî íóæíî, ùåëêíóâ êíîïêó Office, âûáðàòü
Ïàðàìåòðû Word è â ïîÿâèâøåìñÿ îêíå äëÿ ãðóïïû ïàðàìåòðîâ Îñíîâíûå
óñòàíîâèòü ôëàæîê Ïîêàçûâàòü âêëàäêó “Ðàçðàáîò÷èê” íà ëåíòå (ðèñ. 1.1).
Íà âêëàäêå Ðàçðàáîò÷èê (ðèñ. 1.2) ðàñïîëîæåíû êîìàíäû, ïðåäíàçíà÷åííûå

Ðèñ. 1.1
×òîáû âêëàäêà Ðàçðàáîò÷èê ïîÿâèëàñü íà ïàíåëè Ribbon, íóæíî, ùåëêíóâ êíîïêó
Office, âûáðàòü Ïàðàìåòðû Word è â ïîÿâèâøåìñÿ îêíå äëÿ ãðóïïû ïàðàìåòðîâ
Îñíîâíûå óñòàíîâèòü ôëàæîê Ïîêàçûâàòü âêëàäêó “Ðàçðàáîò÷èê” íà ëåíòå

äëÿ ðàáîòû ñ VBA, ìàêðîñàìè, ýëåìåíòàìè óïðàâëåíèÿ, XML, øàáëîíàìè è


äð.
Äëÿ âûâîäà äèàëîãîâîãî îêíà Microsoft Visual Basic (Ðåäàêòîðà Visual Basic)
ùåëêíèòå íà âêëàäêå Ðàçðàáîò÷èê êíîïêó Visual Basic (â ëåâîì óãëó âêëàäêè)
èëè íàæìèòå êîìáèíàöèþ êëàâèø Alt+F11.
Äàëåå ñëåäóåò ñîçäàòü ìîäóëü, â êîòîðîì áóäåò ðàçìåùàòüñÿ êîä âàøåãî
ïåðâîãî ìàêðîñà. Ùåëêíèòå äëÿ ýòîãî íà çíà÷êå Project(<èìÿ äîêóìåíòà>) â îêíå
Project, à çàòåì — íà êíîïêå ñ âåðòèêàëüíîé ñòðåëêîé ðÿäîì ñ êíîïêîé Insert
Module (âòîðàÿ êíîïêà ââåðõó ñëåâà) è â ïîÿâèâøåìñÿ ìåíþ âûáåðèòå Module.
(ðèñ. 1.3).
22 Ãëàâà 1

Íå âíèêàÿ â ìàëîâàæíûå äëÿ ïåðâîãî ðàçà äåòàëè, ïîìåñòèòå êóðñîð


â ñàìîå áîëüøîå îêíî (Code) è ââåäèòå ñëåäóþùèé òåêñò áåç íóìåðàöèè ñòðîê
(äàëåå ìû áóäåì ðàçûâàòü ýòî ëèñòèíãîì):

Ëèñòèíã 1.1. Ïåðâûé ìàêðîñ â Word


1: Sub MyFirstMacro()
2: MsgBox ("Ìàêðîñ â Word!")
3: End Sub
Ïåðâàÿ è òðåòüÿ ñòðîêè ýòîãî ìàêðîñà-ïðîöåäóðû ÿâëÿþòñÿ çàãîëîâêîì
è îêîí÷àíèåì ïðîöåäóðû, ñîîòâåòñòâåííî. Ïðè÷åì MyFirstMacro — ýòî èìÿ
ìàêðîñà, ïîä êîòîðûì îí áóäåò óçíàâàåì ñèñòåìîé. Âòîðàÿ ñòðîêà ìàêðîñà ñî-
äåðæèò ôóíêöèþ âûâîäà äèàëîãîâîãî îêíà ñ òåêñòîì «Ìàêðîñ â Word!».

Ðèñ. 1.2
Âêëàäêà Ðàçðàáîò÷èê íà ïàíåëè Ribbon

Ðèñ. 1.3
Ìàêðîñ â îêíå Code Ðåäàêòîðà Visual Basic

Ïîñëå ââîäà èíñòðóêöèé (èíîãäà òàê íàçûâàþò îïåðàòîðû ÿçûêà ïðîãðàì-


ìèðîâàíèÿ, ÷òîáû íå ïóòàòü èõ ñ ìàòåìàòè÷åñêèìè è äðóãèìè îïåðàòîðàìè)
â îêíî Code âàø ýêðàí äîëæåí èìåòü âèä, êàê íà ðèñ. 1.3. Ïîäîáíûì îáðàçîì
ìîæíî âûâåñòè ïðåäâàðèòåëüíî âû÷èñëåííûå èëè ââåäåííûå (â äèàëîãîâîì
Ââåäåíèå â ìàêðîñû 23

îêíå) äàííûå. Òàêèì îáðàçîì, âû — óæå íà ïîëïóòè ê íàïèñàíèþ ïðîñòåéøèõ


ìàêðîñîâ.
Òåïåðü ìîæíî âûïîëíèòü êîíòðîëüíûé çàïóñê ìàêðîñà, íå âûõîäÿ èç Ðå-
äàêòîðà Visual Basic. Âûáåðèòå Run | Run Sub/UserForm. Ïðè ýòîì êóðñîð âñòàâ-
êè äîëæåí íàõîäèòñÿ íà ëþáîé ñòðîêå ìàêðîñà. Ðåçóëüòàòîì ðàáîòû ìàêðîñà
áóäåò âûäà÷à íà ýêðàí äèàëîãîâîãî îêíà. Ñðàâíèòå åãî ñ ðèñ. 1.4.
Ðèñ. 1.4
Ðåçóëüòàò âûïîëíåíèÿ âàøåãî ïåðâîãî ìàêðîñà

Çàäåðæèòåñü íåìíîãî â Word è çàïóñòèòå ñîçäàííûé ìàêðîñ íåïîñðåäñòâåí-


íî èç Word (âñå-òàêè Ðåäàêòîð VB â Word — ýòî íå ñîâñåì Word). Äëÿ ýòîãî ïî-
êèíüòå Ðåäàêòîð Visual Basic ëèáî ïðè ïîìîùè êîìáèíàöèè êëàâèø Alt+Q,
ëèáî ïðè ïîìîùè ìåíþ File | Close and Return to Microsoft Word.
Ïîñëå òîãî êàê âû îêàæèòåñü â ïðèâû÷íîì äëÿ âñåõ îêíå Word, ùåëêíèòå
êíîïêó Ìàêðîñû íà âêëàäêå Ðàçðàáîò÷èê.  ïîÿâèâøåìñÿ äèàëîãîâîì îêíå Ìàê-
ðîñ (Macros) âûáåðèòå (âèäèìî, åäèíñòâåííûé) óæå çíàêîìûé âàì ìàêðîñ
MyFirstMacro è ùåëêíèòå íà êíîïêå Âûïîëíèòü (Run).

Çàïèñü íîâûõ ìàêðîñîâ


 ýòîì ðàçäåëå ðàññêàçûâàåòñÿ î òîì, ÷òî íåîáõîäèìî çíàòü äëÿ çàïèñè
êàêîãî-ëèáî ìàêðîñà. Çàòåì âû âûïîëíèòå íåîáõîäèìûå øàãè äëÿ çàïèñè
îïðåäåëåííîãî ìàêðîñà êàê â Word 2007, òàê è â Excel 2007.
Îáû÷íî çàïèñü ìàêðîñà âêëþ÷àåò ÷åòûðå îñíîâíûõ øàãà:
1. Çàäàíèå ñòàðòîâûõ óñëîâèé äëÿ ìàêðîñà. Ýòî îçíà÷àåò çàäàíèå òåõ
óñëîâèé âàøåé ðàáî÷åé ñðåäû, êîòîðûå äîëæíû áûòü ñîáëþäåíû âî âðåìÿ âîñ-
ïðîèçâåäåíèÿ çàïèñàííîãî ìàêðîñà.
2. Çàïóñê ìàêðîðåêîðäåðà è ïðèñâîåíèå èìåíè ìàêðîñó. Îäíîâðåìåííî ñ çà-
ïóñêîì ìàêðîðåêîðäåðà âû äîëæíû äàòü èìÿ ìàêðîñó è âûáðàòü ìåñòî, ãäå îí
äîëæåí áûòü ñîõðàíåí. Ïðè çàïóñêå ìàêðîðåêîðäåðà âû ìîæåòå âûáèðàòü
ìåæäó íàçíà÷åíèåì êîìàíäû çàïóñêà ìàêðîñà ñ ïîìîùüþ òàê íàçûâàåìîé
«ãîðÿ÷åé êëàâèøè» èëè ñâÿçûâàíèåì ìàêðîñà ñ êàêèì-ëèáî ìåíþ èëè
ïàíåëüþ èíñòðóìåíòîâ (â çàâèñèìîñòè îò òîãî, çàïèñûâàåòå ëè âû ìàêðîñ â Ex-
cel èëè â Word).
3. Âûïîëíåíèå äåéñòâèé, êîòîðûå âàì íåîáõîäèìî çàïèñàòü äëÿ èñïîëü-
çîâà- íèÿ ïîçæå. Âû ìîæåòå çàïèñàòü â ìàêðîñ ëþáîå äåéñòâèå, êîòîðîå ìîæíî
âûïîëíèòü, èñïîëüçóÿ êëàâèàòóðó èëè êíîïêè ìûøè, âêëþ÷àÿ âûïîëíåíèå
ðàíåå çàïèñàííûõ ìàêðîñîâ. Êîíêðåòíûå âûïîëíÿåìûå âàìè äåéñòâèÿ çàâèñÿò
îò çàäà÷è, êîòîðóþ âàì íåîáõîäèìî çàïèñàòü.
4. Îñòàíîâêà ìàêðîðåêîðäåðà. Êîãäà âû îñòàíàâëèâàåòå ìàêðîðåêîðäåð,
âàøè äåéñòâèÿ áîëüøå íå çàïèñûâàþòñÿ è íå ñîõðàíÿþòñÿ â ìàêðîñå. Êàê
òîëüêî âû îñòàíàâëèâàåòå ðåêîðäåð, íîâûé çàïèñàííûé ìàêðîñ ñðàçó æå ãîòîâ
ê èñïîëüçîâàíèþ.
 ïîñëåäóþùèõ äâóõ ðàçäåëàõ îïèñûâàþòñÿ áîëåå ïîäðîáíî äâà ïåðâûõ
îáùèõ øàãà ïðè çàïèñè ìàêðîñà. Çàòåì áóäóò ïðåäñòàâëåíû êîíêðåòíûå
ïîøàãîâûå èíñòðóêöèè äëÿ çàïèñè ìàêðîñà â Word è Excel.
24 Ãëàâà 1

Çàäàíèå ñòàðòîâûõ óñëîâèé äëÿ ìàêðîñà


Ïåðåä çàïèñüþ êàêîãî-ëèáî ìàêðîñà âû äîëæíû çàäàòü óñëîâèÿ, ïðè
êîòîðûõ âû áóäåòå çàïóñêàòü åãî ïîçæå. Âûïîëíåíèå (running èëè executing)
ìàêðîñà îçíà÷àåò âîñïðîèçâåäåíèå çàïèñàííûõ â ýòîì ìàêðîñå èíñòðóêöèé.
Ïðåäïîëîæèì, íàïðèìåð, ÷òî âàì íåîáõîäèìî ñîçäàòü ìàêðîñ, êîòîðûé áóäåò
ïðèìåíÿòü îïðåäåëåííûé øðèôò, ðàçìåð è öâåò øðèôòà â ëþáîì âûáðàííîì
òåêñòå äîêóìåíòà â Word. Ñòàðòîâûìè óñëîâèÿìè äëÿ ýòîãî ìàêðîñà áóäóò
îòêðûòûé äîêóìåíò ñ âûäåëåííûì áëîêîì òåêñòà. Åñëè âû õîòèòå ñîçäàòü
ïîäîáíûé ìàêðîñ ôîðìàòèðîâàíèÿ òåêñòà â Excel, ñòàðòîâûìè óñëîâèÿìè
áóäóò îòêðûòàÿ ðàáî÷àÿ êíèãà, âûáðàííûé ðàáî÷èé ëèñò è âûäåëåííàÿ ÿ÷åéêà
èëè äèàïàçîí ÿ÷ååê.
Âàì íåîáõîäèìî çàäàòü ñòàðòîâûå óñëîâèÿ äëÿ ìàêðîñà ïåðåä òåì, êàê
çàïóñêàòü ìàêðîðåêîðäåð, ïîòîìó ÷òî ìàêðîðåêîðäåð áóäåò çàïèñûâàòü âñå
äåéñòâèÿ, êîòîðûå âû âûïîëíÿåòå. Åñëè âû çàïóñòèòå ìàêðîðåêîðäåð, à çàòåì
îòêðîåòå íåêîòîðûé äîêóìåíò è âûäåëèòå òåêñò, ýòè äåéñòâèÿ ñòàíóò ÷àñòüþ
ïîëó÷åííîãî â ðåçóëüòàòå çàïèñè ìàêðîñà. Âàø çàêîí÷åííûé ìàêðîñ áóäåò
ñëèøêîì ñïåöèôè÷åñêèì: îí áóäåò âñåãäà îòêðûâàòü îäèí è òîò æå äîêóìåíò
è ôîðìàòèðîâàòü îäèí è òîò æå áëîê òåêñòà. Äëÿ ñîçäàíèÿ îáùåãî ìàêðîñà,
êîòîðûé âû ìîæåòå èñïîëüçîâàòü äëÿ ôîðìàòèðîâàíèÿ ëþáîãî âûáðàííîãî
òåêñòà, âàì ñëåäóåò çàïóñêàòü ìàêðîðåêîðäåð ïîñëå îòêðûòèÿ äîêóìåíòà
è âûáîðà òåêñòà.

Çàïóñê ìàêðîðåêîðäåðà è ïðèñâàèâàíèå èìåíè ìàêðîñó


Íåçàâèñèìî îò òîãî, ðàáîòàåòå ëè âû â Word èëè Excel, çàïèñü íîâîãî
ìàêðîñà îñóùåñòâëÿåòñÿ îäíèì è òåì æå ñïîñîáîì. Íà âêëàäêå Âèä ùåëêíèòå
êíîïêó Ìàêðîñû è â ïîÿâèâøåìñÿ ìåíþ âûáåðèòå êîìàíäó Çàïèñü ìàêðîñà (ðèñ.
1.5) èëè ùåëêíèòå îäíîèìåííóþ êíîïêó íà âêëàäêå Ðàçðàáîò÷èê (ðèñ. 1.6).
È â Word, è â Excel îòîáðàæàåòñÿ äèàëîãîâîå îêíî Çàïèñü ìàêðîñà (Record
Macro), êîòîðîå èñïîëüçóåòñÿ äëÿ òîãî, ÷òîáû âû ìîãëè äàòü èìÿ íîâîìó
ìàêðîñó, âûáðàòü ìåñòî åãî ñîõðàíåíèÿ è äðóãîå.
Äèàëîãîâîå îêíî Çàïèñü ìàêðîñà ìîæåò íåìíîãî îòëè÷àòüñÿ â çàâèñèìîñòè îò
òîãî, çàïèñûâàåòå ëè âû ìàêðîñ â Word èëè Excel. Äèàëîãîâîå îêíî Çàïèñü
ìàêðîñà â Word 2007 (ðèñ. 1.7) ïîçâîëÿåò ïî âûáîðó íàçíà÷àòü «ãîðÿ÷óþ
êëàâèøó» äëÿ çàïóñêà íîâîãî ìàêðîñà èëè äîáàâëÿòü íîâûé ìàêðîñ êàê
êíîïêó íà ïàíåëè áûñòðîãî äîñòóïà. Â Excel 2007 äèàëîãîâîå îêíî Çàïèñü ìàêðîñà
(ðèñ. 1.8) äàåò âîçìîæíîñòü íàçíà÷àòü òîëüêî «ãîðÿ÷óþ êëàâèøó» äëÿ çàïóñêà
íîâîãî ìàêðîñà. Â ýòèõ ïðèëîæåíèÿõ îêíî Çàïèñü ìàêðîñà ïîçâîëÿåò âíåñòè
îïèñàíèå ìàêðîñà.
Áîëüøå î ñïåöèôè÷åñêèõ îïöèÿõ Word è Excel, èìåþùèõñÿ â äèàëîãîâîì
îêíå Çàïèñü ìàêðîñà, âû óçíàåòå èç êîíêðåòíûõ ïîøàãîâûõ èíñòðóêöèé
íåìíîãî ïîçæå â ýòîé ãëàâå.
Èìåíà ìàêðîñîâ äîëæíû íà÷èíàòüñÿ ñ áóêâû, õîòÿ îíè ìîãóò ñîäåðæàòü
÷èñëà. Èìåíà ìàêðîñîâ íå ìîãóò âêëþ÷àòü ïðîáåëû èëè çíàêè ïðåïèíàíèÿ.
 Excel âû ìîæåòå ââîäèòü èìÿ ìàêðîñà äëèíîé äî 64 ñèìâîëîâ; Word
ïîçâîëÿåò ââîäèòü èìÿ ìàêðîñà äëèíîé äî 80 ñèìâîëîâ.
Äèàëîãîâûå îêíà Çàïèñü ìàêðîñà â Word è â Excel èìåþò ñëåäóþùèå òðè
îáùèõ ýëåìåíòà:
Ââåäåíèå â ìàêðîñû 25

Ðèñ. 1.5
Âûáåðèòå êîìàíäó Çàïèñü ìàêðîñà íà âêëàäêå Âèä

Ðèñ. 1.6
Âûáåðèòå êîìàíäó Çàïèñü ìàêðîñà íà âêëàäêå Ðàçðàáîò÷èê

Ðèñ. 1.7
Îêíî Çàïèñü ìàêðîñà â Word
26 Ãëàâà 1

Ðèñ. 1.8
Îêíî Çàïèñü ìàêðîñà â Excel

1. Òåêñòîâîå îêíî Èìÿ ìàêðîñà (Macro Name). Ïî óìîë÷àíèþ VBA âûáèðàåò


èìÿ ìàêðîñà, ñîñòîÿùåå èç ñëîâà Ìàêðîñ, çà êîòîðûì ñëåäóåò íîìåð,
ñîîòâåòñòâóþùèé ÷èñëó ìàêðîñîâ, óæå ñîçäàííûõ â ýòîì ñåàíñå ðàáîòû. Âàì
ñëåäóåò äàâàòü ìàêðîñàì èìåíà, êîòîðûå íåñóò îïðåäåëåííóþ èíôîðìàöèþ
î òîì, ÷òî âûïîëíÿþò ýòè ìàêðîñû.
2. Òåêñòîâîå îêíî Îïèñàíèå (Description). Èíôîðìàöèÿ â òåêñòîâîì îêíå
Îïèñàíèå ìàêðîñîì íåïîñðåäñòâåííî íå èñïîëüçóåòñÿ. Òåêñòîâîå îêíî Îïèñàíèå
ïðåäíàçíà÷åíî äëÿ ââîäà íåêîòîðûõ çàìå÷àíèé è êîììåíòàðèåâ î òîì, ÷òî
âûïîëíÿåò äàííûé ìàêðîñ.
3. Ðàñêðûâàþùèéñÿ ñïèñîê Ìàêðîñ äîñòóïåí äëÿ: (Store macro in:). Ýòîò
ðàñêðûâàþùèéñÿ ñïèñîê ïîçâîëÿåò âûáðàòü, ãäå ñëåäóåò ñîõðàíèòü
çàïèñàííûé ìàêðîñ. Ìàêðîñû, çàïèñûâàåìûå â Word, ñîõðàíÿþòñÿ â ôàéëå
äîêóìåíòà (.docm) èëè â ôàéëå øàáëîíà äîêóìåíòà Normal.dotm. Ìàêðîñû,
çàïèñûâàåìûå â Excel, ñîõðàíÿþòñÿ â ôàéëå ðàáî÷åé êíèãè (.xlsx) èëè ôàéëå
PERSONAL.XLSB.

Çàïèñü ìàêðîñà â Word


Ïðåäïîëîæèì, ÷òî âû ÷àñòî ôîðìàòèðóåòå ñëîâà èëè ôðàçû, ê êîòîðûì
õîòèòå ïðèâëå÷ü âíèìàíèå â âàøåé äîêóìåíòàöèè, ñ ïîìîùüþ ïîëóæèðíîãî
øðèôòà Arial 12-ãî ðàçìåðà. Ïîñêîëüêó âû ôîðìàòèðóåòå òîëüêî îäèíî÷íûå
ñëîâà èëè êîðîòêèå ôðàçû, èñïîëüçîâàòü êàêîé-ëèáî èìåíîâàííûé ñòèëü
íåâîçìîæíî, òàê êàê ñòèëè Word ïðèìåíèìû òîëüêî ê öåëûì ïàðàãðàôàì.
Ïîýòîìó âàì ïðèõîäèòñÿ ïðèìåíÿòü ôîðìàòèðîâàíèå øðèôòà âðó÷íóþ. Âûáîð
øðèôòà Arial, èçìåíåíèå åãî ðàçìåðà è ïðèìåíåíèå àòðèáóòà ïîëóæèðíîãî
øðèôòà ê òåêñòó âêëþ÷àþò íåñêîëüêî îïåðàöèé ñ ìûøüþ èëè êëàâèàòóðîé.
Åñëè âû ÷àñòî âûïîëíÿåòå ýòó çàäà÷ó, ìîæåòå ñáåðå÷ü âðåìÿ è óñèëèÿ, çàïèñàâ
ìàêðîðåêîðäåðîì ìàêðîñ äëÿ âûïîëíåíèÿ íóæíîãî ôîðìàòèðîâàíèÿ ëþáîãî
âûäåëåííîãî áëîêà òåêñòà.

Çàäàíèå ñòàðòîâûõ óñëîâèé â Word


Ïîñêîëüêó âàì íåîáõîäèìî, ÷òîáû ìàêðîñ âûïîëíÿë äåéñòâèå íàä ëþáûì
âûäåëåííûì áëîêîì òåêñòà â ëþáîì îòêðûòîì äîêóìåíòå, ñòàðòîâûìè
óñëîâèÿìè äëÿ ýòîãî ìàêðîñà ÿâëÿþòñÿ îòêðûòûé äîêóìåíò è âûäåëåííûé
Ââåäåíèå â ìàêðîñû 27

áëîê òåêñòà. Äëÿ çàäàíèÿ ñòàðòîâûõ óñëîâèé â ýòîì óïðàæíåíèè âûïîëíèòå


ñëåäóþùèå øàãè:
1. Çàïóñòèòå Word.
2. Îòêðîéòå êàêîé-ëèáî äîêóìåíò.
3. Âûäåëèòå ëþáîå ñëîâî èëè ôðàçó â äîêóìåíòå. Âûäåëèâ òåêñò â îòêðûòîì äî-
êóìåíòå, âû ñîçäàëè íåîáõîäèìûå ñòàðòîâûå óñëîâèÿ äëÿ çàïèñè îáùåãî ìàê-
ðîñà ñ öåëüþ ïðèìåíåíèÿ ôîðìàòèðîâàíèÿ ñèìâîëîâ ê ëþáîìó âûáðàííîìó
òåêñòó.

Ïðèñâàèâàíèå èìåíè ìàêðîñó è âûáîð ìåñòà äëÿ åãî ñîõðàíåíèÿ


Òåïåðü âû ãîòîâû çàïóñòèòü ìàêðîðåêîðäåð â Word, äàòü èìÿ ìàêðîñó,
âûáðàòü ìåñòî äëÿ ñîõðàíåíèÿ íîâîãî ìàêðîñà è âûáðàòü äîïîëíèòåëüíûå
îïöèè. Âûïîëíèòå ñëåäóþùèå øàãè:
1. Íà âêëàäêå Âèä ùåëêíèòå êíîïêó Ìàêðîñû è â ïîÿâèâøåìñÿ ìåíþ âûáåðèòå
êîìàíäó Çàïèñü ìàêðîñà èëè ùåëêíèòå îäíîèìåííóþ êíîïêó íà âêëàäêå Ðàçðà-
áîò÷èê (èëè, íàêîíåö, ïðîñòî ùåëêíèòå êíîïêó Çàïèñü ìàêðîñà â ñòðîêå ñîñòîÿ-
íèÿ â íèæíåé ÷àñòè îêíà ïðèëîæåíèÿ).  Word îòîáðàæàåòñÿ äèàëîãîâîå îêíî
Çàïèñü ìàêðîñà.
2.  òåêñòîâîì ïîëå Èìÿ ìàêðîñà (Macro name) ââåäèòå ÂûäåëèòüÒåêñò â êà÷å-
ñòâå èìåíè ìàêðîñà. Ýòî èìÿ ïîìîãàåò çàïîìíèòü, ÷òî âûïîëíÿåò ìàêðîñ.
3. Â òåêñòîâîå ïîëå Îïèñàíèå (Description) ââåäèòå ñëåäóþùèé òåêñò: «óñòàíàâ-
ëèâàåò Arial, Bold, 12 äëÿ âûäåëåííîãî òåêñòà». Ýòîò êîììåíòàðèé ïîìîæåò
âàì (è äðóãèì) îïðåäåëèòü íàçíà÷åíèå ìàêðîñà.
4. Èñïîëüçóéòå ðàñêðûâàþùèéñÿ ñïèñîê Ìàêðîñ äîñòóïåí äëÿ: (Store Macro in:) äëÿ
âûáîðà ìåñòà, â êîòîðîì áóäåò ñîõðàíåí çàïèñàííûé ìàêðîñ. Âû ìîæåòå ñîõðà-
íèòü ìàêðîñ â ëþáîì çàãðóæåííîì â äàííûé ìîìåíò ãëîáàëüíîì øàáëîíå èëè
â òåêóùåì äîêóìåíòå. Òàê êàê âàì íåîáõîäèìî, ÷òîáû ìàêðîñ ìîæíî áûëî èñ-
ïîëüçîâàòü â ëþáîì äîêóìåíòå, íàä êîòîðûì âû áóäåòå ðàáîòàòü, âûáåðèòå
Âñåõ äîêóìåíòîâ Normal.dotm.
5. Ùåëêíèòå íà êíîïêå OK äëÿ íà÷àëà çàïèñè ìàêðîñà, åñëè òîëüêî âû íå õî-
òèòå äîáàâèòü âàø ìàêðîñ íà ïàíåëü áûñòðîãî äîñòóïà èëè íàçíà÷èòü äëÿ íåãî
«ãîðÿ÷óþ êëàâèøó». Äëÿ âûáîðà ëþáîé èç ýòèõ îïöèé âûïîëíÿéòå èíñòðóê-
öèè, îïèñàííûå â ñëåäóþùåì ðàçäåëå ýòîé ãëàâû. Èòàê, âû òåïåðü ãîòîâû âû-
ïîëíÿòü äåéñòâèÿ, êîòîðûå õîòèòå çàïèñàòü.
Êîíêðåòíûå ìåñòà õðàíåíèÿ, äîñòóïíûå â Word â äèàëîãîâîì îêíå Çàïèñü
ìàêðîñà, çàâèñÿò îò òîãî, êàêèå ãëîáàëüíûå øàáëîíû ó âàñ çàãðóæåíû
â äàííûé ìîìåíò. Äîñòóïíûå âàðèàíòû âñåãäà âêëþ÷àþò øàáëîí Normal.dotm
è òåêóùèé àêòèâíûé äîêóìåíò.
Íà ðèñ. 1.9 ïîêàçàíî äèàëîãîâîå îêíî Çàïèñü ìàêðîñà, çàïîëíåííîå äëÿ
ìàêðîñà-ïðèìåðà.

Èñïîëüçîâàíèå ïàíåëè èíñòðóìåíòîâ è êëàâèàòóðû


äëÿ çàïóñêà ìàêðîñà
Ñóùåñòâóþò äâå äîïîëíèòåëüíûå îïöèè, êîòîðûå âû ìîæåòå âûáðàòü
â äèàëîãîâîì îêíå Çàïèñü ìàêðîñà â Word: ëèáî íàçíà÷èòü «ãîðÿ÷óþ êëàâèøó»
äëÿ íîâîãî ìàêðîñà, ëèáî ñâÿçàòü åãî ñ êîìàíäíîé êíîïêîé íà ïàíåëè áûñòðîãî
äîñòóïà. Åñëè âû íàçíà÷àåòå «ãîðÿ÷óþ êëàâèøó» äëÿ ìàêðîñà, âû ìîæåòå
ïîçæå çàïóñêàòü ýòîò ìàêðîñ íàæàòèåì ñî÷åòàíèÿ êëàâèø. Åñëè âû
28 Ãëàâà 1

ñâÿçûâàåòå ìàêðîñ ñ êîìàíäíîé êíîïêîé íà ïàíåëè áûñòðîãî äîñòóïà, òî ìîæåòå


çàïóñêàòü åãî, ùåëêàÿ ýòó êíîïêó íà ïàíåëè áûñòðîãî äîñòóïà.

Ðèñ. 1.9
Îêíî Çàïèñü ìàêðîñà â Word,
çàïîëíåííîå äëÿ çàïèñè ìàêðîñà
ÂûäåëèòüÒåêñò

Èñïîëüçóéòå îïöèè «ãîðÿ÷åé êëàâèøè» è êëàâèàòóðû òîëüêî â ñëó÷àå, åñëè


óâåðåíû, ÷òî áóäåòå î÷åíü ÷àñòî èñïîëüçîâàòü ìàêðîñ, êîòîðûé ñîáèðàåòåñü
çàïèñûâàòü ìàêðîðåêîðäåðîì. Åñëè âû áóäåòå íàçíà÷àòü «ãîðÿ÷èå êëàâèøè»
âñåì âàøèì ìàêðîñàì, ó âàñ ñêîðî íå îñòàíåòñÿ íåíàçíà÷åííûõ ñî÷åòàíèé
«ãîðÿ÷èõ êëàâèø».
Ùåë÷îê ìûøüþ íà êíîïêå êëàâèøàì äëÿ íàçíà÷åíèÿ çàïèñûâàåìîìó
ìàêðîñó ãîðÿ÷åé êëàâèøè ïðèâîäèò ê çàïóñêó ìàêðîðåêîðäåðà (ïðè âûõîäå èç
äèàëîãà íàçíà÷åíèÿ). Ïîýòîìó, åñëè âû ñîáèðàåòåñü èñïîëüçîâàòü îáå îïöèè,
âûáåðèòå êíîïêå, ïîñêîëüêó íàçíà÷èòü «ãîðÿ÷èå êëàâèøè» ìîæíî òàêæå è èç
îêíà, êîòîðîå âûçûâàåòñÿ ïðè ùåëñêå íà êíîïêå.
Äëÿ òîãî ÷òîáû íàçíà÷èòü ìàêðîñó «ãîðÿ÷óþ êëàâèøó», ùåëêíèòå íà
êíîïêå êëàâèøàì â äèàëîãîâîì îêíå Çàïèñü ìàêðîñà â Word. Îòêðûâàåòñÿ îêíî
Íàñòðîéêà êëàâèàòóðû (Customize Keyboard), ïðèâåäåííîå íà ðèñ. 1.10. Òàê êàê âû
íàçíà÷àåòå «ãîðÿ÷óþ êëàâèøó» íîâîìó ìàêðîñó (êîòîðûé åùå íå áûë
çàïèñàí), ñïèñîê Êàòåãîðèè (Categories) îòêëþ÷åí. Èìÿ çàïèñûâàåìîãî âàìè
íîâîãî ìàêðîñà îòîáðàæàåòñÿ âûäåëåííûì ïî óìîë÷àíèþ â ñïèñêå Êîìàíäû
(Commands).
Íàæìèòå ñî÷åòàíèå êëàâèø, êîòîðîå õîòèòå èñïîëüçîâàòü äëÿ çàïóñêà
ýòîãî ìàêðîñà; êëàâèøè, êîòîðûå âû íàæèìàåòå, ïîÿâëÿþòñÿ â òåêñòîâîì îêíå
Íîâîå ñî÷åòàíèå êëàâèø. Ùåëêíèòå íà êíîïêå Íàçíà÷èòü, ÷òîáû íàçíà÷èòü
ñî÷åòàíèå êëàâèø íîâîìó ìàêðîñó. Ùåëêíèòå íà êíîïêå Çàêðûòü äëÿ âûõîäà
èç äèàëîãîâîãî îêíà Íàñòðîéêà êëàâèàòóðû è ïåðåõîäèòå ê çàïèñè ìàêðîñà.
Äëÿ òîãî ÷òîáû ïîìåñòèòü íà ïàíåëü áûñòðîãî äîñòóïà êíîïêó äëÿ çàïóñêà
íîâîãî ìàêðîñà, ùåëêíèòå â îêíå Çàïèñü ìàêðîñà íà êíîïêå.  îêíå Ïî óìîë÷àíèþ
äëÿ øàáëîíà (ðèñ. 1.11) ïîìåñòèòå íàèìåíîâàíèå (ïîëíîå) íîâîãî ìàêðîñà â
ñïèñîê Íàñòðîéêà ïàíåëè áûñòðîãî äîñòóïà, èñïîëüçóÿ ñïèñîê Âûáðàòü êîìàíäû èç è
êíîïêó Äîáàâèòü, êàê ïîêàçàíî íà ðèñ. 1.12 (íà ðèñ. 1.12 äîáàâëåí òàêæå
ýëåìåíò <Ðàçäåëèòåëü>).
 óêàçàííûõ ñïèñêàõ ñëåâà îò íàèìåíîâàíèÿ ìàêðîñà ðàñïîëàãàåòñÿ
èçîáðàæåíèå êíîïêè òàêîå æå, êàêîå áóäåò íà ïàíåëè áûñòðîãî äîñòóïà. Åãî
ìîæíî èçìåíèòü â îêíå Èçìåíåíèå êíîïêè (ðèñ. 1.13), êîòîðîå îòêðûâàåòñÿ ïðè
ïîìîùè êíîïêè Èçìåíèòü. Â ýòîì æå îêíå ìîæíî çàäàòü òåêñò ïîäñêàçêè,
Ââåäåíèå â ìàêðîñû 29

Ðèñ. 1.10
Îêíî Íàñòðîéêà êëàâèàòóðû â
Word äëÿ ìàêðîñà
ÂûäåëèòüÒåêñò

Ðèñ. 1.11
Îêíî Ïî óìîë÷àíèþ äëÿ øàáëîíà â Word äëÿ ìàêðîñà ÂûäåëèòüÒåêñò
30 Ãëàâà 1

ïîÿâëÿþùåéñÿ ïðè íàâåäåíèè êóðñîðà íà êíîïêó ïàíåëè, êîòîðàÿ åå ñîäåðæèò


(ðèñ. 1.14).

Ðèñ. 1.12
Îêíî Ïî óìîë÷àíèþ äëÿ øàáëîíà â Word äëÿ ìàêðîñà ÂûäåëèòüÒåêñò

È ïîñëåäíåå, â îêíå Ïî óìîë÷àíèþ äëÿ øàáëîíà èìååòñÿ êíîïêà äëÿ âûçîâà


îêíà Íàñòðîéêà êëàâèàòóðû — Íàñòðîéêà. Ýòî îêíî (ðèñ. 1.15) îòëè÷àåòñÿ îò òîãî,
êîòîðîå ïðèâåäåíî íà ðèñ. 1.10, òåì, ÷òî ïîçâîëÿåò çàäàòü «ãîðÿ÷èå êëàâèøè»
íå òîëüêî çàïèñûâàåìîìó ìàêðîñó, íî è äðóãèì ýëåìåíòàì óïðàâëåíèÿ
ïðèëîæåíèÿ (êàê, âïðî÷åì, è îêíî Ïî óìîë÷àíèþ äëÿ øàáëîíà).
Êàê òîëüêî âû çàêðûâàåòå äèàëîãîâîå îêíî Íàñòðîéêà êëàâèàòóðû èëè Ïî
óìîë÷àíèþ äëÿ øàáëîíà, Word àêòèâèçèðóåò ìàêðîðåêîðäåð è íà÷èíàåò çàïèñü
âàøèõ äåéñòâèé.

Çàïèñü âàøèõ äåéñòâèé


Êîãäà ìàêðîðåêîðäåð íà÷èíàåò çàïèñûâàòü âàøè äåéñòâèÿ, íà ýêðàíå
ïîÿâëÿåòñÿ çíà÷îê ìàãíèòîôîííîé êàññåòû êàê ÷àñòü óêàçàòåëÿ ìûøè, à â
íèæíåé ÷àñòè ýêðàíà (ñòðîêå ñîñòîÿíèÿ) ïðèëîæåíèÿ êíîïêà Çàïèñü ìàêðîñà
ìåíÿåò ñâîé âèä è ïîäñêàçêó íà Èäåò çàïèñü ìàêðîñà. Ùåëêíèòå, ÷òîáû îñòàíîâèòü
çàïèñü (ðèñ. 1.16) Ìàêðîðåêîðäåð ñîõðàíÿåò êàæäîå äåéñòâèå, êîòîðîå âû
Ââåäåíèå â ìàêðîñû 31

âûïîëíÿåòå, â íîâîì ìàêðîñå äî òåõ ïîð, ïîêà âû íå îñòàíîâèòå ðåêîðäåð èëè


íå ñäåëàåòå ïàóçó.
 êà÷åñòâå ïðèìåðà âûïîëíèòå ñëåäóþùèå: íà âêëàäêå Ãëàâíàÿ âûáåðèòå
Ðèñ. 1.13
Îêíî Èçìåíåíèå êíîïêè

Ðèñ. 1.14
Êíîïêà ìàêðîñà ÂûäåëèòüÒåêñò íà ïàíåëè
áûñòðîãî äîñòóïà

Ðèñ. 1.15
Îêíî Íàñòîéêà
êëàâèàòóðû â Word

øðèôò Arial, ðàçìåð øðèôòà 12 è ñòèëü Ïîëóæèðíûé.


32 Ãëàâà 1

Ðèñ. 1.16
Êíîïêà Çàïèñü ìàêðîñà

Ýòî áûëè äåéñòâèÿ, íåîáõîäèìûå äëÿ çàïèñè ýòîãî îòäåëüíîãî ìàêðîñà,


è òåïåðü âû ãîòîâû ê îñòàíîâêå ìàêðîðåêîðäåðà, ÷òî, êàê è ìíîãîå â
ïðèëîæåíèÿõ Microsoft Office, ìîæíî ñäåëàòü ðàçíûìè ñïîñîáàìè:
¨ ùåëêíèòå íà êíîïêå Çàïèñü ìàêðîñà â ñòðîêå ñîñòîÿíèÿ;
¨ íà âêëàäêå Âèä ùåëêíèòå êíîïêó Ìàêðîñû è â ïîÿâèâøåìñÿ ìåíþ
âûáåðèòå êîìàíäó Îñòàíîâèòü çàïèñü;
¨ ùåëêíèòå êíîïêó Îñòàíîâèòü çàïèñü íà âêëàäêå Ðàçðàáîò÷èê.
Âàø íîâûé Word-ìàêðîñ ÿâëÿåòñÿ òåïåðü çàêîí÷åííûì è ãîòîâûì
ê çàïóñêó. Äàëåå â ýòîé ãëàâå âû óçíàåòå, êàê çàïóñêàòü ýòîò íîâûé ìàêðîñ,
õîòÿ íåìíîãî ðàíåå óæå áûëî ñêàçàíî, êàê çàïóñòèòü òîëüêî ÷òî ñîçäàííûé
ìàêðîñ.

Çàïèñü ìàêðîñà â Excel


Äëÿ ýòîãî ïðèìåðà ïðåäïîëîæèì, ÷òî âàì òàêæå ÷àñòî ïðèõîäèòñÿ
ïðèìåíÿòü ïîëóæèðíûé øðèôò Arial 12-ãî ðàçìåðà â êà÷åñòâå ñòèëÿ
ôîðìàòèðîâàíèÿ ñèìâîëîâ ÿ÷ååê ðàáî÷èõ ëèñòîâ, ê êîòîðûì âû õîòèòå
ïðèâëå÷ü îñîáîå âíèìàíèå. Ñ öåëüþ ñîêðàùåíèÿ âðåìåíè, íåîáõîäèìîãî äëÿ
ôîðìàòèðîâàíèÿ òåêñòà, âàì íóæíî çàïèñàòü ìàêðîñ, êîòîðûé âûáèðàåò
ïîëóæèðíûé øðèôò Arial 12-ãî ðàçìåðà è ïðèìåíÿåò ýòî ôîðìàòèðîâàíèå
ê ëþáîé ÿ÷åéêå èëè äèàïàçîíó ÿ÷ååê âûäåëåííîãî ôðàãìåíòà.

Çàäàíèå ñòàðòîâûõ óñëîâèé â Excel


Òàê êàê âàì íåîáõîäèìî, ÷òîáû ìàêðîñ ðàáîòàë ñ ëþáîé âûäåëåííîé
ÿ÷åéêîé èëè äèàïàçîíîì ÿ÷ååê, ñòàðòîâûìè óñëîâèÿìè äëÿ ýòîãî ìàêðîñà
ÿâëÿþòñÿ îòêðûòàÿ ðàáî÷àÿ êíèãà ñ âûäåëåííûì äèàïàçîíîì ÿ÷ååê
â àêòèâíîì ðàáî÷åì ëèñòå. ×òîáû çàäàòü ñòàðòîâûå óñëîâèÿ äëÿ äàííîãî
êîíêðåòíîãî ïðèìåðà â Excel, âûïîëíèòå ñëåäóþùèå øàãè:
1. Çàïóñòèòå Excel 2007, åñëè îí åùå íå çàïóùåí.
2. Îòêðîéòå êàêóþ-ëèáî ðàáî÷óþ êíèãó.
3. Âûáåðèòå êàêîé-ëèáî ðàáî÷èé ëèñò.
4. Âûäåëèòå ëþáóþ ÿ÷åéêó â ðàáî÷åì ëèñòå.
Âû òîëüêî ÷òî ñîçäàëè íåîáõîäèìûå ñòàðòîâûå óñëîâèÿ, ÷òîáû çàïèñàòü
îáùèé ìàêðîñ äëÿ ôîðìàòèðîâàíèÿ ñèìâîëîâ ëþáîé âûäåëåííîé ÿ÷åéêè èëè
äèàïàçîíà ÿ÷ååê â ðàáî÷åì ëèñòå Excel.

Íàçíà÷åíèå èìåíè è âûáîð ìåñòà äëÿ ñîõðàíåíèÿ ìàêðîñà


Äëÿ çàïóñêà ìàêðîðåêîðäåðà â Excel, íàçíà÷åíèÿ èìåíè ìàêðîñó, âûáîðà
ìåñòà äëÿ ñîõðàíåíèÿ íîâîãî ìàêðîñà è âûáîðà äîïîëíèòåëüíûõ îïöèé
âûïîëíèòå ñëåäóþùèå øàãè:
Ââåäåíèå â ìàêðîñû 33

1. Íà âêëàäêå Âèä ùåëêíèòå êíîïêó Ìàêðîñû è â ïîÿâèâøåìñÿ ìåíþ âûáåðèòå


êîìàíäó Çàïèñü ìàêðîñà èëè ùåëêíèòå îäíîèìåííóþ êíîïêó íà âêëàäêå Ðàçðà-
áîò÷èê (èëè, íàêîíåö, ïðîñòî ùåëêíèòå êíîïêó Çàïèñü ìàêðîñà â ñòðîêå ñîñòîÿ-
íèÿ â íèæíåé ÷àñòè îêíà ïðèëîæåíèÿ).  Excel îòîáðàæàåòñÿ äèàëîãîâîå îêíî
Çàïèñü ìàêðîñà.
2. Â òåêñòîâîì îêíå Èìÿ ìàêðîñà (Macro Name) ââåäèòå FormatArialBold12 â êà-
÷åñòâå èìåíè ìàêðîñà. Ýòî èìÿ ïîìîãàåò çàïîìíèòü, ÷òî âûïîëíÿåò ìàêðîñ.
3. Â òåêñòîâîì îêíå Îïèñàíèå (Description) ââåäèòå ñëåäóþùèé òåêñò: «ôîðìàòè-
ðóåò òåêñò äèàïàçîíà: Arial, Bold, 12». Ýòîò êîììåíòàðèé ïîìîæåò âàì íå çà-
áûòü íàçíà÷åíèå äàííîãî ìàêðîñà.
4. Èñïîëüçóéòå ñïèñîê Cîõðàíèòü â (Store macro in) äëÿ âûáîðà ìåñòà, â êîòîðîì
áóäåò ñîõðàíåí çàïèñàííûé ìàêðîñ. Äîñòóïíûìè âàðèàíòàìè ÿâëÿþòñÿ Ëè÷íàÿ
êíèãà ìàêðîñîâ (Personal Macro Workbook), Íîâàÿ êíèãà (New Workbook) è Ýòà êíèãà (This
Workbook). Ïîñêîëüêó âàì íåîáõîäèìî, ÷òîáû ýòîò ìàêðîñ áûë äîñòóïåí âî âñåõ
âàøèõ ðàáî÷èõ êíèãàõ, âûáåðèòå Ëè÷íàÿ êíèãà ìàêðîñîâ. Âûáîð Ýòà êíèãà ïðèâå-
äåò ê òîìó, ÷òî Excel ñîõðàíèò íîâûé ìàêðîñ â òåêóùåé àêòèâíîé ðàáî÷åé êíè-
ãå. Âûáîð îïöèè Íîâàÿ êíèãà ïðèâåäåò ê ñîçäàíèþ â Excel íîâîé ðàáî÷åé êíèãè,
â êîòîðîé áóäåò ñîõðàíåí ýòîò ìàêðîñ, — ðàáî÷àÿ êíèãà, êîòîðàÿ áûëà àêòèâ-
íîé ïðè çàïóñêå âàìè ìàêðîðåêîðäåðà, îñòàåòñÿ àêòèâíîé ðàáî÷åé êíèãîé; ëþ-
áûå äåéñòâèÿ, êîòîðûå âû çàïèñûâàåòå, âûïîëíÿþòñÿ â ýòîé êíèãå, à íå â íî-
âîé ðàáî÷åé êíèãå, ñîçäàííîé äëÿ ñîõðàíåíèÿ ìàêðîñà.
5. Åñëè âû óâåðåíû â òîì, ÷òî áóäåòå ÷àñòî èñïîëüçîâàòü ìàêðîñ, êîòîðûé ñî-
áèðàåòåñü çàïèñûâàòü, ìîæåòå íàçíà÷èòü äëÿ åãî çàïóñêà ãîðÿ÷óþ êëàâèøó.
Åñëè — äà, ââåäèòå ãîðÿ÷óþ êëàâèøó â òåêñòîâîå îêíî Ñî÷åòàíèå êëàâèø
(Shortcut Key) îêíà Çàïèñü ìàêðîñà.
6. Ùåëêíèòå íà êíîïêå OK äëÿ íà÷àëà çàïèñè ìàêðîñà.
Íà ðèñ. 1.17 ïîêàçàíî äèàëîãîâîå îêíî Çàïèñü ìàêðîñà, çàïîëíåííîå äëÿ
ìàêðîñà-ïðèìåðà FormatArialBold12.
Çàïèñü äåéñòâèé
Êàê òîëüêî âû ùåëêíèòå íà êíîïêå OK â äèàëîãîâîì îêíå Çàïèñü ìàêðîñà,
Excel çàïóñòèò ìàêðîðåêîðäåð è íà÷íåò çàïèñü âàøèõ äåéñòâèé.
Ìàêðîðåêîðäåð ñîõðàíèò êàæäîå âàøå äåéñòâèå â íîâîì ìàêðîñå.

Ðèñ. 1.17
Çàïîëíåííîå äèàëîãîâîå îêíî Çàïèñü
ìàêðîñà äëÿ ìàêðîñà-ïðèìåðà
FormatArialBold12
34 Ãëàâà 1

Çàìåòüòå, ÷òî â ñòðîêå ñîñòîÿíèÿ ïðèëîæåíèÿ êíîïêà Çàïèñü ìàêðîñà ìåíÿåò


ñâîé âèä è ïîäñêàçêó íà Èäåò çàïèñü ìàêðîñà. Ùåëêíèòå, ÷òîáû îñòàíîâèòü
çàïèñü, êàê íàïîìèíàíèå î òîì, ÷òî Excel çàïèñûâàåò âàøè äåéñòâèÿ.
Ïðè ùåë÷êå íà êíîïêå Ìàêðîñû íà âêëàäêå Âèä îòêðûâàåò ìåíþ, â êîòîðîì,
êðîìå îïöèé Ìàêðîñû (î êîòîðîé áóäåò ðàññêàçàíî äàëåå) è Çàïèñü ìàêðîñà,
èìååòñÿ îïöèÿ Îòíîñèòåëüíûå ññûëêè (Relative Reference). Íà âêëàäêå Ðàçðàáîò÷èê
èìååòñÿ êíîïêà ñ òàêèì æå èìåíåì (ðèñ. 1.18).
Ïî óìîë÷àíèþ Excel çàïèñûâàåò àáñîëþòíûå ññûëêè íà ÿ÷åéêè â çàïè-
ñûâàåìå âàìè ìàêðîñû. Åñëè âû, íàïðèìåð, íà÷íåòå çàïèñü ñ âûäåëåííîé
ÿ÷åéêè A7, à çàòåì âûäåëèòå ÿ÷åéêó ñïðàâà îò A7, òî åñòü B7, òî âàø
çàïèñàííûé ìàêðîñ òàêæå áóäåò âûäåëÿòü ÿ÷åéêó B7, è òàê êàæäûé ðàç, êîãäà
îí áóäåò çàïóñêàòüñÿ.
Åñëè âû âûïîëíèòå êîìàíäó Îòíîñèòåëüíûå ññûëêè, Excel áóäåò çàïèñûâàòü
îòíîñèòåëüíóþ ññûëêó íà ÿ÷åéêó êàæäûé ðàç, êîãäà âû âûäåëÿåòå êàêóþ-ëèáî

Ðèñ. 1.18
Íà âêëàäêå Ðàçðàáîò÷èê èìååòñÿ êíîïêà Îòíîñèòåëüíûå ññûëêè

ÿ÷åéêó. Åñëè âûäåëåííîé â äàííûé ìîìåíò ÿâëÿåòñÿ ÿ÷åéêà A7 è âû


âûáèðàåòå ÿ÷åéêó ñïðàâà îò íåå âî âðåìÿ çàïèñè ñ îòíîñèòåëüíûìè ññûëêàìè,
òî Excel çàïèñûâàåò, ÷òî âû âûäåëèëè ÿ÷åéêó, íàõîäÿùóþñÿ íà 1 ñòîëáåö è 0
ñòðîê ïðàâåå îò òåêóùåé âûáðàííîé ÿ÷åéêè. Êîãäà âû çàïóñòèòå çàïèñàííûé
ìàêðîñ, îí âûäåëèò ÿ÷åéêó, íàõîäÿùóþñÿ íåïîñðåäñòâåííî ñïðàâà îò àêòè-
âíîé ÿ÷åéêè.
Êíîïêà Îòíîñèòåëüíûå ññûëêè íà âêëàäêå Ðàçðàáîò÷èê ÿâëÿåòñÿ
êíîïêîé-ïåðåêëþ÷àòåëåì (toggle). Êîãäà çàïèñü ñ îòíîñèòåëüíûìè ññûëêàìè
îòêëþ÷åíà, êíîïêà Îòíîñèòåëüíûå ññûëêè âûãëÿäèò ïëîñêîé; ïðè ïîìåùåíèè
êóðñîðà ìûøè íà êíîïêó âèä êíîïêè èçìåíÿåòñÿ è îíà âûãëÿäèò îòæàòîé.
Êîãäà çàïèñü ñ îòíîñèòåëüíîé ññûëêîé âêëþ÷åíà, êíîïêà Îòíîñèòåëüíûå ññûëêè
íàæàòà (íàõîäèòñÿ â «óòîïëåííîì» ïîëîæåíèè). Ùåëêàÿ íà êíîïêå
Ââåäåíèå â ìàêðîñû 35

Îòíîñèòåëüíûå ññûëêè, ìîæíî âêëþ÷àòü è âûêëþ÷àòü çàïèñü ñ îòíîñèòåëüíûìè


ññûëêàìè âî âðåìÿ çàïèñè.
Îïöèÿ Îòíîñèòåëüíûå ññûëêè ìåíþ êíîïêè Ìàêðîñû âêëàäêè Âèä òàêæå
îòîáðàæàåò, âêëþ÷åíà ëè ôóíêöèÿ çàïèñè ñ îòíîñèòåëüíûìè ññûëêàìè,
ïîñêîëüêó ñëåâà îò íàèìåíîâàíèÿ îïöèè ìåíþ îòîáðàæàåòñÿ çíà÷îê, ïîõîæèé
íà êíîïêó Îòíîñèòåëüíûå ññûëêè âêëàäêè Ðàçðàáîò÷èê.
Äëÿ çàïèñè ìàêðîñà FormatArialBold12 íà âêëàäêå Ãëàâíàÿ âûáåðèòå
øðèôò Arial, ðàçìåð øðèôòà 12 è ñòèëü Ïîëóæèðíûé.
Êàê è ïðè çàïèñè ìàêðîñà â Word, îñòàíîâèòü çàïèñü ìîæíî ñëåäóþùèìè
ñïîñîáàìè:
¨ ùåëêíèòå íà êíîïêå Çàïèñü ìàêðîñà â ñòðîêå ñîñòîÿíèÿ;
¨ íà âêëàäêå Âèä ùåëêíèòå êíîïêó Ìàêðîñû è â ïîÿâèâøåìñÿ ìåíþ
âûáåðèòå êîìàíäó Îñòàíîâèòü çàïèñü;
¨ ùåëêíèòå êíîïêó Îñòàíîâèòü çàïèñü íà âêëàäêå Ðàçðàáîò÷èê.

Êîä ìàêðîñà
Ïðè çàïèñè ìàêðîñà â Word, Excel (è äðóãèõ ïðèëîæåíèé) ðåêîðäåð
ñîõðàíÿåò ïîñëåäîâàòåëüíîñòü òåêñòîâûõ èíñòðóêöèé, êîòîðûå îïèñûâàþò íà
ÿçûêå ïðîãðàììèðîâàíèÿ Visual Basic for Applications ðàçëè÷íûå äåéñòâèÿ,
âûïîëíÿåìûå âàìè â òî âðåìÿ, êîãäà ðåêîðäåð âêëþ÷åí. Ýòî òåêñòîâîå
îïèñàíèå âàøèõ êîìàíä íàçûâàåòñÿ èñõîäíûì êîäîì (source code) äëÿ ýòîãî
ìàêðîñà. Ïîçæå, êîãäà âû çàïóñêàåòå ìàêðîñ, VBA ñ÷èòûâàåò çàïèñàííûå
â èñõîäíîì êîäå èíñòðóêöèè è âûïîëíÿåò êàæäóþ ïîñëåäîâàòåëüíî, ïîâòîðÿÿ
òàêèì îáðàçîì âñå äåéñòâèÿ, êîòîðûå âû âûïîëíÿëè, êîãäà çàïèñûâàëè
ìàêðîñ.
 ëèñòèíãå 1.2 ïðèâåäåí èñõîäíûé êîä, ïîëó÷åííûé ïðè çàïèñè âàìè
ìàêðîñà ÂûäåëèòüÒåêñò â Word 2007. Îáðàòèòå âíèìàíèå, èìÿ è îïèñàíèå
ìàêðîñà, êîòîðûå âû ââåëè â äèàëîãîâîå îêíî Çàïèñü ìàêðîñà, âêëþ÷åíû
â íà÷àëî èñõîäíîãî êîäà çàïèñàííîãî ìàêðîñà.

Ëèñòèíã 1.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

Ïîäîáíûé êîä ïðîèçâîäèòñÿ è ìàêðîðåêîðäåðîì Excel. Êîä â ëèñòèíãå 1.3


ïðåäñòàâëÿåò ñîáîé èñõîäíûé êîä, ïîëó÷åííûé ïðè çàïèñè ìàêðîñà Format-
ArialBold12 â Excel. Çàìåòüòå, ÷òî èìÿ è îïèñàíèå ìàêðîñà, êîòîðûå âû ââåëè
â äèàëîãîâîå îêíî Çàïèñü ìàêðîñà, òàêæå âêëþ÷åíû â íà÷àëî èñõîäíîãî êîäà çà-
ïèñàííîãî ìàêðîñà.

Ëèñòèíã 1.3. Ìàêðîñ, çàïèñàííûé â Excel


1: Sub FormatArialBold12()
2: '
36 Ãëàâà 1

3: ' FormatArialBold12 Ìàêðîñ


4: ' Ôîðìàòèðóåò òåêñò äèàïàçîíà: Arial, Bold, 12
5: '
6:
7: '
8: With Selection.Font
9: .Name = "Arial"
10: .Size = 11
11: .Strikethrough = False
12: .Superscript = False
13: .Subscript = False
14: .OutlineFont = False
15: .Shadow = False
16: .Underline = xlUnderlineStyleNone
17: .ThemeColor = xlThemeColorLight1
18: .TintAndShade = 0
19: .ThemeFont = xlThemeFontNone
20: End With
21: Selection.Font.Bold = True
22: With Selection.Font
23: .Name = "Arial"
24: .Size = 12
25: .Strikethrough = False
26: .Superscript = False
27: .Subscript = False
28: .OutlineFont = False
29: .Shadow = False
30: .Underline = xlUnderlineStyleNone
31: .ThemeColor = xlThemeColorLight1
32: .TintAndShade = 0
33: .ThemeFont = xlThemeFontNone
34: End With
35:End Sub

Íà äàííîì ýòàïå ðàáîòû ñ êíèãîé åùå ðàíî èçó÷àòü ïðèâåäåííûå ëèñòèíãè.


Âû ìîæåòå çàïèñûâàòü è âûïîëíÿòü ìàêðîñû, äàæå íå çàãëÿäûâàÿ â èñõîäíûé
êîä èëè íå çíàÿ, ÷òî äàííûé ìàêðîñ âûïîëíÿåò. Â ñëåäóþùåé ãëàâå îïèñûâà-
þòñÿ ðàçíûå ñîñòàâëÿþùèå ìàêðîñà è îáúÿñíÿåòñÿ, êàê íàõîäèòü èñõîäíûé
êîä äëÿ îïðåäåëåííîãî ìàêðîñà è âûâîäèòü åãî íà ýêðàí äëÿ ðåäàêòèðîâàíèÿ
è ïðîâåðêè.
Âûïîëíåíèå ìàêðîñîâ
Ïîñëå òîãî êàê âû çàïèñàëè ðåêîðäåðîì ìàêðîñ, ýòîò ìàêðîñ ìîæíî
âûïîëíèòü. Ïðè âûïîëíåíèè ìàêðîñà Word, Excel (èëè äðóãîå ïðèëîæåíèå)
ñëåäóþò âñåì èíñòðóêöèÿì, çàïèñàííûì â ìàêðîñå.
È â Word, è â Excel ìàêðîñ çàïóñêàåòñÿ âûáîðîì êíîïêè Ìàêðîñû íà âêëà-
äêå Âèä è îïöèè Ìàñêðîñû â âûïàäàþùåì ìåíþ èëè — êíîïêè Ìàêðîñû íà
âêëàäêå Ðàçðàáîò÷èê. È â òîì, è â äðóãîì ñëó÷àå íà ýêðàíå îòîáðàæàåòñÿ
äèàëîãîâîå îêíî Ìàêðîñû (ðèñ. 1.19) ñî ñïèñêîì ìàêðîñîâ, èç êîòîðîãî ñëåäóåò
âûáðàòü íåîáõîäèìûé ìàêðîñ è ùåëêíóòü êíîïêó Âûïîëíèòü (Run).
Íàïðèìåð, äëÿ âûïîëíåíèÿ ìàêðîñà ÂûäåëèòüÒåêñò, êîòîðûé âû çàïèñàëè
ðàíåå â ýòîé ãëàâå, ñíà÷àëà âûäåëèòå íåêîòîðûé òåêñò â äîêóìåíòå. Çàòåì
ùåëêíèòå êíîïêó Ìàêðîñû íà âêëàäêå Âèä è âûáåðèòå îïöèþ Ìàñêðîñû â
âûïàäàþùåì ìåíþ. Âûáåðèòå ìàêðîñ ÂûäåëèòüÒåêñò â ñïèñêå Èìÿ (Macro
Name) è çàòåì ùåëêíèòå êíîïêó Âûïîëíèòü, ÷òîáû âûïîëíèòü ýòîò ìàêðîñ.
Âûäåëåííûé ïåðåä âûïîëíåíèåì ìàêðîñà òåêñò â âàøåì äîêóìåíòå áóäåò
îòôîðìàòèðîâàí ñ èñïîëüçîâàíèåì ïîëóæèðíîãî øðèôòà Arial 12-ãî ðàçìåðà.
Ââåäåíèå â ìàêðîñû 37

Äëÿ âûïîëíåíèÿ çàïèñàííîãî âàìè â Excel ìàêðîñà FormatArialBold12


âûáåðèòå ñíà÷àëà ÿ÷åéêó â ðàáî÷åì ëèñòå (ïðåäïî÷òèòåëüíåå ÿ÷åéêó, ñîäåð-
æàùóþ íåêîòîðûé òåêñò, ÷òîáû âû ìîãëè âèäåòü èçìåíåíèÿ). Çàòåì
ùåêëêíèòå êíîïêó Ìàêðîñû íà âêëàäêå Âèä è âûáåðèòå îïöèþ Ìàñêðîñû â
âûïàäàþùåì ìåíþ äëÿ îòîáðàæåíèÿ äèàëîãîâîãî îêíà Ìàñêðîñû è çàòåì
âûáåðèòå ìàêðîñ PERSONAL.XLSB!FormatArialBold12 â ñïèñêå Èìÿ (Macro
Name). Íàêîíåö, ùåëêíèòå íà êíîïêå Âûïîëíèòü äëÿ çàïóñêà ìàêðîñà
FormatArialBold12. Òåêñò â ëþáîé ÿ÷åéêå, êîòîðàÿ áûëà âûäåëåíà äî çàïóñêà
âàìè ýòîãî ìàêðîñà, áóäåò òåïåðü èìåòü ôîðìàò ïîëóæèðíîãî øðèôòà Arial
12-ãî ðàçìåðà.
 Word äèàëîãîâîå îêíî Ìàêðîñû ñîäåðæèò èìåíà ìàêðîñîâ, ñîõðàíåííûõ
â òåêóùåì äîêóìåíòå èëè â ëþáûõ îáùèõ øàáëîíàõ (ñì. ðèñ. 1.19).
Èñïîëüçóéòå ñïèñîê Ìàêðîñû èç: äëÿ âûáîðà îïðåäåëåííîãî äîêóìåíòà èëè
øàáëîíà, åñëè çàòðóäíÿåòåñü íàéòè íóæíûé âàì ìàêðîñ â ïîëíîì ñïèñêå
äîñòóïíûõ ìàêðîñîâ.
Äèàëîãîâîå îêíî Ìàêðîñû â Excel ñîäåðæèò èìåíà ìàêðîñîâ, ñîõðàíåííûõ
â ëþáûõ ðàáî÷èõ êíèãàõ, îòêðûòûõ â äàííûé ìîìåíò. Èìÿ ðàáî÷åé êíèãè,

Ðèñ. 1.19
Âûáåðèòå ìàêðîñ ÂûäåëèòüÒåêñò â ñïèñêå
Èìÿ à ùåëêíèòå êíîïêó Âûïîëíèòü äëÿ
çàïóñêà ìàêðîñà

ñîäåðæàùåé ìàêðîñ, ïîìåùåíî ïåðåä èìåíåì ìàêðîñà â ñïèñêå Èìÿ, åñëè


ìàêðîñ íå íàõîäèòñÿ â òåêóùåé ðàáî÷åé êíèãå (êàê â ñëó÷àå ñ ìàêðîñîì
PERSONAL.XLSB!FormatArialBold12). Åñëè íåîáõîäèìûé âàì ìàêðîñ íå
íàõîäèòñÿ â ñïèñêå, îòêðîéòå ðàáî÷óþ êíèãó, â êîòîðîé áûë ñîõðàíåí ýòîò
ìàêðîñ, ÷òîáû ñäåëàòü ìàêðîñ äîñòóïíûì ïåðåä òåì, êàê âû îòêðîåòå
äèàëîãîâîå îêíî Ìàêðîñû.
Åñëè âû èñïîëüçîâàëè îïöèè äèàëîãîâîãî îêíà Çàïèñü ìàêðîñà (Record Macro)
â Word äëÿ íàçíà÷åíèÿ âàøåìó ìàêðîñó ãîðÿ÷åé êëàâèøè èëè êíîïêè íà
ïàíåëè áûñòðîãî äîñòóïà, âû ìîæåòå òàêæå çàïóñêàòü ýòîò ìàêðîñ, ùåëêàÿ íà
ñîîòâåòñòâóþùåé êíîïêå ïàíåëè áûñòðîãî äîñòóïà èëè íàæèìàÿ ñîîò-
âåòñòâóþùåå ñî÷åòàíèå êëàâèø.
Àíàëîãè÷íî, åñëè âû íàçíà÷èëè ãîðÿ÷óþ êëàâèøó â äèàëîãîâîì îêíå
Çàïèñü ìàêðîñà â Excel, âû ìîæåòå çàïóñêàòü ýòîò ìàêðîñ, íàæèìàÿ ñî÷åòàíèå
íàçíà÷åííûõ êëàâèø. Êàê è â ñëó÷àå ñ ìàêðîñàìè, ïåðå÷èñëåííûìè â äèàëî-
ãîâîì îêíå Ìàêðîñû â Excel, òîëüêî ìàêðîñû, ñîõðàíåííûå â òåêóùåé îòðûòîé
ðàáî÷åé êíèãå (ýòî íå äîëæíà áûòü îáÿçàòåëüíî àêòèâíàÿ ðàáî÷àÿ êíèãà),
ìîãóò èìåòü àêòèâèçèðîâàííûå ãîðÿ÷èå êëàâèøè.
38 Ãëàâà 1

Êàê âû óæå çíàåòå, âû ìîæåòå òàêæå çàïóñêàòü ìàêðîñû â Word è Excel,


íàçíà÷àÿ èì êíîïêè íà ïàíåëè áûñòðîãî äîñòóïà èëè ñîçäàâàÿ äëÿ èõ âûçîâà
ïóíêòû ìåíþ. Âû ìîæåòå òàêæå íàçíà÷èòü ìàêðîñó êíîïêó èëè ãðàôè÷åñêèé
îáúåêò, ïîìåùåííûé íåïîñðåäñòâåííî â ðàáî÷èé ëèñò Excel èëè â äîêóìåíò
Word. Äëÿ ïîëó÷åíèÿ áîëåå ïîëíîé èíôîðìàöèè îá èñïîëüçîâàíèè èíòåð-
àêòèâíûõ âîçìîæíîñòåé äëÿ íàçíà÷åíèÿ ìàêðîñîâ êíîïêàì ïàíåëè è ãðà-
ôè÷åñêèì îáúåêòàì â äîêóìåíòàõ è ðàáî÷èõ ëèñòàõ îáðàùàéòåñü ê ðàçäåëàì
ñïðàâî÷íîé ñèñòåìû Excel è Word.
Ñîõðàíåíèå äîêóìåíòà ñ çàïèñàííûì ìàêðîñîì
Ïîñëå òîãî êàê âû çàïèñàëè ïåðâûé ìàêðîñ â Word (èëè Excel), ðàíî èëè
ïîçäíî âàì ïðèäåòñÿ çàêðûòü ñîîòâåòñòâóþùèé äîêóìåíò (èëè êíèãó). Ïðè
ýòîì âû ìîæåòå ê ñâîåìó óäèâëåíèþ óâèäåòü íà ýêðàíå íåîáû÷íîå îêíî ñ
ñîîáùåíèåì î òîì, ÷òî âàø äîêóìåíò ñîäåðæèò, êðîìå îáû÷íûõ äàííûõ,
ìàêðîñ — ïðîåêò VBA, — è íå ìîæåò áûòü ñîõðàíåí êàê äîêóìåíò áåç
ïîääåðæêè ìàêðîñîâ (ðèñ. 20).
Åñëè çàïèñàííûé ìàêðîñ âàì áîëåå íå íóæåí, ìîæåòå ïðîäîëæèòü
ñîõðàíåíèå, ùåëêíóâ êíîïêó Äà.  ïðîòèâíîì ñëó÷àå ùåëêíèòå êíîïêó Íåò è â

Ðèñ. 1.20
Îêíî ñ ñîîáùåíèåì î òîì, ÷òî äîêóìåíò ñîäåðæèò, êðîìå îáû÷íûõ äàííûõ, ìàêðîñ —
ïðîåêò VBA, — è íå ìîæåò áûòü ñîõðàíåí êàê äîêóìåíò áåç ïîääåðæêè ìàêðîñîâ

êíå Ñîõðàíåíèå äîêóìåíòà âûáåðèòå äëÿ òèïà äîêóìåíòà Äîêóìåíò Word ñ


ïîääåðæêîé ìàêðîñîâ (ðèñ. 1.21). Äëÿ Excel â îäíîèìåííîì îêíå âû äîëæíû
áóäåòå âûáðàòü Êíèãà Excel ñ ïîääåðæêîé ìàêðîñîâ.
Äîêóìåíòû è êíèãè, ñîõðàíåííûå ñ ïîääåðæêîé ìàêðîñîâ, îòëè÷àþòñÿ îò
îáû÷íûõ ïðåäñòàâëåíèåì èõ â Ïðîâîäíèêå. Íà ðèñ. 1.22 îíè ðàñïîëîæåíû â
ëåâîì ñòîëáöå.
 çàêëþ÷åíèå îòìåòèì, ÷òî ïðè ïîïûòêå çàïóñòèòü çàïèñàííûé â
ïðåäûäóùåì ñåàíñå òåêóùåãî äîêóìåíòà ìàêðîñ âû ìîæåòå ïîëó÷èòü îäíî èç
ñîîáùåíèé îò ñèñòåìû áåçîïàñíîñòè î òîì, ÷òî ìàêðîñ çàïóñòèòü íåâîçìîæíî
(ðèñ. 23, 24).
Ñîîáùåíèå, ïðèâåäåííîå íà ðèñ. 23, ñëåäóåò ïîíèìàòü èìåííî òàê, êàê îíî
íàïèñàíî: ëèáî ìàêðîñ íå íàéäåí, ïîòîìó ÷òî íå ïðèíàäëåæèò äàííîé êíèãå,
ëèáî äåéñòâèòåëüíî äëÿ Word îòêëþ÷åíà âîçìîæíîñòü âûïîëíåíèÿ ìàêðîñîâ
èç ñîîáðàæåíèé áåçîïàñíîñòè.
Åñëè ìàêðîñ áûë çàïèñàí íå â òåêóùåé êíèãå è íå â ôàéëå ñ èìåíåì Nor-
mal.dotm, îí íå ìîæåò áûòü çàïóùåí èç òåêóùåé êíèãè (äàæå, åñëè êíèãà, â
êîòîðîé îí çàïèñàí, òàêæå îòêðûòà).
Åñëè äëÿ Word îòêëþ÷åíà âîçìîæíîñòü âûïîëíåíèÿ ìàêðîñîâ èç
ñîîáðàæåíèé áåçîïàñíîñòè, íèêàêîé ìàêðîñ (äàæå, ñîõðàíåííûé â Nor-
Ââåäåíèå â ìàêðîñû 39

mal.dotm) íå ìîæåò áûòü çàïóùåí, î ÷åì è ñîîáùàåò îêíî, ïðèâåäåííîå íà


ðèñ. 1.24

Ðèñ. 1.21
Îêíî
Ñîõðàíåíèå
äîêóìåíòà â
Excel

Ðèñ. 1.22
Äîêóìåíòû è êíèãè, ñîõðàíåííûå ñ
ïîääåðæêîé ìàêðîñîâ, îòëè÷àþòñÿ îò îáû÷íûõ
ïðåäñòàâëåíèåì èõ â Ïðîâîäíèêå

Ðèñ. 1.23
Ñîîáùåíèå ñèñòåìû
áåçîïàñíîñòè î
íåâîçìîæíîñòè çàïóñêà
ìàêðîñà

Ðèñ. 1.24
Ñîîáùåíèå ñèñòåìû áåçîïàñíîñòè î íåâîçìîæíîñòè çàïóñêà ìàêðîñà
40 Ãëàâà 1

×òîáû âêëþ÷èòü âîçìîæíîñòü âûïîëíåíèÿ ìàêðîñîâ, íåîáõîäèìî â îêíå


Öåíòð óïðàâëåíèÿ áåçîïàñíîñòüþ (îòêðûâàåòñÿ êíîïêîé Áåçîïàñíîñòü ìàêðîñîâ íà
âêëàäêå Ðàçðàáîò÷èê) âûáðàòü ïåðåêëþ÷àòåëü Âêëþ÷èòü âñå ìàêðîñû.
Ðåäàêòèðîâàíèå
2
ìàêðîñîâ
 ïåðâîé ãëàâå âû óçíàëè, êàê çàïèñûâàòü è âûïîëíÿòü ìàêðîñû â Word
è Excel. Ïåðåä ðåäàêòèðîâàíèåì è íàïèñàíèåì ìàêðîñîâ âàì ñëåäóåò óçíàòü
áîëüøå î òîì, ãäå ñîõðàíÿþòñÿ ìàêðîñû. Íåîáõîäèìî òàêæå èìåòü îáùåå ïðåä-
ñòàâëåíèå î êîìïîíåíòå VBA Editor, åãî êîìàíäàõ ìåíþ è êíîïêàõ ïàíåëåé
èíñòðóìåíòîâ.

Ìîäóëè
Âû óæå çíàåòå (èç ïåðâîé ãëàâû), ÷òî ìàêðîñû 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.

Ðåäàêòîð Visual Basic


Äëÿ ïðîñìîòðà ìîäóëåé, ñîõðàíåííûõ â îïðåäåëåííîì äîêóìåíòå, øàáëîíå
èëè ðàáî÷åé êíèãå (è èñõîäíîãî êîäà ìàêðîñà, êîòîðûé îíè ñîäåðæàò), âàì íå-
îáõîäèìî èñïîëüçîâàòü êîìïîíåíò Visual Basic Editor (Ðåäàêòîð Visual Basic).
Ýòîò êîìïîíåíò ïðåäîñòàâëÿåò èíñòðóìåíòàëüíûå ñðåäñòâà, êîòîðûå èñïîëüçó-
þòñÿ äëÿ ñîçäàíèÿ íîâûõ ìîäóëåé, ïðîñìîòðà ñîäåðæèìîãî ñóùåñòâóþùèõ
ìîäóëåé, ñîçäàíèÿ è ðåäàêòèðîâàíèÿ èñõîäíîãî êîäà ìàêðîñà, ñîçäàíèÿ ïîëü-
çîâàòåëüñêèõ äèàëîãîâûõ îêîí è âûïîëíåíèÿ äðóãèõ çàäà÷, îòíîñÿùèõñÿ ê íà-
ïèñàíèþ è îáñëóæèâàíèþ ïðîãðàìì íà VBA. Êàê âû óæå ìîãëè çàìåòèòü, â
ýòîé êíèãå êîìïîíåíò Ðåäàêòîð Visual Basic íàçûâàåòñÿ ïðîñòî «Ðåäàêòîð
VB».
Ðåäàêòîð VB ñîäåðæèò îäíè è òå æå âîçìîæíîñòè â Word, Excel (è, íàïðè-
ìåð, Access). Êîãäà âû èñïîëüçóåòå Ðåäàêòîð VB â Word, âû, ôàêòè÷åñêè, èñ-
ïîëüçóåòå òîò æå Ðåäàêòîð VB, êîòîðûé èìååòñÿ â âàøåì ðàñïîðÿæåíèè â
Excel. Â ïîñëåäóþùèõ íåñêîëüêèõ ïàðàãðàôàõ ðàññêàçûâàåòñÿ î òîì, êàê çà-
ïóñêàòü Ðåäàêòîð VB, îáúÿñíÿåòñÿ íàçíà÷åíèå ðàçëè÷íûõ îêîí, îòîáðàæàå-
ìûõ êîìïîíåíòîì Ðåäàêòîð VB, è îïèñûâàåòñÿ ìåíþ Ðåäàêòîðà VB è êîìàíäû
ïàíåëè èíñòðóìåíòîâ.

Çàïóñê Ðåäàêòîðà VB
Êàê óêàçûâàëîñü â ïðåäûäóùèõ ðàçäåëàõ, ÷òîáû ïðîñìîòðåòü ìîäóëè èëè
èñõîäíûé êîä VBA, êîòîðûé îíè ñîäåðæàò, âàì íåîáõîäèìî ñíà÷àëà çàïóñòèòü
Ðåäàêòîð VB. Íåçàâèñèìî îò òîãî, ðàáîòàåòå ëè âû â Word èëè â Excel (à òàêæå
è Access), Ðåäàêòîð VB çàïóñêàåòñÿ îäíèì è òåì æå ñïîñîáîì. Èñïîëüçóéòå äëÿ
ýòîãî îäèí èç ñëåäóþùèõ ïðèåìîâ:
¨ Âûáåðèòå íà âêëàäêå Ðàçðàáîò÷èê ùåëêíèòå êíîïêó Visual Basic.
¨ Íàæìèòå ñî÷åòàíèå êëàâèø Alt+F11.
Ðåäàêòèðîâàíèå ìàêðîñîâ 43

Êàêèì áû ïðèåìîì âû íå âîñïîëüçîâàëèñü, Word (Excel) çàïóñòèò Ðåäàêòîð


Visual Basic. Íà ðèñ. 2.1 ïîêàçàíî òèïè÷íîå îêíî Ðåäàêòîðà Visual Basic, îòî-
áðàæåííîå â Word. Îêíî Ðåäàêòîðà VB, îòîáðàæàåìîå â Excel (ðèñ. 2.2), â îñ-
íîâíîì ïîäîáíî îêíó Ðåäàêòîðà VB, ïîêàçàííîìó íà ðèñ. 2.1.

Îêíà Ðåäàêòîðà VB
 îêíå Ðåäàêòîðà VB èìåþòñÿ òðè äî÷åðíèõ îêíà, êàæäîå èç êîòîðûõ îòî-
áðàæàåò âàæíóþ èíôîðìàöèþ î VBA-ïðîåêòå. [Project (Ïðîåêò) — ýòî ãðóïïà
ìîäóëåé è äðóãèõ îáúåêòîâ, ñîõðàíÿåìûõ â îïðåäåëåííîì äîêóìåíòå, øàáëîíå
äîêóìåíòà, ðàáî÷åé êíèãå èëè øàáëîíå ðàáî÷åé êíèãè.] Êàæäîå èç îêîí Ðå-
äàêòîðà VB îòîáðàæàåòñÿ ïî óìîë÷àíèþ â ïðèêðåïëåííûõ (docked) ïîëîæåíè-
ÿõ, ïîêàçàííûõ íà ðèñ. 2.1.

Ðèñ. 2.1
Òèïè÷íîå îêíî
Ðåäàêòîðà VB â
Microsoft Word

Ðèñ. 2.2
Òèïè÷íîå îêíî
Ðåäàêòîðà VB â
Microsoft Excel
44 Ãëàâà 2

Åñëè íåîáõîäèìî, âû ìîæåòå ïåðåìåñòèòü ëþáîå èç äî÷åðíèõ îêîí Ðåäàêòî-


ðà VB â ëþáîå ìåñòî íà ýêðàíå, ñòðîêó çàãîëîâêà (title bar) ýòîãî îêíà òàêèì
æå îáðàçîì, êàêèì áû âû ïåðåìåùàëè ëþáîå îêíî íà ðàáî÷åì ñòîëå Windows.
Ïåðåòàñêèâàíèå îäíîãî èç äî÷åðíèõ îêîí èç åãî ïðèêðåïëåííîãî ïîëîæåíèÿ
ïðèâîäèò ê òîìó, ÷òî îíî ñòàíîâèòñÿ ïëàâàþùèì îêíîì. Ïëàâàþùèå
(floating) îêíà âñåãäà îñòàþòñÿ âèäèìûìè ïîâåðõ äðóãèõ îêîí. Âû ìîæåòå
òàêæå èçìåíÿòü ðàçìåð ëþáîãî èç äî÷åðíèõ îêîí Ðåäàêòîðà VB, ðàñøèðÿÿ èëè
óìåíüøàÿ ðàìêó îêíà äëÿ óâåëè÷åíèÿ èëè óìåíüøåíèÿ åãî ðàçìåðà, ÷òî ïî-
äîáíî èçìåíåíèþ ðàçìåðà ëþáîãî îêíà íà ðàáî÷åì ñòîëå Windows.
Äàëåå îïèñûâàþòñÿ òðè îêíà Ðåäàêòîðà VB è èõ íàçíà÷åíèå.
Project Explorer ñîäåðæèò äåðåâî-äèàãðàììó îòêðûòûõ â äàííûé ìîìåíò
ôàéëîâ (äîêóìåíòû, øàáëîíû èëè ðàáî÷èå êíèãè) è îáúåêòîâ, ñîäåðæàùèõñÿ â
ýòèõ ôàéëàõ (îáúåêòû host-ïðèëîæåíèÿ, ìîäóëè, ññûëêè, ôîðìû è òàê äàëåå).
Project Explorer ìîæíî èñïîëüçîâàòü äëÿ ïåðåõîäà ê ðàçëè÷íûì ìîäóëÿì è
äðóãèì îáúåêòàì â ïðîåêòå VB ïðè ïîìîùè êíîïîê (ïàíåëè èíñòðóìåíòîâ ýòî-
ãî îêíà) View Code (ïðîãðàììà), View Object (îáúåêò) è Toggle Folders (ïàïêè).
Properties Window ñîäåðæèò âñå ñâîéñòâà îáúåêòà òåêóùåãî âûáîðà. Â íåêîòî-
ðûõ ñëó÷àÿõ, êàê â îêíå, ïîêàçàííîì íà ðèñ. 2.1, ñâîéñòâà îáúåêòà ñîñòîÿò
òîëüêî èç åãî èìåíè. (Ïîäðîáíåå îá îáúåêòàõ è ñâîéñòâàõ îáúåêòîâ âû óçíàåòå
èç ñëåäóþùèõ ãëàâ.) Âêëàäêà Alphabetic (ïî àëôàâèòó) ýòîãî îêíà ïðåäîñòàâëÿ-
åò ñïèñîê ñâîéñòâ âûäåëåííîãî îáúåêòà, ñîñòàâëåííûé èç èìåí ñâîéñòâ â àëôà-
âèòíîì ïîðÿäêå. Âêëàäêà Categorized (ïî êàòåãîðèÿì) îòîáðàæàåò ñâîéñòâà îáú-
åêòà, îòñîðòèðîâàííûå ïî êàòåãîðèÿì.
Code Window — ýòî îêíî, â êîòîðîì âû ìîæåòå ïðîñìàòðèâàòü, ðåäàêòèðî-
âàòü èëè ñîçäàâàòü èñõîäíûé êîä VBA. Â ðåæèìå Full Module View âåñü èñõîäíûé
êîä ìàêðîñà â ìîäóëå îòîáðàæàåòñÿ â ïðîêðó÷èâàþùåìñÿ òåêñòîâîì îêíå, à
ìàêðîñ îòäåëÿåòñÿ îò äðóãîãî ìàêðîñà ñåðîé ëèíèåé. Ðåäàêòîð VB ïîçâîëÿåò
òàêæå ïðîñìàòðèâàòü ñîäåðæèìîå ìîäóëÿ â ðåæèìå Procedure View (ïðåäñòàâëå-
íèå ïðîöåäóðû). ×òîáû âûáðàòü ðåæèì ïðîñìîòðà, ùåëêàéòå êíîïêè â íèæ-
íåì ëåâîì óãëó Code Window (ñì. ðèñ. 2.3).
Çàìå÷àíèå
Åñëè âû îäíîâðåìåííî èñïîëüçóåòå íåñêîëüêî äîêóìåíòîâ (ïðîåêòîâ), ñîäåðæàùèõ ìàêðîñû ñ
îäèíàêîâûìè èìåíàìè, âàì ñëåäóåò âíèìàòåëüíî ðàáîòàòü ñ îêíîì Project Explorer, ÷òîáû
ðåäàêòèðîâàòü èìåííî òå ìàêðîñû, êîòîðûå íåîáõîäèìî.

Ðèñ. 2.3
Äëÿ âûáîðà
ðåæèìà
ïðîñìîòðà,
ùåëêàéòå êíîïêè
â íèæíåì ëåâîì
óãëó Code Window

Êîãäà Code Window íàõîäèòñÿ â ðåæèìå Procedure View, âèäèìûì ÿâëÿåòñÿ


èñõîäíûé êîä òîëüêî îäíîãî ìàêðîñà. Èñïîëüçóéòå ðàñêðûâàþùèéñÿ ñïèñîê
Procedure (ïðîöåäóðà) äëÿ ïðîñìîòðà äðóãîãî ìàêðîñà. Â ðåæèìå Full Module View
Ðåäàêòèðîâàíèå ìàêðîñîâ 45

âû ìîæåòå òàêæå èñïîëüçîâàòü ðàñêðûâàþùèéñÿ ñïèñîê Procedure äëÿ


áûñòðîãî ïåðåõîäà ê îòäåëüíîìó ìàêðîñó.
Èñïîëüçóéòå ñïèñîê Object List (îáúåêò) äëÿ âûáîðà îáúåêòà, ïðîöåäóðû
êîòîðîãî õîòèòå ïðîñìîòðåòü èëè ðåäàêòèðîâàòü.  ñëó÷àå ñòàíäàðòíûõ
ìîäóëåé, òàêèõ êàê ìîäóëè, â êîòîðûõ ñîõðàíÿþòñÿ çàïèñàííûå âàìè
ìàêðîñû, åäèíñòâåííûì âûáîðîì â ñïèñêå Object List ÿâëÿåòñÿ General (îáùàÿ
îáëàñòü).
Òåïåðü, îçíàêîìèâøèñü ñ îêíàìè Ðåäàêòîðà VB, âû ìîæåòå ïåðåéòè ê
èçó÷åíèþ ïàíåëåé èíñòðóìåíòîâ è ìåíþ Ðåäàêòîðà VB, êîòîðûå ñîäåðæàò
êîìàíäû, ïîìîãàþùèå óïðàâëÿòü îêíàìè Project Explorer, Properties Window, Code
Window è èõ ñîäåðæèìûì.

Ìåíþ Ðåäàêòîðà VB
 ýòîì è ïîñëåäóþùèõ ðàçäåëàõ ðàññêàçûâàåòñÿ î ìåíþ è ïàíåëÿõ èíñòðó-
ìåíòîâ Ðåäàêòîðà VB. Ñåé÷àñ âàì íåîáõîäèìî ëèøü ïîçíàêîìèòüñÿ ñ èìåþùè-
ìèñÿ êîìàíäàìè. Ìîæåòå ïîïðîáîâàòü èñïîëüçîâàòü íåêîòîðûå èç ýòèõ êî-
ìàíä, òîëüêî óáåäèòåñü ñíà÷àëà, ÷òî âû ýêñïåðèìåíòèðóåòå ñ äîêóìåíòîì (èëè
ðàáî÷åé êíèãîé), íå ñîäåðæàùèì íåçàìåíèìûõ äàííûõ.
Çàìå÷àíèå
Äàëåå â òåêñòå çíà÷êè <, > ñ íàõîäÿùèìñÿ âíóòðè íèõ òåêñòîì îçíà÷àþò, ÷òî â çàâèñèìîñòè îò ñèòóàöèè
íà ýòî ìåñòî ïîäñòàâëÿåòñÿ èìÿ ôàéëà, ìîäóëÿ, ìàêðîñà, ïðîåêòà è ò.ä.

Ìåíþ File (Ôàéë)


Ìåíþ File, êàê è âî âñåõ ïðèëîæåíèÿõ Windows, ñîäåðæèò êîìàíäû,
îòíîñÿùèåñÿ ê ñîõðàíåíèþ è îòêðûòèþ ôàéëîâ. Â Ðåäàêòîðå VB ìåíþ File
ïðåäîñòàâëÿåò êîìàíäû, íåîáõîäèìûå äëÿ ñîõðàíåíèÿ èçìåíåíèé â ïðîåêòå
VBA è âûâîäà íà ýêðàí èñõîäíîãî êîäà âàøåãî ìàêðîñà VBA. Â òàáë. 2.1
ïðèâåäåíû êîìàíäû ìåíþ File, èõ ãîðÿ÷èå êëàâèøè è íàçíà÷åíèå êàæäîé
êîìàíäû.
Òàáëèöà 2.1. Êîìàíäû ìåíþ File

«Ãîðÿ÷àÿ»
Êîìàíäà Äåéñòâèå
êëàâèøà

Ñîõðàíÿåò òåêóùèé ïðîåêò (ïðåçåíòàöèþ,


Save <project> ðèñóíîê è ò.ä. â çàâèñèìîñòè îò
(ñîõðàíèòü Ctrl+S ïðèëîæåíèÿ, â êîòîðîì îòêðûò Ðåäàêòîð
<ïðîåêò>) VB) VBA íà äèñêå, âêëþ÷àÿ âñå ìîäóëè è
ôîðìû..

Äîáàâëÿåò ñóùåñòâóþùèé ìîäóëü èëè êëàññ


â òåêóùèé ïðîåêò. Âû ìîæåòå
Import File
Ctrl+M èìïîðòèðîâàòü òîëüêî ìîäóëè, ôîðìû èëè
(èìïîðò ôàéëà)
êëàññû, ñîõðàíåííûå ðàíåå êîìàíäîé Export
File èç äðóãîãî ïðîåêòà.
46 Ãëàâà 2

«Ãîðÿ÷àÿ»
Êîìàíäà Äåéñòâèå
êëàâèøà

Ñîõðàíÿåò òåêóùèé ìîäóëü, ôîðìó èëè


Export File êëàññ â ôîðìàòå òåêñòîâîãî ôàéëà äëÿ
Ctrl+E
(ýêñïîðò ôàéëà) èìïîðòèðîâàíèÿ â äðóãîé ïðîåêò èëè â
öåëÿõ àðõèâèðîâàíèÿ.

Ïåðìàíåíòíî óäàëÿåò ìîäóëü èëè ôîðìó


Remove <item> òåêóùåãî âûáîðà èç ïðîåêòà VBA. Ýòà
(óäàëèòü <…>) êîìàíäà íå äîñòóïíà, åñëè â Project Explorer
íå âûáðàí íèêàêîé ýëåìåíò.

Ïå÷àòàåò ìîäóëü èëè ôîðìó äëÿ


Print (ïå÷àòü) Ctrl+P äîêóìåíòèðîâàíèÿ èëè ñ öåëüþ
àðõèâèðîâàíèÿ.

Close and Return to … Çàêðûâàåò Ðåäàêòîð VB è âîçâðàùàåò âàñ â


(çàêðûòü è âåðíóòüñÿ Alt+Q îêíî host-ïðèëîæåíèÿ, èç êîòîðîãî áûë
â ...) îòêðûò Ðåäàêòîð VB.

Ìåíþ Edit (ïðàâêà)


Ìåíþ Edit ñîäåðæèò êîìàíäû, îòíîñÿùèåñÿ ê óïðàâëåíèþ èñõîäíûì êîäîì
ìàêðîñà â Code Window è îáúåêòàìè â ôîðìàõ. Â òàáë. 2.2 ïðèâåäåíû
èìåþùèåñÿ êîìàíäû ìåíþ Edit, èõ ãîðÿ÷èå êëàâèøè è îïèñûâàåòñÿ äåéñòâèå,
âûïîëíÿåìîå êàæäîé êîìàíäîé.
Òàáëèöà. 2.2. Êîìàíäû ìåíþ Edit

«Ãîðÿ÷àÿ»
Êîìàíäà Äåéñòâèå
êëàâèøà

Îòìåíÿåò ñàìóþ ïîñëåäíþþ êîìàíäó. Íå âñå


Undo (îòìåíèòü) Ctrl+Z êîìàíäû ìîãóò áûòü îòìåíåíû. Ìåíþ äîñòóïíî
òîëüêî â ñëó÷àå, åñëè åñòü, ÷òî îòìåíÿòü.

Âîçâðàùàåò ñàìóþ ïîñëåäíþþ êîìàíäó,


Redo (âåðíóòü)
êîòîðóþ âû îòìåíèëè.

Âûðåçàåò âûäåëåííûé òåêñò èëè îáúåêò è


ïîìåùàåò åãî â Windows Clipboard.
Cut (âûðåçàòü) Ctrl+X
Âûäåëåííûé òåêñò èëè îáúåêò óäàëÿåòñÿ èç
ìîäóëÿ èëè ôîðìû.

Êîïèðóåò âûäåëåííûé òåêñò èëè îáúåêò è


ïîìåùàåò åãî â Windows Clipboard.
Copy (êîïèðîâàòü) Ctrl+C
Âûäåëåííûé òåêñò èëè îáúåêò îñòàåòñÿ
íåèçìåííûì.

Âñòàâëÿåò òåêñò èëè îáúåêò èç Windows


Paste (âñòàâèòü) Ctrl+V
Clipboard â òåêóùèé ìîäóëü èëè ôîðìó.
Ðåäàêòèðîâàíèå ìàêðîñîâ 47

Óäàëÿåò âûäåëåííûé òåêñò èëè îáúåêò èç


Clear (î÷èñòèòü) Del
ìîäóëÿ èëè ôîðìû.

Âûäåëÿåò âåñü òåêñò â ìîäóëå èëè âñå îáúåêòû


Select All Ctrl+A
â ôîðìå.

Ïîçâîëÿåò íàõîäèòü óêàçàííûé òåêñò â


Find (íàéòè) Ctrl+F
ìîäóëå.

Find Next F3 Ïîâòîðÿåò ïîñëåäíþþ îïåðàöèþ Find.

Ïîçâîëÿåò íàõîäèòü óêàçàííûé òåêñò â ìîäóëå


Replace (çàìåíèòü) Ctrl+H
è çàìåíÿòü åãî äðóãèì òåêñòîì.

Ñìåùàåò âåñü âûäåëåííûé òåêñò âïðàâî íà


Indent Tab
èíòåðâàë òàáóëÿöèè.

Ñìåùàåò âåñü âûäåëåííûé òåêñò âëåâî íà


Outdent Shift+Tab
èíòåðâàë òàáóëÿöèè.

Îòêðûâàåò ñïèñîê â List Properties/ Methods,


îòîáðàæàÿ ñâîéñòâà è ìåòîäû îáúåêòà, èìÿ
List
êîòîðîãî âû òîëüêî ÷òî ââåëè. Êîãäà êóðñîð
Properties/Methods
Ctrl+J âñòàâêè íàõîäèòñÿ íà ïóñòîì ìåñòå â List
(ñïèñîê
Properties/ Methods ýòà êîìàíäà îòêðûâàåò
ñâîéñòâ/ìåòîäîâ)
ñïèñîê ãëîáàëüíî äîñòóïíûõ ñâîéñòâ è
ìåòîäîâ.

Îòêðûâàåò ñïèñîê â Code Window,


Ctrl+Shift îòîáðàæàþùèé äîïóñòèìûå êîíñòàíòû äëÿ
List Constants
+J ñâîéñòâà, êîòîðîå âû òîëüêî ÷òî ââåëè ñ
ïðåäøåñòâóþùèì çíàêîì «=».

Îòêðûâàåò âñïëûâàþùåå îêíî ïîäñêàçêè,


Quick Info îòîáðàæàþùåå ïðàâèëüíûé ñèíòàêñèñ äëÿ
Ctrl+I
(ñâåäåíèÿ) ïðîöåäóðû, ôóíêöèè èëè ìåòîäà, êîòîðûé âû
òîëüêî ÷òî ââåëè â Code Window.

Îòêðûâàåò âñïëûâàþùåå îêíî ïîäñêàçêè,


îòîáðàæàþùåå ïàðàìåòðû (íàçûâàåìûå òàêæå
Parameter Info Ctrl+Shift
àðãóìåíòàìè) ïðîöåäóðû, ôóíêöèè èëè
(ïàðàìåòðû) +I
îïåðàòîðà, êîòîðûé âû òîëüêî ÷òî ââåëè â
Code Window.

Ðåäàêòîð VB çàêàí÷èâàåò ñëîâî, êîòîðîå âû


Complete Word ââîäèòå, êàê òîëüêî âû ââåäåòå äîñòàòî÷íî
Ctrl+Space
(çàâåðøèòü ñëîâî) ñèìâîëîâ äëÿ òîãî, ÷òîáû VBA ðàñïîçíàë
êëþ÷åâîå ñëîâî.

Îòêðûâàåò ïîäìåíþ ñ ïóíêòàìè äëÿ


ïîìåùåíèÿ, óäàëåíèÿ èëè ïåðåõîäà ê
Bookmarks
çàêëàäêàì, êîòîðûå âû ðàíåå ïîìåñòèëè â âàø
(çàêëàäêè)
ìîäóëü. Çàêëàäêè Ðåäàêòîðà VB íå èìåþò
èìåí.
48 Ãëàâà 2

Ìåíþ View (Bèä)


Ìåíþ View ñîäåðæèò êîìàíäû, ïîçâîëÿþùèå âûáèðàòü ýëåìåíòû Ðåäàêòîðà
VB äëÿ ïðîñìîòðà è ñïîñîá ïðîñìîòðà. Â òàáë. 2.3 ïðèâåäåíû êîìàíäû ìåíþ
View, èõ ãîðÿ÷èå êëàâèøè è äåéñòâèå, ïðîèçâîäèìîå êàæäîé êîìàíäîé.

Òàáëèöà 2.3. Êîìàíäû ìåíþ View

«Ãîðÿ÷àÿ»
Êîìàíäà Äåéñòâèå
êëàâèøà

Àêòèâèçèðóåò Code Window äëÿ


îòîáðàæåíèÿ èñõîäíîãî êîäà VBA,
Code (ïðîãðàììà) F7
àññîöèèðîâàííîãî ñ âûáðàííûì ìîäóëåì
èëè ôîðìîé.

Îòîáðàæàåò îáúåêò òåêóùåãî âûáîðà â


Object (îáúåêò) Shift+F7
Project Explorer.

Îòîáðàæàåò èñõîäíûé êîä VBA äëÿ


Definition ïðîöåäóðû èëè ôóíêöèè, íà êîòîðóþ
Shift+F2
(îïèñàíèå) óêàçûâàåò êóðñîð; îòîáðàæàåò Object
Browser äëÿ îáúåêòîâ â ñïðàâêå VBA.

Last Position Ïåðåõîäèò â ïîñëåäíþþ ïîçèöèþ â


(âåðíóòüñÿ ê ìîäóëå ïîñëå èñïîëüçîâàíèÿ êîìàíäû
Ctrl+Shift+F2
ïîñëåäíåé ìåíþ Definition èëè ïîñëå ðåäàêòèðîâàíèÿ
ïîçèöèè) êîäà.

Object Browser Îòêðûâàåò Object Browser, ïîçâîëÿþùèé


(ïðîñìîòð F2 îïðåäåëÿòü, êàêèå ìàêðîñû äîñòóïíû â
îáúåêòîâ) äàííûé ìîìåíò.

Immediate Window Îòîáðàæàåò îêíî VBA-îòëàä÷èêà


Ctrl+G
(îêíî îòëàäêè) Immediate Window.

Locals Window (îêíî


Îòîáðàæàåò îêíî îòëàä÷èêà Locals
ëîêàëüíûõ
Window.
ïåðåìåííûõ)

Watch Window (îêíî


Îòîáðàæàåò îêíî îòëàä÷èêà Watch
êîíòðîëüíîãî
Window (êîíòðîëüíûå çíà÷åíèÿ).
çíà÷åíèÿ)

Îòîáðàæàåò ñïèñîê ïîñëåäîâàòåëüíîñòè


Call Stack
Ctrl+L âûçîâîâ äëÿ òåêóùåé ôóíêöèè èëè
(ñòåê âûçîâà)
ïðîöåäóðû VBA.

Project Explorer
Ctrl+R Îòîáðàæàåò Project Explorer.
(îêíî ïðîåêòà)

Properties Window
F4 Îòîáðàæàåò Properties Window.
(îêíî ñâîéñòâ)
Ðåäàêòèðîâàíèå ìàêðîñîâ 49

Îòîáðàæàåò Toolbox. Toolbox


Toolbox èñïîëüçóåòñÿ äëÿ äîáàâëåíèÿ ýëåìåíòîâ
(ïàíåëü ýëåìåíòîâ) óïðàâëåíèÿ â ïîëüçîâàòåëüñêèå
äèàëîãîâûå îêíà.

Îòîáðàæàåò ïîäìåíþ, ïîçâîëÿþùåå


ïîêàçûâàòü èëè ñêðûâàòü ðàçëè÷íûå
Toolbars
ïàíåëè èíñòðóìåíòîâ Ðåäàêòîðà VB èëè
(ïàíåëè
îòêðûâàòü äèàëîãîâîå îêíî äëÿ
èíñòðóìåíòîâ)
íàñòðîéêè îäíîé èç ïàíåëåé
èíñòðóìåíòîâ Ðåäàêòîðà VB.

Âîçâðàùàåò âàñ â host-ïðèëîæåíèå, èç


êîòîðîãî áûë çàïóùåí Ðåäàêòîð VB, íî
îñòàâëÿåò Ðåäàêòîð VB îòêðûòûì.
<Host application>
Alt+F11 Êîíêðåòíîå èìÿ ýòîãî ïóíêòà ìåíþ
(host-ïðèëîæåíèå)
çàâèñèò îò òîãî, èç êàêîãî
host-ïðèëîæåíèÿ VBA âû çàïóñòèëè
Ðåäàêòîð VB.

Ìåíþ Insert (Bñòàâêà)


Êîìàíäû ìåíþ Insert ïîçâîëÿþò äîáàâëÿòü ðàçëè÷íûå îáúåêòû, òàêèå êàê
ìîäóëè è ôîðìû, â âàø ïðîåêò. Â ìåíþ Insert íèêàêèå êîìàíäû íå èìåþò
«ãîðÿ÷èõ êëàâèø».  òàáë. 2.4 ïðèâåäåíû äåéñòâèÿ, âûïîëíÿåìûå êàæäîé
êîìàíäîé ýòîãî ìåíþ.
Òàáëèöà 2.4. Êîìàíäû ìåíþ Insert

Êîìàíäà Äåéñòâèå

Procedure Âñòàâëÿåò íîâóþ ïðîöåäóðó (Sub, Function èëè Property) â


(ïðîöåäóðà) òåêóùèé ìîäóëü. (Ïðîöåäóðà – ýòî åùå îäíî íàçâàíèå ìàêðîñà).

Äîáàâëÿåò íîâûé ìîäóëü â ïðîåêò. Ðåäàêòîð VB äàåò ýòîìó


Module
ìîäóëþ èìÿ â ñîîòâåòñòâèè ñ ïðàâèëàìè, îïèñàííûìè ðàíåå â
(ìîäóëü)
ýòîé ãëàâå.

Äîáàâëÿåò â ïðîåêò class module (ìîäóëü êëàññà). Ìîäóëè êëàññà


Class Module èñïîëüçóþòñÿ äëÿ ñîçäàíèÿ ïîëüçîâàòåëüñêèõ îáúåêòîâ â âàøåì
ïðîåêòå.

Ïîçâîëÿåò âñòàâëÿòü òåêñòîâûé ôàéë, ñîäåðæàùèé èñõîäíûé êîä


File (ôàéë)
VBA, â ìîäóëü.

Ìåíþ Format (Ôîðìàò)


Êîìàíäû ìåíþ Format èñïîëüçóþòñÿ ïðè ñîçäàíèè ïîëüçîâàòåëüñêèõ
äèàëîãîâûõ îêîí è äðóãèõ ôîðì. Êîìàíäû ìåíþ Format ïîçâîëÿþò
âûðàâíèâàòü îáúåêòû â ôîðìå ïî îòíîøåíèþ äðóã ê äðóãó, íàñòðàèâàòü ðàçìåð
ýëåìåíòà óïðàâëåíèÿ â ñîîòâåòñòâèè ñ åãî ñîäåðæèìûì è âûïîëíÿòü ìíîãèå
äðóãèå ïîëåçíûå çàäà÷è. Êîìàíäû ìåíþ Format ïðåäñòàâëåíû çäåñü äëÿ
50 Ãëàâà 2

ïîëíîòû èçëîæåíèÿ ìàòåðèàëà, õîòÿ âû íå áóäåòå èõ ïðèìåíÿòü äî òåõ ïîð,


ïîêà íå íà÷íåòå ñîçäàâàòü ñîáñòâåííûå ïîëüçîâàòåëüñêèå äèàëîãîâûå îêíà. Â
òàáë. 2.5 ïðèâåäåíû êîìàíäû ìåíþ Format è èõ äåéñòâèÿ. Çàìåòüòå, ÷òî ýòè
êîìàíäû íå èìåþò «ãîðÿ÷èõ êëàâèø».
Òàáëèöà 2.5. Êîìàíäû ìåíþ Format

Êîìàíäà Äåéñòâèå

Îòêðûâàåò ïîäìåíþ êîìàíä, êîòîðûå ïîçâîëÿþò âûðàâíèâàòü


âûáðàííûå îáúåêòû â ôîðìå ïî îòíîøåíèþ äðóã ê äðóãó. Çäåñü
Align
ìîæíî âûðàâíèâàòü îáúåêòû ïî âåðõíåé/íèæíåé,
(âûðîâíÿòü)
ïðàâîé/ëåâîé ãðàíèöàì, ïî öåíòðó èëè ñåðåäèíå ñîçäàâàåìîãî
îáúåêòà.

Make Same Size


Îòêðûâàåò ïîäìåíþ êîìàíä, ïîçâîëÿþùèõ èçìåíÿòü ðàçìåð
(âûðîâíÿòü
âûäåëåííûõ îáúåêòîâ äî ðàçìåðà óêàçàííîãî îáúåêòà.
ðàçìåð)

Size to Fit
Îäíîâðåìåííî èçìåíÿåò øèðèíó è âûñîòó îáúåêòà äî
(ïîäîãíàòü
ñîîòâåòñòâèÿ ðàçìåðó åãî ñîäåðæèìîãî.
ðàçìåð)

Size to Grid Îäíîâðåìåííî èçìåíÿåò øèðèíó è âûñîòó îáúåêòà äî


(âûðîâíÿòü áëèæàéøèõ ìåòîê ñåòêè. Ïðè ðàçðàáîòêå ôîðì Ðåäàêòîð VB
ðàçìåð îòîáðàæàåò â ôîðìå ñåòêó, ÷òîáû áûëî ëåã÷å ðàñïîëàãàòü è
ïî ñåòêå) èçìåíÿòü ðàçìåðû îáúåêòîâ â ôîðìå.

Îòêðûâàåò ïîäìåíþ êîìàíä, ïîçâîëÿþùèõ óñòàíàâëèâàòü


Horizontal Spacing ãîðèçîíòàëüíûé èíòåðâàë äëÿ âûáðàííûõ îáúåêòîâ. Çäåñü
(èíòåðâàë ïî ìîæíî óñòàíàâëèâàòü ðàâíîìåðíûé ãîðèçîíòàëüíûé èíòåðâàë,
ãîðèçîíòàëè) óìåíüøàòü èëè óâåëè÷èâàòü åãî èëè óäàëÿòü âñÿêèé
ãîðèçîíòàëüíûé èíòåðâàë ìåæäó îáúåêòàìè.

Îòêðûâàåò ïîäìåíþ êîìàíä, ïîçâîëÿþùèõ óñòàíàâëèâàòü


Vertical Spacing âåðòèêàëüíûé èíòåðâàë äëÿ âûáðàííûõ îáúåêòîâ. Çäåñü ìîæíî
(èíòåðâàë ïî óñòàíàâëèâàòü ðàâíîìåðíûé âåðòèêàëüíûé èíòåðâàë,
âåðòèêàëè) óìåíüøàòü èëè óâåëè÷èâàòü åãî èëè óäàëÿòü âñÿêèé
âåðòèêàëüíûé èíòåðâàë ìåæäó îáúåêòàìè.

Center in Form
Îòêðûâàåò ïîäìåíþ êîìàíä, ïîçâîëÿþùèõ èçìåíÿòü
(ðàçìåñòèòü
ïîëîæåíèå âûáðàííûõ îáúåêòîâ, ÷òîáû îíè áûëè
ïî öåíòðó
öåíòðèðîâàíû â ôîðìå ãîðèçîíòàëüíî èëè âåðòèêàëüíî.
â ôîðìå)

Arrange Buttons Îòêðûâàåò ïîäìåíþ êîìàíä, ïîçâîëÿþùèõ àâòîìàòè÷åñêè


(ðàçìåñòèòü ðàñïîëàãàòü êîìàíäíûå êíîïêè â ôîðìå â ðÿä ñ ðàâíûì
êíîïêè) èíòåðâàëîì ïî íèæíåìó èëè ïðàâîìó êðàþ ôîðìû.

Ñâÿçûâàåò íåñêîëüêî âûáðàííûõ îáúåêòîâ âìåñòå â îäíó


Group ãðóïïó, ÷òîáû âû ìîãëè ïåðåìåùàòü, èçìåíÿòü ðàçìåð,
(ãðóïïèðîâàòü) âûðåçàòü èëè êîïèðîâàòü îáúåêòû, îáðàùàÿñü ñ íèìè, êàê ñ
îäíèì öåëûì.
Ðåäàêòèðîâàíèå ìàêðîñîâ 51

Ungroup Îòìåíÿåò ãðóïïèðîâêó îáúåêòîâ, êîòîðûå ïåðåä ýòèì áûëè


(ðàçäåëèòü) ñâÿçàíû âìåñòå ñ ïîìîùüþ êîìàíäû Group.

Îòêðûâàåò ïîäìåíþ êîìàíä, ïîçâîëÿþùèõ èçìåíÿòü


óïîðÿäî÷åíèå ñâåðõó âíèç (íàçûâàåìîå z-order)
Order
ïåðåêðûâàþùèõñÿ îáúåêòîâ â ôîðìå. Èñïîëüçóéòå êîìàíäó
(ïîðÿäîê)
Order, ÷òîáû îáåñïå÷èòü, íàïðèìåð, ïîÿâëåíèå òåêñòîâîãî îêíà
âñåãäà ïîâåðõ ãðàôè÷åñêîãî îáúåêòà â ôîðìå.

Ìåíþ Debug (Îòëàäêà)


Êîìàíäû ìåíþ Debug èñïîëüçóþòñÿ ïðè âûïîëíåíèè òåñòèðîâàíèÿ èëè îò-
ëàäêè ìàêðîñîâ. (Debugging — òàê íàçûâàåòñÿ ïðîöåññ íàõîæäåíèÿ è èñïðàâ-
ëåíèÿ îøèáîê â ïðîãðàììå.) Â òàáë. 2.6 ïðèâåäåíû êîìàíäû ìåíþ Debug, èõ
«ãîðÿ÷èå êëàâèøè» è âûïîëíÿåìûå äåéñòâèÿ.
Òàáëèöà 2.6. Êîìàíäû ìåíþ Debug

Ãîðÿ÷àÿ
Êîìàíäà Äåéñòâèå
êëàâèøà

Compile <project>
Êîìïèëèðóåò ïðîåêò, âûáðàííûé â äàííûé
(êîìïèëèðîâàòü
ìîìåíò â Project Explorer.
<ïðîåêò>)

Step Into Âûïîëíÿåò èñõîäíûé êîä âàøåãî ìàêðîñà ïî


F8
(øàã ñ çàõîäîì) îäíîìó îïåðàòîðó êàæäûé ðàç.

Ïîäîáíî êîìàíäå Step Into êîìàíäà Step Over


Step Over
Shift+F8 ïîçâîëÿåò âûïîëíÿòü âñå èíñòðóêöèè â ìàêðîñå
(øàã ñ îáõîäîì)
áåç ïàóçû íà êàæäîé îòäåëüíîé èíñòðóêöèè.

Step Out Ctrl+Shi Âûïîëíÿåò âñå îñòàþùèåñÿ îïåðàòîðû â ìàêðîñå


(øàã ñ âûõîäîì) ft+F8 áåç ïàóçû íà êàæäîì îòäåëüíîì îïåðàòîðå.

Run to Cursor Âûïîëíÿåò îïåðàòîðû èñõîäíîãî êîäà ìàêðîñà îò


(âûïîëíèòü äî Ctrl+F8 îïåðàòîðà, âûïîëíÿþùåãîñÿ â äàííûé ìîìåíò, äî
òåêóùåé ïîçèöèè) òåêóùåé ïîçèöèè êóðñîðà.

Add Watch
Ïîçâîëÿåò óêàçûâàòü ïåðåìåííûå èëè
(äîáàâèòü
âûðàæåíèÿ, çíà÷åíèÿ êîòîðûõ ìîæíî íàáëþäàòü
êîíòðîëüíîå
âî âðåìÿ âûïîëíåíèÿ èñõîäíîãî êîäà VBA.
çíà÷åíèå)

Edit Watch Ïîçâîëÿåò ðåäàêòèðîâàòü ñïåöèôèêàöèè äëÿ


(èçìåíèòü íàáëþäàåìûõ ïåðåìåííûõ è âûðàæåíèé, êîòîðûå
Ctrl+W
êîíòðîëüíîå áûëè ñîçäàíû ðàíåå ñ ïîìîùüþ êîìàíäû Add
çíà÷åíèå) Watch.

Quick Watch
Îòîáðàæàåò òåêóùåå çíà÷åíèå âûáðàííîãî
(êîíòðîëüíîå Shift+F9
âûðàæåíèÿ.
çíà÷åíèå)
52 Ãëàâà 2

Îòìå÷àåò ìåñòî (èëè îòìåíÿåò îòìåòêó) â


Toggle Breakpoint
F9 èñõîäíîì êîäå VBA, ãäå âû õîòèòå îñòàíîâèòü
(òî÷êà îñòàíîâà)
âûïîëíåíèå ìàêðîñà.

Clear All Breakpoints


Ctrl+Shi
(ñíÿòü âñå òî÷êè Óäàëÿåò âñå òî÷êè îñòàíîâà â ìîäóëå.
ft+F9
îñòàíîâà)

Set Next Statement Ïîçâîëÿåò ìåíÿòü îáû÷íîå âûïîëíåíèå êîäà


(çàäàòü ñëåäóþùóþ Ctrl+F9 ïóòåì óêàçàíèÿ âðó÷íóþ ñëåäóþùåé ñòðîêè
èíñòðóêöèþ) èñõîäíîãî êîäà, êîòîðàÿ äîëæíà âûïîëíÿòüñÿ.

Show Next Statement


(ïîêàçàòü Ïðèâîäèò ê ïîäñâåòêå Ðåäàêòîðîì VB ñëåäóþùåé
ñëåäóþùóþ ñòðîêè êîäà, êîòîðàÿ áóäåò âûïîëíÿòüñÿ.
èíñòðóêöèþ)

Êîìàíäû ìåíþ Debug ïîçâîëÿþò íåïîñðåäñòâåííî êîíòðîëèðîâàòü âûïîëíå-


íèå ìàêðîñà, îñòàíàâëèâàòü è çàïóñêàòü ìàêðîñ â çàäàííûõ òî÷êàõ è îòñëåæè-
âàòü âûïîëíåíèå ìàêðîñà ïî øàãàì.

Ìåíþ Run (Çàïóñê)


Êîìàíäû ìåíþ Run ïîçâîëÿþò íà÷àòü âûïîëíåíèå ìàêðîñà, ïðåðûâàòü èëè
âîçîáíîâëÿòü åãî âûïîëíåíèå èëè âîçâðàùàòü ïðåðâàííûé ìàêðîñ â ñîñòîÿíèå
äî âûïîëíåíèÿ.
Òàáëèöà 2.7. Êîìàíäû ìåíþ Run

Ãîðÿ÷àÿ
Êîìàíäà Äåéñòâèå
êëàâèøà

Ïðèâîäèò ê òîìó, ÷òî VBA çàïóñêàåò ìàêðîñ,


Run Sub/User Form êîòîðûé ðåäàêòèðóåòñÿ â äàííûé ìîìåíò, òî
(çàïóñê åñòü, VBA çàïóñêàåò ìàêðîñ, íà òåêñòå
F5
ïîäïðîãðàììû/Us êîòîðîãî íàõîäèòñÿ êóðñîð âñòàâêè. Åñëè
er Form) êàêàÿ-ëèáî ôîðìà àêòèâíà, VBA çàïóñêàåò ýòó
ôîðìó.

Ïðåðûâàåò âûïîëíåíèå âàøåãî êîäà VBA è


ïðèâîäèò ê òîìó, ÷òî Ðåäàêòîð VB ïåðåõîäèò â
Break (ïðåðâàòü) Ctrl+Break
ðåæèì ïðåðûâàíèÿ (Break mode). (Break mode
èñïîëüçóåòñÿ ïðè îòëàäêå êîäà VBA.)

Óñòàíàâëèâàåò âñå ïåðåìåííûå ìîäóëüíîãî


Reset <project>
óðîâíÿ è Call Stack (ñïèñîê ïîñëåäîâàòåëüíîñòè
(ñáðîñ)
âûçîâîâ) â èñõîäíîå ñîñòîÿíèå.

Âêëþ÷àåò è âûêëþ÷àåò Design mode (ðåæèì


ïðîåêòèðîâàíèÿ èëè ðàçðàáîòêè) äëÿ ïðîåêòà.
Design Mode
 ýòîì ðåæèìå íèêàêîé êîä â âàøåì ïðîåêòå
(êîíñòðóêòîð)
íå âûïîëíÿåòñÿ, è ñîáûòèÿ îò ýëåìåíòîâ
óïðàâëåíèÿ íå îáðàáàòûâàþòñÿ.
Ðåäàêòèðîâàíèå ìàêðîñîâ 53

Ìåíþ Tools (Cåðâèñ)


Êîìàíäû ìåíþ Tools íå òîëüêî ïîçâîëÿþò âûáðàòü ìàêðîñ äëÿ âûïîëíåíèÿ,
íî è ïîëó÷èòü äîñòóï ê âíåøíèì áèáëèîòåêàì ìàêðîñîâ è äîïîëíèòåëüíûì
ýëåìåíòàì óïðàâëåíèÿ ôîðì (êðîìå âñòðîåííûõ â VBA). Êîìàíäû ìåíþ Tools
îáåñïå÷èâàþò òàêæå äîñòóï ê äèàëîãîâîìó îêíó Options (ïàðàìåòðû) Ðåäàêòîðà
VB è ñâîéñòâàì ïðîåêòà VBA òåêóùåãî âûáîðà â Project Explorer. Â òàáë. 2.8 ïðè-
âåäåíû êîìàíäû ìåíþ Tools è èõ äåéñòâèÿ. Êîìàíäû ìåíþ Tools íå èìåþò «ãî-
ðÿ÷èõ êëàâèø».
Òàáëèöà 2.8. Êîìàíäû ìåíþ Tools

Êîìàíäà Äåéñòâèå

Îòîáðàæàåò äèàëîãîâîå îêíî References, ïîçâîëÿþùåå


óñòàíàâëèâàòü ññûëêè íà áèáëèîòåêè îáúåêòîâ, áèáëèîòåêè
References
òèïîâ èëè äðóãîé ïðîåêò VBA. Ïîñëå óñòàíîâëåíèÿ ññûëêè
(ññûëêè)
îáúåêòû, ìåòîäû, ñâîéñòâà, ïðîöåäóðû è ôóíêöèè â ýòîé
ññûëêå ïîÿâëÿþòñÿ â äèàëîãîâîì îêíå Object Browser.

Îòîáðàæàåò äèàëîãîâîå îêíî Additional Controls, ïîçâîëÿþùåå


íàñòðàèâàòü Toolbox (ïàíåëü ýëåìåíòîâ) òàê, ÷òîáû âû ìîãëè
Additional Controls
äîáàâëÿòü ýëåìåíòû óïðàâëåíèÿ â ôîðìû ïîìèìî âñòðîåííûõ
(äîïîëíèòåëüíûå
â VBA. Äèàëîãîâîå îêíî Additional Controls ïðåäíàçíà÷åíî
ýëåìåíòû)
äëÿ äîáàâëåíèÿ ê ïàíåëè ýëåìåíòîâ êíîïîê, êîòîðûå
ïîçâîëÿþò äîáàâëÿòü ê ôîðìå îáúåêòû.

Îòîáðàæàåò äèàëîãîâîå îêíî Macros, ïîçâîëÿþùåå ñîçäàâàòü,


Macros (ìàêðîñû)
ðåäàêòèðîâàòü, âûïîëíÿòü èëè óäàëÿòü ìàêðîñû.

Îòîáðàæàåò äèàëîãîâîå îêíî Options, ïîçâîëÿþùåå âûáèðàòü


Options ðàçëè÷íûå îïöèè äëÿ Ðåäàêòîðà VB, òàêèå êàê ÷èñëî
(ïàðàìåòðû) ïðîáåëîâ â èíòåðâàëå òàáóëÿöèè (tab stop), êîãäà VBA
ïðîâåðÿåò ñèíòàêñèñ âàøèõ îïåðàòîðîâ, è òàê äàëåå.

Îòîáðàæàåò äèàëîãîâîå îêíî Project Properties, ïîçâîëÿþùåå


óñòàíàâëèâàòü ðàçëè÷íûå ñâîéñòâà âàøåãî ïðîåêòà VBA,
<project> Properties òàêèå êàê èìÿ ïðîåêòà, îïèñàíèå è ôàéë êîíòåêñòíîé
(ñâîéñòâà ïðîåêòà) ñïðàâêè. Ýòî äèàëîãîâîå îêíî ïîçâîëÿåò òàêæå çàùèùàòü
ïðîåêò, ÷òîáû íèêòî íå ìîã åãî ðåäàêòèðîâàòü áåç óêàçàíèÿ
ïàðîëÿ.

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) è äðóãóþ òåõíè÷åñêóþ èíôîðìàöèþ.

Ïàíåëè èíñòðóìåíòîâ Ðåäàêòîðà VB


Äëÿ ìíîãèõ ïîëüçîâàòåëåé âûáðàòü êîìàíäíóþ êíîïêó ñ ïîìîùüþ ìûøè
ëåã÷å, ÷åì âûáðàòü êîìàíäó â ìåíþ. Ïîýòîìó Ðåäàêòîð VB ïðåäîñòàâëÿåò
âàæíåéøèå è íàèáîëåå ÷àñòî èñïîëüçóåìûå êîìàíäû â âèäå êíîïîê íà ïàíåëè
èíñòðóìåíòîâ. Åñëè âû ÷àñòî ðàáîòàåòå ñ Ðåäàêòîðîì VB, ìîæåòå çàìåòèòü,
÷òî èñïîëüçîâàíèå êîìàíäíûõ êíîïîê íà ðàçëè÷íûõ ïàíåëÿõ Ðåäàêòîðà VB
óñêîðÿåò âàøó ðàáîòó.
Ïî óìîë÷àíèþ Ðåäàêòîð VB îòîáðàæàåò òîëüêî ïàíåëü èíñòðóìåíòîâ Stan-
dard, ïîêàçàííóþ íà ðèñ. 2.4.
Êàê âèäíî èç ðèñ. 2.4, â êîíöå ïàíåëè Standard, ñïðàâà, íàõîäèòñÿ êíîïêà
(ñî ñòðåëêîé) More Buttons. Åñëè âû õîòèòå óäàëèòü ñ ïàíåëè èëè äîáàâèòü
íåêîòîðûå êíîïêè íà ïàíåëü Standard, íàæìèòå íà ýòó êíîïêó, à çàòåì óêàæèòå
ñîîòâåòñòâóþùóþ êíîïêó â ïîÿâëÿþùåìñÿ ìåíþ (ðèñ. 2.5).
Êðîìå ïàíåëè Standard Ðåäàêòîð VB èìååò åùå òðè ïàíåëè: Edit (ïðàâêà), De-
bug (îòëàäêà) è UseForm.
Ïàíåëü Edit Ðåäàêòîðà VB ñîäåðæèò íåñêîëüêî êîìàíäíûõ êíîïîê,
ïîëåçíûõ ïðè ðåäàêòèðîâàíèè òåêñòà â Code Window (îêíå êîäà). Ýòà ïàíåëü
ïðåäëàãàåò äàæå ïàðó êîìàíä, êîòîðûõ íåò íà ïàíåëè Standard. Ïàíåëè Standard
è Edit îïèñûâàþòñÿ äàëåå â ýòîì ðàçäåëå.
Âû ìîæåòå óïðàâëÿòü òåì, êàêèå ïàíåëè èíñòðóìåíòîâ îòîáðàæàåò
Ðåäàêòîð VB, ñ ïîìîùüþ êîìàíäû View | Toolbars (âèä | ïàíåëè èíñòðóìåíòîâ).
Ïîñêîëüêó Ðåäàêòîð VB ïî óìîë÷àíèþ íå îòîáðàæàåò ïàíåëü Edit, âàì íóæíî
áóäåò âûâîäèòü åå íà ýêðàí âðó÷íóþ.
Ðåäàêòèðîâàíèå ìàêðîñîâ 55

Ðèñ. 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, à çàòåì — äîïîëíèòåëüíûå êîìàíäû,
íàõîäÿùèåñÿ íà ïàíåëè Edit.

Ïàíåëü Standard

Ðèñ. 2.5
Êíîïêà More ïàíåëè Standard ïîçâîëÿåò èçìåíÿòü ñîäåðæèìîå ýòîé ïàíåëè

Èòàê, íàèáîëåå ÷àñòî èñïîëüçóåìàÿ ðàçðàáîò÷èêàìè ïðèëîæåíèé ïðè ðàáî-


òå ñ Ðåäàêòîðîì VB ïàíåëü èíñòðóìåíòîâ Standard ñîäåðæèò 19 êíîïîê. Êàæäàÿ
êíîïêà ÿâëÿåòñÿ «áûñòðîé» êîìàíäîé ìåíþ, äåéñòâèå êîòîðîé ïðèâåäåíî â
òàáëèöå 2.9. Ïðè ðàññìîòðåíèè òàáëèöû 2.9 îáðàùàéòåñü ê ðèñ. 2.4 äëÿ ñîïîñ-
56 Ãëàâà 2

òàâëåíèÿ èìåíè êàæäîé êîìàíäíîé êíîïêè ñî çíà÷êîì íà ïåðåäíåé ñòîðîíå


êíîïêè.
Òàáëèöà 2.9. Êíîïêè ïàíåëè Standard

Íàèìåíîâàíèå
Íàçíà÷åíèå
êíîïêè

View <host Ïåðåêëþ÷àåò íà host-ïðèëîæåíèå VBA, èç êîòîðîãî âû


application> çàïóñòèëè Ðåäàêòîð VB. Çíà÷îê ýòîé êíîïêè èçìåíÿåòñÿ â
(âèä çàâèñèìîñòè îò êîíêðåòíîãî ïðèëîæåíèÿ, èç êîòîðîãî âû
<host-ïðèëîæåíèå>) çàïóñêàëè ðåäàêòîð VB.

Ùåëêíèòå íà êíîïêå ñî ñòðåëêîé âíèç ñïðàâà îò ýòîé


êíîïêè, ÷òîáû îòîáðàçèòü ñïèñîê îáúåêòîâ, êîòîðûå âû
Insert UserForm
ìîæåòå âñòàâèòü â òåêóùèé ïðîåêò: UserForm, Module,
(âñòàâèòü UserForm)
Class Module èëè Procedure. Ýòî ìîæíî âûïîëíèòü è ïðè
èñïîëüçîâàíèè îäíîèìåííûõ êîìàíä ìåíþ Insert (âñòàâêà).

Save
Ñîõðàíÿåò òåêóùèé ïðîåêò òàê æå, êàê File | Save.
(ñîõðàíèòü)

Cut Âûðåçàåò âûäåëåííûé òåêñò èëè îáúåêò è ïîìåùàåò åãî â


(âûðåçàòü) Clipboard; òàê æå, êàê êîìàíäà Edit | Cut

Copy Êîïèðóåò âûäåëåííûé òåêñò èëè îáúåêò â Clipboard; òàê


(êîïèðîâàòü) æå, êàê êîìàíäà Edit | Copy (ïðàâêà | êîïèðîâàòü).

Âñòàâëÿåò òåêñò èëè îáúåêò èç Clipboard â Code Window


Paste
èëè ôîðìó ïîëüçîâàòåëÿ â ïîçèöèþ êóðñîðà òàê æå, êàê
(âñòàâèòü)
êîìàíäà Edit | Paste (ïðàâêà | âñòàâèòü).

Îòêðûâàåò äèàëîãîâîå îêíî Find äëÿ íàõîæäåíèÿ


Find
îïðåäåëåííîãî ñëîâà èëè ôðàçû â ìîäóëå; òàê æå, êàê
(íàéòè)
êîìàíäà Edit | Find (ïðàâêà | íàéòè).

Îòìåíÿåò ñàìóþ ïîñëåäíþþ êîìàíäó, åñëè ýòî âîçìîæíî


Undo
(íå âñå äåéñòâèÿ ìîãóò áûòü îòìåíåíû); òàê æå, êàê
(îòìåíèòü
êîìàíäà Edit | Undo (ïðàâêà | îòìåíèòü íàáîð).

Redo Âîçîáíîâëÿåò ñàìóþ ïîñëåäíþþ îòìåíåííóþ êîìàíäó; òàê


(âåðíóòü íàáîð) æå, êàê êîìàíäà Edit | Redo.

Run Macro
(çàïóñê Çàïóñêàåò òåêóùóþ ïðîöåäóðó èëè ôîðìó òàê æå, êàê
ïîäïðîãðàììû/ êîìàíäà Run | Sub/UserForm.
UserForm)

Break Ïðåðûâàåò âûïîëíåíèå êîäà VBA; òàê æå, êàê êîìàíäà


(ïðåðâàòü) Run | Break (çàïóñê | ïðåðâàòü).

Reset Ïåðåçàïóñêàåò êîä VBA, êàê êîìàíäà Run | Reset (çàïóñê |


(ñáðîñ) ñáðîñ).
Ðåäàêòèðîâàíèå ìàêðîñîâ 57

Ïðè íàæàòèè ýòîé êíîïêè Ðåäàêòîð VB ïåðåõîäèò â


Design Mode
ðåæèì Design (êîíñòðóêòîðà) òàê æå, êàê êîìàíäîé Run |
(êîíñòðóêòîð)
Design Mode (çàïóñê | êîíñòðóêòîð).

Project Explorer Îòîáðàæàåò Îêíî ïðîåêòà (Project Explorer) òàê æå, êàê
(îêíî ïðîåêòà) êîìàíäà View | Project Explorer (âèä | îêíî ïðîåêòà).

Properties Window Îòîáðàæàåò Properties Window (îêíî ñâîéñòâ) òàê æå, êàê
(îêíî ñâîéñòâ) êîìàíäà View | Properties Window (âèä | îêíî ñâîéñòâ).

Object Browser Îòîáðàæàåò äèàëîãîâîå îêíî Object Browser (ïðîñìîòð


(ïðîñìîòð îáúåêòîâ) òàê æå, êàê êîìàíäà View | Object Browser (âèä |
îáúåêòîâ) ïðîñìîòð îáúåêòîâ).

Toolbox
Îòîáðàæàåò Toolbox (ïàíåëü ýëåìåíòîâ) òàê æå, êàê
(ïàíåëü
êîìàíäà View | Toolbox (âèä | ïàíåëè ýëåìåíòîâ).
ýëåìåíòîâ)

Ñïðàâêà: Microsoft Îòîáðàæàåò îêíî Ñïðàâî÷íîé ñèñòåìû Microsoft Office äëÿ


Visual Basic êîíòåêñòíî-çàâèñèìîé ïîäñêàçêè ïî òåêóùåé çàäà÷å.

Ýòà îáëàñòü ïàíåëè èíñòðóìåíòîâ Standard ôàêòè÷åñêè íå


ÿâëÿåòñÿ êîìàíäíîé êíîïêîé è ïîÿâëÿåòñÿ òîëüêî òîãäà,
Cursor position
êîãäà êóðñîð íàõîäèòñÿ â Code Window. Ýòà îáëàñòü
(ïîëîæåíèå êóðñîðà)
ïîêàçûâàåò, â êàêîé ñòðîêå ìîäóëÿ, è â êàêîì ñòîëáöå
ñòðîêè íàõîäèòñÿ êóðñîð âñòàâêè.

More Buttons Ïîçâîëÿåò äîáàâèòü èëè óäàëèòü êíîïêè ïàíåëè.

Ïàíåëü èíñòðóìåíòîâ Edit (ïðàâêà)


Ïî ìåðå òîãî êàê âû óçíàåòå î íàïèñàíèè êîäà VBA è âñå áîëüøå ðàáîòàåòå â
îêíå Code Window (ïðîãðàììà), âû ìîæåòå çàìåòèòü, ÷òî èñïîëüçîâàíèå ïàíåëè
Edit ñ öåëüþ ïîëó÷åíèÿ «ãîðÿ÷èõ êëàâèø» äëÿ ðàçëè÷íûõ êîìàíä ðåäàêòèðî-
âàíèÿ ýêîíîìèò âàøå âðåìÿ è óñèëèÿ. Ðåäàêòîð VB íå îòîáðàæàåò àâòîìàòè÷å-
ñêè ïàíåëü Edit, åñëè òîëüêî âû ñíà÷àëà íå âûâåëè ýòó ïàíåëü íà ýêðàí, âûïîë-
íèâ äâà øàãà, óêàçàííûå â íà÷àëå ýòîãî ðàçäåëà.  òàáë. 2.10 ïðèâåäåíû êî-
ìàíäíûå êíîïêè ïî óìîë÷àíèþ íà ïàíåëè èíñòðóìåíòîâ Edit è îïèñûâàåòñÿ
äåéñòâèå êàæäîé êíîïêè.
Òàáëèöà 2.10. Êîìàíäû ïàíåëè èíñòðóìåíòîâ Edit

Íàèìåíîâàíèå
Íàçíà÷åíèå
êíîïêè

Îòîáðàæàåò ðàñêðûâàþùèéñÿ ñïèñîê ñâîéñòâ è ìåòîäîâ,


List Properties/Methods
ïðèíàäëåæàùèõ îáúåêòó, êîòîðûé âû òîëüêî ÷òî ââåëè;
(ñïèñîê
òàê æå, êàê Edit | List Properties/Methods (ïðàâêà | ñïèñîê
ñâîéñòâ/ìåòîäîâ)
ñâîéñòâ/ìåòîäîâ).

Îòîáðàæàåò ðàñêðûâàþùèéñÿ ñïèñîê ïðåäîïðåäåëåííûõ


List Constants
êîíñòàíò; òàê æå, êàê Edit | List Constants (ïðàâêà | ñïèñîê
(ñïèñîê êîíñòàíò)
êîíñòàíò).
58 Ãëàâà 2

Îòîáðàæàåò âñïëûâàþùåå îêíî, ïîêàçûâàþùåå


Quick Info
ïðàâèëüíûé ñèíòàêñèñ äëÿ îáúåêòíîãî ìåòîäà; òàê æå, êàê
(ñâåäåíèÿ)
Edit | Quick Info (ïðàâêà | ñâåäåíèÿ).

Îòîáðàæàåò âñïëûâàþùåå îêíî, ïîêàçûâàþùåå ïàðàìåòðû


Parameter Info (íàçûâàåìûå òàêæå àðãóìåíòàìè [arguments]) ôóíêöèè
(ïàðàìåòðû) èëè îïåðàòîðà VBA; òàê æå, êàê Edit | Parameter Info
(ïðàâêà | ïàðàìåòðû).

Çàâåðøàåò òåêóùåå êëþ÷åâîå ñëîâî VBA, êàê òîëüêî âû


Complete Word ââåäåòå äîñòàòî÷íî ñèìâîëîâ, ÷òîáû VBA èäåíòèôèöèðîâàë
(çàâåðøèòü ñëîâî) ñëîâî, êîòîðîå âû ââîäèòå; òàê æå, êàê Edit | Complete
Word (ïðàâêà | çàâåðøèòü ñëîâî).

Ñäâèãàåò âûäåëåííûé òåêñò âïðàâî íà îäíó ïîçèöèþ


Indent
òàáóëÿöèè; òàê æå, êàê Edit | Indent (ïðàâêà | óâåëè÷èòü
(óâåëè÷èòü îòñòóï)
îòñòóï).

Ñäâèãàåò âûáðàííûé òåêñò âëåâî íà îäíó ïîçèöèþ


Outdent
òàáóëÿöèè; òàê æå, êàê Edit | Outdent (ïðàâêà | óìåíüøèòü
(óìåíüøèòü îòñòóï)
îòñòóï).

Óñòàíàâëèâàåò èëè îòìåíÿåò òî÷êó ïðåðûâàíèÿ â èñõîäíîì


Toggle Breakpoint
êîäå VBA; òàê æå, êàê Debug | Toggle Breakpoint (îòëàäêà |
(òî÷êà îñòàíîâà)
òî÷êà îñòàíîâà).

Ïðåâðàùàåò âûäåëåííûé áëîê òåêñòà â Code Window â


Comment Block
êîììåíòàðèè, äîáàâëÿÿ ñèìâîë êîììåíòàðèÿ â íà÷àëî
(çàêîììåíòèðîâàòü
êàæäîé âûäåëåííîé ñòðîêè. Ýêâèâàëåíòíîé êîìàíäû ìåíþ
áëîê)
íå èìååòñÿ.

Uncomment Block
Óäàëÿåò ñèìâîë êîììåíòàðèÿ èç áëîêà âûäåëåííîãî òåêñòà
(ðàñêîììåíòèðîâàòü
â Code Window. Ýêâèâàëåíòíîé êîìàíäû ìåíþ íåò.
áëîê)

Óñòàíàâëèâàåò èëè îòìåíÿåò çàêëàäêó â âàøåì èñõîäíîì


Toggle Bookmark
êîäå VBA; òàê æå, êàê Edit | Bookmarks | Toggle Bookmark
(çàêëàäêà)
(ïðàâêà | çàêëàäêè | çàêëàäêà).

Next Bookmark Ïåðåìåùàåò êóðñîð âñòàâêè â Code Window ê ñëåäóþùåé


(ñëåäóþùàÿ çàêëàäêå; òàê æå, êàê Edit | Bookmarks | Next Bookmark
çàêëàäêà) (ïðàâêà | çàêëàäêè | ñëåäóþùàÿ çàêëàäêà).

Previous Bookmark Ïåðåìåùàåò êóðñîð âñòàâêè â Code Window ê ïðåäûäóùåé


(ïðåäûäóùàÿ çàêëàäêå; òàê æå, êàê Edit | Bookmarks | Previous Bookmark
çàêëàäêà) (ïðàâêà | çàêëàäêè | ïðåäûäóùàÿ çàêëàäêà).

Óäàëÿåò âñå çàêëàäêè â ìîäóëå; òàê æå, êàê Edit |


Clear All Bookmarks
Bookmarks | Clear All Bookmarks (ïðàâêà | çàêëàäêè | ñíÿòü
(ñíÿòü âñå çàêëàäêè)
âñå çàêëàäêè).
Ðåäàêòèðîâàíèå ìàêðîñîâ 59

Ðåäàêòèðîâàíèå ìàêðîñîâ
Ïîñëå òîãî êàê âû íåìíîãî îçíàêîìèëèñü ñî ñðåäîé Ðåäàêòîðà 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

4. Äâàæäû ùåëêíèòå íà ìîäóëå, êîòîðûé âàì íåîáõîäèì. Ðåäàêòîð VB îòî-


áðàæàåò ýòîò ìîäóëü â Code Window (îêíî ïðîãðàììû).
Ïîñëå òîãî êàê âû îòîáðàçèòå ìîäóëü, ìîæåòå èñïîëüçîâàòü ñïèñîê Procedure
(ïðîöåäóðà) â Code Window äëÿ ïîëó÷åíèÿ îïðåäåëåííîãî ìàêðîñà â ýòîì ìîäó-
ëå. Âû ìîæåòå òàêæå èñïîëüçîâàòü ìåòîä, îïèñàííûé â ñëåäóþùåì ðàçäåëå,
äëÿ íàõîæäåíèÿ ìàêðîñà áåç ïðåäâàðèòåëüíîãî îòêðûòèÿ ìîäóëÿ, ñîäåðæàùå-
ãî ýòîò ìàêðîñ.

Êàê íàéòè çàïèñàííûé ìàêðîñ


Ïîñêîëüêó Word âñåãäà ñîõðàíÿåò çàïèñàííûå ìàêðîñû â ìîäóëå
NewMacros äîêóìåíòà èëè øàáëîííîãî ôàéëà, íàéòè èñõîäíûé êîä ìàêðîñà â
Word ïðîñòî. Íàéòè èñõîäíûé êîä ìàêðîñà â Excel ìîæåò áûòü íåìíîãî ñëîæ-
íåå. Êîãäà âû çàïèñûâàëè ìàêðîñ FormatArialBold12 â Excel 2003 âî âðåìÿ
èçó÷åíèÿ ïåðâîé ãëàâû, âû ñîõðàíèëè åãî â ðàáî÷åé êíèãå Personal.xlsb. Åñëè
ýòî áûë ïåðâûé ìàêðîñ, êàêîé âû êîãäà-ëèáî çàïèñàëè è ñîõðàíèëè â
Personal.xlsb, Excel ñîõðàíèë ìàêðîñ FormatArialBold12 â ìîäóëüíîì ëèñòå ñ
èìåíåì Module1. Åñëè áû âû çàòåì çàïèñàëè äðóãîé ìàêðîñ â òîì æå ñàìîì ñå-
àíñå ðàáîòû, Excel òàêæå ñîõðàíèë áû åãî â òîì æå ñàìîì ìîäóëå (Module1).
Åñëè âû âûõîäèëè èç Excel ìåæäó âðåìåíåì çàïèñè âàìè ìàêðîñà
FormatArialBold12 è âðåìåíåì çàïèñè äðóãîãî ìàêðîñà, Excel ñîõðàíèë ïî-
ñëåäíèé ìàêðîñ â äðóãîì ìîäóëå (ñêîðåå âñåãî, â Module2).

Èñïîëüçîâàíèå èíñòðóìåíòà Object Browser


Âìåñòî ïîèñêà ïî âñåìó òåêñòó âî âñåõ ìîäóëÿõ îïðåäåëåííîãî ìàêðîñà âû
ìîæåòå èñïîëüçîâàòü èíñòðóìåíò, íàçûâàåìûé Object Browser, ÷òîáû íàéòè ýòîò
ìàêðîñ, âûâåñòè íà ýêðàí èëè ðåäàêòèðîâàòü, íåçàâèñèìî îò òîãî, ãäå îí íàõî-
äèòñÿ — â Word, Excel èëè äðóãèõ ïðèëîæåíèÿõ.
Äëÿ èñïîëüçîâàíèÿ èíñòðóìåíòà Object Browser â Excel âûïîëíÿéòå ñëåäóþ-
ùèå øàãè:
1. Íàæìèòå Alt+F11, ÷òîáû îòêðûòü Ðåäàêòîð VB.
2. Âûáåðèòå View | Project Explorer (âèä | îêíî ïðîåêòà) äëÿ îòîáðàæåíèÿ Project
Explorer (ðèñ. 2.7).

Ðèñ. 2.7
Âûäåëèòå ïðîåêò â Project Explorer ïåðåä ïîèñêîì ìàêðîñà â
îêíå Object Browser

3. Â Project Explorer âûäåëèòå ïðîåêò VBA, â êîòîðîì âàì íåîáõîäèìî íàéòè


ìàêðîñ. Íàïðèìåð, íà ðèñ. 2.7 ïîêàçàíà êíèãà Personal.xlsb, âûäåëåííàÿ â
Project Explorer.
Ðåäàêòèðîâàíèå ìàêðîñîâ 61

4. Âûáåðèòå êîìàíäó View | Object Browser (âèä | ïðîñìîòð îáúåêòîâ). Ðåäàêòîð VB


îòîáðàçèò äèàëîãîâîå îêíî Object Browser, ïîêàçàííîå íà ðèñ. 2.8.
Ðèñ. 2.8
Èñïîëüçóéòå
Object Browser
äëÿ ïîèñêà
ìàêðîñîâ

5. Óáåäèòåñü, ÷òî â ðàñêðûâàþùåìñÿ ñïèñêå Project/Library (ïðîåêò/ áèáëèîòåêà)


âûäåëåí ýëåìåíò <All Libraries> (<âñå áèáëèîòåêè>). Îêíî Object Browser îòîáðà-
æàåò âñå èìåþùèåñÿ ìîäóëè è îáúåêòû â ñïèñêå Classes (Êëàññû).
6. Ââåäèòå èìÿ ìàêðîñà, êîòîðûé âàì íåîáõîäèìî íàéòè, â òåêñòîâîì îêíå
Search (ïîèñê). Íàïðèìåð, ÷òîáû íàéòè èñõîäíûé êîä äëÿ ìàêðîñà
FormatArialBold12 â Excel, ââåäèòå FormatArialBold12 â ïîëå Search Text (îáðà-
çåö ïîèñêà).
7. Ùåëêíèòå íà êíîïêå Search (ïîèñê) â îêíå Object Browser (ðèñ. 2.8). Object
Browser âûïîëíÿåò ïîèñê òåêñòà, êîòîðûé âû ââåëè â îêíî Search Text, â âàøåì
ïðîåêòå VBA (à òàêæå â äðóãèõ îòêðûòûõ â äàííûé ìîìåíò áèáëèîòåêàõ). Ïî-
ñëå âûïîëíåíèÿ ïîèñêà ìåíÿåòñÿ âèä îêíà Object Browser: îíî îòîáðàæàåò ñïè-
ñîê Search Results, ïîêàçàííûé íà ðèñ. 2.9. Åñëè Object Browser îáíàðóæèë ìàê-
ðîñû, ñîâïàäàþùèå ñ òåêñòîì â îêíå Search Text (îáðàçåö ïîèñêà), îíè îòîáðà-
æàþòñÿ â ñïèñêå Search Results (ðåçóëüòàòû ïîèñêà).  ïðîòèâíîì ñëó÷àå â ýòîì
ñïèñêå îòîáðàæàåòñÿ ñîîáùåíèå No items found (ýëåìåíòû íå íàéäåíû).
8. Ùåëêíèòå íà ìàêðîñå â ñïèñêå Search Results, çàòåì — íà êíîïêå View
Definition (îïèñàíèÿ) â îêíå Object Browser (ðèñ. 2.9). Ðåäàêòîð VB îòêðûâàåò
Code Window (ïðîãðàììû) äëÿ ìîäóëÿ, ñîäåðæàùåãî ýòîò ìàêðîñ, è îòîáðàæàåò
èñõîäíûé êîä ìàêðîñà (ðèñ. 2.10).

Ïðîñìîòð ìîäóëåé ïðîåêòà ñ ïîìîùüþ Object Browser


Åñëè âàø ïðîåêò íå ñîäåðæèò áîëüøîãî êîëè÷åñòâà ðàçëè÷íûõ ìîäóëåé, òî
ëåã÷å íàõîäèòü ìàêðîñ, âûïîëíÿÿ ñëåäóþùóþ àëüòåðíàòèâíóþ ïðîöåäóðó:
1. Íàæìèòå Alt+F11, ÷òîáû îòêðûòü Ðåäàêòîð VB.
2. Âûáåðèòå View | Project Explorer (âèä | îêíî ïðîåêòà), ÷òîáû îòîáðàçèòü Project
Explorer.
3. Â Project Explorer âûäåëèòå ïðîåêò VBA, â êîòîðîì âàì íåîáõîäèìî íàéòè
ìàêðîñ.
62 Ãëàâà 2

Ðèñ. 2.9
Îêíî Object
Browser ïîñëå
âûïîëíåíèÿ
ïîèñêà ìàêðîñà

Ðèñ. 2.10
Êîä íàéäåííîãî
ìàêðîñà â Code
Window

4. Âûáåðèòå êîìàíäó View | Object Browser (âèä | ïðîñìîòð îáúåêòîâ). Ðåäàêòîð


VB îòîáðàæàåò äèàëîãîâîå îêíî Object Browser.
5. Âûäåëèòå èìÿ âàøåãî ïðîåêòà â ðàñêðûâàþùåìñÿ ñïèñêå îêíà Object
Browser. Åñëè òîëüêî âû íå èçìåíèëè èìåíè âàøåãî ïðîåêòà, îí íàçûâàåòñÿ
VBAProject â Excel (Project — â Word).
6. Âûäåëèòå ìîäóëü â ñïèñêå Classes (Êëàññû). Îêíî Object Browser îòîáðàæàåò
òåïåðü âñå ìàêðîñû â âûäåëåííîì ìîäóëå â ñïèñêå Members of <object> (êîìïî-
íåíò <îáúåêò>). (Òî÷íûé çàãîëîâîê ýòîãî ñïèñêà èçìåíÿåòñÿ â çàâèñèìîñòè îò
îáúåêòà, âûäåëåííîãî â ñïèñêå Classes.)
7. Âûäåëèòå ìàêðîñ, èñõîäíûé êîä êîòîðîãî âàì íåîáõîäèìî óâèäåòü, â ñïèñêå
Members of <object>.
Ðåäàêòèðîâàíèå ìàêðîñîâ 63

8. Ùåëêíèòå íà êíîïêå View Definition (îïèñàíèÿ) â îêíå Object Browser. Ðåäàêòîð


VB îòêðûâàåò Code Window äëÿ ìîäóëÿ, ñîäåðæàùåãî ýòîò ìàêðîñ, è îòîáðà-
æàåò èñõîäíûé êîä ìàêðîñà.
Êîãäà âû âûäåëÿåòå îòäåëüíûé ïðîåêò â ñïèñêå Project/Library (ïðîåêò/áèá-
ëèîòåêà) îêíà Object Browser, ñïèñîê Classes (êëàññû) áóäåò ñîäåðæàòü òîëüêî òå
îáúåêòû, êîòîðûå ÿâëÿþòñÿ ÷àñòüþ âàøåãî ïðîåêòà, — îáû÷íî îäèí èëè áîëü-
øå ìîäóëåé, ñàì äîêóìåíò Word èëè ðàáî÷óþ êíèãó Excel è (åñëè âàø ïðîåêò
ÿâëÿåòñÿ ðàáî÷åé êíèãîé Excel) îäèí èëè áîëüøå ðàáî÷èõ ëèñòîâ.
Ïîñëå òîãî êàê âû îòîáðàçèòå ìàêðîñ â Code Window, èñïîëüçóÿ ëþáîé èç ìå-
òîäîâ, îïèñàííûõ â ïðåäûäóùåì ðàçäåëå, ìîæåòå ïðîñìîòðåòü èëè îòðåäàêòè-
ðîâàòü èñõîäíûé êîä ýòîãî ìàêðîñà. Íà ðèñ. 2.10 ïîêàçàíî Code Window, îòîáðà-
æàþùåå èñõîäíûé êîä ìàêðîñà FormatArialBold12, çàïèñàííîãî â ãëàâå 1. Âû
ìîæåòå èñïîëüçîâàòü ãîðèçîíòàëüíóþ è âåðòèêàëüíóþ ëèíåéêè ïðîêðóòêè
äëÿ èçìåíåíèÿ ïîçèöèè ìàêðîñà â îêíå. Ìîæíî òàêæå èñïîëüçîâàòü êîìàíäó
Edit | Find (ïðàâêà | íàéòè) äëÿ ïîèñêà èìåíè ìàêðîñà â ìîäóëüíîì ëèñòå. Èñ-
ïîëüçîâàíèå êîìàíäû Edit | Find äëÿ ïîèñêà òåêñòà â ìîäóëüíîì ëèñòå ñõîäíî ñ
ïîèñêîì òåêñòà â ðàáî÷åì ëèñòå Excel, äîêóìåíòå Word è ò.ä. (Ïîäðîáíåå î êî-
ìàíäå Edit | Find ìîæíî óçíàòü èç ñïðàâî÷íîé ñèñòåìû Ðåäàêòîðà VB.)

Ñîñòàâíûå ÷àñòè çàïèñàííîãî ìàêðîñà


Åñëè âû ðàññìîòðèòå íåñêîëüêî çàïèñàííûõ ìàêðîñîâ, òî çàìåòèòå, ÷òî âñå
îíè èìåþò îáùèå ýëåìåíòû. Ëèñòèíã 2.1 ïîêàçûâàåò èñõîäíûé êîä äëÿ ìàêðî-
ñà FormatArialBold12 â Excel, êîòîðûé âû çàïèñàëè ïðè èçó÷åíèè ãëàâû 1.
Ëèñòèíã 2.2 ïîêàçûâàåò èñõîäíûé êîä ìàêðîñà ÂûäåëèòüÒåêñò â Word, òàêæå
çàïèñàííûé âàìè âî âðåìÿ ðàáîòû ñ ãëàâîé 1.
Çàìå÷àíèå
Èñõîäíûé êîä ìàêðîñà â ðåàëüíûõ ìîäóëÿõ íå âêëþ÷àåò íîìåð êàæäîé ñòðîêè; â ýòîé êíèãå
âî âñåõ ëèñòèíãàõ ïðèâåäåíû íîìåðà ñòðîê, ÷òîáû áûëî ëåã÷å îáîçíà÷àòü è îáñóæäàòü
îòäåëüíûå ñòðîêè â ðàçëè÷íûõ ëèñòèíãàõ-ïðèìåðàõ.

Ëèñòèíã 2.1. Ìàêðîñ FormatArialBold12, çàïèñàííûé â Excel

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

 ëèñòèíãå 2.1 ñòðîêà 1 ÿâëÿåòñÿ íà÷àëîì çàïèñàííîãî ìàêðîñà. Êàæäûé


ìàêðîñ VBA íà÷èíàåòñÿ ñ êëþ÷åâîãî ñëîâà Sub, çà êîòîðûì ñëåäóåò èìÿ
ìàêðîñà. Ñòðîêó, ñîäåðæàùóþ êëþ÷åâîå ñëîâî Sub è èìÿ ìàêðîñà, íàçûâàþò
ñòðîêîé îáúÿâëåíèÿ (declaration) ìàêðîñà. Çà èìåíåì ìàêðîñà âñåãäà ñëåäóþò
ïóñòûå êðóãëûå ñêîáêè.
 ëèñòèíãå 2.1 ñòðîêè 2–5 ÿâëÿþòñÿ êîììåíòàðèÿìè. Êîììåíòàðèé (com-
ment) — ýòî ñòðîêà â ìàêðîñå VBA, êîòîðàÿ, äåéñòâèòåëüíî, íå ñîäåðæèò
èíñòðóêöèè, ÿâëÿþùèåñÿ ÷àñòüþ ýòîãî ìàêðîñà. Ñëåäóåò âñåãäà ïîìåùàòü
êîììåíòàðèè â èñõîäíûé êîä ìàêðîñà ñ èíôîðìàöèåé î åãî íàçíà÷åíèè.
Îáðàòèòå âíèìàíèå íà òî, ÷òî êàæäàÿ ñòðîêà êîììåíòàðèÿ íà÷èíàåòñÿ ñ
àïîñòðîôà (‘). Äëÿ VBA ëþáîé òåêñò, êîòîðûé ñëåäóåò çà àïîñòðîôîì,
ïðåäñòàâëÿåò ñîáîé êîììåíòàðèé, íà÷èíàþùèéñÿ ñ àïîñòðîôà è
çàêàí÷èâàþùèéñÿ â êîíöå ýòîé ñòðîêè.  ÿçûêàõ ïðîãðàììèðîâàíèÿ, â
êîòîðûõ äîïóñêàþòñÿ ìíîãîñòðî÷íûå êîììåíòàðèè, òàêèå êîììåíòàðèè
íàçûâàþò êîíå÷íûìè.
Çàïèñàííûé ìàêðîñ âñåãäà íà÷èíàåòñÿ ñî ñòðîê êîììåíòàðèåâ,
ôîðìóëèðóþùèõ èìÿ ìàêðîñà è ñîäåðæàùèõ òåêñò, êîòîðûé âû ââåëè â
òåêñòîâîå îêíî Description (îïèñàíèå) äèàëîãîâîãî îêíà Record Macro (çàïèñü
ìàêðîñà) â ìîìåíò çàïèñè ýòîãî ìàêðîñà. Êîíêðåòíîå êîëè÷åñòâî è
ñîäåðæèìîå ñòðîê êîììåíòàðèåâ â çàïèñàííîì ìàêðîñå çàâèñèò îò äëèíû
ââîäèìîãî âàìè îïèñàíèÿ.
Ñðàçó çà îáúÿâëåíèåì ìàêðîñà ñëåäóåò òåëî (body) ìàêðîñà (êîòîðîå ìîæåò
âêëþ÷àòü èëè íå âêëþ÷àòü ñòðîêè êîììåíòàðèåâ).  ëèñòèíãå 2.1 ñòðîêè 6–32
ñîñòàâëÿþò òåëî ìàêðîñà FormatArialBody12; â ëèñòèíãå 2.2 ñòðîêè 6–8
ñîñòàâëÿþò òåëî ìàêðîñà ÂûäåëèòüÒåêñò. Êàæäàÿ ñòðîêà â òåëå ìàêðîñà
ñîñòîèò èç îäíîãî èëè áîëåå îïåðàòîðîâ VBA. Îïåðàòîð (statement) VBA —
ýòî ïîñëåäîâàòåëüíîñòü êëþ÷åâûõ ñëîâ è äðóãèõ ñèìâîëîâ, êîòîðûå âìåñòå
ñîñòàâëÿþò îäíó ïîëíóþ èíñòðóêöèþ äëÿ VBA. Ìàêðîñ VBA ñîñòîèò èç îäíîãî
èëè íåñêîëüêèõ îïåðàòîðîâ.
Ðåäàêòèðîâàíèå ìàêðîñîâ 65

Îïåðàòîðû VBA â çàïèñàííîì ìàêðîñå ñîäåðæàò èíñòðóêöèè,


ñîîòâåòñòâóþùèå äåéñòâèÿì, êîòîðûå âû âûïîëíÿëè, êîãäà çàïèñûâàëè ýòîò
ìàêðîñ. Íàïðèìåð, ñòðîêà 21 â ëèñòèíãå 2.1 óñòàíàâëèâàåò øðèôò Arial,
ñòðîêà 22 — ðàçìåð øðèôòà è òàê äàëåå. Â ëèñòèíãå 2.2 ñòðîêà 6
óñòàíàâëèâàåò øðèôò Arial, à ñòðîêà 7 óñòàíàâëèâàåò ðàçìåð øðèôòà. Êàæäûé
èç ýòèõ îïåðàòîðîâ ñîîòâåòñòâóåò äåéñòâèþ, âûïîëíÿåìîìó ïðè çàïèñè ýòîãî
ìàêðîñà.
Çà òåëîì ìàêðîñà ñëåäóåò ñòðîêà, ñîäåðæàùàÿ êëþ÷åâûå ñëîâà End Sub,
êîòîðûå ñîîáùàþò VBA î òîì, ÷òî äîñòèãíóò êîíåö ìàêðîñà. Ìàêðîñ â
ëèñòèíãå 2.1 çàêàí÷èâàåòñÿ â ñòðîêå 33, à â ëèñòèíãå 2.2 — â ñòðîêå 9.
Êîãäà âû çàïóñêàåòå ìàêðîñ, VBA íà÷èíàåò âûïîëíåíèå êîäà ñ ïåðâîé
ñòðîêè â òåëå ýòîãî ìàêðîñà (ïåðâàÿ ñòðîêà ïîñëå îáúÿâëåíèÿ ìàêðîñà) è
âûïîëíÿåò èíñòðóêöèè â ýòîé ñòðîêå ïîñëåäîâàòåëüíî ñëåâà íàïðàâî. Çàòåì
VBA ïåðåõîäèò ê ñëåäóþùåé ñòðîêå è âûïîëíÿåò èíñòðóêöèè â íåé è òàê
äàëåå, ïîêà îí íå äîñòèãíåò êîíöà ìàêðîñà, îáîçíà÷åííîãî îïåðàòîðîì End
Sub. VBA èãíîðèðóåò ëþáûå ñòðîêè êîììåíòàðèåâ, êîòîðûå ìîãóò ïîÿâèòüñÿ â
òåëå ìàêðîñà.
Êàê âû ìîãëè óæå çàìåòèòü, ìíîãèå ñòðîêè â îáîèõ çàïèñàííûõ ìàêðîñàõ
èìåþò îòñòóï îò ëåâîãî êðàÿ. Êàæäûé óðîâåíü îòñòóïà ïîìîãàåò îòäåëÿòü îäíó
÷àñòü ìàêðîñà îò äðóãîé. Çàìåòüòå, ÷òî âñå òåëî êàæäîãî ìàêðîñà ñìåùåíî
âïðàâî ìåæäó êëþ÷åâûìè ñëîâàìè Sub…End Sub äëÿ íàãëÿäíîãî âûäåëåíèÿ
òåëà ìàêðîñà. Â äðóãèõ ìåñòàõ îïåðàòîðû ðàñïîëîæåíû ñ åùå áîëüøèì
îòñòóïîì. Ýòîò áîëüøèé óðîâåíü îòñòóïà ïîìîãàåò îïðåäåëèòü âñå îïåðàòîðû,
çàêëþ÷åííûå ìåæäó êëþ÷åâûìè ñëîâàìè With…End With.
Ìàêðîðåêîðäåð ïðè ñîçäàíèè ìàêðîñà àâòîìàòè÷åñêè äåëàåò îòñòóïû â
êîäå, ÷òîáû ïîëüçîâàòåëþ áûëî ëåã÷å ÷èòàòü çàïèñàííûé ìàêðîñ. Êîãäà âû
áóäåòå ïèñàòü ñîáñòâåííûå ìàêðîñû, ñëåäóåò âñåãäà äåëàòü îòñòóïû â êîäå äëÿ
âûäåëåíèÿ ðàçëè÷íûõ ñåêöèé ìàêðîñà. Ñìåùàòü ñòðîêè íå îáÿçàòåëüíî;
ìàêðîñû â ëèñòèíãàõ 2.1 è 2.2 áóäóò òàê æå âûïîëíÿòüñÿ, åñëè âñå ñòðîêè
áóäóò âûðîâíåíû ïî ëåâîìó êðàþ ìîäóëÿ. Ðàçìåùåíèå ñòðîê ñ îòñòóïîì
âûïîëíÿåòñÿ õîðîøèìè ïðîãðàììèñòàìè ëèøü äëÿ áîëåå ëåãêîãî ÷òåíèÿ è
ñîïðîâîæäåíèÿ èõ ïðîãðàìì.
Ïðè èñïîëüçîâàíèè öâåòíîãî ìîíèòîðà, êîãäà âû áóäåòå ïðîñìàòðèâàòü
çàïèñàííûé ìàêðîñ íà ýêðàíå (èñïîëüçóÿ ðåäàêòîð VB), òî çàìåòèòå, ÷òî
ðàçëè÷íûå ÷àñòè òåêñòà ìàêðîñà îòîáðàæàþòñÿ ðàçëè÷íûìè öâåòàìè.
Êîììåíòàðèè îòîáðàæàþòñÿ çåëåíûì öâåòîì, òîãäà êàê Sub, End Sub è äðóãèå
êëþ÷åâûå ñëîâà VBA — ñèíèì. Îñòàëüíîé òåêñò â ìàêðîñå îòîáðàæàåòñÿ
÷åðíûì öâåòîì äëÿ óêàçàíèÿ íà òî, ÷òî îí ñîäåðæèò äàííûå è ïðîãðàììíûå
îïåðàòîðû, ñîçäàííûå ïîëüçîâàòåëåì. VBA âûïîëíÿåò öâåòîâîå êîäèðîâàíèå
òåêñòà íà ýêðàíå, ÷òîáû ìîæíî áûëî ëåãêî îïðåäåëèòü, êàêóþ ÷àñòü ìàêðîñà
èëè îïåðàòîð âû ïðîñìàòðèâàåòå.

Ðåäàêòèðîâàíèå òåêñòà ìàêðîñà


Ïðè ðåäàêòèðîâàíèè êîäà ìàêðîñà â ìîäóëå âû ìîæåòå èñïîëüçîâàòü
êîìàíäû è ìåòîäû, èçâåñòíûå âàì êàê ïîëüçîâàòåëþ Windows, Word èëè Ex-
cel. Ðåäàêòèðîâàíèå òåêñòà, îòîáðàæàåìîãî â Code Window, ïîõîæå íà
ðåäàêòèðîâàíèå òåêñòà â Windows Notepad èëè â WordPad. Âû èñïîëüçóåòå òó
æå êëàâèàòóðó, ìûøü èëè êîìàíäû ìåíþ Edit (äëÿ äîáàâëåíèÿ, óäàëåíèÿ,
66 Ãëàâà 2

âûäåëåíèÿ, âûðåçàíèÿ, êîïèðîâàíèÿ èëè âñòàâêè òåêñòà â ìîäóëå), êîòîðûå


ïðèìåíÿþòñÿ â Windows Notepad, WordPad.
Äëÿ ñîõðàíåíèÿ èçìåíåíèé, êîòîðûå âû âíîñèòå â ìîäóëü, èñïîëüçóéòå
êîìàíäó File | Save (ôàéë | ñîõðàíèòü) Ðåäàêòîðà VB èëè ùåëêàéòå íà êíîïêå
Save (ñîõðàíèòü) íà ïàíåëè èíñòðóìåíòîâ. Ëþáûå èçìåíåíèÿ, êîòîðûå âû
âûïîëíÿåòå â ìîäóëå, òàêæå ñîõðàíÿþòñÿ âñÿêèé ðàç, êîãäà âû ñîõðàíÿåòå
äîêóìåíò èëè ôàéë ðàáî÷åé êíèãè, ñîäåðæàùèé ýòîò ìîäóëü. (Word
àâòîìàòè÷åñêè ñîõðàíÿåò ëþáûå èçìåíåíèÿ â øàáëîíå Normal.dotm, êîãäà âû
âûõîäèòå èç Word; Excel âûäàåò çàïðîñ íà ñîõðàíåíèå ëþáûõ èçìåíåíèé,
âûïîëíåííûõ â Personal.xlsb, ïðè âûõîäå.)
Çàìå÷àíèå
Âû ìîæåòå èñïîëüçîâàòü öâåòîâîå êîäèðîâàíèå äëÿ êîíòðîëÿ ïðàâèëüíîñòè ââîäèìûõ âàìè
îïåðàòîðîâ: åñëè âî ââåäåííîì îïåðàòîðå (ïîñëå îêîí÷àíèÿ ââîäà) íè îäíî êëþ÷åâîå ñëîâî íå
èçìåíèëî ñâîé öâåò, ýòî ÿâíûé ïðèçíàê íàëè÷èÿ îøèáêè.

 êà÷åñòâå ïðèìåðà ðåäàêòèðîâàíèÿ ìàêðîñà ñíà÷àëà çàïèøèòå íîâûé


ìàêðîñ â Excel ñëåäóþùèì îáðàçîì:
1. Çàïóñòèòå ìàêðîðåêîðäåð, óñòàíàâëèâàÿ ïàðàìåòðû â äèàëîãîâîì îêíå Re-
cord Macro (çàïèñü ìàêðîñà) òàê, ÷òîáû ìàêðîñ ñîõðàíÿëñÿ â êíèãå Personal.
2. Äàéòå ìàêðîñó èìÿ NewBook.
3. Çàïèøèòå ñëåäóþùèå äåéñòâèÿ: ùåëêíèòå êðîïêó Office âûáåðèòå èç ìåíþ
Ñîçäàòü è â îêíå Ñîçäàíèå êíèãè ùåëêíèòå äâàæäû íà çíà÷êå Íîâàÿ êíèãà (ðèñ.
2.11).xls.
4. Ñíîâà ùåëêíèòå êðîïêó Office âûáåðèòå èç ìåíþ Ñîõðàíèòü êàê äëÿ
ñîõðàíåíèÿ ýòîé ðàáî÷åé êíèãè (èñïîëüçóéòå èìÿ NewBook). Ñðàçó æå ïîñëå
ñîõðàíåíèÿ ôàéëà ùåëêíèòå êðîïêó Office è âûáåðèòå Çàêðûòü, ÷òîáû çàêðûòü
ôàéë.
5. Îñòàíîâèòå ìàêðîðåêîðäåð.
Ìàêðîñ, êîòîðûé áóäåò çàïèñàí â ðåçóëüòàòå âûøåïðèâåäåííûõ äåéñòâèé,
èìååò âèä, ïðåäñòàâëåííûé â ëèñòèíãå 2.3.

Ëèñòèíã 2.3. Íåðåäàêòèðîâàííûé ìàêðîñ Newbook

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
Îêíî Ñîçäàíèå êíèãè

Ëèñòèíã 2.4. Îòðåäàêòèðîâàííûé ìàêðîñ Newbook


1: Sub NewBook()
2: '
2: ' NewBook Ìàêðîñ
3: '
4: Workbooks.Add
5: ActiveWorkbook.SaveAs _
6: Filename:= _
7: "H:\Ïðîãðàììèðîâàíèå íà VBA 2007\Äîêóìåíòû\NewBook.xlsx", _
8: FileFormat:=xlOpenXMLWorkbook, _
9: CreateBackup:=False
10: ActiveWorkbook.Close
11 ActiveWindow.Close
12: End Sub

Ñèìâîë ïðîäîëæåíèÿ ñòðîêè VBA


Ïîñìîòðèòå íà ñòðîêè 5–8 â ëèñòèíãå 2.4. Îáðàòèòå âíèìàíèå íà ñèìâîë
ïîä÷åðêèâàíèÿ ( ) â êîíöå êàæäîé èç ýòèõ ñòðîê. Çàìåòüòå òàêæå, ÷òî ñèìâîëó
ïîä÷åðêèâàíèÿ ïðåäøåñòâóåò ïðîáåë, îòäåëÿÿ åãî îò äðóãîãî òåêñòà â ñòðîêå.
Ýòà îñîáàÿ êîìáèíàöèÿ ñèìâîëà ïðîáåëà, çà êîòîðûì ñëåäóåò ñèìâîë
ïîä÷åðêèâàíèÿ â êîíöå ñòðîêè, íàçûâàåòñÿ ñèìâîëîì ïðîäîëæåíèÿ ñòðîêè
(line-continuation character) è ñîîáùàåò VBA î òîì, ÷òî ñëåäóþùàÿ ñòðîêà
ìàêðîñà äîëæíà áûòü ïðèñîåäèíåíà ê òåêóùåé ñòðîêå äëÿ îáðàçîâàíèÿ
åäèíîãî îïåðàòîðà. Â ëèñòèíãå 2.4 ñòðîêè 10–15 ÿâëÿþòñÿ îäíèì îïåðàòîðîì,
â äàííîì ñëó÷àå — êîìàíäîé, êîòîðàÿ ñîõðàíÿåò ðàáî÷óþ êíèãó è
óñòàíàâëèâàåò íåñêîëüêî îïöèé äëÿ íåå. Äëÿ òîãî ÷òîáû ìàêðîñ áûë áîëåå
÷èòàáåëüíûì, ìàêðîðåêîðäåð ðàçäåëèë ýòó åäèíóþ ëîãè÷åñêóþ ñòðîêó íà
íåñêîëüêî ôèçè÷åñêèõ ñòðîê, èñïîëüçóÿ ñèìâîë ïðîäîëæåíèÿ ñòðîêè, íî ýòî
ðàçäåëåíèå (ñì. ëèñòèíã 2.3) íå íàìíîãî óëó÷øèëî ÷èòàáåëüíîñòü êîäà.
Ïîýòîìó êîä ïðèøëîñü åùå ïîäïðàâèòü (ñì. ëèñòèíã 2.4).
68 Ãëàâà 2

Çàìåòüòå òàêæå, ÷òî îïåðàòîðû, ðàçäåëåííûå (óìåñòíåå áûëî áû ãîâîðèòü


«îáúåäèíåííûå») ñèìâîëîì ïðîäîëæåíèÿ ñòðîêè, ðàçìåùàþòñÿ ñ åùå
áîëüøèì îòñòóïîì, ÷òîáû èõ áûëî ëåã÷å îáíàðóæèòü ïðè ÷òåíèè êîäà.
VBA ïðîâåðÿåò êàæäóþ íîâóþ èëè èçìåíåííóþ ñòðîêó â ìàêðîñå äëÿ
îïðåäåëåíèÿ òîãî, ÿâëÿåòñÿ ëè ýòà ñòðîêà ïðàâèëüíîé ñ òî÷êè çðåíèÿ
ñèíòàêñèñà. Åñëè íîâàÿ èëè èçìåíåííàÿ ñòðîêà èìååò ïðàâèëüíûé ñèíòàêñèñ,
VBA âûïîëíÿåò öâåòîâîå êîäèðîâàíèå ÷àñòåé ñòðîêè, èñïîëüçóÿ ñõåìó
öâåòîâîãî êîäèðîâàíèÿ, îïèñàííóþ ðàíåå. Åñëè â ñòðîêå èìååòñÿ îøèáêà
ñèíòàêñèñà, VBA îòîáðàæàåò âñþ ñòðîêó êðàñíûì öâåòîì è ìîæåò âûâåñòè
îäíî èëè íåñêîëüêî âîçìîæíûõ ñîîáùåíèé îá îøèáêå ñèíòàêñèñà. Ñîîáùåíèÿ
î ñèíòàêñè÷åñêèõ îøèáêàõ îïèñûâàþòñÿ áîëåå ïîäðîáíî äàëåå â ýòîé ãëàâå.

Ïåðåìåùåíèå èëè êîïèðîâàíèå ìàêðîñà


èç îäíîãî ìîäóëÿ â äðóãîé
Äëÿ êîïèðîâàíèÿ îäíîãî ìàêðîñà èñïîëüçóéòå Clipboard, âûïîëíÿÿ
ñëåäóþùèå øàãè:
1. Îòîáðàçèòå ìàêðîñ, êîòîðûé âàì íåîáõîäèìî êîïèðîâàòü.
2. Âûäåëèòå âåñü òåêñò èñõîäíîãî êîäà ìàêðîñà. Óáåäèòåñü, ÷òî âû âûäåëèëè
âåñü ìàêðîñ, âêëþ÷àÿ ñòðîêè Sub, End Sub è âñå ñòðîêè ìåæäó íèìè.
3. Èñïîëüçóéòå êîìàíäó Edit | Copy äëÿ êîïèðîâàíèÿ òåêñòà ìàêðîñà â Clip-
board.
4. Îòîáðàçèòå ìîäóëü, â êîòîðûé âàì íåîáõîäèìî êîïèðîâàòü ýòîò ìàêðîñ.
5. Èñïîëüçóéòå êîìàíäó Edit | Paste äëÿ âñòàâêè òåêñòà ìàêðîñà â ìîäóëü.
Âû ìîæåòå ïîëüçîâàòüñÿ îïèñàííûì âûøå ìåòîäîì äëÿ êîïèðîâàíèÿ
ìàêðîñà â òîò æå ìîäóëü, â äðóãîé ìîäóëü îäíîãî è òîãî æå ïðîåêòà èëè â
ìîäóëü äðóãîãî ïðîåêòà. Ìîæíî òàêæå èñïîëüçîâàòü ýòîò ìåòîä äëÿ âñòàâêè
òåêñòà ìàêðîñà â äðóãèå ïðèëîæåíèÿ Windows, òàêèå êàê Notepad.

Ñîõðàíåíèå è ïåðåíîñ ìîäóëåé êàê òåêñòîâûõ ôàéëîâ


Åñëè âàì íåîáõîäèìî ñäåëàòü ðåçåðâíóþ êîïèþ âñåãî ìîäóëÿ, âû ìîæåòå
ñîõðàíèòü åãî êàê òåêñòîâûé ôàéë. Ñîõðàíåíèå öåëîãî ìîäóëÿ êàê òåêñòîâîãî
ôàéëà ïîëåçíî, åñëè âû õîòèòå èìïîðòèðîâàòü ìîäóëü â äðóãîé ïðîåêò VBA,
ñîçäàòü àðõèâíûå êîïèè âàøåé ðàáîòû èëè ïåðåíåñòè ìîäóëè VBA â Visual Ba-
sic 6. Òàêîå ñîõðàíåíèå ìîäóëÿ íàçûâàåòñÿ ýêñïîðòèðîâàíèåì ìîäóëÿ. Ïîñëå
òîãî êàê âû ýêñïîðòèðóåòå ìîäóëü, âû ìîæåòå èìïîðòèðîâàòü åãî â ëþáîé
ïðîåêò VBA èëè Visual Basic.

Ýêñïîðòèðîâàíèå ìîäóëåé
Äëÿ ýêñïîðòèðîâàíèÿ ìîäóëÿ êàê òåêñòîâîãî ôàéëà âûïîëíèòå ñëåäóþùåå:
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 äëÿ
ñîõðàíåíèÿ âñåãî ìîäóëÿ â âèäå
òåêñòîâîãî ôàéëà

5. Ùåëêíèòå íà êíîïêå Ñîõðàíèòü (Save), ÷òîáû ýêñïîðòèðîâàòü ôàéë. Ðåäàê-


òîð VB ýêñïîðòèðóåò âûäåëåííûé ìîäóëü è çàêðûâàåò îêíî Export File.
Êîãäà âû ýêñïîðòèðóåòå ìîäóëü, Ðåäàêòîð VB ñîçäàåò ôàéë ÷èòàåìîãî òåê-
ñòà, ñîäåðæàùèé âñå ìàêðîñû ýòîãî ìîäóëÿ. Âû ìîæåòå ïðîñìàòðèâàòü è ðå-
äàêòèðîâàòü .bas-ôàéëû, ñîçäàííûå Ðåäàêòîðîì VB, ñ ïîìîùüþ Windows
Notepad èëè Visual Basic. Íà ðèñ. 2.13 è 2.14 ïîêàçàí ýêñïîðòèðîâàííûé â
ôàéë .bas ìîäóëü, ñîäåðæàùèé ìàêðîñ Newbook ëèñòèíãà 2.5, îòîáðàæåííûé â
Windows Notepad è Visual Basic 6, ñîîòâåòñòâåííî.
Îáðàòèòå âíèìàíèå íà òî, ÷òî òåêñò â ôàéëå .bas, îòîáðàæåííûé ïðèëîæå-
íèåì Notepad (ðèñ. 2.13), ñîäåðæèò ñòðîêè, íà÷èíàþùèåñÿ ñî ñëîâà
Attribute è îòñóòñòâóþùèå â ìîäóëå â Code Window. Ðåäàêòîð VB äîáàâëÿåò
ýòè äîïîëíèòåëüíûå ñòðîêè ê ýêñïîðòèðîâàííîìó ôàéëó .bas, ïîñêîëüêó îíè
ñîäåðæàò èíôîðìàöèþ, êîòîðàÿ ïîòðåáóåòñÿ VBA èëè Visual Basic, åñëè âû â
äàëüíåéøåì áóäåòå èìïîðòèðîâàòü ôàéë .bas â äðóãîé ïðîåêò.

Èìïîðòèðîâàíèå ìîäóëåé

Ðèñ. 2.13
Ýêñïîðòèðîâàí-
íûé ìîäóëüíûé
ôàéë,
îòîáðàæàåìûé â
Windows Notepad

Âû ìîæåòå äîáàâëÿòü ëþáîé ìîäóëü, ýêñïîðòèðîâàííûé âàìè êàê ôàéë


.bas, â ëþáîé èç ïðîåêòîâ VBA. Ìîäóëü äîáàâëÿåòñÿ â ïðîåêò èìïîðòèðîâàíè-
70 Ãëàâà 2

åì òåêñòîâîãî ôàéëà .bas. Äëÿ òîãî ÷òîáû èìïîðòèðîâàòü .bas-ôàéë, âûïîëíè-


òå ñëåäóþùåå:

Ðèñ. 2.14
Ýêñïîðòèðîâàííûé ìîäóëüíûé ôàéë, îòîáðàæàåìûé â Visual Basic 6

1. Âûäåëèòå ïðîåêò â Project Explorer, â êîòîðûé íåîáõîäèìî èìïîðòèðîâàòü


ôàéë .bas.
2. Âûáåðèòå êîìàíäó File | Import File. Ðåäàêòîð VB îòîáðàæàåò äèàëîãîâîå îêíî
Import File (èìïîðò ôàéëà), îòîáðàæåííîå íà ðèñ. 2.15. Äèàëîãîâîå îêíî Import
File ðàáîòàåò â îñíîâíîì òàê æå, êàê ëþáîå äèàëîãîâîå îêíî îòêðûòèÿ ôàéëà
Windows.

Ðèñ. 2.15
Îêíî Import File ïîçâîëÿåò äîáàâèòü ê
ïðîåêòó ìîäóëü, ðàíåå ýêñïîðòèðîâàííûé
èç Ðåäàêòîðà VB êàê òåêñòîâûé ôàéë

3. Èñïîëüçóéòå ýëåìåíò Ïàïêà (Look In) äëÿ ïåðåìåùåíèÿ íà äèñê è â ïàïêó,


ãäå ñîäåðæèòñÿ ôàéë, êîòîðûé âàì íåîáõîäèìî èìïîðòèðîâàòü â âàø ïðîåêò.
Ýòî äîëæåí áûòü ôàéë, êîòîðûé âû ñîçäàëè, èñïîëüçóÿ Ðåäàêòîð VB äëÿ
ýêñïîðòèðîâàíèÿ ìîäóëÿ.
4. Óáåäèòåñü, ÷òî â ñïèñêå Òèï ôàéëîâ (Files Of Type) âûäåëåí ïóíêò VB Files
(*.frm, *.bas, *.cls).
5. Ùåëêíèòå ìûøüþ äâàæäû íà èìåíè ôàéëà, êîòîðûé âàì íåîáõîäèìî èì-
ïîðòèðîâàòü. Ðåäàêòîð VB ÷èòàåò ôàéë è äîáàâëÿåò ìîäóëü â âàø ïðîåêò. Åñëè
ïðîåêò óæå ñîäåðæèò ìîäóëü ñ òåì æå èìåíåì, ÷òî è ìîäóëü, èìïîðòèðóåìûé
Ðåäàêòèðîâàíèå ìàêðîñîâ 71

âàìè, Ðåäàêòîð VB äîáàâëÿåò ÷èñëî â êîíåö èìåíè ìîäóëÿ (1, 2, 3 è òàê äàëåå)
äëÿ ñîçäàíèÿ óíèêàëüíîãî èìåíè ìîäóëÿ.

Óäàëåíèå ìîäóëåé èç ïðîåêòà


Âîçìîæíî, âû ðåøèòå, ÷òî âàì áîëüøå íå íóæíû ìàêðîñû, ñîäåðæàùèåñÿ â
îïðåäåëåííîì ìîäóëå. Âàì ìîæåò ïîíàäîáèòüñÿ óäàëèòü ìîäóëü èç ïðîåêòà,
ïîòîìó ÷òî ìàêðîñû, êîòîðûå îí ñîäåðæèò, áûëè çàìåíåíû íîâûìè âåðñèÿìè
èëè ïîòîìó, ÷òî ýòîò ìîäóëü ñîäåðæèò ýêñïåðèìåíòàëüíûå ìàêðîñû, íåíóæ-
íûå âàì áîëåå. Ìîäóëü ìîæíî óäàëèòü èç ïðîåêòà VBA, âûïîëíèâ ñëåäóþùåå:
1. Âûäåëèòå ìîäóëü, êîòîðûé õîòèòå óäàëèòü èç ïðîåêòà, â Project Explorer Ðå-
äàêòîðà VB.
2. Âûáåðèòå êîìàíäó File | Remove <object> (ôàéë | óäàëèòü <îáúåêò>). Ðåäàêòîð
VB îòîáðàæàåò îêíî ñîîáùåíèÿ, çàïðàøèâàþùåå ó âàñ, õîòèòå ëè âû ýêñïîðòè-
ðîâàòü ìîäóëü ïåðåä òåì, êàê óäàëèòü åãî (ðèñ. 2.16).
Ðèñ. 2.16
Îêíî ñîîáùåíèÿ, çàïðàøèâàþùåå ó âàñ, õîòèòå
ëè âû ýêñïîðòèðîâàòü ìîäóëü ïåðåä òåì, êàê
óäàëèòü åãî

3. Ùåëêíèòå íà êíîïêå Äà, åñëè õîòèòå ýêñïîðòèðîâàòü ìîäóëü ïåðåä åãî óäà-
ëåíèåì. (Íàñòîÿòåëüíî ðåêîìåíäóåòñÿ ýêñïîðòèðîâàòü ìîäóëü êàê ôàéë .bas,
åñëè òîëüêî âû íå óâåðåíû àáñîëþòíî, ÷òî âàì íèêîãäà íå ïîíàäîáÿòñÿ ìàêðî-
ñû, ñîäåðæàùèåñÿ â ýòîì ìîäóëå). Èíà÷å ìîæíî ùåëêíóòü íà êíîïêå Íåò äëÿ
óäàëåíèÿ ìîäóëÿ áåç åãî ýêñïîðòèðîâàíèÿ.
4. Åñëè âû âûáåðèòå ýêñïîðòèðîâàíèå ìîäóëÿ ïåðåä åãî óäàëåíèåì, Ðåäàêòîð
VB îòîáðàæàåò äèàëîãîâîå îêíî Export File, îïèñàííîå ðàíåå â ýòîì ðàçäåëå. Çà-
ïîëíèòå äèàëîãîâîå îêíî Export File, êàê óæå áûëî îïèñàíî, è ùåëêíèòå íà
êíîïêå Ñîõðàíèòü.
 ëþáîì ñëó÷àå Ðåäàêòîð VB óäàëÿåò ìîäóëü èç ïðîåêòà.

Íàïèñàíèå íîâûõ ìàêðîñîâ è ïðîöåäóð


×òîáû çàïèñàòü ìàêðîñ áåç èñïîëüçîâàíèÿ ìàêðîðåêîðäåðà, âû ìîæåòå ââå-
ñòè ýòîò ìàêðîñ â ñóùåñòâóþùèé ìîäóëü èëè ñîçäàòü íîâûé ìîäóëü, êîòîðûé
áóäåò ñîäåðæàòü ýòîò ìàêðîñ.
Äî ñèõ ïîð â ýòîé êíèãå èñïîëüçîâàëñÿ òåðìèí ìàêðîñ (macro) êàê äëÿ ìàê-
ðîñîâ, êîòîðûå âû çàïèñûâàåòå ðåêîðäåðîì, òàê è äëÿ ìàêðîñîâ, êîòîðûå ïè-
øèòå ñàìè. Ñóùåñòâóåò äðóãîé òåðìèí, ïîìîãàþùèé ðàçëè÷àòü ýòè ìàêðîñû.
Ñòðîãî ãîâîðÿ, òåðìèí ìàêðîñ ïðèìåíèì òîëüêî äëÿ èíñòðóêöèé, êîòîðûå âû
çàïèñûâàåòå ñ ïîìîùüþ ìàêðîðåêîðäåðà (èëè ñîçäàåòå ïðè ïîìîùè, íàïðèìåð,
Access Macro Builder). Èíîãäà â ëèòåðàòóðå ìàêðîñàìè íàçûâàþò ïðîãðàììû,
êîòîðûå íå èìåþò àðãóìåíòîâ (âû, íàâåðíîå, óæå ïîíÿëè, ÷òî çàïèñûâàåìûå
ðåêîðäåðîì ìàêðîñû íå ìîãóò èìåòü àðãóìåíòîâ). Ìàêðîñû, êîòîðûå âû ïèøå-
òå çàíîâî áîëåå òî÷íî íàçûâàþòñÿ ïîäïðîöåäóðàìè (subprocedures) èëè ïðîñòî
ïðîöåäóðà ïðîöåäóðàìè (procedures). Äàëåå â ýòîé êíèãå òåðìèí ìàêðîñ îòíî-
ñèòñÿ ê êîäó, çàïèñûâàåìîìó ñ ïîìîùüþ ìàêðîðåêîðäåðà, à òåðìèí ïðîöåäóðà
— ê êîäó VBA, êîòîðûé âû ïèøåòå ñàìè.
72 Ãëàâà 2

Âñòàâêà è ïåðåèìåíîâàíèå ìîäóëÿ


Åñëè äîêóìåíò (øàáëîí, ðàáî÷àÿ êíèãà, ïðåçåíòàöèÿ, ðèñóíîê) â êîòîðîì
âû õîòèòå ñîõðàíèòü ïðîöåäóðó, åùå íå ñîäåðæèò ìîäóëü, âû äîëæíû âñòàâèòü
ìîäóëü ïåðåä òåì, êàê ñìîæåòå íàïèñàòü ïðîöåäóðó VBA â ýòîì ïðîåêòå. Âû
ìîæåòå òàêæå âñòàâèòü íîâûé ìîäóëü, åñëè ñóùåñòâóþùèå ìîäóëè çàïîëíåíû
(ìîäóëü ìîæåò ñîäåðæàòü íå áîëåå 4000 ñòðîê) èëè åñëè âû ïðîñòî õîòèòå ñîç-
äàòü íîâóþ ïðîöåäóðó VBA â åå ñîáñòâåííîì ìîäóëå.
Åñëè âû ðåøèëè íàïèñàòü ïðîöåäóðó VBA â íîâîì ìîäóëå, âûïîëíèòå ñëå-
äóþùèå øàãè äëÿ äîáàâëåíèÿ ìîäóëÿ â ïðîåêò:
1. Óáåäèòåñü, ÷òî â host-ïðèëîæåíèè VBA (Word, Excel, Outlook, PowerPoint,
Visio èëè FrontPage) îòêðûò òîò äîêóìåíò, øàáëîí èëè ðàáî÷àÿ êíèãà, â êîòî-
ðîì âû õîòèòå ñîõðàíèòü ïðîöåäóðó.
2. Íàæìèòå Alt+F11 äëÿ àêòèâèçàöèè Ðåäàêòîðà VB.
3. Â Project Explorer âûäåëèòå ïðîåêò, â êîòîðûé õîòèòå äîáàâèòü ìîäóëü (ñêîðåå
âñåãî, â ýòîò ìîìåíò îí òàì áóäåò îäèí).
4. Âûáåðèòå êîìàíäó Insert | Module (âñòàâêà | ìîäóëü) èëè íà ïàíåëè Standard ñ
ïîìîùüþ êíîïêè Insert <object> (âòîðàÿ êíîïêà ñëåâà) âûáåðèòå â ðàñêðûâàþ-
ùåìñÿ ìåíþ Module. Ðåäàêòîð VB äîáàâëÿåò íîâûé ìîäóëü â ïðîåêò è îòêðûâà-
åò Code Window äëÿ íîâîãî ìîäóëÿ.
Êîãäà Ðåäàêòîð VB âñòàâëÿåò íîâûé ìîäóëü, îí äàåò åìó èìÿ â ñîîòâåòñòâèè
ñ ïðàâèëàìè, èçëîæåííûìè ðàíåå â ýòîé ãëàâå; âàø íîâûé ìîäóëü áóäåò èìåòü
èìÿ ïî óìîë÷àíèþ Module ñ ïîñëåäóþùèì íîìåðîì. Âñÿêèé ðàç ïðè âñòàâêå
ìîäóëÿ ñëåäóåò ïåðåèìåíîâûâàòü åãî, ÷òîáû ýòîò ìîäóëü èìåë îïèñàòåëüíîå
èìÿ. Äëÿ ïåðåèìåíîâàíèÿ ìîäóëÿ âûïîëíèòå ñëåäóþùèå øàãè:
1. Âûäåëèòå â Ðåäàêòîðå VB ìîäóëü, êîòîðûé áóäåòå ïåðåèìåíîâûâàòü.
2. Åñëè Properties Window (îêíî ñâîéñòâ) åùå íå âûâåäåíî íà ýêðàí, âûáåðèòå êî-
ìàíäó View | Properties Window (âèä | îêíî ñâîéñòâ) (èëè ùåëêíèòå íà êíîïêå
Properties íà ïàíåëè èíñòðóìåíòîâ), ÷òîáû îòîáðàçèòü åãî. Íà ðèñ. 2.17 ïîêàçà-
íî Properties Window äëÿ ìîäóëÿ; ìîäóëè èìåþò òîëüêî îäíî ñâîéñòâî — èìÿ.
Ðèñ. 2.17
Èçìåíÿéòå èìÿ ìîäóëÿ, èçìåíÿÿ åãî ñâîéñòâî Name

3. Â òåêñòîâîå ïîëå Name (èìÿ) â Properties Window ââåäèòå íîâîå èìÿ äëÿ ìîäó-
ëÿ. Êàê òîëüêî âû óáåðåòå êóðñîð âñòàâêè èç òåêñòîâîãî ïîëÿ Name, Ðåäàêòîð
VB ïåðåèìåíóåò ìîäóëü.

Âûäåëåíèå ñóùåñòâóþùåãî ìîäóëÿ


Äëÿ íàïèñàíèÿ íîâîé ïðîöåäóðû â ñóùåñòâóþùåì ìîäóëå íåîáõîäèìî ñíà-
÷àëà îòêðûòü Code Window (îêíî ïðîãðàììû) äëÿ ìîäóëÿ, â êîòîðîì âû õîòèòå
íàïèñàòü ïðîöåäóðó. ×òîáû îòêðûòü Code Window äëÿ ìîäóëÿ, ëèáî ùåëêíèòå
äâàæäû íà ýòîì ìîäóëå â Project Explorer, ëèáî âûäåëèòå ýòîò ìîäóëü â Project
Explorer è çàòåì âûáåðèòå êîìàíäó View | Code (âèä | ïðîãðàììà).
Ðåäàêòèðîâàíèå ìàêðîñîâ 73

Íàïèñàíèå òåêñòà ïðîöåäóðû


×òîáû íàïèñàòü èñõîäíûé êîä äëÿ ïðîöåäóðû, íåçàâèñèìî îò òîãî,
äîáàâëÿåòå ëè âû ïðîöåäóðó â íîâûé èëè â óæå ñóùåñòâóþùèé ìîäóëü,
ïîìåñòèòå êóðñîð âñòàâêè â Code Window â òî ìåñòî â ìîäóëå, êóäà âû õîòèòå
ââåñòè íîâóþ ïðîöåäóðó.
Âû ìîæåòå ââåñòè èñõîäíûé êîä íîâîé ïðîöåäóðû VBA â ëþáîì ìåñòå â
ìîäóëå, ñëåäÿ çà òåì, ÷òîáû íîâàÿ ïðîöåäóðà íà÷èíàëàñü ïîñëå, âîçìîæíî,
èìåþùåãîñÿ òàì îïåðàòîðà End Sub, êîòîðûé çàêàí÷èâàåò ïðåäûäóùóþ
ïðîöåäóðó, è ïåðåä îïåðàòîðîì Sub, êîòîðûé íà÷èíàåò ñëåäóþùóþ ïðîöåäóðó
â ìîäóëå. Êîíå÷íî, ñàìûì ïðîñòûì ÿâëÿåòñÿ äîáàâëåíèå íîâûõ ïðîöåäóð â
êîíåö ìîäóëÿ.
Êîãäà âû ïèøåòå íîâóþ ïðîöåäóðó, âû äîëæíû óêàçàòü èìÿ ïðîöåäóðû è
âêëþ÷èòü êëþ÷åâîå ñëîâî Sub â íà÷àëå ïðîöåäóðû è êëþ÷åâûå ñëîâà End Sub
— â êîíöå. Åñëè âû îïóñòèòå ëþáîé èç ýòèõ òðåõ ýëåìåíòîâ, ñèíòàêñèñ
ïðîöåäóðû íå áóäåò âåðíûì è VBA îòîáðàçèò ñîîáùåíèå îá îøèáêå, êîãäà âû
ïîïûòàåòåñü çàïóñòèòü ýòó ïðîöåäóðó.
Ïåðâîé êëàññè÷åñêîé ïðîãðàììîé â ëþáîì îïèñàíèè ÿçûêà
ïðîãðàììèðîâàíèÿ ÿâëÿåòñÿ ïðîãðàììà, îòîáðàæàþùàÿ íà ýêðàíå ñîîáùåíèå
«Hello, World». Â ëèñòèíãå 2.5 ïðèâåäåíà òàêàÿ ïðîãðàììà VBA, ñîñòîÿùàÿ èç
åäèíñòâåííîé ïðîöåäóðû.

Ëèñòèíã 2.5. Ïðîöåäóðà HelloWorld


1: Sub HelloWorld()
2: MsgBox ”Hello, World!“
3: End Sub

Äëÿ ñàìîñòîÿòåëüíîãî ââîäà ýòîé ïðîãðàììû VBA âûïîëíèòå ñëåäóþùèå


øàãè:
1. Îòêðîéòå ëþáîé äîêóìåíò Word èëè ðàáî÷óþ êíèãó Excel (èëè, íàêîíåö,
ëþáîå ïðòëîæåíèå Microsoft, êîòîðîå ïîääåðæèâàåò VBA) èëè ñîçäàéòå íîâûé
äîêóìåíò èëè ðàáî÷óþ êíèãó.
2. Íàæìèòå Alt+F11 äëÿ àêòèâèçàöèè Ðåäàêòîðà VB.
3. Â Project Explorer âûäåëèòå äîêóìåíò èëè ðàáî÷óþ êíèãó, â êîòîðîé õîòèòå
ñîõðàíèòü ýòó ïðîãðàììó.
4. Âûáåðèòå Insert | Module (âñòàâêà | ìîäóëü), ÷òîáû äîáàâèòü íîâûé ìîäóëü ê
âàøåìó ïðîåêòó. Ðåäàêòîð VB äîáàâëÿåò íîâûé ìîäóëü è îòêðûâàåò äëÿ íåãî
Code Window.
5. Ïåðåèìåíóéòå íîâûé ìîäóëü, äàâ åìó èìÿ, íàïðèìåð, FirstProgram.
6. Óáåäèòåñü, ÷òî êóðñîð âñòàâêè íàõîäèòñÿ â íà÷àëå ïóñòîé ñòðîêè â Code Win-
dow, è ââåäèòå òåêñò, ïîêàçàííûé â ëèñòèíãå 2.5, íàæèìàÿ íà êëàâèøó Enter â
êîíöå êàæäîé ñòðîêè äëÿ íà÷àëà íîâîé ñòðîêè.
Ââîäèòå èñõîäíûé êîä èç ëèñòèíãà 2.5 â ìîäóëü òî÷íî òàê, êàê îí âûãëÿäèò
â ëèñòèíãå, íî áåç íîìåðîâ ñòðîê.
Ðåäàêòîð VB ñîäåðæèò íåñêîëüêî âîçìîæíîñòåé, ïîìîãàþùèõ â íàïèñàíèè
ïðîöåäóð. Âî-ïåðâûõ, êàê òîëüêî âû íàæìåòå íà êëàâèøó Enter ïîñëå ââîäà
êëþ÷åâîãî ñëîâà Sub è èìåíè ïðîöåäóðû, Ðåäàêòîð VB àâòîìàòè÷åñêè
äîáàâëÿåò êëþ÷åâûå ñëîâà End Sub. Òàêèì îáðàçîì, âàì íå íóæíî
74 Ãëàâà 2

áåñïîêîèòüñÿ î òîì, ÷òî âû ìîæåòå ñëó÷àéíî çàáûòü îá ýòîì âàæíîì ýëåìåíòå


ïðîöåäóðû.
Âî-âòîðûõ, Ðåäàêòîð VB âêëþ÷àåò âîçìîæíîñòü, èçâåñòíóþ êàê Auto Quick
Info (êðàòêèå ñâåäåíèÿ). Êàê òîëüêî âû ââîäèòå êëþ÷åâîå ñëîâî MsgBox è
íàæèìàåòå íà êëàâèøó ïðîáåëà (ñòðîêà 2 ëèñòèíãà 2.5), òî÷íåå, ïåðåõîäèòå ê
ñëåäóþùåìó ýëåìåíòó VB-îïåðàòîðà, ïîÿâëÿåòñÿ âñïëûâàþùåå îêíî,
ïîêàçûâàÿ ïîëíûé ñïèñîê àðãóìåíòîâ äëÿ âñòðîåííîé ïðîöåäóðû VBA èëè
ôóíêöèè, êîòîðóþ âû òîëüêî ÷òî ââåëè (MsgBox — â äàííîì ñëó÷àå). Íà
ðèñ. 2.18 ïîêàçàíî âñïëûâàþùåå îêíî ñ èíôîðìàöèåé îá àðãóìåíòàõ
âñòðîåííîé VBA-ïðîöåäóðû MsgBox. Àðãóìåíò, çíà÷åíèå êîòîðîãî, êàê
îæèäàåòñÿ, âû òåïåðü äîëæíû ââåñòè, âûäåëåí ïîëóæèðíûì øðèôòîì âî
âñïëûâàþùåì îêíå Auto Quick Info. [Àðãóìåíò (argument) — ýòî èíôîðìàöèÿ,
êîòîðàÿ íåîáõîäèìà ïðîöåäóðå äëÿ âûïîëíåíèÿ åå çàäà÷è; ïîäðîáíåå îá
àðãóìåíòàõ âû óçíàåòå äàëåå]. Âñïëûâàþùåå îêíî Auto Quick Info çàêðûâàåòñÿ,
åñëè âû íàæèìàåòå íà êëàâèøó Enter äëÿ íà÷àëà íîâîé ñòðîêè â Code Window
èëè èñïîëüçóåòå êëàâèøè ñî ñòðåëêàìè èëè ìûøü äëÿ ïåðåìåùåíèÿ êóðñîðà
âñòàâêè ñ òåêóùåé ñòðîêè íà äðóãóþ. Âû ìîæåòå òàêæå çàêðûòü îêíî Auto
Quick Info, èñïîëüçóÿ êëàâèøó Esc.
Âû ìîæåòå âêëþ÷àòü è âûêëþ÷àòü ôóíêöèþ Auto Quick Info ñ ïîìîùüþ
êîìàíäû Tools | Options (ñåðâèñ | ïàðàìåòðû) â Ðåäàêòîðå VB. Áîëåå ïîäðîáíî î
äèàëîãîâîì îêíå Options (ïàðàìåòðû) ìîæíî óçíàòü èç ñïðàâî÷íîé ñèñòåìû
Ðåäàêòîðà VB.
Êàæäîå îáúÿâëåíèå ïðîöåäóðû äîëæíî íà÷èíàòüñÿ ñ êëþ÷åâîãî ñëîâà Sub,
çà êîòîðûì ñëåäóåò ïðîáåë è çàòåì — èìÿ ïðîöåäóðû. Â ëèñòèíãå 2.5 èìåíåì
ïðîöåäóðû ÿâëÿåòñÿ HelloWorld. Ôèíàëüíàÿ ÷àñòü îáúÿâëåíèÿ ïðîöåäóðû —
ýòî ïàðà ïóñòûõ êðóãëûõ ñêîáîê. Ýòè ñêîáêè îáÿçàòåëüíû. (Âû óçíàåòå î èõ
íàçíà÷åíèè â ñëåäóþùèõ ãëàâàõ). Åñëè âû íå âêëþ÷àåòå ýòè ñêîáêè, VBA
äîáàâëÿåò èõ â îáúÿâëåíèå ïðîöåäóðû, êîãäà êóðñîð âñòàâêè óáèðàåòñÿ âàìè
èç ñòðîêè îáúÿâëåíèÿ.
Âòîðàÿ ñòðîêà â ëèñòèíãå 2.5 îáðàçóåò òåëî ïðîöåäóðû è ÿâëÿåòñÿ
åäèíñòâåííûì îïåðàòîðîì, âûïîëíÿþùèì «ïîëåçíóþ» ðàáîòó. Òåëî
ïðîöåäóðû ìîæåò ñîñòîÿòü èç îäíîãî èëè ìíîãèõ îïåðàòîðîâ èëè íå ñîñòîÿòü
íè èç îäíîãî îïåðàòîðà. Îïåðàòîð MsgBox îòîáðàæàåò ñîîáùåíèå â äèàëîãîâîì
îêíå íà ýêðàíå è îïèñûâàåòñÿ áîëåå ïîäðîáíî äàëåå â ýòîé ãëàâå.
Òðåòüÿ è ïîñëåäíÿÿ ñòðîêà ïðîöåäóðû HelloWorld — End Sub — çàâåðøàåò
ïðîöåäóðó. Ýòà ñòðîêà ñîîáùàåò VBA î òîì, ÷òî ýòî — êîíåö ïðîöåäóðû; VBA
ïðåêðàùàåò âûïîëíåíèå ïðîöåäóðû ïðè äîñòèæåíèè èì ýòîé ñòðîêè. Ïîäîáíî
îáúÿâëåíèþ ïðîöåäóðû îïåðàòîð End Sub äîëæåí áûòü ïåðâûìè äâóìÿ
ñëîâàìè â ñòðîêå è äîëæåí áûòü îäèí â ñòðîêå, õîòÿ âû ìîæåòå äîáàâëÿòü
êîíå÷íûé êîììåíòàðèé ïîñëå íåãî. Êàê áûëî óïîìÿíóòî ðàíåå, Ðåäàêòîð VB
àâòîìàòè÷åñêè äîáàâëÿåò ýòó ñòðîêó, ïîñëå òîãî, êàê âû ââåäåòå îáúÿâëåíèå
ïðîöåäóðû.
Ïîñëå òîãî êàê âû ââåäåòå èñõîäíûé êîä äëÿ ïðîöåäóðû HelloWorld,
âûïîëíèòå åå: ïîìåñòèâ êóðñîð âñòàâêè â ëþáóþ ñòðîêó òåêñòà ïðîöåäóðû,
ùåëêíèòå íà êíîïêå Run (Çàïóñê).
Êîãäà VBA âûïîëíÿåò ïðîöåäóðó HelloWorld, îí îòîáðàæàåò äèàëîãîâîå
îêíî, ïîêàçàííîå íà ðèñ. 2.19. Òî÷íûé çàãîëîâîê ýòîãî äèàëîãîâîãî îêíà
çàâèñèò îò òîãî, â êàêîì host-ïðèëîæåíèè (Word, Excel è ò.ä.) âû ñîçäàëè
Ðåäàêòèðîâàíèå ìàêðîñîâ 75

ïðîöåäóðó. Ùåëêíèòå íà êíîïêå OK äëÿ óñòàíîâêè äèàëîãîâîãî îêíà â


èñõîäíîå ñîñòîÿíèå è çàâåðøåíèÿ ïðîöåäóðû.

Ðèñ. 2.18
Âñïëûâàþùåå
îêíî Auto Quick
Info äëÿ MsgBox

Çàìåòüòå, ÷òî äàæå â ýòîé êîðîòêîé ïðîöåäóðå òåëî ïðîöåäóðû ðàñïîëîæåíî


ñ îòñòóïîì äëÿ îòäåëåíèÿ åãî îò îáúÿâëåíèÿ è êîíöà ïðîöåäóðû. Ñëåäóåò
âñåãäà ðàçìåùàòü êîä ñ îòñòóïîì, ÷òîáû åãî áûëî ëåã÷å ÷èòàòü. Ñðàâíèòå
ëèñòèíã 2.5 ñî ñëåäóþùèìè äàëåå ñòðîêàìè êîäà; âû âèäèòå, ÷òî äàæå
êîðîòêèå ïðîöåäóðû ëåã÷å ÷èòàòü, åñëè ñòðîêè â íèõ ðàñïîëîæåíû ñ îòñòóïîì.
1: Sub HelloMacro()
2: MsgBox “Hello, World!”
3: End Sub

Ñâîéñòâî Auto-Indent (àâòîîòñòóï)


Òåêñòîâûé ðåäàêòîð VBA ñîäåðæèò ñâîéñòâî, íàçûâàåìîå àâòîìàòè÷åñêèé
îòñòóï (auto indenting), ïîçâîëÿþùåå ôîðìàòèðîâàòü èñõîäíûé êîä ñ
ðàçëè÷íûìè óðîâíÿìè îòñòóïà. Åñëè ñâîéñòâî àâòîìàòè÷åñêîãî îòñòóïà
âêëþ÷åíî, òî âñÿêèé ðàç, êîãäà âû íàæèìàåòå íà Enter, ÷òîáû íà÷àòü íîâóþ
ñòðîêó, êóðñîð âñòàâêè íà íîâîé ñòðîêå àâòîìàòè÷åñêè ïåðåìåùàåòñÿ â
ïîëîæåíèå, ñîâïàäàþùåå ñ óðîâíåì îòñòóïà ñòðîêè, ðàñïîëîæåííîé âûøå.
(Íàæìèòå íà Backspace, ÷òîáû âåðíóòüñÿ ê ïðåäûäóùåìó óðîâíþ îòñòóïà).
Äëÿ âêëþ÷åíèÿ è âûêëþ÷åíèÿ àâòîìàòè÷åñêîãî îòñòóïà óñòàíàâëèâàéòå
èëè îòêëþ÷àéòå ôëàæîê Auto Indent (àâòîîòñòóï) íà âêëàäêå Editor (ðåäàêòîð)
äèàëîãîâîãî îêíà Options (ïàðàìåòðû). Ñâîéñòâî àâòîìàòè÷åñêîãî îòñòóïà
ÿâëÿåòñÿ âêëþ÷åííûì ïî óìîë÷àíèþ.

Ðèñ. 2.19
Ðåçóëüòàò âûïîëíåíèÿ ìàêðîñà HelloWorld

Çàïóñê ïðîöåäóðû âî âðåìÿ ðåäàêòèðîâàíèÿ


Íåçàâèñèìî îò òîãî, ïèøåòå ëè âû íîâóþ ïðîöåäóðó èëè ðåäàêòèðóåòå
çàïèñàííûé ìàêðîñ, âàì ïîòðåáóåòñÿ çàïóñêàòü ýòó ïðîöåäóðó äëÿ ïðîâåðêè
76 Ãëàâà 2

ðåçóëüòàòîâ âàøèõ óñèëèé. Âû óæå çíàåòå, êàê èñïîëüçîâàòü äèàëîãîâîå îêíî


Macros äëÿ çàïóñêà ìàêðîñà èëè ïðîöåäóðû; âû ìîæåòå èõ òàêæå çàïóñêàòü
íåïîñðåäñòâåííî èç ìîäóëÿ âî âðåìÿ ðåäàêòèðîâàíèÿ. Åñëè êóðñîð âñòàâêè â
ìîìåíò âûáîðà ýëåìåíòà ìåíþ Run, áóäåò íàõîäèòüñÿ íà òåêñòå ïðîöåäóðû,
êîòîðàÿ íå ìîæåò áûòü âûïîëíåíà, Ðåäàêòîð VB ïðåäëîæèò âàì âûáðàòü
ïðîöåäóðó èç ñïèñêà âîçìîæíûõ ïðîöåäóð.

Îòîáðàæåíèå ñîîáùåíèé äëÿ ïîëüçîâàòåëÿ ïðîöåäóðû


Ëèñòèíã 2.5 âêëþ÷àåò VBA-îïåðàòîð MsgBox, êîòîðûé ìîæíî èñïîëüçîâàòü
äëÿ îòîáðàæåíèÿ ïðîöåäóðàìè ñîîáùåíèÿ íà ýêðàíå (ðèñ. 2.19). Ñîîáùåíèÿ
èëè äðóãàÿ èíôîðìàöèÿ, êîòîðóþ ïðîöåäóðà îòîáðàæàåò íà ýêðàíå, ïåðåñûëà-
åò íà ïðèíòåð èëè çàïèñûâàåò â äèñêîâûé ôàéë, íàçûâàåòñÿ âûõîäîì (output).
Îïåðàòîð MsgBox ÿâëÿåòñÿ ïðîñòåéøåé ôîðìîé ýêðàííîãî âûõîäà, êîòîðóþ âû
ìîæåòå âêëþ÷àòü â ïðîöåäóðû VBA.
Îïåðàòîð MsgBox ïîäîáåí âñòðîåííîé â VBA ïðîöåäóðå. Ñòðîêà â ïðîöåäóðå
HelloWorld, ñîäåðæàùàÿ îïåðàòîð MsgBox, ñîîáùàåò VBA, ÷òî íåîáõîäèìî âû-
çâàòü ýòó âñòðîåííóþ ïðîöåäóðó. Îïåðàòîð MsgBox èç ëèñòèíãà 2.5 ïðèâåäåí
íèæå åùå ðàç:
MsgBox "Hello, World!"

Òåêñò, çàêëþ÷åííûé â êàâû÷êè, â ýòîé ñòðîêå ïîñëå èìåíè ïðîöåäóðû


MsgBox — ýòî òåêñò ñîîáùåíèÿ, êîòîðîå äîëæíî îòîáðàæàòüñÿ ñ ïîìîùüþ
MsgBox. VBA ïåðåäàåò ýòó èíôîðìàöèþ ïðîöåäóðå MsgBox. Èíôîðìàöèÿ, ïå-
ðåäàâàåìàÿ ïðîöåäóðå, êîòîðóþ âûçûâàåò èñõîäíûé êîä, íàçûâàåòñÿ àðãóìåí-
òîì (argument) äëÿ ýòîé ïðîöåäóðû. Òåêñò «Hello, World!» ÿâëÿåòñÿ àðãóìåí-
òîì äëÿ ïðîöåäóðû MsgBox. Äâîéíûå êàâû÷êè (") â àðãóìåíòå «Hello, World!»
óêàçûâàþò íà òî, ÷òî òåêñò, çàêëþ÷åííûé â íèõ, ÿâëÿåòñÿ äàííûìè äëÿ ïðîöå-
äóðû, à íå èíñòðóêöèÿìè, êîòîðûå äîëæåí âûïîëíèòü VBA.
Îáðàòèìñÿ åùå ðàç ê ðèñóíêó 2.19 è çàìåòèì, ÷òî ñòðîêà çàãîëîâêà â äèàëî-
ãîâîì îêíå, îòîáðàæàåìîì îïåðàòîðîì MsgBox, ñîäåðæèò ñëîâà «Microsoft
Word». Ïî óìîë÷àíèþ äèàëîãîâîå îêíî, îòîáðàæàåìîå îïåðàòîðîì MsgBox,
èìååò çàãîëîâîê, óêàçûâàþùèé íà host-ïðèëîæåíèå, âûïîëíÿþùåå ïðîöåäóðó
VBA (â äàííîì ñëó÷àå — Microsoft Word).
Âû ìîæåòå èçìåíèòü çàãîëîâîê äèàëîãîâîãî îêíà, êîòîðîå îòîáðàæàåò MsgBox.
Ëèñòèíã 2.6 ïîêàçûâàåò ïðîöåäóðó HelloWorld èç ëèñòèíãà 2.5 ñ îïåðàòîðîì
MsgBox, èçìåíåííûì òàêèì îáðàçîì, ÷òî îí îòîáðàæàåò äèàëîãîâîå îêíî, ïîêà-
çàííîå íà ðèñ. 2.20. Ñðàâíèòå ðèñ. 2.19 è 2.20 è îáðàòèòå âíèìàíèå, ÷òî òåïåðü
çàãîëîâêîì äèàëîãîâîãî îêíà MsgBox ÿâëÿåòñÿ òåêñò «Îêíî ïðèâåòñòâèÿ».

Ëèñòèíã 2.6. Îòîáðàæåíèå íàñòðàèâàåìîé ñòðîêè çàãîëîâêà ñ ïîìîùüþ MsgBox


1: Sub HelloMacro()
2: MsgBox "Hello, World!", , "Îêíî ïðèâåòñòâèÿ"
3: End Sub

Îïåðàòîð MsgBox (ñòðîêà 2 ëèñòèíãà 2.6) òåïåðü îòëè÷àåòñÿ îò èñïîëüçóåìî-


ãî â ïðåäûäóùåì ëèñòèíãå, õîòÿ âûïîëíÿåò òó æå ñàìóþ çàäà÷ó â ïðîöåäóðå —
îòîáðàæàòü ñîîáùåíèå äëÿ ïîëüçîâàòåëÿ. Â ëèñòèíãå 2.6 îïåðàòîð MsgBox èìå-
Ðåäàêòèðîâàíèå ìàêðîñîâ 77

åò òðè àðãóìåíòà (êîòîðûå ñëåäóþò ïîñëå íåãî); êàæäûé àðãóìåíò îòäåëÿåòñÿ


îò äðóãèõ çàïÿòîé.

Ðèñ. 2.20
Ðåçóëüòàò âûïîëíåíèÿ êîäà ëèñòèíãà 2.6

Ïåðâûé àðãóìåíò îïåðàòîðà MsgBox òàêîé æå, êàê â ëèñòèíãå 2.5, è


ÿâëÿåòñÿ òåêñòîì, êîòîðûé äîëæåí áûòü îòîáðàæåí ïîñðåäñòâîì MsgBox
(ïîêàçàííûé âî âñïëûâàþùåì îêíå Quick Info êàê àðãóìåíò Prompt). Ïîñêîëüêó
ýòîò âàðèàíò îïåðàòîðà MsgBox èìååò áîëåå îäíîãî àðãóìåíòà, çà ïåðâûì
àðãóìåíòîì ñëåäóåò çàïÿòàÿ; ñïèñêè àðãóìåíòîâ (argument lists) â ïðîöåäóðàõ
VBA îòäåëÿþòñÿ çàïÿòûìè, òî÷íî òàê, êàê ýëåìåíòû â êàêîì-ëèáî ñïèñêå.
Êàê òîëüêî âû ââåëè çàïÿòóþ, îòäåëÿþùóþ ïåðâûé àðãóìåíò îò âòîðîãî,
âû, âåðîÿòíî, çàìåòèëè, ÷òî âñïëûâàþùåå îêíî Quick Info èçìåíÿåòñÿ:
àðãóìåíò Buttons â îêíå Quick Info âûäåëÿåòñÿ ïîëóæèðíûì øðèôòîì, òîãäà
êàê àðãóìåíò Prompt îòîáðàæàåòñÿ îïÿòü îáû÷íûì øðèôòîì.  òî æå âðåìÿ â
ìîäóëå ïîÿâëÿåòñÿ ðàñêðûâàþùèéñÿ ñïèñîê; ýòîò ñïèñîê ñîäåðæèò âñå
âîçìîæíûå çíà÷åíèÿ äëÿ àðãóìåíòà Buttons. Ïîÿâëÿþùèéñÿ ñïèñîê ÿâëÿåòñÿ
ðåçóëüòàòîì ñâîéñòâà Auto Data Tips (ïîäñêàçêà çíà÷åíèé äàííûõ) Ðåäàêòîðà
VB. Ýòî ñâîéñòâî ðàáîòàåò ïîäîáíî ñâîéñòâó Auto Quick Info, íî îòîáðàæàåò
ñïèñêè äîïóñòèìûõ çíà÷åíèé äëÿ àðãóìåíòîâ ïðîöåäóðû è äðóãèõ ýëåìåíòîâ â
êîäå VBA.
Âòîðîé àðãóìåíò îïåðàòîðà MsgBox ÿâëÿåòñÿ íåîáÿçàòåëüíûì; â äàííîì
ïðèìåðå íåîáÿçàòåëüíûé âòîðîé àðãóìåíò îïóùåí. Ïîñêîëüêó íåîáÿçàòåëüíûé
àðãóìåíò îïóñêàåòñÿ, â ñïèñêå àðãóìåíòîâ èìååòñÿ îäèí ñèìâîë ïðîáåëà. Ýòîò
ïðîáåë óêàçûâàåò VBA íà òî, ÷òî â ýòîì ñïèñêå ïðîïóùåí íåîáÿçàòåëüíûé
àðãóìåíò. Çà ñèìâîëîì ïðîáåëà ñëåäóåò çàïÿòàÿ, ÷òîáû îòäåëèòü åãî îò
ñëåäóþùåãî àðãóìåíòà â ñïèñêå. Åñëè âû íå ââåäåòå ñèìâîë ïðîáåëà ìåæäó
äâóìÿ çàïÿòûìè, Ðåäàêòîð VB äîáàâëÿåò åãî (ñêîðî âû çàìåòèòå, ÷òî Ðåäàêòîð
VB î÷åíü ÷àñòî äîáàâëÿåò òî, ÷òî, ïî åãî «ìíåíèþ» íóæíî äîáàâèòü, è óáèðàåò
ëèøíåå, íàïðèìåð, ïðîáåëû).
Íåîáÿçàòåëüíûé âòîðîé àðãóìåíò â îïåðàòîðå MsgBox — ýòî àðãóìåíò But-
tons. Îí ïîÿâëÿåòñÿ âî âñïëûâàþùåì îêíå Auto Quick Info, çàêëþ÷åííûì â
êâàäðàòíûå ñêîáêè äëÿ óêàçàíèÿ òîãî, ÷òî ýòî — íåîáÿçàòåëüíûé àðãóìåíò.
Àðãóìåíò Buttons îïðåäåëÿåò, ñêîëüêî è êàêîãî òèïà êîìàíäíûå êíîïêè
ïîÿâëÿþòñÿ â äèàëîãîâîì îêíå, îòîáðàæàåìîì ïîñðåäñòâîì MsgBox. Êîãäà âû
îïóñêàåòå íåîáÿçàòåëüíûé âòîðîé àðãóìåíò (êàê â ýòîì ïðèìåðå), äèàëîãîâîå
îêíî, êîòîðîå îòîáðàæàåò MsgBox, ñîäåðæèò òîëüêî îäíó êíîïêó — êíîïêó OK.
(Ïîäðîáíåå î íåîáÿçàòåëüíîì àðãóìåíòå Buttons îïèñûâàåòñÿ â ñëåäóþùèõ
ãëàâàõ).
Òðåòèé è ïîñëåäíèé àðãóìåíò â îïåðàòîðå MsgBox îïðåäåëÿåò çàãîëîâîê
äèàëîãîâîãî îêíà (ðèñ. 2.20). Êàê òîëüêî âû ââîäèòå çàïÿòóþ, îòäåëÿþùóþ
âòîðîé è òðåòèé àðãóìåíòû â ñïèñêå àðãóìåíòîâ îïåðàòîðà MsgBox,
âñïëûâàþùåå îêíî Auto Quick Info óêàçûâàåò, ÷òî âû òåïåðü äîëæíû ââåñòè
çíà÷åíèå àðãóìåíòà äëÿ àðãóìåíòà Title.
Ïîäîáíî ïåðâîìó àðãóìåíòó òåêñò äëÿ ñòðîêè çàãîëîâêà äèàëîãîâîãî îêíà
çàêëþ÷àåòñÿ â êàâû÷êè (“”). VBA âñåãäà âîñïðèíèìàåò çàêëþ÷åííûé â
78 Ãëàâà 2

êàâû÷êè òåêñò êàê äàííûå, à íå êàê òåêñò, ñîäåðæàùèé ïðîãðàììíûå


èíñòðóêöèè. Åñëè âû îïóñòèòå êàâû÷êè äëÿ òåêñòà ñîîáùåíèÿ MsgBox èëè äëÿ
òåêñòà ñòðîêè çàãîëîâêà äèàëîãîâîãî îêíà, VBA îòîáðàçèò ñîîáùåíèå îá
îøèáêå. Ïîñêîëüêó òðåòèé àðãóìåíò ÿâëÿåòñÿ òàêæå è ïîñëåäíèì, íèêàêîé
çàïÿòîé ïîñëå òðåòüåãî àðãóìåíòà íå òðåáóåòñÿ.

Ñîîáùåíèÿ îá îøèáêàõ âî âðåìÿ íàïèñàíèÿ, ðåäàêòèðîâàíèÿ èëè


âûïîëíåíèÿ ïðîöåäóðû
Ïðè íàïèñàíèè èëè ðåäàêòèðîâàíèè ïðîöåäóðû, âû ìîæåòå ñäåëàòü îøèá-
êè â îïåðàòîðàõ. VBA îïðåäåëÿåò ìíîãèå èç ýòèõ îøèáîê âî âðåìÿ íàïèñàíèÿ
è ðåäàêòèðîâàíèÿ âàìè èñõîäíîãî êîäà è ìîæåò îáíàðóæèòü íåêîòîðûå îøèá-
êè ïðè âûïîëíåíèè ïðîöåäóðû.

Îøèáêè ñèíòàêñèñà
Ñèíòàêñèñîì (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

Ïîñêîëüêó òðåòèé àðãóìåíò âîñïðèíèìàåòñÿ êàê ïåðåìåííàÿ ñ èìåíåì ïðè-


âåòñòâèÿ, VBA «îæèäàåò» çàïÿòóþ èëè êîíåö ñïèñêà àðãóìåíòîâ äëÿ ïðîöåäó-
ðû MsgBox. Âìåñòî ýòîãî, VBA íàõîäèò ñèìâîë ïðîáåëà, çà êîòîðûì ñëåäóåò,
êàê ýòî êàæåòñÿ, èìÿ äðóãîé ïåðåìåííîé. VBA îòîáðàæàåò âñþ ñòðîêó êðàñ-
íûì öâåòîì, ÷òîáû óêàçàòü, ÷òî îíà ñîäåðæèò îøèáêó, âûäåëÿåò ñëîâî èëè
ñèìâîë â òîì ìåñòå ñòðîêè, ãäå, ïî îïðåäåëåíèþ VBA, íàõîäèòñÿ îøèáêà, è çà-
òåì îòîáðàæàåò äèàëîãîâîå îêíî, ïîêàçàííîå íà ðèñ. 2.21.
Åñëè âû ïîëó÷àåòå ïîäîáíîå ñîîáùåíèå îá îøèáêå ñèíòàêñèñà èëè
êîìïèëèðîâàíèÿ, ùåëêíèòå íà êíîïêå Ñïðàâêà (Help) äëÿ äîñòóïà ê ñïðàâî÷íîé

Ðèñ. 2.21
Äèàëîãîâîå
îêíîVBA ñ
óêàçàíèåì îøèáêè

ñèñòåìå VBA è ïîëó÷åíèÿ áîëåå ïîäðîáíîé èíôîðìàöèè î êîíêðåòíîé


âñòðåòèâøåéñÿ îøèáêå ñèíòàêñèñà, õîòÿ äîâîëüíî ÷àñòî ñïðàâî÷íîé èíôîð-
ìàöèè âàì áóäåò íåäîñòàòî÷íî äëÿ âûÿñíåíèÿ äåéñòâèòåëüíîé ïðè÷èíû âîç-
íèêíîâåíèÿ îøèáêè.
Äëÿ óäàëåíèÿ äèàëîãîâîãî îêíà ùåëêíèòå íà êíîïêå ÎÊ. Ïîñëå óäàëåíèÿ ñ
ýêðàíà äèàëîãîâîãî îêíà ñ ñîîáùåíèåì îá îøèáêå ïîïðîáóéòå óñòðàíèòü îøèá-
êó. Âû ìîæåòå ïåðåìåñòèòü êóðñîð âñòàâêè ñî ñòðîêè ïîñëå óäàëåíèÿ äèàëîãî-
âîãî îêíà, íî ñòðîêà îñòàåòñÿ îòîáðàæåííîé êðàñíûì öâåòîì äëÿ óêàçàíèÿ íà
òî, ÷òî â íåé ñîäåðæèòñÿ îøèáêà. VBA íå àíàëèçèðóåò è íå êîìïèëèðóåò ñòðî-
êó, ñîäåðæàùóþ îøèáêó ñèíòàêñèñà ñíîâà, ïîêà âû íå çàïóñòèòå ïðîöåäóðó
èëè íå îòðåäàêòèðóåòå ýòó ñòðîêó. VBA àíàëèçèðóåò ñòðîêè â ïðîöåäóðå òîëü-
êî òîãäà, êîãäà âû óáèðàåòå êóðñîð âñòàâêè ñî ñòðîêè íåïîñðåäñòâåííî ïîñëå
âíåñåíèÿ èçìåíåíèé èëè êîãäà çàïóñêàåòå ïðîöåäóðó. Åñëè ïðè âûïîëíåíèè
ïðîöåäóðû âñòðå÷àåòñÿ ñòðîêà ñ ñèíòàêñè÷åñêîé îøèáêîé, âûïîëíåíèå êîäà
ïðåêðàùàåòñÿ, îòîáðàæàåòñÿ ìîäóëü, ñîäåðæàùèé ïðîöåäóðó, â êîòîðîé èìå-
åòñÿ îøèáêà ñèíòàêñèñà, âûäåëÿåòñÿ êîíêðåòíàÿ ñòðîêà â ìîäóëå, ãäå îáíàðó-
æåíà îøèáêà, è îòîáðàæàåòñÿ äèàëîãîâîå îêíî ñ ñîîáùåíèåì îá îøèáêå.
Äèàëîãîâîå îêíî, êîòîðîå VBA îòîáðàæàåò äëÿ îøèáêè ñèíòàêñèñà, îáíàðó-
æåííîé ïðè âûïîëíåíèè ïðîöåäóðû, îáû÷íî ñîäåðæèò ãîðàçäî ìåíüøå äåòà-
ëåé î êîíêðåòíîé îøèáêå, ÷åì äèàëîãîâîå îêíî, êîòîðîå VBA îòîáðàæàåò, êî-
ãäà îáíàðóæèâàåò îøèáêó ñèíòàêñèñà ïîñëå òîãî, êàê âû íàïèøåòå èëè èçìå-
íèòå ñòðîêó. Ïî ýòîé ïðè÷èíå (è äëÿ òîãî, ÷òîáû èçáåæàòü ïðîáëåì,
âûçâàííûõ íåîæèäàííûì ïðåðûâàíèåì âûïîëíåíèÿ ïðîöåäóðû) ñëåäóåò âñå-
ãäà ñòàðàòüñÿ èñïðàâëÿòü îøèáêè ñèíòàêñèñà, êîãäà VBA èõ îáíàðóæèâàåò
âïåðâûå.
80 Ãëàâà 2

VBA îáíàðóæèâàåò ìíîãèå îøèáêè ñèíòàêñèñà, èíôîðìèðóÿ î ïðîïóùåí-


íûõ çàïÿòûõ, êàâû÷êàõ è òàê äàëåå. Îäíàêî íå âñÿêîå ñîîáùåíèå îá îøèáêå
òàêîå ïîíÿòíîå, êàê õîòåëîñü áû.  íåêîòîðûõ ñëó÷àÿõ VBA íå ìîæåò îïðåäå-
ëèòü, ÷òî èìåííî íåâåðíî â ñèíòàêñèñå êîíêðåòíîãî îïåðàòîðà, à òîëüêî ñîîá-
ùàåò îá èìåþùåéñÿ îøèáêå.

Îøèáêè âðåìåíè èñïîëíåíèÿ


Âû ìîæåòå ñîçäàòü ñèíòàêñè÷åñêè ïðàâèëüíûé îïåðàòîð VBA, êîòîðûé âñå
æå íå âûïîëíÿåòñÿ ïðàâèëüíî. Îøèáêè, êîòîðûå âûÿâëÿþòñÿ òîëüêî ïðè
ôàêòè÷åñêîì âûïîëíåíèè ïðîöåäóðû, íàçûâàþòñÿ îøèáêàìè âðåìåíè
èñïîëíåíèÿ (runtime errors) èëè runtime-îøèáêàìè. Ñóùåñòâóþò ðàçëè÷íûå
òèïû òàêèõ îøèáîê. Îíè îáû÷íî âûçâàíû ïðîïóñêîì àðãóìåíòîâ ïðîöåäóðû,
àðãóìåíòàìè íåâåðíîãî òèïà äàííûõ, ïðîïóñêîì êëþ÷åâûõ ñëîâ, ïîïûòêàìè
äîñòóïà ê íåñóùåñòâóþùèì äðàéâåðàì äèñêà è ïàïêàì êàòàëîãà èëè
îøèáêàìè â ëîãèêå.
Ðàññìîòðèì ñëåäóþùèé îïåðàòîð VBA, êîòîðûé ñíîâà ñîäåðæèò
íåïðàâèëüíûé îïåðàòîð MsgBox:
MsgBox “Hello, World!”, “Îêíî ïðèâåòñòâèÿ”
 ýòîì ïðèìåðå VBA íå íàõîäèò íè÷åãî íåâåðíîãî â ñèíòàêñèñå îïåðàòîðà
MsgBox: òåêñò äàííûõ ïðàâèëüíî çàêëþ÷åí â êàâû÷êè è ñïèñîê àðãóìåíòîâ
ïðàâèëüíî ðàçäåëåí çàïÿòûìè. (Ïîñêîëüêó âñå àðãóìåíòû, êðîìå ïåðâîãî äëÿ
MsgBox ÿâëÿþòñÿ íåîáÿçàòåëüíûìè, VBA ïðèíèìàåò äâà àðãóìåíòà äëÿ
MsgBox â êà÷åñòâå ïðàâèëüíîãî ñèíòàêñèñà.) Îäíàêî êîãäà VBA ïûòàåòñÿ âû-
ïîëíèòü îïåðàòîð â ýòîé ñòðîêå, îí îòîáðàæàåò äèàëîãîâîå îêíî ñ ñîîáùåíèåì
îá îøèáêå, ïîêàçàííîå íà ðèñ. 2.22.

Ðèñ. 2.22
Íåêîòîðûå îøèáêè VBA îáíàðóæèâàåò âî
âðåìÿ âûïîëíåíèÿ ìàêðîñà

Ýòî äèàëîãîâîå îêíî èíôîðìèðóåò î òîì, ÷òî âîçíèêëà îøèáêà ïðè âûïîë-
íåíèè ïðîöåäóðû, è îòîáðàæàåò ñîîáùåíèå, îïèñûâàþùåå ýòó îøèáêó. Â äàí-
íîì ñëó÷àå îøèáêîé ÿâëÿåòñÿ îøèáêà íåñîîòâåòñòâèÿ òèïà (type mismatch
error). Íî ýòî íå îçíà÷àåò, ÷òî âû èñïîëüçîâàëè íåïðàâèëüíûé òèï äàííûõ, ê
ýòîìó íåñîîòâåòñòâèþ ìîãëà ïðèâåñòè êàêàÿ-òî äðóãàÿ îøèáêà.
Åñëè âû åùå ðàç ïîñìîòðèòå íà âûøåïðèâåäåííûé îïåðàòîð MsgBox, òî ìî-
æåòå çàìåòèòü, ÷òî îòñóòñòâóåò çàïÿòàÿ, îòìå÷àþùàÿ ìåñòî äëÿ íåîáÿçàòåëü-
íîãî MsgBox-àðãóìåíòà Buttons.
Êîãäà VBA àíàëèçèðóåò ýòîò îïåðàòîð, çàêëþ÷åííûé â êàâû÷êè òåêñò
«Îêíî ïðèâåòñòâèÿ» êîìïèëèðóåòñÿ êàê âòîðîé àðãóìåíò MsgBox, à íå êàê
òðåòèé àðãóìåíò èç-çà ïðîïóùåííîé çàïÿòîé. Ïîñêîëüêó àðãóìåíò êîìàíäíîé
êíîïêè (âòîðîé ïî ñïèñêó) äîëæåí áûòü ÷èñëîì, à íå òåêñòîì, VBA ñîîáùàåò î
Ðåäàêòèðîâàíèå ìàêðîñîâ 81

òîì, ÷òî òèï äàííûõ, ïåðåäàâàåìûé ïðîöåäóðå MsgBox, íå ñîâïàäàåò ñ òèïîì


äàííûõ, îæèäàåìûõ äëÿ ýòîãî àðãóìåíòà. (Áîëåå ïîäðîáíî î òèïàõ äàííûõ ðàñ-
ñêàçûâàåòñÿ â ñëåäóþùåé ãëàâå.)
Äèàëîãîâîå îêíî äëÿ ñîîáùåíèé îá îøèáêàõ âðåìåíè èñïîëíåíèÿ ñîäåðæèò
íåñêîëüêî êîìàíäíûõ êíîïîê. Äàëåå îïèñûâàåòñÿ êàæäàÿ èç ýòèõ êíîïîê:
¨ Continue (ïðîäîëæèòü) — Âûáèðàéòå ýòó êîìàíäíóþ êíîïêó äëÿ ïðîäîë-
æåíèÿ ïðîöåäóðû. Íåêîòîðûå îøèáêè âðåìåíè èñïîëíåíèÿ ïîçâîëÿþò
ïðîäîëæàòü âûïîëíåíèå ïðîöåäóðû; îäíàêî äëÿ áîëüøèíñòâà òàêèõ îøè-
áîê ýòà êíîïêà îòêëþ÷åíà.
¨ End (çàâåðøèòü) — Âûáèðàéòå ýòó êíîïêó, ÷òîáû çàêîí÷èòü ïðîöåäóðó.
¨ Debug (îòëàäêà) — Âûáèðàéòå ýòó êíîïêó äëÿ ïåðåõîäà â ðåæèì ïðåðûâà-
íèÿ è èñïîëüçóéòå âîçìîæíîñòè îòëàäêè Ðåäàêòîðà VB äëÿ îòñëåæèâà-
íèÿ è ðåøåíèÿ ëþáîé ïðîáëåìû, âûçâàííîé îøèáêîé âðåìåíè èñïîëíå-
íèÿ.
¨ Help (ñïðàâêà) — Ýòà êîìàíäà ïðåäîñòàâëÿåò äîñòóï ê ñïðàâî÷íîé ñèñòåìå
VBA è îòîáðàæàåò òåêñò ïîäñêàçêè, îïèñûâàþùèé êîíêðåòíóþ îøèáêó
âðåìåíè èñïîëíåíèÿ, êîòîðàÿ âîçíèêëà. Èñïîëüçóéòå ýòó êíîïêó, ÷òîáû
ïîëó÷èòü áîëüøå èíôîðìàöèè, åñëè âàì íå ïîíÿòíî, ÷òî îçíà÷àåò äàííàÿ
îøèáêà âðåìåíè èñïîëíåíèÿ.
Åñëè âû íå ïîíèìàåòå, ïî÷åìó èñïîëüçîâàíèå îïðåäåëåííîãî êëþ÷åâîãî
ñëîâà VBA èëè ïðîöåäóðû ïðèâîäèò ê îøèáêå âðåìåíè èñïîëíåíèÿ, âû ìîæå-
òå ïîëó÷èòü ñïðàâêó ïî ýòîìó êîíêðåòíîìó êëþ÷åâîìó ñëîâó èëè ïðîöåäóðå,
ïîìåñòèâ êóðñîð íà ýòîì ñëîâå è íàæàâ íà êëàâèøó F1. VBA îòîáðàæàåò ðàçäåë
ñïðàâî÷íîé ñèñòåìû äëÿ ýòîãî êëþ÷åâîãî ñëîâà èëè ïðîöåäóðû, åñëè òàêîâîé
èìååòñÿ.

Ïå÷àòü èñõîäíîãî êîäà


 íåêîòîðûé ìîìåíò âðåìåíè âàì ìîæåò ïîíàäîáèòüñÿ ðàñïå÷àòàòü
êàêîé-ëèáî èñõîäíûé êîä VBA. Ìîæåò ïîÿâèòüñÿ íåîáõîäèìîñòü ïå÷àòè â
öåëÿõ àðõèâèðîâàíèÿ èëè äîêóìåíòèðîâàíèÿ, äåìîíñòðàöèè èëè èçó÷åíèÿ
êîäà. Ñëåäóåò ÷àùå ÷èòàòü è ñâîé êîä, è êîä áîëåå îïûòíûõ ïîëüçîâàòåëåé.
×òåíèå áóìàæíîé êîïèè êîäà ïðèíîñèò äîâîëüíî íåîæèäàííûå ðåçóëüòàòû —
èíîãäà õî÷åòñÿ (è ñëåäóåò) ïðîñòî ïåðåïèñàòü âåñü êîä è íàäåÿòüñÿ, ÷òî ñòàðóþ
âåðñèþ íèêòî, êðîìå âàñ, íå âèäåë.
Ïðè ïå÷àòè èñõîäíîãî êîäà VBA ìîæíî ïå÷àòàòü âñå ìîäóëè â ïðîåêòå èëè
òîëüêî ìîäóëü òåêóùåãî âûáîðà. Íåëüçÿ âûäåëÿòü äëÿ ïå÷àòè îòäåëüíûå
ïðîöåäóðû.
×òîáû íàïå÷àòàòü èñõîäíûé êîä, âûïîëíÿéòå ñëåäóþùèå øàãè:
1. Â Project Explorer âûäåëèòå ìîäóëü èëè ïðîåêò, êîòîðûé âàì íåîáõîäèìî
ïå÷àòàòü. Åñëè âû õîòèòå ïå÷àòàòü òîëüêî âûäåëåííûé òåêñò â ìîäóëå,
âûâåäèòå ìîäóëü íà ýêðàí è âûäåëèòå òåêñò, êîòîðûé íåîáõîäèìî ïå÷àòàòü.
2. Âûáåðèòå êîìàíäó File | Print (ôàéë | ïå÷àòü). Ðåäàêòîð VB îòîáðàæàåò
äèàëîãîâîå îêíî Print (ðèñ. 2.23).
3.  ãðóïïå ýëåìåíòîâ óïðàâëåíèÿ Range (äèàïàçîí ïå÷àòè) óêàæèòå, áóäåò ëè
ïå÷àòàòüñÿ òåêñò òåêóùåãî âûáîðà, âûäåëåííûé ìîäóëü èëè âåñü ïðîåêò.
4.  ãðóïïå ýëåìåíòîâ óïðàâëåíèÿ Print What (ïå÷àòàòü) äîëæåí áûòü óñòàíîâëåí
ôëàæîê Code (ïðîãðàììó) (÷òîáû ïå÷àòàòü èñõîäíûé êîä); åñëè âàø ïðîåêò
ñîäåðæèò ôîðìû, óñòàíîâèòå ôëàæîê Form Image äëÿ ïå÷àòè ðèñóíêà ôîðìû.
82 Ãëàâà 2

Ðèñ. 2.23
Âû ìîæåòå çàäàòü ðàçëè÷íûå ïàðàìåòðû
ïå÷àòè â ýòîì îêíå

5. Óñòàíîâèòå ëþáûå äðóãèå ïàðàìåòðû ïå÷àòè, êàêèå íåîáõîäèìî, òàê æå,


êàê âû ýòî äåëàåòå â ëþáîì ïðèëîæåíèè Microsoft Office.
6. Ùåëêíèòå íà êíîïêå ÎÊ, ÷òîáû íàïå÷àòàòü èñõîäíûé êîä.
Êîãäà âû ïå÷àòàåòå ïðîåêò èëè ìîäóëü, âû íå ìîæåòå ïðåäâàðèòåëüíî
ïðîñìàòðèâàòü ïå÷àòàåìûé ìîäóëü. Îòïå÷àòàííûé ëèñòèíã èç ìîäóëÿ âñåãäà
ôîðìàòèðóåòñÿ îäíèì è òåì æå îáðàçîì [çà èñêëþ÷åíèåì îðèåíòàöèè ñòðàíèö,
êîòîðóþ âû ìîæåòå ðåãóëèðîâàòü, ùåëêíóâ íà êíîïêå Setup (íàñòðîéêà) â
äèàëîãîâîì îêíå Print].
Ïðè ðàçðàáîòêå ïðîåêòîâ, êðîìå òåêñòîâ ìîäóëåé, âû ìîæåòå âûâîäèòü íà
ïå÷àòü ãðàôè÷åñêèå ïðåäñòàâëåíèÿ äèàëîãîâûõ îêîí, ïîõîæèõ íà òå îêíà, ê
êîòîðûì âû, î÷åâèäíî, ïðèâûêëè, ðàáîòàÿ â ñðåäå Windows. Ðàçðàáîòêå
äèàëîãîâûõ îêîí â VBA áóäåò ïîñâÿùåíî íåñêîëüêî ãëàâ ýòîé êíèãè.
Òèïû äàííûõ, ïåðåìåííûå,
3
êîíñòàíòû è âûðàæåíèÿ
Èç ýòîé ãëàâû âû óçíàåòå î òèïàõ äàííûõ, êîòîðûìè ìîæåò óïðàâëÿòü
VBA, è î òîì, êàê â VBA õðàíÿòñÿ âðåìåííûå äàííûå. Èíôîðìàöèÿ,
èçëîæåííàÿ â ýòîé ãëàâå, ïðèìåíèìà ê VBA â ëþáîì host-ïðèëîæåíèè,
ðåàëèçóþùåì VBA, — Word, Excel, PowerPoint, FrontPage, Visio, Outlook è
äàæå Access. Â äåéñòâèòåëüíîñòè, èíôîðìàöèÿ â ýòîé ãëàâå òàêæå ïðèìåíèìà
ê Visual Basic, è âñå, ÷òî âû óçíàåòå î òèïàõ äàííûõ, ïåðåìåííûõ è
êîíñòàíòàõ, ñïðàâåäëèâî â ëþáîé èç ðåàëèçàöèé Visual Basic (äî âåðñèè .NET,
êîòîðàÿ, âïðî÷åì, ñîâñåì íå ÿâëÿåòñÿ äàæå îòäàëåííî íàïîìèíàþùåé âåðñèþ
Visual Basic), â êîòîðûõ âû áóäåòå ïðîãðàììèðîâàòü.
Ïåðåä òåì, êàê óçó÷èòü êàòåãîðèè êîíñòàíò è ïåðåìåííûõ, íåîáõîäèìî
ïîíÿòü, êàêèå âèäû èíôîðìàööè ñîõðàíÿþòñÿ â ïàìÿòè, âûäåëÿåìîé äëÿ
ïðèëîæåíèÿ.
Êàê è ïîäàâëÿþùåå áîëüøèíñòâî ñèñòåì ïðîãðàììèðîâàíèÿ, Visual Basic
ðàçäåëÿåò îáðàáàòûâàåìûå äàííûå íà ÷èñëà, òåêñò, äàòû è äðóãèå òèïû. Â
òàáëèöå 3.1 ïðèâåäåíû òèïû äàííûõ, èñïîëüçóåìûå â Visual Basic.
Áàéò (byte) — ýòî åäèíèöà èçìåðåíèÿ êîìïüþòåðíîé è äèñêîâîé ïàìÿòè.
Áàéò ñîñòîèò èç âîñüìè áèòîâ (bits) èëè äâîè÷íûõ ðàçðÿäîâ. Îáû÷íî îäèí
àëôàâèòíûé ñèìâîë òðåáóåò äëÿ õðàíåíèÿ îäíîãî áàéòà ïàìÿòè
Òàáëèöà 3.1. Òèïû äàííû â VBA

Ðàçìåð â
Íàçâàíèå òèïà Îïèñàíèå è äèàïàçîí çíà÷åíèÿ
áàéòàõ

Byte 1 Äëÿ õðàíåíèÿ ïîëîæèòåëüíîãî ÷èñëà îò 0 äî 255.

Äëÿ õðàíåíèÿ ëîãè÷åñêèèõ çíà÷åíèé; ìîæåò


Boolean 2
ñîäåðæàòü òîëüêî çíà÷åíèÿ True èëè False

Îò –922337203685477.5808 äî
Currency 8
922337203685477.5807.

Äëÿ õðàíåíèÿ êîìáèíàöèè èíôîðìàöèè î äàòå è


âðåìåíè. Äèàïàçîí äàò ìîæåò áûòü îò 1 ÿíâàðÿ 100
Date 8
ãîäà äî 31 äåêàáðÿ 9999 ãîäà. Äèàïàçîí âðåìåíè îò
00:00:00 äî 23:59:59.
84 Ãëàâà 3

Ïåðåìåííûå òèïà Decimal ñîõðàíÿþòñÿ êàê


96-áèòîâûå çíàêîâûå öåëûå, ìàñøòàáèðóåìûå
çíà÷åíèåì íåêîòîðîé ñòåïåíè ÷èñëà 10. Ñòåïåíü
äåñÿòè îïðåäåëÿåò ÷èñëî äåñÿòè÷íûõ çíàêîâ ñïðàâà
îò äåñÿòè÷íîé òî÷êè è ìîæåò áûòü â äèàïàçîíå îò 0
äî28. Åñëè ñòåïåíü ìàñøòàáíîãî êîýôôèöèåíòà
Decimal 12
ðàâíà 0, íàèáîëüøåå ÷èñëî òèïà Decimal ìîæåò áûòü
ðàâíî +/-79,228,162,514,264,337,593,543,950,335.
Äëÿ ñòåïåíè 28 íàèáîëüøåå ÷èñëî:
+/-7.9228162514264337593543950335, à ñàìîå
ìåíüøåå íåíóëåâîå çíà÷åíèå ðàâíî
+/-0.0000000000000000000000000001.

Îòðèöàòåëüíûå ÷èñëà:
îò –1.79769313486232E10308 äî
–4.94065645841247E10-324.
Double 8
Ïîëîæèòåëüíûå ÷èñëà:
îò 4.94065645841247E10-324 äî
1.79769313486232E10308.

Integer 2 Âñå öåëûå ÷èñëà îò –32768 äî 32767.

Long 4 Âñå öåëûå ÷èñëà îò –2147483648 äî 2147483647.

Èñïîëüçóåòñÿ äëÿ äîñòóïà ê ëþáîìó îáúåêòó,


Object 4 ðàñïîçíàâàåìîìó VBA. Ñîõðàíÿåò àäðåñ îáúåêòà â
ïàìÿòè.

Îòðèöàòåëüíûå ÷èñëà:

Single 4
îò –3.402823E1038 äî –1.401298E10-45
Ïîëîæèòåëüíûå ÷èñëà:
îò 1.401298E10-45 äî 3.402823E1038

10
String Èñïîëüçóåòñÿ äëÿ õðàíåíèÿ òåêñòà. Ìîæåò
áàéò+äëè
(ïåðåìåííîé ñîäåðæàòü îò 0 ñèìâîëîâ äî (ïðèáëèçèòåëüíî) 2
íà
äëèíû) ìèëëèàðäîâ ñèìâîëîâ.
ñòðîêè

Äëèíà
ñòðîêè
String Èñïîëüçóåòñÿ äëÿ õðàíåíèÿ òåêñòà. Ìîæåò
(îäèí
(ôèêñèðîâàííî ñîäåðæàòü îò îäíîãî äî (ïðèáëèçèòåëüíî) 654000
áàéò íà
é äëèíû) ñèìâîëîâ.
îäèí
ñèìâîë)

Òèï Variant ìîæåò õðàíèòü ëþáîé äðóãîé òèï


16 áàéò,
äàííûõ. Äèàïàçîí äëÿ äàííûõ òèïà Variant çàâèñèò
«ïëþñ» 1
Variant îò ôàêòè÷åñêè ñîõðàíÿåìûõ äàííûõ.  ñëó÷àå
áàéò/ñèì
òåêñòà äèàïàçîí ñîîòâåòñòâóåò ñòðîêîâîìó òèïó; â
âîë
ñëó÷àå ÷èñåë äèàïàçîí òàêîé, êàê ó òèïà Double.

Äàëåå â ýòîì ðàçäåëå áîëåå ïîäðîáíî îïèñûâàåòñÿ êàæäûé èç ïðèâåäåííûõ


â òàáëèöå 3.1 òèïîâ äàííûõ, êðîìå òèïà Object.
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 85

Ýêñïîíåíöèàëüíîå ïðåäñòàâëåíèå
 òàáëèöå 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

Áîëüøèíñòâî òèïîâ äàííûõ, ïðèâåäåííûõ â òàáëèöå 3.1, ìîæíî ïðåîáðàçî-


âûâàòü â äðóãèå òèïû. Äàëåå â ýòîé ãëàâå îïèñûâàåòñÿ, êàê VBA àâòîìàòè÷å-
ñêè ïðåîáðàçîâûâàåò äàííûå (è êàê âû ñàìè ìîæåòå ýòî äåëàòü).

Òèï 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

VBA-òèï Date ÿâëÿåòñÿ òèïîì ïîñëåäîâàòåëüíûõ äàò (serial Dates).


(Ïîñëåäîâàòåëüíûå äàòû ñîõðàíÿþò äàòó êàê ÷èñëî äíåé îò çàäàííîé
ñòàðòîâîé äàòû.) Áàçîâîé äàòîé äëÿ VBA-òèïà Date ÿâëÿåòñÿ 30 äåêàáðÿ 1899.
VBA èñïîëüçóåò îòðèöàòåëüíûå ÷èñëà äëÿ ïðåäñòàâëåíèÿ äàò ðàíåå
12/30/1899 è ïîëîæèòåëüíûå — äëÿ äàò ïîñëå 12/30/1899. ×èñëî 0
ïðåäñòàâëÿåò ñàìó äàòó 12/30/1899. Ïî ýòîé ñõåìå 1 ÿíâàðÿ 1900
çàïèñûâàåòñÿ ÷èñëîì 2 (1/1/1990 — ýòî 2 äíÿ ïîñëå 12/30/1899), îäíàêî
÷èñëî –2 ÿâëÿåòñÿ äàòîé 12/28/1899 (äâà äíÿ äî 12/30/1899). ×òîáû óáåäèòüñÿ
â ýòîì, íàïèøèòå ïðîñòîé ìàêðîñ (â VB-ðåäàêòîðå Word èëè Excel),
ïðèâåäåííûé â ëèñòèíãå 5.2 (Äëÿ çàïóñêà ìàêðîñà èñïîëüçóéòå ìåíþ Run):

Ëèñòèíã 3.1. Òåñòèðîâàíèå òèïà Date


Sub DateTest()
Dim d As Date
d = 1
MsgBox d
End Sub

 ðåçóëüòàòå ðàáîòû ýòîãî ìàêðîñà íà ýêðàí áóäåò âûäàíà áàçîâàÿ äàòà, êàê
ïîêàçàíî íà ðèñ. 3.1.
Ðèñ. 3.1
Áàçîâàÿ äàòà äëÿ VBA-òèïà Date

Íåêîòîðûå host-ïðèëîæåíèÿ VBA, òàêèå êàê Excel, èìåþò ñâîè


ñîáñòâåííûå òèïû äàííûõ ïîñëåäîâàòåëüíûõ äàò. Excel, íàïðèìåð, òàêæå
èñïîëüçóåò ÷èñëà ïîñëåäîâàòåëüíûõ äàò, íî ñ äðóãîé áàçîâîé äàòîé:
1 ÿíâàðÿ 1900.
VBA âñåãäà èñïîëüçóåò îäíó è òó æå áàçîâóþ äàòó äëÿ ïîñëåäîâàòåëüíûõ
äàò òèïà Date, íåçàâèñèìî îò ñõåìû äàò host-ïðèëîæåíèÿ — VBA âñåãäà
èñïîëüçóåò äàòó 12/30/1899 â êà÷åñòâå áàçîâîé.
Çàìå÷àíèå
×òîáû ïðîâåðèòü, êàêóþ áàçîâóþ äàòó èñïîëüçóåò Excel, îòôîðìàòèðóéòå êàêóþ-ëèáî ÿ÷åéêó ëèñ-
òà Excel êàê äàòó è ââåäèòå â ýòó ÿ÷åéêó 1 (åäèíèöó). Êàê òîëüêî âû ïåðåéäåòå ê äðóãîé ÿ÷åéêå
ëèñòà, â ïðåäûäóùåé âìåñòî 1 áóäåò îòîáðàæåíà áàçîâàÿ äàòà.

 çíà÷åíèè ïîñëåäîâàòåëüíîé äàòû öåëàÿ ÷àñòü (öèôðû ñëåâà îò äåñÿòè÷-


íîãî çíàêà) — ýòî îáùåå ÷èñëî äíåé îò áàçîâîé äàòû. Ïîñëåäîâàòåëüíàÿ äàòà
VBA ìîæåò èìåòü öèôðû ñïðàâà îò äåñÿòè÷íîãî çíàêà; ýòè öèôðû îáîçíà÷àþò
âðåìÿ äíÿ êàê ÷àñòü äíÿ. Îäèí ÷àñ — ýòî 1/24 äíÿ (ïðèáëèçèòåëüíî 0,0416.
Àíàëîãè÷íî, îäíà ìèíóòà — ýòî 1/1440 äíÿ, à ñåêóíäà — 1/86400 äíÿ.
Âû ìîæåòå âû÷èòàòü îäíó äàòó èç äðóãîé, äîáàâëÿòü ê äàòå èëè âû÷èòàòü
÷èñëà äëÿ èçìåíåíèÿ åå çíà÷åíèÿ. Íàïðèìåð, åñëè âàì íåîáõîäèìî îïðåäåëèòü
êîëè÷åñòâî äíåé ìåæäó äâóìÿ äàòàìè, ïðîñòî âû÷èòàéòå áîëåå ðàííþþ äàòó èç
áîëåå ïîçäíåé. Ïîñêîëüêó ýòî çíà÷åíèÿ òèïà Date, VBA «çíàåò», ÷òî öåëüþ
âû÷èñëåíèÿ ÿâëÿåòñÿ ïîëó÷åíèå ðàçíîñòè â äíÿõ ìåæäó äâóìÿ ýòèìè äàòàìè.
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 87

Àíàëîãè÷íî, åñëè âàì íåîáõîäèìî îïðåäåëèòü äàòó ÷åðåç 60 äíåé ïîñëå äàííîé
äàòû, ïðîñòî ïðèáàâüòå 60 ê ýòîé äàòå.
 VBA èìååòñÿ íåñêîëüêî âñòðîåííûõ ïðîöåäóð (îïèñàííûõ â ñëåäóþùèõ
ãëàâàõ) äëÿ îòäåëüíîãî èçâëå÷åíèÿ ãîäà, ìåñÿöà, äíÿ, ÷àñîâ, ìèíóò è ñåêóíä èç
ïåðåìåííîé òèïà Date.

×èñëà
VBA èìååò øåñòü ðàçëè÷íûõ ÷èñëåííûõ òèïîâ äàííûõ: Byte, Integer,
Long, Single, Double è Currency. ×èñëåííûå òèïû äàííûõ èñïîëüçóþòñÿ
äëÿ õðàíåíèÿ (è ìàíèïóëèðîâàíèÿ) ÷èñåë â ðàçëè÷íûõ ôîðìàòàõ, â çàâèñèìî-
ñòè îò êîíêðåòíîãî òèïà. ×èñëåííûå òèïû ïðåäîñòàâëÿþò êîìïàêòíûé è ýô-
ôåêòèâíûé ñïîñîá õðàíåíèÿ ÷èñåë. ×èñëåííûé òèï, çàïîëíÿþùèé áîëüøóþ
÷àñòü ïàìÿòè (èìåþùèé ñàìûé áîëüøîé äèàïàçîí âîçìîæíûõ çíà÷åíèé), çà-
íèìàåò íå áîëåå âîñüìè áàéòîâ ïàìÿòè äëÿ õðàíåíèÿ ÷èñåë, êîòîðûå ìîãóò
èìåòü äî 300 öèôð.

Òèïû äàííûõ Byte, Integer è Long


Integer — ýòî öåëîå ÷èñëî áåçî âñÿêîé äðîáíîé ÷àñòè. ×èñëà 1, 3768
è 12 — ýòî âñå öåëûå ÷èñëà; ÷èñëà 1,5; 3,14; 17,21 íå ÿâëÿþòñÿ öåëûìè. (×èñ-
ëî 1,0 — íå öåëîå, õîòÿ äðîáíàÿ ÷àñòü ðàâíà íóëþ; öåëûå íèêîãäà íå ñîäåðæàò
äåñÿòè÷íîãî çíàêà, äàæå åñëè äåñÿòè÷íàÿ ÷àñòü ÿâëÿåòñÿ íóëåì).
VBA ïðåäîñòàâëÿåò òðè ðàçëè÷íûõ öåëûõ òèïà äàííûõ: Byte, Integer
è Long. Òèï Byte — ýòî íàèìåíüøèé èç òðåõ öåëûõ òèïîâ äàííûõ VBA è
ïðåäíàçíà÷åí äëÿ õðàíåíèÿ ÷èñåë òîëüêî îò 0 äî 255. Òèï Byte èñïîëüçóåò
òîëüêî îäèí áàéò ïàìÿòè (255 — ýòî ñàìîå áîëüøîå ÷èñëî, êàêîå âû òîëüêî
ìîæåòå ïîëó÷èòü ñ âîñåìüþ áèòàìè). Òèï Byte íå ïðåäíàçíà÷åí äëÿ õðàíåíèÿ
îòðèöàòåëüíûõ ÷èñåë. Îáû÷íî òèïû Byte èñïîëüçóþòñÿ äëÿ õðàíåíèÿ
äâîè÷íûõ äàííûõ (ãðàôè÷åñêèõ, çâóêîâûõ ôàéëîâ è òàê äàëåå).
Òèï Integer òðåáóåò äâóõ áàéòîâ ïàìÿòè; äèàïàçîí ÷èñåë, êîòîðûå âû ìî-
æåòå õðàíèòü êàê òèï Integer, ñîñòàâëÿåò îò –32768 äî 32767. Ïîñêîëüêó
äèàïàçîí äëÿ òèïà Integer ñèëüíî îãðàíè÷åí, â VBA èìååòñÿ äðóãîé, áîëü-
øèé òèï: Long — (äëèííîå) öåëîå. Ýòîò òèï äëÿ õðàíåíèÿ ÷èñëà èñïîëüçóåò
4 áàéòà ïàìÿòè è èìååò äèàïàçîí çíà÷åíèé îò –2147483648 äî 2147483647.
Òèïû Byte, Integer è Long èìåþò ïàðó ïðåèìóùåñòâ ïî ñðàâíåíèþ ñ äðóãèìè
÷èñëåííûìè òèïàìè äàííûõ: öåëûå òðåáóþò ìåíüøå ïàìÿòè äëÿ õðàíåíèÿ ÷èñåë, ÷åì
äðóãèå ÷èñëåííûå òèïû äàííûõ VBA, à ìàòåìàòè÷åñêèå îïåðàöèè è îïåðàöèè ñðàâíåíèÿ
íàä ÷èñëàìè òèïîâ Byte, Integer è Long áûñòðåå, ÷åì ýòè æå îïåðàöèè äëÿ ÷èñëåííûõ
òèïîâ äàííûõ ñ ïëàâàþùåé òî÷êîé. Òèïû Byte, Integer è Long èìåþò ðàçëè÷íîå
ïðèìåíåíèå. Íàèáîëåå ÷àñòî îíè èñïîëüçóþòñÿ äëÿ êóìóëÿòèâíûõ âû÷èñëèòåëüíûõ
îïåðàöèé âñëåäñòâèå èõ êîìïàêòíîãî ðàçìåðà è áîëåå áûñòðîé ñêîðîñòè âûïîëíåíèÿ
àðèôìåòè÷åñêèõ îïåðàöèé. Èñïîëüçóéòå òèïû Byte, Integer è Long äëÿ ÷èñåë, êîòîðûå
íå èìåþò äðîáíîé ÷àñòè.
VBA àâòîìàòè÷åñêè ïðåîáðàçóåò äàííûå òèïîâ Byte, Integer è Long â
òåêñò, êîãäà âû âûâîäèòå èõ íà ýêðàí ñ èñïîëüçîâàíèåì òàêèõ ïðîöåäóð, êàê
MsgBox.

1 Çäåñü è äàëåå äëÿ îáîçíà÷åíèÿ äåéñòâèòåëüíûõ ÷èñåë èñïîëüçóåòñÿ çíàê çàïÿòîé (,) ïî-
ñêîëüêó èìååòñÿ â âèäó îáû÷íàÿ ìàòåìàòè÷åñêàÿ çàïèñü ÷èñëà.
88 Ãëàâà 3

×èñëà ñ ïëàâàþùåé òî÷êîé


×èñëà ñ ïëàâàþùåé òî÷êîé (floating point numbers) ìîãóò èìåòü ëþáîå
÷èñëî öèôð äî èëè ïîñëå äåñÿòè÷íîé òî÷êè (â ïðåäåëàõ ãðàíèö êîíêðåòíîãî
òèïà äàííûõ) è ïîëó÷èëè ñâîå íàçâàíèå âñëåäñòâèå òîãî ôàêòà, ÷òî äåñÿòè÷íàÿ
òî÷êà «ïëàâàåò» èç îäíîé ïîçèöèè â äðóãóþ, â çàâèñèìîñòè îò òîãî,
ñîõðàíÿåòñÿ â ïàìÿòè áîëüøîå èëè ìàëîå çíà÷åíèå. ×èñëà 11,0123; –1107,1;
0,0125 è 435,67876 — ýòî ÷èñëà ñ ïëàâàþùåé òî÷êîé. ×èñëà ñ ïëàâàþùåé
òî÷êîé èíîãäà íàçûâàþò òàêæå äåéñòâèòåëüíûìè (real) ÷èñëàìè.
Èñïîëüçóéòå òèïû äàííûõ ñ ïëàâàþùåé òî÷êîé âñÿêèé ðàç, êîãäà âàì
òðåáóåòñÿ ñîõðàíèòü ÷èñëî, èìåþùåå äðîáíóþ ÷àñòü.
VBA èìååò äâà ðàçëè÷íûõ òèïà äàííûõ ñ ïëàâàþùåé òî÷êîé: Single è
Double. Äëÿ äàííûõ òèïà Single òðåáóåòñÿ 4 áàéòà ïàìÿòè, è ýòîò òèï ìîæåò
èñïîëüçîâàòüñÿ äëÿ õðàíåíèÿ îòðèöàòåëüíûõ ÷èñåë îò –3,402823´1038 äî
–1,401298´10-45 è ïîëîæèòåëüíûõ îò 1,401298´10-45 äî 3,402823´1038. ×èñëà,
õðàíèìûå ñ èñïîëüçîâàíèåì òèïà Single, íàçûâàþòñÿ ÷èñëàìè îäèíàðíîé
òî÷íîñòè (Single-precision numbers). Äëÿ äàííûõ òèïà Double òðåáóåòñÿ 8
áàéòîâ ïàìÿòè, è ýòîò òèï ìîæåò èñïîëüçîâàòüñÿ äëÿ õðàíåíèÿ îòðèöàòåëüíûõ
÷èñåë îò –1,79769313486232´10308 äî –4,94065645841247´10-324 è ïîëîæè-
òåëüíûõ îò 4,94065645841247´10-324 äî 1,79769313486232´10308. ×èñëà,
õðàíèìûå ñ èñïîëüçîâàíèåì òèïà Double, íàçûâàþòñÿ ÷èñëàìè äâîéíîé
òî÷íîñòè (double-precision numbers).
Õîòÿ ÷èñëà îäèíàðíîé è äâîéíîé òî÷íîñòè èìåþò áîëüøèå äèàïàçîíû, ÷åì
äðóãèå ÷èñëåííûå òèïû äàííûõ, ó íèõ èìååòñÿ äâà íåáîëüøèõ íåäîñòàòêà.
Îïåðàöèè, âûïîëíÿåìûå íàä ÷èñëàìè ñ ïëàâàþùåé òî÷êîé, íåìíîãî
ìåäëåííåå ïîäîáíûõ îïåðàöèé íàä äðóãèìè ÷èñëåííûìè òèïàìè äàííûõ
(âïðî÷åì, ïðîáëåìû áûñòðîäåéñòâèÿ ïðè âûïîëíåíèè àðèôìåòè÷åñêèé
îïåðàöèé íå ÿâëÿþòñÿ ñàìûìè ÷àñòûìè ïðè ðàáîòå Windows-ïðèëîæåíèé).
Êðîìå òîãî, ÷èñëà, õðàíèìûå êàê òèïû äàííûõ ñ ïëàâàþùåé òî÷êîé, ìîãóò
áûòü ïîäâåðæåíû îøèáêàì îêðóãëåíèÿ. Êàê è â ñëó÷àå ñ öåëûìè òèïàìè
äàííûõ, VBA àâòîìàòè÷åñêè ïðåîáðàçóåò çíà÷åíèÿ òèïà Single è Double â
òåêñò, êîãäà âû îòîáðàæàåòå èõ ñ ïîìîùüþ ïðîöåäóð, òàêèõ êàê MsgBox. Åñëè
÷èñëî ñ ïëàâàþùåé òî÷êîé î÷åíü áîëüøîå èëè î÷åíü ìàëîå, VBA îòîáðàæàåò
åãî â ýêñïîíåíöèàëüíîì ïðåäñòàâëåíèè.

Òèï äàííûõ Currency


VBA-òèï Currency — ýòî ÷èñëî ñ ôèêñèðîâàííîé òî÷êîé (fixed-point
number), òî åñòü, äåñÿòè÷íàÿ òî÷êà âñåãäà íàõîäèòñÿ â îäíîì è òîì æå ìåñòå —
ñïðàâà îò äåñÿòè÷íîé òî÷êè âñåãäà èìååòñÿ ÷åòûðå öèôðû. Èñïîëüçóéòå òèï
Currency äëÿ õðàíåíèÿ ÷èñåë, êîãäà òî÷íîñòü êðàéíå âàæíà, ÷òî áûâàåò ïðè
«äåíåæíûõ» âû÷èñëåíèÿõ.
Òèï Currency òðåáóåò 8 áàéòîâ ïàìÿòè è ìîæåò ñîõðàíÿòü ÷èñëà îò
–922337203685477,5808 äî 922337203685477,5807. Ìàòåìàòè÷åñêèå îïåðà-
öèè íàä ÷èñëàìè òèïà Currency èìåþò íåáîëüøèå èëè íå èìåþò îøèáîê îê-
ðóãëåíèÿ, ïîýòîìó îíè òî÷íåå, ÷åì îïåðàöèè íàä ÷èñëàìè ñ ïëàâàþùåé òî÷-
êîé. Îøèáêè îêðóãëåíèÿ ñ ÷èñëàìè òèïà Currency îáû÷íî âîçíèêàþò òîëüêî
òîãäà, êîãäà âû óìíîæàåòå èëè äåëèòå ÷èñëà òèïà Currency íà çíà÷åíèÿ äðó-
ãîãî ÷èñëåííîãî òèïà. Ïîäîáíî îáðàáîòêå âñåõ äðóãèõ ÷èñëåííûõ òèïîâ äàí-
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 89

íûõ VBA àâòîìàòè÷åñêè ïðåîáðàçóåò çíà÷åíèÿ Currency â òåêñò, êîãäà âû èõ


âûâîäèòå íà ýêðàí.

Òåêñòîâûå ñòðîêè
Ëþáûå òåêñòîâûå äàííûå, ñîõðàíÿåìûå â ïðîãðàììå 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

ãèì, íàïðèìåð, ïðè ñðàâíåíèè äâóõ ÷èñåë äëÿ îïðåäåëåíèÿ, êîòîðîå èç íèõ
áîëüøå, èëè ñðàâíåíèè äâóõ ñòðîê äëÿ îïðåäåëåíèÿ, êîòîðàÿ èç ñòðîê íàõî-
äèòñÿ íèæå â àëôàâèòíîì ïîðÿäêå.

Òèï äàííûõ Variant


Òèï äàííûõ Variant — ýòî îñîáûé òèï äàííûõ, êîòîðûé ìîæåò ñîõðàíÿòü
ëþáûå òèïû, ïðèâåäåííûå â òàáë. 4.1, çà èñêëþ÷åíèåì òèïà Object. VBA èñ-
ïîëüçóåò òèï Variant äëÿ âñåõ ïåðåìåííûõ, åñëè òîëüêî âû íå îáúÿâëÿåòå
ÿâíî òèï ïåðåìåííîé, êàê áóäåò îïèñàíî äàëåå â ýòîé ãëàâå.
Äàííûå òèïà Variant ïðèíèìàþò õàðàêòåðèñòèêè îïðåäåëåííîãî òèïà, êî-
òîðûé îíè ñîõðàíÿþò â äàííûé ìîìåíò. Íàïðèìåð, åñëè äàííûå òèïà Variant
ñîäåðæàò ñòðîêîâûå äàííûå, Variant ïðèíèìàåò õàðàêòåðèñòèêè òèïà
String. Åñëè äàííûå òèïà Variant ñîäåðæàò ÷èñëåííûå äàííûå, Variant
ïðèíèìàåò õàðàêòåðèñòèêè êàêîãî-ëèáî ÷èñëåííîãî òèïà, îáû÷íî — Double,
õîòÿ òèïû Variant ìîãóò òàêæå èìåòü õàðàêòåðèñòèêè òèïîâ Integer, Long,
Single èëè Currency.
VBA èñïîëüçóåò äëÿ äàííûõ òèïà Variant íàèáîëåå êîìïàêòíîå ïðåäñòàâ-
ëåíèå, âîçìîæíîå äëÿ êîíêðåòíûõ çíà÷åíèé, íàõîäÿùèõñÿ â äàííûõ. Åñëè
VBA ñîõðàíÿåò öåëîå ÷èñëî â ïåðåìåííîé òèïà Variant, ýòî ÷èñëî îáðàáàòû-
âàåòñÿ êàê äàííûå òèïà Integer èëè Long, â çàâèñèìîñòè îò åãî ðàçìåðà. Íà-
ïðèìåð, äëÿ VBA ÷èñëî 15 â òèïå Variant ÿâëÿåòñÿ äàííûìè òèïà Integer;
VBA îáðàáàòûâàåò ÷èñëî 1 000 000 â Variant êàê äàííûå òèïà Long.
VBA ñîõðàíÿåò áîëüøèíñòâî ÷èñåë ñ ïëàâàþùåé òî÷êîé â äàííûõ òèïà
Variant êàê òèï Double è èñïîëüçóåò òèï Variant òàê, ÷òî âàì íå âñåãäà ïðè-
õîäèòñÿ áåñïîêîèòüñÿ îá óêàçàíèè òèïîâ ïåðåìåííûõ, êîòîðûå âû èñïîëüçóåòå
â êîäå. Ëþáûå ïåðåìåííûå, äëÿ êîòîðûõ âû íå îáúÿâëÿåòå ñïåöèàëüíî òèï,
ñòàíîâÿòñÿ òèïîì Variant.
Íåñìîòðÿ íà òî, ÷òî òèïû Variant óäîáíû è èçáàâëÿþò îò íåêîòîðîé ÷àñòè
ðàáîòû ïðè íàïèñàíèè ïðîöåäóð, îíè òðåáóþò áîëüøåãî îáúåìà ïàìÿòè, ÷åì
ëþáîé äðóãîé òèï äàííûõ, çà èñêëþ÷åíèåì áîëüøèõ ñòðîê. Êðîìå òîãî, ìàòå-
ìàòè÷åñêèå îïåðàöèè è îïåðàöèè ñðàâíåíèÿ íàä äàííûìè òèïà Variant âû-
ïîëíÿþòñÿ ìåäëåííåå, ÷åì ïîäîáíûå îïåðàöèè íàä äàííûìè ëþáîãî äðóãîãî
òèïà. Â îáùåì, ñëåäóåò èçáåãàòü èñïîëüçîâàíèÿ ïåðåìåííûõ Variant: åñëè âû
áóäåòå ïîëàãàòüñÿ íà ïåðåìåííûå òèïà Variant, ìîæåò ñôîðìèðîâàòüñÿ ïðè-
âû÷êà íåàêêóðàòíîãî ïðîãðàììèðîâàíèÿ è âàì áóäåò òðóäíî íàõîäèòü è óñòðà-
íÿòü îøèáêè â ïðîãðàììàõ.

Ïåðåìåííûå
Ïåðåìåííûå î÷åíü âàæíû, ïîñêîëüêó îíè îáåñïå÷èâàþò âîçìîæíîñòü
â êîìïüþòåðíîé ïðîãðàììå âðåìåííî ñîõðàíÿòü è ìàíèïóëèðîâàòü äàííûìè.
 ýòîì ðàçäåëå îïèñûâàåòñÿ, ÷òî òàêîå ïåðåìåííàÿ è êàê ñîçäàâàòü ïåðåìåí-
íûå.
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 91

×òî òàêîå ïåðåìåííàÿ?


Ïåðåìåííàÿ (variable) — ýòî èìÿ, êîòîðîå ðàçðàáîò÷èê ïðîãðàììû ìîæåò
äàòü îáëàñòè êîìïüþòåðíîé ïàìÿòè, èñïîëüçóåìîé äëÿ õðàíåíèÿ äàííûõ
êàêîãî-ëèáî òèïà. Âû ìîæåòå ïðåäñòàâëÿòü ñåáå ïåðåìåííóþ êàê ÿùèê, â
êîòîðûé ìîæíî ïîëîæèòü ëþáîé îòäåëüíûé ýëåìåíò äàííûõ è õðàíèòü åãî äëÿ
ïîñëåäóþùåãî èñïîëüçîâàíèÿ. Èìÿ ïåðåìåííîé ÿâëÿåòñÿ èäåíòèôèöèðóþùåé
ìåòêîé äëÿ ýòîãî ÿùèêà. Ñîäåðæèìîå ÿùèêà (çíà÷åíèå ïåðåìåííîé) ìîæåò
ìåíÿòüñÿ, íî íàèìåíîâàíèå ÿùèêà (èìÿ ïåðåìåííîé) îñòàåòñÿ òåì æå (ïðèìåð
ñ ÿùèêîì õîðîøî ïîäõîäèò ê îïèñàíèþ ïåðåìåííé òèïà Variant: â ÿùèê
ìîæíî ïîëîæèòü, íàñûïàòü, íàëèòü âñå, ÷òî óãîäíî). Ïåðåìåííûå VBA ìîãóò
õðàíèòü ëþáûå òèïû äàííûõ, ïåðå÷èñëåííûå â òàáëèöå 3.1.
 íåêîòîðîì ñìûñëå ïåðåìåííàÿ ïîäîáíà èìåíîâàííîé ÿ÷åéêå ðàáî÷åãî ëèñ-
òà.  Excel âû ìîæåòå äàâàòü èìÿ ÿ÷åéêå â ðàáî÷åì ëèñòå, à çàòåì ññûëàòüñÿ íà
ýòó ÿ÷åéêó ïî åå èìåíè òàê, ÷òî âàì íå ïðèõîäèòñÿ èñïîëüçîâàòü èëè äàæå çà-
ïîìèíàòü ôàêòè÷åñêèé àäðåñ ÿ÷åéêè èç ñòðîêè è ñòîëáöà êàæäûé ðàç, êîãäà
íåîáõîäèìî ñîñëàòüñÿ íà äàííûå èëè ôîðìóëû â ýòîé ÿ÷åéêå. VBA (êàê è âñå
ñèñòåìû ïðîãðàììèðîâàíèÿ) ñïðàâëÿåòñÿ ñî âñåìè äåòàëÿìè íàõîæäåíèÿ êîí-
êðåòíûõ ìåñò â ïàìÿòè êîìïüþòåðà âìåñòî âàñ. Íåò íåîáõîäèìîñòè áåñïîêî-
èòüñÿ î êîíêðåòíûõ àäðåñàõ äàííûõ êàêîé-ëèáî ïåðåìåííîé, ïðîñòî èñïîëü-
çóéòå èìÿ ýòîé ïåðåìåííîé äëÿ ññûëêè íà ñîõðàíÿåìûå äàííûå.
Ïåðåìåííûå â îïåðàòîðàõ VBA èñïîëüçóþòñÿ òàêèì æå îáðàçîì, ÷òî è ïåðå-
ìåííûå â àëãåáðàè÷åñêèõ óðàâíåíèÿõ. Ïåðåìåííàÿ ïðåäñòàâëÿåò ÷èñëà, òåê-
ñòîâûå äàííûå èëè äðóãóþ èíôîðìàöèþ, êîòîðàÿ òî÷íî íå èçâåñòíà âî âðåìÿ
íàïèñàíèÿ îïåðàòîðà, íî áóäåò â íàëè÷èè è äîñòóïíà ïðè âûïîëíåíèè ýòîãî
îïåðàòîðà.
Âñÿêèé ðàç, êîãäà èìÿ ïåðåìåííîé ïîÿâëÿåòñÿ â îïåðàòîðå, VBA âñòàâëÿåò
â ýòîò îïåðàòîð ôàêòè÷åñêîå çíà÷åíèå, õðàíèìîå â òåêóùèé ìîìåíò â ó÷àñòêå
ïàìÿòè, íà êîòîðûé ññûëàåòñÿ ïåðåìåííàÿ. Â ñëåäóþùåì ïðèìåðå, åñëè ïåðå-
ìåííàÿ AnyNum ñîäåðæèò ÷èñëî 2, òî âåñü îïåðàòîð áóäåò èìåòü â êà÷åñòâå ðå-
çóëüòàòà 4:
AnyNum + 2
 êà÷åñòâå äðóãîãî, áîëåå ñëîæíîãî ïðèìåðà, ðàññìîòðèì ôîðìóëó, âû÷èñ-
ëÿþùóþ, êàêóþ ÷àñòü â ïðîöåíòàõ îäíî ÷èñëî ñîñòàâëÿåò îò äðóãîãî:
Percent = (Part / Whole) * 100
 ýòîì îïåðàòîðå ïåðåìåííûå ñ èìåíåì Part è Whole ïðåäñòàâëÿþò äâà ðàç-
ëè÷íûõ ÷èñëà. Ôîðìóëà â ýòîì îïåðàòîðå âû÷èñëÿåò, êàêóþ ÷àñòü ñîñòàâëÿåò
çíà÷åíèå, õðàíèìîå â ïåðåìåííîé ñ èìåíåì Part, îò çíà÷åíèÿ, õðàíèìîãî â ïå-
ðåìåííîé ñ èìåíåì Whole, à â ïåðåìåííóþ ñ èìåíåì Percent ïîìåùàåòñÿ ðå-
çóëüòàò âû÷èñëåíèÿ. Ïðè âûïîëíåíèè ýòîãî îïåðàòîðà VBA íàõîäèò âñå ÷èñëà,
õðàíèìûå â ïàìÿòè, íà êîòîðûå ññûëàþòñÿ Part è Whole, è âñòàâëÿåò èõ â îïå-
ðàòîð ïåðåä âûïîëíåíèåì ëþáûõ âû÷èñëåíèé. Åñëè, íàïðèìåð, äî íà÷àëà âû-
ïîëíåíèÿ ýòîãî îïåðàòîðà çíà÷åíèå, õðàíèìîå â ïåðåìåííîé ïîä èìåíåì (ìîæ-
íî ïðîñòî çíà÷åíèå ïåðåìåííîé) Part, áûëî ðàâíî 5, à çíà÷åíèå ïåðåìåííîé
Whole — 20, òî ðåçóëüòàòîì, êîòîðûé áóäåò ñîõðàíåí â ïåðåìåííîé Percent,
ñòàíåò ÷èñëî 25.
92 Ãëàâà 3

Âûáîð èìåí äëÿ ïåðåìåííûõ


Ìîæíî âûáèðàòü ëþáîå èìÿ äëÿ ïåðåìåííîé çà íåáîëüøèìè èñêëþ÷åíèÿ-
ìè.  ýòîì ðàçäåëå ñíà÷àëà îáúÿñíÿþòñÿ ïðàâèëà è îãðàíè÷åíèÿ VBA äëÿ
èìåí ïåðåìåííûõ, à çàòåì îïèñûâàþòñÿ íåêîòîðûå ïðèíöèïû, êîòîðûìè ñëå-
äóåò ðóêîâîäñòâîâàòüñÿ ïðè âûáîðå èìåí ïåðåìåííûõ.

Èäåíòèôèêàòîðû
Èäåíòèôèêàòîð (identifier) — ýòî èìÿ, êîòîðîå âû äàåòå ýëåìåíòàì â ñîç-
äàâàåìûõ âàìè ïðîöåäóðàõ è ìîäóëÿõ, òàêèì êàê ïåðåìåííûå. Òåðìèí èäåí-
òèôèêàòîð îñíîâûâàåòñÿ íà òîì ôàêòå, ÷òî èìåíà, êîòîðûå âû ñîçäàåòå, îïðå-
äåëÿþò êîíêðåòíûå ó÷àñòêè ïàìÿòè (â ñëó÷àå èìåíè ïåðåìåííîé), ãðóïïû èí-
ñòðóêöèé (â ñëó÷àå èìåíè ìàêðîñà èëè ïðîöåäóðû) èëè äðóãèå ýëåìåíòû
ïðîãðàììû.
Ïðè âûáîðå èìåíè ïåðåìåííîé íåîáõîäèìî ñîáëþäàòü ñëåäóþùèå ïðàâèëà:
¨ Èìÿ ïåðåìåííîé äîëæíî íà÷èíàòüñÿ ñ áóêâû àëôàâèòà.
¨ Ïîñëå ïåðâîé áóêâû èìÿ ïåðåìåííîé ìîæåò ñîñòîÿòü èç ëþáîé êîìáèíà-
öèè öèôð, áóêâ èëè ñèìâîëîâ ïîä÷åðêèâàíèÿ ( ).
¨ Èìåíà ïåðåìåííûõ íå ìîãóò ñîäåðæàòü ïðîáåëû, òî÷êó (.) èëè ëþáîé äðó-
ãîé ñèìâîë, êîòîðûé VBA èñïîëüçóåò äëÿ îáîçíà÷åíèÿ ìàòåìàòè÷åñêèõ
îïåðàöèé è îïåðàöèé ñðàâíåíèÿ (=, +, – è òàê äàëåå).
¨ Èìåíà ïåðåìåííûõ íå ìîãóò ïðåâûøàòü 255 ñèìâîëîâ.
¨ Èìÿ ïåðåìåííîé íå ìîæåò äóáëèðîâàòü îïðåäåëåííûå êëþ÷åâûå ñëîâà
VBA. Åñëè âû âûáåðåòå èìåíà ïåðåìåííûõ, äóáëèðóþùèå êëþ÷åâûå ñëî-
âà, íàçûâàåìûå îãðàíè÷åííûìè êëþ÷åâûìè ñëîâàìè (restricted keywords),
VBA îòîáðàæàåò îäíî èç íåñêîëüêèõ âîçìîæíûõ ñîîáùåíèé îá îøèáêå
ñèíòàêñèñà.
¨ Èìÿ ïåðåìåííîé äîëæíî áûòü óíèêàëüíûì â ðàìêàõ åãî îáëàñòè äåéñò-
âèÿ (scope). Òî åñòü, èìÿ ïåðåìåííîé äîëæíî áûòü óíèêàëüíûì â ïðåäå-
ëàõ ïðîöåäóðû èëè ìîäóëÿ, â êîòîðîì âû îáúÿâëÿåòå ýòó ïåðåìåííóþ.
Íåêîòîðûå ïðèìåðû ïðàâèëüíûõ èìåí ïåðåìåííûõ:
Var12
Birth_Date
Ald_Item
Percent
Whole
Part
Line12

Ïðèìåðû íåïðàâèëüíûõ èìåí ïåðåìåííûõ:


New Item — Íåïðàâèëüíî, ïîòîìó ÷òî ñîäåðæèò ñèìâîë ïðîáåëà
5thDimension — Íå íà÷èíàåòñÿ ñ áóêâû
Dim — Äóáëèðóåò êëþ÷åâîå ñëîâî VBA
Week/Day — Ñîäåðæèò íåâåðíûé ñèìâîë: VBA èíòåðïðåòèðóåò êîñóþ ÷åðòó
êàê îïåðàòîð äåëåíèÿ
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 93

_Pay — Ñîäåðæèò íåäîïóñòèìûé ñèìâîë â íà÷àëå.

Èìåíà ïåðåìåííûõ íå «÷óâñòâèòåëüíû» ê ñîñòîÿíèþ ðåãèñòðà (not case-


sensitive), òî åñòü, íàïèñàíèå èìåíè ïåðåìåííîé ïðîïèñíûìè èëè çàãëàâíûìè
áóêâàìè íå èìååò çíà÷åíèÿ. Èìåíà FirstMyVar è firstmyvar ïðåäñòàâëÿþò äëÿ
VBA îäíî è òî æå. VBA ðåãóëèðóåò íàïèñàíèå èìåí ïåðåìåííûõ â âàøåì êîäå
íà îñíîâå çàãëàâíûõ áóêâ, êîòîðûå âû èñïîëüçîâàëè â ïîñëåäíèé ðàç, êîãäà
ââîäèëè èìÿ òîé èëè èíîé ïåðåìåííîé. Íàïðèìåð, åñëè âû ââîäèòå èìÿ
FirstMyVar, à çàòåì ïîçæå — èìÿ ïåðåìåííîé firstmyvar, VBA çàìåíÿåò âñå
âõîæäåíèÿ èìåíè FirstMyVar íà firstmyvar.
Ïðè âûáîðå èìåí ïåðåìåííûõ ñòàðàéòåñü äåëàòü èõ ïî âîçìîæíîñòè íàèáî-
ëåå èíôîðìàòèâíûìè: âûáèðàéòå èìåíà, ïîäîáíûå AllSum, à íå x èëè y. Õîðî-
øèì èìåíåì äëÿ ïåðåìåííîé, êîòîðàÿ õðàíèò çíà÷åíèå, ïðåäñòàâëÿþùåå òåì-
ïåðàòóðó â ãðàäóñàõ Öåëüñèÿ, ÿâëÿåòñÿ, íàïðèìåð, CelsiusTemp èëè DegreesC.
 ïðèìåðå ñ ôîðìóëîé ïðîöåíòíîãî îòíîøåíèÿ èç ïðåäûäóùåãî ðàçäåëà èìåíà
ïåðåìåííûõ Part è Whole áûëè âûáðàíû òàê, ÷òîáû îòðàæàòü íàçíà÷åíèå è
èñïîëüçîâàíèå ÷èñåë, êîòîðûå îíè õðàíÿò.
Åñëè âû áóäåòå ðàçðàáàòûâàòü ïðîãðàììíûé ïðîäóêò â ãðóïïå ðàçðà-
áîò÷èêîâ, âûáîð íàèìåíîâàíèé ïåðåìåííûõ (ôóíêöèé è äðóãèõ ïðîãðàììíûõ
åäèíèö) áóäåò îïðåäåëÿòüñÿ ñòåïåíüþ âçàèìîäåéñòâèÿ ìåæäó ó÷àñòíèêàìè
ïðîåêòà: ÷åì áîëüøå âçàèìîäåéñòâèå, òåì ìåíüøå ñâîáîäû ïðè âûáîðå
ïåðåìåííûõ.

Ñîçäàíèå ïåðåìåííûõ
Ñàìûì ïðîñòûì ñïîñîáîì ñîçäàíèÿ ïåðåìåííîé ÿâëÿåòñÿ èñïîëüçîâàíèå åå
â îïåðàòîðå 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

Íåÿâíîå îáúÿâëåíèå ïåðåìåííûõ óäîáíî, íî èìååò ïîòåíöèàëüíûå ïðîáëå-


ìû. Íàïðèìåð, êîãäà âû óæå èñïîëüçîâàëè ïåðåìåííóþ ñ èìåíåì MyVar è ñäå-
ëàåòå ïîçæå îøèáêó â èìåíè, íàáèðàÿ MVar. Â çàâèñèìîñòè îò òîãî, ãäå ïîÿ-
âèòñÿ â âàøåì êîäå íåïðàâèëüíîå èìÿ ïåðåìåííîé, VBA ìîæåò âûäàòü îøèáêó
âðåìåíè èñïîëíåíèÿ èëè ïðîñòî ñîçäàòü íîâóþ ïåðåìåííóþ. Åñëè VBA ñîçäàñò
íîâóþ ïåðåìåííóþ, ó âàñ ìîãóò âîçíèêíóòü ïðîáëåìû, êîòîðûå î÷åíü òðóäíî
îáíàðóæèòü.
Íåÿâíîå îáúÿâëåíèå ïåðåìåííûõ âûçûâàåò òàêæå ïðîáëåìû, åñëè âû çàïè-
ñûâàåòå îïåðàòîð ïðèñâàèâàíèÿ, îøèáî÷íî ïîëàãàÿ, ÷òî íåÿâíî îáúÿâëÿåòå íî-
âóþ ïåðåìåííóþ, òîãäà êàê âû íà ñàìîì äåëå èñïîëüçóåòå ðàíåå ñîçäàííóþ.
 ýòîì ñëó÷àå âû íå÷àÿííî óíè÷òîæàåòå ðàíåå ñîõðàíåííîå çíà÷åíèå. Ýòî
îáû÷íî íå ïðèâîäèò ê îøèáêå âðåìåíè èñïîëíåíèÿ, íî âûçûâàåò äðóãèå ïðî-
áëåìû, ïðè÷èíó êîòîðûõ òðóäíî îáíàðóæèòü.
Âåðîÿòíî, ïî ýòèì èëè äðóãèì ïðè÷èíàì VBA ïðåäîñòàâëÿåò âàì âîçìîæ-
íîñòü âûïîëíÿòü ÿâíîå (explicit) îáúÿâëåíèå ïåðåìåííûõ. ßâíîå îáúÿâëåíèå
ïåðåìåííûõ èìååò ñëåäóþùèå ïðåèìóùåñòâà:
Óñêîðÿåòñÿ âûïîëíåíèå êîäà (÷òî, êîíå÷íî, äëÿ íà÷èíþùåãî ïðîãðàììèñòà
íå ÿâëÿåòñÿ îïðåäåëÿþùèì). VBA ñîçäàåò âñå îáúÿâëåííûå ÿâíî ïåðåìåííûå â
ìîäóëå èëè ïðîöåäóðå ïåðåä âûïîëíåíèåì êîäà ïðîöåäóðû. Ñêîðîñòü âûïîëíå-
íèÿ êîäà óâåëè÷èâàåòñÿ íà òî êîëè÷åñòâî âðåìåíè, êîòîðîå èíà÷å íåîáõîäèìî
äëÿ àíàëèçà è ñîçäàíèÿ íåÿâíî îáúÿâëÿåìûõ ïåðåìåííûõ.
¨ Óìåíüøàåòñÿ êîëè÷åñòâî îøèáîê â ðåçóëüòàòå íåïðàâèëüíîãî íàïèñàíèÿ
èìåíè ïåðåìåííîé.
¨ Êîä ñòàíîâèòñÿ áîëåå ÷èòàáåëüíûì è ïîíÿòíûì. Âèäÿ âñå îáúÿâëåíèÿ ïå-
ðåìåííûõ â íà÷àëå ìîäóëÿ èëè ïðîöåäóðû, ïîëüçîâàòåëü ìîæåò ëåãêî îï-
ðåäåëèòü, êàêèå ïåðåìåííûå èñïîëüçóþòñÿ â ýòîì ìîäóëå èëè ïðîöåäóðå.
¨ Ñ ïîìîùüþ ÿâíîãî îáúÿâëåíèÿ ïåðåìåííûõ ìîæíî íîðìàëèçîâàòü âûäå-
ëåíèå çàãëàâíûìè áóêâàìè â èìåíè ïåðåìåííîé. Åñëè âû ÿâíî îáúÿâëÿå-
òå ïåðåìåííóþ, VBA âñåãäà èçìåíÿåò çàãëàâíûå áóêâû â èìåíè ïåðåìåí-
íîé â îïåðàòîðå VBA â ñîîòâåòñòâèè ñ èìåíåì â îáúÿâëåíèè ïåðåìåííîé.
Íàïðèìåð, åñëè âû ÿâíî îáúÿâëÿåòå ïåðåìåííóþ ñ èñïîëüçîâàíèåì çà-
ãëàâíûõ áóêâ â èìåíè MyValue, à çàòåì ïîçæå ââåäåòå èìÿ ýòîé ïåðåìåí-
íîé êàê myvalue, VBA çàìåíÿåò myvalue íà MyValue äëÿ ñîîòâåòñòâèÿ
âûäåëåíèþ çàãëàâíûìè áóêâàìè â ÿâíîì îáúÿâëåíèè:
MyValue
Äëÿ ÿâíîãî îáúÿâëåíèÿ ïåðåìåííûõ èñïîëüçóéòå VBA-îïåðàòîð Dim ñî
ñëåäóþùèì ñèíòàêñèñîì:
Ñèíòàêñèñ
Dim name1 [, name2]
nameN — ýòî ëþáîé äîïóñòèìûé èäåíòèôèêàòîð ïåðåìåííîé. Íàïðèìåð:
Dim PcntProfit
Dim PcntProfit, Gross_Income, Total_Costs
Ïåðâûé èç âûøåïðèâåäåííûõ îïåðàòîðîâ óêàçûâàåò VBA ñîçäàòü ïåðåìåííóþ
ñ èìåíåì PcntProfit. (Êëþ÷åâîå ñëîâî Dim, ìåæäó ïðî÷èì, ÿâëÿåòñÿ ñîêðàùåíèåì
ñëîâà Dimension). Âñå ïåðåìåííûå, êîòîðûå âû ñîçäàåòå ñ ýòîé ôîðìîé êëþ÷åâîãî
ñëîâà Dim, ÿâëÿþòñÿ ïåðåìåííûìè òèïà Variant.
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 95

Âñÿêèé ðàç, êîãäà VBA ñîçäàåò íîâóþ ïåðåìåííóþ, ýòà ïåðåìåííàÿ


èíèöèàëèçèðóåòñÿ: ñòðîêè èíèöèàëèçèðóþòñÿ ïóñòûìè ñòðîêàìè (íå
ñîäåðæàò ñèìâîëîâ), ÷èñëà — çíà÷åíèåì 0, ïåðåìåííûå Boolean — çíà÷åíèåì
False, äàòû — 30 äåêàáðÿ 1899 ãîäà.
Åñëè âû, íàïðèìåð, âûïîëíèòå êîä
Sub ss()
MsgBox tmp
End Sub
òî â ðåçóëüòàòå ïîëó÷èòå ïóñòîå îêíî ôóíêöèè MsgBox. Åñëè æå âû ïåðåä
ôóíêöèåé ïîìåñòèòå îïåðàòîð
Dim tmp as Integer
â îêíå ôóíêöèè MsgBox âû óâèäèòå, ÷òî ïåðåìåííàÿ tmp èìååò çíà÷åíèå 0.
Îòìåòèì âñå æå, ÷òî îïûòíûå ïðîãðàììèñòû íå î÷åíü ïîëàãàþòñÿ íà ïîäîáíóþ
ïîìîùü ñèñòåì ïðîãðàììèðîâàíèÿ ïðè îïèñàíèè ïåðåìåííûõ è ÷àùå ñàìè
èíèöèàëèçèðóþò èñïîëüçóåìûå èìè ïåðåìåííûå.
Ïåðåìåííóþ ñëåäóåò îáúÿâëÿòü òîëüêî îäèí ðàç â îòäåëüíîé ïðîöåäóðå èëè

Ðèñ. 3.2
Îêíî ñîîáùåíèé, ïîëó÷åííîå
ïðîöåäóðîé HelloWorld

ìîäóëå. Òàê êàê îïåðàòîð Dim íàõîäèòñÿ ïåðåä ëþáûìè îïåðàòîðàìè,


ôàêòè÷åñêè èñïîëüçóþùèìè ïåðåìåííóþ, âû ìîæåòå ïîìåùàòü åãî â ëþáîì
ìåñòå â ïðîöåäóðå. Â ïðàêòèêå ïðîãðàììèðîâàíèÿ õîðîøèì ïðàâèëîì
ÿâëÿåòñÿ ñîáèðàòü âñå ÿâíûå îáúÿâëåíèÿ ïåðåìåííûõ â îäíîì ìåñòå â íà÷àëå
ïðîöåäóðû.
 ëèñòèíãå 3.2 ïðèâåäåíà ðàíåå ðàññìàòðèâàåìàÿ ïðîöåäóðà HelloWorld,
ìîäèôèöèðîâàííàÿ äëÿ ÿâíîãî îáúÿâëåíèÿ ïåðåìåííîé ñ èìåíåì HelloMsg,
êîòîðóþ îíà èñïîëüçóåò äëÿ õðàíåíèÿ òåêñòà, îòîáðàæàåìîãî îïåðàòîðîì
MsgBox. (Ïðîöåäóðà HelloWorld â ëèñòèíãå 3.2 îòîáðàæàåò äèàëîãîâîå îêíî,
ïîêàçàííîå íà ðèñ. 3.2).

Ëèñòèíã 3.2. Ïðîöåäóðà HelloWorld ñ ÿâíûì îáúÿâëåíèåì ïåðåìåííîé


1: Sub HelloWorld()
2: Dim HelloMsg ‘ ïåðåìåííàÿ äëÿ MsgBox
3: HelloMsg = “Hello, World!”
4: MsgBox HelloMsg, , “Îêíî ïðèâåòñòâèÿ”
5: End Sub

Îïåðàòîð Dim (â ñòðîêå 2) ëèñòèíãà 3.1 îáúÿâëÿåò ïåðåìåííóþ HelloMsg


è ðåçåðâèðóåò äëÿ íåå îáëàñòü ïàìÿòè (â äàííîé ïîäïðîãðàììå HelloMsg — ýòî
ïåðåìåííàÿ òèïà Variant). Ñòðîêà 2 âêëþ÷àåò êîíå÷íûé êîììåíòàðèé, óêà-
çûâàþùèé íàçíà÷åíèå ýòîé ïåðåìåííîé.  ñòðîêå 3 âûïîëíÿåòñÿ ïðèñâàèâà-
íèå ïåðåìåííîé HelloMsg ñòðîêè «Hello, World!». Äàëåå (â ñòðîêå 4) ïåðåìåí-
íàÿ HelloMsg èñïîëüçóåòñÿ êàê îäèí èç àðãóìåíòîâ ïðîöåäóðû MsgBox. Ôóíê-
öèÿ MsgBox îòîáðàæàåò òî æå îêíî ñîîáùåíèÿ, ÷òî è ðàíüøå. Õîòÿ MsgBox
ïîëó÷àåò òåïåðü ñâîé ïåðâûé àðãóìåíò èç ïåðåìåííîé, ýòà ïåðåìåííàÿ ñîäåð-
96 Ãëàâà 3

æèò òó æå ñòðîêîâóþ èíôîðìàöèþ, ÷òî áûëà ðàíåå çàïèñàíà íåïîñðåäñòâåííî


â îïåðàòîð MsgBox.
Çàìåòüòå, ÷òî â ðåçóëüòàòå ìû ïîëó÷èëè îêíî ñîîáùåíèé, êîòîðîå íå íåñåò
èíôîðìàöèè î òîì, â êàêîì ïðèëîæåíèè ðàáîòàåò èñõîäíûé ìàêðîñ (ðàíåå ýòà
èíôîðìàöèÿ íàõîäèëàñü â çàãîëîâêå îêíà).

Çàäàíèå òèïà äàííûõ ïåðåìåííîé


Âñå ïåðåìåííûå â VBA, íåçàâèñèìî îò òîãî, îáúÿâëÿþòñÿ ëè îíè íåÿâíî èëè
ÿâíî, ÿâëÿþòñÿ ïåðåìåííûìè òèïà Variant, åñëè òîëüêî âû íå çàäàåòå òèï
ïåðåìåííîé â îáúÿâëÿþùåì åå îïåðàòîðå. Îáúÿâëåíèå òèïèçèðîâàííûõ
ïåðåìåííûõ òèïèçèðîâàííàÿ ïåðåìåííàÿ(ïåðåìåííûõ, òèï äàííûõ êîòîðûõ
âû çàäàåòå) èìååò íåñêîëüêî ïðåèìóùåñòâ:
¨ Ïðèìåíåíèå òèïèçèðîâàííûõ ïåðåìåííûõ óñêîðÿåò âûïîëíåíèå êîäà
ïðîãðàìì. Ïîñêîëüêó ïðè îáúÿâëåíèè âû óêàçûâàåòå VBA òèï
ïåðåìåííîé, âûïîëíåíèå ïðîãðàììû óñêîðÿåòñÿ íà òî âðåìÿ, êîòîðîå
VBA ïîòðàòèë áû èíà÷å íà àíàëèç ïåðåìåííîé òèïà Variant, ÷òîáû
îïðåäåëèòü åå êîíêðåòíûé òèï.
¨ Ïðèìåíåíèå òèïèçèðîâàííûõ ïåðåìåííûõ ïîâûøàåò ýôôåêòèâíîñòü
êîäà. Ïåðåìåííûå òèïà Variant ìîãóò çàíèìàòü ãîðàçäî áîëüøå ïàìÿòè,
÷åì ïåðåìåííûå îïðåäåëåííûõ òèïîâ. Òèïèçèðîâàííàÿ ïåðåìåííàÿ
çàíèìàåò òîëüêî ïàìÿòü, íåîáõîäèìóþ äëÿ ýòîãî îïðåäåëåííîãî òèïà.
Èñïîëüçîâàíèå òèïèçèðîâàííûõ ïåðåìåííûõ ìîæåò çíà÷èòåëüíî
ñîêðàòèòü îáúåì ïàìÿòè, òðåáóåìûé äëÿ âàøåé ïðîãðàììû VBA;
â íåêîòîðûõ ñëó÷àÿõ èñïîëüçîâàíèå òèïèçèðîâàííûõ ïåðåìåííûõ ìîæåò
èìåòü çíà÷åíèå ñ òî÷êè çðåíèÿ òîãî, äîñòàòî÷íî ëè ïàìÿòè äëÿ ðàáîòû
âàøåé ïðîöåäóðû èëè íåò.
¨ Ïðîãðàììíûé êîä ñ òèïèçèðîâàííûìè ïåðåìåííûìè ëåã÷å ÷èòàòü
è ïîíèìàòü.
¨  ïðîãðàììàõ ñ òèïèçèðîâàííûìè ïåðåìåííûìè ëåã÷å îáíàðóæèâàòü
íåêîòîðûå òèïû îøèáîê ïðîãðàììèñòîâ, íàïðèìåð, íåñîîòâåòñòâèå òèïîâ
äàííûõ, ïîòîìó ÷òî VBA îòîáðàæàåò îøèáêè âðåìåíè èñïîëíåíèÿ,
êîòîðûå íå âîçíèêëè áû, åñëè áû ïåðåìåííûå áûëè íåòèïèçèðîâàííûìè.
Ñóùåñòâóþò äðóãèå ïðè÷èíû, ïî êîòîðûì âàì ìîæåò ïîíàäîáèòüñÿ îáú-
ÿâëÿòü òèïèçèðîâàííûå ïåðåìåííûå. Íàïðèìåð, íåñìîòðÿ íà òî, ÷òî ïåðåìåí-
íûå òèïà Variant ìîãóò ñîõðàíÿòü äàòû, ïåðåìåííàÿ òèïà Variant ìîæåò
íåïðàâèëüíî ñîõðàíèòü äàòó èç Excel. Ñ ïåðåìåííûìè, îáúÿâëåííûìè ÿâíî
ñ òèïîì Date, òàêîé ïðîáëåìû íå âîçíèêàåò.
Òèï ïåðåìåííîé îáúÿâëÿåòñÿ â òîì æå îïåðàòîðå, êîòîðûé èñïîëüçóåòñÿ
äëÿ îáúÿâëåíèÿ ñàìîé ïåðåìåííîé. Ìîæíî îáúÿâëÿòü òèïèçèðîâàííóþ ïåðå-
ìåííóþ ëèáî ïðè íåÿâíîì îáúÿâëåíèè, ëèáî ïðè ÿâíîì — ñ ïîìîùüþ Dim.
Ïðè îáúÿâëåíèè ïåðåìåííûõ òèïà String, ìîæíî òàêæå çàäàâàòü äëèíó ñòðî-
êè.

Èñïîëüçîâàíèå Dim äëÿ îáúÿâëåíèÿ òèïèçèðîâàííûõ ïåðåìåííûõ


Äëÿ îáúÿâëåíèÿ ïåðåìåííîé è åå òèïà ñ ïîìîùüþ îïåðàòîðà Dim äîáàâüòå
êëþ÷åâîå ñëîâî As ïåðåä èìåíåì ïåðåìåííîé, à çàòåì ââåäèòå èìÿ òèïà äàí-
íûõ äëÿ ýòîé ïåðåìåííîé.
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 97

Çàìå÷àíèå
Êàê òîëüêî âû ââîäèòå êëþ÷åâîå ñëîâî As ïðè îáúÿâëåíèè ïåðåìåííîé, ðåäàêòîð VB
ïðåäëàãàåò ñïèñîê òèïîâ ïåðåìåííûõ, êîòîðûé çàâèñèò îò ïîäêëþ÷åííûõ ê ïðîåêòó
áèáëèîòåê.

Âîò îáùèé ñèíòàêñèñ äëÿ èñïîëüçîâàíèÿ îïåðàòîðà Dim ïðè îáúÿâëåíèè òè-
ïèçèðîâàííûõ ïåðåìåííûõ:
Ñèíòàêñèñ
Dim varname1 [As type1] [, varname2 [As type2]…] [As type]
VarnameN ïðåäñòàâëÿåò ëþáîå äîïóñòèìîå èìÿ ïåðåìåííîé VBA, à type(N) — ëþ-
áîå èç èìåí òèïîâ äàííûõ VBA.

Ñëåäóþùèå ñòðîêè ïîêàçûâàþò ïðèìåðû ïðàâèëüíîãî ñèíòàêñèñà äëÿ îáú-


ÿâëåíèé òèïèçèðîâàííûõ ïåðåìåííûõ:
Dim Ñ÷åò÷èê As Single
Dim Öåíà As Currency
Dim ÄàòàÏëàòåæà As Date
Dim Ñîîáùåíèå As String
Dim Counter As Integer
Dim PcntProfit As Single, Gross_Sales As Currency, Message As String
Dim NetValue, PcntProfit As Single
Ïîñëå îáúÿâëåíèÿ òèïèçèðîâàííîé ïåðåìåííîé, íåçàâèñèìî îò òîãî, îáúÿâ-
ëÿåòñÿ ëè ýòà ïåðåìåííàÿ ÿâíî èëè íåÿâíî, è êàê çàäàåòñÿ òèï, ýòà ïåðåìåííàÿ
ñîõðàíÿåò òîò æå ñàìûé òèï ñòîëüêî âðåìåíè, ñêîëüêî îíà ñóùåñòâóåò. Íåëüçÿ
ïåðåîáúÿâèòü ïåðåìåííóþ èëè ïåðåîïðåäåëèòü åå òèï.

Èñïîëüçîâàíèå ñèìâîëîâ îïðåäåëåíèÿ òèïà


äëÿ îáúÿâëåíèÿ òèïèçèðîâàííûõ ïåðåìåííûõ
Ïðè íåÿâíîì îáúÿâëåíèè ìîæíî òàêæå çàäàâàòü òèï ïåðåìåííîé, äîáàâëÿÿ
ñïåöèàëüíûé ñèìâîë, íàçûâàåìûé ñèìâîëîì îïðåäåëåíèÿ òèïà (type-
definition character), â êîíåö èìåíè ïåðåìåííîé. Â òàáë. 4.2 ïðèâîäÿòñÿ ñèìâî-
ëû îïðåäåëåíèÿ òèïà VBA è òèïû, êîòîðûå îíè îáîçíà÷àþò.
Òàáëèöà 3.2. Ñèìâîëû îïðåäåëåíèÿ òèïà

Ñèìâîë îïðåäåëåíèÿ Òèï


! Single
@ Currency
# Double
$ String
% Integer
& Long

Çàìåòüòå, ÷òî â ýòîé òàáëèöå ïðèâåäåíû òîëüêî øåñòü ñèìâîëîâ îïðåäåëå-


íèÿ òèïà; íåò ñèìâîëîâ îïðåäåëåíèÿ òèïà äëÿ Byte, Boolean, Date, Object
èëè Array. Ñèìâîëû îïðåäåëåíèÿ òèïà ìîãóò íàõîäèòüñÿ òîëüêî â êîíöå èìå-
íè ïåðåìåííîé.
98 Ãëàâà 3

Ñèìâîëû îïðåäåëåíèÿ òèïà â VBA èìåþò ñâîþ èñòîðèþ. Â ðàííèõ


ðàçíîâèäíîñòÿõ ÿçûêà BASIC ñèìâîëû îïðåäåëåíèÿ òèïà áûëè åäèíñòâåííûì
ñïîñîáîì çàäàòü òèï ïåðåìåííîé. Íåñìîòðÿ íà òî, ÷òî ñëåäóåò çíàòü, ÷òî òàêîå
ñèìâîëû îïðåäåëåíèÿ òèïà è êàê îíè èñïîëüçóþòñÿ, íåîáõîäèìîñòü â èõ
ïðèìåíåíèè âîçíèêàåò ðåäêî — èñïîëüçîâàíèå îïåðàòîðà Dim ñ êëþ÷åâûì ñëî-
âîì As íàìíîãî ëåã÷å è ïîíÿòíåå. Áîëüøèíñòâî ïðîãðàììèñòîâ, ðàáîòàþùèõ
íà VBA, íå èñïîëüçóþò ñèìâîëû îïðåäåëåíèÿ òèïà.
 ëèñòèíãå 3.3 ïðèâåäåí åùå îäèí âàðèàíò ïðîöåäóðû HelloWorld, êîòîðàÿ
îáñóæäàëàñü ðàíåå.

Ëèñòèíã 3.3. ßâíîå è íåÿâíîå îáúÿâëåíèå òèïà


1: Sub HelloWorld()
2: Dim HelloMsg As String
3: HelloMsg = “Hello, World!”
4: Title$ = “Îêíî ïðèâåòñòâèÿ”
5: MsgBox HelloMsg, , Title$
6: End Sub

Ýòà âåðñèÿ ïðîöåäóðû HelloWorld ðàáîòàåò âî ìíîãîì òàê æå, êàê è ïðåäû-
äóùèå. Ñòðîêà 1 ñîäåðæèò îáúÿâëåíèå ïðîöåäóðû. Â ñòðîêå 2 îïåðàòîð Dim
ÿâíî îáúÿâëÿåò ïåðåìåííóþ HelloMsg. Ïîñêîëüêó îïåðàòîð Dim âêëþ÷àåò
êëþ÷åâîå ñëîâî As è èìÿ òèïà String, ïåðåìåííàÿ HelloMsg èìååò òèï
String. Ñòðîêà 3 ïðèñâàèâàåò òåêñò ñîîáùåíèÿ ñòðîêîâîé ïåðåìåííîé
HelloMsg.
Ñòðîêà 4 íåÿâíî îáúÿâëÿåò ïåðåìåííóþ Title$ è â òî æå âðåìÿ ïðèñâàèâàåò
ïåðåìåííîé òåêñò çàãîëîâêà îêíà ñîîáùåíèÿ. Ïîñêîëüêó èìÿ ïåðåìåííîé
Title$ èìååò íà êîíöå ñèìâîë îïðåäåëåíèÿ òèïà äëÿ ñòðîêè, ýòà ïåðåìåííàÿ
òàêæå èìååò òèï String. Íàêîíåö, ñòðîêà 5 èñïîëüçóåò îïåðàòîð MsgBox äëÿ
îòîáðàæåíèÿ îêíà ñîîáùåíèÿ; â ýòîì îïåðàòîðå è òåêñò ñîîáùåíèÿ, è ñòðîêà
çàãîëîâêà îêíà ÿâëÿþòñÿ ïåðåìåííûìè: HelloMsg è Title$, ñîîòâåòñòâåííî.
Ïîñëå äîáàâëåíèÿ ñèìâîëà îïðåäåëåíèÿ òèïà ê ïåðåìåííîé íåîáõîäèìî
âêëþ÷àòü ñèìâîë îïðåäåëåíèÿ òèïà êàæäûé ðàç, êîãäà âû èñïîëüçóåòå èìÿ ïå-
ðåìåííîé. Åñëè áû ñèìâîë îïðåäåëåíèÿ òèïà áûë îïóùåí â èìåíè ïåðåìåííîé
Title$ â ñòðîêå 5 (ãäå Title$ èñïîëüçóåòñÿ ïåðâûé ðàç ïîñëå íåÿâíîãî òèïèçè-
ðîâàííîãî îáúÿâëåíèÿ), òî âî âðåìÿ âûïîëíåíèÿ ïðîöåäóðû ïðîèçîøëà áû
runtime-îøèáêà.

Èñïîëüçîâàíèå Dim äëÿ îáúÿâëåíèÿ ñòðîêîâûõ ïåðåìåííûõ


ôèêñèðîâàííîé äëèíû
Íåçàâèñèìî îò òîãî, îáúÿâëÿþòñÿ ëè ïåðåìåííûå òèïà String ñ ïîìîùüþ
îïåðàòîðà Dim èëè äîáàâëåíèåì ñèìâîëà îïðåäåëåíèÿ òèïà $, ñîçäàâàåìûå âàìè
ñòðîêîâûå ïåðåìåííûå ïî óìîë÷àíèþ ÿâëÿþòñÿ ñòðîêàìè ïåðåìåííîé äëèíû.
Ñòðîêîâûå ïåðåìåííûå ïåðåìåííîé äëèíû èçìåíÿþò äëèíó, â çàâèñèìîñòè
îò äëèíû ñòðîêè, ñîõðàíÿåìîé ïåðåìåííîé. Èíîãäà ìîæåò ïîíàäîáèòüñÿ èñ-
ïîëüçîâàòü ñòðîêó ôèêñèðîâàííîé äëèíû (fixed-length). Ñòðîêè ôèêñèðîâàí-
íîé äëèíû âñåãäà èìåþò îäíó è òó æå äëèíó. Îíè ïîëåçíû, åñëè íåîáõîäèìî
îáåñïå÷èòü, ÷òîáû òåêñò, ñîõðàíåííûé â ñòðîêîâîé ïåðåìåííîé, âñåãäà ñîäåð-
æàë îäíî è òî æå ÷èñëî ñèìâîëîâ.
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 99

Ìîæíî èñïîëüçîâàòü ñòðîêè ôèêñèðîâàííîé äëèíû, íàïðèìåð, äëÿ âûðàâ-


íèâàíèÿ èíôîðìàöèè â ñòîëáöàõ ïðè åå îòîáðàæåíèè èëè äëÿ îáåñïå÷åíèÿ
òîãî, ÷òîáû ñòðîêîâûå äàííûå, ñîõðàíÿåìûå â îòäåëüíîé ïåðåìåííîé, íèêîãäà
íå ïðåâûøàëè îïðåäåëåííîé äëèíû. Ñóùåñòâóåò òîëüêî îäèí ñïîñîá îáúÿâëå-
íèÿ ñòðîêîâîé ïåðåìåííîé ôèêñèðîâàííîé äëèíû: íåîáõîäèìî èñïîëüçîâàòü
îïåðàòîð Dim. Ñëåäóþùàÿ ñòðîêà ïîêàçûâàåò îáùèé ñèíòàêñèñ äëÿ ñîçäàíèÿ
ñòðîêè ôèêñèðîâàííîé äëèíû:
Ñèíòàêñèñ
Dim varname As String * N
Varname — ýòî ëþáîå äîïóñòèìîå èìÿ ïåðåìåííîé, à N — ýòî ëþáîå ÷èñëî îò 1 äî
ìàêñèìàëüíîé äëèíû ñòðîêè, ðàâíîé ïðèìåðíî 2 ìèëëèàðäàì ñèìâîëîâ.

Ñëåäóþùèé îïåðàòîð ÿâëÿåòñÿ ïðèìåðîì îáúÿâëåíèÿ ñòðîêè


ôèêñèðîâàííîé äëèíû:
Dim LastName As String * 30
Ñèìâîë (*), çà êîòîðûì ñëåäóåò ÷èñëî ïîñëå êëþ÷åâîãî ñëîâà String
óêàçûâàåò VBA ñîçäàòü ñòðîêîâóþ ïåðåìåííóþ êàê ñòðîêó ôèêñèðîâàííîé
äëèíû ñ çàäàííîé äëèíîé (â ýòîì ñëó÷àå — 30 ñèìâîëîâ). Îáëàñòü äåéñòâèÿ:
äîñòóïíîñòü ïåðåìåííûõ
Òåðìèí îáëàñòü äåéñòâèÿ (scope) îòíîñèòñÿ ê îáëàñòè ïðîöåäóðû èëè ìî-
äóëÿ VBA, ãäå äàííàÿ ïåðåìåííàÿ, ïðîöåäóðà èëè äðóãîé èäåíòèôèêàòîð, ÿâ-
ëÿþòñÿ äîñòóïíûìè. Â ýòîì ðàçäåëå îïèñûâàþòñÿ äâà áàçîâûõ óðîâíÿ îáëàñòè
äåéñòâèÿ: ïðîöåäóðíûé è ìîäóëüíûé. Ïåðåìåííûå, ïðîöåäóðû è èäåíòèôèêà-
òîðû, êîòîðûå äîñòóïíû òîëüêî â ïðîöåäóðå, èìåþò îáëàñòü äåéñòâèÿ ïðîöå-
äóðíîãî óðîâíÿ, à òå, êîòîðûå äîñòóïíû äëÿ âñåõ ïðîöåäóð â ìîäóëå, èìåþò îá-
ëàñòü äåéñòâèÿ ìîäóëüíîãî óðîâíÿ.

Îáëàñòü äåéñòâèÿ ïðîöåäóðíîãî óðîâíÿ


Ïåðåìåííàÿ, îáúÿâëåííàÿ â ïðîöåäóðå, ÿâëÿåòñÿ äîñòóïíîé òîëüêî â ýòîé
ïðîöåäóðå. Íàïðèìåð, ïåðåìåííàÿ HelloMsg èç ñòðîêè 2 ëèñòèíãà 4.1, ÿâëÿåò-
ñÿ äîñòóïíîé òîëüêî â ïðîöåäóðå HelloWorld; íèêàêàÿ äðóãàÿ ïðîöåäóðà íå
èìååò äîñòóïà ê ýòîé ïåðåìåííîé. Â äåéñòâèòåëüíîñòè, ïåðåìåííàÿ HelloMsg
ðåàëüíî ñóùåñòâóåò òîëüêî â òî âðåìÿ, êîãäà VBA ôàêòè÷åñêè âûïîëíÿåò ïðî-
öåäóðó HelloWorld. Ïîýòîìó ãîâîðÿò, ÷òî ïåðåìåííàÿ HelloMsg èìååò îáëàñòü
äåéñòâèÿ ïðîöåäóðíîãî óðîâíÿ (procedure-level scope).
Ìîæåò áûòü, ñíà÷àëà ýòî íåçàìåòíî, íî VBA îãðàíè÷èâàåò äîñòóï ê ïåðå-
ìåííûì ïîñðåäñòâîì ñâîèõ ïðàâèë îáëàñòè äåéñòâèÿ äëÿ óïðîùåíèÿ ðàáîòû
ïðîãðàììèñòà. Ïîñêîëüêó ïåðåìåííàÿ ñ îáëàñòüþ äåéñòâèÿ ïðîöåäóðíîãî
óðîâíÿ íåäîñòóïíà íè äëÿ êàêîé ïðîöåäóðû, çà èñêëþ÷åíèåì òîé, â êîòîðîé
îáúÿâëÿåòñÿ ýòà ïåðåìåííàÿ, ìîæíî íå î÷åíü áåñïîêîèòüñÿ î äóáëèðîâàíèè
èìåí ïåðåìåííûõ.
Ïðàâèëà âûáîðà èìåí ïåðåìåííûõ óêàçûâàþò, ÷òî èìÿ ïåðåìåííîé äîëæíî
áûòü óíèêàëüíûì â åå îáëàñòè äåéñòâèÿ. Äëÿ ïåðåìåííûõ ñ îáëàñòüþ äåéñòâèÿ
ïðîöåäóðíîãî óðîâíÿ ýòî îçíà÷àåò, ÷òî âû íå ìîæåòå îáúÿâëÿòü äâå ïåðåìåí-
íûå ñ îäíèì è òåì æå èìåíåì â îäíîé è òîé æå ïðîöåäóðå. (Î÷åâèäíî, ÷òî íè
VBA, íè ïîëüçîâàòåëü íå ìîãóò îïðåäåëèòü, êàêóþ ïåðåìåííóþ âû íàìåðåâàå-
òåñü èñïîëüçîâàòü, åñëè îáå îíè èìåþò îäíî è òî æå èìÿ).
100 Ãëàâà 3

Ïîñêîëüêó îáëàñòü äåéñòâèÿ ïðîöåäóðíîãî óðîâíÿ îãðàíè÷èâàåò äîñòóï ê


ïåðåìåííîé ïðîöåäóðîé, â êîòîðîé îáúÿâëÿåòñÿ ýòà ïåðåìåííàÿ, âû ìîæåòå
èñïîëüçîâàòü òî æå èìÿ ïåðåìåííîé â ðàçíûõ ïðîöåäóðàõ. Ëèñòèíã 3.3 ïîêà-
çûâàåò äâå çàêîí÷åííûå ïðîöåäóðû. (HelloWorld â ýòîì ëèñòèíãå îòîáðàæàåò
òî æå îêíî ñîîáùåíèÿ, êîòîðîå áûëî ïîêàçàíî ðàíåå íà ðèñ. 3.1.)

Ëèñòèíã 3.3. Îáëàñòü äåéñòâèÿ ïðîöåäóðíîãî óðîâíÿ


1: Sub HelloWorld()
2: Dim HelloMsg 'ñîõðàíÿåò òåêñò äëÿ MsgBox
3: HelloMsg = "HelloWorld!"
4: MsgBox HelloMsg, , "Îêíî ïðèâåòñòâèÿ"
5: End Sub
6:
7: Sub HelloDave()
8: Dim HelloMsg 'ñîõðàíÿåò òåêñò äëÿ Msgbox
9: HelloMsg = "Hello, Dave!"
10: MsgBox HelloMsg, , "Äðóãîå îêíî ñîîáùåíèÿ"
11: End Sub

Ñòðîêè 1–5 ñîäåðæàò òó æå ïðîöåäóðó HelloWorld èç ëèñòèíãà 3.1, êîòîðàÿ


ðàáîòàåò òî÷íî òàê æå.  ìîäóëü áûëà äîáàâëåíà ïðîöåäóðà HelloDave, êîòî-
ðàÿ è íà÷èíàåòñÿ â ñòðîêå 7 ëèñòèíãà 3.3. Ïðîöåäóðà HelloDave ðàáîòàåò òàê
æå, êàê ïðîöåäóðà HelloWorld, ïðîñòî îíà îòîáðàæàåò äðóãîå òåêñòîâîå ñîîá-
ùåíèå è çàãîëîâîê â ñâîåì äèàëîãîâîì îêíå. Íà ðèñ. 3.2 ïîêàçàíî îêíî ñîîáùå-
íèé, îòîáðàæåííîå ïðîöåäóðîé HelloDave.
Çàìåòüòå, ÷òî â ñòðîêàõ 2 è 8 îáå ïðîöåäóðû èñïîëüçóþò îïåðàòîð Dim äëÿ
îáúÿâëåíèÿ ïåðåìåííûõ ñ èìåíåì HelloMsg. Ýòî ðàçóìíî, ïîòîìó ÷òî Hel-
loMsg ÿâëÿåòñÿ õîðîøèì îïèñàòåëüíûì èìåíåì äëÿ ñîäåðæèìîãî è íàçíà÷å-
íèÿ ïåðåìåííîé â îáåèõ ïðîöåäóðàõ.
Ïîñêîëüêó ïåðåìåííûå HelloMsg îáúÿâëÿþòñÿ âíóòðè îòäåëüíûõ ïðîöåäóð
è èìåþò îáëàñòü äåéñòâèÿ ïðîöåäóðíîãî óðîâíÿ, íå âîçíèêàåò äâóñìûñëåííî-
ñòè ïî ïîâîäó òîãî, êàêóþ ïåðåìåííóþ áóäåò èñïîëüçîâàòü VBA. Â ïðîöåäóðå
HelloWorld VBA èñïîëüçóåò ïåðåìåííóþ HelloMsg, îáúÿâëåííóþ ëîêàëüíî
(ñòðîêà 2 â ëèñòèíãå). Â ïðîöåäóðå HelloDave VBA èñïîëüçóåò ïåðåìåííóþ
HelloMsg, îáúÿâëåííóþ ëîêàëüíî â ýòîé ïðîöåäóðå (ñòðîêà 8).

Îáëàñòü äåéñòâèÿ ìîäóëüíîãî óðîâíÿ


Èíîãäà íåîáõîäèìî, ÷òîáû íåñêîëüêî ïðîöåäóð èìåëè äîñòóï ê îäíîé è òîé
æå ïåðåìåííîé. Îáû÷íî ýôôåêòèâíåå âû÷èñëèòü îäèí ðàç êàêîå-ëèáî çíà÷å-
íèå, ñîõðàíèòü åãî â ïåðåìåííîé, à çàòåì èñïîëüçîâàòü ýòó ïåðåìåííóþ â íå-
ñêîëüêèõ ïðîöåäóðàõ, ÷åì âû÷èñëÿòü îäíî è òî æå çíà÷åíèå ñíîâà è ñíîâà.
VBA ïîçâîëÿåò îáúÿâëÿòü ïåðåìåííûå, äîñòóïíûå äëÿ íåñêîëüêèõ ïðîöå-
äóð. Êîãäà êàêàÿ-ëèáî ïåðåìåííàÿ äîñòóïíà âñåì ïðîöåäóðàì â ìîäóëå, ãîâî-
ðÿò, ÷òî ýòà ïåðåìåííàÿ èìååò îáëàñòü äåéñòâèÿ ìîäóëüíîãî óðîâíÿ (module-
level). VBA îãðàíè÷èâàåò îáëàñòü äåéñòâèÿ ïåðåìåííîé ìîäóëüíîãî óðîâíÿ ìî-
äóëåì, â êîòîðîì îáúÿâëÿåòñÿ ýòà ïåðåìåííàÿ. (VBA ïðåäîñòàâëÿåò ñïîñîáû
åùå áîëüøåãî ðàñøèðåíèÿ îáëàñòè äåéñòâèÿ ïåðåìåííîé; ýòè ìåòîäû îïèñûâà-
þòñÿ äàëåå.)
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 101

Çàìå÷àíèå
Îáëàñòü â íà÷àëå ìîäóëÿ ïåðåä ëþáûìè îáúÿâëåíèÿìè ïðîöåäóð íàçûâàþò îáëàñòüþ
îáúÿâëåíèé (declaration) ìîäóëÿ, ïîòîìó ÷òî èìåííî òóäà ñëåäóåò ïîìåùàòü îáúÿâëåíèÿ
ïåðåìåííûõ ìîäóëüíîãî óðîâíÿ è äðóãèå äèðåêòèâû äëÿ VBA, âëèÿþùèå íà âåñü ìîäóëü. Âû
ìîæåòå ëåãêî ïåðåõîäèòü ê îáëàñòè îáúÿâëåíèé ëþáîãî ìîäóëÿ, âûáèðàÿ (Declarations) â
ñïèñêå Procedure îêíà (Code).

Äëÿ òîãî ÷òîáû ïåðåìåííàÿ áûëà äîñòóïíîé äëÿ âñåõ ïðîöåäóð â îïðåäåëåí-
íîì ìîäóëå, ïîìåñòèòå îïåðàòîð Dim äëÿ íåå â íà÷àëî ìîäóëÿ ïåðåä ëþáûìè
îáúÿâëåíèÿìè ïðîöåäóð. Â ëèñòèíãå 3.4 ïðèâåäåí ìîäóëü, ñîäåðæàùèé äâå
ïðîñòûå ïðîöåäóðû è åäèíñòâåííîå îáúÿâëåíèå ïåðåìåííîé ìîäóëüíîãî óðîâ-
íÿ. Ïðîöåäóðà HelloWorld â ëèñòèíãå 3.4 îòîáðàæàåò òî æå îêíî ñîîáùåíèÿ,
êîòîðîå ïîêàçàíî íà ðèñ. 3.2.

Ëèñòèíã 3.4. Îáëàñòü äåéñòâèÿ ïåðåìåííîé ìîäóëüíîãî óðîâíÿ


1: Dim HelloMsg 'èñïîëüçóåòñÿ âñåìè ïðîöåäóðàìè â ýòîì ìîäóëå
2:
3: Sub HelloWorld()
4: HelloMsg = "Hello, World!"
5: MsgBox HelloMsg, , "Îêíî ïðèâåòñòâèÿ"
6: End Sub
7:
8: Sub HelloDave()
9: HelloMsg = "Hello, Dave!"
10: MsgBox HelloMsg, , "Äðóãîå îêíî ñîîáùåíèÿ"
11: End Sub

 ýòîì ëèñòèíãå ñòðîêè 3–6 ñîäåðæàò ïðîöåäóðó HelloWorld, à ñòðî-


êè 8–11 — ïðîöåäóðó HelloDave. Îáðàòèòå âíèìàíèå íà òî, ÷òî íè îäíà èç ýòèõ
ïðîöåäóð íå ñîäåðæèò îïåðàòîðîâ Dim. Â ñòðîêå 1 îïåðàòîð Dim èñïîëüçóåòñÿ
äëÿ îáúÿâëåíèÿ ïåðåìåííîé ñ èìåíåì HelloMsg.
Ïîñêîëüêó ñòðîêà 1 îáúÿâëÿåò ïåðåìåííóþ HelloMsg íà óðîâíå ìîäóëÿ, ýòà
ïåðåìåííàÿ äîñòóïíà äëÿ âñåõ ïðîöåäóð â îäíîì è òîì æå ìîäóëå. Â ñòðîêàõ 4
è 5 ïðîöåäóðû HelloWorld VBA èñïîëüçóåò ïåðåìåííóþ ìîäóëüíîãî óðîâíÿ
HelloMsg. Àíàëîãè÷íî, â ñòðîêàõ 9 è 10 ïðîöåäóðû HelloDave VBA èñïîëüçóåò
òó æå ïåðåìåííóþ ìîäóëüíîãî óðîâíÿ HelloMsg.

Èñïîëüçîâàíèå ïåðåìåííûõ ñ îäíèì è òåì æå èìåíåì


â ðàçëè÷íûõ óðîâíÿõ îáëàñòè äåéñòâèÿ
Èìÿ ïåðåìåííîé äîëæíî áûòü óíèêàëüíûì â åå îáëàñòè äåéñòâèÿ. Òî÷íî
òàê æå, êàê íåëüçÿ îáúÿâëÿòü äâå ïåðåìåííûå ñ îäíèì è òåì æå èìåíåì â îä-
íîé ïðîöåäóðå, íåëüçÿ îáúÿâëÿòü äâå ïåðåìåííûå ìîäóëüíîãî óðîâíÿ ñ îäíèì
èìåíåì â îäíîì è òîì æå ìîäóëå (è ïî òåì æå ïðè÷èíàì).
Îäíàêî ìîæíî (õîòÿ è íå æåëàòåëüíî) èìåòü ïåðåìåííûå ñ îäíèì è òåì æå
èìåíåì íà ðàçíûõ óðîâíÿõ îáëàñòè äåéñòâèÿ. Êîãäà ïåðåìåííûå èìåþò îäíî
èìÿ, íî ðàçíûå îáëàñòè äåéñòâèÿ, VBA èñïîëüçóåò ïåðåìåííóþ ñ íàèáîëåå ëî-
êàëüíîé (local) îáëàñòüþ äåéñòâèÿ. Â ëèñòèíãå 3.3 áûëè óæå ïîêàçàíû äâå ðàç-
ëè÷íûå ïðîöåäóðû, êàæäàÿ èç êîòîðûõ îáúÿâëÿåò ñâîþ ïåðåìåííóþ, íî èñ-
ïîëüçóåò îäíî è òî æå èìÿ äëÿ ïåðåìåííîé. Ïîñêîëüêó ýòè ïåðåìåííûå èìåþò
îáëàñòü äåéñòâèÿ ïðîöåäóðíîãî óðîâíÿ, êàæäàÿ ïðîöåäóðà ìîæåò èñïîëüçî-
âàòü òîëüêî ñâîþ ëîêàëüíóþ ïåðåìåííóþ. Â ëèñòèíãå 3.5 ïðèâåäåí ìîäóëü, ñî-
102 Ãëàâà 3

äåðæàùèé òðè ïðîöåäóðû, êàæäàÿ èç êîòîðûõ èñïîëüçóþò ïåðåìåííûå ñ îä-


íèì è òåì æå èìåíåì.

Ëèñòèíã 3.5. Êîìáèíèðîâàííàÿ ìîäóëüíàÿ è ïðîöåäóðíàÿ îáëàñòü äåéñòâèÿ


1: Dim HelloMsg 'èñïîëüçóåòñÿ âñåìè ïðîöåäóðàìè â ýòîì ìîäóëå,
2: 'êîòîðûå íå èìåþò ñâîåé ïåðåìåííîé HelloMsg
3: Sub HelloWorld()
4: HelloMsg = "Hello, World!"
5: MsgBox HelloMsg, , "Greeting Box"
6: End Sub
7:
8: Sub HelloDave()
9: HelloMsg = "Hello, Dave!"
10: MsgBox HelloMsg, , "Äðóãîå îêíî ñîîáùåíèÿ"
11: End Sub
12:
13: Sub AnotherMessage()
14: Dim HelloMsg 'ëîêàëüíîå îáúÿâëåíèå
15: HelloMsg = "Åùå îäíî îêíî ñîîáùåíèÿ"
16: MsgBox HelloMsg, , "Åùå îäíî îêíî ñîîáùåíèÿ"
17: End Sub

 ëèñòèíãå 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) ïåðåìåííûìè, ïîòîìó ÷òî
èõ îáúÿâëåíèÿ ÿâëÿþòñÿ ëîêàëüíûìè äëÿ âûïîëíÿåìîé â äàííûé ìîìåíò ïðîöåäóðû.

Îäíàêî â ïðîöåäóðå AnotherMessage èìååòñÿ ñâîå îáúÿâëåíèå ïåðåìåííîé


HelloMsg (ñòðîêà 14). Ïðè âûïîëíåíèè ñòðîê 15 è 16 VBA óñòðàíÿåò ëþáóþ
äâóñìûñëåííîñòü ïî ïîâîäó òîãî, êàêóþ ïåðåìåííóþ HelloMsg ñëåäóåò èñïîëü-
çîâàòü, âûáèðàÿ íàèáîëåå ëîêàëüíóþ ïåðåìåííóþ: HelloMsg, îáúÿâëåííóþ
êàê ïåðåìåííóþ ïðîöåäóðíîãî óðîâíÿ.
Ïåðåìåííàÿ ìîäóëüíîãî óðîâíÿ HelloMsg, îáúÿâëåííàÿ â ñòðîêå 1, íåäîñ-
òóïíà äëÿ ïðîöåäóðû AnotherMessage.

Ïåðñèñòåíòíîñòü: îïðåäåëåíèå òîãî, êàê äîëãî ïåðåìåííûå


óäåðæèâàþò ñâîå çíà÷åíèå
Ïåðñèñòåíòíîñòü (persistence) — ýòî òåðìèí, èñïîëüçóåìûé äëÿ ññûëêè íà
ïðîäîëæèòåëüíîñòü âðåìåíè, â òå÷åíèå êîòîðîãî ëþáàÿ äàííàÿ ïåðåìåííàÿ
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 103

óäåðæèâàåò çíà÷åíèå, ïðèñâîåííîå åé. Çíà÷åíèÿ, ïðèñâîåííûå ïåðåìåííûì, ñî-


õðàíÿþòñÿ òîëüêî, ïîêà ïåðåìåííàÿ ÿâëÿåòñÿ àêòèâíîé â åå îáëàñòè äåéñòâèÿ.
Êîãäà ïåðåìåííàÿ îáúÿâëÿåòñÿ â ïðîöåäóðå, îíà ñóùåñòâóåò òîëüêî, ïîêà
VBA âûïîëíÿåò ýòó ïðîöåäóðó. Ïðè âûïîëíåíèè ïðîöåäóðû VBA ðåçåðâèðóåò
îáëàñòü ïàìÿòè äëÿ âñåõ ïåðåìåííûõ, îáúÿâëåííûõ ëîêàëüíî â ýòîé ïðîöåäó-
ðå, íåçàâèñèìî îò òîãî, îáúÿâëÿþòñÿ ïåðåìåííûå ÿâíî èëè íåÿâíî. Ïîñëå
îêîí÷àíèÿ ïðîöåäóðû VBA îñâîáîæäàåò ïàìÿòü, èñïîëüçîâàâøóþñÿ ëîêàëü-
íûìè ïåðåìåííûìè, â îáùèé ïóë èìåþùåéñÿ â íàëè÷èè êîìïüþòåðíîé ïàìÿ-
òè è ëîêàëüíûå ïåðåìåííûå ýòîé ïðîöåäóðû ïðåêðàùàþò ñóùåñòâîâàíèå.
Ïåðåìåííûå ïðîöåäóðíîãî óðîâíÿ ñîçäàþòñÿ êàæäûé ðàç, êîãäà ïðîöåäóðà
íà÷èíàåò âûïîëíÿòüñÿ, è óíè÷òîæàþòñÿ, êîãäà ïðîöåäóðà ïåðåñòàåò âûïîë-
íÿòüñÿ. Ãîâîðÿ áîëåå òåõíè÷åñêèìè òåðìèíàìè, ëîêàëüíàÿ ïåðåìåííàÿ ÿâëÿ-
åòñÿ íåîïðåäåëåííîé èëè âíå êîíòåêñòà (out of context) äî òåõ ïîð, ïîêà ïðî-
öåäóðà, îáúÿâëÿþùàÿ åå, íå íà÷èíàåò âûïîëíÿòüñÿ. Êîãäà ïðîöåäóðà, îáúÿâ-
ëÿþùàÿ ïåðåìåííóþ, ïåðåñòàåò âûïîëíÿòüñÿ, ïåðåìåííàÿ îïÿòü ñòàíîâèòñÿ
íåîïðåäåëåííîé.
Çíà÷åíèÿ ïåðåìåííûõ, îáúÿâëÿåìûõ íà óðîâíå ìîäóëÿ, óäåðæèâàþòñÿ â
ïàìÿòè ñòîëü äîëãî, ñêîëüêî VBA âûïîëíÿåò ïðîöåäóðó â ýòîì ìîäóëå.
Ïðè âûïîëíåíèè ïðîöåäóðû VBA ôàêòè÷åñêè ïðîñìàòðèâàåò âåñü ìîäóëü,
ñîäåðæàùèé ýòó ïðîöåäóðó, è ñîçäàåò ëþáûå ïåðåìåííûå ìîäóëüíîãî óðîâíÿ.
Ïîêà VBA âûïîëíÿåò ïðîöåäóðó â ýòîì ìîäóëå, çíà÷åíèÿ ïåðåìåííûõ ìîäóëü-
íîãî óðîâíÿ ñîõðàíÿþòñÿ.

Òðåáîâàíèå ÿâíîãî îáúÿâëåíèÿ ïåðåìåííûõ


Õîòÿ íåÿâíîå îáúÿâëåíèå ïåðåìåííûõ (îáúÿâëåíèå ïåðåìåííûõ ïðîñòî èõ
èñïîëüçîâàíèåì) óäîáíî, ñ íèì ñâÿçàíû íåêîòîðûå ïðîáëåìû. Êîãäà ïåðåìåí-
íûå îáúÿâëÿþòñÿ íåÿâíî, ñóùåñòâóåò ðèñê íå÷àÿííî ñîçäàòü íîâóþ ïåðåìåí-
íóþ, êîãäà íà ñàìîì äåëå íåîáõîäèìî èñïîëüçîâàòü óæå ñóùåñòâóþùóþ, èëè
èñïîëüçîâàòü ñóùåñòâóþùóþ ïåðåìåííóþ, êîãäà ïîëüçîâàòåëü íàìåðåâàåòñÿ
ñîçäàòü íîâóþ. Îáå ýòè ñèòóàöèè ïðèâîäÿò ê îøèáêàì â êîäå, êîòîðûå î÷åíü
òðóäíî îòñëåæèâàòü. (Bug — ëþáàÿ îøèáêà â êîäå, êîòîðàÿ ìåøàåò åãî ïðà-
âèëüíîìó âûïîëíåíèþ èëè ïðèâîäèò ê îøèáî÷íûì ðåçóëüòàòàì.)
 ýòîé êíèãå óæå ðàññêàçûâàëîñü, êàê èñïîëüçîâàòü îïåðàòîð Dim äëÿ îáú-
ÿâëåíèÿ ïåðåìåííûõ è óìåíüøåíèÿ ïðîáëåì, ñâÿçàííûõ ñ íåÿâíûì îáúÿâëå-
íèåì. Èñïîëüçîâàíèå òîëüêî îïåðàòîðà Dim äëÿ îáúÿâëåíèÿ ïåðåìåííûõ íå
âñåãäà ïîìîãàåò îáíàðóæèâàòü èëè ïðåäîòâðàùàòü íåáîëüøèå îøèáêè, îòíîñÿ-
ùèåñÿ ê íåÿâíîìó îáúÿâëåíèþ ïåðåìåííûõ.
×òîáû ëåã÷å áûëî â ëþáîå âðåìÿ îáíàðóæèâàòü îøèáêè, ñâÿçàííûå ñ
íåÿâíûì îáúÿâëåíèåì ïåðåìåííûõ, VBA ïðåäîñòàâëÿåò êîìàíäó Option Ex-
plicit. Ïðè èñïîëüçîâàíèè Option Explicit VBA òðåáóåò îáúÿâëåíèÿ âñåõ
ïåðåìåííûõ (ñ ïîìîùüþ îïåðàòîðà Dim) ïåðåä èõ èñïîëüçîâàíèåì. Êîìàíäà
Option Explicit â îñíîâíîì ïðåïÿòñòâóåò íåÿâíîìó îáúÿâëåíèþ
ïåðåìåííûõ ãäå-ëèáî â ìîäóëå, ñîäåðæàùåì ýòó êîìàíäó.
×òîáû óñòàíîâèòü ðåæèì, ïðè êîòîðîì VBA òðåáóåò ÿâíîãî îáúÿâëåíèÿ äëÿ
âñåõ ïåðåìåííûõ â ìîäóëå, äîáàâüòå êîìàíäó Option Explicit â îáëàñòü îáú-
ÿâëåíèé ìîäóëÿ, òî åñòü â íà÷àëî ìîäóëÿ ïåðåä ëþáûìè îáúÿâëåíèÿìè ïåðå-
ìåííûõ èëè ïðîöåäóð. Â ëèñòèíãå 3.6 ïðèâåäåí òîò æå ìîäóëü, ÷òî è â ëèñòèí-
ãå 3.4, íî ñ äîáàâëåííîé êîìàíäîé Option Explicit.
104 Ãëàâà 3

Ëèñòèíã 3.6. Ìîäóëüíàÿ êîìàíäà Option Explicit


1: Option Explicit 'òðåáóåò ÿâíîãî îáúÿâëåíèÿ ïåðåìåííûõ ìîäóëÿ
2: Dim HelloMsg 'èñïîëüçóåòñÿ âñåìè ïðîöåäóðàìè â ýòîì ìîäóëå
3:
4: Sub HelloWorld()
5: HelloMsg = "Hello, World!"
6: MsgBox HelloMsg, , "Îêíî ïðèâåòñòâèÿ"
7: End Sub
8:
9: Sub HelloDave()
10: HelloMsg = "Hello, Dave!"
11: MsgBox HelloMsg, , "Äðóãîå îêíî ñîîáùåíèÿ"
12: End Sub

Êðîìå ñòðîêè 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

ðåäàêòèðóÿ ìîäóëü ñàìîñòîÿòåëüíî. Òðåáîâàíèå ÿâíîãî îáúÿâëåíèÿ


ïåðåìåííûõ äåéñòâóåò íà âñå ïðèëîæåíèÿ, èñïîëüçóþùèå Ðåäàêòîð VB; ïðè
çàïóñêå Ðåäàêòîðà VB èç Excel è óñòàíîâêå îïöèè Require Variable Declaration
íîâûå ìîäóëè â Word áóäóò òàêæå òðåáîâàòü ÿâíîãî îáúÿâëåíèÿ ïåðåìåííûõ.

Êîíñòàíòû
Êîíñòàíòà (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

ãðàììó, ÷òîáû èñïîëüçîâàòü íîâóþ ñòàâêó íàëîãà, — âàì ïðèäåòñÿ èñêàòü è


èçìåíÿòü êàæäîå âõîæäåíèå çíà÷åíèÿ ñòàâêè íàëîãà ïî âñåé ïðîãðàììå. Åñëè
æå âìåñòî ýòîãî äëÿ ñòàâêè íàëîãà èñïîëüçîâàòü èìåíîâàííóþ êîíñòàíòó, òî
ïðèäåòñÿ èçìåíèòü çíà÷åíèå ñòàâêè íàëîãà òîëüêî â îäíîì ìåñòå: â îïåðàòîðå,
îáúÿâëÿþùåì èìåíîâàííóþ êîíñòàíòó.

Ñîçäàíèå èìåíîâàííûõ êîíñòàíò


Ïðè âûáîðå èìåíè êîíñòàíòû ñîáëþäàéòå òå æå ïðàâèëà è ðåêîìåíäàöèè,
êîòîðûì âû ñëåäóåòå ïðè âûáîðå èìåíè ïåðåìåííîé (ñì. ðàçäåë «Ñîçäàíèå ïå-
ðåìåííûõ» â íà÷àëå ýòîé ãëàâû). Êàê è â ñëó÷àå ñ ïåðåìåííîé, íåîáõîäèìî
îáúÿâëÿòü èìåíîâàííóþ êîíñòàíòó ïåðåä åå èñïîëüçîâàíèåì. Îäíàêî â îòëè-
÷èå îò ïåðåìåííîé íåîáõîäèìî âñåãäà ÿâíî îáúÿâëÿòü èìåíîâàííûå êîíñòàí-
òû, èñïîëüçóÿ êëþ÷åâîå ñëîâî Const. Ñëåäóþùàÿ ñòðîêà ïîêàçûâàåò îáùèé
ñèíòàêñèñ äëÿ îáúÿâëåíèÿ èìåíîâàííûõ êîíñòàíò:
Ñèíòàêñèñ
Const name1 = value1 [operator name2…] [, name3 = value3
[operator name4] … ]
Çäåñü nameN ïðåäñòàâëÿåò ëþáîé äîïóñòèìûé èäåíòèôèêàòîð, valueN — ëþáîå
çíà÷åíèå äàííûõ: ÷èñëåííîå, ñòðîêîâîå èëè äàòà, à operator — àðèôìåòè÷åñêàÿ
èëè îïåðàöèÿ ñðàâíåíèÿ ìåæäó äâóìÿ èìåíàìè ðàíåå îïèñàííûõ êîíñòàíò.

Ñëåäóþùèå ñòðîêè ïîêàçûâàþò íåñêîëüêî îáúÿâëåíèé èìåíîâàííûõ


êîíñòàíò:
Const Boilingpoint = 212
Const SalesTax = 8.25
Const Greeting = "Hello, Pete!"
Const PointTwo = 212, SalesTax2 = 8.25*2, Greeting2 = "Hello, "
Const DangerZone = BoilingPoint + 50

Îáëàñòü äåéñòâèÿ êîíñòàíò


Êàê è â ñëó÷àå ñ ïåðåìåííûìè, ìîæíî îáúÿâëÿòü èìåíîâàííûå êîíñòàíòû â
ïðîöåäóðàõ èëè â îáëàñòè îáúÿâëåíèé â íà÷àëå ìîäóëÿ. Êîíñòàíòà, îáúÿâëÿå-
ìàÿ â ïðîöåäóðå, èìååò îáëàñòü äåéñòâèÿ ïðîöåäóðíîãî óðîâíÿ, à êîíñòàíòà,
îáúÿâëÿåìàÿ â îáëàñòè îáúÿâëåíèé ìîäóëÿ, — îáëàñòü äåéñòâèÿ ìîäóëüíîãî
óðîâíÿ. Äëÿ èìåíîâàííûõ êîíñòàíò âûïîëíÿþòñÿ òå æå ïðàâèëà îáëàñòè äåé-
ñòâèÿ, ÷òî è äëÿ ïåðåìåííûõ.
Ïîñêîëüêó îäíîé èç ãëàâíûõ öåëåé èñïîëüçîâàíèÿ èìåíîâàííîé êîíñòàíòû
ÿâëÿåòñÿ ïðåäîòâðàùåíèå ïîâòîðåíèÿ èëè äóáëèðîâàíèÿ çíà÷åíèé ëèòåðàëü-
íûõ êîíñòàíò â ïðîöåäóðàõ, êàê ïðàâèëî, áûâàåò íåîáõîäèìî, ÷òîáû èìåíî-
âàííûå êîíñòàíòû áûëè äîñòóïíû âñåì ïðîöåäóðàì â ìîäóëå. Ïîýòîìó ñëåäóåò
ïîìåùàòü îáúÿâëåíèÿ êîíñòàíò íà ìîäóëüíîì óðîâíå, ÷òîáû ó íèõ áûëà íàè-
áîëüøàÿ îáëàñòü äåéñòâèÿ.
Âñÿêèé ðàç, êîãäà VBA âñòðå÷àåò èìåíîâàííóþ êîíñòàíòó â îïåðàòîðå, çíà-
÷åíèå, ñâÿçàííîå ñ êîíñòàíòîé, âñòàâëÿåòñÿ â ýòîò îïåðàòîð. Ðàññìîòðèì ëèñ-
òèíã 3.7, â êîòîðîì ïîêàçàí çàêîí÷åííûé ìîäóëü. Ýòà ïðîöåäóðà âû÷èñëÿåò
ïëîùàäü êðóãà è ñîõðàíÿåò çíà÷åíèå â ïåðåìåííîé.
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 107

Ëèñòèíã 3.7. Èñïîëüçîâàíèå êîíñòàíò: âû÷èñëåíèå ïëîùàäè êðóãà


1: Const Pi = 3.14
2: Dim CircleArea As Single
3:
4: Sub Calc_CircleArea()
5: Dim Radius As Single
6: Radius = 5
7: CircleArea = Pi * (Radius * Radius)
8: MsgBox CircleArea, , "Area of Circle"
9: End Sub

Ñòðîêà 1 ëèñòèíãà 3.7 îáúÿâëÿåò êîíñòàíòó ìîäóëüíîãî óðîâíÿ Pi, êîòîðàÿ


ïðåäñòàâëÿåò ïðèáëèæåíèå ÷èñëà p. Ñòðîêà 7 ëèñòèíãà ñîäåðæèò îïåðàòîð, âû-
÷èñëÿþùèé ïëîùàäü êðóãà; ïðè âûïîëíåíèè ýòîãî îïåðàòîðà VBA âñòàâëÿåò
çíà÷åíèå 3.14 â ìåñòî, çàíèìàåìîå èìåíåì êîíñòàíòû Pi.  ïðîöåäóðå
Calc_CircleArea îïåðàòîð MsgBox (â ñòðîêå 8) îòîáðàæàåò ÷èñëî 78.5. Îáðàòèòå
âíèìàíèå íà òî, ÷òî ïåðåìåííàÿ CircleArea îáúÿâëÿåòñÿ íà óðîâíå ìîäóëÿ äëÿ
òîãî, ÷òîáû çíà÷åíèå, âû÷èñëåííîå â ïðîöåäóðå Calc_CircleArea, áûëî äîñòóï-
íûì äëÿ äðóãèõ ïðîöåäóð â òîì æå ìîäóëå.

Íàïèñàíèå ëèòåðàëüíûõ êîíñòàíò


Äàæå åñëè âû íèêîãäà íå èñïîëüçîâàëè ëèòåðàëüíûå êîíñòàíòû â êîäå VBA
(÷òî íåâåðîÿòíî), âàì âñå æå ñëåäóåò ïèñàòü ëèòåðàëüíûå êîíñòàíòû ïðè îáú-
ÿâëåíèè èìåíîâàííûõ êîíñòàíò. Ñóùåñòâóåò íåñêîëüêî ïðàâèë, êîòîðûå íåîá-
õîäèìî ñîáëþäàòü ïðè íàïèñàíèè ëèòåðàëüíûõ êîíñòàíò; äàëåå îïèñûâàþòñÿ
ïðàâèëà íàïèñàíèÿ êîíñòàíò òèïà String, Integer, Date è Boolean.

Êîíñòàíòû String
Ïðè íàïèñàíèè ëèòåðàëüíûõ ñòðîêîâûõ êîíñòàíò â êîäå VBA âûïîëíÿéòå
ñëåäóþùèå ïðàâèëà:
¨ Ñòðîêîâûå êîíñòàíòû äîëæíû áûòü çàêëþ÷åíû â äâîéíûå êàâû÷êè ("). Ñëå-
äóþùèé ïðèìåð íå ÿâëÿåòñÿ äîïóñòèìûì, ïîòîìó ÷òî íå èìååò êàâû÷åê:
This is not a valid string constant.
¨ Ïóñòàÿ ñòðîêîâàÿ êîíñòàíòà (íàçûâàåìàÿ íóëåâîé ñòðîêîé — null string
èëè empty string) îáîçíà÷àåòñÿ äâóìÿ äâîéíûìè êàâû÷êàìè, ìåæäó êîòî-
ðûìè íè÷åãî íåò ("").
¨ Ñòðîêîâàÿ êîíñòàíòà äîëæíà âñÿ íàõîäèòüñÿ íà îäíîé è òîé æå ñòðîêå.
Íåëüçÿ èñïîëüçîâàòü ñèìâîë ïðîäîëæåíèÿ ñòðîêè äëÿ ïðîäîëæåíèÿ ëè-
òåðàëüíîé ñòðîêîâîé êîíñòàíòû íà äðóãîé ñòðîêå. Íè îäèí èç ñëåäóþùèõ
ïðèìåðîâ íå ÿâëÿåòñÿ ïðàâèëüíûì, ïîòîìó ÷òî ñòðîêîâàÿ êîíñòàíòà íà-
õîäèòñÿ áîëåå, ÷åì íà îäíîé ñòðîêå:

"Ýòî ïðèìåð
íåïðàâèëüíîé ñòðîêîâîé êîíñòàíòû"
"Ýòî ñíîâà íå_
ïðàâèëüíàÿ ñòðîêîâàÿ êîíñòàíòà"
108 Ãëàâà 3

Åñëè ëþáîé èç ýòèõ ïðèìåðîâ áóäåò âêëþ÷åí â ïðîöåäóðó, VBA âûäàñò


îøèáêó âðåìåíè èñïîëíåíèÿ è ïðåêðàòèò âûïîëíåíèå ïðîöåäóðû. Äàëåå ñëå-
äóåò ïðèìåð ïðàâèëüíîé ñòðîêîâîé êîíñòàíòû:
"Ïðèìåð ïðàâèëüíîé ñòðîêîâîé êîíñòàíòû"
Åñëè æå âàì íåîáõîäèìî íàïèñàòü êîíñòàíòó íà äâóõ ñòðîêàõ, èñïîëüçóéòå
îïåðàòîð êîíêàòåíàöèè (ñì. äàëåå ýòó ãëàâó) è ñèìâîë ïåðåõîäà íà ñëåäóþùóþ
ñòðîêó, êàê ïîêàçàíî íèæå:
"Òåïåðü èìååì " & _
"ïðàâèëüíóþ ñòðîêîâóþ êîíñòàíòó"
×èñëåííûå êîíñòàíòû
Äàííûå ïðàâèëà ïðèìåíèìû ê ëèòåðàëüíûì ÷èñëåííûì êîíñòàíòàì; ÷èñ-
ëåííûå êîíñòàíòû ìîãóò ñîäåðæàòü ëþáîé èç ÷èñëåííûõ òèïîâ VBA.
¨ ×èñëåííûå êîíñòàíòû äîëæíû ñîñòîÿòü òîëüêî èç ÷èñëîâûõ ñèìâîëîâ îò
0 äî 9.
¨ ×èñëåííàÿ êîíñòàíòà ìîæåò íà÷èíàòüñÿ ñî çíàêà (–) è ìîæåò ñîäåðæàòü
äåñÿòè÷íóþ òî÷êó.
¨ Ìîæíî èñïîëüçîâàòü ýêñïîíåíöèàëüíîå ïðåäñòàâëåíèå äëÿ ÷èñëåííûõ
êîíñòàíò.
¨ Íèêàêèå äðóãèå ñèìâîëû èëè çíàêè íå äîïóñêàþòñÿ â ÷èñëåííûõ êîí-
ñòàíòàõ. Äàëåå ñëåäóþò ïðèìåðû ïðàâèëüíûõ ÷èñëåííûõ êîíñòàíò:
12
-14.3
6.6Å2
Êîíñòàíòû Date
VBA ðàñïîçíàåò êîíñòàíòû äàòû â ëþáîì èç íåñêîëüêèõ ðàçëè÷íûõ ôîðìà-
òîâ; íåîáõîäèìî ïîìåùàòü âñå êîíñòàíòû äàòû ìåæäó çíàêàìè ôóíòà (#). Ñëå-
äóþùèå ñòðîêè ïîêàçûâàþò íåêîòîðûå èç ôîðìàòîâ êîíñòàíò äàò, êîòîðûå
ðàñïîçíàåò VBA:
#2-5-97 21:17#
#February 5, 1997 9:17pm#
#Mar-31-97#
#15 April 1997#
Íåçàâèñèìî îò òîãî, â êàêîì èç óêàçàííûõ ôîðìàòîâ çàïèñûâàåòñÿ ëèòå-
ðàëüíàÿ êîíñòàíòà òèïà Date, VBA ïåðåôîðìàòèðóåò ýòó êîíñòàíòó (êîãäà
êóðñîð âñòàâêè áóäåò óáðàí ñî ñòðîêè ïîñëå çàïèñè êîíñòàíòû) äëÿ ñîîòâåòñò-
âèÿ îäíîìó èç äâóõ ñëåäóþùèõ ôîðìàòîâ, â çàâèñèìîñòè îò òîãî, ñîäåðæèò ëè
êîíñòàíòà Date èíôîðìàöèþ î âðåìåíè:
#2/5/97 9:17:00 PM#
#2/5/97#
Åñëè ïðîïóñòèòü çíàê (#) ïðè çàïèñè ëèòåðàëüíîé êîíñòàíòû äàòû, VBA íå
ñìîæåò ïðàâèëüíî èíòåðïðåòèðîâàòü êîíñòàíòó äàòû êàê äàòó. Âìåñòî ýòîãî
VBA «ïûòàåòñÿ» îöåíèòü èíôîðìàöèþ î äàòå êàê èìåíà ïåðåìåííûõ, ÷èñëåí-
íûå êîíñòàíòû è ìàòåìàòè÷åñêèå îïåðàòîðû. Íàïðèìåð, VBA ïûòàåòñÿ èíòåð-
ïðåòèðîâàòü ñëåäóþùóþ äàòó (â êîòîðîé ïðîïóùåíû çíàêè ôóíòà) êàê ìàòåìà-
òè÷åñêîå âûðàæåíèå, âêëþ÷àþùåå äåëåíèå:
3/12/94
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 109

Íå çàêëþ÷àéòå ëèòåðàëüíûå êîíñòàíòû òèïà Date â êàâû÷êè, ïîòîìó ÷òî


VBA áóäåò èíòåðïðåòèðîâàòü äàòó êàê ñòðîêîâóþ êîíñòàíòó. Íàïðèìåð, VBA
èíòåðïðåòèðóåò ñëåäóþùóþ ñòðîêó êàê ñòðîêîâóþ êîíñòàíòó, à íå êàê äàòó:
"3/11/99"

Êîíñòàíòû Boolean
Ñóùåñòâóåò òîëüêî äâå ïðàâèëüíûå êîíñòàíòû òèïà Boolean: True è False.
 îïåðàòîðàõ ïðîãðàìì VBA äëÿ êîíñòàíò òèïà Boolean âû âñåãäà äîëæíû èñ-
ïîëüçîâàòü êëþ÷åâûå ñëîâà True è False. Êîãäà âû çàïèñûâàåòå êëþ÷åâûå ñëî-
âà â ìàêðîñû, ïèøèòå ñëîâà ïîëíîñòüþ è íå èñïîëüçóéòå êàâû÷êè.

Çàäàíèå òèïà êîíñòàíòû


Êîãäà âû îáúÿâëÿåòå èìåíîâàííóþ êîíñòàíòó èëè èñïîëüçóåòå ëèòåðàëü-
íóþ êîíñòàíòó, VBA «ñ÷èòàåò», ÷òî çíà÷åíèå, ïðåäñòàâëåííîå ýòîé êîíñòàí-
òîé, èìååò òèï äàííûõ, íàèáîëåå ñîãëàñóþùèéñÿ ñ âûðàæåíèåì, ïðèñâîåííûì
êîíñòàíòå. Íàïðèìåð, VBA ðàáîòàåò ñ êîíñòàíòîé, ñîäåðæàùåé ñòðîêó, êàê ñ
êîíñòàíòîé òèïà String ïðè îïðåäåëåíèè òîãî, ïðàâèëüíî ëè êîíñòàíòà ñî÷å-
òàåòñÿ ñ äðóãèìè çíà÷åíèÿìè äàííûõ.
 VBA ìîæíî çàäàòü òèï êîíñòàíòû, è åñëè âû òî÷íî çíàåòå òèï êîíñòàíòû,
òî ëó÷øå îáúÿâëÿòü òèï, ïîñêîëüêó îáúÿâëåíèå êîíêðåòíîãî òèïà äàííûõ äëÿ
êîíñòàíòû ìîæåò ïîâûñèòü òî÷íîñòü âû÷èñëåíèé. Ïðè îáúÿâëåíèè êîíñòàíòû
òèïà Double, íàïðèìåð, VBA âû÷èñëÿåò ðåçóëüòàò ìàòåìàòè÷åñêèõ îïåðàöèé,
âêëþ÷àþùèõ ýòó êîíñòàíòó, èñïîëüçóÿ áîëüøèé äèàïàçîí òèïà äàííûõ
Double. Ìîæíî òàêæå çàäàòü òèï êîíñòàíòû êàê Integer, Long, Currency
èëè äðóãîé, ÷òîáû ðåçóëüòàòû ìàòåìàòè÷åñêèõ îïåðàöèé, èñïîëüçóþùèõ ýòó
êîíñòàíòó, èìåëè îïðåäåëåííûé òèï.
Äëÿ êîíñòàíò ìîæíî èñïîëüçîâàòü òèïû äàííûõ Byte, Boolean, Integer,
Long, Single, Double, Currency, Date èëè String (íî íå Object èëè Array).
Îáúÿâëåíèå òèïà äëÿ êîíñòàíòû ïîäîáíî îáúÿâëåíèþ òèïà äëÿ ïåðåìåííîé, çà
èñêëþ÷åíèåì òîãî, ÷òî îáúÿâëåíèå íà÷èíàåòñÿ ñ êëþ÷åâîãî ñëîâà Const.
Îáùèé ñèíòàêñèñ äëÿ îáúÿâëåíèÿ òèïèçèðîâàííîé êîíñòàíòû
ñëåäóþùèé:
Ñèíòàêñèñ
Const name As type = value [, name As type = value...]
Çäåñü name — ýòî ëþáîå äîïóñòèìîå èìÿ êîíñòàíòû, type — èìÿ ëþáîãî èç òèïîâ
äàííûõ VBA è value — çíà÷åíèå, êîòîðîå âû ïðèñâàèâàåòå êîíñòàíòå. Ñëåäóþùàÿ
ñòðîêà èëëþñòðèðóåò ïðàâèëüíîå îáúÿâëåíèå êîíñòàíòû ñ îïðåäåëåííûì òèïîì:
Const Pi As Double = 3.14
 ýòîì ïðèìåðå êîíñòàíòà Pi îáúÿâëÿåòñÿ êàê òèï Double. Ìîæíî òàêæå
èñïîëüçîâàòü ñèìâîëû îïðåäåëåíèÿ òèïà äëÿ çàäàíèÿ òèïà êîíñòàíòû, êàê
ïîêàçàíî â ñëåäóþùåì ïðèìåðå (äåéñòâèå êîòîðîãî òàêîå æå, êàê â ïðåäûäóùåì
ïðèìåðå):
Const Pi# = 3.14

Âíóòðåííèå êîíñòàíòû
VBA ïðåäîñòàâëÿåò íåñêîëüêî âíóòðåííèõ êîíñòàíò (intrinsic constants),
íàçûâàåìûõ òàêæå ïðåäîïðåäåëåííûìè êîíñòàíòàìè (predefined constants).
110 Ãëàâà 3

Âíóòðåííÿÿ êîíñòàíòà — ýòî èìåíîâàííàÿ êîíñòàíòà, êîòîðàÿ áûëà îïðåäåëå-


íà ðàçðàáîò÷èêàìè VBA.  äîïîëíåíèå ê êîíñòàíòàì, êîòîðûå ïðåäîïðåäåëÿåò
VBA, host-ïðèëîæåíèå VBA òàêæå ïðåäîïðåäåëÿåò íåñêîëüêî êîíñòàíò äëÿ èñ-
ïîëüçîâàíèÿ ñ ýòèì host-ïðèëîæåíèåì. Íàïðèìåð, Excel ñîäåðæèò íåñêîëüêî
âíóòðåííèõ êîíñòàíò äëÿ èñïîëüçîâàíèÿ ñ ðàáî÷èìè êíèãàìè Excel, òàáëèöà-
ìè è òàê äàëåå. Àíàëîãè÷íî, Word ñîäåðæèò íåñêîëüêî âíóòðåííèõ êîíñòàíò
äëÿ ðàáîòû ñ äîêóìåíòàìè è øàáëîíàìè Word, òîãäà êàê Access ñîäåðæèò
âíóòðåííèå êîíñòàíòû, èìåþùèå îòíîøåíèå ê ðàçëè÷íûì îïåðàöèÿì ñ áàçàìè
äàííûõ è ñâîéñòâàì Access-îáúåêòîâ.
Âíóòðåííèå êîíñòàíòû, îïðåäåëÿåìûå VBA, âñå íà÷èíàþòñÿ ñ áóêâ vb äëÿ
óêàçàíèÿ òîãî, ÷òî îíè îïðåäåëÿþòñÿ ÿçûêîì Visual Basic for Applications (èëè
Visual Basic). Íàïðèìåð, êîíñòàíòû vbOKOnly, vbOKCancel è vbAbort-
RetryIgnore îïðåäåëÿþòñÿ VBA. Âíóòðåííèå êîíñòàíòû Excel íà÷èíàþòñÿ ñ
áóêâ xl, ÷òîáû áûëî ïîíÿòíî, ÷òî îíè îïðåäåëÿþòñÿ Excel; íåêîòîðûå èç âíóò-
ðåííèõ êîíñòàíò Excel — ýòî xlChart, xlCountrySetting è xlWorksheet.
Âíóòðåííèå êîíñòàíòû Word íà÷èíàþòñÿ ñ áóêâ wd, ÷òîáû áûëî ïîíÿòíî, ÷òî
îíè îïðåäåëÿþòñÿ Word; âîò íåêîòîðûå âíóòðåííèå êîíñòàíòû Word:
wdBackward, wdForward è wdToggle.
Áëàãîäàðÿ âíóòðåííèì êîíñòàíòàì, ëåã÷å èñïîëüçîâàòü íåêîòîðûå âñòðîåí-
íûå ïðîöåäóðû VBA, òàêèå êàê îïåðàòîð MsgBox, î êîòîðîì âû óæå çíàåòå,
è îïåðàòîð InputBox, î êîòîðîì ðàññêàçûâàåòñÿ äàëåå â ýòîé ãëàâå. Õîòÿ íè
â îäíîì èç ïîêàçàííûõ óæå ïðèìåðîâ ñ îïåðàòîðîì MsgBox íå èñïîëüçîâàëñÿ
åãî íåîáÿçàòåëüíûé àðãóìåíò, âû ìîæåòå âñïîìíèòü èç ïðåäûäóùèõ îáñóæäå-
íèé, ÷òî MsgBox èìååò íåîáÿçàòåëüíûé àðãóìåíò, óêàçûâàþùèé ÷èñëî êíîïîê
â äèàëîãîâîì îêíå; îáû÷íî äëÿ àðãóìåíòà êíîïîê â MsgBox èñïîëüçóþòñÿ
âíóòðåííèå êîíñòàíòû VBA.
Âíóòðåííèå êîíñòàíòû, îïðåäåëÿåìûå Excel, Word èëè äðóãèì host-ïðèëî-
æåíèåì VBA, óïðîùàþò èñïîëüçîâàíèå ðàçëè÷íûõ ñâîéñòâ è ìåòîäîâ, ïðèíàä-
ëåæàùèõ ýòîìó host-ïðèëîæåíèþ. (Ïîäðîáíåå î ñâîéñòâàõ è ìåòîäàõ âû óçíàå-
òå èç ñëåäóþùèõ ãëàâ.)

Ïîèñê èìåþùèõñÿ âíóòðåííèõ êîíñòàíò


ñ ïîìîùüþ Object Browser
Äëÿ òîãî ÷òîáû óâèäåòü ïîëíûé ñïèñîê èìåþùèõñÿ â íàëè÷èè âíóòðåííèõ
êîíñòàíò, îïðåäåëÿåìûõ VBA èëè host-ïðèëîæåíèåì, èñïîëüçóéòå Object
Browser è âûïîëíÿéòå ñëåäóþùèå øàãè:
1. Íàæìèòå Alt+F11 äëÿ àêòèâèçàöèè Ðåäàêòîðà VB.
2. Âûáåðèòå êîìàíäó View | Object Browser (Âèä | Ïðîñìîòð îáúåêòîâ) (èëè
ùåëêíèòå íà êíîïêå Object Browser íà ïàíåëè èíñòðóìåíòîâ). Ðåäàêòîð VB
îòîáðàæàåò äèàëîãîâîå îêíî Object Browser. Íà ðèñ. 3.3 ïîêàçàíî äèàëîãîâîå
îêíî Object Browser ñî ñïèñêîì Word-êîíñòàíò WdColor.
Ïîñëå òîãî, êàê âû îòêðîåòå äèàëîãîâîå îêíî Object Browser, âûïîëíèòå ñëå-
äóþùèå äîïîëíèòåëüíûå øàãè, ÷òîáû óâèäåòü âíóòðåííèå êîíñòàíòû VBA:
1. Âûáåðèòå VBA â ðàñêðûâàþùåìñÿ ñïèñêå äèàëîãîâîãî îêíà Object Browser.
2. Âûáåðèòå Constants â ñïèñêå Classes (Êëàññû).
3. ×òîáû ïîëó÷èòü áîëåå ïîäðîáíóþ èíôîðìàöèþ îá îòäåëüíîé âíóòðåííåé
êîíñòàíòå, âûáåðèòå ýòó êîíñòàíòó â ñïèñêå Members Of ’Constants’.
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 111

Ðèñ. 3.3
Èñïîëüçóéòå Object Browser
äëÿ ïðîñìîòðà ñïèñêîâ êîíñòàíò,
îïðåäåëåííûõ â VBA è
host-ïðèëîæåíèÿõ

Ïîñëå òîãî êàê âû âûáåðåòå êîíñòàíòó â ñïèñêå Members Of ’Constants’, åå èìÿ


ïîÿâèòñÿ â íèæíåé ÷àñòè äèàëîãîâîãî îêíà Object Browser. ×òîáû ïîëó÷èòü áî-
ëåå ïîäðîáíóþ èíôîðìàöèþ î âûáðàííîé êîíñòàíòå, ùåëêíèòå íà êíîïêå Help
îêíà Object Browser (íà êíîïêå ñî çíàêîì âîïðîñà).
Âíóòðåííèå êîíñòàíòû VBA — îäíè è òå æå âî âñåõ host-ïðèëîæåíèÿõ
VBA. Âíóòðåííèå êîíñòàíòû äëÿ íåêîòîðûõ ïðèëîæåíèé, íàïðèìåð äëÿ Excel,
äîñòóïíû òîëüêî òîãäà, êîãäà âû ðàáîòàåòå ñ VBA â ýòîì ïðèëîæåíèè. Íàïðè-
ìåð, âû íå ñìîæåòå íàéòè êîíñòàíòó xlWorksheet Excel â îêíå Object Browser
â Word, òàê êàê êîíñòàíòà xlWorksheet äîñòóïíà òîëüêî òîãäà, êîãäà âû èñ-
ïîëüçóåòå VBA â Excel.
Åñëè äëÿ ýëåìåíòà, âûáðàííîãî â ñïèñêå Classes, èìååòñÿ ðàçäåë ñïðàâî÷íîé
ñèñòåìû, êíîïêà Help îêíà Object Browser äîñòóïíà, êàê ïîêàçàíî íà ðèñ. 3.3.
Ùåëêíèòå íà ýòîé êíîïêå äëÿ äîñòóïà ê ñïðàâî÷íîìó ðàçäåëó äëÿ âûáðàííîãî
ýëåìåíòà. Íå âñå îáúåêòû â îêíå Object Browser èìåþò äîïîëíèòåëüíûé ñïðàâî÷-
íûé ðàçäåë.
Äëÿ ïðîñìîòðà ñïèñêà âíóòðåííèõ êîíñòàíò, îïðåäåëÿåìûõ host-ïðèëîæå-
íèåì VBA, âûïîëíÿéòå òå æå øàãè, ÷òî îïèñàíû âûøå, íî âìåñòî VBA âûáè-
ðàéòå áèáëèîòåêó host-ïðèëîæåíèÿ â ðàñêðûâàþùåìñÿ ñïèñêå Project/Library
(Ïðîåêò/Áèáëèîòåêà). Íàïðèìåð, ÷òîáû ïðîñìîòðåòü âíóòðåííèå êîíñòàíòû
Excel, âûáåðèòå Excel â ðàñêðûâàþùåìñÿ ñïèñêå Project/Library; ÷òîáû ïðîñìîò-
ðåòü âíóòðåííèå êîíñòàíòû Word, âûáåðèòå Word â ñïèñêå Project/Library. Ìîæ-
íî ïðîñìàòðèâàòü âíóòðåííèå êîíñòàíòû òîëüêî äëÿ host-ïðèëîæåíèÿ VBA, èç
êîòîðîãî áûë çàïóùåí Ðåäàêòîð VB, åñëè òîëüêî âû íå ñîçäàåòå ññûëêó íà áèá-
ëèîòåêó äðóãîãî host-ïðèëîæåíèÿ.

Ïîëó÷åíèå äàííûõ îò ïîëüçîâàòåëÿ


Èíôîðìàöèÿ ýòîãî ðàçäåëà íå ñâÿçàíà ñ îñíîâíîé òåìîé ãëàâû, íî íåîáõîäè-
ìà äëÿ îñòàâøåãîñÿ ìàòåðèàëà ýòîé è ñëåäóþùèõ ãëàâ.
Ïîëó÷åíèå äàííûõ îò ïîëüçîâàòåëÿ, ñîõðàíåíèå èõ â ïåðåìåííîé è îòîáðà-
æåíèå ðåçóëüòàòîâ äåéñòâèé, âûïîëíåííûõ íàä íèìè, ÿâëÿþòñÿ îñíîâíûìè
112 Ãëàâà 3

ýëåìåíòàìè, íåîáõîäèìûìè äëÿ íàïèñàíèÿ èíòåðàêòèâíûõ ïðîöåäóð. [Èíòå-


ðàêòèâíàÿ (interactive) ïðîöåäóðà — ýòî ïðîöåäóðà, îáìåíèâàþùàÿñÿ èíôîð-
ìàöèåé ñ ïîëüçîâàòåëåì, òî åñòü ïðîöåäóðà âçàèìîäåéñòâóåò ñ ïîëüçîâàòåëåì,
îòîáðàæàÿ ñîîáùåíèÿ è ïîëó÷àÿ ââîä]. Èíòåðàêòèâíûå ïðîöåäóðû ÷àñòî áûâà-
þò áîëåå ïîëåçíûìè, ÷åì ìàêðîñû, ñîçäàâàåìûå èñêëþ÷èòåëüíî ïóòåì çàïèñè.
Ïîëó÷àÿ èíôîðìàöèþ îò ïîëüçîâàòåëÿ, èíòåðàêòèâíàÿ ïðîöåäóðà ìîæåò âû-
ïîëíÿòü îäíè è òå æå îïåðàöèè, èñïîëüçóÿ ðàçëè÷íûå äàííûå.
Äàííûå, ââîäèìûå ïîëüçîâàòåëåì, íàçûâàþòñÿ âõîäíûìè äàííûìè (input).
×òîáû ïîëó÷èòü âõîäíûå äàííûå îò ïîëüçîâàòåëÿ ïðîöåäóðû, èñïîëüçóéòå
ôóíêöèþ InputBox. [Ôóíêöèÿ (function) — ýòî îñîáûé òèï ïðîöåäóðû VBA,
âîçâðàùàþùåé çíà÷åíèå]. Ôóíêöèÿ InputBox îòîáðàæàåò äèàëîãîâîå îêíî,
ñîäåðæàùåå òåêñò, êîòîðûé çàïðàøèâàåò ïîëüçîâàòåëÿ ââåñòè íåêîòîðîå çíà-
÷åíèå, è òåêñòîâîå îêíî äëÿ ââîäà ýòîãî çíà÷åíèÿ. Äèàëîãîâîå îêíî, îòîáðà-
æàåìîå InputBox, ñîäåðæèò òàêæå êîìàíäíûå êíîïêè OK è Cancel.
Ôóíêöèÿ InputBox èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
stringvar = InputBox (Prompt [, Title])
Çäåñü stringvar ïðåäñòàâëÿåò ëþáóþ ïåðåìåííóþ, êîòîðàÿ ìîæåò ñîõðàíÿòü ñòðîêó
(ëèáî ïåðåìåííóþ òèïà String, ëèáî — Variant). Àðãóìåíò Prompt ïðåäñòàâëÿåò
ëþáîå ñòðîêîâîå çíà÷åíèå (ëèòåðàë, êîíñòàíòó èëè ïåðåìåííóþ). InputBox îòî-
áðàæàåò ýòó ñòðîêó êàê çàïðîñ â äèàëîãîâîì îêíå; íåîáõîäèìî âñåãäà ïðåäîñòàâ-
ëÿòü àðãóìåíò Prompt, ïîñêîëüêó ýòî — îáÿçàòåëüíûé àðãóìåíò (required
argument).
Àðãóìåíò Title ÿâëÿåòñÿ íåîáÿçàòåëüíûì âòîðûì àðãóìåíòîì äëÿ InputBox. Title
ïðåäñòàâëÿåò ëþáîå ñòðîêîâîå çíà÷åíèå (ëèòåðàë, êîíñòàíòó èëè ïåðåìåííóþ).
InputBox îòîáðàæàåò òåêñò ýòîé ñòðîêè â ñòðîêå çàãîëîâêà äèàëîãîâîãî îêíà. Åñëè
îïóñòèòü àðãóìåíò Title, VBA îòîáðàæàåò â ñòðîêå çàãîëîâêà äèàëîãîâîãî îêíà
InputBox ñëîâî «Input».

 ëèñòèíãå 3.8 ïðèâåäåí êîä ìîäóëÿ ñ îäíîé ïðîöåäóðîé.  êîäå èìååòñÿ


îáúÿâëåíèå êîíñòàíòû è ïåðåìåííîé ìîäóëüíîãî óðîâíÿ. Ýòà ïðîöåäóðà, ïî-
äîáíî ïðîöåäóðå â ëèñòèíãå 3.7, âû÷èñëÿåò ïëîùàäü êðóãà, íî ðàäèóñ êðóãà
ïîëó÷àåò îò ïîëüçîâàòåëÿ ïðîöåäóðû.

Ëèñòèíã 3.8. Ïîëó÷åíèå âõîäíûõ äàííûõ ïðè ïîìîùè îïåðàòîðà InputBox


1: Const Pi As Single = 3.14 'àïïðîêñèìàöèÿ çíà÷åíèÿ pi
2: Dim CircleArea As Single 'ñîõðàíÿåò âû÷èñëåííóþ ïëîùàäü êðóãà
3:
4: Sub Calc_CircleArea()
5: Const BoxTitle = "Ïëîùàäü êðóãà"
6: Dim Radius As Single, Temp As String
7: Temp = InputBox("Ââåäèòå ðàäèóñ êðóãà", BoxTitle)
8: Radius = CSng(Temp)
9: CircleArea = Pi * (Radius * Radius)
10: MsgBox CircleArea, , BoxTitle
11: End Sub

Ñòðîêà 1 ëèñòèíãà 3.8 îáúÿâëÿåò êîíñòàíòó ìîäóëüíîãî óðîâíÿ Pi. Ñòðîêà 2


îáúÿâëÿåò ïåðåìåííóþ ìîäóëüíîãî óðîâíÿ CircleArea. Ýòè ýëåìåíòû îáúÿâëÿ-
þòñÿ íà óðîâíå ìîäóëÿ, ÷òîáû îíè áûëè äîñòóïíû âî âñåì ìîäóëå; äðóãèì ïðî-
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 113

öåäóðàì â òîì æå ìîäóëå ìîæåò ïîíàäîáèòüñÿ äîñòóï ê çíà÷åíèþ 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)

Âñÿêèé ðàç, êîãäà âû âûçûâàåòå êàêóþ-ëèáî ôóíêöèþ, íåîáõîäèìî êàê-òî


èñïîëüçîâàòü çíà÷åíèå, âîçâðàùàåìîå ôóíêöèåé. [Çíà÷åíèå, âîçâðàùàåìîå
ôóíêöèåé, íàçûâàåòñÿ ðåçóëüòàòîì ôóíêöèè (function result)]. ×àñòî ôóíê-
öèè èñïîëüçóþò ðåçóëüòàò, ïðèñâàèâàÿ åãî êàêîé-ëèáî ïåðåìåííîé, êàê ïîêà-
çàíî â ñòðîêå 7 â ñëó÷àå ñ ôóíêöèåé InputBox, ðåçóëüòàò êîòîðîé ïðèñâàèâà-
åòñÿ ïåðåìåííîé Temp.
Ðåçóëüòàò ôóíêöèè InputBox âñåãäà ÿâëÿåòñÿ ñòðîêîé (âîò ïî÷åìó ïåðå-
ìåííàÿ Temp áûëà îáúÿâëåíà êàê String). Ïîñìîòðèòå åùå ðàç íà ðèñ. 3.4.
Åñëè ïîëüçîâàòåëü âûáèðàåò êîìàíäíóþ êíîïêó OK, ôóíêöèÿ InputBox âîç-
âðàùàåò òî, ÷òî ïîëüçîâàòåëü ââåë â òåêñòîâîå îêíî, â êà÷åñòâå ðåçóëüòàòà.
Åñëè ïîëüçîâàòåëü âûáèðàåò êîìàíäíóþ êíîïêó Cancel (èëè íàæèìàåò êëàâè-
øó Esc, èëè èñïîëüçóåò êíîïêó Close äèàëîãîâîãî îêíà), InputBox â êà÷åñòâå
ðåçóëüòàòà âîçâðàùàåò ïóñòóþ ñòðîêó.
Ïîñêîëüêó ïåðåìåííàÿ Temp áûëà îáúÿâëåíà ÿâíî êàê String, çíà÷åíèå
ñòðîêè äîëæíî áûòü ïðåîáðàçîâàíî â ÷èñëåííîå çíà÷åíèå ïåðåä òåì, êàê ìîæ-
íî áóäåò åãî èñïîëüçîâàòü â ìàòåìàòè÷åñêèõ âû÷èñëåíèÿõ. Ñòðîêà 8 ëèñòèí-
ãà 3.8 âûïîëíÿåò èìåííî ýòî, èñïîëüçóÿ âñòðîåííóþ VBA-ôóíêöèþ CSng äëÿ
ïðåîáðàçîâàíèÿ ïîëüçîâàòåëüñêèõ äàííûõ ââîäà â ÷èñëî ñ òèïîì Single.
CSng — ýòî îäíà èç íåñêîëüêèõ ôóíêöèé ïðåîáðàçîâàíèÿ äàííûõ, áîëåå ïîä-
ðîáíî îïèñàííûõ äàëåå â ýòîé ãëàâå.
114 Ãëàâà 3

Âûðàæåíèÿ â Visual Basic


Òåïåðü âû çíàåòå, êàê çàïèñûâàòü è ðåäàêòèðîâàòü ìàêðîñû, ïèñàòü ñîáñò-
âåííûå ïðîñòûå ïðîöåäóðû è ñîçäàâàòü è èñïîëüçîâàòü êîíñòàíòû è ïåðåìåí-
íûå. Â ýòîì ðàçäåëå îïèñûâàåòñÿ, êàê îáúåäèíÿòü ïåðåìåííûå è êîíñòàíòû
äëÿ ñîçäàíèÿ íîâûõ çíà÷åíèé.
Âûðàæåíèå (expression) — ýòî çíà÷åíèå èëè ãðóïïà çíà÷åíèé, âûðàæàþùàÿ
îòäåëüíîå çíà÷åíèå. Êàæäîå âûðàæåíèå âû÷èñëÿåòñÿ äî (èëè èìååò ðåçóëüòà-
òîì) îòäåëüíîãî çíà÷åíèÿ. Âûðàæåíèå 2+5, íàïðèìåð, èìååò ðåçóëüòàòîì 7.
Âûðàæåíèÿ ñîñòîÿò èç îäíîé èëè áîëåå ñëåäóþùèõ ÷àñòåé:
¨ Êîíñòàíòû (ëèòåðàëüíûå èëè èìåíîâàííûå)
¨ Ïåðåìåííûå (ëþáîãî òèïà äàííûõ)
¨ Çíàêè îïåðàöèé
¨ Ìàññèâû
¨ Ýëåìåíòû ìàññèâà
¨ Ôóíêöèè
Âñå âûðàæåíèÿ èìåþò ðåçóëüòàòîì îäíî çíà÷åíèå îïðåäåëåííîãî òèïà äàí-
íûõ, î êîòîðûõ âû óçíàëè ðàíåå â ýòîé ãëàâå. Âûðàæåíèÿ ìîãóò òàêæå èìåòü
ðåçóëüòàòîì îäíî èç ñïåöèàëüíûõ çíà÷åíèé Empty èëè Null. VBA ïðåäîñòàâ-
ëÿåò êëþ÷åâûå ñëîâà Empty è Null äëÿ óêàçàíèÿ îñîáûõ çíà÷åíèé â ïåðåìåí-
íîé èëè âûðàæåíèè. Çíà÷åíèå Empty ïðåäñòàâëÿåò íåèíèöèàëèçèðîâàííóþ
ïåðåìåííóþ òèïà Variant èëè ðåçóëüòàò âûðàæåíèÿ, ñîäåðæàùèé íåèíèöèà-
ëèçèðîâàííóþ ïåðåìåííóþ òèïà Variant. Çíà÷åíèå Null ïðåäñòàâëÿåò âûðà-
æåíèå, ñîäåðæàùåå íåâåðíûå äàííûå.
Âîò íåêîòîðûå ïðèìåðû âûðàæåíèé:

Âûðàæåíèå Îïèñàíèå
7 Ñîäåðæèò îäíî çíà÷åíèå è èìååò ðåçóëüòàòîì ÷èñëî 7.
Ñîäåðæèò îäíî çíà÷åíèå è èìååò ðåçóëüòàòîì ñèìâîëüíóþ ñòðîêó
«25»
«25».
Ñîäåðæèò äâà ñòðîêîâûõ çíà÷åíèÿ è çíàê îïåðàöèè; èìååò
«To» & «day»
ðåçóëüòàòîì îäíó ñòðîêó «Today».
Âîçâðàùàåò ÷èñëî, ïîëó÷åííîå äåëåíèåì ñîäåðæèìîãî ïåðåìåííîé b
b / (p*10) íà çíà÷åíèå, ïîëó÷åííîå ïîñëå óìíîæåíèÿ ñîäåðæèìîãî ïåðåìåííîé
p íà êîíñòàíòó 10.
Âû÷èñëÿåòñÿ äî ëîãè÷åñêîãî çíà÷åíèÿ; â ýòîì ñëó÷àå óêàçûâàÿ,
Value <= 17 ÿâëÿåòñÿ ëè ñîäåðæèìîå ïåðåìåííîé Value ìåíüøèì èëè ðàâíûì
êîíñòàíòíîìó ÷èñëåííîìó çíà÷åíèþ 17.

Çíàêè (îáîçíà÷åíèÿ) îïåðàöèé èñïîëüçóþòñÿ äëÿ îáúåäèíåíèÿ, ñðàâíåíèÿ


èëè äðóãèõ äåéñòâèé íàä îïðåäåëåííûìè çíà÷åíèÿìè â âûðàæåíèè. Îïåðàöè-
ÿì ïðèñâîåíû èìåíà, è îíè ìîãóò èìåòü îáîçíà÷àþùèé èõ çíàê, íàïðèìåð,
îïåðàöèÿ ñëîæåíèÿ èìååò çíàê «+». Êîãäà âû èñïîëüçóåòå êàêîé-ëèáî çíàê
â âûðàæåíèè, ýëåìåíòû äàííûõ (ïåðåìåííûå èëè êîíñòàíòû), íàä êîòîðûìè
ïðîèçâîäèòñÿ äåéñòâèå, íàçûâàþòñÿ îïåðàíäàìè (operands); áîëüøèíñòâó îïå-
ðàöèé òðåáóåòñÿ äâà îïåðàíäà.  âûðàæåíèè 3+1, íàïðèìåð, ÷èñëà 3 è 1 ÿâëÿ-
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 115

þòñÿ îïåðàíäàìè îïåðàöèè ñëîæåíèÿ (+). Âûðàæåíèå ìîæåò ñîäåðæàòü îäèí,


íåñêîëüêî çíàêîâ îïåðàöèè èëè íè îäíîãî.
Âûðàæåíèÿ èñïîëüçóþòñÿ äëÿ âûïîëíåíèÿ âû÷èñëåíèé è ñðàâíåíèÿ çíà÷å-
íèé, äëÿ ïðåäîñòàâëåíèÿ ïåðåìåííûõ â êà÷åñòâå àðãóìåíòîâ ðàçëè÷íûì ôóíê-
öèÿì è ïðîöåäóðàì VBA. Âñå âûðàæåíèÿ Visual Basic âû÷èñëÿþòñÿ äî çíà÷å-
íèÿ, èìåþùåãî îäèí èç òèïîâ äàííûõ Visual Basic. Äàëåå ñëåäóåò ïåðå÷åíü
ðàçëè÷íûõ òèïîâ âûðàæåíèé VBA:
¨ Âûðàæåíèå òèïà äàòû (date expression) — ýòî ëþáîå âûðàæåíèå, êîòî-
ðîå âû÷èñëÿåòñÿ äî çíà÷åíèÿ òèïà Date. Âûðàæåíèÿ Date ìîãóò âêëþ-
÷àòü êîíñòàíòû òèïà Date, ïåðåìåííûå, ñîäåðæàùèå äàòû èëè ÷èñëà,
÷èñëåííûå êîíñòàíòû, äàòû, âîçâðàùàåìûå ôóíêöèÿìè, è çíàêè àðèô-
ìåòè÷åñêèõ îïåðàöèé.
¨ ×èñëåííîå âûðàæåíèå (numeric expression) — ýòî ëþáîå âûðàæåíèå, êîòî-
ðîå âû÷èñëÿåòñÿ äî ÷èñëà ëþáîãî òèïà — Byte, Integer, Long, Single,
Double èëè Currency. ×èñëåííûå âûðàæåíèÿ ìîãóò âêëþ÷àòü ïåðåìåí-
íûå, õðàíÿùèå ÷èñëà, ÷èñëåííûå êîíñòàíòû, ôóíêöèè, âîçâðàùàþùèå
÷èñëà, è çíàêè àðèôìåòè÷åñêèõ îïåðàöèé. ×èñëåííûå âûðàæåíèÿ ìîãóò
òàêæå âêëþ÷àòü ñòðîêîâûå âûðàæåíèÿ, êîòîðûå VBA ïðåîáðàçóåò â ÷èñ-
ëî. (Åñëè âñå ñèìâîëû â ñòðîêå ÿâëÿþòñÿ öèôðàìè, òî VBA ìîæåò ïðåîá-
ðàçîâàòü ýòó ñòðîêó â ÷èñëåííîå çíà÷åíèå; íàïðèìåð, ñòðîêó «436» â ÷èñ-
ëî 436.)
¨ Ñòðîêîâîå âûðàæåíèå (string expression) — ýòî ëþáîå âûðàæåíèå, êîòî-
ðîå èìååò ðåçóëüòàòîì çíà÷åíèå òèïà String. Ñòðîêîâûå âûðàæåíèÿ ìî-
ãóò âêëþ÷àòü ïåðåìåííûå, êîòîðûå õðàíÿò ñòðîêè, ñòðîêîâûå êîíñòàíòû,
ôóíêöèè, âîçâðàùàþùèå ñòðîêè, èëè çíàêè (îáîçíà÷åíèÿ) îïåðàöèé êîí-
êàòåíàöèè ñòðîê. Ñòðîêîâûå âûðàæåíèÿ ìîãóò òàêæå âêëþ÷àòü ÷èñëåí-
íûå âûðàæåíèÿ, êîòîðûå VBA ìîæåò ïðåîáðàçîâàòü â ñòðîêó.
¨ Ëîãè÷åñêîå âûðàæåíèå (logical expression) — ýòî ëþáîå âûðàæåíèå, êîòî-
ðîå âû÷èñëÿåòñÿ äî çíà÷åíèÿ òèïà Boolean: True èëè False. Ëîãè÷åñêèå
âûðàæåíèÿ ìîãóò ñîñòîÿòü èç ïåðåìåííûõ, ñîäåðæàùèõ çíà÷åíèÿ Boo-
lean, êîíñòàíò Boolean, ôóíêöèé, âîçâðàùàþùèõ çíà÷åíèÿ òèïà Boo-
lean, çíàêîâ îïåðàöèé ñðàâíåíèÿ èëè ëîãè÷åñêèõ îïåðàöèé.
¨ Îáúåêòíîå âûðàæåíèå (object expression) — ýòî ëþáîå âûðàæåíèå, êîòî-
ðîå èìååò ðåçóëüòàòîì ññûëêó íà îáúåêò.

Ñîâìåñòèìîñòü òèïîâ äàííûõ


Íå âñå òèïû äàííûõ ñîâìåñòèìû äðóã ñ äðóãîì, è íåëüçÿ èñïîëüçîâàòü íåñî-
âìåñòèìûå òèïû äàííûõ â îäíîì è òîì æå âûðàæåíèè. Íàïðèìåð, íå èìååò
ñìûñëà àðèôìåòè÷åñêîå ñëîæåíèå ñòðîêè ñ ÷èñëîì, òàê êàê òàêîå âûðàæåíèå
íå ÿâëÿåòñÿ çíà÷àùèì è VBA íå ìîæåò åãî îöåíèòü.
Ìíîãèå òèïû äàííûõ ñîâìåñòèìû äðóã ñ äðóãîì. Íàïðèìåð, âû ìîæåòå îáú-
åäèíÿòü ðàçëè÷íûå ÷èñëåííûå òèïû äàííûõ â îäíîì è òîì æå âûðàæåíèè;
VBA àâòîìàòè÷åñêè âûïîëíÿåò íåîáõîäèìûå ïðåîáðàçîâàíèÿ òèïà ðàçëè÷íûõ
÷èñëåííûõ òèïîâ. VBA ìîæåò òàêæå èíîãäà àâòîìàòè÷åñêè ïðåîáðàçîâûâàòü
äðóãèå òèïû äàííûõ òàê, ÷òîáû âñå òèïû â âûðàæåíèè áûëè ñîâìåñòèìû, õîòÿ
ýòî íå âñåãäà âîçìîæíî. Íàïðèìåð, òèïû String è Date ñîâìåñòèìû ñ ÷èñëåí-
íûìè òèïàìè òîëüêî ïðè îñîáûõ óñëîâèÿõ, êîòîðûå áóäóò îïèñàíû äàëåå.
116 Ãëàâà 3

Î÷åíü âàæíî êîíòðîëèðîâàòü è çíàòü òèï âûðàæåíèÿ, ïîòîìó ÷òî åñëè âû-
ðàæåíèÿ ñîäåðæàò íåñîâìåñòèìûå òèïû, VBA âûäàåò îøèáêó âðåìåíè èñïîë-
íåíèÿ — îøèáêó íåñîâïàäåíèÿ òèïîâ (type-mismatch). Èíîãäà, âïðî÷åì,
òàêàÿ îøèáêà ÿâëÿåòñÿ ðåçóëüòàòîì íåïðàâèëüíîé èíòåðïðåòàöèè îïåðàòîðîâ,
íàïðèìåð, èìåþùèõ íåñêîëüêî àðãóìåíòîâ.
Ïðè îáðàáîòêå âûðàæåíèÿ, ñîäåðæàùåãî ðàçëè÷íûå òèïû äàííûõ VBA ñíà-
÷àëà «ïûòàåòñÿ» óñòðàíèòü ëþáîå ðàçëè÷èå òèïîâ, ïðåîáðàçóÿ çíà÷åíèÿ â âû-
ðàæåíèè â ñîâìåñòèìûå òèïû äàííûõ. Åñëè óñòðàíèòü êàêèå-ëèáî ðàçëè÷èÿ
ïðåîáðàçîâàíèåì òèïîâ íå óäàåòñÿ, îòîáðàæàåòñÿ îøèáêà âðåìåíè èñïîëíåíèÿ
è ïðîöåäóðà ïðåêðàùàåò âûïîëíÿòüñÿ.
Åñëè âû ïðèñâàèâàåòå ðåçóëüòàò êàêîãî-ëèáî âûðàæåíèÿ ïåðåìåííîé, à òèï
ïåðåìåííîé íåñîâìåñòèì ñ òèïîì ðåçóëüòàòà ýòîãî âûðàæåíèÿ, VBA òàêæå
îòîáðàæàåò îøèáêó íåñîâïàäåíèÿ òèïîâ. Àíàëîãè÷íî, èñïîëüçîâàíèå òàêîãî
ðåçóëüòàòà âûðàæåíèÿ â êà÷åñòâå àðãóìåíòà äëÿ ôóíêöèè èëè ïðîöåäóðû òàê-
æå ïðèâîäèò ê îøèáêå íåñîâïàäåíèÿ òèïîâ, åñëè òèï äàííûõ àðãóìåíòîâ è òèï
ðåçóëüòàòà âûðàæåíèÿ ÿâëÿþòñÿ íåñîâìåñòèìûìè.
VBA ïðåäîñòàâëÿåò ðàçëè÷íûå ôóíêöèè äëÿ ïðåîáðàçîâàíèÿ èíôîðìàöèè
îäíîãî òèïà â äðóãîé, íàïðèìåð, ñòðîê â ÷èñëà, ÷èñåë â ñòðîêè è òàê äàëåå (ðà-
íåå óæå èñïîëüçîâàëàñü ôóíêöèÿ CSng, èñïîëüçóåìàÿ äëÿ ïðåîáðàçîâàíèÿ
òèïà String â ÷èñëåííûé Single). Ôóíêöèè ïðåîáðàçîâàíèÿ äàííûõ VBA
îïèñûâàþòñÿ áîëåå ïîäðîáíî â ñëåäóþùåé ãëàâå.

Àâòîìàòè÷åñêîå ïðåîáðàçîâàíèå äàííûõ Visual Basic


VBA èñïîëüçóåò ðàçëè÷íûå ïðàâèëà äëÿ àâòîìàòè÷åñêîãî ïðåîáðàçîâàíèÿ
äàííûõ â ñîâìåñòèìûå òèïû è âûáèðàåò ïðàâèëà ïðåîáðàçîâàíèÿ äàííûõ ïðè-
ìåíèòåëüíî ê îïðåäåëåííîìó âûðàæåíèþ íà îñíîâå êîíêðåòíûõ òèïîâ è îïå-
ðàòîðîâ, èñïîëüçóåìûõ â âûðàæåíèè.
VBA âûïîëíÿåò àâòîìàòè÷åñêîå ïðåîáðàçîâàíèå òèïîâ áûñòðåå, åñëè âûðà-
æåíèå ñîäåðæèò ïåðåìåííûå òèïà Variant, ïîòîìó ÷òî òèï äàííûõ Variant
íå ÿâëÿåòñÿ ôèêñèðîâàííûì. Åñëè âûðàæåíèå ñîäåðæèò ëèòåðàëüíûå êîí-
ñòàíòû, òèïèçèðîâàííûå ïåðåìåííûå èëè òèïèçèðîâàííûå êîíñòàíòû, VBA
ïðèìåíÿåò áîëåå îïðåäåëåííûå ïðàâèëà ïðåîáðàçîâàíèÿ òèïîâ, ïîòîìó ÷òî òèï
äàííûõ ýòèõ ýëåìåíòîâ ÿâëÿåòñÿ ôèêñèðîâàííûì. (Ïîìíèòå, òèïèçèðîâàííàÿ
ïåðåìåííàÿ èëè òèïèçèðîâàííàÿ êîíñòàíòà — ýòî ïåðåìåííàÿ èëè êîíñòàíòà,
äëÿ êîòîðîé âû ÿâíî îáúÿâèëè òèï äàííûõ ëèáî ñ ïîìîùüþ êëþ÷åâîãî ñëîâà
As, ëèáî ñèìâîëà îïðåäåëåíèÿ òèïà.)
Ñëåäóþùèå âûðàæåíèÿ èëëþñòðèðóþò, êàê îò òèïîâ äàííûõ è îïåðàòîðà
çàâèñÿò ïðåîáðàçîâàíèÿ, âûïîëíÿåìûå VBA:

Âûðàæåíèå Îïèñàíèå è òèï ðåçóëüòàòà


Ñîçäàåò îøèáêó íåñîâïàäåíèÿ òèïîâ, êîãäà Num îáúÿâëÿåòñÿ êàê
÷èñëåííûé òèï, à Str — êàê òèï String.
Num + Str
Âûïîëíÿåòñÿ ñòðîêîâàÿ êîíêàòåíàöèÿ, êîãäà Num ÿâëÿåòñÿ Variant,
à Str îáúÿâëÿåòñÿ êàê òèï String; ðåçóëüòàò ÿâëÿåòñÿ òèïîì String.
Âûïîëíÿåòñÿ àðèôìåòè÷åñêîå ñëîæåíèå, êîãäà Num îáúÿâëÿåòñÿ êàê
Num + Str ÷èñëåííûé òèï, à Str — êàê Variant, èëè êîãäà è Num, è Str
ÿâëÿþòñÿ òèïîì Variant; ðåçóëüòàò — ÷èñëåííûé òèï.
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 117

Âûðàæåíèå Îïèñàíèå è òèï ðåçóëüòàòà


Âûçûâàåò îøèáêó íåñîâïàäåíèÿ òèïîâ, åñëè Num îáúÿâëåí
Num +«3» ÷èñëåííûì òèïîì. Âûïîëíÿåòñÿ ñòðîêîâàÿ êîíêàòåíàöèÿ, åñëè Num
ÿâëÿåòñÿ òèïîì Variant; ðåçóëüòàò èìååò òèï String.
Âûçûâàåò îøèáêó íåñîâïàäåíèÿ òèïîâ, åñëè Str îáúÿâëåí êàê òèï
String. Âûïîëíÿåòñÿ àðèôìåòè÷åñêîå ñëîæåíèå, åñëè Str ÿâëÿåòñÿ
3 + Str òèïîì Variant; ðåçóëüòàò ÿâëÿåòñÿ ÷èñëåííûì òèïîì. (Çàìåòüòå, ÷òî
ýòî âûðàæåíèå íèêîãäà íå èìååò ðåçóëüòàòîì ñòðîêîâóþ
êîíêàòåíàöèþ.)
Âñåãäà âûïîëíÿåò ñòðîêîâóþ êîíêàòåíàöèþ, íåçàâèñèìî îò òèïîâ
Num & Str ïåðåìåííûõ; ðåçóëüòàòîì ÿâëÿåòñÿ òèï String. Ýòî âûðàæåíèå
íèêîãäà íå âûçûâàåò îøèáêè íåñîâïàäåíèÿ òèïîâ.

Îáðàòèòå îñîáîå âíèìàíèå íà ïîñëåäíåå âûðàæåíèå. Â íåì èñïîëüçóåòñÿ


îïåðàòîð ñòðîêîâîé êîíêàòåíàöèè (&), êîòîðûé ñîåäèíÿåò («ñêëåèâàåò») âìå-
ñòå äâå ñòðîêè. Ïîñêîëüêó ìîæíî èñïîëüçîâàòü ýòîò îïåðàòîð òîëüêî ñî ñòðî-
êàìè, VBA ïðåîáðàçóåò òèïû äàííûõ â ýòîì âûðàæåíèè â ñòðîêè, íåçàâèñèìî
îò èõ îðèãèíàëüíîãî òèïà äàííûõ è íåçàâèñèìî îò òîãî, èìåþò ëè êàêèå-ëèáî
ïåðåìåííûå â âûðàæåíèè îïðåäåëåííûé òèï. Ïî ìåðå îïèñàíèÿ îòäåëüíûõ
îïåðàòîðîâ â äàëüíåéøèõ ðàçäåëàõ ýòîé ãëàâû îïèñûâàþòñÿ òàêæå îñîáûå
ïðàâèëà ïðåîáðàçîâàíèÿ äàííûõ, êîòîðûå VBA ïðèìåíÿåò äëÿ êàæäîãî îò-
äåëüíîãî îïåðàòîðà.
Âû, íàâåðíîå, óæå çàìåòèëè, ÷òî áîëüøèíñòâî èç óêàçàííûõ âûøå âûðàæå-
íèé âûçûâàþò îøèáêó íåñîâïàäåíèÿ òèïîâ òîëüêî òîãäà, êîãäà îáà îïåðàíäà â
âûðàæåíèè èìåþò îïðåäåëåííûå è ðàçíûå òèïû. Âû ìîæåòå òàêæå çàìåòèòü,
÷òî âûðàæåíèÿ íå âûçûâàþò îøèáêó íåñîâïàäåíèÿ òèïîâ, êîãäà îäèí èç îïå-
ðàíäîâ ÿâëÿåòñÿ ïåðåìåííîé òèïà Variant. Êàê áûëî óïîìÿíóòî âûøå, VBA
ëåã÷å âñåãî âûïîëíÿåò àâòîìàòè÷åñêèå ïðåîáðàçîâàíèÿ òèïîâ ñ äàííûìè òèïà
Variant. Íå ñëåäóåò, îäíàêî, èñïîëüçîâàòü òèïû Variant òîëüêî äëÿ òîãî, ÷òî-
áû èçáåæàòü îøèáîê íåñîâïàäåíèÿ òèïîâ, ïîñêîëüêó èãíîðèðîâàíèå âîçìîæíî-
ñòè èñïîëüçîâàíèÿ âñòðîåííûõ òèïîâ ìîæåò ïðèâåñòè ê äðóãèì îøèáêàì.

Ïðåîáðàçîâàíèÿ ÷èñëåííûõ òèïîâ


VBA îáû÷íî ïðåîáðàçóåò âñå ÷èñëåííûå òèïû äàííûõ â âûðàæåíèè â òèï
íàèáîëüøåé òî÷íîñòè, à çàòåì äàåò ýòîò òèï ðåçóëüòàòó âûðàæåíèÿ. Íàïðè-
ìåð, åñëè âûðàæåíèå ñîäåðæèò ÷èñëåííûå çíà÷åíèÿ ñ òèïàìè Integer
è Single, ðåçóëüòàò âûðàæåíèÿ ÿâëÿåòñÿ òèïîì Single — òèï íàèáîëüøåé
òî÷íîñòè â ýòîì âûðàæåíèè.
Åñëè âû ïðèñâàèâàåòå ðåçóëüòàò ÷èñëåííîãî âûðàæåíèÿ ïåðåìåííîé ñ íàè-
ìåíüøåé òî÷íîñòüþ, ÷åì ôàêòè÷åñêèé òèï ðåçóëüòàòà âûðàæåíèÿ, VBA îêðóã-
ëÿåò ðåçóëüòàò âûðàæåíèÿ äî òåõ ïîð, ïîêà åãî òî÷íîñòü íå ñîâïàäåò ñ îæèäàå-
ìûì òèïîì. Íàïðèìåð, åñëè âû ïðèñâàèâàåòå ÷èñëåííîå âûðàæåíèå, èìåþùåå
ðåçóëüòàòîì ÷èñëî òèïà Double, ïåðåìåííîé òèïà Integer, VBA îêðóãëÿåò
÷èñëî äâîéíîé òî÷íîñòè äî òèïà Integer.
118 Ãëàâà 3

Ïðåîáðàçîâàíèÿ ñòðîê è ÷èñåë


Ïðè ïðåîáðàçîâàíèè ÷èñëà â ñòðîêó VBA ñîçäàåò ñòðîêó, ñîäåðæàùóþ âñå
öèôðû ýòîãî ÷èñëà è äåñÿòè÷íûé çíàê (åñëè ÷èñëî èìååò åãî). ×èñëî 3413.721,
íàïðèìåð, ïðåîáðàçóåòñÿ â ñòðîêó «3413,72». Åñëè ÷èñëî î÷åíü áîëüøîå èëè
î÷åíü ìàëåíüêîå, VBA ìîæåò ñîçäàòü ñòðîêîâîå ïðåäñòàâëåíèå ÷èñëà â ýêñïî-
íåíöèàëüíîé çàïèñè; íàïðèìåð, ÷èñëî 0.0000000004927 ïðåîáðàçóåòñÿ â ñòðî-
êó «4,927E–11».
VBA ìîæåò ïðåîáðàçîâûâàòü ñòðîêó â ÷èñëî, åñëè òîëüêî ýòà ñòðîêà ñîäåð-
æèò ñèìâîëüíîå ïðåäñòàâëåíèå ÷èñëà â äåñÿòè÷íîì ôîðìàòå èëè ýêñïîíåíöè-
àëüíîì. Ñòðîêè «988,6», «812», «–186,7», «1,3E10» ïðåäñòàâëÿþò ÷èñëà,
è VBA ìîæåò ïðåîáðàçîâàòü èõ â ÷èñëà. Ñòðîêè «1.045», «$74.550» è «Ñ äîá-
ðûì óòðîì!» íå ìîãóò áûòü ïðåîáðàçîâàíû â ÷èñëà.

Ïðåîáðàçîâàíèÿ çíà÷åíèé òèïà Boolean


Êîãäà VBA ïðåîáðàçóåò çíà÷åíèÿ òèïà Boolean â ÷èñëà, çíà÷åíèå True ïðå-
îáðàçóåòñÿ â 1, à çíà÷åíèå False — â 0. Êîãäà VBA ïðåîáðàçóåò ÷èñëî â òèï
Boolean, íóëü ïðåîáðàçóåòñÿ â False, à ëþáîå äðóãîå çíà÷åíèå ïðåîáðàçóåòñÿ
â True. Êîãäà VBA ïðåîáðàçóåò çíà÷åíèÿ òèïà Boolean â ñòðîêè, VBA èñïîëü-
çóåò ñòðîêó «True» äëÿ True è «False» — äëÿ False. VBA íå ìîæåò ïðåîáðàçî-
âûâàòü ñòðîêîâûå âûðàæåíèÿ â òèï Boolean, íî ìîæåò ïðåîáðàçîâûâàòü ÷èñ-
ëåííûå âûðàæåíèÿ â çíà÷åíèÿ ýòîãî òèïà. Êîãäà âû èñïîëüçóåòå çíà÷åíèÿ
òèïà Boolean â àðèôìåòè÷åñêèõ âûðàæåíèÿõ, VBA âñåãäà ïðåîáðàçóåò èõ
â ÷èñëà, äàæå åñëè âñå äðóãèå ÷àñòè ýòîãî âûðàæåíèÿ òàêæå ÿâëÿþòñÿ ïåðå-
ìåííûìè èëè êîíñòàíòàìè òèïà Boolean.

Ïðåîáðàçîâàíèÿ çíà÷åíèé òèïà Date


Êîãäà VBA ïðåîáðàçóåò òèï äàííûõ Date â ÷èñëî, ðåçóëüòàòîì ÿâëÿåòñÿ
÷èñëåííîå çíà÷åíèå — ÷èñëî òèïà Double, êîòîðîå ñîäåðæèò êîëè÷åñòâî äíåé
îò 30 äåêàáðÿ 1899 (îòðèöàòåëüíîå ÷èñëî ïðåäñòàâëÿåò äàòó, áîëåå ðàííþþ,
÷åì 12/30/1899). Äåñÿòè÷íàÿ ÷àñòü ÷èñëà (åñëè èìååòñÿ) âûðàæàåò âðåìÿ äíÿ
êàê ÷àñòü äíÿ; 0 — ýòî ïîëíî÷ü, à 0.5 — ýòî ïîëäåíü.  VBA ïðåîáðàçîâàíèå
÷èñëåííûõ òèïîâ äàííûõ â òèïû Date ÿâëÿåòñÿ ïðîñòî îáðàòíûì ïðåîáðàçîâà-
íèþ òèïà Date â ÷èñëî.
Åñëè âûðàæåíèå èìååò ðåçóëüòàòîì çíà÷åíèå, íàõîäÿùååñÿ âíå äèàïàçîíà
òèïà äàííûõ äëÿ ýòîãî âûðàæåíèÿ, VBA îòîáðàæàåò ñîîáùåíèå îá îøèáêå ïå-
ðåïîëíåíèÿ. Åñëè âûðàæåíèå ñîäåðæèò ëèòåðàëüíóþ êîíñòàíòó, èíîãäà ìîæ-
íî ðåøèòü ýòó ïðîáëåìó, èñïîëüçóÿ ñèìâîë îïðåäåëåíèÿ òèïà ñ ëèòåðàëüíîé
êîíñòàíòîé, ÷òîáû âûðàæåíèå èìåëî ðåçóëüòàòîì ÷èñëåííûé òèï ñ áîëüøèì
äèàïàçîíîì çíà÷åíèé.

Îïåðàòîð ïðèñâàèâàíèÿ
Ðàíåå óæå èñïîëüçîâàëñÿ îïåðàòîð (statement) ïðèñâàèâàíèÿ. Ýòîò îïåðà-
òîð èñïîëüçóåòñÿ äëÿ ïðèñâàèâàíèÿ ðåçóëüòàòà âûðàæåíèÿ ïåðåìåííîé. Îïå-

1 Òî÷êà èñïîëüçóåòñÿ äëÿ çàïèñè ÷èñëà â êîäå.


Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 119

ðàòîð ïðèñâàèâàíèÿ ñîõðàíÿåò ëþáîå çíà÷åíèå, êîòîðîå ïðåäñòàâëåíî âûðàæå-


íèåì ñïðàâà îò îïåðàòîðà ïðèñâàèâàíèÿ (=), â ÿ÷åéêå ïàìÿòè, íà êîòîðóþ ññû-
ëàåòñÿ ïåðåìåííàÿ ñëåâà îò îïåðàòîðà.
Îïåðàòîð ïðèñâàèâàíèÿ èìååò äâå ñèíòàêñè÷åñêèå ôîðìû, îáå èç êîòîðûõ
ÿâëÿþòñÿ îäèíàêîâî ïðèåìëåìûìè è âûïîëíÿþò îäíó è òó æå çàäà÷ó. Ïåðâàÿ
ôîðìà îïåðàòîðà ïðèñâàèâàíèÿ èñïîëüçóåò êëþ÷åâîå ñëîâî Let è èìååò ñëå-
äóþùèé îáùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Let varname = expression
Ïåðåìåííàÿ varname ïðåäñòàâëÿåò ëþáóþ ïåðåìåííóþ VBA, à expression — ëþáîå
âûðàæåíèå VBA. Ýòîò ñèíòàêñèñ ÿâëÿåòñÿ îðèãèíàëüíîé ôîðìîé îïåðàòîðà
ïðèñâàèâàíèÿ, èñïîëüçîâàâøåéñÿ â ðàííèõ âåðñèÿõ ÿçûêà ïðîãðàììèðîâàíèÿ Ba-
sic. Ñëåäóþùèé îïåðàòîð VBA ÿâëÿåòñÿ ïðèìåðîì îïåðàòîðà ïðèñâàèâàíèÿ Let:
Let x = y 'ïðèñâàèâàåò ïåðåìåííîé x çíà÷åíèå, ïðåäñòàâëåííîå
'ïåðåìåííîé y
Âòîðàÿ ôîðìà îïåðàòîðà ïðèñâàèâàíèÿ áîëåå óïîòðåáèòåëüíà â ïðîãðàììèðîâàíèè
íà VBA è øèðîêî èñïîëüçóåòñÿ â ýòîé êíèãå. Îáùèé ñèíòàêñèñ ýòîé ôîðìû îïåðà-
òîðà ïðèñâàèâàíèÿ ñëåäóþùèé:
varname = expression
Ïåðåìåííàÿ varname — ëþáàÿ ïåðåìåííàÿ, à expression — ëþáîå âûðàæåíèå.
Äàëåå ñëåäóþò ïðèìåðû ýòîãî áîëåå ïðîñòîãî, áîëåå óïîòðåáèòåëüíîãî îïåðàòîðà
ïðèñâàèâàíèÿ (ïåðâàÿ ñòðîêà ïðèñâàèâàåò ñîäåðæèìîå Y ïåðåìåííîé X; âòîðàÿ
ñòðîêà ïðèñâàèâàåò ïåðåìåííîé SecondVar ðåçóëüòàò ñëîæåíèÿ 102 ñ ñîäåðæèìûì
FirstVar):
X=Y
SecondVar = 102 + FirstVar

Ïðè âûïîëíåíèè îïåðàòîðà ïðèñâàèâàíèÿ VBA ñíà÷àëà âû÷èñëÿåò âûðàæå-


íèå ñïðàâà îò îïåðàòîðà ïðèñâàèâàíèÿ (=), à çàòåì ñîõðàíÿåò ðåçóëüòàò âûðà-
æåíèÿ â ïåðåìåííîé, èìÿ êîòîðîé íàõîäèòñÿ ñëåâà îò îïåðàòîðà ïðèñâàèâà-
íèÿ. Íîâè÷êàì â âîïðîñàõ ïðîãðàììèðîâàíèÿ áûâàþò íå ñðàçó ïîíÿòíû îïåðà-
òîðû, ïîäîáíûå ñëåäóþùèì:
Íîìåð = Íîìåð + 1
ÎáùàÿÑóììà = ÎáùàÿÑóììà + ÏîäÑóììà
Îñîáåííîñòü ýòèõ îïåðàòîðîâ â òîì, ÷òî è ñëåâà, è ñïðàâà îò çíàêà îïåðàòîðà
ïîÿâëÿåòñÿ îäèí è òîò æå èäåíòèôèêàòîð ïåðåìåííîé. ×òîáû ïîíÿòü, êàêèì
äîëæåí áûòü ðåçóëüòàò ïîäîáíûõ èíñòðóêöèé, ñëåäóåò åùå ðàç âíèìàòåëüíî
ïðî÷èòàòü ñèíòàêñèñ îïåðàòîðà ïðèñâàèâàíèÿ. Òîãäà ñòàíåò ÿñíî, ÷òî ñíà÷àëà
â íåêîòîðóþ ïðîìåæóòî÷íóþ ÿ÷åéêó ïàìÿòè ïîìåùàåòñÿ ðåçóëüòàò âû÷èñëå-
íèÿ (îöåíèâàíèÿ) âûðàæåíèÿ ñïðàâà îò îïåðàòîðà «=» (äëÿ ïåðâîãî ïðèìåðà
ýòî — Íîìåð + 1, äëÿ âòîðîãî — ÎáùàÿÑóììà + ÏîäÑóììà), à çàòåì ýòîò ðå-
çóëüòàò ïîìåùàåòñÿ â ÿ÷åéêó ïàìÿòè, ñîîòâåòñòâóþùóþ ïåðåìåííîé, èäåíòè-
ôèêàòîð êîòîðîé íàõîäèòñÿ ñëåâà îò îïåðàòîðà «=».
Áîëåå êîðîòêàÿ ôîðìà îïåðàòîðà ïðèñâàèâàíèÿ èñïîëüçóåòñÿ ãîðàçäî ÷àùå,
÷åì äëèííàÿ, â îñíîâíîì ïîòîìó, ÷òî êîðîòêàÿ áûñòðåå ââîäèòñÿ ñ êëàâèàòó-
ðû. Äëèííàÿ ôîðìà îïåðàòîðà ïðèñâàèâàíèÿ ñ êëþ÷åâûì ñëîâîì Let ÷àñòî ðå-
êîìåíäóåòñÿ äëÿ íà÷èíàþùèõ ïðîãðàììèñòîâ, ïîñêîëüêó ïîìîãàåò îòëè÷àòü
îïåðàòîð ïðèñâàèâàíèÿ îò îïåðàöèè ñðàâíåíèÿ (ðàâåíñòâà).
120 Ãëàâà 3

Õîòÿ ýòè äâå êîíñòðóêöèè èñïîëüçóþò îäèí è òîò æå ñèìâîë, íå ïóòàéòå


îïåðàòîð ïðèñâàèâàíèÿ ñî çíàêîì ðàâåíñòâà (=), èñïîëüçóåìûì äëÿ òåñòèðîâà-
íèÿ íà ðàâåíñòâî. Ñëåäóþùèå äâà âûðàæåíèÿ ïðèâîäÿò ê ñîâåðøåííî ðàçíûì
ðåçóëüòàòàì: ïåðâûé — ÿâëÿåòñÿ îïåðàòîðîì è ïðèñâàèâàåò çíà÷åíèå 5 ïåðå-
ìåííîé FirstVal; âòîðîé — ÿâëÿåòñÿ ëîãè÷åñêèì âûðàæåíèåì, êîòîðîå èìååò
ðåçóëüòàòîì True èëè False, â çàâèñèìîñòè îò òîãî, ñîäåðæèò ëè óæå FirstVal
÷èñëî 5:
FirstVal = 5 'ïðèñâàèâàåò ÷èñëî 5 ïåðåìåííîé FirstVal
(FirstVal = 5) 'ñðàâíèâàåò ñîäåðæèìîå FirstVal ñ ÷èñëîì 5
Çàìåòüòå, ÷òî âòîðàÿ ñòðîêà, ôàêòè÷åñêè, íå ÿâëÿåòñÿ çàêîí÷åííûì îïåðà-
òîðîì VBA (õîòÿ ÿâëÿåòñÿ çàêîí÷åííûì âûðàæåíèåì), ïîñêîëüêó ðåçóëüòàò
ëîãè÷åñêîãî âûðàæåíèÿ íèêàêèì îáðàçîì íå èñïîëüçóåòñÿ; ïîäîáíàÿ ñòðîêà â
âàøèõ ïðîöåäóðàõ ìîæåò âûçâàòü îøèáêó ñèíòàêñèñà. ×òîáû ïîëó÷èòü ñèí-
òàêñè÷åñêè âåðíûé îïåðàòîð VBA, íåîáõîäèìî êàêèì-òî îáðàçîì èñïîëüçîâàòü
ðåçóëüòàò ýòîãî âûðàæåíèÿ: ïðèñâîèòü åãî ïåðåìåííîé, ïåðåäàòü åãî â êà÷åñò-
âå àðãóìåíòà ôóíêöèè èëè ïðîöåäóðå.
Êîãäà âû ïðèñâàèâàåòå ðåçóëüòàò âûðàæåíèÿ ïåðåìåííîé ñ îïðåäåëåííûì
òèïîì äàííûõ, ýòîò ðåçóëüòàò ìîæåò èìåòü òèï äàííûõ, ñîâìåñòèìûé ñ òèïîì
ïåðåìåííîé, ïîëó÷àþùåé íîâîå çíà÷åíèå. Âî ìíîãèõ ñëó÷àÿõ VBA ìîæåò ïðå-
îáðàçîâûâàòü òèï äàííûõ ðåçóëüòàòà âûðàæåíèÿ â òèï, ñîâìåñòèìûé ñ òèïîì
ïåðåìåííîé, ïðèíèìàþùåé íîâîå çíà÷åíèå, åñëè ðåçóëüòàò âûðàæåíèÿ è ïåðå-
ìåííàÿ åùå íå èìåþò ñîâìåñòèìûõ òèïîâ. Ïåðåìåííûì òèïà Variant ìîæåò
áûòü ïðèñâîåí ëþáîé òèï äàííûõ.
Çàïîìíèòå ñëåäóþùåå:
¨ Ìîæíî ïðèñâàèâàòü ëþáóþ ÷èñëåííóþ ïåðåìåííóþ èëè âûðàæåíèå ëþ-
áîé äðóãîé ïåðåìåííîé ÷èñëåííîãî òèïà èëè ïåðåìåííîé òèïà Variant.
Åñëè ïðèñâàèâàåòñÿ ÷èñëåííîå âûðàæåíèå òèïèçèðîâàííîé ïåðåìåííîé ñ
ìåíüøåé òî÷íîñòüþ èëè äèàïàçîíîì (êàê ïðè ïðèñâàèâàíèè òèïà Double
òèïó Long), VBA îêðóãëÿåò çíà÷åíèå âûðàæåíèÿ äëÿ ñîâïàäåíèÿ ñ òî÷íî-
ñòüþ ïåðåìåííîé, ïðèíèìàþùåé íîâîå çíà÷åíèå.
¨ Åñëè ïåðåìåííîé òèïà String ïðèñâàèâàåòñÿ ïåðåìåííàÿ òèïà Variant,
ñîäåðæàùàÿ ÷èñëî, VBA àâòîìàòè÷åñêè ïðåîáðàçóåò ýòî ÷èñëî â ñòðîêó.
(Ïðè ïðèñâàèâàíèè òèïèçèðîâàííûõ ÷èñëåííûõ ïåðåìåííûõ èëè ÷èñ-
ëåííûõ êîíñòàíò ïåðåìåííîé òèïà String ïðîèñõîäèò îøèáêà íåñîâïà-
äåíèÿ òèïîâ.)

Àðèôìåòè÷åñêèå îïåðàöèè
VBA ìîæåò âûïîëíÿòü âñå îáû÷íûå àðèôìåòè÷åñêèå îïåðàöèè (ðåàëèçóå-
ìûå ïîñðåäñòâîì àðèôìåòè÷åñêèõ âûðàæåíèé): ñëîæåíèå, âû÷èòàíèå, óìíî-
æåíèå è äåëåíèå, à òàêæå âîçâåäåíèå ÷èñåë â óêàçàííóþ ñòåïåíü è ïðåäîñòàâ-
ëÿåò äîïîëíèòåëüíûå îñîáûå ìàòåìàòè÷åñêèå îïåðàöèè äëÿ öåëî÷èñëåííîãî
äåëåíèÿ è äåëåíèÿ ïî ìîäóëþ. Â òàáë. 3.3 ïðèâîäÿòñÿ çíàêè îïåðàöèé, êîòî-
ðûå ìîæíî èñïîëüçîâàòü ïðè íàïèñàíèè àðèôìåòè÷åñêèõ VBA-âûðàæåíèé.
( ýòîé òàáëèöå Ni — ýòî ëþáîå äîïóñòèìîå ÷èñëåííîå âûðàæåíèå VBA.)
Òàáëèöà 3.3. Çíàêè îïåðàöèé (îáîçíà÷åíèÿ), èñïîëüçóåìûå â àðèôìåòè÷åñêèõ
VBA-âûðàæåíèÿõ
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 121

Çíàê Ñèíòàêñèñ Èìÿ/Îïèñàíèå


+ N1 + N2 Ñëîæåíèå. Ïðèáàâëÿåò N1 ê N2.
- N1 – N2 Âû÷èòàíèå. Âû÷èòàåò N2 èç N1.
* N1 * N2 Óìíîæåíèå. Óìíîæàåò N1 íà N2.
/ N1/ N2 Äåëåíèå. Äåëèò N1 íà N2.
Öåëî÷èñëåííîå äåëåíèå. Äåëèò N1 íà N2, îòáðàñûâàÿ ëþáóþ
\ N1\ N2
äðîáíóþ ÷àñòü òàê, ÷òîáû ðåçóëüòàò áûë öåëûì ÷èñëîì.
Äåëåíèå ïî ìîäóëþ. Äåëèò N1 íà N2, âîçâðàùàÿ òîëüêî
Mod N1 Mod N2
îñòàòîê îïåðàöèè äåëåíèÿ.
^ N1 ^ N2 Âîçâåäåíèå â ñòåïåíü. Âîçâîäèò N1 â ñòåïåíü N2.

Äàëåå îïèñûâàåòñÿ ïîäðîáíî èñïîëüçîâàíèå êàæäîãî çíàêà.

Ñëîæåíèå (+)
Çíàê îïåðàöèè ñëîæåíèÿ (+) èñïîëüçóåòñÿ äëÿ âûïîëíåíèÿ îïåðàöèè ïðî-
ñòîãî ñëîæåíèÿ. Îáà îïåðàíäà äîëæíû áûòü ÷èñëåííûìè âûðàæåíèÿìè èëè
ñòðîêàìè, êîòîðûå VBA ìîæåò ïðåîáðàçîâàòü â ÷èñëî. Çíàê îïåðàöèè ñëîæå-
íèÿ ìîæíî òàêæå èñïîëüçîâàòü äëÿ ïîñòðîåíèÿ àðèôìåòè÷åñêèõ âûðàæåíèé ñ
äàííûìè òèïà Date.
Äëÿ áîëüøåãî ïîíèìàíèÿ ñëåäóþùåãî ìàòåðèàëà âîéäèòå â Ðåäàêòîð VB
(â Word èëè Excel âûáåðèòå Ðàçðàáîò÷èê | Visual Basic). Äàëåå ùåëêíèòå íà êíîï-
êå View Code â Project Window. Â ïîÿâèâøåìñÿ Code Window íàáèðàéòå ïðåäëàãàå-
ìûå äàëåå íåáîëüøèå ïðîãðàììû è, åñëè âàì ýòîãî áóäåò íå äîñòàòî÷íî, ìîæå-
òå ïðîâîäèòü ñâîè ñîáñòâåííûå ýêñïåðèìåíòû ñ êîäîì.
Ââåäèòå â Code Window êîä ëèñòèíãà 3.9.

Ëèñòèíã 3.9. Ïðèìåð èñïîëüçîâàíèÿ çíàêà îïåðàöèè «+»


1: Sub list5_01()
2: 'Ïðèìåðû àðèôìåòè÷åñêèõ âûðàæåíèé ñî çíàêîì "+"
3: Dim N1, N2, N3 As Integer
4:
5: N1 = 1 'ïðèñâàèâàíèå çíà÷åíèÿ ïåðåìåííîé N1
6: N2 = 2 'ïðèñâàèâàíèå çíà÷åíèÿ ïåðåìåííîé N2
7: N3 = N1 + N2 'ñëîæåíèå; ðåçóëüòàò – â N3
8: MsgBox (N3) 'Âûâîä N3 â äèàëîãîâîì îêíå
9:
10: End Sub

Ïîíÿòíî, ÷òî ïðè çàïóñêå ýòîãî êîäà (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.

 ëèñòèíãå 3.10 ñîäåðæèòñÿ êîä, äåìîíñòðèðóþùèé ïðàâèëà


ïðåîáðàçîâàíèÿ âûðàæåíèé ñî çíàêîì «+», ïðèâåäåííûå â ïîñëåäíåì ïåðå÷íå.

Ëèñòèíã 3.10. Ïðåîáðàçîâàíèÿ òèïîâ â âûðàæåíèÿõ ñî çíàêîì «+»


Sub list5_02()
'Ïðèìåðû àðèôìåòè÷åñêèõ âûðàæåíèé ñî çíàêîì "+"

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 'ïîëó÷èòü çíà÷åíèå òåêóùåé äàòû è âðåìåíè

MsgBox TypeName(S1 + L1), vbOKOnly, "Single + Long"


MsgBox TypeName(D1 + L1), vbOKOnly, "Date + Long"

V1 = I1 'ïåðåìåííàÿ òèïà Variant ñòàíîâèòñÿ òèïà Integer


MsgBox TypeName(V1), vbOKOnly, "V1=I1"

V1 = V1 + 99999 'ïåðåìåííàÿ òèïà Variant ñòàíîâèòñÿ òèïà Long


MsgBox TypeName(V1), vbOKOnly, "V1 + 99999"

V1 = D1 'ïåðåìåííàÿ òèïà Variant ñòàíîâèòñÿ Date


V1 = V1 + 99999999 'ïåðåìåííàÿ òèïà Variant ñòàíîâèòñÿ Double
MsgBox TypeName(V1), vbOKOnly, "V1 = D1; V1 = V1 + 99999999"
V1 = Null + 1 'ïåðåìåííàÿ òèïà Variant ñòàíîâèòñÿ Null
MsgBox TypeName(V1), vbOKOnly, "V1 = Null + 1"
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 123

End Sub

Íà ðèñ. 3.5 ïðèâåäåí ðÿä äèàëîãîâûõ îêîí, êîòîðûå îòîáðàæàþòñÿ íà ýêðà-


íå âî âðåìÿ âûïîëíåíèÿ êîäà ëèñòèíãà 3.10.
Ðèñ. 3.5
Äèàëîãîâûå îêíà, îòîáðàæàåìûå
ïðè âûïîëíåíèè êîäà
ëèñòèíãà 3.10

Çàìåòèì, ÷òî äîâîëüíî ÷àñòî íà÷èíàþùèå ïðîãðàììèðîâàòü íå óäåëÿþò


ýòèì âîïðîñàì äîëæíîãî âíèìàíèÿ; ýòî èíîãäà ïðèâîäèò ê íåïîíÿòíûì äëÿ
íèõ (è íå òîëüêî) ðåçóëüòàòàì.

Âû÷èòàíèå (–)
Çíàê îïåðàöèè âû÷èòàíèÿ (–) âûïîëíÿåò äâå çàäà÷è: îí èñïîëüçóåòñÿ ëèáî
äëÿ ïîñòðîåíèÿ àðèôìåòè÷åñêèõ âûðàæåíèé âû÷èòàíèÿ, ëèáî äëÿ îáîçíà÷å-
íèÿ óíàðíîãî ìèíóñà.
Óíàðíûé ìèíóñ (unary minus) — ýòî çíàê ìèíóñ, êîòîðûé ïîìåùàþò ïåðåä
÷èñëîì äëÿ óêàçàíèÿ òîãî, ÷òî ýòî — îòðèöàòåëüíîå ÷èñëî. Çíàê ìèíóñ ìîæ-
íî òàêæå ïîìåùàòü ïåðåä ïåðåìåííîé èëè äðóãèì âûðàæåíèåì äëÿ îáîçíà÷å-
íèÿ òîãî, ÷òî çíà÷åíèå ïåðåìåííîé èëè âûðàæåíèÿ äîëæíî áûòü îòðèöàòåëü-
íûì. Ïîìåñòèòü óíàðíûé ìèíóñ ïåðåä ïåðåìåííîé èëè âûðàæåíèåì îçíà÷àåò
òî æå, ÷òî óìíîæèòü ýòî ÷èñëî íà –1. Ñëåäóþùèå âûðàæåíèÿ ñîäåðæàò óíàð-
íûé ìèíóñ:

–10 ëèòåðàëüíàÿ îòðèöàòåëüíàÿ êîíñòàíòà


–MyVar äåëàåò îòðèöàòåëüíûì ëþáîå ÷èñëî, ñîõðàíåííîå â MyVar
–(MyVar + 10) äåëàåò îòðèöàòåëüíûì ðåçóëüòàò ñëîæåíèÿ 10 è MyVar

Ñëåäóþùèå íåñêîëüêî âûðàæåíèé ïîêàçûâàþò ïðèìåðû èñïîëüçîâàíèÿ


çíàêà âû÷èòàíèÿ äëÿ ïîñòðîåíèÿ àðèôìåòè÷åñêèõ âûðàæåíèé:

Now – 60 ðåçóëüòàò âûðàæåíèÿ èìååò òèï Date


40 – MyVar ðàçíîñòü ìåæäó 40 è MyVar
AnyVar –
ðàçíîñòü ìåæäó AnyVar è SomeVar
SomeVar

Îáà îïåðàíäà â âûðàæåíèè âû÷èòàíèÿ äîëæíû áûòü ÷èñëåííûìè ïåðåìåí-


íûìè èëè âûðàæåíèÿìè, èëè ñòðîêîâûì âûðàæåíèåì, êîòîðîå VBA ìîæåò
ïðåîáðàçîâàòü â ÷èñëî. Çíàê îïåðàöèè âû÷èòàíèÿ ìîæíî òàêæå èñïîëüçîâàòü
äëÿ ïîñòðîåíèÿ àðèôìåòè÷åñêèõ âûðàæåíèé ñ äàííûìè òèïà Date. Òèï äàí-
124 Ãëàâà 3

íûõ ðåçóëüòàòà âûðàæåíèÿ âû÷èòàíèÿ îáû÷íî ÿâëÿåòñÿ òåì æå, ÷òî è íàèáî-
ëåå òî÷íûé òèï äàííûõ â ýòîì âûðàæåíèè.
VBA ñëåäóåò òåì æå ïðàâèëàì äëÿ îïðåäåëåíèÿ òèïà äàííûõ ðåçóëüòàòà âû-
ðàæåíèÿ âû÷èòàíèÿ, ÷òî è äëÿ âûðàæåíèé, èñïîëüçóþùèõ çíàê îïåðàöèè ñëî-
æåíèÿ, íî èìåþòñÿ ñëåäóþùèå äîïîëíèòåëüíûå ïðàâèëà:
¨ Åñëè îäèí èç îïåðàíäîâ â âûðàæåíèè âû÷èòàíèÿ ÿâëÿåòñÿ òèïîì Date,
òî ðåçóëüòàò âûðàæåíèÿ èìååò òèï Date.
¨ Åñëè îáà îïåðàíäà â âûðàæåíèè ÿâëÿþòñÿ òèïîì Date, òî ðåçóëüòàò âû-
ðàæåíèÿ èìååò òèï Double.
 ëèñòèíãå 3.11 ïðèâåäåí êîä, äåìîíñòðèðóþùèé ýòè äîïîëíèòåëüíûå ïðà-
âèëà.

Ëèñòèíã 3.11. Äîïîëíèòåëüíûå ïðàâèëà ïðåîáðàçîâàíèÿ òèïîâ


â âûðàæåíèÿõ ñî çíàêîì îïåðàöèè «–»
1: Sub list5_03()
2: 'Ïðèìåðû àðèôìåòè÷åñêèõ âûðàæåíèé ñî çíàêîì "–"
3: Dim D1, D2 As Date
4:
5: D1 = Now 'ïîëó÷èòü çíà÷åíèå òåêóùåé äàòû è âðåìåíè
6: D2 = Now - 5
7:
8: gg = MsgBox(TypeName(D2), vbOKOnly, "Now - 5")
9: gg = MsgBox(TypeName(D1 - D2), vbOKOnly, "D1 - D2")
10:
11: End Sub

Íà ðèñ. 3.6 ïðèâåäåíû äèàëîãîâûå îêíà, êîòîðûå îòîáðàæàþòñÿ íà ýêðàíå


âî âðåìÿ âûïîëíåíèÿ êîäà ëèñòèíãà 3.11.
Ðèñ. 3.6
Äèàëîãîâûå îêíà, îòîáðàæàåìûå
ïðè âûïîëíåíèè êîäà ëèñòèíãà 3.11

Çàìå÷àíèå
Íåñìîòðÿ íà òî, ÷òî ìîæíî êîíêàòåíèðîâàòü (îáúåäèíÿòü) äâå (è áîëåå) ñòðîêè âìåñòå ñ ïîìîùüþ
çíàêà (+), íåëüçÿ èñïîëüçîâàòü çíàê (–), ÷òîáû îòäåëèòü êàêóþ-ëèáî ñòðîêó. Âìåñòî ýòîãî äëÿ
îòäåëåíèÿ ñòðîê ìîæíî èñïîëüçîâàòü VBA-ôóíêöèè Mid, Left èëè Right.

Óìíîæåíèå (*)
Çíàê îïåðàöèè óìíîæåíèÿ (*) èñïîëüçóåòñÿ äëÿ ïîñòðîåíèÿ àðèôìåòè÷å-
ñêèõ âûðàæåíèé ñ óìíîæåíèåì; ðåçóëüòàòîì âûðàæåíèÿ óìíîæåíèÿ ÿâëÿåòñÿ
ïðîèçâåäåíèå äâóõ îïåðàíäîâ. Îáà îïåðàíäà â âûðàæåíèè óìíîæåíèÿ äîëæíû
áûòü ÷èñëåííûìè âûðàæåíèÿìè èëè ñòðîêàìè, êîòîðûå VBA ìîæåò ïðåîáðà-
çîâàòü â ÷èñëà. Ñëåäóþùèå ïðèìåðû èëëþñòðèðóþò ïðàâèëüíûé ñèíòàêñèñ
äëÿ àðèôìåòè÷åñêèõ âûðàæåíèé ñ óìíîæåíèåì:
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 125

4 * 10 'óìíîæåíèå 4 íà 10; ðåçóëüòàò ðàâåí 40


NumVar * 2 'ðåçóëüòàò — ïðîèçâåäåíèå NumVar è 2
NumVar * OtherVar 'ðåçóëüòàò — ïðîèçâåäåíèå NumVar è OtherVar
Òèï äàííûõ ðåçóëüòàòà âûðàæåíèÿ óìíîæåíèÿ îáû÷íî òîò æå, ÷òî è íàèáî-
ëåå òî÷íûé òèï â ýòîì âûðàæåíèè. VBA ñëåäóåò òåì æå ïðàâèëàì äëÿ îïðåäåëå-
íèÿ òèïà äàííûõ ðåçóëüòàòà âûðàæåíèÿ óìíîæåíèÿ, ÷òî è äëÿ âûðàæåíèé, èñ-
ïîëüçóþùèõ ñëîæåíèå. Â âûðàæåíèÿõ óìíîæåíèÿ âñå ïåðåìåííûå Variant,
êîòîðûå ñîäåðæàò çíà÷åíèÿ òèïà Date, ïðåîáðàçóþòñÿ â ÷èñëåííûå çíà÷åíèÿ.

Äåëåíèå (/)
Çíàê îïåðàöèè äåëåíèÿ (/) èíîãäà íàçûâàþò çíàêîì äåëåíèÿ ÷èñåë ñ ïëà-
âàþùåé òî÷êîé èëè äåéñòâèòåëüíûõ ÷èñåë, ÷òîáû îòëè÷àòü îò çíàêà öåëî-
÷èñëåííîãî äåëåíèÿ, êîòîðûé îïèñàí â ñëåäóþùåì ðàçäåëå.  âûðàæåíèÿõ äå-
ëåíèÿ ïåðâûé îïåðàíä äåëèòñÿ íà âòîðîé îïåðàíä; ðåçóëüòàòîì äåëåíèÿ ÿâëÿ-
åòñÿ ÷àñòíîå. Îáà îïåðàíäà â âûðàæåíèè äåëåíèÿ ñ ïëàâàþùåé òî÷êîé äîëæíû
áûòü ÷èñëåííûìè âûðàæåíèÿìè èëè ñòðîêàìè, êîòîðûå VBA ìîæåò ïðåîáðà-
çîâàòü â ÷èñëà. Ñëåäóþùèå âûðàæåíèÿ èëëþñòðèðóþò èñïîëüçîâàíèå çíàêà
îïåðàöèè äåëåíèÿ:
27 / 3 'äåëåíèå 27 íà 3
MyNumVar / 20 'äåëåíèå çíà÷åíèÿ â ïåðåìåííîé MyNumVar íà 20
MyNumVar / MyOtherVar 'äåëèò çíà÷åíèå â ïåðåìåííîé MyNumVar
'íà çíà÷åíèå â ïåðåìåííîé MyOtherVar
Åñëè ëþáîé îïåðàíä â âûðàæåíèè äåëåíèÿ èìååò çíà÷åíèå Null, òî ðåçóëüòà-
òîì âûðàæåíèÿ òàêæå ÿâëÿåòñÿ Null. Òèï äàííûõ âûðàæåíèÿ ñî çíàêîì äåëå-
íèÿ ñ ïëàâàþùåé òî÷êîé — îáû÷íî Double, íî èìååòñÿ ñëåäóþùåå èñêëþ÷åíèå:
¨ Åñëè îáà îïåðàíäà â âûðàæåíèè äåëåíèÿ èìåþò òèï Integer èëè
Single, òî ðåçóëüòàò âûðàæåíèÿ äåëåíèÿ ñ ïëàâàþùåé òî÷êîé èìååò òèï
Single, åñëè òîëüêî ðåçóëüòàò âûðàæåíèÿ íå ïåðåïîëíÿåò äèàïàçîí çíà-
÷åíèé äëÿ òèïà Single. Åñëè ðåçóëüòàò ïåðåïîëíÿåò äèàïàçîí äëÿ òèïà
Single, òî VBA ïðåîáðàçóåò ðåçóëüòàò â òèï Double.

Öåëî÷èñëåííîå äåëåíèå (\)


Öåëî÷èñëåííîå äåëåíèå ïîäîáíî äåëåíèþ ñ ïëàâàþùåé òî÷êîé, êðîìå òîãî,
÷òî âûðàæåíèÿ, èñïîëüçóþùèå îïåðàòîð öåëî÷èñëåííîãî äåëåíèÿ (\), âñåãäà
èìåþò ðåçóëüòàòîì öåëîå ÷èñëî áåç äðîáíîé ÷àñòè. Îáà îïåðàíäà â âûðàæåíèè
öåëî÷èñëåííîãî äåëåíèÿ äîëæíû áûòü ÷èñëåííûìè âûðàæåíèÿìè èëè ñòðîêà-
ìè, êîòîðûå VBA ìîæåò ïðåîáðàçîâàòü â ÷èñëà. Ñëåäóþùèå ïðèìåðû âûðàæå-
íèé èëëþñòðèðóþò ïðàâèëüíûé ñèíòàêñèñ äëÿ öåëî÷èñëåííîãî äåëåíèÿ:
4 \ 3 'äåëåíèå 4 íà 3; âîçâðàùàåò çíà÷åíèå 1
9 \ NumVar 'äåëåíèå 9 íà ñîäåðæèìîå NumVal
MyVar \ NumVar 'äåëåíèå MyVar íà NumVar
 öåëî÷èñëåííîì äåëåíèè VBA îêðóãëÿåò êàæäûé îïåðàíä (åñëè íåîáõîäè-
ìî) äî ÷èñëà òèïà Integer èëè Long ïåðåä âûïîëíåíèåì îïåðàöèè äåëåíèÿ.
VBA îòáðàñûâàåò ëþáîé äðîáíûé îñòàòîê ðåçóëüòàòà âûðàæåíèÿ öåëî÷èñ-
ëåííîãî äåëåíèÿ. Íàïðèìåð, âûðàæåíèå äåëåíèÿ ñ ïëàâàþùåé òî÷êîé 19 / 5
èìååò ðåçóëüòàòîì 3.8, â òî âðåìÿ êàê âûðàæåíèå öåëî÷èñëåííîãî äåëåíèÿ
18 \ 5 èìååò ðåçóëüòàòîì 3. Çàìåòüòå, ÷òî VBA íå îêðóãëÿåò ÷àñòíîå öåëî÷èñ-
ëåííîãî äåëåíèÿ, ðåçóëüòàò ïðîñòî óêîðà÷èâàåòñÿ äî öåëîãî ÷èñëà.
126 Ãëàâà 3

Òèï äàííûõ ðåçóëüòàòà âûðàæåíèÿ öåëî÷èñëåííîãî äåëåíèÿ — ëèáî Integer,


ëèáî Long; VBA èñïîëüçóåò íàèìåíüøèé òèï äàííûõ, êîòîðûé ñîîòâåòñòâóåò ðå-
çóëüòàòó âûðàæåíèÿ. Åñëè êàêîé-ëèáî îïåðàíä â âûðàæåíèè öåëî÷èñëåííîãî äå-
ëåíèÿ ÿâëÿåòñÿ ðàâíûì Null, òî ðåçóëüòàòîì âûðàæåíèÿ òàêæå áóäåò Null.

Äåëåíèå ïî ìîäóëþ (Mod)


Äåëåíèå ïî ìîäóëþ äîïîëíÿåò öåëî÷èñëåííîå äåëåíèå. Ïðè äåëåíèè ïî ìî-
äóëþ âûðàæåíèå âîçâðàùàåò òîëüêî îñòàòîê îïåðàöèè äåëåíèÿ êàê öåëîå. Îáà
îïåðàíäà â âûðàæåíèè äåëåíèÿ ïî ìîäóëþ äîëæíû áûòü ÷èñëåííûìè âûðàæå-
íèÿìè èëè ñòðîêàìè, êîòîðûå ìîæíî ïðåîáðàçîâàòü â ÷èñëî. Ñëåäóþùèå ïðè-
ìåðû âûðàæåíèé èëëþñòðèðóþò äåëåíèå ïî ìîäóëþ:
8 Mod 2 'âîçâðàùàåò çíà÷åíèå 0
5.1 Mod 3 'âîçâðàùàåò çíà÷åíèå 2
6 Mod NumVar 'åñëè NumVar ñîäåðæèò 3, âîçâðàùàåò 0
Ïðè äåëåíèè ïî ìîäóëþ VBA îêðóãëÿåò êàæäûé îïåðàíä (åñëè íåîáõîäèìî)
äî ÷èñëà òèïà Integer èëè Long ïåðåä âûïîëíåíèåì äåëåíèÿ òàê æå, êàê ïðè
öåëî÷èñëåííîì äåëåíèè. Òèï äàííûõ ðåçóëüòàòà âûðàæåíèÿ äåëåíèÿ ïî ìîäó-
ëþ — ýòî Integer èëè Long. VBA èñïîëüçóåò íàèìåíüøèé òèï, êîòîðûé ïîäõî-
äèò äëÿ ðåçóëüòàòà âûðàæåíèÿ. Åñëè êàêîé-ëèáî îïåðàíä â âûðàæåíèè äåëåíèÿ
ïî ìîäóëþ ÿâëÿåòñÿ Null, òî ðåçóëüòàòîì âûðàæåíèÿ òàêæå áóäåò Null.

Âîçâåäåíèå â ñòåïåíü (^)


Çíàê îïåðàöèè âîçâåäåíèÿ â ñòåïåíü (^) èñïîëüçóåòñÿ â àðèôìåòè÷åñêèõ âû-
ðàæåíèÿõ äëÿ âîçâåäåíèÿ â ñòåïåíü ÷èñëà èëè âûðàæåíèÿ. Ïîêàçàòåëü ñòåïå-
íè óêàçûâàåò, ñêîëüêî ðàç ÷èñëî (èëè âûðàæåíèå) äîëæíî áûòü óìíîæåíî íà
ñàìîå ñåáÿ: 33 — ýòî òî æå, ÷òî è 3x3x3. ×òîáû çàïèñàòü 33 êàê àðèôìåòè÷å-
ñêîå âûðàæåíèå VBA, èñïîëüçóéòå ñëåäóþùåå:
3 ^ 3
Îáà îïåðàíäà â âûðàæåíèè âîçâåäåíèÿ â ñòåïåíü äîëæíû áûòü ÷èñëåííûìè
âûðàæåíèÿìè èëè ñòðîêàìè, êîòîðûå VBA ìîæåò ïðåîáðàçîâàòü â ÷èñëà. Îïå-
ðàíä ñëåâà îò çíàêà âîçâåäåíèÿ â ñòåïåíü ìîæåò áûòü îòðèöàòåëüíûì ÷èñëîì,
òîëüêî åñëè îïåðàíä ñïðàâà ÿâëÿåòñÿ öåëûì. Åñëè êàêîé-ëèáî îïåðàíä ÿâëÿåò-
ñÿ ðàâíûì Null, òî ðåçóëüòàòîì âûðàæåíèÿ âîçâåäåíèÿ â ñòåïåíü òàêæå áóäåò
Null; èíà÷å ðåçóëüòàò âûðàæåíèÿ áóäåò èìåòü òèï Double.

Îïåðàöèè ñðàâíåíèÿ
Îïåðàöèè ñðàâíåíèÿ èíîãäà òàêæå íàçûâàþò îïåðàöèÿìè îòíîøåíèÿ (relati-
onal operators). ×àùå âñåãî îïåðàöèè ñðàâíåíèÿ èñïîëüçóþòñÿ äëÿ òîãî, ÷òîáû
çàäàòü êðèòåðèè äëÿ ïðèíÿòèÿ ðåøåíèÿ èëè ñôîðìóëèðîâàòü îïèñàíèå óñëî-
âèé, ïðè êîòîðûõ ãðóïïà êîìàíä äîëæíà áûòü ïîâòîðåíà (îðãàíèçàöèÿ öèêëîâ).
Ðåçóëüòàòîì ëþáîé îïåðàöèè ñðàâíåíèÿ ÿâëÿåòñÿ çíà÷åíèå òèïà Boolean:
True èëè False. Îïåðàöèè ñðàâíåíèÿ èñïîëüçóþòñÿ äëÿ ñðàâíåíèÿ ëèòåðàëü-
íûõ, êîíñòàíòíûõ èëè ïåðåìåííûõ çíà÷åíèé ëþáîãî ñõîäíîãî òèïà.
 òàáëèöå 3.4 ïåðå÷èñëåíû èìåþùèåñÿ â VBA çíàêè îïåðàöèé ñðàâíåíèÿ è
îïèñàíî èõ íàçíà÷åíèå (Å â ýòîé òàáëèöå ïðåäñòàâëÿåò ëþáîå äåéñòâèòåëüíîå
âûðàæåíèå VBA).
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 127

Òàáëèöà 3.4. Çíàêè (îáîçíà÷åíèÿ) îïåðàöèé ñðàâíåíèÿ

Îïåðàöèÿ/ Ñèíòàêñè
Íàèìåíîâàíèå/îïèñàíèå
Îïåðàòîð ñ
= Å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 âûïîëíÿåò ñðàâíåíèå äàò è òàê äàëåå.
Ñëåäóþùèå âûðàæåíèÿ èëëþñòðèðóþò èñïîëüçîâàíèå ðàçëè÷íûõ îïåðàòî-
ðîâ ñðàâíåíèÿ:

MyVal = 55 ðåçóëüòàò True, åñëè MyVal ñîäåðæèò 55


7 <> 5 ðåçóëüòàò True: 7 íå ðàâíî 5
NumVar < 57 True, åñëè NumVar ìåíüøå, ÷åì 57
Now > True, åñëè òåêóùàÿ äàòà (ðåçóëüòàò ôóíêöèè Now) áîëüøå, ÷åì
#5/30/1997 30 ìàÿ 1997
«Joe» < «Sam» True; «Joe» ìåíüøå, ÷åì «Sam» (â ñîîòâåòñòâèè ñ àëôàâèòîì)
«Pat» <
True; «Pat» êîðî÷å, ÷åì «Patricia»
«Patricia»

Ïîìíèòå, ÷òî çíà÷åíèÿ äàò VBA ìîãóò âêëþ÷àòü èíôîðìàöèþ î âðåìåíè.


Êîãäà ñðàâíèâàþòñÿ çíà÷åíèÿ äàò, VBA, ôàêòè÷åñêè, ñðàâíèâàåò èíôîðìàöèþ
î äàòå è âðåìåíè. Ïîýòîìó, äàæå åñëè ìåñÿö, äåíü è ãîä äâóõ äàò ÿâëÿþòñÿ îä-
íèìè è òåìè æå, îíè ìîãóò íå áûòü ðàâíû äðóã äðóãó, åñëè âðåìåííûå ÷àñòè
çíà÷åíèÿ äàòû ðàçëè÷íû. Íàïðèìåð, äàòà #1/10/97# ìåíüøå, ÷åì äàòà
#1/10/97 9:00:00AM#.  ïåðâîé äàòå íåò íèêàêîãî çíà÷åíèÿ âðåìåíè, è VBA
«ïîëàãàåò», ÷òî âðåìÿ ñîñòàâëÿåò 00:00:00. Íåñìîòðÿ íà òî ÷òî ãîä, ìåñÿö è
äåíü âî âòîðîé äàòå òå æå, ÷òî è â ïåðâîé, îíà èìååò áîëåå ïîçäíåå âðåìÿ è, ñëå-
äîâàòåëüíî, ÿâëÿåòñÿ áîëüøåé, ÷åì ïåðâàÿ äàòà.
128 Ãëàâà 3

Åñëè îáà îïåðàíäà â âûðàæåíèè ñðàâíåíèÿ èìåþò îïðåäåëåííûå òèïû


(ëèáî — êîíñòàíòû, ëèáî — òèïèçèðîâàííûå ïåðåìåííûå) è ýòè òèïû íå ÿâëÿ-
þòñÿ ñîâìåñòèìûìè, VBA âûâîäèò íà ýêðàí ñîîáùåíèå îá îøèáêå íåñîâïàäå-
íèÿ òèïîâ.
Åñëè îäèí èëè îáà îïåðàíäà â âûðàæåíèè ñðàâíåíèÿ ÿâëÿþòñÿ ïåðåìåííû-
ìè òèïà Variant, VBA «ïûòàåòñÿ» ïðåîáðàçîâàòü òèï Variant â êàêîé-ëèáî
ñîâìåñòèìûé òèï, åñëè íåîáõîäèìî. Åñëè ïðåîáðàçîâàíèå äàííûõ íåîáõîäèìî,
à VBA íå ìîæåò ïðåîáðàçîâàòü Variant â ñîâìåñòèìûé òèï, îòîáðàæàåòñÿ ñî-
îáùåíèå îá îøèáêå âðåìåíè èñïîëíåíèÿ.
Ïîñêîëüêó íå âñåãäà ëåãêî îïðåäåëèòü, áóäåò ëè VBA âûïîëíÿòü ÷èñëåííîå
ñðàâíåíèå èëè ñòðîêîâîå, êîãäà â âûðàæåíèè ñðàâíåíèÿ ñìåøàíû ÷èñëåííûå
è ñòðîêîâûå çíà÷åíèÿ, ñëåäóåò âñåãäà èñïîëüçîâàòü îäíó èç VBA-ôóíêöèé
ïðåîáðàçîâàíèÿ òèïîâ (íàïðèìåð, CStr) äëÿ ÿâíîãî ïðåîáðàçîâàíèÿ çíà÷åíèé
â ÷èñëà èëè ñòðîêè, ÷òîáû îáà îïåðàíäà â âûðàæåíèè ñðàâíåíèÿ èìåëè îäèí è
òîò æå òèï äàííûõ.

Ñðàâíåíèå ñòðîê
Ñðàâíåíèå ñòðîê íåìíîãî ñëîæíåå, ÷åì ñðàâíåíèå ÷èñåë.  VBA ñòðîêà ðàâ-
íà äðóãîé ñòðîêå, òîëüêî êîãäà îáå ñòðîêè ñîäåðæàò òî÷íî òàêèå æå ñèìâîëû â
òî÷íî òàêîì æå ïîðÿäêå è îáå ñòðîêè èìåþò îäíó è òó æå äëèíó.
Ðàññìîòðèì ñëåäóþùèå âûðàæåíèÿ:

«abc» = «abc» True; îáå ñòðîêè îäèíàêîâûå


«abc» = « abc » False; ñòðîêè íå îäèíàêîâûå

 ïåðâîì âûðàæåíèè ñòðîêè ðàâíû îäíà äðóãîé: îáå ñîäåðæàò òå æå ñèìâî-


ëû è â òîì æå ïîðÿäêå è èìåþò îäíó è òó æå äëèíó. Âî âòîðîì âûðàæåíèè
ñòðîêè íå ðàâíû îäíà äðóãîé, ñòðîêà â ïðàâîé ÷àñòè îïåðàòîðà èìååò ïî îäíî-
ìó ñèìâîëó ïðîáåëà â íà÷àëå è â êîíöå ñòðîêè. VBA íå èãíîðèðóåò íà÷àëüíûå
èëè êîíå÷íûå ñèìâîëû ïðîáåëà ïðè ñðàâíåíèè ñòðîê. Ïðè ñðàâíåíèè ñòðîê
îïåðàòîðàìè îòíîøåíèÿ, VBA ñðàâíèâàåò êàæäóþ ñòðîêó ñëåâà íàïðàâî ïî-
ñèìâîëüíî.
Ñëåäóþùèå íåñêîëüêî ïðèìåðîâ âûðàæåíèé èëëþñòðèðóþò ñðàâíåíèå
ñòðîê:

«abb» < «abc» True


«aab» < «abb» True
«abc» < «abc » True
«abcd» > «abc» True

Áóäüòå âíèìàòåëüíû ïðè ñðàâíåíèè ñòðîê ôèêñèðîâàííîé è ïåðåìåííîé


äëèíû. Ïîìíèòå, ÷òî ñòðîêè ôèêñèðîâàííîé äëèíû âñåãäà ñîäåðæàò îäíî è òî
æå êîëè÷åñòâî ñèìâîëîâ è ÷òî ðàçìåð ñòðîêè ïåðåìåííîé äëèíû óâåëè÷èâàåò-
ñÿ è óìåíüøàåòñÿ â çàâèñèìîñòè îò ðàçìåðà ñòðîêè, ñîõðàíÿåìîé â íåé.
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 129

Äâîè÷íîå è òåêñòîâîå ñðàâíåíèå ñòðîê


Äî ñèõ ïîð â ýòîé ãëàâå âûðàæåíèÿ ñðàâíåíèÿ ñòðîê âêëþ÷àëè òîëüêî ñòðî-
êè, ñîñòîÿùèå èç ñèìâîëîâ íèæíåãî ðåãèñòðà. VBA ïðåäîñòàâëÿåò äâà ðàçëè÷-
íûõ ñïîñîáà ñðàâíåíèÿ ñèìâîëîâ ðàçëè÷íûõ ðåãèñòðîâ. Ïåðâûé ìåòîä, êîòî-
ðûé VBA èñïîëüçóåò äëÿ ñðàâíåíèÿ ñòðîê, íàçûâàåòñÿ áèíàðíûì (binary) èëè
äâîè÷íûì ñðàâíåíèåì è ÿâëÿåòñÿ ìåòîäîì ñðàâíåíèÿ ïî óìîë÷àíèþ.
×òîáû ïîíÿòü, êàê ðàáîòàåò äâîè÷íîå ñðàâíåíèå, íåîáõîäèìî ïîìíèòü, ÷òî
âñÿ èíôîðìàöèÿ â êîìïüþòåðå ñîõðàíÿåòñÿ â âèäå ÷èñåë. Äëÿ ñîõðàíåíèÿ òåê-
ñòà êîìïüþòåð èñïîëüçóåò ñõåìó, â êîòîðîé êàæäûé îòîáðàæàåìûé ñèìâîë
èìååò óíèêàëüíûé íîìåð. Äëÿ ïðåäñòàâëåíèÿ â êîìïüþòåðå âñå áóêâû íåêîòî-
ðîãî àëôàâèòà èìåþò óíèêàëüíûå ïîñëåäîâàòåëüíûå íîìåðà. Îáû÷íî áóêâû
âåðõíåãî ðåãèñòðà (íàïðèìåð, A–Z) èìåþò ìåíüøèå íîìåðà, ÷åì áóêâû íèæíå-
ãî ðåãèñòðà (à–z). ×èñëî, ñîîòâåòñòâóþùåå îïðåäåëåííîé áóêâå èëè äðóãîìó
ñèìâîëó, íàçûâàåòñÿ êîäîì ñèìâîëà (character code).
Ïðè âûïîëíåíèè äâîè÷íîãî ñðàâíåíèÿ ñòðîêîâîé èíôîðìàöèè, VBA èñ-
ïîëüçóåò ôàêòè÷åñêèé áèíàðíûé ýêâèâàëåíò ÷èñëà äëÿ êàæäîãî ñèìâîëà, òàê
êàê ïðè ýòîì ñðàâíèâàåòñÿ êàæäàÿ ïàðà ñèìâîëîâ. Ïîñêîëüêó áóêâû âåðõíåãî
ðåãèñòðà èìåþò ìåíüøèå äâîè÷íûå íîìåðà, áóêâû âåðõíåãî ðåãèñòðà ðàñïîëà-
ãàþòñÿ â àëôàâèòíîì ïîðÿäêå ïåðåä áóêâàìè íèæíåãî ðåãèñòðà. Äðóãèìè ñëî-
âàìè, äëÿ VBA ïðè äâîè÷íîì ñðàâíåíèè ñòðîê, ñòðîêà «AAA» ìåíüøå, ÷åì
ñòðîêà «aaa».
Âòîðîé òèï ñðàâíåíèÿ, ïðåäëàãàåìûé VBA, íàçûâàåòñÿ òåêñòîâûì (text)
ñðàâíåíèåì.  òåêñòîâîì ñðàâíåíèè VBA íå èñïîëüçóåò äâîè÷íûé ýêâèâàëåíò
äëÿ êàæäîãî ñèìâîëà è «ðàññìàòðèâàåò» áóêâû âåðõíåãî ðåãèñòðà êàê ýêâèâà-
ëåíòíûå áóêâàì íèæíåãî ðåãèñòðà. Â òåêñòîâîì ñðàâíåíèè ñòðîêà «ABC» ðàâ-
íà ñòðîêå «abc».

Âûáîð ìåòîäà ñðàâíåíèÿ ñòðîê


Äëÿ âûáîðà ìåòîäà ñðàâíåíèÿ ñòðîê, èìåþùåãîñÿ â VBA (äâîè÷íîãî èëè
òåêñòîâîãî), èñïîëüçóéòå äèðåêòèâó Option Compare:
Option Compare [Text|Binary]
×òîáû çàäàòü äâîè÷íîå ñðàâíåíèå ñòðîê, èñïîëüçóéòå êëþ÷åâîå ñëîâî
Binary:
Option Compare Binary
Äèðåêòèâó Option Compare ìîæíî èñïîëüçîâàòü òîëüêî íà ìîäóëüíîì
óðîâíå, è îíà âëèÿåò òîëüêî íà ñðàâíåíèÿ, âûïîëíÿåìûå ïðîöåäóðàìè â ýòîì
îòäåëüíîì ìîäóëå. Îáû÷íî äèðåêòèâó Option Compare ïîìåùàþò â îáëàñòü
îáúÿâëåíèé ìîäóëÿ ïåðåä îáúÿâëåíèÿìè ïåðåìåííûõ èëè ïðîöåäóð. Åñëè êî-
ìàíäû Option Compare â êîäå íåò, VBA èñïîëüçóåò äâîè÷íûå ñðàâíåíèÿ.

Ñðàâíåíèå ñòðîêè ñ øàáëîíîì


Îïåðàòîð Like äàåò âîçìîæíîñòü âûïîëíÿòü îñîáûé òèï îïåðàöèè ñðàâíå-
íèÿ ñòðîê è åãî ìîæíî èñïîëüçîâàòü òîëüêî ñî ñòðîêàìè.
Like òåñòèðóåò ñòðîêó äëÿ îïðåäåëåíèÿ òîãî, ñîâïàäàåò ëè îíà ñ çàäàííûì
øàáëîíîì (îáðàçöîì). Îïåðàòîð Like ìîæíî èñïîëüçîâàòü äëÿ âûïîëíåíèÿ ïî-
èñêà â òåêñòîâîé èíôîðìàöèè äëÿ íàõîæäåíèÿ âñåõ ñëîâ èëè ôðàç, ñîâïàäàþ-
130 Ãëàâà 3

ùèõ ñ îïðåäåëåííûì øàáëîíîì. Ïîèñê òàêîãî òèïà ÷àñòî íàçûâàþò íå÷åòêèì


ïîèñêîì (fuzzy search).
Îáùèé ñèíòàêñèñ äëÿ îïåðàòîðà Like ñëåäóþùèé:
Ñèíòàêñèñ
StrExpr1 Like StrExpr2
StrExpr1 — ëþáîå ñòðîêîâîå âûðàæåíèå VBA. StrExpr2 — ñòðîêîâîå âûðàæåíèå,
ñïåöèàëüíî ñîçäàííîå äëÿ çàäàíèÿ øàáëîíà, êîòîðûé îïåðàòîð Like ñðàâíèâàåò ñ
StrExpr1.
Ðåçóëüòàòîì âûðàæåíèÿ Like ÿâëÿåòñÿ True, åñëè ïåðâûé îïåðàíä (StrExpr1)
ñîâïàäàåò ñ øàáëîíîì âî âòîðîì îïåðàíäå (StrExpr2); èíà÷å ðåçóëüòàòîì âûðàæåíèÿ
áóäåò False. Îáà îïåðàíäà â ýòîì âûðàæåíèè äîëæíû áûòü ñòðîêîâûìè
âûðàæåíèÿìè, èëè VBA îòîáðàçèò ñîîáùåíèå îá îøèáêå íåñîâïàäåíèÿ òèïîâ.

Øàáëîí, ñ êîòîðûì äîëæíà ñðàâíèâàòüñÿ ñòðîêà, çàäàåòñÿ ñ èñïîëüçîâàíè-


åì ðàçëè÷íûõ ñïåöèàëüíûõ ñèìâîëîâ.  òàáëèöå 3.5 ñîäåðæàòñÿ ìåòîäû è
ñèìâîëû äëÿ ñîçäàíèÿ îáðàçöîâ ñîâïàäåíèÿ äëÿ îïåðàòîðà Like.
Òàáëèöà 3.5. Ñèìâîëû ñîâïàäåíèÿ ñ îáðàçöîì äëÿ îïåðàòîðà Like

Ñèìâîë
Ñîîòâåòñòâèå
îáðàçöà
# Ëþáàÿ îäèíî÷íàÿ öèôðà îò 0 äî 9.
Ëþáîå êîëè÷åñòâî ñèìâîëîâ â ëþáîé êîìáèíàöèè èëè îòñóòñòâèå
*
ñèìâîëîâ.
? Ëþáîé îäèíî÷íûé ñèìâîë.
list — ýòî ñïèñîê îïðåäåëåííûõ ñèìâîëîâ. Ñîâïàäåíèå ñ ëþáûì
[list]
îäèíî÷íûì ñèìâîëîì â ñïèñêå.
list — ýòî ñïèñîê îïðåäåëåííûõ ñèìâîëîâ. Ñîâïàäåíèå ñ ëþáûì
[!list]
îäèíî÷íûì ñèìâîëîì, íå èìåþùèìñÿ â ñïèñêå.

Ñëåäóþùåå âûðàæåíèå ÿâëÿåòñÿ ðàâíûì True, åñëè AnyStr ñîäåðæèò ñòðî-


êè òàêèå, êàê «Sadie», «Salone», «Sophie», «Steve» è òàê äàëåå:
AnyStr Like "S*e"
Ñëåäóþùåå âûðàæåíèå ÿâëÿåòñÿ ðàâíûì True, åñëè AnyStr ñîäåðæèò ñòðî-
êè òàêèå, êàê «Penny», «Percy», «Patty» è òàê äàëåå:
AnyStr Like "P???y"
Èñïîëüçóéòå äâå ïîñëåäíèå ñïåöèôèêàöèè ñèìâîëîâ ñîâïàäåíèÿ èç òàáë. 5.3
äëÿ óêàçàíèÿ îòäåëüíûõ ñèìâîëîâ, ñîâïàäåíèå èëè íåñîâïàäåíèå ñ êîòîðûìè
âàì íåîáõîäèìî. Ñëåäóþùèå âûðàæåíèÿ ïîêàçûâàþò, êàê èñïîëüçîâàòü êâàä-
ðàòíûå ñêîáêè ñ ñèìâîëüíûì ñïèñêîì.
Äàííîå âûðàæåíèå ÿâëÿåòñÿ ðàâíûì True, åñëè AnyStr ñîäåðæèò «big» èëè
«bid», èëè — False, åñëè îíî ñîäåðæèò «bit» èëè «bin»:
AnyStr Like "bi[dg]"
Ñëåäóþùåå âûðàæåíèå ÿâëÿåòñÿ ðàâíûì True, åñëè AnyStr ñîäåðæèò
«big», «bid» èëè «bin», èëè — False, åñëè îíî ñîäåðæèò «bit»:
AnyStr Like "bi[!t]"
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 131

Åùå îäíî âûðàæåíèå ÿâëÿåòñÿ ðàâíûì 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

äèàïàçîíû, çàäàâàåìûå ïîëüçîâàòåëåì. Åñëè, íàïðèìåð, áûë çàäàí äèàïàçîí


[e–i], à îïöèÿ ñðàâíåíèÿ óñòàíîâëåíà íà äâîè÷íîå ñðàâíåíèå, òî òîëüêî
ñèìâîëû e, f, g, h è i ñîâïàäàþò ñ óêàçàííûì äèàïàçîíîì. Åñëè îïöèÿ
ñðàâíåíèÿ óñòàíîâëåíà íà òåêñòîâîå ñðàâíåíèå, òî äèàïàçîí [e–i] âêëþ÷àåò
åùå íåñêîëüêî ñèìâîëîâ — (Å, å, È, è, É, é, Ê, ê, ¨, ¸, F, f, G, g, H, h, I) è I.
Çàìå÷àíèå
Åñëè íåîáõîäèìî òîëüêî óçíàòü, ÿâëÿåòñÿ ëè ñòðîêà ÷àñòüþ äðóãîé ñòðîêè, èñïîëüçóéòå
VBA-ôóíêöèþ Instr âìåñòî îïåðàòîðà ñðàâíåíèÿ Like. Íàïðèìåð, åñëè íåîáõîäèìî òîëüêî
îïðåäåëèòü, ÿâëÿåòñÿ ëè ñòðîêà «big» ÷àñòüþ ñòðîêè «bigger», èñïîëüçóéòå ôóíêöèþ Instr

Çàìå÷àíèå
Îïåðàòîð ñðàâíåíèÿ 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

Òàáëèöà 3.6. Ëîãè÷åñêèå îïåðàòîðû

Ñèíòàêñè
Îïåðàòîð Èìÿ/Îïèñàíèå
ñ
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.

Ëîãè÷åñêèå VBA-îïåðàòîðû And, Not è Or ïîäîáíû ôóíêöèÿì ðàáî÷åãî ëèñ-


òà AND, NOT è OR, âñòðîåííûì â Excel. Îäíàêî Excel íå èìååò ýêâèâàëåíòíûõ
ôóíêöèé äëÿ VBA-îïåðàòîðîâ Eqv, Imp èëè Xor.

Òàáëèöû èñòèííîñòè
Òàáëèöà èñòèííîñòè (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

Ñëåäóþùàÿ òàáëèöà èñòèííîñòè ïîêàçûâàåò ðåçóëüòàòû îïåðàöèè And.

Operand1 Operand2 Ðåçóëüòàò âûðàæåíèÿ


True True True
True False False
False True False
False False False

Îïåðàòîð And ìîæíî èñïîëüçîâàòü íå òîëüêî äëÿ äâóõ îïåðàíäîâ. Ðåçóëüòà-


òîì ýòîãî îïåðàòîðà ñ íåñêîëüêèìè îïåðàíäàìè áóäåò çíà÷åíèå True, åñëè âñå
îïåðàíäû â âûðàæåíèè ðàâíû True. Íàïðèìåð:
(2 > 5) And (7 > 3) And (3 > 1)
Ýòî âûðàæåíèå èìååò ðåçóëüòàòîì False. Îáðàòèòå âíèìàíèå, ÷òî îïåðàí-
äû â ýòîì âûðàæåíèè ÿâëÿþòñÿ âûðàæåíèÿìè ñðàâíåíèÿ; çàìåòüòå òàêæå
êðóãëûå ñêîáêè âîêðóã âûðàæåíèé, êîòîðûå ñîñòàâëÿþò îïåðàíäû îïåðàòîðà
And. Êðóãëûå ñêîáêè óêàçûâàþò VBA íà íåîáõîäèìîñòü âû÷èñëèòü âûðàæåíèå
âíóòðè ñêîáîê ïåðåä âû÷èñëåíèåì äðóãèõ ÷àñòåé ýòîãî âûðàæåíèÿ. Êðîìå
òîãî, êðóãëûå ñêîáêè äåëàþò âûðàæåíèå áîëåå ÷èòàáåëüíûì, ãðóïïèðóÿ âìå-
ñòå ñâÿçàííûå ÷àñòè âûðàæåíèÿ. Ñêîáêè, èñïîëüçóåìûå äëÿ ãðóïïèðîâêè ÷àñ-
òåé âûðàæåíèÿ â ïîäâûðàæåíèå, ÿâëÿþòñÿ îáùåé îñîáåííîñòüþ âûðàæåíèé
âñåõ òèïîâ: ÷èñëåííûõ, ñòðîêîâûõ, äàò è ñðàâíåíèÿ, òàê æå êàê è ëîãè÷åñêèõ
âûðàæåíèé.

Or
Îïåðàòîð Or âûïîëíÿåò ëîãè÷åñêóþ äèçúþíêöèþ è åãî ÷àñòî íàçûâàþò
âêëþ÷àþùèì «ÈËÈ» (inclusive or). Ðåçóëüòàòîì îïåðàöèè Or ÿâëÿåòñÿ çíà÷å-
íèå True, êîãäà õîòÿ áû îäèí èç îïåðàíäîâ ðàâåí çíà÷åíèþ True; èíà÷å (åñëè
âñå îïåðàíäû — False) ðåçóëüòàòîì ÿâëÿåòñÿ çíà÷åíèå False.
Îïåðàòîð Or èìååò ñëåäóþùèé îáùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Operand1 Or Operand2
Operand1 è Operand2 ÿâëÿþòñÿ ëþáûìè äîïóñòèìûìè ëîãè÷åñêèìè âûðàæåíèÿìè
VBA.
Ñëåäóþùàÿ òàáëèöà èñòèííîñòè ïîêàçûâàåò ðåçóëüòàòû îïåðàöèè Or.

Operand1 Operand2 Ðåçóëüòàò âûðàæåíèÿ


True True True
True False True
False True True
False False False

Îïåðàòîð Or ìîæíî èñïîëüçîâàòü íå òîëüêî äëÿ äâóõ îïåðàíäîâ.


Ðåçóëüòàòîì îïåðàòîðà ñ íåñêîëüêèìè îïåðàíäàìè áóäåò çíà÷åíèå True, åñëè
õîòÿ áû îäèí îïåðàíä â âûðàæåíèè ðàâåí True. Íàïðèìåð:
(2 > 5) Or (7 > 3) Or (3 > 1)
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 135

Ýòî âûðàæåíèå èìååò ðåçóëüòàòîì True. Ñðàâíèòå ñ ïðåäûäóùèì ïðèìåðîì.


Îïåðàòîðû And è Or ìîæíî êîìáèíèðîâàòü â îäíîì âûðàæåíèè. Íàïðèìåð,
çíà÷åíèå ñëåäóþùåãî âûðàæåíèÿ ðàâíî True:
( (2 > 5) Or (7 > 3) ) And ( (3 > 1) Or (8 < 10) )

Not
Îïåðàòîð Not âûïîëíÿåò ëîãè÷åñêîå îòðèöàíèå; îí èíâåðòèðóåò ëþáîå çíà-
÷åíèå, ê êîòîðîìó ïðèìåíÿåòñÿ. Îïåðàòîð Not èñïîëüçóåò òîëüêî îäèí îïå-
ðàíä è èìååò ðåçóëüòàòîì çíà÷åíèå True, åñëè îïåðàíä ÿâëÿåòñÿ ðàâíûì
False, èëè — False, åñëè îïåðàíä — True.
Îïåðàòîð Not èìååò ñëåäóþùèé îáùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Not Operand
Operand — ýòî ëþáîå äîïóñòèìîå ëîãè÷åñêîå âûðàæåíèå VBA.

Ñëåäóþùàÿ òàáëèöà èñòèííîñòè ïîêàçûâàåò ðåçóëüòàòû îïåðàöèè Not:

Operand Ðåçóëüòàò âûðàæåíèÿ


True False
False True

Ïîäóìàéòå íàä ðåçóëüòàòîì ñëåäóþùåãî âûðàæåíèÿ è èñïîëüçóéòå ñðåäó


VBA äëÿ ïðîâåðêè ñâîèõ ðàññóæäåíèé.
( (2 > 5) Or (7 > 3) ) And Not ( (3 > 1) Or (8 < 10) )
Êîä äëÿ òåñòèðîâàíèÿ ýòîãî âûðàæåíèÿ ñîâñåì ïðîñòîé (ñì. ëèñòèíã 3.12)
è ïðèâåäåí òîëüêî ñ öåëüþ íàïîìíèòü î òîì, ÷òî ìû èçó÷àåì ïðîãðàììèðîâà-
íèå íà VBA. Âñå, ÷òî ìû îáñóæäàåì, ñëåäóåò ïðîâåðÿòü, äàæå åñëè âàì êàæåò-
ñÿ ýòî î÷åíü ïîíÿòíûì.

Ëèñòèíã 3.12. Î÷åíü ïðîñòîé òåñò ëîãè÷åñêîãî âûðàæåíèÿ


1: Sub list5_04()
2:
3: dd = ((2 > 5) Or (7 > 3)) And Not ((3 > 1) Or (8 < 10))
4: gg = MsgBox(dd, vbOKOnly)
5:
6: End Sub

Xor
Îïåðàòîð Xor âûïîëíÿåò ëîãè÷åñêîå èñêëþ÷åíèå. ×àùå åãî íàçûâàþò èñ-
êëþ÷àþùèì «ÈËÈ» (exclusive or). Ðåçóëüòàòîì îïåðàöèè Xor ÿâëÿåòñÿ True,
êîãäà êàêîé-ëèáî îïåðàíä (íî íå îáà), ÿâëÿåòñÿ ðàâíûì True; èíà÷å ðåçóëüòà-
òîì áóäåò çíà÷åíèå False.
Îïåðàòîð Xor èìååò ñëåäóþùèé îáùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Operand1 Xor Operand2
136 Ãëàâà 3

Operand1 è Operand2 — ýòî ëþáûå äîïóñòèìûå ëîãè÷åñêèå âûðàæåíèÿ VBA.

Ñëåäóþùàÿ òàáëèöà èñòèííîñòè ïîêàçûâàåò ðåçóëüòàòû îïåðàöèè Xor:

Operand1 Operand2 Ðåçóëüòàò âûðàæåíèÿ


True True False
True False True
False True True
False False False

Ëèñòèíã 3.13 ñîäåðæèò êîä, ïîëó÷åííûé èç êîäà ëèñòèíãà 3.12 çàìåíîé


îïåðàòîðà Or íà Xor. Ïðîâåðüòå, ñîâïàäàåò ëè îæèäàåìûé âàìè ðåçóëüòàò
ñ òåì, êîòîðûé âûäàåò VBA.

Ëèñòèíã 3.13. Îòëè÷èå îïåðàòîðà Or îò Xor


1: Sub list5_04()
2:
3: dd = ((2 > 5) Xor (7 > 3)) And Not ((3 > 1) Xor (8 < 10))
4: gg = MsgBox(dd, vbOKOnly)
5:
6: End Sub

Eqv
Îïåðàòîð Eqv ÿâëÿåòñÿ îïåðàöèåé ëîãè÷åñêîé ýêâèâàëåíòíîñòè; èñïîëüçî-
âàíèå îïåðàòîðà Eqv ïîäîáíî òåñòèðîâàíèþ íà ðàâåíñòâî. Ðåçóëüòàòîì îïåðà-
öèè Eqv ÿâëÿåòñÿ çíà÷åíèå True, êîãäà îáà îïåðàíäà áóäóò ðàâíûìè True;
èíà÷å — False.
Îïåðàòîð Eqv èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Operand1 Eqv Operand2
Operand1 è Operand2 — ýòî ëþáûå äîïóñòèìûå ëîãè÷åñêèå âûðàæåíèÿ VBA.

Ñëåäóþùàÿ òàáëèöà èñòèííîñòè ïîêàçûâàåò ðåçóëüòàòû îïåðàöèè Eqv:

Operand1 Operand2 Ðåçóëüòàò âûðàæåíèÿ


True True True
True False False
False True False
False False True

Åñëè ëþáîé îïåðàíä â âûðàæåíèè îïåðàöèè Eqv ÿâëÿåòñÿ ðàâíûì Null, òî


ðåçóëüòàòîì òàêæå áóäåò çíà÷åíèå Null.
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 137

Imp
Îïåðàòîð Imp âûïîëíÿåò ëîãè÷åñêóþ îïåðàöèþ èìïëèêàöèè. Îïåðàòîð Imp
òåñòèðóåò âçàèìîñâÿçü ìåæäó äâóìÿ ëîãè÷åñêèìè çíà÷åíèÿìè, êîãäà ñïðàâåä-
ëèâîñòü îäíîãî çíà÷åíèÿ ïîäðàçóìåâàåò ñïðàâåäëèâîñòü äðóãîãî çíà÷åíèÿ; â
êà÷åñòâå ðåçóëüòàòà îïåðàöèÿ Imp èìååò çíà÷åíèå True, òîëüêî êîãäà âòîðîé
îïåðàíä íå ïðîòèâîðå÷èò ïåðâîìó. Îïåðàòîð Imp èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Operand1 Imp Operand2
Operand1 è Operand2 — ýòî ëþáûå äîïóñòèìûå ëîãè÷åñêèå âûðàæåíèÿ VBA.

Ñëåäóþùàÿ òàáëèöà èñòèííîñòè ïîêàçûâàåò ðåçóëüòàòû îïåðàöèè Imp.

Operand1 Operand2 Ðåçóëüòàò âûðàæåíèÿ


True True True
True False False
False True True
False False True

Ðåçóëüòàò ëîãè÷åñêîé èìïëèêàöèè ìîæåò áûòü ðàâíûì True, äàæå êîãäà


ïåðâîå óñëîâèå ÿâëÿåòñÿ çíà÷åíèåì False, â òî âðåìÿ êàê âòîðîå óñëîâèå ÿâ-
ëÿåòñÿ çíà÷åíèåì True. Îäíàêî ðåçóëüòàò ëîãè÷åñêîé èìïëèêàöèè íå ìîæåò
áûòü çíà÷åíèåì True, åñëè ïåðâîå óñëîâèå ÿâëÿåòñÿ ðàâíûì True, à âòîðîå —
False. Ðåçóëüòàòû ëîãè÷åñêîé èìïëèêàöèè íå ÿâëÿþòñÿ òàêèìè æå èíòóè-
òèâíûìè è ïîíÿòíûìè, êàê ðåçóëüòàòû äðóãèõ ëîãè÷åñêèõ îïåðàòîðîâ; ê ñ÷à-
ñòüþ, èñïîëüçîâàíèå îïåðàòîðà ëîãè÷åñêîé èìïëèêàöèè ðåäêî áûâàåò íåîáõî-
äèìî.

Êîíêàòåíàöèÿ ñòðîê
VBA äàåò âîçìîæíîñòü îáúåäèíÿòü (ñêëåèâàòü) ñòðîêè âìåñòå äëÿ îáðàçîâà-
íèÿ áîëåå äëèííûõ ñòðîê. Ïðèñîåäèíåíèå îäíîé ñòðîêè ê äðóãîé íàçûâàåòñÿ
êîíêàòåíàöèåé (concatenation) ñòðîê. Êîíêàòåíàöèÿ ñòðîê ÷ðåçâû÷àéíî ïî-
ëåçíà è äîâîëüíî ïðîñòà, õîòÿ èìåþòñÿ íåêîòîðûå òðóäíîñòè, î êîòîðûõ íåîá-
õîäèìî çíàòü.

Èñïîëüçîâàíèå êîíêàòåíàöèè ñòðîê


Êîíêàòåíàöèþ ñòðîê ÷àùå âñåãî èñïîëüçóþò äëÿ ôîðìèðîâàíèÿ ñòðîê èç
ðàçëè÷íûõ èñòî÷íèêîâ â ïðîöåäóðå, ÷òîáû ñîçäàâàòü ïîëüçîâàòåëüñêèå ñîîá-
ùåíèÿ è âûâîäèòü íà èõ ýêðàí. Â ëèñòèíãå 3.14 ïðèâåäåíà ïðîöåäóðà VBA
Excel, êîòîðàÿ çàïðàøèâàåò ó ïîëüçîâàòåëÿ èìÿ ôàéëà ðàáî÷åé êíèãè, îòêðû-
âàåò ýòó ðàáî÷óþ êíèãó è çàòåì âûáèðàåò îïðåäåëåííûé ðàáî÷èé ëèñò (â äàí-
íîì ñëó÷àå — ðàáî÷èé ëèñò ñ èìåíåì Îò÷åò î ïðîäàæàõ).

Ëèñòèíã 3.14. Êîíêàòåíàöèÿ ñòðîê


1: Sub Open2DataEntry()
2: 'Äåìîíñòðàöèÿ êîíêàòåíàöèè ñòðîê
138 Ãëàâà 3

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

Çàìåòüòå, ÷òî îïåðàòîð êîíêàòåíàöèè èñïîëüçóåòñÿ òîëüêî â ñòðîêàõ 17–18.


Âñÿ îñòàëüíàÿ ÷àñòü ïðîãðàììû ïðåäíàçíà÷åíà äëÿ îïèñàíèÿ ñòðîêîâûõ êîí-
ñòàíò è ïîäãîòîâêè ñòðîêîâûõ ïåðåìåííûõ, èñïîëüçóåìûõ â îïåðàòîðå MsgBox,
â êîòîðîì ïîëó÷àåòñÿ ñòðîêà èç íåñêîëüêèõ êîíñòàíò è ïåðåìåííûõ.
Åñëè âû âûïîëíÿåòå ýòó ïðîöåäóðó è ââîäèòå èìÿ ôàéëà ïðè çàïðîñå íà
ââîä, îïåðàòîð MsgBox â ñòðîêàõ 17–18 îòîáðàæàåò äèàëîãîâîå îêíî,
ïîêàçàííîå íà ðèñ. 3.7. (Ýòîò ïðèìåð ïðåäïîëàãàåò, ÷òî âû äåéñòâèòåëüíî
èìååòå ðàáî÷óþ êíèãó ñ èìåíåì H:\07.11.07.xlsm è â ýòîé êíèãå åñòü ëèñò ñ
èìåíåì Îò÷åò î ïðîäàæàõ; â ïðîòèâíîì ñëó÷àå VBA îòîáðàæàåò îøèáêó
âðåìåíè èñïîëíåíèÿ. Åñëè âû áóäåòå ýêñïåðèìåíòèðîâàòü ñ ýòèì ëèñòèíãîì,
óáåäèòåñü, ÷òî âû ââîäèòå ïðàâèëüíîå èìÿ ðàáî÷åé êíèãè.)
Ðèñ. 3.7
Îïåðàòîð InputBox (ñòðîêà 10) îòîáðàæàåò
îêíî äëÿ ââîäà íàèìåíîâàíèÿ ðàáî÷åé êíèãè;
îïåðàòîð MsgBox (ñòðîêè 17–18) îòîáðàæàåò
îêíî ñ ñîîáùåíèåì î ðåçóëüòàòå

Îïåðàòîðû êîíêàòåíàöèè ñòðîê


VBA èìååò äâà çíàêà îïåðàöèè äëÿ êîíêàòåíàöèè ñòðîê; â ñëåäóþùèõ ïàðà-
ãðàôàõ îïèñûâàåòñÿ êàæäûé èç ýòèõ çíàêîâ è èõ èñïîëüçîâàíèå.
Çíàê & ìîæíî èñïîëüçîâàòü òîëüêî äëÿ êîíêàòåíàöèè ñòðîê; ýòîò çíàê íå
èìååò äðóãîãî íàçíà÷åíèÿ èëè ôóíêöèè â VBA. Âñå ïðèìåðû â ýòîé êíèãå èñ-
ïîëüçóþò çíàê & äëÿ êîíêàòåíàöèè ñòðîê — ýòî ïðåäïî÷òèòåëüíûé çíàê êîí-
êàòåíàöèè ñòðîê, ïîòîìó ÷òî îí íå îñòàâëÿåò íèêàêèõ ñîìíåíèé îòíîñèòåëüíî
òîãî, êàêóþ îïåðàöèþ âû íàìåðåâàåòåñü âûïîëíèòü. Îáùèé ñèíòàêñèñ çíàêà &
òàêîé:
Ñèíòàêñèñ
Òèïû äàííûõ, ïåðåìåííûå, êîíñòàíòû è âûðàæåíèÿ 139

Operand1 & Operand2 [& Operand3...]


Operand1 è Operand2 — ëþáûå äîïóñòèìûå ñòðîêîâûå èëè ÷èñëåííûå âûðàæåíèÿ.
Åñëè îäèí èëè îáà îïåðàíäà ÿâëÿþòñÿ ÷èñëåííûìè âûðàæåíèÿìè, VBA
ïðåîáðàçóåò ÷èñëà â ñòðîêè ïåðåä âûïîëíåíèåì îïåðàöèè êîíêàòåíàöèè. Òèï
äàííûõ ðåçóëüòàòà êîíêàòåíàöèè ñòðîê — ýòî âñåãäà òèï String. Åñëè îïåðàíä â
âûðàæåíèè êîíêàòåíàöèè ñòðîê ÿâëÿåòñÿ ðàâíûì Null èëè Empty, VBA
èíòåðïðåòèðóåò ýòîò îïåðàíä êàê ñòðîêó íóëåâîé äëèíû (òî åñòü, ñòðîêó, êîòîðàÿ
íå ñîäåðæèò íèêàêèõ ñèìâîëîâ).

Åñëè âû íå îòäåëÿåòå çíàê & îò èìåíè ïåðåìåííîé (ïåðåä íèì), ïî êðàéíåé


ìåðå, îäíèì ïðîáåëîì, VBA «ïîëàãàåò», ÷òî âû õîòèòå èñïîëüçîâàòü ñèìâîë &
êàê ñèìâîë îïðåäåëåíèÿ òèïà Long âìåñòî çíàêà îïåðàöèè êîíêàòåíàöèè. Ýòà
ñèòóàöèÿ èìååò ðàçëè÷íûå ðåçóëüòàòû: â íåêîòîðûõ ñëó÷àÿõ VBA ïðåîáðàçóåò
ïåðåìåííóþ èëè ðåçóëüòàò âûðàæåíèÿ â ÷èñëî ñ òèïîì äàííûõ Long (êàê â
ëèñòèíãå 3.15, ðåçóëüòàò âûïîëíåíèÿ êîòîðîãî ïðåäñòàâëåí íà ðèñ. 3.8), â äðó-
ãèõ ñëó÷àÿõ îòîáðàæàåò ñîîáùåíèå î êàêîé-ëèáî îøèáêå ñèíòàêñèñà èëè âðå-
ìåíè èñïîëíåíèÿ. Åñëè âû óæå îáúÿâèëè âñå ïåðåìåííûå ñ êîíêðåòíûìè òè-
ïàìè (÷òî ÿâëÿåòñÿ õîðîøåé ïðàêòèêîé â ïðîãðàììèðîâàíèè), VBA îòîáðàçèò
ñîîáùåíèå îá îøèáêå.

Ëèñòèíã 3.15.
1: Sub list5_07()
2: dd& = 99
3: gg = MsgBox(TypeName(dd), vbOKOnly, " dd& = 99 ")
4: End Sub

Ðèñ. 3.8
Ðåçóëüòàò âûïîëíåíèÿ êîäà ëèñòèíãà 3.15

Äëÿ êîíêàòåíàöèè ñòðîê ìîæíî òàêæå èñïîëüçîâàòü çíàê îïåðàöèè «+».


Çíàê îïåðàöèè «+» èìååò ñèíòàêñèñ è òðåáîâàíèÿ ê îïåðàíäàì òàêèå æå, êàê
è çíàê &, òîëüêî ñ îäíèì ãëàâíûì îòëè÷èåì. Çíàê îïåðàöèè «+» èìååò èñòî-
ðè÷åñêèå êîðíè â îðèãèíàëüíûõ âåðñèÿõ ÿçûêà ïðîãðàììèðîâàíèÿ BASIC.
 ýòèõ ðàííèõ âåðñèÿõ ÿçûêà BASIC íå óäåëÿëîñü áîëüøîãî âíèìàíèÿ ðàçëè-
÷èþ ìåæäó êîíêàòåíàöèåé ñòðîê è ñëîæåíèåì. Îäíàêî â VBA ãëàâíûì íàçíà-
÷åíèåì çíàêà «+» ÿâëÿåòñÿ àðèôìåòè÷åñêîå ñëîæåíèå. Âñÿêèé ðàç ïðè îáðà-
áîòêå âûðàæåíèÿ, èñïîëüçóþùåãî çíàê «+», VBA ñíà÷àëà «ïûòàåòñÿ» âûïîë-
íèòü àðèôìåòè÷åñêîå ñëîæåíèå. VBA âûïîëíÿåò êîíêàòåíàöèþ ñòðîê ñî
çíàêîì «+», òîëüêî åñëè îäèí èç îïåðàíäîâ ÿâëÿåòñÿ ñòðîêîâûì âûðàæåíèåì
è íå ìîæåò áûòü ïðåîáðàçîâàí â ÷èñëî èëè åñëè îáà îïåðàíäà ÿâëÿþòñÿ ñòðî-
êàìè.
Èñïîëüçóéòå çíàê & äëÿ êîíêàòåíàöèè ñòðîê, ÷òîáû èçáåæàòü
äâóñìûñëåííîñòè ïî ïîâîäó òîãî, êàêóþ îïåðàöèþ íåîáõîäèìî âûïîëíÿòü, è
÷òîáû îáåñïå÷èòü âûïîëíåíèå êîíêàòåíàöèè ñòðîê VBA. Íå èñïîëüçóéòå çíàê
«+» äëÿ êîíêàòåíàöèè ñòðîê, ïîòîìó ÷òî âûðàæåíèÿ, èñïîëüçóþùèå ýòîò
140 Ãëàâà 3

çíàê, ìîãóò áûòü íåîäíîçíà÷íûìè äëÿ VBA è ïîëüçîâàòåëåé, êîòîðûå áóäóò


÷èòàòü âàø êîä.

Ïðèîðèòåòû âûïîëíåíèÿ îïåðàöèé


ïðè âû÷èñëåíèè ñëîæíûõ âûðàæåíèé
Ñëîæíîå (ñîñòàâíîå) âûðàæåíèå (complex expression) — ýòî ëþáîå âûðàæå-
íèå, îáðàçîâàííîå èç äâóõ èëè áîëåå âûðàæåíèé. Ìíîãèå èç çàïèñûâàåìûõ
âàìè âûðàæåíèé — ýòî ñëîæíûå âûðàæåíèÿ, îñîáåííî, åñëè îíè îïðåäåëÿþò
óïðàâëåíèå ïîñëåäîâàòåëüíîñòüþ âûïîëíåíèÿ êîäà â ïðîöåäóðàõ èëè ïðåä-
ñòàâëÿþò ðàçëè÷íûå ìàòåìàòè÷åñêèå ôîðìóëû.
Ïðè âû÷èñëåíèè ñëîæíûõ âûðàæåíèé VBA ñëåäóåò òàêèì ïðàâèëàì:
¨ ×àñòè âûðàæåíèÿ, çàêëþ÷åííûå â êðóãëûå ñêîáêè, âñåãäà âû÷èñëÿþòñÿ
â ïåðâóþ î÷åðåäü. Åñëè âûðàæåíèå, çàêëþ÷åííîå â êðóãëûå ñêîáêè, ÿâ-
ëÿåòñÿ äðóãèì ñëîæíûì âûðàæåíèåì, VBA ïðèìåíÿåò ýòè æå ïðàâèëà ê
âûðàæåíèþ â êðóãëûõ ñêîáêàõ.
¨ Êîíêðåòíûå îïåðàöèè âûïîëíÿþòñÿ â çàâèñèìîñòè îò èåðàðõèè îïåðàòî-
ðîâ. (Èåðàðõèÿ ðàçëè÷íûõ îïåðàòîðîâ VBA ïîêàçàíà â òàáë. 5.5.)
¨ Êîãäà îïåðàòîðû èìåþò ðàâíûé óðîâåíü ïðèîðèòåòà, îíè âû÷èñëÿþòñÿ â
ïîðÿäêå ñëåâà íàïðàâî.
VBA âû÷èñëÿåò âûðàæåíèÿ â ñëåäóþùåì ïîðÿäêå:
¨ Çíàêè àðèôìåòè÷åñêèõ îïåðàöèé.
¨ Çíàêè êîíêàòåíàöèè ñòðîê.
¨ Îïåðàòîðû ñðàâíåíèÿ.
¨ Ëîãè÷åñêèå îïåðàòîðû.
 òàáëèöå 3.7 ïðèâåäåíà èåðàðõèÿ îïåðàòîðîâ VBA. Îïåðàòîðû/îïåðàöèè
ïåðå÷èñëåíû â ïîðÿäêå îò ñàìîãî âûñîêîãî ïðèîðèòåòà äî ñàìîãî íèçêîãî. Îïå-
ðàòîðû, ïîìåùåííûå â îäíîé è òîé æå ñòðîêå ýòîé òàáëèöû, èìåþò ðàâíûé
ïðèîðèòåò. Îïåðàòîðû ñ ðàâíûì ïðèîðèòåòîì âû÷èñëÿþòñÿ ñëåâà íàïðàâî òàê,
êàê îíè ïîÿâëÿþòñÿ â âûðàæåíèè.
Òàáëèöà 3.7. Èåðàðõèÿ îïåðàòîðîâ/îïåðàöèé îò íàèâûñøåãî
äî ñàìîãî íèçêîãî ïðèîðèòåòà

Îïåðàòîð/çíà
Êîììåíòàðèè
ê
^ Âîçâåäåíèå â ñòåïåíü, íàèâûñøèé ïðèîðèòåò
– Óíàðíûé ìèíóñ
Óìíîæåíèå è äåëåíèå èìåþò ðàâíûå ïðèîðèòåòû; îíè
*,/
âû÷èñëÿþòñÿ ïî ìåðå ïîÿâëåíèÿ â âûðàæåíèè ñëåâà íàïðàâî.
\
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

Èñïîëüçîâàíèå ôóíêöèé â âûðàæåíèÿõ


×òîáû èñïîëüçîâàòü ôóíêöèþ, ïðîñòî ââîäèòå èìÿ ôóíêöèè â îïåðàòîð
VBA âìåñòå ñ ëþáûìè àðãóìåíòàìè, êîòîðûå òðåáóþòñÿ äëÿ ýòîé ôóíêöèè, â
òîì ìåñòå â îïåðàòîðå, ãäå âàì íåîáõîäèìî èñïîëüçîâàòü ðåçóëüòàò ôóíêöèè.
[Ïîìåùåíèå èìåíè ôóíêöèè â îïåðàòîð VBA äëÿ àêòèâèçàöèè ôóíêöèè íàçû-
âàþò âûçîâîì (calling) ôóíêöèè.] Ïðè èñïîëüçîâàíèè ôóíêöèé â âûðàæåíèÿõ
ñëåäóéòå òàêèì ïðàâèëàì:
¨ Ìîæíî èñïîëüçîâàòü ðåçóëüòàò ôóíêöèè êàê ÷àñòü âûðàæåíèÿ.
¨ Ìîæíî ïðèñâàèâàòü ðåçóëüòàò ôóíêöèè êàêîé-ëèáî ïåðåìåííîé.
¨ Ìîæíî èñïîëüçîâàòü ðåçóëüòàò ôóíêöèè äëÿ ïðåäîñòàâëåíèÿ çíà÷åíèÿ â
ñïèñîê àðãóìåíòîâ äðóãîé ïðîöåäóðû èëè ôóíêöèè.
¨ Ôóíêöèè èìåþò ñïèñêè àðãóìåíòîâ, çàêëþ÷åííûå â êðóãëûå ñêîáêè.
 îñíîâíîì ôóíêöèþ ìîæíî èñïîëüçîâàòü äëÿ ïðåäîñòàâëåíèÿ çíà÷åíèÿ â
ëþáîì ìåñòå â ëþáîì îïåðàòîðå VBA, ãäå ìîæåò áûòü îïðàâäàííî èñïîëüçîâà-
íèå çíà÷åíèÿ êîíñòàíòû èëè ïåðåìåííîé.  ëèñòèíãå 4.1 ïðèâåäåíà ïðîöåäóðà
äëÿ äåìîíñòðàöèè âûçîâà ôóíêöèè â âûðàæåíèÿõ.

Ëèñòèíã 4.1. Èñïîëüçîâàíèå ôóíêöèé


1: Sub FuncDemo()
2: Dim s_Date As String
3: Dim d_Time As Date
4: s_Date = CStr(Now)
5: d_Time = Time
6: MsgBox "Ñåãîäíÿ: " & s_Date
7: MsgBox "Òåêóùåå âðåìÿ: " & d_Time
8: End Sub

 ñòðîêàõ 2–3 îáúÿâëåíû äâå ïåðåìåííûå: s_Date ñ òèïîì String è d_Time


ñ òèïîì Date.  ñòðîêå 4 ïåðåìåííàÿ s_Date ïîëó÷àåò çíà÷åíèå òåêóùåé äàòû
â âèäå ñòðîêè, òàê êàê ïîñëå âûçîâà ôóíêöèè Now (ïîëó÷èòü ñèñòåìíóþ äàòó)
ðåçóëüòèðóþùåå çíà÷åíèå ïðåîáðàçóåòñÿ ôóíêöèåé CStr â ñòðîêó. Ïåðåìåí-
íàÿ d_Time ïðèíèìàåò çíà÷åíèå ñèñòåìíîãî âðåìåíè.  ñòðîêàõ 6–7 ñ ïîìî-
ùüþ îïåðàòîðà MsgBox çíà÷åíèÿ ïåðåìåííûõ âûâîäÿòñÿ íà ýêðàí (ðèñ. 4.1)
â äèàëîãîâûõ îêíàõ. Îáðàòèòå âíèìàíèå íà òî, ÷òî, ïîñêîëüêó âûðàæåíèå
â ñòðîêå 7 ñîäåðæèò îïåðàòîð êîíêàòåíàöèè ñòðîê (&), äëÿ âûâîäà â äèàëîãî-
âîì îêíå ïåðåìåííîé d_Time íåò íåîáõîäèìîñòè ïðåîáðàçîâàíèÿ åå â ñòðîêó.
Ïîñêîëüêó ýòà ñèíòàêñè÷åñêàÿ «âîëüíîñòü» îòñóòñòâóåò âî ìíîãèõ äðóãèõ ÿçû-
êàõ ïðîãðàììèðîâàíèÿ, ÿ áû íå ñîâåòîâàë ÷àñòî ïîëüçîâàòüñÿ ýòèìè VBA-âîç-
ìîæíîñòÿìè. Ê òîìó æå ýòî íå ñïîñîáñòâóåò ñòðåìëåíèþ ê àêêóðàòíîñòè ïðè
íàïèñàíèè êîäà.

Ðèñ. 4.1
Ðåçóëüòàò âûïîëíåíèÿ êîäà
ëèñòèíãà 4.1
Ôóíêöèè â Visual Basic 145

Àðãóìåíòû è âîçâðàùàåìîå çíà÷åíèå ôóíêöèè


Êàê âû óæå âèäåëè â ëèñòèíãå 4.1, íåêîòîðûå ôóíêöèè òðåáóþò îäíîãî èëè
áîëåå àðãóìåíòîâ, äðóãèå — íåò. Ôóíêöèè, êîòîðûå íå òðåáóþò àðãóìåíòîâ,
îáû÷íî ïðîñòî âûáèðàþò çíà÷åíèå, íåäîñòóïíîå èíà÷å. Íàïðèìåð, ôóíêöèÿ
Time, âîçâðàùàþùàÿ òåêóùåå ñèñòåìíîå âðåìÿ êîìïüþòåðà, íå òðåáóåò íèêà-
êèõ àðãóìåíòîâ, à ôóíêöèþ CStr âûçûâàòü áåç àðãóìåíòîâ áåññìûñëåííî. ×òî-
áû èñïîëüçîâàòü ôóíêöèþ, íå èìåþùóþ àðãóìåíòîâ, ïðîñòî ââåäèòå èìÿ
ôóíêöèè â ïðîãðàììó, êàê â ñëåäóþùèõ îïåðàòîðàõ:
ÑèñòåìíîåÂðåìÿ = Time
MsgBox Now
Äðóãèå ôóíêöèè òðåáóþò îäíîãî èëè áîëåå àðãóìåíòîâ. Ôóíêöèÿ Sqr, íà-
ïðèìåð, âîçâðàùàåò êîðåíü êâàäðàòíûé ÷èñëà; ÷òîáû Sqr âû÷èñëèëà êîðåíü
êâàäðàòíûé, íåîáõîäèìî ïðåäîñòàâèòü ÷èñëî, êàê ïîêàçàíî â ñëåäóþùèõ îïå-
ðàòîðàõ:
r_Val = 16
Root = Sqr(r_Val)
Çíà÷åíèÿ ïðåäîñòàâëÿþòñÿ ôóíêöèè ïîìåùåíèåì èõ â ñïèñîê àðãóìåíòîâ.
Ñïèñîê àðãóìåíòîâ ñëåäóåò çàêëþ÷àòü â êðóãëûå ñêîáêè è, åñëè â ñïèñêå íàõî-
äèòñÿ áîëåå îäíîãî àðãóìåíòà, îòäåëÿòü êàæäûé àðãóìåíò çàïÿòîé.
Òèï äàííûõ çíà÷åíèÿ, âîçâðàùàåìîãî ôóíêöèåé, çàâèñèò îò ýòîé êîíêðåò-
íîé ôóíêöèè. Áîëüøèíñòâî ôóíêöèé âîçâðàùàþò çíà÷åíèÿ òèïà Variant,
õîòÿ íåêîòîðûå ôóíêöèè âîçâðàùàþò äàííûå îïðåäåëåííûõ òèïîâ, òàêèõ êàê
String, Double è Integer. VBA âî ìíîãèõ ñëó÷àÿõ ìîæåò àâòîìàòè÷åñêè ïðå-
îáðàçîâûâàòü ðåçóëüòàò êàêîé-ëèáî ôóíêöèè â äàííûå òèïà, ñîâìåñòèìîãî ñ
äðóãèìè òèïàìè çíà÷åíèé â âûðàæåíèè, ñîäåðæàùåì ýòó ôóíêöèþ, òî÷íî,
êàê VBA ïðåîáðàçóåò òèïû äàííûõ â ïðèñâàèâàíèÿõ ïåðåìåííûõ è âû÷èñëå-
íèè âûðàæåíèé. Ïðàâèëà ñîâìåñòèìîñòè òèïîâ äàííûõ, ïðèâåäåííûå â ïðåäû-
äóùåé ãëàâå, êîòîðûå ïðèìåíèìû ê ïåðåìåííûì Variant è òèïèçèðîâàííûì
ïåðåìåííûì è êîíñòàíòàì, ïðèìåíèìû òàêæå ê çíà÷åíèÿì, âîçâðàùàåìûì
ôóíêöèÿìè.

Èãíîðèðîâàíèå ðåçóëüòàòà ôóíêöèè


Êàê ïðàâèëî, çíà÷åíèå, âîçâðàùàåìîå ôóíêöèåé, äîëæíî áûòü êàêèì-ëèáî
îáðàçîì èñïîëüçîâàíî: ïóòåì âêëþ÷åíèÿ ðåçóëüòàòà ôóíêöèè â âûðàæåíèå, â
ñïèñîê àðãóìåíòîâ, èëè ïóòåì ïðèñâàèâàíèÿ åãî íåêîòîðîé ïåðåìåííîé. Îäíà-
êî â íåêîòîðûõ ñëó÷àÿõ ìîæíî íå èñïîëüçîâàòü âîçâðàùàåìîå ôóíêöèåé çíà-
÷åíèå.
Ðàíåå áûëî óïîìÿíóòî, ÷òî VBA-ïðîöåäóðà MsgBox èìååò íåîáÿçàòåëüíûé
âòîðîé àðãóìåíò, ïîçâîëÿþùèé îïðåäåëÿòü, ñêîëüêî êîìàíäíûõ êíîïîê ïîÿâ-
ëÿåòñÿ â îêíå ñîîáùåíèÿ. Ìîæíî èñïîëüçîâàòü ýòîò àðãóìåíò êîìàíäíûõ êíî-
ïîê â ïðîöåäóðå MsgBox äëÿ îòîáðàæåíèÿ ñîîáùåíèÿ, êîòîðîå çàäàåò ïîëüçîâà-
òåëþ âîïðîñ è äàåò âîçìîæíîñòü îòâåòèòü íà íåãî ïóòåì âûáîðà êîìàíäíîé
êíîïêè â îêíå ñîîáùåíèÿ.
Åñëè âû èñïîëüçóåòå ýòîò íåîáÿçàòåëüíûé àðãóìåíò äëÿ MsgBox, òî ìîæíî
ïîëó÷èòü îò MsgBox çíà÷åíèå, óêàçûâàþùåå, êàêóþ êíîïêó âûáðàë ïîëüçîâà-
òåëü.  äåéñòâèòåëüíîñòè, ïðîöåäóðà MsgBox ÿâëÿåòñÿ ôóíêöèåé, õîòÿ ÷àùå
âñåãî èñïîëüçóåòñÿ êàê ïðîöåäóðà.
146 Ãëàâà 4

Äî ñèõ ïîð âî âñåõ ïðèìåðàõ ýòîé êíèãè àðãóìåíò êîìàíäíûõ êíîïîê â îïå-
ðàòîðàõ 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, äåìîíñòðèðóþùåå ðåçóëüòàò âêëþ÷åíèÿ â
ñïèñîê ïàðàìåòðîâ àðãóìåíòà êíîïîê

Äâà ïîñëåäíèõ ïðèìåðà èñïîëüçîâàíèÿ MsgBox èëëþñòðèðóþò âàæíûé


ôàêò, êàñàþùèéñÿ ôóíêöèé: îïóñêàÿ êðóãëûå ñêîáêè âîêðóã ñïèñêà àðãóìåí-
òîâ ôóíêöèè, âû óêàçûâàåòå VBA íà òî, ÷òî íåîáõîäèìî èãíîðèðîâàòü ðåçóëü-
òàò ôóíêöèè. Êîãäà êðóãëûå ñêîáêè îïóñêàþòñÿ, VBA èíòåðïðåòèðóåò âûçîâ
ôóíêöèè, êàê åñëè áû ýòî áûë âûçîâ ïðîöåäóðû, è íå âîçâðàùàåò ðåçóëüòàò.
Âåðíåìñÿ îïÿòü ê ïðèìåðàì â íà÷àëå ýòîé ãëàâû è â ôóíêöèÿõ, èñïîëüçî-
âàâøèõñÿ â ëèñòèíãå 4.1, îáðàòèì âíèìàíèå íà òî, ÷òî âñå îïåðàòîðû, âûçû-
âàþùèå ôóíêöèþ VBA, âêëþ÷àþò êðóãëûå ñêîáêè âîêðóã ñïèñêà àðãóìåíòîâ
ôóíêöèè, äàæå êîãäà ñïèñîê àðãóìåíòîâ ñîäåðæèò òîëüêî îäèí àðãóìåíò.
Ôóíêöèè, íå èìåþùèå àðãóìåíòîâ, íå òðåáóþò êðóãëûõ ñêîáîê ïðè èõ âûçîâå.
Íåò ñìûñëà â èãíîðèðîâàíèè ðåçóëüòàòà êàæäîé ôóíêöèè VBA, è íå âñåãäà
ýòî æåëàòåëüíî. Èãíîðèðîâàíèå ðåçóëüòàòà ôóíêöèè ïîëåçíî òîëüêî ïðè ðàáî-
òå ñ ôóíêöèÿìè (òàêèìè êàê MsgBox), êîòîðûå âûïîëíÿþò íåêîòîðóþ çàäà÷ó,
à âîçâðàùåíèå èìè ðåçóëüòàòà ÿâëÿåòñÿ òîëüêî ÷àñòüþ èõ ðàáîòû. Ðåçóëüòàò
Ôóíêöèè â Visual Basic 147

ôóíêöèè èãíîðèðóþò, êîãäà õîòÿò, ÷òîáû ôóíêöèÿ âûïîëíÿëà íåêîòîðûå äåé-


ñòâèÿ, íî ðåçóëüòàò ýòèõ äåéñòâèé íåîáÿçàòåëüíî èñïîëüçîâàòü â êîäå. Ôóíê-
öèÿ MsgBox, íàïðèìåð, âûïîëíÿåò îòîáðàæåíèå ñîîáùåíèÿ â äèàëîãîâîì îêíå
â êà÷åñòâå îñíîâíîé çàäà÷è. ( ãëàâå 5 ïîêàçàíî, êàê èñïîëüçîâàòü MsgBox,
÷òîáû äàòü âîçìîæíîñòü ïîëüçîâàòåëþ ïðîãðàììû äåëàòü âûáîð, âëèÿþùèé
íà âûïîëíåíèå ïðîãðàììû.)
Ïðè ïîïûòêå èãíîðèðîâàòü ðåçóëüòàò ôóíêöèè, íå èìåþùåé àðãóìåíòîâ
(òàêîé, êàê ôóíêöèÿ Now), èëè ëþáîé äðóãîé ôóíêöèè, ðåçóëüòàò êîòîðîé íå
ìîæåò íå èñïîëüçîâàòüñÿ, VBA îòîáðàæàåò ñîîáùåíèå îá îäíîé èç íåñêîëüêèõ
âîçìîæíûõ îøèáêàõ âðåìåíè èñïîëíåíèÿ â çàâèñèìîñòè îò êîíêðåòíîé ôóíê-
öèè, õîòÿ îáû÷íî ïîÿâëÿåòñÿ ñîîáùåíèå îá îøèáêå ñèíòàêñèñà èëè íåñîâïàäå-
íèÿ òèïîâ. Îáû÷íî VBA çàïðåùàåò èãíîðèðîâàíèå ðåçóëüòàòà ôóíêöèè, èìÿ
êîòîðîé ÿâëÿåòñÿ êëþ÷åâûì ñëîâîì VBA (òàêîé, êàê CStr èëè äðóãèõ ôóíê-
öèé ïðåîáðàçîâàíèÿ), è òåõ ôóíêöèé, åäèíñòâåííûì íàçíà÷åíèåì êîòîðûõ ÿâ-
ëÿåòñÿ ïðåäîñòàâëåíèå íåêîòîðîãî âîçâðàùàåìîãî çíà÷åíèÿ, íàïðèìåð, ìàòå-
ìàòè÷åñêèõ.

Èñïîëüçîâàíèå èìåíîâàííûõ àðãóìåíòîâ ôóíêöèè


Ðàíåå â êíèãå óêàçûâàëîñü, ÷òî àðãóìåíòû ïðîöåäóðû íåîáõîäèìî ïåðå÷èñ-
ëÿòü â îïðåäåëåííîì ïîðÿäêå. Òàêæå íåîáõîäèìî ïåðå÷èñëÿòü â îïðåäåëåííîì
ïîðÿäêå è àðãóìåíòû ôóíêöèè. Ôóíêöèè ñ íåñêîëüêèìè àðãóìåíòàìè èñïîëü-
çóþò ïîëîæåíèå àðãóìåíòà â ñïèñêå àðãóìåíòîâ äëÿ îïðåäåëåíèÿ òîãî, êàêîå
çíà÷åíèå ïîëó÷àåò êîíêðåòíûé àðãóìåíò. Íàïðèìåð, äëÿ MsgBox ïåðâûé àðãó-
ìåíò ÿâëÿåòñÿ ñîîáùåíèåì, âòîðîé — ýòî ÷èñëî è òèï êíîïîê äëÿ äèàëîãîâîãî
îêíà, òðåòèé — çàãîëîâîê äèàëîãîâîãî îêíà.
Íåñìîòðÿ íà òî, ÷òî âòîðîé àðãóìåíò MsgBox, îïðåäåëÿþùèé êîìàíäíûå
êíîïêè äëÿ äèàëîãîâîãî îêíà, ÿâëÿåòñÿ íåîáÿçàòåëüíûì è áûë îïóùåí âî âñåõ
ïðèìåðàõ è óïðàæíåíèÿõ äî ñèõ ïîð â êíèãå, âñå æå íåîáõîäèìî âêëþ÷àòü îòìå-
÷àþùèå çàïÿòûå äëÿ âòîðîãî àðãóìåíòà â ñïèñîê àðãóìåíòîâ. Ïðîïóñê îòìå÷àþ-
ùèõ çàïÿòûõ äëÿ âòîðîãî àðãóìåíòà ïðèâîäèò ê îøèáêå íåñîâïàäåíèÿ òèïîâ.
Êàê âû ìîãëè óæå çàìåòèòü, ëåãêî íå÷àÿííî îïóñòèòü îòìå÷àþùèå çàïÿòûå
èëè ïåðåñòàâèòü çíà÷åíèÿ àðãóìåíòîâ â ôóíêöèÿõ, èìåþùèõ íåîáÿçàòåëüíûå
àðãóìåíòû èëè íåñêîëüêî àðãóìåíòîâ, íåñìîòðÿ íà ïîìîùü ñâîéñòâà Auto
Quick (Êðàòêèå ñâåäåíèÿ) Ðåäàêòîðà VB. Ïðîïóñê èëè ïåðåñòàíîâêà àðãóìåí-
òîâ â ñïèñêå àðãóìåíòîâ ôóíêöèè ìîãóò ïðèâåñòè ê îøèáêàì íåñîâïàäåíèÿ òè-
ïîâ. Îøèáêà (÷òî åùå õóæå) ìîæåò áûòü íå îáíàðóæåíà.
×òîáû ïðåäîòâðàòèòü îøèáêè ïðîãðàììèðîâàíèÿ è ñäåëàòü áîëåå ëåãêèì
èñïîëüçîâàíèå ôóíêöèé, èìåþùèõ íåîáÿçàòåëüíûå àðãóìåíòû, VBA ïðåäîñ-
òàâëÿåò àëüòåðíàòèâó ïåðå÷èñëåíèþ çíà÷åíèé â ñïèñêå àðãóìåíòîâ â îïðåäå-
ëåííîì ïîðÿäêå. Ìîæíî òàêæå ïåðåäàâàòü çíà÷åíèÿ àðãóìåíòîâ ôóíêöèè, èñ-
ïîëüçóÿ èìåíîâàííûå àðãóìåíòû (named arguments) ôóíêöèé. Ñëåäóþùèå
ñòðîêè ïîêàçûâàþò äâà îïåðàòîðà MsgBox, êîòîðûå èìåþò îäèí è òîò æå ðå-
çóëüòàò; ïåðâûé îïåðàòîð èñïîëüçóåò îáû÷íûé ìåòîä ïåðå÷èñëåíèÿ àðãóìåí-
òîâ, à âòîðîé — ìåòîä èìåíîâàííûõ àðãóìåíòîâ (îáà îïåðàòîðà èãíîðèðóþò ðå-
çóëüòàò ôóíêöèè MsgBox):
MsgBox AnyMsg, , AnyTitle
MsgBox Prompt:=AnyMsg, Title:=AnyTitle
148 Ãëàâà 4

Âòîðîé îïåðàòîð èñïîëüçóåò èìåíîâàííûå àðãóìåíòû äëÿ Prompt (ñîîáùå-


íèå èëè çàïðîñ) è Title (îïðåäåëÿåò çàãîëîâîê îêíà ñîîáùåíèÿ), ïðèñâàèâàÿ
çíà÷åíèå êàæäîìó èìåíîâàííîìó àðãóìåíòó.
Ñèìâîë, êîòîðûé ïðèñâàèâàåò çíà÷åíèå èìåíîâàííîìó àðãóìåíòó (:=), íå
ÿâëÿåòñÿ â òî÷íîñòè òåì æå îáû÷íûì îïåðàòîðîì ïðèñâàèâàíèÿ (=). Åñëè
îïóñòèòü äâîåòî÷èå (:) âî âðåìÿ ïðèñâàèâàíèÿ çíà÷åíèÿ èìåíîâàííîìó àðãó-
ìåíòó, VBA íå îáÿçàòåëüíî îáíàðóæèò îøèáêó ñèíòàêñèñà, íî íå ìîæåò èíòåð-
ïðåòèðîâàòü ýòîò îïåðàòîð ïðàâèëüíî. Êîãäà VBA âûïîëíÿåò ýòîò îïåðàòîð, îí
îòîáðàæàåò îäíó èç íåñêîëüêèõ âîçìîæíûõ îøèáîê âðåìåíè èñïîëíåíèÿ, ÷àñ-
òî — îøèáêó íåñîâïàäåíèÿ òèïîâ.
Ïðè èñïîëüçîâàíèè èìåíîâàííûõ àðãóìåíòîâ íåò íåîáõîäèìîñòè âêëþ÷àòü
îòìå÷àþùèå çàïÿòûå äëÿ íåîáÿçàòåëüíûõ àðãóìåíòîâ. Îáðàòèòå âíèìàíèå, âî
âòîðîì èç ïðèâåäåííûõ âûøå îïåðàòîðîâ íåò îòìå÷àþùåé çàïÿòîé ìåæäó àð-
ãóìåíòàìè äëÿ çàïðîñà è çàãîëîâêà (â îòëè÷èå îò ïåðâîãî îïåðàòîðà). Íà ñàìîì
äåëå, èìåíîâàííûå àðãóìåíòû íå äîëæíû ïîÿâëÿòüñÿ â êàêîì-ëèáî îïðåäåëåí-
íîì ïîðÿäêå. Âî âòîðîì îïåðàòîðå ìîæíî ïîìåñòèòü àðãóìåíò Title ïåðåä àðãó-
ìåíòîì Prompt, êàê ïîêàçàíî äàëåå:
MsgBox Title:=ÇàãîëîâîêÎêíà, Prompt:=Ñîîáùåíèå
MsgBox âñå ðàâíî èñïîëüçóåò çíà÷åíèå, ïðèñâîåííîå àðãóìåíòó Title, â êà-
÷åñòâå çàãîëîâêà äèàëîãîâîãî îêíà. Ïðè èñïîëüçîâàíèè èìåíîâàííûõ àðãóìåí-
òîâ VBA èñïîëüçóåò èìÿ àðãóìåíòà äëÿ îïðåäåëåíèÿ òîãî, êàêîå çíà÷åíèå ýòîò
àðãóìåíò ïðåäñòàâëÿåò.
Ïîñëå ñòîëü äîëãîãî ïîâåñòâîâàíèÿ î ïîëüçå ôóíêöèè MsgBox ïðèâåäåì, íà-
êîíåö, åå ïîëíûé ñèíòàêñèñ.
Ñèíòàêñèñ
MsgBox(Prompt [, Buttons] [, Title] [, HelpFile, Context])
Åäèíñòâåííûì îáÿçàòåëüíûì àðãóìåíòîì äëÿ MsgBox ÿâëÿåòñÿ àðãóìåíò Prompt,
êîòîðûé ìîæåò áûòü ëþáûì ñòðîêîâûì âûðàæåíèåì è ñîäåðæèò èíôîðìàöèþ,
âûâîäèìóþ â äèàëîãîâîì îêíå. Âñå äðóãèå àðãóìåíòû ÿâëÿþòñÿ íåîáÿçàòåëüíûìè
(îá ýòîì ãîâîðÿò êâàäðàòíûå ñêîáêè, â êîòîðûå çàêëþ÷åíû ýòè àðãóìåíòû âìåñòå ñ
ðàçäåëÿþùèìè çàïÿòûìè).
Àðãóìåíò Title ñîäåðæèò ñòðîêó äëÿ çàãîëîâêà äèàëîãîâîãî îêíà. Áåç ýòîãî
àðãóìåíòà â çàãîëîâêå áóäåò âûâåäåíî íàèìåíîâàíèå host-ïðèëîæåíèÿ, èç
êîòîðîãî çàïóñêàåòñÿ ïðîãðàììà íà VBA.
Àðãóìåíò HelpFile — ýòî ñòðîêîâîå âûðàæåíèå, ñîäåðæàùåå èìÿ ñïðàâî÷íîãî
ôàéëà Windows; îáû÷íî ýòî — ôàéë, êîòîðûé âû óæå äîëæíû áûëè ñîçäàòü ñ
ïîìîùüþ Windows Help Compiler. Àðãóìåíò Context — ýòî ÷èñëåííîå âûðàæåíèå,
óêàçûâàþùåå ðàçäåë â ñïðàâî÷íîì ôàéëå, îòíîñÿùèéñÿ ê îòîáðàæàåìîìó
äèàëîãîâîìó îêíó, íàïðèìåð, 0 îáû÷íî îòíîñèòñÿ ê îãëàâëåíèþ ñïðàâî÷íîãî
ôàéëà.
Àðãóìåíò Buttons ÿâëÿåòñÿ ÷èñëåííûì âûðàæåíèåì, êîòîðîå çàäàåò êîëè÷åñòâî è
òèï êíîïîê â äèàëîãîâîì îêíå MsgBox. Buttons óêàçûâàåò òàêæå êíîïêó ïî
óìîë÷àíèþ â äèàëîãîâîì îêíå è, ñîäåðæèò ëè ýòî äèàëîãîâîå îêíî ñòàíäàðòíûå
çíà÷êè Windows: Critical, Information, Exclamation èëè Question äëÿ
ïðåäóïðåäèòåëüíûõ ñîîáùåíèé è çàïðîñîâ ïîëüçîâàòåëÿ. Â òàáë. 4.1 ïðèâåäåíû
çíà÷åíèÿ àðãóìåíòîâ-êîíñòàíò ôóíêöèè MsgBox è èõ íàçíà÷åíèå, à â òàáë. 4.2 —
âîçâðàùàåìûå çíà÷åíèÿ-êîíñòàíòû ôóíêöèè.

Òàáëèöà 4.1. Àðãóìåíòû-êîíñòàíòû ôóíêöèè MsgBox


Ôóíêöèè â Visual Basic 149

Êîíñòàíòà Íàçíà÷åíèå
Îòîáðàæàåò êîìàíäíûå êíîïêè Ñòîï, Ïîâòîð, Ïðîïóñòèòü
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.2. Âîçâðàùàåìûå çíà÷åíèÿ-êîíñòàíòû ôóíêöèè MsgBox


150 Ãëàâà 4

Êîíñòàíòà Îçíà÷àåò, ÷òî ïîëüçîâàòåëü âûáèðàåò êíîïêó


vbAbort Ñòîï (Abort)
vbCancel Îòìåíà (Cancel)
vbIgnore Ïðîïóñòèòü (Ignore)
vbNo Íåò (No)
vbOK OK
vbRetry Ïîâòîð (Retry)
vbYes Äà (Yes)

Äðóãîé íàèáîëåå ÷àñòî èñïîëüçóåìîé äëÿ îáìåíà äàííûìè ñ ïîëüçîâàòåëåì


ôóíêöèåé ÿâëÿåòñÿ InputBox. Â ãëàâå 3 áûë ïðèâåäåí êðàòêèé ñèíòàêñèñ ýòîé
ôóíêöèè, à íèæå — ïîëíûé:
Ñèíòàêñèñ
InputBox(Prompt [, Title] [, Default] [, XPos][, YPos]
[, HelpFile, Context])
Prompt — ýòî ëþáîå ñòðîêîâîå âûðàæåíèå. Àðãóìåíò Prompt ÿâëÿåòñÿ åäèíñòâåííûì
îáÿçàòåëüíûì àðãóìåíòîì äëÿ InputBox; âñå äðóãèå — íåîáÿçàòåëüíûå.
Title — ýòî ñòðîêà, èñïîëüçóåìàÿ â êà÷åñòâå çàãîëîâêà äëÿ îêíà ââîäà (êàê è äëÿ
ôóíêöèè MsgBox).
Default òàêæå ÿâëÿåòñÿ ëþáûì ñòðîêîâûì âûðàæåíèåì è èñïîëüçóåòñÿ êàê
çíà÷åíèå ïî óìîë÷àíèþ äëÿ ïîëüçîâàòåëüñêîãî ââîäà.
Ñëåäóþùèé îïåðàòîð, íàïðèìåð, çàïðàøèâàåò ïîëüçîâàòåëÿ ââåñòè èìÿ ôàéëà è
ïðåäëàãàåò èìÿ NEWFILE â êà÷åñòâå çíà÷åíèÿ ïî óìîë÷àíèþ. Äèàëîãîâîå îêíî,
âûâîäèìîå íà ýêðàí ýòèì îïåðàòîðîì è îòîáðàæàþùåå çíà÷åíèå ïî óìîë÷àíèþ,
ïîêàçàíî íà ðèñ. 4.3.
User_Input = InputBox("Ââåäèòå èìÿ ôàéëà: ", _
"Ñîçäàòü ôàéë", "NEWFILE")

Ðèñ. 4.3
Èñïîëüçóéòå íåîáÿçàòåëüíûå àðãóìåíòû
ôóíêöèè InputBox äëÿ çàäàíèÿ çíà÷åíèÿ ïî
óìîë÷àíèþ

Êàê âû ìîãëè óæå çàìåòèòü, äèàëîãîâîå îêíî InputBox îòîáðàæàåòñÿ â öåíòðå


ýêðàíà. Ìîæíî âûâîäèòü ýòî îêíî â äðóãîì ìåñòå íà ýêðàíå, îñîáåííî, åñëè
íåîáõîäèìî, ÷òîáû áûëè îòêðûòû è îñòàâàëèñü âèäèìûìè äðóãèå äèàëîãîâûå
îêíà.
Àðãóìåíòû XPos è YPos ìîãóò áûòü ëþáûìè ÷èñëåííûìè âûðàæåíèÿìè. Ýòè àðãó-
ìåíòû ïîçâîëÿþò óêàçàòü, ãäå â àêòèâíîì îêíå ïîÿâëÿåòñÿ îêíî ââîäà, è ÿâëÿþòñÿ
êîîðäèíàòàìè âåðõíåãî ëåâîãî óãëà äèàëîãîâîãî îêíà: XPos — ãîðèçîíòàëüíîå ðàñ-
ñòîÿíèå îò ëåâîãî êðàÿ îêíà; YPos — ýòî âåðòèêàëüíîå ðàññòîÿíèå îò âåðõíåãî
êðàÿ îêíà. Îáà ðàññòîÿíèÿ èçìåðÿþòñÿ â òâèïàõ (twips); îäèí òâèï ðàâåí 1/20 òî÷-
êè (òî÷êà — ýòî èçìåðåíèå øðèôòà ïå÷àòè). Ïîñêîëüêó òî÷êà ñîñòàâëÿåò 1/72
÷àñòü äþéìà, òî îäèí òâèï ïðèáëèçèòåëüíî ðàâåí 0,0007 äþéìà.
Áóäüòå âíèìàòåëüíû ïðè çàäàíèè ïîëîæåíèÿ äèàëîãîâîãî îêíà InputBox. Âû ìî-
æåòå çàäàòü ïîçèöèè äëÿ àðãóìåíòîâ XPos è YPos íàñòîëüêî áîëüøèìè, ÷òî äèàëî-
Ôóíêöèè â Visual Basic 151

ãîâîå îêíî ñîâñåì íå ïîÿâèòñÿ íà ýêðàíå, ïîòîìó ÷òî åãî ïîëîæåíèå âûéäåò çà ïðà-
âûé èëè íèæíèé êðàé îêíà. Ïðè ýòîì, õîòÿ äèàëîãîâîå îêíî è íåâèäèìî, îíî ÿâ-
ëÿåòñÿ àêòèâíûì, íè îäèí èç ýëåìåíòîâ óïðàâëåíèÿ, êîòîðûå âû âèäèòå íà ýêðàíå,
íå áóäåò ðàáîòàòü äî òåõ ïîð, ïîêà âû íå îòðåàãèðóåòå íà «íåâèäèìîå» äèàëîãîâîå
îêíî.
Ïîñëåäíèå äâà íåîáÿçàòåëüíûõ àðãóìåíòà äëÿ ôóíêöèè InputBox — ýòî HelpFile è
Context. Îíè èìåþò òî æå íàçíà÷åíèå, ÷òî è ïîäîáíûå àðãóìåíòû ôóíêöèè
MsgBox.
Åñëè âû çàäàåòå HelpFile èëè Context, íåîáõîäèìî çàäàâàòü îáà àðãóìåíòà (ýòè àðãó-
ìåíòû çàêëþ÷åíû â îäíè êâàäðàòíûå ñêîáêè). Âñÿêèé ðàç, êîãäà óêàçûâàåòñÿ ñïðà-
âî÷íûé ôàéë äëÿ îêíà ââîäà, VBA àâòîìàòè÷åñêè äîáàâëÿåò êîìàíäíóþ êíîïêó ïî-
ìîùè â äèàëîãîâîå îêíî. VBA íå âêëþ÷àåò Windows Help Compiler; åñëè âû õîòèòå
ñîçäàòü ñîáñòâåííûå ïîëüçîâàòåëüñêèå ñïðàâî÷íûå ôàéëû, íåîáõîäèìî îò Microsoft
ïîëó÷èòü Windows Help Compiler îòäåëüíî èëè èñïîëüçîâàòü ñðåäñòâà íåçàâèñèìûõ
ïîñòàâùèêîâ ïðîãðàììíîãî îáåñïå÷åíèÿ.

Ïðè âûçîâå InputBox ìîæíî èñïîëüçîâàòü èìåíîâàííûå àðãóìåíòû. Äëÿ


ýòîãî ïðîñòî ïðèìåíÿéòå íàèìåíîâàíèÿ àðãóìåíòîâ: Prompt, Title, Default,
XPos, YPos, HelpFile è Context. Ñëåäóþùèé îïåðàòîð âûäàåò òàêîå æå äèàëîãî-
âîå îêíî, ÷òî è ïîêàçàííîå íà ðèñ. 4.3, íî çäåñü ïðèìåíÿþòñÿ èìåíîâàííûå àð-
ãóìåíòû:
User_Input = InputBox(Prompt:="Ââåäèòå èìÿ íîâîãî ôàéëà: ", _
Title:="Ñîçäàòü ôàéë", Default:="NEWFILE")
Îáðàòèòå âíèìàíèå, ÷òî ýòîò îïåðàòîð èìååò êðóãëûå ñêîáêè âîêðóã ñïèñêà
àðãóìåíòîâ. Íåîáõîäèìî âñåãäà çàêëþ÷àòü ñïèñîê àðãóìåíòîâ â êðóãëûå ñêîá-
êè ïðè èñïîëüçîâàíèè ðåçóëüòàòà ôóíêöèè, íåçàâèñèìî îò òîãî, èñïîëüçóåòå
ëè âû èìåíîâàííûå àðãóìåíòû ïðè âûçîâå ôóíêöèè.
Íåëüçÿ ñìåøèâàòü èìåíîâàííûå àðãóìåíòû ñ îáû÷íûì ñïèñêîì àðãóìåíòîâ
â îäíîì è òîì æå âûçîâå ôóíêöèè. Íåîáõîäèìî èñïîëüçîâàòü ëèáî èìåíîâàí-
íûå àðãóìåíòû, ëèáî ñïèñîê îáû÷íûõ àðãóìåíòîâ äëÿ êàæäîãî îòäåëüíîãî âû-
çîâà ôóíêöèè.
Äëÿ îïðåäåëåíèÿ èìåí àðãóìåíòîâ ôóíêöèè èñïîëüçóéòå âñïëûâàþùåå
îêíî Auto Quick Info (Êðàòêèå ñâåäåíèÿ), ïîÿâëÿþùååñÿ ïðè ââîäå èìåíè ôóíê-
öèè (â Ðåäàêòîðå VBA). Ìîæíî òàêæå èñïîëüçîâàòü Object Browser äëÿ âñòàâêè
èìåíè ôóíêöèè è äîáàâëåíèÿ â ñïèñîê èìåíîâàííûõ àðãóìåíòîâ â ïðîãðàìì-
íîì êîäå, êàê îïèñàíî äàëåå â ýòîé ãëàâå.

Èñïîëüçîâàíèå äðóãèõ ôóíêöèé VBA


Âñòðîåííûå ôóíêöèè VBA äåëÿòñÿ íà íåñêîëüêî êàòåãîðèé íà îñíîâå îáùå-
ãî íàçíà÷åíèÿ ôóíêöèé (ìàòåìàòè÷åñêèå, ïðåîáðàçîâàíèÿ äàííûõ, äàòû è âðå-
ìåíè, ñòðîêîâûå è ðàáîòû ñ äèñêîì). Â ñëåäóþùèõ ðàçäåëàõ îáñóæäàþòñÿ êà-
òåãîðèè ôóíêöèé è îïèñûâàþòñÿ èõ äåéñòâèÿ.
Ê ñîæàëåíèþ, íåâîçìîæíî îïèñàòü ïîäðîáíî êàæäóþ ôóíêöèþ VBA â ðàì-
êàõ ýòîé êíèãè. Îäíàêî áîëüøèíñòâî ôóíêöèé VBA, òàêèå êàê ìàòåìàòè÷å-
ñêèå ôóíêöèè, ÿâëÿþòñÿ äîâîëüíî ÿñíûìè èç èõ íàçâàíèÿ è íå òðåáóþò ïîä-
ðîáíîãî îáúÿñíåíèÿ. Äðóãèå ôóíêöèè, òàêèå êàê ôóíêöèè ïðåîáðàçîâàíèÿ
òèïà äàííûõ è îáðàáîòêè ñòðîê, îïèñàíû áîëåå ïîäðîáíî. VBA-ôóíêöèè îáðà-
152 Ãëàâà 4

áîòêè ñòðîê èìåþò âàæíîå çíà÷åíèå, ïîýòîìó îòäåëüíûé ðàçäåë ýòîé ãëàâû ïî-
ñâÿùåí ñïîñîáàì èõ èñïîëüçîâàíèÿ.

Ìàòåìàòè÷åñêèå ôóíêöèè
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 — óãîë â ðàäèàíàõ.

Ôóíêöèè Fix è Int óêîðà÷èâàþò öåëûå, òî åñòü, îíè îòáðàñûâàþò äðîáíóþ


÷àñòü ÷èñëà áåç îêðóãëåíèÿ. Åäèíñòâåííîå ðàçëè÷èå ìåæäó ôóíêöèÿìè Fix è
Int — ýòî òî, êàê îíè îáðàáàòûâàþò îòðèöàòåëüíûå ÷èñëà.
Äîïîëíèòåëüíûå òðèãîíîìåòðè÷åñêèå ôóíêöèè ìîæíî âûâîäèòü èç áàçî-
âûõ ìàòåìàòè÷åñêèõ ôóíêöèé VBA. Íàïðèìåð, åñëè íåîáõîäèìî âû÷èñëèòü
êîòàíãåíñ óãëà, äëÿ åãî íàõîæäåíèÿ ìîæíî èñïîëüçîâàòü ôîðìóëó 1/Tan(x).
 ãëàâå 4 îïèñûâàåòñÿ, êàê ïèñàòü ñîáñòâåííûå ôóíêöèè äëÿ ñîçäàíèÿ ïðîèç-
âîäíûõ ìàòåìàòè÷åñêèõ ôóíêöèé.
Ôóíêöèè â Visual Basic 153

Ôóíêöèè ïðåîáðàçîâàíèÿ äàííûõ


Visual Basic ïðåäîñòàâëÿåò íåñêîëüêî ôóíêöèé äëÿ ïðåîáðàçîâàíèÿ îäíîãî
òèïà äàííûõ â äðóãîé. Èñïîëüçóéòå ýòè ôóíêöèè äëÿ óñòðàíåíèÿ îøèáîê íå-
ñîâïàäåíèÿ òèïîâ è îáåñïå÷åíèÿ ÿâíîãî êîíòðîëÿ çà òèïàìè äàííûõ â âûðàæå-
íèÿõ.
Íàïðèìåð, ïðè ïîëó÷åíèè ñîîáùåíèÿ îá îøèáêå íåñîâïàäåíèÿ òèïîâ â îï-
ðåäåëåííîì âûðàæåíèè ìîæíî ïðåîáðàçîâàòü çíà÷åíèÿ â âûðàæåíèè â òèïû,
ñîâìåñòèìûå äðóã ñ äðóãîì, èñïîëüçóÿ ôóíêöèè ïðåîáðàçîâàíèÿ. Èëè æå ìîæ-
íî ñîõðàíÿòü ðåçóëüòàò âûðàæåíèÿ â äèàïàçîíå ÷èñëåííîãî òèïà Single (áîëü-
øèíñòâî ÷èñëåííûõ âûðàæåíèé èìåþò ðåçóëüòàòîì çíà÷åíèå òèïà Double);
â òàêîì ñëó÷àå ñëåäóåò èñïîëüçîâàòü ôóíêöèþ CSng äëÿ ïðåîáðàçîâàíèÿ ðå-
çóëüòàòà âûðàæåíèÿ â ÷èñëî òèïà Single, êàê ïîêàçàíî â ëèñòèíãå 4.2.

Ëèñòèíã 4.2. Èñïîëüçîâàíèå ôóíêöèè CSng


1: Sub CSngDemo()
2: Dim d_Var1 As Double
3: Dim s_Var2
4: d_Var1 = 412
5: s_Var2 = CSng(352 / 17)
6: MsgBox TypeName(s_Var2)
7: End Sub

Ïðîâåðüòå, êàê ðàáîòàåò êîä ëèñòèíãà 4.2.


 òàáë. 4.4 ïðèâåäåíû ôóíêöèè ïðåîáðàçîâàíèÿ äàííûõ â VBA.  ýòîé òàá-
ëèöå N — ýòî ëþáîå ÷èñëåííîå, S — ëþáîå ñòðîêîâîå, à E — âûðàæåíèå ëþáîãî
òèïà. Àðãóìåíòû êàæäîé ôóíêöèè ÿâëÿþòñÿ îáÿçàòåëüíûìè, åñëè íå óêàçàíî
èíà÷å.
Òàáëèöà 4.4. Ôóíêöèè ïðåîáðàçîâàíèÿ äàííûõ

Ôóíêöèÿ
Âîçâðàùàåò/äåéñòâèå
(àðãóìåíòû)
Âîçâðàùàåò ÷èñëî êîäà ñèìâîëà, ñîîòâåòñòâóþùåå ïåðâîé áóêâå
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)
÷èñëåííîå èëè ñòðîêîâîå âûðàæåíèå.

Íàèáîëåå ÷àñòî èñïîëüçóåìûå ôóíêöèè — ýòî ôóíêöèè (îáúåäèíåííûå


â êîíöå òàáë. 4.4 â ãðóïïó), íà÷èíàþùèåñÿ ñ áóêâû Ñ (îò ñëîâà conversion), çà
êîòîðûìè ñëåäóåò ñîêðàùåíèå èìåíè òèïà: CStr, CSng, CDbl è òàê äàëåå.

Ôóíêöèè äàòû è âðåìåíè


VBA-ôóíêöèè äàòû è âðåìåíè îáû÷íî èñïîëüçóþòñÿ äëÿ ïîëó÷åíèÿ òåêó-
ùåé äàòû è âðåìåíè, ðàçáèåíèÿ çíà÷åíèÿ äàòû íà åå ñîñòàâëÿþùèå ÷àñòè èëè
äëÿ ïðåîáðàçîâàíèÿ ñòðîê è ÷èñåë â çíà÷åíèÿ òèïà Date.
 òàáëèöå 4.5 ïðèâåäåíû VBA-ôóíêöèè äàòû è âðåìåíè è èõ äåéñòâèå.
 ýòîé òàáëèöå N — ëþáîå äîïóñòèìîå ÷èñëåííîå âûðàæåíèå, à D — ëþáîå äî-
ïóñòèìîå âûðàæåíèÿ òèïà Date (âêëþ÷àÿ çíà÷åíèÿ òèïà Date, ÷èñëà èëè
Ôóíêöèè â Visual Basic 155

ñòðîêè, êîòîðûå VBA ìîæåò ïðåîáðàçîâàòü â äàòó). Âñå àðãóìåíòû ôóíêöèé


â ýòîé òàáëèöå ÿâëÿþòñÿ îáÿçàòåëüíûìè, åñëè íå óêàçàíî èíà÷å.
Òàáëèöà 4.5. Ôóíêöèè äàòû è âðåìåíè

Ôóíêöèè
Âîçâðàùàåò/äåéñòâèå
(àðãóìåíòû)
Âîçâðàùàåò ñèñòåìíóþ äàòó. Ìîæíî òàêæå èñïîëüçîâàòü ýòó
ôóíêöèþ êàê ïðîöåäóðó äëÿ óñòàíîâêè ñèñòåìíûõ ÷àñîâ
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.6. Ñòðîêîâûå ôóíêöèè

Ôóíêöèÿ (àðãóìåíò) Âîçâðàùàåò/äåéñòâèå


Âîçâðàùàåò ïîëîæåíèå S2 â S1. N1 — íà÷àëüíîå
InStr([N1,] S1, S2[, ïîëîæåíèå äëÿ ïîèñêà; N2 îïðåäåëÿåò òèï ñðàâíåíèÿ. N1 è
N2]) N2 íåîáÿçàòåëüíû. Åñëè N2 îïóñêàåòñÿ, òî äëÿ ïîèñêà
èñïîëüçóåòñÿ òåêóùàÿ óñòàíîâêà Option Compare.
Âîçâðàùàåò ïîçèöèþ ïîÿâëåíèÿ ñòðîêè S2 âíóòðè S1,
InStrRev(S1, S2 [, â íàïðàâëåíèè îò êîíöà (èëè N1) ê íà÷àëó ñòðîêè. N2
N1[, N2]]) îïðåäåëÿåò òèï ñðàâíåíèÿ. Åñëè N2 îïóñêàåòñÿ, òî äëÿ
ïîèñêà èñïîëüçóåòñÿ òåêóùàÿ óñòàíîâêà Option Compare.
Âîçâðàùàåò ñòðîêó (òèï String), ñîäåðæàùóþ êîïèþ S ñî
LCase(S) âñåìè ñèìâîëàìè âåðõíåãî ðåãèñòðà, ïðåîáðàçîâàííûìè â
ñèìâîëû íèæíåãî ðåãèñòðà.
Âîçâðàùàåò ñòðîêó; êîïèðóåò N ñèìâîëîâ èç S, íà÷èíàÿ ñ
Left(S, N)
ëåâîãî êðàéíåãî ñèìâîëà S.
Âîçâðàùàåò ÷èñëî ñèìâîëîâ â S, âêëþ÷àÿ íà÷àëüíûå è
Len(S)
êîíå÷íûå ïðîáåëû.
Âîçâðàùàåò êîïèþ ñòðîêè S ïîñëå óäàëåíèÿ ñèìâîëîâ
LTrim(S)
ïðîáåëà èç ëåâîé ÷àñòè ñòðîêè (íà÷àëüíûå ïðîáåëû).
Âîçâðàùàåò ñòðîêó; êîïèðóåò N2 ñèìâîëîâ èç S, íà÷èíàÿ ñ
ïîçèöèè ñèìâîëà â S, çàäàííîé àðãóìåíòîì N1. N2
Mid(S, N1, N2) ÿâëÿåòñÿ íåîáÿçàòåëüíûì; åñëè N2 îïóùåí, òî Mid
âîçâðàùàåò âñå ñèìâîëû â ñòðîêå S îò ïîçèöèè N1 äî êîíöà
ñòðîêè.
Âîçâðàùàåò çíà÷åíèå òèïà String; êîïèðóåò N ñèìâîëîâ èç
Right(S, N) S, íà÷èíàÿ ñ ïðàâîãî êðàéíåãî ñèìâîëà S. Íàïðèìåð,
Right(«outright», 5) âîçâðàùàåò ñòðîêó «right».
Âîçâðàùàåò êîïèþ ñòðîêè S ïîñëå óäàëåíèÿ ñèìâîëîâ
RTrim(S)
ïðîáåëà èç ïðàâîé ÷àñòè ñòðîêè (êîíå÷íûå ñèìâîëû).
Space(N) Âîçâðàùàåò ñòðîêó ïðîáåëîâ äëèíîé N ñèìâîëîâ.
Ñðàâíèâàåò S1 ñ S2 è âîçâðàùàåò ÷èñëî, îáîçíà÷àþùåå
ðåçóëüòàò ñðàâíåíèÿ: –1, åñëè S1 < S2; 0, åñëè S1 = S2; 1,
åñëè S1 > S2. N ÿâëÿåòñÿ íåîáÿçàòåëüíûì è óêàçûâàåò,
StrComp(S1, S2, N)
ñëåäóåò ëè âûïîëíÿòü ñðàâíåíèå ñ ó÷åòîì ðåãèñòðà. Åñëè N
îïóñêàåòñÿ, ñòðîêè ñðàâíèâàþòñÿ ñ èñïîëüçîâàíèåì òåêóùåé
óñòàíîâêè Option Compare.
158 Ãëàâà 4

Ôóíêöèÿ (àðãóìåíò) Âîçâðàùàåò/äåéñòâèå


Âîçâðàùàåò ñòðîêó, ïðåîáðàçîâàííóþ â íîâóþ ôîðìó â
çàâèñèìîñòè îò ÷èñëîâîãî êîäà, çàäàííîãî àðãóìåíòîì N.
VBA ïðåäîñòàâëÿåò âíóòðåííèå êîíñòàíòû äëÿ
èñïîëüçîâàíèÿ ñ ôóíêöèåé StrConv; íàèáîëåå ïîëåçíûìè
StrConv(S, N) ÿâëÿþòñÿ: vbProperCase (ïðåîáðàçóåò ñòðîêó òàê, ÷òî
êàæäàÿ áóêâà, íà÷èíàþùàÿ ñëîâî, ñòàíîâèòñÿ çàãëàâíîé),
vbLowerCase (ïðåîáðàçóåò ñòðîêó â áóêâû íèæíåãî
ðåãèñòðà) è vbUpperCase (ïðåîáðàçóåò ñòðîêó â áóêâû
âåðõíåãî ðåãèñòðà).
Âîçâðàùàåò ñòðîêó äëèíîé N ñèìâîëîâ, ñîñòîÿùóþ èç
String(N, S) ñèìâîëà, çàäàííîãî ïåðâûì ñèìâîëîì â S. Íàïðèìåð, String
(5, «x») âîçâðàùàåò ñòðîêó «õõõõõ».
Âîçâðàùàåò êîïèþ ñòðîêè S ïîñëå óäàëåíèÿ íà÷àëüíûõ è
Trim(S)
êîíå÷íûõ ñèìâîëîâ ïðîáåëà èç ýòîé ñòðîêè.
Âîçâðàùàåò S ñî âñåìè ñèìâîëàìè íèæíåãî ðåãèñòðà,
UCase(S)
ïðåîáðàçîâàííûìè â ñèìâîëû âåðõíåãî ðåãèñòðà.

Íåñêîëüêî ïåðå÷èñëåííûõ â òàáë. 4.6 ôóíêöèé ïðåîáðàçîâàíèÿ òèïà äàí-


íûõ îòíîñÿòñÿ òàêæå ê ìàíèïóëèðîâàíèþ ñòðîêàìè: Chr, Format, CStr, â ÷à-
ñòíîñòè.

Èñïîëüçîâàíèå ôóíêöèé äëÿ ìàíèïóëèðîâàíèÿ ñòðîêàìè


Ìàíèïóëèðîâàíèå ñòðîêîâûìè äàííûìè ÿâëÿåòñÿ âàæíîé ÷àñòüþ ìíîãèõ
ïðîãðàìì, îñîáåííî ïðîãðàìì, êîòîðûå âçàèìîäåéñòâóþò ñ ïîëüçîâàòåëåì. Èí-
òåðàêòèâíûå ïðîãðàììû äîëæíû ìàíèïóëèðîâàòü ñòðîêàìè ïî äâóì ïðè÷è-
íàì: äëÿ ôîðìóëèðîâêè ñîîáùåíèé, êîòîðûå íåîáõîäèìî îòîáðàæàòü äëÿ
ïîëüçîâàòåëÿ, è èç-çà òîãî, ÷òî âõîäíûå äàííûå ïîëüçîâàòåëÿ ââîäÿòñÿ â âàøó
ïðîãðàììó (ïîñðåäñòâîì MsgBox) êàê ñòðîêîâûå äàííûå.
×åì ëó÷øå âû íàó÷èòåñü ìàíèïóëèðîâàòü ñòðîêàìè, òåì âåðîÿòíåå, ÷òî âû
áóäåòå ñïîñîáíû îòîáðàæàòü ïðèåìëåìûå, ñîãëàñîâàííûå ñîîáùåíèÿ äëÿ ïîëü-
çîâàòåëÿ âàøåé ïðîãðàììû. Êðîìå òîãî, ÷åì ëó÷øå âû óìååòå ìàíèïóëèðîâàòü
ñòðîêàìè, òåì âåðîÿòíåå, ÷òî âû ñìîæåòå óñïåøíî àíàëèçèðîâàòü ñòðîêè, ââî-
äèìûå ïîëüçîâàòåëåì âàøåé ïðîãðàììû.
VBA èìååò ðàçëè÷íûå ôóíêöèè â êà÷åñòâå ñðåäñòâ, ïîìîãàþùèõ ìàíèïóëè-
ðîâàòü ñòðîêîâûìè äàííûìè. Â ýòîì è ñëåäóþùåì ðàçäåëàõ îïèñûâàåòñÿ, êàê
èñïîëüçîâàòü íàèáîëåå âàæíûå ñòðîêîâûå ôóíêöèè è íåêîòîðûå èç ôóíêöèé
ïðåîáðàçîâàíèÿ äàííûõ äëÿ âûïîëíåíèÿ êàê ïðîñòûõ, òàê è ñëîæíûõ îïåðà-
öèé íàä ñòðîêîâûìè äàííûìè â ïðîãðàììàõ.

Óäàëåíèå íåíóæíûõ ñèìâîëîâ


Èíîãäà ñòðîêè â ïðîãðàììå ñîäåðæàò íåíóæíûå ñèìâîëû ïðîáåëîâ â êîíöå
èëè â íà÷àëå ñòðîêè. Ýòè íà÷àëüíûå è êîíå÷íûå ïðîáåëû ïîÿâëÿþòñÿ ïî ðàç-
íûì ïðè÷èíàì.
Îäèí èç íàèáîëåå ðàñïðîñòðàíåííûõ ñëó÷àåâ ïîÿâëåíèÿ íà÷àëüíûõ èëè êî-
íå÷íûõ ïðîáåëîâ — êîãäà èñïîëüçóåòñÿ ôóíêöèÿ InputBox äëÿ ïîëó÷åíèÿ
äàííûõ ââîäà îò ïîëüçîâàòåëÿ. InputBox âîçâðàùàåò âåñü òåêñò, ââîäèìûé
Ôóíêöèè â Visual Basic 159

ïîëüçîâàòåëåì, âêëþ÷àÿ ëþáûå ëèøíèå ñèìâîëû ïðîáåëà. Åñëè ïîëüçîâàòåëü


ââîäèò ëèøíèå ñèìâîëû ïðîáåëà ïåðåä èëè ïîñëå ôàêòè÷åñêîãî çíà÷åíèÿ ââî-
äà, ôóíêöèÿ InputBox âîçâðàùàåò ýòè ñèìâîëû êàê ÷àñòü ââîäèìîé ñòðîêè.
Äðóãàÿ ðàñïðîñòðàíåííàÿ ïðè÷èíà íà÷àëüíûõ è êîíå÷íûõ ñèìâîëîâ — êî-
ãäà èñïîëüçóåòñÿ ñîäåðæèìîå ñòðîêîâîé ïåðåìåííîé ôèêñèðîâàííîé äëèíû.
Ñòðîêà ôèêñèðîâàííîé äëèíû âñåãäà èìååò îäíó è òó æå äëèíó, è VBA ïðè íå-
îáõîäèìîñòè äîïîëíÿåò äàííûå, ïðèñâîåííûå ýòîé ñòðîêîâîé ïåðåìåííîé
(îáû÷íî êîíå÷íûìè ïðîáåëàìè), ÷òîáû çàïîëíèòü îáúÿâëåííóþ äëèíó ñòðîêè.
 ðåçóëüòàòå âñÿêèé ðàç, êîãäà èñïîëüçóåòñÿ ñòðîêà ôèêñèðîâàííîé äëèíû,
âîçíèêàåò âåðîÿòíîñòü òîãî, ÷òî îíà áóäåò ñîäåðæàòü êîíå÷íûå ïðîáåëû.
Ïîñòîðîííèå íà÷àëüíûå èëè êîíå÷íûå ïðîáåëû â ñòðîêå ìîãóò âûçâàòü ðàç-
ëè÷íûå ïðîáëåìû: íåêîòîðûå — òîëüêî «êîñìåòè÷åñêèå», äðóãèå — áîëåå
ñåðüåçíûå. Êîãäà ñòðîêè òðàíñëèðóþòñÿ äëÿ âûâîäà íà ýêðàí, ëèøíèå ïðîáå-
ëû ìîãóò ïðèâåñòè ê áîëüøèì ïðîìåæóòêàì â òåêñòå, ïðè ýòîì îòîáðàæàåòñÿ
íåïðèåìëåìûé è òðóäíî÷èòàåìûé òåêñò.  äðóãèõ ñëó÷àÿõ ïîñòîðîííèå íà-
÷àëüíûå è êîíå÷íûå ïðîáåëû ìîãóò ïîâëèÿòü íà ñðàâíåíèÿ ñòðîê, íà ñîîáùàå-
ìóþ äëèíó ñòðîêè è íà íåêîòîðûå äðóãèå ôàêòîðû. Ýòî ìîæåò ïðèâåñòè ê
òîìó, ÷òî ñòðîêîâîå çíà÷åíèå íå áóäåò èñïîëüçîâàòüñÿ â êàêîì-ëèáî äðóãîì
âûðàæåíèè èëè ïðîöåäóðà âûäàñò îøèáî÷íûé ðåçóëüòàò.  ëþáîì èç ýòèõ ñëó-
÷àåâ ìîæåò âîçíèêíóòü ñåðüåçíàÿ ïðîáëåìà.
 VBA èìåþòñÿ òðè ôóíêöèè, ñïåöèàëüíî ïðåäíàçíà÷åííûå äëÿ óäàëåíèÿ
íåæåëàòåëüíûõ íà÷àëüíûõ è êîíå÷íûõ ïðîáåëîâ èç ñòðîêè. Ïåðâàÿ ôóíê-
öèÿ — RTrim — óäàëÿåò ñèìâîëû ïðîáåëà èç ïðàâîé ÷àñòè ñòðîêè (êîíå÷íûå
ïðîáåëû). Âòîðàÿ ôóíêöèÿ — LTrim — óäàëÿåò ñèìâîëû ïðîáåëà èç ëåâîé ÷àñ-
òè ñòðîêè (íà÷àëüíûå ïðîáåëû). Òðåòüÿ ôóíêöèÿ — Trim — óäàëÿåò êàê íà-
÷àëüíûå, òàê è êîíå÷íûå ïðîáåëû èç ñòðîêè.
Ýòè ôóíêöèè, íà ñàìîì äåëå, íå èçìåíÿþò ñòðîêó; âû ïåðåäàåòå ñòðîêó, èç
êîòîðîé äîëæíû áûòü âûðåçàíû ïðîáåëû, êàê àðãóìåíò ôóíêöèè, è ôóíêöèÿ
âîçâðàùàåò êîïèþ ñòðîêè ñ óäàëåííûìè ëèøíèìè ïðîáåëàìè. Ïðîöåäóðà â
ëèñòèíãå 4.3 äåìîíñòðèðóåò èñïîëüçîâàíèå ôóíêöèé óäàëåíèÿ ïðîáåëîâ èç
ñòðîêè.

Ëèñòèíã 4.3. Äåìîíñòðàöèÿ ôóíêöèé RTrim, LTrim è Trim


1: Sub TrimDemo()
2: Dim ExSpace As String
3: ExSpace = " mad dog "
4: msg = "{" & ExSpace & "}"
5: MsgBox "{" & ExSpace & "}", , "Äî èçìåíåíèÿ"
6: MsgBox "{" & RTrim(ExSpace) & "}", , "Áåç ïðàâûõ ïðîáåëîâ"
7: MsgBox "{" & LTrim(ExSpace) & "}", , "Áåç ëåâûõ ïðîáåëîâ"
8: MsgBox "{" & Trim(ExSpace) & "}", , "Áåç ïðîáåëîâ"
9: End Sub

 ñòðîêå 3 ïåðåìåííîé ExSpace (îáúÿâëåííîé â ñòðîêå 2) ïðèñâàèâàåòñÿ


ñòðîêà « mad dog » (ñ íà÷àëüíûìè è êîíå÷íûìè ïðîáåëàìè).  ñòðîêå 4 èñ-
ïîëüçóåòñÿ ôóíêöèÿ MsgBox äëÿ îòîáðàæåíèÿ åùå íåèçìåíåííîé ñòðîêè
ExSpace. Ñòðîêîâîå âûðàæåíèå äëÿ àðãóìåíòà MsgBox êîíêàòåíèðóåò ïàðó
ôèãóðíûõ ñêîáîê âîêðóã ñòðîêè ExSpace, ÷òîáû ïîêàçàòü, èìåþòñÿ ëè íà÷àëü-
íûå èëè êîíå÷íûå ïðîáåëû â ñòðîêå. Ñòðîêè 5–7 ëèñòèíãà 4.3 — êàæäàÿ èñ-
ïîëüçóþò îäíó èç òðåõ ôóíêöèé äëÿ óäàëåíèÿ íà÷àëüíûõ è êîíå÷íûõ ïðîáå-
160 Ãëàâà 4

ëîâ èç ñòðîêè ExSpace; êàæäàÿ ñòðîêà èñïîëüçóåò MsgBox äëÿ îòîáðàæåíèÿ


ðåçóëüòàòà ôóíêöèè óäàëåíèÿ ïðîáåëîâ. Ðåçóëüòàò ðàáîòû êîäà ïðåäñòàâëåí
íà ðèñ. 4.4.

Ðèñ. 4.4
Äèàëîãîâûå îêíà êàê ðåçóëüòàò âûïîëíåíèÿ êîäà
ëèñòèíãà 4.3

Ñëåäóåò èñïîëüçîâàòü ôóíêöèþ Trim äëÿ óäàëåíèÿ íà÷àëüíûõ è êîíå÷íûõ


ïðîáåëîâ èç ñòðîê ïåðåä èõ ñðàâíåíèåì; ýòèì ïðåäîòâðàùàåòñÿ âëèÿíèå íà-
÷àëüíûõ è êîíå÷íûõ ïðîáåëîâ íà ñðàâíåíèå ñòðîê, ÷òî îáû÷íî íå ÿâëÿåòñÿ ñó-
ùåñòâåííûì äëÿ ïîëüçîâàòåëÿ, íî èìååò çíà÷åíèå äëÿ VBA.

Îïðåäåëåíèå äëèíû ñòðîêè


×àñòî áûâàåò íåîáõîäèìî çíàòü äëèíó ñòðîêè (êàêîå êîëè÷åñòâî ñèìâîëîâ
íàõîäèòñÿ â ñòðîêå), íàïðèìåð, ïðè ôîðìàòèðîâàíèè ñîîáùåíèé äëÿ ïîëüçîâà-
òåëÿ èëè ïðè ôîðìàòèðîâàíèè ñòðîêîâûõ äàííûõ, ââîäèìûõ ïðîöåäóðîé â ðà-
áî÷èé ëèñò Excel èëè äîêóìåíò Word. VBA èìååò ôóíêöèþ Len, ïîçâîëÿþùóþ
ïîëó÷àòü äëèíó ñòðîêè. Ñëåäóþùèé îïåðàòîð ïîêàçûâàåò îáùèé ñèíòàêñèñ
äëÿ ýòîé ôóíêöèè:
Ñèíòàêñèñ
Len(VString)
VString — ëþáîå äîïóñòèìîå ñòðîêîâîå âûðàæåíèå VBA. Íàïðèìåð, ñëåäóþùèé
îïåðàòîð ïîêàçûâàåò èñïîëüçîâàíèå ôóíêöèè â îïåðàòîðå ïðèñâàèâàíèÿ:
StrLen = Len("VBA") 'âîçâðàùàåò 3

Êàê è ðàíåå, ñòðîêè ôèêñèðîâàííîé äëèíû ïðåäñòàâëÿþò îñîáûé ñëó÷àé.


Ïîñêîëüêó ñòðîêà ôèêñèðîâàííîé äëèíû èìååò âñåãäà îäíó è òó æå äëèíó,
ôóíêöèÿ Len âñåãäà âîçâðàùàåò îáúÿâëåííóþ äëèíó ñòðîêè. Íàïðèìåð, ïðè
îáúÿâëåíèè FirstName â êà÷åñòâå ñòðîêîâîé ïåðåìåííîé, èìåþùåé äëèíó 20
ñèìâîëîâ, ôóíêöèÿ Len âñåãäà âîçâðàùàåò 20 êàê äëèíó ñòðîêè â FirstName;
äàæå åñëè â ïåðåìåííîé ñîõðàíåíî èìÿ Bob, èìåþùåå äëèíó òîëüêî 3 ñèìâîëà,
âñå îñòàëüíûå ñèìâîëû èç 20 ÿâëÿþòñÿ ñèìâîëàìè ïðîáåëà.
Îáû÷íî öåëüþ èñïîëüçîâàíèÿ ôóíêöèè Len ÿâëÿåòñÿ îïðåäåëåíèå òîãî,
ñêîëüêî ñèìâîëîâ èìååòñÿ â ñòðîêå, èñêëþ÷àÿ íà÷àëüíûå èëè êîíå÷íûå ïðîáå-
ëû. Âåðíåìñÿ ê ïðèìåðó ñ FirstName; åñëè íåîáõîäèìî óçíàòü ôàêòè÷åñêóþ
äëèíó èìåíè, ñîõðàíåííîãî â ïåðåìåííîé, èñïîëüçóéòå îïåðàòîð, ïîäîáíûé
ñëåäóþùåìó:
NameLen = Len(Trim(FirstName))
 ýòîì îïåðàòîðå ôóíêöèÿ Trim óäàëÿåò ëþáûå íà÷àëüíûå èëè êîíå÷íûå
ïðîáåëû èç ñòðîêè â ïåðåìåííîé, à ôóíêöèÿ Len ñîîáùàåò äëèíó ðåçóëüòèðóþ-
Ôóíêöèè â Visual Basic 161

ùåé ñòðîêè. Åñëè FirstName ñîäåðæèò «Ìîñêâà», òî ïåðåìåííàÿ NameLen áó-


äåò èìåòü ðåçóëüòàòîì çíà÷åíèå 6.

Ñðàâíåíèå è ïîèñê ñòðîê


 ãëàâå 3 áûëî îïèñàíî, êàê ñðàâíèâàòü ñòðîêè, èñïîëüçóÿ îïåðàòîðû ñðàâ-
íåíèÿ, è îáúÿñíÿëîñü äåéñòâèå óñòàíîâîê Option Compare Binary è Option Compare
Text.
VBA èìååò òàêæå äâå ôóíêöèè äëÿ ñðàâíåíèÿ ñòðîê. Ïåðâàÿ ôóíêöèÿ —
StrComp ïðîñòî ñðàâíèâàåò äâå ðàçíûå ñòðîêè. Ïðè íåêîòîðûõ îáñòîÿòåëüñò-
âàõ ëó÷øå èñïîëüçîâàòü StrComp âìåñòî îïåðàòîðîâ ñðàâíåíèÿ (=, <, >) äëÿ
ñðàâíåíèÿ ñòðîê, ïîòîìó ÷òî StrComp ïîçâîëÿåò óêàçûâàòü, ñëåäóåò ëè âûïîë-
íÿòü áèíàðíîå èëè òåêñòîâîå ñðàâíåíèå (íåçàâèñèìî îò óñòàíîâêè Option Com-
pare ìîäóëüíîãî óðîâíÿ) äëÿ ýòîãî îïðåäåëåííîãî ñðàâíåíèÿ.
Íàïðèìåð, åñëè íåîáõîäèìî, ÷òîáû áîëüøèíñòâî ñòðîêîâûõ ñðàâíåíèé èã-
íîðèðîâàëè ðåãèñòð (âåðõíèé èëè íèæíèé) ñèìâîëîâ ïðè ñðàâíåíèè ñòðîê, äî-
áàâüòå îïåðàòîð Option Compare Text ê ýòîìó ìîäóëþ. Ïîñëå ýòîãî ìîæíî
âûïîëíèòü êîíêðåòíîå ñðàâíåíèå ñòðîê, ÿâëÿþùååñÿ ÷óâñòâèòåëüíûì ê ðåãè-
ñòðó: èñïîëüçóéòå VBA-ôóíêöèþ StrComp è çàäàâàéòå ñðàâíåíèå ñ ó÷åòîì ðå-
ãèñòðà.

Èñïîëüçîâàíèå ôóíêöèè StrComp


Îáùèé ñèíòàêñèñ ôóíêöèè StrComp ñëåäóþùèé:
Ñèíòàêñèñ
StrComp(String1, String2 [, Compare])
String1 è String2 — ëþáûå äâà ñòðîêîâûõ âûðàæåíèÿ, êîòîðûå íåîáõîäèìî ñðàâ-
íèòü. Íåîáÿçàòåëüíûé àðãóìåíò Compare ìîæåò áûòü ëþáîé èç ñëåäóþùèõ ïðåäî-
ïðåäåëåííûõ êîíñòàíò:
vbBinaryCompare — äëÿ ñðàâíåíèÿ äâóõ ñòðîê ñ ïîìîùüþ áèíàðíîãî (ñ ó÷åòîì
ðåãèñòðà) ñðàâíåíèÿ;
vbTextCompare — äëÿ ñðàâíåíèÿ äâóõ ñòðîê ñ ïîìîùüþ òåêñòîâîãî (áåç ó÷åòà ðå-
ãèñòðà) ñðàâíåíèÿ;
vbDatabaseCompare — èìååò çíà÷åíèå òîëüêî â Microsoft Access; â ýòîì ñëó÷àå
ñòðîêîâîå ñðàâíåíèå èñïîëüçóåò ëþáîé ìåòîä ñðàâíåíèÿ, óñòàíîâëåííûé äëÿ òåêó-
ùåé áàçû äàííûõ. Ïðè èñïîëüçîâàíèè êîíñòàíòû vbDatabaseCompare â êàêîì
ëèáî äðóãîì ïðîãðàììíîì ïðîäóêòå VBA, à íå â Access VBA, îòîáðàæàåòñÿ ñîîáùå-
íèå îá îøèáêå âðåìåíè èñïîëíåíèÿ, êîíñòàòèðóþùåå íàëè÷èå íåäîïóñòèìîãî àð-
ãóìåíòà ïðîöåäóðû.
Åñëè àðãóìåíò Compare îïóñêàåòñÿ, StrComp èñïîëüçóåò òåêóùóþ óñòàíîâêó
Option Compare. Ïðè âûïîëíåíèè StrComp ñðàâíèâàþòñÿ äâå ñòðîêè ñ èñïîëüçîâà-
íèåì çàäàííîãî ìåòîäà ñðàâíåíèÿ è âîçâðàùàåòñÿ îäíî èç ñëåäóþùèõ çíà÷åíèé:
–1, åñëè String1 ìåíüøå String2
0, åñëè String1 è String2 ðàâíû äðóã äðóãó
1, åñëè String1 áîëüøå String2

Ïðîöåäóðà â ëèñòèíãå 4.4 äåìîíñòðèðóåò èñïîëüçîâàíèå ôóíêöèè StrComp.

Ëèñòèíã 4.4. Äåìîíñòðàöèÿ ôóíêöèè StrComp


1: Sub Demo_STRComp()
162 Ãëàâà 4

2: Const Óìîë÷àíèå = " STRComp"


3: Dim ÑòðîêàÂâîäà As String
4: ÑòðîêàÂâîäà = InputBox(Prompt:="Ââåäèòå íåêîòîðûé òåêñò:", _
5: Title:="Ñðàâíåíèå ñòðîê", _
6: Default:= Óìîë÷àíèå)
7: MsgBox StrComp(ÑòðîêàÂâîäà, Óìîë÷àíèå, vbTextCompare)
8: End Sub

 ñòðîêå 2 îáúÿâëÿåòñÿ êîíñòàíòà äëÿ èñïîëüçîâàíèÿ â êà÷åñòâå òåêñòà ïî


óìîë÷àíèþ â ïîñëåäóþùåì îïåðàòîðå InputBox.  ñòðîêå 3 îáúÿâëÿåòñÿ ñòðî-
êîâàÿ ïåðåìåííàÿ ÑòðîêàÂâîäà äëÿ ñîõðàíåíèÿ ðåçóëüòàòà ôóíêöèè Input-
Box. Ñòðîêè 4–6 ÿâëÿþòñÿ îäíèì îïåðàòîðîì, âûçûâàþùèì ôóíêöèþ Input-
Box äëÿ ïîëó÷åíèÿ ñòðîêè îò ïîëüçîâàòåëÿ. Âûçîâ ôóíêöèè InputBox èñïîëü-
çóåò èìåíîâàííûå àðãóìåíòû è çàäàåò çàãîëîâîê äèàëîãîâîãî îêíà è
ïðåäëàãàåìîå çíà÷åíèå ïî óìîë÷àíèþ. Ðåçóëüòàò ôóíêöèè InputBox ïðèñâàè-
âàåòñÿ ïåðåìåííîé ÑòðîêàÂâîäà. Ñòðîêà 7 ñîäåðæèò âûçîâ ôóíêöèè StrComp;
îïåðàòîð èñïîëüçóåò MsgBox äëÿ âûâîäà âîçâðàùàåìîãî çíà÷åíèÿ ôóíêöèè
StrComp íåïîñðåäñòâåííî íà ýêðàí. Â ðåçóëüòàòå êîä îïðåäåëÿåò, ïðèíÿë ëè
ïîëüçîâàòåëü òåêñò ïî óìîë÷àíèþ èëè ââåë îòëè÷íóþ îò ýòîãî òåêñòà ñòðîêó.

Èñïîëüçîâàíèå ôóíêöèè InStr


Äðóãàÿ VBA-ôóíêöèÿ ñðàâíåíèÿ ñòðîê, InStr, äàåò âîçìîæíîñòü îïðåäå-
ëèòü, ñîäåðæèò ëè îäíà ñòðîêà äðóãóþ ñòðîêó. Ýòà ôóíêöèÿ ïîëåçíà â ðÿäå
ñëó÷àåâ. Íàïðèìåð, èñïîëüçóéòå InStr, åñëè íåîáõîäèìî îïðåäåëèòü, ñîäåð-
æèò ëè ââåäåííàÿ ïîëüçîâàòåëåì ñòðîêà îïðåäåëåííîå ñëîâî. Äðóãîé ïðèìåð:
èñïîëüçóéòå InStr, åñëè íåîáõîäèìî îïðåäåëèòü, ñîäåðæèò ëè ñòðîêà ñèìâî-
ëû, íå ïîçâîëÿþùèå ïðåîáðàçîâàòü åå â ÷èñëî.
Ñèíòàêñèñ ôóíêöèè InStr:
Ñèíòàêñèñ
InStr([Start, ] String1, String2 [, Compare])
String1 è String2 — ëþáûå äîïóñòèìûå ñòðîêîâûå âûðàæåíèÿ. InStr ïðîâåðÿåò,
ñîäåðæèòñÿ ëè String1 â String2. Íåîáÿçàòåëüíûé àðãóìåíò Start ÿâëÿåòñÿ ëþáûì
÷èñëåííûì âûðàæåíèåì; ýòîò àðãóìåíò (åñëè èñïîëüçóåòñÿ) óêàçûâàåò ïîëîæåíèå
ñèìâîëà â String1, ñ êîòîðîãî äîëæíà íà÷èíàòüñÿ ïðîâåðêà. Íåîáÿçàòåëüíûé
àðãóìåíò Compare îïðåäåëÿåò, äîëæíà ëè InStr èñïîëüçîâàòü äâîè÷íîå èëè
òåêñòîâîå ñðàâíåíèå. Äîïóñòèìûìè çíà÷åíèÿìè äëÿ àðãóìåíòà Compare ôóíêöèè
InStr ÿâëÿþòñÿ òå æå ïðåäîïðåäåëåííûå êîíñòàíòû, êîòîðûå èñïîëüçóþòñÿ
ôóíêöèåé StrComp: vbBinaryCompare, vbTextCompare è vbDatabaseCompare.

Ôóíêöèÿ InStr âîçâðàùàåò ÷èñëî, îáîçíà÷àþùåå ïîëîæåíèå ñèìâîëà â


String1, ãäå áûëî îáíàðóæåíî String2; åñëè InStr íå íàõîäèò String2 â String1,
òî îíà âîçâðàùàåò 0. Åñëè String1 (èëè String2) ðàâíî Null, òî Instr âîçâðàùàåò
Null.
 ëèñòèíãå 4.5 äåìîíñòðèðóåòñÿ èñïîëüçîâàíèå InStr.

Ëèñòèíã 4.5. Äåìîíñòðàöèÿ ôóíêöèè InStr


1: Sub Demo_InStr()
2: Const Óìîë÷àíèå = "InStr"
3: Dim ÑòðîêàÂâîäà As String
4: ÑòðîêàÂâîäà = InputBox(Prompt:="Ââåäèòå íåêîòîðûé òåêñò:", _
Ôóíêöèè â Visual Basic 163

5: Title:="Ñðàâíåíèå ñòðîê", _
6: Default:= Óìîë÷àíèå)
7: MsgBox InStr(1, ÑòðîêàÂâîäà, Óìîë÷àíèå, vbTextCompare)
8: End Sub

 ñòðîêå 7 ïðîâåðÿåòñÿ, ñîäåðæèòñÿ ëè â ñòðîêå ÑòðîêàÂâîäà ñòðîêà, îáî-


çíà÷åííàÿ êîíñòàíòîé Óìîë÷àíèå. Èñïîëüçóåòñÿ òåêñòîâîå ñðàâíåíèå, óêàçàíî
íà÷àëüíîå ïîëîæåíèå äëÿ ïîèñêà. InStr íà÷èíàåò ïîèñê ñòðîêè Óìîë÷àíèå ñ
ïåðâîãî ñèìâîëà ñòðîêè ÑòðîêàÂâîäà.

Ðàçáèåíèå ñòðîêè íà ìåíüøèå ÷àñòè


Âî ìíîãèõ ïðîöåäóðàõ áûâàåò íåîáõîäèìî ðàçáèòü ñòðîêó íà ñîñòàâëÿþùèå
÷àñòè. Íàïðèìåð, ìîæåò ïîíàäîáèòüñÿ ïðîàíàëèçèðîâàòü ââîäèìóþ ïîëüçîâà-
òåëåì ñòðîêó, ÷òîáû îïðåäåëèòü, ñîäåðæèò ëè îíà áîëåå îäíîãî ñëîâà è, åñëè
ñîäåðæèò, ðàçäåëèòü åå íà îòäåëüíûå ñëîâà. Ïðèìåðû òàêîé îáðàáîòêè ñòðîê
âñòðå÷àþòñÿ â ïîñëåäóþùèõ ãëàâàõ.

Ôóíêöèÿ Left
VBA èìååò òðè ôóíêöèè äëÿ âûäåëåíèÿ ïîäñòðîê èç áîëüøèõ ñòðîê.
(Ïîäñòðîêà — ýòî ëþáàÿ ñòðîêà, êîòîðàÿ ÿâëÿåòñÿ èëè ìîæåò áûòü ÷àñòüþ
áîëüøåé ñòðîêè). Ïåðâàÿ èç íèõ — ýòî ôóíêöèÿ Left, âîçâðàùàþùàÿ êîïèþ
îïðåäåëåííîé ÷àñòè ñòðîêè. Äàëåå ñëåäóåò ñèíòàêñèñ ôóíêöèè Left:
Ñèíòàêñèñ
Left(String, Length)
Çäåñü String — ëþáîå äîïóñòèìîå ñòðîêîâîå âûðàæåíèå, à Length — ëþáîå ÷èñëåí-
íîå âûðàæåíèå. Ôóíêöèÿ Left âîçâðàùàåò êîïèþ String, íà÷èíàÿ ñ ïåðâîãî ñèìâî-
ëà è âêëþ÷àÿ êîëè÷åñòâî ñèìâîëîâ, çàäàííûõ ñ ïîìîùüþ Length. Åñëè Length ÿâëÿ-
åòñÿ ÷èñëîì, áîëüøèì, ÷åì ôàêòè÷åñêàÿ äëèíà String, òî Left âîçâðàùàåò âñå ñòðî-
êîâîå âûðàæåíèå String.

 ñëåäóþùåì îïåðàòîðå Left êîïèðóåò ïåðâûå 16 ñèìâîëîâ ñòðîêè OldStr è


âîçâðàùàåò ýòè ñèìâîëû êàê ñòðîêó; ýòîò îïåðàòîð ïðèñâàèâàåò ðåçóëüòàò
ôóíêöèè Left ïåðåìåííîé NewStr. Åñëè OldStr ñîäåðæèò ñòðîêó «Â ïóñòûíå
÷àõëîé è ñêóïîé», òî NewStr áóäåò ñîäåðæàòü «Â ïóñòûíå ÷àõëîé» (ïîñëå âû-
ïîëíåíèÿ ýòîãî îïåðàòîðà).
NewStr = Left(OldStr, 16)

Ôóíêöèÿ Right
Äðóãàÿ VBA-ôóíêöèÿ ïîäñòðîêè — ýòî ôóíêöèÿ Right. Äàëåå ñëåäóåò ñèí-
òàêñèñ Right:
Ñèíòàêñèñ
Right(String, Length)
Çäåñü String ïðåäñòàâëÿåò ëþáîå äîïóñòèìîå ñòðîêîâîå âûðàæåíèå, à Length —
ëþáîå ÷èñëåííîå âûðàæåíèå. Ôóíêöèÿ Right âîçâðàùàåò êîïèþ String, íà÷èíàÿ ñ
ïîñëåäíåãî ñèìâîëà â ñòðîêå è âêëþ÷àÿ ñïðàâà íàëåâî êîëè÷åñòâî ñèìâîëîâ,
óêàçàííîå ñ ïîìîùüþ Length. Åñëè Length ÿâëÿåòñÿ ÷èñëîì, áîëüøèì, ÷åì
ôàêòè÷åñêàÿ äëèíà String, òî Right âîçâðàùàåò âñå ñòðîêîâîå âûðàæåíèå String.
164 Ãëàâà 4

Ôóíêöèÿ Right âñåãäà êîïèðóåò ñèìâîëû îò êîíöà ñòðîêè, äåéñòâóÿ


â íàïðàâëåíèè ê íà÷àëó ñòðîêè.. Åñëè Length ÿâëÿåòñÿ ÷èñëîì, áîëüøèì, ÷åì
ôàêòè÷åñêàÿ äëèíà String, òî Left âîçâðàùàåò âñå ñòðîêîâîå âûðàæåíèå String.

 ñëåäóþùåì îïåðàòîðå ôóíêöèÿ Right âîçâðàùàåò ïîñëåäíèå âîñåìü ñèì-


âîëîâ ñòðîêè OldStr. Åñëè ïåðåìåííàÿ OldStr ñîäåðæèò ñòðîêó «Â ïóñòûíå
÷àõëîé è ñêóïîé», ýòîò îïåðàòîð ñîõðàíÿåò ñòðîêó «è ñêóïîé» â ïåðåìåííîé
NewStr.
NewStr = Right(OldStr, 8)
 áèçíåñ-ïðèëîæåíèÿõ ôóíêöèÿ Right ìîæåò áûòü ïîëåçíà, íàïðèìåð, ïðè
âûäåëåíèè èç íåêîòîðîãî êëþ÷åâîãî ïîëÿ íîìåðà íàêëàäíîé. Äëÿ òîãî, ÷òîáû
ñîçäàòü óíèêàëüíûé íîìåð íàêëàäíîé, êîòîðàÿ ñîçäàåòñÿ íà ñêëàäå ñ êîäîì,
íàïðèìåð «1011», çà îïðåäåëåííóþ äàòó, ìîæíî ñôîðìèðîâàòü íîìåð êàê
ñòðîêó âèäà:
'101101022001002'
Çäåñü ïåðâûå ÷åòûðå ñèìâîëà îáîçíà÷àþò êîä ñêëàäà, ñëåäóþùèå âîñåìü
ñèìâîëîâ ñîäåðæàò äàòó, à ïîñëåäíèå òðè — íîìåð íàêëàäíîé, íà÷èíàÿ ñ ïåð-
âîé â òåêóùèé äåíü. Åñëè êîä ñêëàäà âñåãäà ñîäåðæèò ÷åòûðå ñèìâîëà, òî äëÿ
áûñòðîãî (ñ ñìûñëå êðàòêîñòè êîäà) âûäåëåíèÿ ëþáîãî çíà÷åíèÿ èç âñåé ñòðî-
êè ìîæíî èñïîëüçîâàòü ôóíêöèþ Mid (ñì. äàëåå). Åñëè æå êîä ñêëàäà ìîæåò
ñîäåðæàòü ðàçëè÷íîå êîëè÷åñòâî ñèìâîëîâ, òî óäîáíåå ïîëüçîâàòüñÿ ôóíêöèåé
Right.

Ôóíêöèÿ Mid
Ìîæíî èçâëå÷ü ïîäñòðîêó èç ñåðåäèíû ñòðîêè, à íå èç ïðàâîé èëè ëåâîé åå
÷àñòè. Òàêàÿ ñèòóàöèÿ ìîæåò âîçíèêíóòü ïðè èçâëå÷åíèè îòäåëüíûõ ñëîâ èç
ñòðîêè òåêñòà. Äëÿ èçâëå÷åíèÿ ïîäñòðîêè èç ñåðåäèíû äðóãîé ñòðîêè VBA
èìååò ôóíêöèþ Mid. Ôóíêöèÿ Mid èìååò ñëåäóþùèé îáùèé ñèíòàêñèñ:
ÑÈÍÒÀÊÑÈÑ
Mid(String, Start [, Length])
Çäåñü String — ëþáîå ñòðîêîâîå âûðàæåíèå, òîãäà êàê Start è Length — ýòî ëþáûå
÷èñëåííûå âûðàæåíèÿ. Ôóíêöèÿ Mid âîçâðàùàåò êîïèþ String, íà÷èíàÿ ñ
ïîëîæåíèÿ ñèìâîëà â String, çàäàâàåìîãî ñ ïîìîùüþ àðãóìåíòà Start.
Íåîáÿçàòåëüíûé àðãóìåíò Length îïðåäåëÿåò êîëè÷åñòâî êîïèðóåìûõ â Mid
ñèìâîëîâ èç String. Åñëè Start ñîäåðæèò áîëüøåå ÷èñëî, ÷åì ôàêòè÷åñêàÿ äëèíà
String, òî Mid âîçâðàùàåò ïóñòóþ ñòðîêó.

Ñëåäóþùèé îïåðàòîð ïîêàçûâàåò ïðèìåð ôóíêöèè Mid:


NewStr = Mid(OldStr, 10, 5)
Åñëè ïåðåìåííàÿ OldStr ñîäåðæèò ñòðîêó «Áåñïå÷íûé ñûí ïðèðîäû», òî
ýòîò îïåðàòîð ñîõðàíÿåò ñòðîêó « ñûí » â ïåðåìåííîé NewStr.

Èñïîëüçîâàíèå ñèìâîëîâ, êîòîðûå íåëüçÿ ââåñòè ñ êëàâèàòóðû


Èíîãäà íåîáõîäèìî âêëþ÷èòü â ñòðîêó êàêîé-ëèáî ñèìâîë, äëÿ êîòîðîãî
íåò ñîîòâåòñòâóþùåé êëàâèøè íà êëàâèàòóðå, íàïðèìåð, áóêâó ãðå÷åñêîãî
ÿçûêà, ñèìâîë äëÿ éåíû èëè ñèìâîë àâòîðñêîãî ïðàâà.
Ôóíêöèè â Visual Basic 165

Ìîæåò ïîòðåáîâàòüñÿ òàêæå âêëþ÷èòü êàêîé-ëèáî ñèìâîë, êîòîðûé óæå


èìååò îñîáîå çíà÷åíèå äëÿ VBA, òàêîé êàê ñèìâîë êàâû÷åê ("). Âû íå ìîæåòå
âêëþ÷àòü ñèìâîëû, ïîäîáíûå êàâû÷êàì, íåïîñðåäñòâåííî â ñòðîêó, ïîòîìó
÷òî VBA âñåãäà «ïîäðàçóìåâàåò», ÷òî ýòîò ñèìâîë íà÷èíàåò èëè çàêàí÷èâàåò
ñòðîêó. Ñëåäóþùèé îïåðàòîð, íàïðèìåð, ïðèâîäèò ê îøèáêå âðåìåíè èñïîëíå-
íèÿ èëè îøèáêå ñèíòàêñèñà:
MsgBox "This "cannot" work"
Õîòÿ ýòîò îïåðàòîð ìîæåò ïðåäíàçíà÷àòüñÿ äëÿ âûâîäà íà ýêðàí ñòðîêè,
VBA íå ìîæåò âûïîëíèòü åãî. Ïîñêîëüêó êàâû÷êè (") óêàçûâàþò VBA íà òî,
÷òî ëèòåðàëüíàÿ ñòðîêà ëèáî íà÷èíàåòñÿ, ëèáî çàêàí÷èâàåòñÿ, VBA ðàçáèâàåò
âûøåïðèâåäåííûé àðãóìåíò MsgBox íà òðè ÷àñòè: ñòðîêó "This ", èìÿ ïåðå-
ìåííîé cannot è åùå îäíó ñòðîêó " work".
×òîáû âêëþ÷èòü â ñòðîêó ñèìâîëû, êîòîðûå íåâîçìîæíî ââåñòè ñ êëàâèàòó-
ðû, èëè êîòîðûå èìåþò îñîáîå çíà÷åíèå äëÿ VBA, èñïîëüçóéòå VBA-ôóíêöèþ
Chr. Ôóíêöèÿ Chr èìååò ñëåäóþùèé ñèíòàêñèñ:
ñèíòàêñèñ
Chr(Charcode)
Çäåñü Charcode — ëþáîå ÷èñëåííîå âûðàæåíèå, ÿâëÿþùååñÿ äîïóñòèìûì êîäîì
äëÿ íàáîðà ñèìâîëîâ, èñïîëüçóåìîãî êîìïüþòåðîì. Àðãóìåíò Charcode äîëæåí
áûòü ÷èñëîì îò 0 äî 255. Êàê âû ïîìíèòå èç îáñóæäåíèÿ äâîè÷íîãî è òåêñòîâîãî
ñðàâíåíèÿ ñòðîê, êîìïüþòåð ñîõðàíÿåò áóêâû âî âíóòðåííåé ïàìÿòè êàê ÷èñëà è
èñïîëüçóåò ñõåìó, â êîòîðîé êàæäûé ñèìâîë èìååò ñîáñòâåííûé óíèêàëüíûé
íîìåð. Ôóíêöèÿ Chr ïðèíèìàåò êîä îòäåëüíîãî ñèìâîëà â êà÷åñòâå àðãóìåíòà è
âîçâðàùàåò ñòðîêó, ñîäåðæàùóþ ñîîòâåòñòâóþùèé ýòîìó êîäó ñèìâîë.

×òîáû ïðîñìîòðåòü ñïèñîê êîäîâ, êîòîðûå ðàñïîçíàåò VBA, è ñîîòâåòñòâóþ-


ùèõ èì ñèìâîëîâ, îòêðîéòå ñïðàâî÷íóþ ñèñòåìó VBA è íàéäèòå ðàçäåë
Character sets. Íàïðèìåð, ïðè ïîèñêå êîäà ñèìâîëà êàâû÷åê (") îáíàðóæèâà-
åì, ÷òî êàâû÷êè èìåþò êîä 34. Èñïîëüçóÿ ôóíêöèþ Chr äëÿ ïðåäîñòàâëåíèÿ
êàâû÷åê, ñëåäóþùèé îïåðàòîð îòîáðàæàåò äèàëîãîâîå îêíî, ïðèâåäåííîå íà
ðèñ. 4.5:
MsgBox Chr(34) & "Çäîðîâî, çÿòü." & Chr(34) & " - " & Chr(34) & _
" Êòî òû" & Chr(34) & " - " & Chr(34) & _
" ß çäåøíèé âîðîí?" & Chr(34)

Ðèñ. 4.5
Ïðèìåð èñïîëüçîâàíèÿ ôóíêöèè Chr

Ìîæíî òàêæå óïðàâëÿòü ôîðìàòèðîâàíèåì îòîáðàæàåìûõ ñîîáùåíèé, äî-


áàâëÿÿ ñïåöèàëüíûå ñèìâîëû ê ñòðîêàì. Îäèí èç ñèìâîëîâ, êîòîðûå ìîæíî
ïîëó÷èòü ñ ïîìîùüþ ôóíêöèè Chr — ýòî ñèìâîë âîçâðàòà êàðåòêè (êîä ñèìâî-
ëà 13). Ýòî — ñèìâîë, ãåíåðèðóåìûé êîìïüþòåðîì âñÿêèé ðàç ïðè íàæàòèè
êëàâèøè Enter íà êëàâèàòóðå è óêàçûâàþùèé íà íà÷àëî íîâîé ñòðîêè ïðè èñ-
ïîëüçîâàíèè åãî â òåêñòå. Êàê ïîêàçàíî íà ðèñ. 4.6, ñëåäóþùèé îïåðàòîð èñ-
ïîëüçóåò Chr äëÿ äîáàâëåíèÿ ñèìâîëà âîçâðàòà êàðåòêè â êîíêàòåíèðîâàííóþ
ñòðîêó òàê, ÷òîáû ïîëó÷åííîå äèàëîãîâîå îêíî ñîäåðæàëî íåñêîëüêî ñòðîê.
166 Ãëàâà 4

Äèàëîãîâîå îêíî, ïîêàçàííîå íà ðèñ. 4.6, ìîæåò áûòü ïîëó÷åíî ñ ïîìîùüþ


ñëåäóþùåãî (îäíîãî!) îïåðàòîðà:
MsgBox "Áåäà ñòðàíå, ãäå ðàá è ëüñòåö" & Chr(13) & _
"Îäíè ïðèáëèæåíû ê ïðåñòîëó," & Chr(13) & _
"À íåáîì èçáðàííûé ïåâåö" & Chr(13) & _
"Ìîë÷èò, ïîòóïÿ î÷è äîëó." & Chr(13) & Chr(13) & _
" À.Ñ. Ïóøêèí" & Chr(13)

Ðèñ. 4.6
Èñïîëüçîâàíèå ôóíêöèè Chr ñ êîíñòàíòîé 13
â êà÷åñòâå ïàðàìåòðà îêðûâàåò âîçìîæíîñòè ôîðìàòèðîâàíèÿ
òåêñòà â îêíå ôóíêöèè MsgBox

Ïîñêîëüêó ñèìâîëû, èñïîëüçóåìûå äëÿ íà÷àëà íîâîé ñòðîêè, ÿâëÿþòñÿ


î÷åíü âàæíûìè ïðè ôîðìàòèðîâàíèè ñîîáùåíèé è äðóãèõ ñòðîêîâûõ äàííûõ,
êîòîðûìè ìàíèïóëèðóþò VBA-ïðîöåäóðû, VBA èìååò íåñêîëüêî ïðåäîïðåäå-
ëåííûõ êîíñòàíò äëÿ ýòèõ ñèìâîëîâ, ÷òîáû íå áûëî íåîáõîäèìîñòè èñïîëüçî-
âàòü ôóíêöèþ Chr:
¨ vbCr — ñèìâîë âîçâðàòà êàðåòêè (êîä ñèìâîëà 13). Ýòà êîíñòàíòà ÿâëÿåò-
ñÿ ýêâèâàëåíòîì âûðàæåíèÿ: Chr(13). Âêëþ÷åíèå vbCr â ñòðîêó ïðèâî-
äèò ê òîìó, ÷òî VBA è áîëüøèíñòâî ïðèëîæåíèé Windows íà÷èíàþò íî-
âóþ ñòðîêó ïðè âûâîäå ñòðîêè íà ýêðàí.  íåêîòîðûõ ñëó÷àÿõ, íàïðèìåð,
ïðè ïåðåñûëêå ñòðîêè íà ïðèíòåð, ñèìâîë âîçâðàòà êàðåòêè ïðîñòî ïðè-
âîäèò ê ïåðåìåùåíèþ êóðñîðà â íà÷àëî òåêóùåé ñòðîêè áåç ïåðåõîäà
ê ñëåäóþùåé ñòðîêå.
¨ vbLf — ñèìâîë ñìåùåíèÿ íà îäíó ñòðîêó (êîä ñèìâîëà 10). Ýòà êîíñòàíòà
ýêâèâàëåíòíà âûðàæåíèþ: Chr(10). Âêëþ÷åíèå vbLf â ñòðîêó ïðèâîäèò
ê òîìó, ÷òî VBA è áîëüøèíñòâî ïðèëîæåíèé Windows íà÷èíàþò íîâóþ
ñòðîêó ïðè îòîáðàæåíèè ñòðîêè.  íåêîòîðûõ ñëó÷àÿõ, íàïðèìåð, ïðè
ïåðåñûëêå ñòðîêè íà ïðèíòåð, ñèìâîë ñìåùåíèÿ íà îäíó ñòðîêó ïðîñòî
ïðèâîäèò ê ïåðåìåùåíèþ êóðñîðà ê ñëåäóþùåé ñòðîêå áåç âîçâðàòà ê ëå-
âîìó êðàþ îáëàñòè ïå÷àòè.
¨ vbCrLf — ñèìâîë âîçâðàòà êàðåòêè/ñìåùåíèÿ íà îäíó ñòðîêó; ýêâèâà-
ëåíòåí âûðàæåíèþ: Chr(13) & Chr(10). Ïîìåùåíèå ýòîãî ñèìâîëà â ñòðî-
êó ïðèâîäèò ê òîìó, ÷òî VBA íà÷èíàåò íîâóþ ñòðîêó ïðè îòîáðàæåíèè
ñòðîêè. Íàïðèìåð, ïðè ïåðåñûëêå òåêñòà íà ïðèíòåð èëè äëÿ òåêñòîâûõ
ôàéëîâ DOS-ôîðìàòà, íåîáõîäèìî èñïîëüçîâàòü vbCrLf äëÿ ïåðåìåùå-
íèÿ êóðñîðà ê íîâîé ñòðîêå è ê ëåâîìó êðàþ îáëàñòè ïå÷àòè.
¨ vbNewLine ïðåäñòàâëÿåò ñèìâîë(û), èñïîëüçóåìûé ïðè ñîçäàíèè íîâîé
ñòðîêè äëÿ ïðîãðàììíîé ïëàòôîðìû, â êîòîðîé âûïîëíÿåòñÿ âàøà ïðî-
öåäóðà VBA. Ïðèìåíÿéòå êîíñòàíòó vbNewLine â ïðîöåäóðàõ, êîòîðûå
äîëæíû èñïîëüçîâàòüñÿ ëèáî â Windows-, ëèáî â Macintosh-âåðñèÿõ MS
ïðèëîæåíèé.
¨ vbTab — ñèìâîë òàáóëÿöèè (êîä ñèìâîëà 9). Ýòîò ñèìâîë ñîçäàåòñÿ ïðè
íàæàòèè íà êëàâèøó Tab íà êëàâèàòóðå. Êîíñòàíòà vbTab ýêâèâàëåíòíà
Ôóíêöèè â Visual Basic 167

âûðàæåíèþ: Chr(9). Ìîæíî âêëþ÷àòü ñèìâîëû òàáóëÿöèè â ñòðîêè äëÿ


âûðàâíèâàíèÿ äàííûõ â ñòîëáöàõ.
Ñ ó÷åòîì âûøåñêàçàííîãî ïîñëåäíèé îïåðàòîð ìîæíî ïåðåïèñàòü â âèäå:
MsgBox "Áåäà ñòðàíå, ãäå ðàá è ëüñòåö" & vbCr & _
"Îäíè ïðèáëèæåíû ê ïðåñòîëó," & vbCr & _
"À íåáîì èçáðàííûé ïåâåö" & vbCr & _
"Ìîë÷èò, ïîòóïÿ î÷è äîëó." & vbCr & vbCr & _
" À.Ñ. Ïóøêèí" & vbCr

Ôîðìàòèðîâàíèå çíà÷åíèé äàííûõ


Õîòÿ VBA ìîæåò àâòîìàòè÷åñêè ïðåîáðàçîâûâàòü ëþáîé òèï äàííûõ â ñòðî-
êó äëÿ îòîáðàæåíèÿ ñ ïîìîùüþ ôóíêöèè MsgBox èëè äëÿ âñòàâêè â ðàáî÷èé
ëèñò Excel (äîêóìåíò Word èëè ñîîòâåòñòâóþùèé îáúåêò äðóãîãî ïðèëîæå-
íèÿ), ôîðìàò äàííûõ, êîòîðûé âûáèðàåò VBA, ìîæåò íå ñîâïàäàòü ñ æåëàå-
ìûì.
Ïðè ïðåîáðàçîâàíèè ÷èñëà â ñòðîêó VBA íå äîáàâëÿåò â ñòðîêó ðàçäåëèòåëü
òûñÿ÷, ñèìâîëû äîëëàðà èëè äðóãîå ÷èñëîâîå ôîðìàòèðîâàíèå. Êðîìå òîãî,
åñëè ÷èñëî î÷åíü áîëüøîå èëè î÷åíü ìàëîå, VBA ñîçäàåò ñòðîêó, ïðåäñòàâëÿþ-
ùóþ ýòî ÷èñëî â ýêñïîíåíöèàëüíîì ôîðìàòå. Íàïðèìåð, VBA ïðåîáðàçóåò ÷èñ-
ëî 3145.25 â ñòðîêó «3145.25». Åñëè ýòî ÷èñëî ïðåäñòàâëÿåò ñóììó â äîëëàðàõ,
ìîæåò îêàçàòüñÿ ïðåäïî÷òèòåëüíåå ïðåîáðàçîâàòü åãî â ñòðîêó, ñîäåðæàùóþ
ñèìâîë äîëëàðà è ðàçäåëèòåëü òûñÿ÷: «$3,145.25».
Àíàëîãè÷íî, ïðè ïðåîáðàçîâàíèè äàò VBA âñåãäà èñïîëüçóåò êîðîòêèé ôîð-
ìàò äàòû è âðåìåíè, èñïîëüçóåìûé îïåðàöèîííîé ñèñòåìîé êîìïüþòåðà, è
âñåãäà îòîáðàæàåò è äàòó, è âðåìÿ. Âû ìîæåòå èñïîëüçîâàòü äðóãîé ôîðìàò
äàòû èëè âðåìåíè èëè îòîáðàæàòü òîëüêî äàòó èëè òîëüêî âðåìÿ.
Äëÿ ïîëó÷åíèÿ ïî÷òè ëþáîãî ôîðìàòà äàò ïðè ïðåîáðàçîâàíèè ÷èñåë èëè
äàò â ñòðîêè ìîæíî èñïîëüçîâàòü ôóíêöèþ Format; ìîæíî äàæå èñïîëüçîâàòü
ôóíêöèþ Format äëÿ ôîðìàòèðîâàíèÿ ñòðîêîâûõ äàííûõ â ñîîòâåòñòâèè ñ îï-
ðåäåëåííûì øàáëîíîì. Ìîæíî òàêæå ñîçäàâàòü ïîëüçîâàòåëüñêèå ýêðàííûå
ôîðìàòû, åñëè âàì íåîáõîäèìî, ÷òîáû äàííûå ïîÿâëÿëèñü â êàêîì-ëèáî îñî-
áîì ôîðìàòå.
VBA-ôóíêöèÿ Format èäåíòè÷íà ôóíêöèè Format â Excel è èñïîëüçóåò òå
æå ñèìâîëû-çàïîëíèòåëè ôîðìàòèðîâàíèÿ äàííûõ, ÷òî Excel è Access.
Ñèíòàêñèñ îïåðàòîðà Format ñëåäóþùèé (ïðèâåäåí èç ñïðàâî÷íîé ñèñòåìû
VBA):
ÑÈÍÒÀÊÑÈÑ
Format(Expression[, Format[, Firstdayofweek[, Firstweekofyear]]])
Çäåñü àðãóìåíòû îçíà÷àþò:

Expression ëþáîå äîïóñòèìîå âûðàæåíèå (îáÿçàòåëüíûé);


äîïóñòèìîå âûðàæåíèå èìåíîâàííîãî èëè îïðåäåëåííîãî
Format
ïîëüçîâàòåëåì ôîðìàòà (íåîáÿçàòåëüíûé);
êîíñòàíòà, êîòîðàÿ îïðåäåëÿåò ïåðâûé äåíü íåäåëè
Firstdayofweek
(íåîáÿçàòåëüíûé);
Firstweekofyea êîíñòàíòà, êîòîðàÿ îïðåäåëÿåò ïåðâóþ íåäåëþ ãîäà
r (íåîáÿçàòåëüíûé).
168 Ãëàâà 4

Äëÿ àðãóìåíòîâ Firstdayofweek è Firstweekofyear â VBA èìåþòñÿ èìåíîâàí-


íûå êîíñòàíòû, î êîòîðûõ ìîæíî óçíàòü èç ñïðàâî÷íîé ñèñòåìû VBA â ðàçäå-
ëå Date Constants.
×òîáû èñïîëüçîâàòü ôóíêöèþ Format, ìîæíî ëèáî çàäàòü ïðåäîïðåäåëåí-
íûé ôîðìàò (íàçûâàåìûé èìåíîâàííûì ôîðìàòîì (named format) ), ëèáî ñîç-
äàòü îáðàç îïðåäåëåííîãî ôîðìàòà, èñïîëüçóÿ êîìáèíàöèè îñîáîé ãðóïïû ñèì-
âîëîâ, íàçûâàåìûõ ñèìâîëàìè-çàïîëíèòåëÿìè (placeholders). Èñïîëüçóéòå îá-
ðàç, êîòîðûé ñîçäàåòñÿ ñ ïîìîùüþ ñèìâîëîâ-çàïîëíèòåëåé, åñëè íè îäèí èç
èìåíîâàííûõ ôîðìàòîâ íå îòâå÷àåò âàøèì çàïðîñàì. Ïðèìåðîì ýòèõ ìåòîäîâ
èñïîëüçîâàíèÿ ôóíêöèè Format ìîãóò áûòü ñëåäóþùèå îïåðàòîðû MsgBox
(êàæäûé îòîáðàæàåò îäíî è òî æå äèàëîãîâîå îêíî, ïîêàçàííîå íà ðèñ. 4.7);
ïåðâûé îïåðàòîð èñïîëüçóåò èìåíîâàííûé ôîðìàò, âòîðîé — îáðàç ñ ñèìâîëà-
ìè-çàïîëíèòåëÿìè:
MsgBox Format(#2/27/1976#, "Long Date")
MsgBox Format(#2/27/1976#, "dd mmmm yyyy")

Ðèñ. 4.7
Èñïîëüçîâàíèå ôóíêöèè Format
äëÿ èçìåíåíèÿ ñòðîêîâîãî ôîðìàòà
çíà÷åíèÿ äàòû

Âíèìàòåëüíûé ÷èòàòåëü çàìåòèò, ÷òî â ðóññêîé âåðñèè ñîîáùåíèÿ â îêíàõ


âñå æå íåìíîãî îòëè÷àþòñÿ.
Òàáë. 4.7 ñîäåðæèò äîñòóïíûå èìåíîâàííûå ôîðìàòû è îáúÿñíÿåò èõ äåé-
ñòâèå.
Òàáëèöà 4.7. Èìåíîâàííûå ôîðìàòû äëÿ èñïîëüçîâàíèÿ ñ ôóíêöèåé Format

Èìåíîâàííûé
Äåéñòâèå
ôîðìàò
Ôîðìàòèðóåò èíôîðìàöèþ î äàòå è âðåìåíè â ïîñëåäîâàòåëüíîå
÷èñëî äàòû, èñïîëüçóÿ óñòàíîâêè ôîðìàòà äàòû è âðåìåíè äëÿ
General Date
âàøåãî êîìïüþòåðà. Òî æå, ÷òî VBA-ïðåîáðàçîâàíèå ïî
óìîë÷àíèþ ïîñëåäîâàòåëüíûõ äàò â ñòðîêè.
Ôîðìàòèðóåò â ïîñëåäîâàòåëüíîé äàòå òîëüêî ÷àñòü, ñîäåðæàùóþ
Long Date
äàòó, èñïîëüçóÿ óñòàíîâêè êîìïüþòåðà äëÿ Long-ôîðìàòà äàòû.
Ôîðìàòèðóåò â ïîñëåäîâàòåëüíîé äàòå òîëüêî ÷àñòü, ñîäåðæàùóþ
Medium Date äàòó, èñïîëüçóÿ óñòàíîâêè êîìïüþòåðà äëÿ Medium-ôîðìàòà äàòû

Ôîðìàòèðóåò â ïîñëåäîâàòåëüíîé äàòå òîëüêî ÷àñòü, ñîäåðæàùóþ


Short Date
äàòó, èñïîëüçóÿ óñòàíîâêè êîìïüþòåðà äëÿ Short-ôîðìàòà äàòû.
Ôîðìàòèðóåò â ïîñëåäîâàòåëüíîé äàòå òîëüêî ÷àñòü, ñîäåðæàùóþ
Long Time âðåìÿ, èñïîëüçóÿ óñòàíîâêè êîìïüþòåðà äëÿ Long-ôîðìàòà
âðåìåíè.
Ôóíêöèè â Visual Basic 169

Èìåíîâàííûé
Äåéñòâèå
ôîðìàò
Ôîðìàòèðóåò â ïîñëåäîâàòåëüíîé äàòå òîëüêî ÷àñòü, ñîäåðæàùóþ
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

ïîëüçîâàòåëüñêèå ñèìâîëû-çàïîëíèòåëè, ïðèìåíÿåìûå äëÿ ñîçäàíèÿ îáðàçîâ


ôîðìàòîâ ñ ïðèìåíåíèåì ôóíêöèè Format. Êðîìå òîãî, â òàáë. 4.8 èñïîëüçóåò-
ñÿ êàê ïðèìåð ÷èñëåííîå çíà÷åíèå 1234,5. Ïîëóæèðíûì øðèôòîì âûäåëåíû
ñèìâîëû-çàïîëíèòåëè, êîòîðûå ââîäÿòñÿ èç îêðóæàþùåãî òåêñòà.
Òàáëèöà 4.8. Ñèìâîëû-çàïîëíèòåëè äëÿ ñîçäàíèÿ ïîëüçîâàòåëüñêèõ ôîðìàòîâ

Ñèìâîë-
Äåéñòâèå
çàïîëíèòåëü
Öèôðîâîé ñèìâîë, îòîáðàæàåò öèôðó, åñëè òàêîâàÿ íàõîäèòñÿ â ýòîé
ïîçèöèè, èëè 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 ñ äâóìÿ íà÷àëüíûìè ïðîáåëàìè. (ïîðÿäîê
çàïîëíåíèÿ ïî óìîë÷àíèþ — ñïðàâà íàëåâî).
< Îòîáðàæàåò âñå ñèìâîëû â âåðõíåì ðåãèñòðå.
> Îòîáðàæàåò âñå ñèìâîëû â íèæíåì ðåãèñòðå.

Ïðè èñïîëüçîâàíèè ôóíêöèè Format äëÿ ôîðìàòèðîâàíèÿ ñòðîê è ÷èñåë ìîæ-


íî ñîçäàâàòü äîïîëíèòåëüíûå ñåêöèè â îáðàçå ôîðìàòà, ÷òîáû èçìåíÿòü ôîðìàò
îòîáðàæåíèÿ â ñîîòâåòñòâèè ñ ôîðìàòèðóåìûì çíà÷åíèåì. Ñåêöèè â îáðàçå ôîð-
ìàòà ðàçäåëÿþòñÿ òî÷êîé ñ çàïÿòîé (;). Íàïðèìåð, ñëåäóþùèé îáðàç ñîäåðæèò
äâå ñåêöèè è ôîðìàòèðóåò îòðèöàòåëüíûå ÷èñëà èíà÷å, ÷åì ïîëîæèòåëüíûå:
$###,###,##0.00;$(###,###,##0.00)
Âûøåïðèâåäåííûé îáðàç ôîðìàòèðóåò ÷èñëî 1234567,89 êàê $1 234 567.89
è ôîðìàòèðóåò –1234567,89 êàê $(1 234 567.89).
Ìîæíî äëÿ ôîðìàòèðîâàíèÿ ñòðîêè èìåòü äâå ñåêöèè â îáðàçå ôîðìàòà.
Åñëè îáðàç ôîðìàòà ñîäåðæèò òîëüêî îäíó ñåêöèþ, ýòîò îáðàç ïðèìåíèì êî
âñåì ôîðìàòèðóåìûì ñòðîêàì. Åñëè îáðàç ôîðìàòà ñîäåðæèò äâå ñåêöèè, ïåð-
âàÿ ñåêöèÿ ïðèìåíèìà ê ñòðîêîâûì äàííûì, à âòîðàÿ — ê çíà÷åíèÿì Null è
ñòðîêàì íóëåâîé äëèíû (òî åñòü, ê ñòðîêàì, êîòîðûå íå ñîäåðæàò ñèìâîëîâ,
ïðåäñòàâëåííûõ ñ ïîìîùüþ ""). Ðàññìîòðèì ñëåäóþùèé îïåðàòîð, îòîáðàæàþ-
ùèé ðåçóëüòàò ôóíêöèè Format, èñïîëüçóåìûé ñ îáðàçîì èç äâóõ ÷àñòåé äëÿ
ñòðîê.
MsgBox Format(strData, "(@@@) - @@@ - @@@@; íå íîìåð òåëåôîíà")
Ïðèâåäåííûé âûøå îïåðàòîð îòîáðàæàåò (510) – 555 – 1212 â ðåçóëüòèðóþ-
ùåì îêíå ñîîáùåíèÿ, åñëè ïåðåìåííàÿ strData ñîäåðæèò «5105551212». Åñëè
ïåðåìåííàÿ strData ñîäåðæèò ñòðîêó íóëåâîé äëèíû (""), òî ïðåäûäóùèé îïå-
ðàòîð îòîáðàæàåò â îêíå ñîîáùåíèÿ ñòðîêó «íå íîìåð òåëåôîíà».
Äëÿ ôîðìàòèðîâàíèÿ ÷èñëîâûõ çíà÷åíèé ìîæíî èìåòü äî ÷åòûðåõ ðàçëè÷-
íûõ ñåêöèé â îáðàçå ôîðìàòà. Ïåðâàÿ ñåêöèÿ èñïîëüçóåòñÿ äëÿ ïîëîæèòåëü-
íûõ ÷èñåë, âòîðàÿ — äëÿ îòðèöàòåëüíûõ ÷èñåë, òðåòüÿ — äëÿ íóëåâûõ çíà÷å-
172 Ãëàâà 4

íèé, à ÷åòâåðòàÿ — äëÿ çíà÷åíèé Null. Ñëåäóþùèé îáðàç ôîðìàòà ñîäåðæèò


÷åòûðå ñåêöèè:
$###,###,##0.00; $(###,###,##0.00); 0.00; "Null value"
Ïðèâåäåííûé âûøå îáðàç ôîðìàòà ôîðìàòèðóåò îòðèöàòåëüíûå ÷èñëà ñ êðóã-
ëûìè ñêîáêàìè, óêàçûâàåò, ÷òî íóëåâûå çíà÷åíèÿ äîëæíû áûòü ïîêàçàíû êàê
0.00, è âîçâðàùàåò òåêñòîâîå ñîîáùåíèå, åñëè ôîðìàòèðóåìîå çíà÷åíèå ðàâíî
Null. Ýòîò îáðàç ôîðìàòà ôîðìàòèðóåò ÷èñëî 1234567,89 êàê ñòðîêó
«$1 234 567.89». ×èñëî –1234567,89 ôîðìàòèðóåòñÿ â ñòðîêó «$(1 234 567.89)».
Çíà÷åíèå 0 ôîðìàòèðóåòñÿ â ñòðîêó «0.00», òîãäà êàê çíà÷åíèå Null ôîðìàòèðó-
åòñÿ â ñòðîêó «Null value».
Êðîìå îáùåé ôóíêöèè ôîðìàòèðîâàíèÿ, âû ìîæåòå èñïîëüçîâàòü ôóíêöèè
ñïåöèàëüíîãî ôîðìàòèðîâàíèÿ, ïðèâåäåííûå â òàáëèöå 4.9.
Òàáëèöà 4.9. Ôóíêöèè ñïåöèàëüíîãî ôîðìàòèðîâàíèÿ

Ôóíêöèÿ Íàçíà÷åíèå
Âîçâðàùàåò âûðàæåíèå, îòôîðìàòèðîâàííîå êàê
äåíåæíîå (âàëþòíîå) âûðàæåíèå ñ èñïîëüçîâàíèåì
FormatCurrency (E[, N [, I [,U
çíà÷åíèÿ, çàäàííîãî íà âêëàäêå Äåíåæíàÿ åäèíèöà
[, G]]]])
îêíà Ñâîéñòâà: ßçûê è ñòàíäàðòû, äîñòóïíîãî èç
Ïàíåëè óïðàâëåíèÿ.
Âîçâðàùàåò âûðàæåíèå, îòôîðìàòèðîâàííîå, êàê
FormatDateTime (D[,N])
äàòà èëè âðåìÿ.
FormatNumber (E [, N [, I [, U Âîçâðàùàåò âûðàæåíèå, îòôîðìàòèðîâàííîå, êàê
[, G]]]]) ÷èñëî.
Âîçâðàùàåò âûðàæåíèå, îòôîðìàòèðîâàííîå, êàê
FormatPercent (E [, N [, I [, U
ïðîöåíòíîå îòíîøåíèå (óìíîæåííîå íà 100) ñ
[, G]]]])
êîíå÷íûì çíàêîì ïðîöåíòà ( %).

Ôóíêöèÿ FormatCurrency âîçâðàùàåò âûðàæåíèå, îòôîðìàòèðîâàííîå,


êàê äåíåæíîå (âàëþòíîå) âûðàæåíèå ñ èñïîëüçîâàíèåì çíà÷åíèÿ, çàäàííîãî íà
âêëàäêå Äåíåæíàÿ åäèíèöà îêíà Ñâîéñòâà: ßçûê è ñòàíäàðòû, äîñòóïíîãî èç Ïàíåëè
óïðàâëåíèÿ.
Ñèíòàêñèñ ôóíêöèè FormatCurrency ñëåäóþùèé (ïðèâåäåí èç ñïðàâî÷íîé
ñèñòåìû VBA):
ÑÈÍÒÀÊÑÈÑ
FormatCurrency(Expression[, NumDigitsAfterDecimal [, IncludeLeadingDigit
[, UseParensForNegativeNumbers [, GroupDigits]]]])
Çäåñü àðãóìåíòû îçíà÷àþò:

Expression Âûðàæåíèå äëÿ ôîìàòèðîâàíèÿ (îáÿçàòåëüíûé).


×èñëåííîå çíà÷åíèå, îïðåäåëÿþùåå êîëè÷åñòâî
îòîáðàæàåìûõ çíàêîâ ñïðàâà îò äåñÿòè÷íîé òî÷êè.
NumDigitsAfterDecimal Çíà÷åíèå ïî óìîë÷àíèþ äëÿ ýòîãî àðãóìåíòà ðàâíî
–1, ÷òî îçíà÷àåò èñïîëüçîâàíèå ðåãèîíàëüíûõ
íàñòðîåê (íåîáÿçàòåëüíûé).
Ôóíêöèè â Visual Basic 173

Expression Âûðàæåíèå äëÿ ôîìàòèðîâàíèÿ (îáÿçàòåëüíûé).


Êîíñòàíòà òðåõ ñîñòîÿíèé, îïðåäåëÿþùàÿ, ñëåäóåò ëè
IncludeLeadingDigit îòîáðàæàòü âåäóùèé íîëü äëÿ äðîáíûõ ÷èñåë
(íåîáÿçàòåëüíûé).
Êîíñòàíòà òðåõ ñîñòîÿíèé, îïðåäåëÿþùàÿ, ñëåäóåò ëè
UseParensForNegativeNumbe
ïîìåùàòü îòðèöàòåëüíûå çíà÷åíèÿ âíóòðè êðóãëûõ
rs
ñêîáîê (íåîáÿçàòåëüíûé).
Êîíñòàíòà òðåõ ñîñòîÿíèé, îïðåäåëÿþùàÿ,
ãðóïïèðîâàòü ëè öèôðû ñ ïîìîùüþ îãðàíè÷èòåëåé,
GroupDigits
çàäàííûõ ðåãèîíàëüíûìè íàñòðîéêàìè
(íåîáÿçàòåëüíûé).

Àãóìåíòû IncludeLeadingDigit, UseParensForNegativeNumbers è GroupDigits ìîãóò


ïðèíèìàòü òîëüêî çíà÷åíèÿ êîíñòàíò: vbTrue, vbFalse è vbUseDefault (Èñïîëüçî-
âàòü ðåãèîíàëüíûå íàñòðîéêè êîìïüþòåðà).

 êà÷åñòâå ïðèìåðà ïðèâåäåì êîä íåáîëüøîé ïðîãðàììû (ëèñòèíã 4.6) è ðå-


çóëüòàò åå ðàáîòû (ðèñ. 4.8) â âèäå ïîñëåäîâàòåëüíî âûäàâàåìûõ íà ýêðàí äèà-
ëîãîâûõ îêîí.

Ëèñòèíã 4.6. Äåìîíñòðàöèÿ ôóíêöèè FormatCurrency

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

Ñèíòàêñèñ ôóíêöèè FormatDateTime ñëåäóþùèé (âçÿò èç ñïðàâî÷íîé ñèñ-


òåìû VBA):
Ñèíòàêñèñ
FormatDateTime(Date[,NamedFormat])
Çäåñü àðãóìåíòû îçíà÷àþò:
Date — äàòà äëÿ ôîðìàòèðîâàíèÿ. (Îáÿçàòåëüíûé);
NamedFormat — ×èñëåííîå çíà÷åíèå, óêàçûâàþùåå íåîáõîäèìûé ôîðìàò. Åñëè
îïóùåí, èñïîëüçóåòñÿ vbGeneralDate (íåîáÿçàòåëüíûé).
Àðãóìåíò NamedFormat ìîæåò ïðèíèìàòü ñëåäóþùèå çíà÷åíèÿ:
VbGeneralDate (çíà÷åíèå ðàâíî 0) — îòîáðàæàòü äàòó è/èëè âðåìÿ. Åñëè â àðãó-
ìåíòå Date èìååòñÿ ÷àñòü äàòû, äàòà îòîáðàæàåòñÿ â êîðîòêîì ôîðìàòå. Åñëè â àð-
ãóìåíòå Date èìååòñÿ ÷àñòü âðåìåíè, îíà îòîáðàæàåòñÿ â äëèííîì ôîðìàòå;
174 Ãëàâà 4

vbLongDate (çíà÷åíèå ðàâíî 1) — îòîáðàæàòü äàòó ñ èñïîëüçîâàíèåì äëèííîãî


ôîðìàòà, óñòàíîâëåííîãî íà êîìïüþòåðå â ðåãèîíàëüíûõ íàñòðîéêàõ;
vbShortDate (çíà÷åíèå ðàâíî 2) — îòîáðàæàòü äàòó ñ èñïîëüçîâàíèåì êîðîòêîãî
ôîðìàòà, óñòàíîâëåííîãî íà êîìïüþòåðå â ðåãèîíàëüíûõ íàñòðîéêàõ;
vbLongTime (çíà÷åíèå ðàâíî 3) — îòîáðàæàòü âðåìÿ ñ èñïîëüçîâàíèåì âðåìåííî-
ãî ôîðìàòà, óñòàíîâëåííîãî íà êîìïüþòåðå â ðåãèîíàëüíûõ íàñòðîéêàõ;
vbShortTime (çíà÷åíèå ðàâíî 3) — Îòîáðàæàòü âðåìÿ ñ èñïîëüçîâàíèåì ôîðìàòà
24-hour (hh:mm).
 êà÷åñòâå ïðèìåðà ïðèâåäåì êîä íåáîëüøîé ïðîãðàììû (ëèñòèíã 4.7) è ðå-
çóëüòàò åå ðàáîòû (ðèñ. 4.9) â âèäå ïîñëåäîâàòåëüíî âûäàâàåìûõ íà ýêðàí äèà-
ëîãîâûõ îêîí.

Ëèñòèíã 4.7. Äåìîíñòðàöèÿ ôóíêöèè FormatDateTime

Ðèñ. 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.9. Ïðèìåð èñïîëüçîâàíèÿ ôóíêöèè FormatDateTime


Ôóíêöèè â Visual Basic 175

Çäåñü àðãóìåíòû îçíà÷àþò òî æå, ÷òî è â ôóíêöèè FormatCurrency.

 êà÷åñòâå ïðèìåðà ïðèâåäåì êîä íåáîëüøîé ïðîãðàììû (ëèñòèíã 4.8) è


ðåçóëüòàò åå ðàáîòû (ðèñ. 4.10) â âèäå ïîñëåäîâàòåëüíî âûäàâàåìûõ íà ýêðàí
äèàëîãîâûõ îêîí.

Ëèñòèíã 4.8. Äåìîíñòðàöèÿ ôóíêöèè FormatNumber


1:Sub MyMacro()
2:'Ïðèìåð èñïîëüçîâàíèÿ ôóíêöèè FormatNumber
3: Dim MyDouble As Double
4: MyDouble = 112233.4455
5:
6: MsgBox FormatNumber(MyDouble)
7: MsgBox FormatNumber(MyDouble, vbFalse)
8: MsgBox FormatNumber(MyDouble, vbTrue)
9: MsgBox FormatNumber(MyDouble, , vbFalse)
10: MsgBox FormatNumber(MyDouble, , vbTrue)
11: MsgBox FormatNumber(MyDouble, , , vbFalse)
12:End Sub

Ñèíòàêñèñ ôóíêöèè FormatPercent ñëåäóþùèé (ïðèâåäåí èç ñïðàâî÷íîé


ñèñòåìû VBA):
Ñèíòàêñèñ
FormatPercent (Expression[,NumDigitsAfterDecimal [,IncludeLeadingDigit
[,UseParensForNegativeNumbers [,GroupDigits]]]])
Çäåñü àðãóìåíòû îçíà÷àþò òî æå, ÷òî è â ôóíêöèè FormatCurrency.

 ýòîé ãëàâå ïðèâåäåíû íå âñå ôóíêöèè, êîòîðûå èìåþòñÿ â VBA.  VBA


åñòü ôóíêöèè, êîòîðûå ïîçâîëÿþò «îáùàòüñÿ» ñ äðóãèìè ïðèëîæåíèÿìè, ïî-
ëó÷àòü èíôîðìàöèþ îá îøèáêàõ âðåìåíè èñïîëíåíèÿ, ïîëó÷àòü èíôîðìàöèþ
î ìàññèâàõ è ìàíèïóëèðîâàòü îáúåêòàìè ðàçëè÷íûõ host-ïðèëîæåíèé â Word
è Excel. Íåêîòîðûå èç íèõ îïèñûâàþòñÿ â äðóãèõ ãëàâàõ.

Èñïîëüçîâàíèå ôóíêöèé host-ïðèëîæåíèé


Êðîìå ôóíêöèé, âñòðîåííûõ â Visual Basic for Application, èç êîäà VBA
äîñòóïíû íåêîòîðûå ôóíêöèè host-ïðèëîæåíèÿ VBA. (Ïîìíèòå, ÷òî host-ïðè-

Ðèñ. 4.10
Ïðèìåð èñïîëüçîâàíèÿ ôóíêöèè
FormatNumber
176 Ãëàâà 4

ëîæåíèå — ýòî ïðèëîæåíèå, â êîòîðîì ðàçðàáàòûâàþòñÿ ïðîöåäóðû VBA, òà-


êèå êàê Word, Excel, PowerPoint, Outlook èëè FrontPage).
Ñïåöèôè÷åñêèå ôóíêöèè host-ïðèëîæåíèÿ, äîñòóïíûå äëÿ VBA, çàâèñÿò îò
îïðåäåëåííîãî host-ïðèëîæåíèÿ, â êîòîðîì âûïîëíÿåòñÿ ðàáîòà.
 Excel, íàïðèìåð, èìåþòñÿ ðàçëè÷íûå ôóíêöèè, âûïîëíÿþùèå ìàòåìàòè-
÷åñêèå, ëîãè÷åñêèå, ôèíàíñîâûå è ñòàòèñòè÷åñêèå îïåðàöèè íàä äàííûìè â
ðàáî÷èõ ëèñòàõ. Ìíîãèå (õîòÿ è íå âñå) èç ýòèõ ôóíêöèè Excel äîñòóïíû èç
êîäà VBA.
Ôóíêöèè host-ïðèëîæåíèÿ, äîñòóïíûå äëÿ VBA, íå ÿâëÿþòñÿ ÷àñòüþ VBA,
îíè ÿâëÿþòñÿ ÷àñòüþ host-ïðèëîæåíèÿ. Ôóíêöèè ðàáî÷èõ ëèñòîâ Excel, íà-
ïðèìåð, íå ÿâëÿþòñÿ ÷àñòüþ ÿçûêà ïðîãðàììèðîâàíèÿ VBA; îíè ÿâëÿþòñÿ ÷à-
ñòüþ host-ïðèëîæåíèÿ Excel. Íå êàæäîå host-ïðèëîæåíèå VBA ñîäåðæèò
ôóíêöèè, êîòîðûå ìîæíî èñïîëüçîâàòü â VBA. Ôóíêöèè, äîñòóïíûå äëÿ VBA
â îäíîì host-ïðèëîæåíèè, ìîãóò íå áûòü äîñòóïíûìè â äðóãîì. Åñëè âû íàìå-
ðåâàåòåñü ïèñàòü ïðîöåäóðû VBA, êîòîðûå ìîãóò âûïîëíÿòüñÿ ëþáûì host-
ïðèëîæåíèåì, íå èñïîëüçóéòå ôóíêöèè èç host-ïðèëîæåíèÿ, ïîòîìó ÷òî îíè
ìîãóò íå áûòü äîñòóïíûìè âî âñåõ ïðèëîæåíèÿõ. Íàïðèìåð, åñëè íåîáõîäèìî
íàïèñàòü ïðîöåäóðó äëÿ èñïîëüçîâàíèÿ â Word, Excel, Access èëè Microsoft
Project, íå èñïîëüçóéòå ôóíêöèé Excel â îïåðàòîðàõ VBA.
×òîáû èñïîëüçîâàòü ôóíêöèþ, ïðèíàäëåæàùóþ êàêîìó-ëèáî host-ïðèëî-
æåíèþ, îáðàùàéòåñü ê ôóíêöèè ïîñðåäñòâîì ïðîãðàììíîãî îáúåêòà (Applica-
tion). Îáúåêò Application VBA ïðåäñòàâëÿåò host-ïðèëîæåíèå è âñå åãî ðåñóð-
ñû. (Îáúåêòû áîëåå ïîäðîáíî îïèñûâàþòñÿ äàëåå.)
Ïîìèìî íåñêîëüêèõ ôóíêöèé, ïðåîáðàçóþùèõ ðàçëè÷íûå èçìåðåíèÿ íàáîðà
òåêñòà â äþéìû è íàîáîðîò, Word íå èìååò ôóíêöèé ïðèëîæåíèé, äîñòóïíûõ â
VBA. Ïî ýòîé ïðè÷èíå â äàííîé ãëàâå îñíîâíîå âíèìàíèå ïðè îáúÿñíåíèè èñ-
ïîëüçîâàíèÿ ôóíêöèé host-ïðèëîæåíèé óäåëÿåòñÿ èñïîëüçîâàíèþ ôóíêöèé
host-ïðèëîæåíèé â Excel.
Áîëåå âåðîÿòíî, ÷òî âû áóäåòå èñïîëüçîâàòü ôóíêöèè host-ïðèëîæåíèÿ â
Excel, ïîñêîëüêó Excel ðàçðàáîòàí ñïåöèàëüíî äëÿ ìàíèïóëèðîâàíèÿ ÷èñëîâû-
ìè äàííûìè â ôîðìàòå ðàáî÷èõ ëèñòîâ.  ðåçóëüòàòå Excel ñîäåðæèò ìíîãî
ôóíêöèé äëÿ èñïîëüçîâàíèÿ â ôîðìóëàõ ðàáî÷èõ ëèñòîâ. Ôóíêöèè ðàáî÷èõ
ëèñòîâ Excel ïðèìåíÿþòñÿ äëÿ âûïîëíåíèÿ òàêèõ çàäà÷, êàê íàõîæäåíèå ñóì-
ìû öåëîãî ñòîëáöà öèôð, äëÿ âûïîëíåíèÿ ôèíàíñîâûõ âû÷èñëåíèé (íàïðè-
ìåð, íàõîæäåíèå òåêóùåé âåëè÷èíû çàéìà) è äëÿ âûïîëíåíèÿ ñòàòèñòè÷åñêî-
ãî àíàëèçà äàííûõ.
Õîòÿ ìíîãèå ìàòåìàòè÷åñêèå ôóíêöèè Excel äóáëèðóþò ìàòåìàòè÷åñêèå
ôóíêöèè VBA, Excel ñîäåðæèò íàìíîãî áîëüøå ñïåöèàëèçèðîâàííûõ ñòàòè-
ñòè÷åñêèõ è ôèíàíñîâûõ ôóíêöèé, ÷åì VBA. Ïðè ïðîãðàììèðîâàíèè Excel-
îïåðàöèé â Excel VBA ìîæåò ïîíàäîáèòüñÿ èñïîëüçîâàòü ìíîãèå èç ôóíêöèé
ðàáî÷èõ ëèñòîâ, ÿâëÿþùèõñÿ ÷àñòüþ Excel.
 êà÷åñòâå ïðèìåðà ñëåäóþùèé îïåðàòîð èñïîëüçóåò Excel-ôóíêöèþ Max,
âîçâðàùàþùóþ ñàìîå áîëüøîå ÷èñëî â åå ñïèñêå àðãóìåíòîâ:
MsgBox Application.Max(9, 1, 3, 2) 'Îòîáðàæàåò 9
 ýòîì îïåðàòîðå îáðàòèòå âíèìàíèå íà òî, ÷òî çà ñëîâîì Application ñëåäó-
åò òî÷êà (.) è çàòåì — èìÿ ôóíêöèè Max áåç ïðîáåëîâ. Ýòà òî÷êà, íàçûâàåìàÿ
òî÷êîé-ðàçäåëèòåëåì (dot separator), óêàçûâàåò íà òî, ÷òî îïåðàòîð ññûëàåòñÿ
íà ôóíêöèþ Max, êîòîðàÿ ÿâëÿåòñÿ ÷àñòüþ îáúåêòà Application. Ïðè èñïîëü-
çîâàíèè ôóíêöèé host-ïðèëîæåíèÿ â îïåðàòîðàõ VBA íåîáõîäèìî âêëþ÷àòü
Ôóíêöèè â Visual Basic 177

êëþ÷åâîå ñëîâî Application è òî÷êó-ðàçäåëèòåëü ïåðåä èìåíåì êàæäîé ôóíê-


öèè. Íàïðèìåð, ÷òîáû èñïîëüçîâàòü êàêèå-ëèáî ôóíêöèè ðàáî÷èõ ëèñòîâ
Excel â îïåðàòîðàõ VBA, íåîáõîäèìî âêëþ÷àòü êëþ÷åâîå ñëîâî Application è
òî÷êó-ðàçäåëèòåëü (.) ïåðåä èìåíåì êàæäîé ôóíêöèè Excel.
Ðåçóëüòàò ôóíêöèè Excel íåëüçÿ èãíîðèðîâàòü. Íåîáõîäèìî âñåãäà âêëþ-
÷àòü êðóãëûå ñêîáêè â âûçîâ ôóíêöèè Excel è âñåãäà êàêèì-ëèáî îáðàçîì èñ-
ïîëüçîâàòü ðåçóëüòàò ôóíêöèè: êàê çíà÷åíèå â âûðàæåíèè, àðãóìåíò äëÿ äðó-
ãîé ôóíêöèè èëè ïðîöåäóðû èëè â îïåðàòîðå ïðèñâàèâàíèÿ.
Åñëè âû îïûòíûé ïîëüçîâàòåëü ðàáî÷èõ ëèñòîâ Excel, âû ìîãëè óæå çàìå-
òèòü, ÷òî Excel èìååò ìíîãî ôóíêöèé, èìåþùèõ òå æå èìåíà, ÷òî è íåêîòîðûå
ôóíêöèè, ïåðå÷èñëåííûå â òàáë. 4.3–4.6. Ýòà ñèòóàöèÿ ìîæåò òàêæå íàáëþ-
äàòüñÿ è â äðóãèõ host-ïðèëîæåíèÿõ: host-ïðèëîæåíèå èìååò ôóíêöèè, èìåíà
êîòîðûõ äóáëèðóþò èìåíà ôóíêöèé, èìåþùèõñÿ â VBA.
Ïîñêîëüêó íåîáõîäèìî âñåãäà óêàçûâàòü êëþ÷åâîå ñëîâî Application, êîãäà
èñïîëüçóåòñÿ ôóíêöèÿ host-ïðèëîæåíèÿ, òî íå áûâàåò íåÿñíî äëÿ VBA èëè
ïîëüçîâàòåëÿ, íà êàêóþ ôóíêöèþ (VBA èëè ïðèëîæåíèÿ) ññûëàåòñÿ îïåðàòîð.
Ñëåäóþùèé ôðàãìåíò êîäà, íàïðèìåð, ïîêàçûâàåò äâà îïåðàòîðà â Excel VBA:
Rslt = Log(AnyNum)
Rslt = Application.Log(AnyNum)
Ïåðâûé îïåðàòîð âûçûâàåò VBA-ôóíêöèþ Log; âòîðîé — âûçûâàåò Excel-
ôóíêöèþ LOG. ×òîáû èñïîëüçîâàòü VBA-âåðñèþ ôóíêöèè, ïðîñòî ïèøèòå èìÿ
ôóíêöèè; ÷òîáû èñïîëüçîâàòü âåðñèþ ôóíêöèè host-ïðèëîæåíèÿ, âêëþ÷àéòå
êëþ÷åâîå ñëîâî Application.
Ôóíêöèè host-ïðèëîæåíèé, èìåþùèå òå æå èìåíà, ÷òî è ôóíêöèè VBA, íå
îáÿçàòåëüíî âûïîëíÿþò òå æå ñàìûå çàäà÷è è âûäàþò òå æå ñàìûå ðåçóëüòàòû.
Íàïðèìåð, Excel-ôóíêöèÿ LOG îòëè÷àåòñÿ îò VBA-ôóíêöèè Log, è ýòè ôóíê-
öèè âîçâðàùàþò ðàçíûå îòâåòû: Excel-ôóíêöèÿ LN — ýòî ôóíêöèÿ, ñîâïàäàþ-
ùàÿ ñ äåéñòâèåì VBA-ôóíêöèè Log. Âíèìàòåëüíî èçó÷èòå äåéñòâèå è ðåçóëü-
òàò ôóíêöèè host-ïðèëîæåíèÿ ïåðåä òåì, êàê èñïîëüçîâàòü åå âìåñòî ôóíêöèè
VBA, â ïðîòèâíîì ñëó÷àå ïðîöåäóðû ìîãóò âûäàâàòü îøèáî÷íûå ðåçóëüòàòû.
Íå êàæäàÿ ôóíêöèÿ host-ïðèëîæåíèÿ äîñòóïíà VBA. Íàïðèìåð, íåêîòîðûå
ôóíêöèè Excel, äóáëèðóþùèå ôóíêöèè VBA, íåäîñòóïíû, ïîòîìó ÷òî â ýòîì
íåò ñìûñëà. Êîíêðåòíåå, Excel-ôóíêöèè Date, Year, Month, Day, Hour, Min-
ute è Second äóáëèðóþò VBA-ôóíêöèè Date, Year, Month, Day, Hour, Minute
è Second êàê ïî ñâîåìó äåéñòâèþ, òàê è ïî íàçíà÷åíèþ. Íèêàêàÿ èç ýòèõ
ôóíêöèé Excel íåäîñòóïíà äëÿ VBA. Èíîãäà íåêîòîðûå ôóíêöèè host-
ïðèëîæåíèé íåäîñòóïíû äëÿ VBA íåçàâèñèìî îò òîãî, äóáëèðóþò îíè
ôóíêöèè VBA èëè — íåò.
Åñëè âû íå óâåðåíû, äîñòóïíà ëè îïðåäåëåííàÿ ôóíêöèÿ host-ïðèëîæåíèÿ
äëÿ VBA, èñïîëüçóéòå Object Browser, ÷òîáû ïðîâåðèòü, âêëþ÷àåò ëè ñïèñîê
Members (Êîìïîíåíò) ýòó ôóíêöèþ, ïðè âûáðàííîì Application â ñïèñêå Classes
(Êëàññû) è ïðè âûáðàííîì host-ïðèëîæåíèè â ñïèñêå Project/Library (Ïðîåêò/Áèá-
ëèîòåêà). Åñëè íóæíîé ôóíêöèè íåò â ñïèñêå, òî îíà íåäîñòóïíà äëÿ VBA.
×òîáû óçíàòü, êàêèå ôóíêöèè èìåþòñÿ â Excel (èëè ëþáîì äðóãîì ïðèëî-
æåíèå), è óçíàòü, êàêîâî íàçíà÷åíèå è êàê èñïîëüçîâàòü ýòè ôóíêöèè, îáðà-
ùàéòåñü ê ñïðàâî÷íîé ñèñòåìå è èùèòå ðàçäåë äëÿ ñëîâà functions.
 çàêëþ÷åíèå îòìåòèì î÷åíü ïîëåçíîå äîïîëíèòåëüíîå ñâîéñòâî ôóíêöèè
InputBox ïðèëîæåíèÿ Excel, êîòîðîãî íåò â VBA. Äåëî â òîì, ÷òî InputBox
â Excel èìååò íåîáÿçàòåëüíûé ïàðàìåòð Type, çàäàþùèé òèï ââîäèìîãî çíà÷å-
178 Ãëàâà 4

íèÿ. Ýòî ìîæíî èñïîëüçîâàòü â êà÷åñòâå äîïîëíèòåëüíîãî êîíòðîëÿ ââîäèìîé


èíôîðìàöèè.
Ïàðàìåòð Type ìîæåò ïðèíèìàòü ñëåäóþùèå çíà÷åíèÿ:

Çíà÷åíèå ×òî îçíà÷àåò


0 Ôîðìóëà
1 ×èñëî
2 Òåêñò (ñòðîêà)
4 Ëîãè÷åñêîå çíà÷åíèå (True èëè False)
8 Ññûëêà íà ÿ÷åéêó, êàê îáúåêò äèàïàçîíà
16 Çíà÷åíèå îøèáêè, òàêîå êàê #N/A
64 Ìàññèâ çíà÷åíèé

Âû ìîæåòå èñïîëüçîâàòü â êà÷åñòâå àðãóìåíòà Type ñóììó äîñòóïíûõ çíà-


÷åíèé. Íàïðèìåð, äëÿ ââîäà êàê òåêñòîâûõ, òàê è ÷èñëîâûõ çíà÷åíèé ìîæíî
çàäàâàòü çíà÷åíèå 1+2.

Ñîçäàíèå ôóíêöèé è ôóíêöèé-ïðîöåäóð


Èòàê âû óæå óçíàëè, ÷òî òàêîå ôóíêöèÿ è êàê èñïîëüçîâàòü âñòðîåííûå
ôóíêöèè VBA è host-ïðèëîæåíèé VBA, òàêèõ êàê Excel. Òåïåðü âàì ïðåäñòîèò
óçíàòü, êàê ñîçäàâàòü ñîáñòâåííûå ïîëüçîâàòåëüñêèå ôóíêöèè, êàê ðàáîòàòü ñ
íèìè â host-ïðèëîæåíèÿõ VBA.  ÷àñòíîñòè, âû óçíàåòå, êàê ñäåëàòü òàê, ÷òî-
áû âàøè ñîáñòâåííûå ôóíêöèè áûëè äîñòóïíû ðàáî÷èì ëèñòàì Excel.
Ïåðåä òåì êàê íà÷àòü ïèñàòü ñîáñòâåííûå ôóíêöèè, âàì íåîáõîäèìî îçíà-
êîìèòüñÿ ñ òåðìèíîëîãèåé è ïîíÿòèÿìè, èñïîëüçóåìûìè ïðè îáñóæäåíèè ñîç-
äàíèÿ ôóíêöèé â VBA.
Ôóíêöèÿ-ïðîöåäóðà (èëè ôóíêöèÿ) — ýòî îñîáûé âèä ïðîöåäóðû VBA, âîçâðà-
ùàþùåé ðåçóëüòàò. Ïîëüçîâàòåëüñêèå ôóíêöèè-ïðîöåäóðû, êàê è âñòðîåííûå
ôóíêöèè VBA, ìîãóò èìåòü íåîáÿçàòåëüíûå è èìåíîâàííûå àðãóìåíòû. Ôóíêöèè
ìîæíî èñïîëüçîâàòü äëÿ îáåñïå÷åíèÿ çíà÷åíèÿìè âûðàæåíèé (ïðèñâàèâàíèÿ)
èëè â êà÷åñòâå àðãóìåíòîâ äðóãèõ ôóíêöèé è ïðîöåäóð. Ñîçäàíèå íîâîé ôóíêöèè
ñîñòîèò èç íàïèñàíèÿ ïðîãðàììíûõ îïåðàòîðîâ, êîòîðûå îïðåäåëÿþò:
1) àðãóìåíòû, èñïîëüçóåìûå ôóíêöèåé;
2) äåéñòâèÿ, âûïîëíÿåìûå ôóíêöèåé;
3) çíà÷åíèå, âîçâðàùàåìîå ôóíêöèåé.
Äëÿ òîãî ÷òîáû ìîæíî áûëî èñïîëüçîâàòü âàøè ôóíêöèè â Excel, íåîáõîäè-
ìî âûïîëíÿòü íåêîòîðûå äîïîëíèòåëüíûå ïðàâèëà (îãðàíè÷åíèÿ).
Word íå èìååò âñòðîåííûõ ôóíêöèé, êîòîðûå èñïîëüçîâàëèñü áû ïîäîáíî
Excel-ôóíêöèÿì ðàáî÷èõ ëèñòîâ. Word äàåò âîçìîæíîñòü âñòàâëÿòü â äîêó-
ìåíò â âèäå ïîëåé èíôîðìàöèþ ðàçëè÷íûõ òèïîâ äàííûõ, òàêèõ êàê òåêóùàÿ
äàòà è âðåìÿ, èìÿ äîêóìåíòà, îãëàâëåíèå è òàê äàëåå. Word íå ñîäåðæèò ôóíê-
öèé äëÿ âûïîëíåíèÿ ñòàòèñòè÷åñêèõ âû÷èñëåíèé èëè äðóãèõ àíàëèòè÷åñêèõ
çàäà÷, äëÿ ÷åãî è ïðåäíàçíà÷åí Excel. Ñëåäîâàòåëüíî, ôóíêöèè, ñîçäàâàåìûå
ñ ïîìîùüþ VBA, èìåþò ðàçëè÷íîå ïðèìåíåíèå â Excel è Word.  Excel ìîæíî
èñïîëüçîâàòü ôóíêöèè VBA äëÿ ðàñøèðåíèÿ êîëëåêöèè âñòðîåííûõ ôóíêöèé
Ôóíêöèè â Visual Basic 179

ðàáî÷èõ ëèñòîâ. Äðóãèå 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

Ñëåäóåò çàäàâàòü òèï äàííûõ ðåçóëüòàòà ôóíêöèè ïî òåì æå ïðè÷èíàì, ïî êàêèì


çàäàåòñÿ òèï ïåðåìåííûõ è êîíñòàíò: äëÿ óñêîðåíèÿ âûïîëíåíèÿ êîäà, áîëåå ýô-
ôåêòèâíîãî èñïîëüçîâàíèÿ ïàìÿòè, ïîëó÷åíèÿ áîëåå ëåãêîãî è ïîíÿòíîãî êîäà è
äëÿ íàõîæäåíèÿ îøèáîê ïðîãðàììèðîâàíèÿ (ïðè ýòîì íåîáõîäèìî õîðîøî çíàòü
ïðàâèëà ïðåîáðàçîâàíèÿ òèïîâ â VBA).
Íåîáÿçàòåëüíûé ýëåìåíò ñèíòàêñèñà Name = expression ïðåäñòàâëÿåò ïðèñâàèâà-
íèå ôóíêöèè (function assignment), êîòîðîå óêàçûâàåò VBA, êàêîå çíà÷åíèå äîëæ-
íà âîçâðàùàòü ôóíêöèÿ. Õîòÿ ýòà ÷àñòü ôóíêöèè ÿâëÿåòñÿ íåîáÿçàòåëüíîé, ñëåäó-
åò âñåãäà âêëþ÷àòü îïåðàòîð ïðèñâàèâàíèÿ â ôóíêöèè-ïðîöåäóðû. Íàêîíåö, îáú-
ÿâëåíèå ôóíêöèè çàêàí÷èâàåòñÿ êëþ÷åâûìè ñëîâàìè End Function.

Äàæå åñëè ôóíêöèÿ íå èìååò àðãóìåíòîâ, êàê VBA-ôóíêöèè Now, Date


è Time, â îáúÿâëåíèè ôóíêöèè íåîáõîäèìî èñïîëüçîâàòü êðóãëûå ñêîáêè. Íà-
ïðèìåð, ìîæíî íàïèñàòü ôóíêöèþ-ïðîöåäóðó, âîçâðàùàþùóþ èìÿ ôàéëà, ñî-
äåðæàùåãî òåêóùóþ ðàáî÷óþ êíèãó, òàê, ÷òîáû ìîæíî áûëî âñòàâëÿòü èìÿ
ôàéëà â ÿ÷åéêó ðàáî÷åãî ëèñòà. Òàêîé ôóíêöèè íå íóæíû àðãóìåíòû, åé íå
òðåáóåòñÿ íèêàêàÿ âíåøíÿÿ èíôîðìàöèÿ äëÿ âûïîëíåíèÿ ðàáîòû, è îíà áóäåò
èìåòü ïîäîáíîå îáúÿâëåíèå:
Function ThisBookName()
Îáû÷íî ôóíêöèÿ ïðåäíàçíà÷àåòñÿ äëÿ âûïîëíåíèÿ íåêîòîðîãî âû÷èñëåíèÿ
èëè äðóãîãî ìàíèïóëèðîâàíèÿ îïðåäåëåííûìè äàííûìè è äëÿ âîçâðàùåíèÿ
ðåçóëüòàòà ýòîãî ìàíèïóëèðîâàíèÿ. Êàê âû óæå çíàåòå, èíôîðìàöèÿ âñòðîåí-
íûì ôóíêöèÿì VBA ïåðåäàåòñÿ çàäàíèåì çíà÷åíèé â ñïèñêå àðãóìåíòîâ ôóíê-
öèè. Ïðè îáúÿâëåíèè ôóíêöèè-ïðîöåäóðû íåîáõîäèìî óêàçûâàòü èìÿ êàæäî-
ãî àðãóìåíòà, ïåðåäàâàåìîãî ôóíêöèè; èìåíà àðãóìåíòîâ â ñïèñêå ñëåäóåò îò-
äåëÿòü äðóã îò äðóãà çàïÿòîé è ïèñàòü â ñîîòâåòñòâèè ñ ïðàâèëàìè,
ïðèìåíÿåìûìè ê ëþáîìó èäåíòèôèêàòîðó VBA.
Èìåíà, ïðåäîñòàâëÿåìûå ïîëüçîâàòåëåì â ñïèñêå àðãóìåíòîâ, ïîäîáíû ïå-
ðåìåííûì: îíè ññûëàþòñÿ íà çíà÷åíèå, ïðåäîñòàâëÿåìîå â òî âðåìÿ, êîãäà âû-
çûâàåòñÿ ôóíêöèÿ, íåçàâèñèìî îò òîãî, âûçûâàåòñÿ ëè ôóíêöèÿ îïåðàòîðîì
VBA èëè host-ïðèëîæåíèåì.
Èìåíà àðãóìåíòîâ èìåþò òó æå îáëàñòü äåéñòâèÿ, ÷òî è ïåðåìåííûå, îáúÿâ-
ëÿåìûå ëîêàëüíî â ôóíêöèè-ïðîöåäóðå, òî åñòü íåäîñòóïíû âíå ôóíêöèè-ïðî-
öåäóðû, â ñïèñêå àðãóìåíòîâ êîòîðîé îíè îáúÿâëÿþòñÿ.
Âåðíåìñÿ ê îïèñàíèþ ñèíòàêñèñà è ê ñòðîêå, ñîäåðæàùåé îïåðàòîð Name =
expression. Ýòà ñòðîêà ïðåäñòàâëÿåò ïðèñâàèâàíèå ôóíêöèè; Name — èìÿ
ôóíêöèè, à expression — ëþáîå âûðàæåíèå, ñîçäàþùåå çíà÷åíèå, êîòîðîå
äîëæíà âîçâðàùàòü ôóíêöèÿ. Ïðèñâàèâàíèå ôóíêöèè óêàçûâàåò VBA, êàêîå
çíà÷åíèå áóäåò âîçâðàùàòü ôóíêöèÿ. Çàìåòüòå, ÷òî ïðèñâàèâàíèå ôóíêöèè èñ-
ïîëüçóåò èìÿ ôóíêöèè-ïðîöåäóðû è ïðèñâàèâàåò åìó çíà÷åíèå, êàê åñëè áû
ýòî áûëà ïåðåìåííàÿ. Ôóíêöèè-ïðîöåäóðû ìîãóò íå èìåòü ñîâñåì èëè èìåòü
îäèí èëè íåñêîëüêî ðàçëè÷íûõ îïåðàòîðîâ ïðèñâàèâàíèÿ ôóíêöèè.
Ïåðâûé ïðèìåð ôóíêöèè, êîòîðûé âû èçó÷èòå, ïîìîãàåò ìàíèïóëèðîâàòü
ñòðîêàìè. Åñëè íåîáõîäèìî îïðåäåëèòü äëèíó ñòðîêè, èñêëþ÷àÿ íà÷àëüíûå è
êîíå÷íûå ïðîáåëû, ìîæíî èñïîëüçîâàòü âëîæåííûå (nested) âûçîâû ôóíêöèè
(îäèí âûçîâ ôóíêöèè âíóòðè äðóãîãî), ïîäîáíûå ñëåäóþùåìó:
StrLen = Len(Trim(AnyStr))
Ýòîò òèï îïåðàöèè õîðîøî ïîäõîäèò äëÿ ôóíêöèè-ïðîöåäóðû. Èñïîëüçî-
âàòü îäèí âûçîâ ïîëüçîâàòåëüñêîé ôóíêöèè-ïðîöåäóðû ïðîùå è ëåã÷å, ÷åì ïî-
Ôóíêöèè â Visual Basic 181

âòîðÿòü çàïèñü âëîæåííîãî âûçîâà ôóíêöèè. Ëèñòèíã 4.9 ïîêàçûâàåò êàê ðàç
òàêóþ ïðîñòóþ ôóíêöèþ-ïðîöåäóðó LenTrim, êîòîðàÿ âîçâðàùàåò äëèíó ñòðî-
êè, èñêëþ÷àÿ íà÷àëüíûå è êîíå÷íûå ïðîáåëû.

Ëèñòèíã 4.9. Ïðîñòàÿ ôóíêöèÿ-ïðîöåäóðà LenTrim

1: Function LenTrim(tStr) 'Îïðåäåëåíèå ôóíêöèè


2: LenTrim = Len(Trim(tStr)) 'Âîçâðàùàåìîå çíà÷åíèå
3: End Function

 ñòðîêå 1 ñîäåðæèòñÿ îáúÿâëåíèå ôóíêöèè LenTrim, íà÷èíàþùååñÿ ñ îáÿ-


çàòåëüíîãî êëþ÷åâîãî ñëîâà Function. Ïîñëå èìåíè ôóíêöèè îòêðûâàþòñÿ
êðóãëûå ñêîáêè, ÷òî óêàçûâàåò VBA íà íà÷àëî ñïèñêà àðãóìåíòîâ. Äàëåå ñëå-
äóåò èìÿ àðãóìåíòà (tStr). Èìÿ àðãóìåíòà ñîîáùàåò VBA, ÷òî ôóíêöèè-ïðîöå-
äóðå ïðè åå âûçîâå äîëæåí ïåðåäàâàòüñÿ îäèí àðãóìåíò.
Êàê âû óæå, íàâåðíîå, óñïåëè çàìåòèòü, ïðè íàæàòèè íà êëàâèøó Enter
ïîñëå ââîäà êëþ÷åâîãî ñëîâà Function, èìåíè ôóíêöèè è ñïèñêà àðãóìåíòîâ
Ðåäàêòîð VB àâòîìàòè÷åñêè âñòàâëÿåò êëþ÷åâûå ñëîâà End Function, êàê
è â ñëó÷àå, êîãäà âû ââîäèòå êëþ÷åâîå ñëîâî Sub äëÿ ñîçäàíèÿ ïðîöåäóðû.
Åñëè ýòîãî íå ïðîèñõîäèò, âîçìîæíî, ïðè íàïèñàíèè ñòðîêè-çàãîëîâêà áûëà
äîïóùåíà îøèáêà ñèíòàêñèñà.
Ñòðîêà 2 ôóíêöèè LenTrim — ýòî ñòðîêà, êîòîðàÿ âûïîëíÿåò âñþ (ïîêà íå-
áîëüøóþ) ðàáîòó ôóíêöèè è òàêæå ñîäåðæèò àðãóìåíò ôóíêöèè äëÿ LenTrim.
Ïðè âû÷èñëåíèè âûðàæåíèÿ Len(Trim(tStr)) VBA ïðèíèìàåò ñòðîêó, ïîëó÷åí-
íóþ ïîñðåäñòâîì àðãóìåíòà tStr, è ïåðåäàåò åå VBA-ôóíêöèè Trim äëÿ óäàëå-
íèÿ íà÷àëüíûõ èëè êîíå÷íûõ ïðîáåëîâ. Ðåçóëüòàò ôóíêöèè Trim, â ñâîþ î÷å-
ðåäü, èñïîëüçóåòñÿ êàê àðãóìåíò ôóíêöèè Len. Çàòåì VBA ïðèñâàèâàåò ðå-
çóëüòàò ôóíêöèè Len èìåíè ôóíêöèè LenTrim. LenTrim âîçâðàùàåò äëèíó
ñòðîêè àðãóìåíòà, èñêëþ÷àÿ íà÷àëüíûå èëè êîíå÷íûå ïðîáåëû.
Íàêîíåö, â ñòðîêå 3 ôóíêöèÿ çàêàí÷èâàåòñÿ êëþ÷åâûìè ñëîâàìè End
Function. Ïîñëå âûïîëíåíèÿ ýòîé ñòðîêè VBA âîçâðàùàåòñÿ ê îïåðàòîðó ïðî-
öåäóðû, âûçâàâøåìó ôóíêöèþ LenTrim, è âñòàâëÿåò ðåçóëüòàò ôóíêöèè
LenTrim â ýòîò îïåðàòîð â òîì ìåñòå, ãäå ïîÿâëÿåòñÿ èìÿ ôóíêöèè.
Äëÿ âûçîâà ôóíêöèè LenTrim èñïîëüçóéòå îïåðàòîð, ïîäîáíûé ñëåäóþùå-
ìó, êîòîðûé îòîáðàæàåò ðåçóëüòàò LenTrim äëÿ ñòðîêè " Excel 2007 ":
MsgBox LenTrim (" Excel 2007 ")
 ýòîì îïåðàòîðå ñòðîêà àðãóìåíòà èìååò ÷åòûðå íà÷àëüíûõ è ÷åòûðå êî-
íå÷íûõ ïðîáåëà, è äëèíà ñòðîêè (êàê óêàçûâàåò VBA-ôóíêöèÿ Len) ðàâíà 18
ñèìâîëàì. Ôóíêöèÿ LenTrim ñîîáùàåò äëèíó ñòðîêè áåç íà÷àëüíûõ è êîíå÷-
íûõ ïðîáåëîâ; âûøåóêàçàííûé îïåðàòîð îòîáðàæàåò ÷èñëî 10.

Ñîçäàíèå îïðåäåëåííûõ ïîëüçîâàòåëåì ôóíêöèé äëÿ Excel


Ôóíêöèè-ïðîöåäóðû ñ íåêîòîðûìè îãðàíè÷åíèÿìè íà èõ äåéñòâèÿ íàçûâà-
þòñÿ îïðåäåëåííûìè ïîëüçîâàòåëåì ôóíêöèÿìè (èëè ñîêðàùåííî UDF —
user-defined functions), è òîëüêî èõ ìîæåò èñïîëüçîâàòü Excel â ôîðìóëå ÿ÷åé-
êè ðàáî÷åãî ëèñòà.
Âñå îãðàíè÷åíèÿ îïðåäåëåííûõ ïîëüçîâàòåëåì ôóíêöèé ïðîèñõîäÿò èç îä-
íîãî áàçîâîãî îãðàíè÷åíèÿ: UDF íå ìîæåò íèêàêèì îáðàçîì èçìåíÿòü ñðåäó
Excel. Ýòî îçíà÷àåò, ÷òî îïðåäåëåííàÿ ïîëüçîâàòåëåì ôóíêöèÿ íå ìîæåò âûáè-
182 Ãëàâà 4

ðàòü, âñòàâëÿòü, óäàëÿòü èëè ôîðìàòèðîâàòü íèêàêèå äàííûå â ðàáî÷åì ëèñòå,


òàáëèöå èëè äðóãîì ëèñòå. UDF òàêæå íå ìîæåò äîáàâëÿòü, óäàëÿòü èëè ïåðå-
èìåíîâûâàòü ëèñòû èëè ðàáî÷èå êíèãè, íå ìîæåò èçìåíÿòü ýêðàííîå ïðåäñòàâ-
ëåíèå è òàê äàëåå. Íàïðèìåð, íåëüçÿ èñïîëüçîâàòü ôóíêöèþ-ïðîöåäóðó êàê
îïðåäåëåííóþ ïîëüçîâàòåëåì ôóíêöèþ â Excel, åñëè îíà âûäåëÿåò ÿ÷åéêè èëè
èçìåíÿåò êàêèì-òî îáðàçîì òåêóùèé ðàáî÷èé ëèñò.
Êðîìå òîãî, UDF íå ìîæåò óñòàíàâëèâàòü ñâîéñòâà îáúåêòà èëè èñïîëüçî-
âàòü ìåòîäû îáúåêòà; â áîëüøèíñòâå ñëó÷àåâ óñòàíîâêà ñâîéñòâ îáúåêòà èëè
èñïîëüçîâàíèå åãî ìåòîäîâ ïðèâîäÿò ê èçìåíåíèÿì â ñðåäå Excel (îáúåêòû, ìå-
òîäû è ñâîéñòâà îïèñûâàþòñÿ â ãëàâå 6). Îïðåäåëåííàÿ ïîëüçîâàòåëåì ôóíê-
öèÿ ìîæåò îñóùåñòâëÿòü âûáîðêó çíà÷åíèé ñâîéñòâ îáúåêòà è âûïîëíÿòü ëþ-
áûå ìåòîäû îáúåêòà, êîòîðûå íå èçìåíÿþò ñðåäó Excel.
Îáû÷íî îïðåäåëåííàÿ ïîëüçîâàòåëåì ôóíêöèÿ äîëæíà òîëüêî âûïîëíÿòü
âû÷èñëåíèÿ èëè ìàíèïóëèðîâàíèå íà îñíîâå äàííûõ, ïîëó÷åííûõ èç åå ñïè-
ñêà àðãóìåíòîâ èëè âûáðàííûõ èç Excel. Ôóíêöèþ LenTrim, ïîêàçàííóþ â
ëèñòèíãå 4.9, ìîæíî èñïîëüçîâàòü êàê îïðåäåëåííóþ ïîëüçîâàòåëåì ôóíê-
öèþ, ïîñêîëüêó îíà îòâå÷àåò âñåì òðåáîâàíèÿì UDF.
Ñëåäóåò ïîìíèòü î òîì, ÷òî íè VBA, íè Excel íå îòîáðàæàþò ñîîáùåíèå îá
îøèáêå, åñëè â êà÷åñòâå UDF èñïîëüçóåòñÿ ôóíêöèÿ, â êîòîðîé íàðóøåíû ïðà-
âèëà äëÿ îïðåäåëåííûõ ïîëüçîâàòåëåì ôóíêöèé. Òàêàÿ ôóíêöèÿ ïðîñòî íå ìî-
æåò âîçâðàùàòü ðåçóëüòàò. Íàïðèìåð, ïðè ïîïûòêå âñòàâèòü çíà÷åíèå â ðàáî-
÷èé ëèñò Excel, èñïîëüçóÿ ôóíêöèþ-ïðîöåäóðó, íàðóøàþùóþ ïðàâèëà äëÿ îï-
ðåäåëåííûõ ïîëüçîâàòåëåì ôóíêöèé, ÿ÷åéêà ñ òàêîé ôóíêöèåé îòîáðàæàåò
Excel-ñîîáùåíèå îá îøèáêå #VALUE!, îáîçíà÷àþùåå, ÷òî ôóíêöèÿ èëè ôîð-
ìóëà äëÿ ýòîé ÿ÷åéêè íå ìîæåò âîçâðàùàòü äîïóñòèìûé ðåçóëüòàò.
VBA çàïðåùàåò ïðèñâàèâàíèå íåñîâìåñòèìîãî òèïà ðåçóëüòàòó ôóíêöèè â
ëþáîé ôóíêöèè-ïðîöåäóðå, êîòîðàÿ èìååò îáúÿâëåííûé òèï äàííûõ äëÿ åå ðå-
çóëüòàòà. Åñëè, íàïðèìåð, âû îøèáî÷íî íàïèñàëè îïåðàòîð ïðèñâàèâàíèÿ
ôóíêöèè òàê, ÷òî ïðèñâàèâàåòñÿ, äîïóñòèì, òèï Integer ðåçóëüòàòó ôóíêöèè
ñ îáúÿâëåííûì òèïîì String, òî VBA îòîáðàæàåò îøèáêó íåñîâïàäåíèÿ òèïà.
 ñëó÷àå ïðèñâàèâàíèÿ òèïà äàííûõ, êîòîðûé íå ÿâëÿåòñÿ òåì æå, ÷òî îáú-
ÿâëåííûé âîçâðàùàåìûé òèï äëÿ ôóíêöèè-ïðîöåäóðû, íî ÿâëÿåòñÿ ñîâìåñòè-
ìûì, òî VBA ïðåîáðàçóåò çíà÷åíèå òèïà, îïðåäåëåííîãî äëÿ ôóíêöèè ïðè âîç-
âðàòå ðåçóëüòàòà ôóíêöèè. Íàïðèìåð, åñëè ïðèñâàèâàåòñÿ òèï Double ôóíê-
öèè, ðåçóëüòàò êîòîðîé áûë îáúÿâëåí êàê Long, òî VBA íå âûäàåò íèêàêîé
îøèáêè, à ïðîñòî ïðåîáðàçóåò Double â òèï Long (ïðè âîçâðàùåíèè ðåçóëüòàòà
ôóíêöèè).
Îáúÿâëåíèå òèïà ôóíêöèè èìååò åùå îäèí ðåçóëüòàò: åñëè ôóíêöèÿ-ïðîöå-
äóðà çàêàí÷èâàåòñÿ áåç âûïîëíåíèÿ îïåðàòîðà ïðèñâàèâàíèÿ ôóíêöèè, VBA
âîçâðàùàåò ñòðîêó íóëåâîé äëèíû äëÿ ôóíêöèé òèïà String è 0 — äëÿ ôóíê-
öèé-ïðîöåäóð, âîçâðàùàþùèõ ÷èñëåííûé òèï. Íåòèïèçèðîâàííàÿ ôóíêöèÿ-
ïðîöåäóðà, êîòîðàÿ çàêàí÷èâàåòñÿ áåç âûïîëíåíèÿ îïåðàòîðà ïðèñâàèâàíèÿ
ôóíêöèè, âîçâðàùàåò ðåçóëüòàò òèïà Variant, ñîäåðæàùèé ñïåöèàëüíîå çíà-
÷åíèå Empty.
 ëèñòèíãå 4.10 ïðèâåäåíà ôóíêöèÿ LenTrim, ìîäèôèöèðîâàííàÿ òàê, ÷òî
îíà âñåãäà âîçâðàùàåò çíà÷åíèå òèïà Long.

Ëèñòèíã 4.10. Çàäàíèå òèïà ôóíêöèè LenTrim


1: Function LenTrim(tStr) As Long
Ôóíêöèè â Visual Basic 183

2: 'âîçâðàùàåò äëèíó tStr áåç âåäóùèõ è õâîñòîâûõ ïðîáåëîâ


3: LenTrim = Len(Trim(tStr))
4: End Function

Ñëåäóåò âûáèðàòü òèï ðåçóëüòàòà ôóíêöèé-ïðîöåäóð, òðåáóþùèé íàèìåíü-


øåãî îáúåìà ïàìÿòè, íî âìåùàþùèé ïîëíûé äèàïàçîí âîçìîæíûõ çíà÷åíèé,
êîòîðûå ìîæåò âîçâðàùàòü ôóíêöèÿ. Äëÿ ôóíêöèé îáùåãî íàçíà÷åíèÿ ÷èñ-
ëåííûõ èëè ìàòåìàòè÷åñêèõ íàèáîëåå õàðàêòåðíûì òèïîì äëÿ ðåçóëüòàòà
ôóíêöèè ÿâëÿåòñÿ Double.

Îáúÿâëåíèå òèïîâ äàííûõ äëÿ àðãóìåíòîâ ôóíêöèè


Åñëè òîëüêî íå áûëî îïðåäåëåíî èíà÷å, VBA ïåðåäàåò âñå àðãóìåíòû â
ôóíêöèþ-ïðîöåäóðó êàê òèïû Variant. Ìîæíî îáúÿâëÿòü îïðåäåëåííûå
òèïû äàííûõ äëÿ êàæäîãî àðãóìåíòà â ñïèñêå àðãóìåíòîâ.
Àðãóìåíòû ñ îïðåäåëåííûìè òèïàìè èñïîëüçóþòñÿ ïî òåì æå çíàêîìûì
ïðè÷èíàì, ïî êàêèì èñïîëüçóþòñÿ òèïèçèðîâàííûå ïåðåìåííûå èëè ðåçóëü-
òàòû ôóíêöèè. Îïðåäåëåíèå òèïîâ àðãóìåíòîâ äëÿ ôóíêöèè-ïðîöåäóðû òàêæå
ïîìîãàåò ïîëüçîâàòåëþ ïðè âûçîâå ôóíêöèè ââîäèòü àðãóìåíòû ïðàâèëüíîãî
òèïà â ïðàâèëüíîì ïîðÿäêå.
Äëÿ îáúÿâëåíèÿ îïðåäåëåííûõ òèïîâ àðãóìåíòîâ ôóíêöèè-ïðîöåäóðû, èñ-
ïîëüçóéòå êëþ÷åâîå ñëîâî As, çà êîòîðûì ñëåäóåò èìÿ íóæíîãî òèïà äàííûõ
ïîñëå èìåíè àðãóìåíòà â ñïèñêå àðãóìåíòîâ. Ëèñòèíã 4.11 ïîêàçûâàåò ôóíê-
öèþ LenTrim, ìîäèôèöèðîâàííóþ òàê, ÷òîáû îíà ïðèíèìàëà òîëüêî äàííûå
òèïà String â àðãóìåíòå tStr.

Ëèñòèíã 4.11. Îïðåäåëåíèå òèïà äàííûõ àðãóìåíòà ôóíêöèè LenTrim


1: Function LenTrim(tStr As String) As Long
2: 'âîçâðàùàåò äëèíó tStr áåç âåäóùèõ è õâîñòîâûõ ïðîáåëîâ
3: LenTrim = Len(Trim(tStr))
4: End Function

Çà èñêëþ÷åíèåì îáúÿâëåíèÿ ôóíêöèè-ïðîöåäóðû (â ñòðîêå 1), ëèñòèíã 4.11


èäåíòè÷åí ëèñòèíãó 4.10. Ïîñëå òîãî êàê òèï àðãóìåíòà îáúÿâëåí, VBA ïðè
âûçîâå ôóíêöèè LenTrim äîïóñêàåò â êà÷åñòâå àðãóìåíòà ïîÿâëåíèå òîëüêî
çíà÷åíèé òèïà String. Âûçîâ LenTrim ñ êàêèì-ëèáî äðóãèì òèïîì (äàæå
Variant) â êà÷åñòâå àðãóìåíòà âûçûâàåò îøèáêó íåñîâïàäåíèÿ òèïà (êîíêðåò-
íåå, íåñîâïàäåíèå òèïà àðãóìåíòà — argument type mismatch).

Èñïîëüçîâàíèå ôóíêöèé-ïðîöåäóð â VBA


Èñïîëüçóéòå ñîáñòâåííûå ôóíêöèè-ïðîöåäóðû â îïåðàòîðàõ VBA òàê æå,
êàê ëþáûå âñòðîåííûå ôóíêöèè VBA; âñå ïðàâèëà è óñëîâèÿ ïî èñïîëüçîâà-
íèþ âñòðîåííûõ ôóíêöèé ïðèìåíèìû ê ïîëüçîâàòåëüñêèì ôóíêöèÿì-ïðîöå-
äóðàì.
Ïîìíèòå, ÷òî ïðè âûçîâå ôóíêöèè íåîáõîäèìî âêëþ÷àòü ñïèñîê àðãóìåíòîâ
â êðóãëûõ ñêîáêàõ, åñëè òîëüêî âû íå ñîáèðàåòåñü èãíîðèðîâàòü ðåçóëüòàò
ôóíêöèè. Êàê è â ñëó÷àå ñî âñòðîåííûìè ôóíêöèÿìè VBA, ìîæíî èãíîðèðî-
âàòü ðåçóëüòàò âàøåé ñîáñòâåííîé ôóíêöèè, õîòÿ ýòî ðåäêî áûâàåò íåîáõîäèìî.
184 Ãëàâà 4

Åñëè íóæíî èñïîëüçîâàòü èìåíîâàííûå àðãóìåíòû â âàøèõ ñîáñòâåííûõ


ôóíêöèÿõ-ïðîöåäóðàõ, ïðîñòî èñïîëüçóéòå èìåíà èç ñïèñêà àðãóìåíòîâ â îáú-
ÿâëåíèè ôóíêöèè-ïðîöåäóðû. Íàïðèìåð, ÷òîáû èñïîëüçîâàòü èìåíîâàííûé
àðãóìåíò â âûçîâå ôóíêöèè LenTrim (ëèñòèíã 4.11), ïðèìåíÿéòå îïåðàòîð, ïî-
äîáíûé ñëåäóþùåìó (AnyStr è MyString — ñòðîêîâûå ïåðåìåííûå):
AnyStr = SLen(tStr:=MyString)
Åñëè âàì òðóäíî çàïîìíèòü âñå èìåíîâàííûå àðãóìåíòû äëÿ îäíîé èç ñâîèõ
ôóíêöèé, óáåäèòåñü, ÷òî ñâîéñòâî Auto Quick Info (êðàòêèå ñâåäåíèÿ) âêëþ÷åíî.
Åñëè ýòî òàê, Ðåäàêòîð VB îòîáðàæàåò âñïëûâàþùåå îêíî ñ ïåðå÷íåì èìåíî-
âàííûõ àðãóìåíòîâ âàøåé ôóíêöèè, êàê äëÿ âñòðîåííûõ ôóíêöèé VBA. Íà
ðèñ. 4.11 ïîêàçàíî Code Window, â êîòîðîì çàôèêñèðîâàí ïðîöåññ ââîäà êîäà
äëÿ âûçîâà ôóíêöèè LenTrim èç ëèñòèíãà 4.9; îáðàòèòå âíèìàíèå íà âñïëû-
âàþùåå îêíî, îòîáðàæàþùåå èìÿ ôóíêöèè, åå èìåíîâàííûé àðãóìåíò.
Ñâîéñòâî Auto Quick Info ìîæíî âêëþ÷àòü è îòêëþ÷àòü, âûáèðàÿ Tools | Options
(Ñåðâèñ | Ïàðàìåòðû) äëÿ îòîáðàæåíèÿ äèàëîãîâîãî îêíà Parameters (Ïàðàìåò-
ðû). Ùåëêíèòå íà âêëàäêå Editor (Ðåäàêòîð) äëÿ îòîáðàæåíèÿ îïöèé Ðåäàêòîðà
VB è çàòåì óñòàíîâèòå èëè îòìåíèòå óñòàíîâêó ôëàæêà Auto Quick info (êðàòêèå
ñâåäåíèÿ).

Èñïîëüçîâàíèå èíñòðóìåíòà Object Browser äëÿ íàõîæäåíèÿ


ôóíêöèé-ïðîöåäóð
Åñëè âû íå ìîæåòå âñïîìíèòü, â êàêîì ìîäóëå ñîõðàíèëè íåêîòîðóþ ôóíê-
Ðèñ. 4.11
Ñâîéñòâî Auto Quick
Info ïîçâîëÿåò
îòîáðàæàòü
âñïëûâàþùåå îêíî,
ïîêàçûâàþùåå ñïèñîê
àðãóìåíòîâ âàøåé
ñîáñòâåííîé ôóíêöèè,
êàê è äëÿ âñòðîåííûõ
ôóíêöèé VBA

öèþ, ìîæíî èñïîëüçîâàòü 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

1. Âûáåðèòå íàèìåíîâàíèå ïðîåêòà â ðàñêðûâàþùåìñÿ ñïèñêå Project/Lib-


rary. Íà ðèñ. 4.12 ïîêàçàíî îêíî Object Browser ñ âûáðàííûì â Project/Lib-
rary-ñïèñêå ýëåìåíòîì Project (â Excel ïîäîáíûé ýëåìåíò íàçûâàåòñÿ
VBAProject). Îêíî Project Explorer óêàçûâàåò èìÿ ôàéëà, â êîòîðîì
ñîõðàíåí ïðîåêò (â êðóãëûõ ñêîáêàõ ïîñëå èìåíè ïðîåêòà).
Ïîñëå òîãî, êàê áûë âûáðàí ïðîåêò â îêíå Project/Library, ñïèñîê Classes
(Êëàññû) ñîäåðæèò ïåðå÷åíü âñåõ ìîäóëåé è äðóãèõ îáúåêòîâ â âûäåëåí-
íîì ïðîåêòå.
2. Âûáåðèòå ìîäóëü â ñïèñêå Classes. Ïîñëå ýòîãî ñïèñîê Members of<class>
(Êîìïîíåíò) ñîäåðæèò ïåðå÷åíü âñåõ ïðîöåäóð è ôóíêöèé, îáúÿâëåííûõ
â âûáðàííîì ìîäóëå.
3. Âûáåðèòå ôóíêöèþ èëè ïðîöåäóðó, èñõîäíûé êîä êîòîðîé íåîáõîäèìî
ïðîñìîòðåòü, â ñïèñêå Members of<class> (Êîìïîíåíò).
4. Ùåëêíèòå íà êíîïêå Show (ïîêàçàòü) äëÿ îòîáðàæåíèÿ èñõîäíîãî êîäà
ôóíêöèè èëè ïðîöåäóðû. Ðåäàêòîð VB îòêðûâàåò ñîîòâåòñòâóþùèé ìî-
äóëü è ïîìåùàåò êóðñîð íà ïåðâóþ ñòðîêó ïîñëå îáúÿâëåíèÿ ôóíêöèè
èëè ïðîöåäóðû.
Ðèñ. 4.12
Èñïîëüçóéòå Object
Browser äëÿ
íàõîæäåíèÿ
VBA-ôóíêöèé

Ìîæíî òàêæå êîïèðîâàòü òåêñò èç îêíà Object Browser äëÿ ñâîèõ ôóíêöèé è
ïðîöåäóð â áóôåð Windows (Clipboard) òàê æå, êàê è â ñëó÷àå ñî âñòðîåííûìè
ôóíêöèÿìè VBA.
Ïîìíèòå, ÷òî êíîïêà Show â îêíå Object Browser âêëþ÷àåòñÿ, òîëüêî åñëè èñ-
õîäíûé êîä äëÿ âûáðàííîé ôóíêöèè èëè äðóãîé ïðîöåäóðû äîñòóïåí.
Íå ïûòàéòåñü èñïîëüçîâàòü äèàëîãîâîå îêíî Ìàêðîñ (îòêðûâàåìîå ñ
ïîìîùüþ êîìàíäû Ðàçðàáîò÷èê | Ìàêðîñû) äëÿ âûïîëíåíèÿ ôóíêöèè-ïðîöåäó-
ðû. VBA «îæèäàåò», ÷òî ôóíêöèÿ-ïðîöåäóðà ïðåäíàçíà÷åíà äëÿ òîãî, ÷òîáû
âîçâðàùàòü çíà÷åíèå, ïîýòîìó íåò ñìûñëà òîëüêî â âûïîëíåíèè ôóíêöèè. Ïî
ýòîé ïðè÷èíå VBA íå ïåðå÷èñëÿåò ôóíêöèè-ïðîöåäóðû â ñïèñêå Èìÿ ìàêðîñà
â äèàëîãîâîì îêíå Ìàêðîñ. Ýòî äåìîíñòðèðóåòñÿ íà ðèñ. 4.13, ãäå â ñïèñêå
ìàêðîñîâ èìååòñÿ òîëüêî ïðîöåäóðà (ïðîãðàììà) Test_LenTrim.
186 Ãëàâà 4

Ââîä îïèñàíèÿ ôóíêöèè-ïðîöåäóðû ñ ïîìîùüþ


èíñòðóìåíòà Object Browser
Âåðíåìñÿ ê ðèñ. 4.12. Â ñïèñêå Members of<class> (Êîìïîíåíò) âûáðàíà ôóíê-

Ðèñ. 4.13
VBA íå ïåðå÷èñëÿåò ôóíêöèè-ïðîöåäóðû
â ñïèñêå Èìÿ ìàåðîñà
îêíà Ìàêðîñ

öèÿ LenTrim èç ëèñòèíãà 4.11. Çàìåòüòå, êàê è â ñëó÷àå ñî âñòðîåííûìè ôóíê-


öèÿìè VBA è ôóíêöèÿìè host-ïðèëîæåíèÿ, èìÿ ôóíêöèè è åå àðãóìåíòû îòî-
áðàæàþòñÿ â íèæíåé ÷àñòè îêíà Object Browser (ïîä ñïèñêàìè Classes è
Members). Îäíàêî â îòëè÷èå îò âñòðîåííûõ ôóíêöèé VBA, íèêàêîãî îïèñàíèÿ
íàçíà÷åíèÿ ôóíêöèè íå ïîÿâëÿåòñÿ. Äëÿ äîáàâëåíèÿ îïèñàíèÿ ê êàæäîé èç
âàøèõ ôóíêöèé èëè ïðîöåäóð ìîæíî èñïîëüçîâàòü Object Browser. Îïèñàíèå,
ââîäèìîå äëÿ ôóíêöèè ñ ïîìîùüþ îêíà Object Browser, ïîÿâëÿåòñÿ íå òîëüêî â
îêíå Object Browser, íî è â Function Wizard (ìàñòåðå ôóíêöèé) Excel. Îáåñïå÷åíèå
ôóíêöèè-ïðîöåäóðû îïèñàíèåì ïîìîãàåò äðóãèì ïîëüçîâàòåëÿì èñïîëüçîâàòü
âàøó ôóíêöèþ â ôîðìóëå ÿ÷åéêè ðàáî÷åãî ëèñòà.
×òîáû ââåñòè îïèñàíèå äëÿ ôóíêöèè-ïðîöåäóðû, âûïîëíèòå ñëåäóþùèå øàãè:
1. Âûáåðèòå ôóíêöèþ-ïðîöåäóðó â îêíå Object Browser, êàê áûëî îïèñàíî
ðàíåå.
2. Ùåëêíèòå ïðàâîé êíîïêîé ìûøè íà ôóíêöèè, ê êîòîðîé íåîáõîäèìî äî-
áàâèòü îïèñàíèå, è âûáåðèòå Properties (Ñâîéñòâà) âî âñïëûâàþùåì ìåíþ.
Ðåäàêòîð VB îòîáðàæàåò äèàëîãîâîå îêíî Member Options (Ïàðàìåòðû
êîìïîíåíòà), ïîêàçàííîå íà ðèñ. 4.14.
3. Ââåäèòå îïèñàíèå äëÿ ôóíêöèè (èëè ïðîöåäóðû) â òåêñòîâîå îêíî Descrip-
tion (Îïèñàíèå). Íà ðèñ. 4.14 ïîêàçàíî îïèñàíèå ôóíêöèè LenTrim, óæå
ââåäåííîå â òåêñòîâîå îêíî Description.
4. Ùåëêíèòå íà ÎÊ. Âû âíîâü îêàçûâàåòåñü â îêíå Object Browser.
Ôóíêöèè â Visual Basic 187

Ðèñ. 4.14
Ââîäèòå ïîëåçíûå îïèñàíèÿ
äëÿ ôóíêöèé è ïðîöåäóð â äèàëîãîâîå
îêíî Member Options

Èñïîëüçîâàíèå ôóíêöèé ïîëüçîâàòåëÿ


â ðàáî÷èõ ëèñòàõ Excel
×òîáû èñïîëüçîâàòü ñâîè ôóíêöèè (îïðåäåëåííûå ïîëüçîâàòåëåì) â Excel,
ââîäèòå èìÿ ôóíêöèè è åå àðãóìåíòû êàê ôîðìóëó â ÿ÷åéêó ðàáî÷åãî ëèñòà
òàê æå, êàê âû ââîäèòå ëþáóþ âñòðîåííóþ ôóíêöèþ Excel.
Åñëè âû íå ìîæåòå çàïîìíèòü èìÿ îïðåäåëåííîé ïîëüçîâàòåëåì ôóíêöèè
èëè åå àðãóìåíòû, ìîæíî íàéòè ýòó ôóíêöèþ â ñïèñêå Function name äëÿ êàòå-
ãîðèè User-Defined, óêàçàííîé â ñïèñêå Function category äèàëîãîâîãî îêíà Paste
Function. [Îòîáðàçèòü äèàëîãîâîå îêíî Paste Function (Ìàñòåð ôóíêöèé) Excel
ìîæíî, ùåëêàÿ íà êíîïêå Paste Function (Âñòàâêà ôóíêöèè) íà ïàíåëè èíñòðó-
ìåíòîâ èëè âûáèðàÿ â ìåíþ Insert | Function (Âñòàâêà | Ôóíêöèÿ).]
Âñòàâëÿéòå ôóíêöèè VBA èç äèàëîãîâîãî îêíà Paste Function, êàê ëþáûå
âñòðîåííûå ôóíêöèè Excel. Ïðè íåîáõîäèìîñòè â ýòîì æå îêíå âñòàâëÿéòå è
çíà÷åíèÿ äëÿ àðãóìåíòîâ ôóíêöèè.
Åñëè ïðè èñïîëüçîâàíèè îïðåäåëåííîé ïîëüçîâàòåëåì ôóíêöèè (UDF) â
ÿ÷åéêå ðàáî÷åãî ëèñòà îòîáðàæàåìûì ðåçóëüòàòîì ÿâëÿåòñÿ çíà÷åíèå îøèáêè
#VALUE!, âíèìàòåëüíî ïðîâåðüòå êîä â âàøåé ôóíêöèè-ïðîöåäóðå, ÷òîáû
óáåäèòüñÿ, ÷òî îí íå íàðóøàåò êàêèõ-ëèáî ïðàâèë äëÿ îïðåäåëåííûõ ïîëüçîâà-
òåëåì ôóíêöèé. Íè Excel, íè VBA íå ïðåïÿòñòâóþò èñïîëüçîâàíèþ â ÿ÷åéêå
ðàáî÷åãî ëèñòà ôóíêöèè-ïðîöåäóðû, êîòîðàÿ íàðóøàåò UDF-ïðàâèëà. Îäíàêî,
ïîñêîëüêó ôóíêöèÿ-ïðîöåäóðà íàðóøàåò UDF-ïðàâèëà, VBA íå âûïîëíÿåò ýòó
ôóíêöèþ, à âîçâðàùàåò ÿ÷åéêå çíà÷åíèå îøèáêè #VALUE!.
Ïðè íàïèñàíèè ôóíêöèè-ïðîöåäóðû ïîìíèòå, ÷òî îñîáûì íàçíà÷åíèåì
ôóíêöèè ÿâëÿåòñÿ âîçâðàùåíèå êàêîãî-ëèáî çíà÷åíèÿ. Ïèøèòå ïðîñòûå è çíà-
÷èìûå ôóíêöèè. Îáû÷íî ôóíêöèÿ äîëæíà ñîäåðæàòü ïðîãðàììíûé êîä, íåîá-
õîäèìûé òîëüêî äëÿ âûïîëíåíèÿ íåêîòîðûõ âû÷èñëåíèé èëè ìàíèïóëèðîâà-
íèÿ äàííûìè; ôóíêöèÿ íèêîãäà íå äîëæíà âûïîëíÿòü äåéñòâèÿ, íå îòíîñÿ-
ùèåñÿ íåïîñðåäñòâåííî ê ñîçäàíèþ åå âîçâðàùàåìîãî çíà÷åíèÿ.
Ïèøèòå ôóíêöèþ âñÿêèé ðàç, êîãäà âàì íåîáõîäèìî èñïîëüçîâàòü îäíó è
òó æå ìàòåìàòè÷åñêóþ ôîðìóëó áîëåå äâóõ-òðåõ ðàç. Êàê ïîêàçûâàþò ïðèìå-
ðû â ýòîé ãëàâå, ôóíêöèè-ïðîöåäóðû ïîëåçíû òàêæå ïðè ìàíèïóëèðîâàíèè è
äðóãèìè äàííûìè, à íå òîëüêî ÷èñëàìè.
Äàæå åñëè âûðàæåíèå äëÿ êàêîãî-ëèáî âû÷èñëåíèÿ ìîæåò áûòü ñîâñåì ïðî-
ñòûì, âñå æå ñëåäóåò ïèñàòü ôóíêöèþ-ïðîöåäóðó, åñëè âû èñïîëüçóåòå ýòî âû-
ðàæåíèå ÷àñòî. Òàêèì îáðàçîì âû óñòðàíÿåòå âåðîÿòíîñòü îøèáêè ïðè ââîäå
âûðàæåíèÿ è äàåòå ýòîìó âûðàæåíèþ çíà÷àùåå èìÿ.
Õîòÿ ìîæíî èãíîðèðîâàòü ðåçóëüòàòû ôóíêöèé-ïðîöåäóð, ñëåäóåò âñå æå
òàê ïèñàòü ôóíêöèè-ïðîöåäóðû, ÷òîáû èãíîðèðîâàíèå èõ ðåçóëüòàòîâ íå èìå-
188 Ãëàâà 4

ëî ñìûñëà. Äðóãèìè ñëîâàìè, ôóíêöèè íå äîëæíû âûïîëíÿòü äåéñòâèÿ, êðîìå


àáñîëþòíî íåîáõîäèìûõ äëÿ âûäà÷è íóæíûõ âîçâðàùàåìûõ ðåçóëüòàòîâ.
Íå ñ÷èòàéòå VBA-ôóíêöèþ MsgBox ïðèìåðîì äëÿ íàïèñàíèÿ ôóíêöèé.
Ôóíêöèÿ MsgBox âûïîëíÿåò óíèêàëüíóþ çàäà÷ó â VBA; â ðåçóëüòàòå îíà äåëà-
åò íàìíîãî áîëüøóþ ðàáîòó ñ áîëüøèì êîëè÷åñòâîì îïöèé, ÷åì îáû÷íî âûïîë-
íÿþò ôóíêöèè. È, íàîáîðîò, ñ÷èòàéòå VBA-ôóíêöèè StrComp, Mid, ôóíêöèè
ïðåîáðàçîâàíèÿ äàííûõ CStr è CDbl è òàê äàëåå ïðèìåðîì òîãî, êàê äîëæíà
äåéñòâîâàòü ôóíêöèÿ-ïðîöåäóðà. Êàæäàÿ ôóíêöèÿ âûïîëíÿåò îäíó çàäà÷ó è
âîçâðàùàåò îäèí ðåçóëüòàò áåç èçìåíåíèÿ èñõîäíûõ äàííûõ, ñîäåðæàùèõñÿ â
ïåðåäàííûõ åé àðãóìåíòàõ.
Íå ïûòàéòåñü èñïîëüçîâàòü ïåðåäàâàåìûå ïî ññûëêå àðãóìåíòû äëÿ ñîçäàíèÿ
ôóíêöèè, âîçâðàùàþùåé áîëåå îäíîãî ðåçóëüòàòà, èñïîëüçóÿ âîçâðàùàåìîå
çíà÷åíèå ôóíêöèè è îäèí èëè áîëüøå ìîäèôèöèðîâàííûõ àðãóìåíòîâ äëÿ ïî-
ëó÷åíèÿ ðåçóëüòàòîâ. Ôóíêöèÿ íèêîãäà íå äîëæíà èçìåíÿòü èñõîäíûå äàííûå â
ïåðåäàâàåìûõ åé àðãóìåíòàõ. Â ãëàâå 5 áóäåò ïîêàçàíî, ÷òî ñóùåñòâóþò îáîñíî-
âàííûå óñëîâèÿ, ïðè êîòîðûõ ñëåäóåò ìîäèôèöèðîâàòü çíà÷åíèÿ â àðãóìåíòàõ,
ïåðåäàâàåìûõ ïî ññûëêå; ïðè ýòèõ óñëîâèÿõ íåîáõîäèìî èñïîëüçîâàòü ïðîöåäó-
ðó, à íå ôóíêöèþ. Ñëåäèòå çà òåì, ÷òîáû âàøè ôóíêöèè íå èçìåíÿëè ïåðåäàâàå-
ìûå ïî ññûëêå àðãóìåíòû; èñïîëüçóéòå êëþ÷åâîå ñëîâî ByVal äëÿ ïåðåäà÷è àð-
ãóìåíòîâ ïî çíà÷åíèþ. (Ïîäðîáíåå îá ýòîì ÷èòàéòå òàêæå â ãëàâå 5.)
Ìíîãèå âàøè ïðîãðàììû äîëæíû èñïîëüçîâàòüñÿ íå òîëüêî â ïðîãðàììàõ
èëè ðàáî÷èõ ëèñòàõ, äëÿ êîòîðûõ âû ïåðâîíà÷àëüíî íàïèñàëè ôóíêöèþ-ïðî-
öåäóðó. Ôóíêöèÿ LenTrim, êîòîðàÿ îáñóæäàëàñü â ýòîé ãëàâå, íàïðèìåð, ÿâ-
ëÿåòñÿ ôóíêöèåé îáùåãî íàçíà÷åíèÿ è ìîæåò áûòü ïîëåçíîé â öåëîì ðÿäå ðàç-
ëè÷íûõ âûðàæåíèé â ðàçíûõ ïðîöåäóðàõ.
Ïîñêîëüêó ôóíêöèÿ-ïðîöåäóðà â äîêóìåíòå îòêðûòîãî ïðîåêòà äîñòóïíà
äëÿ ëþáîãî îòêðûòîãî â äàííûé ìîìåíò äîêóìåíòà â îäíîì è òîì æå ïðèëîæå-
íèè, ìîæíî ñîáðàòü óíèâåðñàëüíûå ôóíêöèè â îäèí ïðîåêò. Îáúåäèíÿÿ ôóíê-
öèè-ïðîöåäóðû îáùåãî íàçíà÷åíèÿ â îäíîì ïðîåêòå, ìîæíî ñîçäàòü áèáëèîòå-
êó (library) ôóíêöèé. Íàïðèìåð, ìîæíî ïîìåñòèòü âñå âàøè óíèâåðñàëüíûå
Excel-ôóíêöèè-ïðîöåäóðû â ôàéë ðàáî÷åé êíèãè ñ èìåíåì MyFunctions.xls.
Äðóãîé ïðèìåð: ìîæíî ïîìåñòèòü âñå âàøè óíèâåðñàëüíûå Word-ôóíêöèè â
äîêóìåíò øàáëîíà ñ èìåíåì MyFunctions.dot è ò.ä.
Ñëåäèòå çà òåì, ÷òîáû ñîçäàâàåìàÿ âàìè ôóíêöèÿ ñîäåðæàëà ïðèñâàèâàíèå
ôóíêöèè. Òî åñòü, ÷òîáû ôóíêöèÿ âîçâðàùàëà ðåçóëüòàò, îòëè÷íûé îò ïóñòîãî
çíà÷åíèÿ ïî óìîë÷àíèþ òèïà Variant, ñòðîêè íóëåâîé äëèíû òèïà String
èëè íóëåâîãî ÷èñëåííîãî çíà÷åíèÿ. Ñëåäèòå çà òåì, ÷òîáû ïðîãðàììíûé êîä
ôóíêöèè îòâå÷àë âñåì ïðàâèëàì äëÿ îïðåäåëåííûõ ïîëüçîâàòåëåì ôóíêöèé,
îïèñàííûõ â íà÷àëå ýòîé ãëàâû, åñëè âû ïðåäïîëàãàåòå èñïîëüçîâàòü ôóíêöèþ
êàê UDF â Excel.

Ñîçäàíèå ôóíêöèé äëÿ Excel


Ïðè íàïèñàíèè ôóíêöèé-ïðîöåäóð äëÿ èñïîëüçîâàíèÿ â êà÷åñòâå UDF â ðà-
áî÷èõ ëèñòàõ Excel íåîáõîäèìî çíàòü íåñêîëüêî ôàêòîâ, ïîìèìî îáùèõ òðåáî-
âàíèé äëÿ îïðåäåëåííûõ ïîëüçîâàòåëåì ôóíêöèé:
¨ Îïðåäåëåííûå ïîëüçîâàòåëåì ôóíêöèè, êîòîðûå áóäóò èñïîëüçîâàòüñÿ â
Excel, íå äîëæíû èìåòü èìåíà, ïîõîæèå íà çàïèñè ññûëîê íà ÿ÷åéêó
òèïà A1 èëè R1C1.
Ôóíêöèè â Visual Basic 189

¨ Ëþáûå ñòðîêîâûå (òåêñòîâûå) äàííûå, âîçâðàùàåìûå èç VBA â Excel, íå


äîëæíû èìåòü áîëåå 255 ñèìâîëîâ â äëèíó. Åñëè UDF âîçâðàùàåò ñòðîêó,
èìåþùóþ áîëüøå 255 ñèìâîëîâ â äëèíó, â ÿ÷åéêó ðàáî÷åãî ëèñòà, Excel
óêîðà÷èâàåò ñòðîêó äî ìàêñèìàëüíîé äëèíû 255 ñèìâîëîâ ïåðåä âñòàâ-
êîé åå â ÿ÷åéêó.
¨ Ïðè íàïèñàíèè UDF, âîçâðàùàþùåé çíà÷åíèå äàòû äëÿ Excel óáåäèòåñü,
÷òî çàäàåòå òèï ðåçóëüòàòà ôóíêöèè êàê Date. Excel ïðèìåíÿåò ôîðìàò
Date äëÿ ðåçóëüòàòà ôóíêöèè â ÿ÷åéêå ðàáî÷åãî ëèñòà òîëüêî, åñëè ðå-
çóëüòàò èìååò VBA-òèï Date.
Ñóùåñòâóåò åùå îäíî îáñòîÿòåëüñòâî, ñâÿçàííîå ñ òåì, â êàêîé ìîìåíò âðå-
ìåíè Excel ôàêòè÷åñêè âûçûâàåò îïðåäåëåííóþ ïîëüçîâàòåëåì ôóíêöèþ äëÿ
âû÷èñëåíèÿ èëè ïîâòîðíîãî âû÷èñëåíèÿ ôîðìóëû ÿ÷åéêè ðàáî÷åãî ëèñòà, ÷à-
ñòüþ êîòîðîé ÿâëÿåòñÿ UDF.
Ïî óìîë÷àíèþ Excel âûçûâàåò UDF äëÿ ïîâòîðíîãî âû÷èñëåíèÿ ôîðìóëû
ÿ÷åéêè ðàáî÷åãî ëèñòà âñÿêèé ðàç ïðè èçìåíåíèè çíà÷åíèé, èñïîëüçóåìûõ
äëÿ àðãóìåíòîâ ôóíêöèè, âî ìíîãîì òàê æå, êàê äëÿ ëþáîé ôîðìóëû ðàáî÷åãî
ëèñòà. Îäíàêî ìîæíî çàäàòü UDF òàê, ÷òîáû Excel ïîâòîðíî âû÷èñëÿë åå ïðè
ïîâòîðíîì âû÷èñëåíèè ëþáîé ÿ÷åéêè â ðàáî÷åì ëèñòå.
Ñëåäóåò ïîìå÷àòü UDF êàê èçìåíÿþùóþñÿ (volatile) âñÿêèé ðàç, êîãäà çíà-
÷åíèÿ åå àðãóìåíòîâ íå ïîëó÷àþòñÿ èç çíà÷åíèé äðóãèõ ÿ÷ååê ðàáî÷åãî ëèñòà.
Íàïðèìåð, ïðåäïîëîæèì, ôóíêöèÿ ñ èìåíåì Îáùàÿ_Ñòîèìîñòü âû÷èñëÿåò
ñòîèìîñòü óñëóã ïîñòàâùèêà ñåòè Internet ñ ó÷åòîì ÍÄÑ (íàëîã íà äîáàâëåí-
íóþ ñòîèìîñòü). UDF ìîæåò èìåòü äâà àðãóìåíòà: îäèí äëÿ îïðåäåëåíèÿ ÿ÷åé-
êè ðàáî÷åãî ëèñòà, ñîäåðæàùåé çíà÷åíèå ñòîèìîñòè óñëóã áåç ó÷åòà ÍÄÑ,
à äðóãîé — äëÿ îïðåäåëåíèÿ ÿ÷åéêè ðàáî÷åãî ëèñòà, ñîäåðæàùåé ïðîöåíòíóþ
ñòàâêó ÍÄÑ. Ïîñêîëüêó àðãóìåíòû ôóíêöèè Îáùàÿ_Ñòîèìîñòü îïðåäåëÿþò
êîîðäèíàòû ÿ÷åéêè, èçìåíåíèå ñîäåðæèìîãî ÿ÷åéêè íå ìåíÿåò çíà÷åíèå àðãó-
ìåíòîâ ôóíêöèè Îáùàÿ_Ñòîèìîñòü. Ïðè ðåäàêòèðîâàíèè ñîäåðæèìîãî ÿ÷ååê
îáùåé ñòîèìîñòè èëè îáùåé ïðèáûëè, Excel íå âû÷èñëÿåò ïîâòîðíî ôóíêöèþ
Îáùàÿ_Ñòîèìîñòü, ïîýòîìó ôóíêöèÿ Îáùàÿ_Ñòîèìîñòü ìîæåò âûäàòü îøè-
áî÷íûå ðåçóëüòàòû. Åñëè ïîìåòèòü ýòó UDF êàê èçìåíÿþùóþñÿ, îíà áóäåò âñå-
ãäà îòîáðàæàòü ïðàâèëüíîå çíà÷åíèå, ïîòîìó ÷òî Excel áóäåò âñåãäà ïîâòîðíî
âû÷èñëÿòü åå ïðè êàæäîì èçìåíåíèè ëþáîé ÿ÷åéêè â ðàáî÷åì ëèñòå.
Îïðåäåëåííàÿ ïîëüçîâàòåëåì ôóíêöèÿ, êîòîðàÿ ïåðåâû÷èñëÿåòñÿ ïðè êàæ-
äîì èçìåíåíèè ëþáîé ÿ÷åéêè â ðàáî÷åì ëèñòå Excel, íàçûâàåòñÿ èçìåíÿþùåé-
ñÿ ôóíêöèåé. ×òîáû ïîìåòèòü UDF êàê èçìåíÿþùóþñÿ, äîáàâüòå ñëåäóþùèé
îïåðàòîð ê ôóíêöèè ñðàçó çà åå îáúÿâëåíèåì:
Application.Volatile
Ýòîò VBA-îïåðàòîð ïîìå÷àåò UDF êàê èçìåíÿþùóþñÿ ôóíêöèþ, è òàêàÿ
ôóíêöèÿ, íà ñàìîì äåëå, ÿâëÿåòñÿ îñîáûì òèïîì ïðîöåäóðû. Ýòà ïðîöåäóðà
íàçûâàåòñÿ ìåòîäîì (method), ïðèíàäëåæàùèì Excel (îáúåêòû, ìåòîäû
è ñâîéñòâà îïèñûâàþòñÿ â ãëàâå 6). Ïîñêîëüêó ìåòîä ïðèíàäëåæèò Excel, íåîá-
õîäèìî ïðè èñïîëüçîâàíèè ìåòîäà Volatile çàäàâàòü îáúåêò Application,
òî÷íî òàê æå, êàê íåîáõîäèìî çàäàâàòü îáúåêò Application ïðè èñïîëüçîâà-
íèè ôóíêöèè Excel â îïåðàòîðå VBA. Ëèñòèíã 4.12 ïîêàçûâàåò èçìåíÿþùóþ-
ñÿ ôóíêöèþ ñ èìåíåì Îáùàÿ_Ñòîèìîñòü.

Ëèñòèíã 4.12. Èçìåíÿþùàÿñÿ îïðåäåëåííàÿ ïîëüçîâàòåëåì ôóíêöèÿ â Excel


190 Ãëàâà 4

1: Function Îáùàÿ_Ñòîèìîñòü(Ñóììà As Currency, _


2: Ñòàâêà_ÍÄÑ As Single) As Currency
3: Application.Volatile
4: Îáùàÿ_Ñòîèìîñòü = Ñóììà * (Ñòàâêà_ÍÄÑ / 100#) + Ñóììà
5: End Function

Ôóíêöèÿ Îáùàÿ_Ñòîèìîñòü èìååò äâà îáÿçàòåëüíûõ àðãóìåíòà: Ñóììà è


Ñòàâêà_ÍÄÑ. Îäèí àðãóìåíò (Ñóììà — ñòîèìîñòü óñëóã áåç ó÷åòà ÍÄÑ) èìååò
òèï Currency, äðóãîé (Ñòàâêà_ÍÄÑ ïðîöåíòíàÿ ñòàâêà ÍÄÑ) — òèï Single,
òàê êàê ïðåäñòàâëÿåò îáû÷íî ÷èñëî íå áîëåå 100. Îáúÿâëåíèå ôóíêöèè çàêàí-
÷èâàåòñÿ óêàçàíèåì òîãî, ÷òî âîçâðàùàåìîå ôóíêöèåé çíà÷åíèå èìååò òèï
Currency, òàê êàê âîçâðàùàåò çíà÷åíèÿ, ïðåäñòàâëÿþùèå äåíüãè.
Ñòðîêà 3 ñîäåðæèò îïåðàòîð Application.Volatile; êàê è òðåáóåòñÿ, îí
ÿâëÿåòñÿ ïåðâûì îïåðàòîðîì â ôóíêöèè ïîñëå îáúÿâëåíèÿ ôóíêöèè. Îïåðàòîð
Application.Volatile «ðåãèñòðèðóåò» îïðåäåëåííóþ ïîëüçîâàòåëåì ôóíê-
öèþ ñ ïîìîùüþ Excel òàê, ÷òî Excel âûçûâàåò åå äëÿ ïåðåâû÷èñëåíèÿ ôîðìó-
ëû ÿ÷åéêè ðàáî÷åãî ëèñòà, â êîòîðîé ïîÿâëÿåòñÿ ôóíêöèÿ, êàæäûé ðàç ïðè
ïåðåâû÷èñëåíèè ëþáîé ÿ÷åéêè â ðàáî÷åì ëèñòå.
Îäíàêî íå ñëåäóåò çëîóïîòðåáëÿòü ìåòîäîì Application.Volatile. Åñëè
âñå ôóíêöèè ðàáî÷åãî ëèñòà áóäóò èçìåíÿþùèìèñÿ, ýòî ìîæåò ïðèâåñòè ê íå-
íóæíûì ïåðåâû÷èñëåíèÿì, ÷òî óâåëè÷èâàåò îáùåå âðåìÿ, íåîáõîäèìîå äëÿ
ïåðåâû÷èñëåíèÿ ðàáî÷åãî ëèñòà.

Ïðèìåð ðàçðàáîòêè è èñïîëüçîâàíèÿ ôóíêöèè ðàáî÷åãî ëèñòà


 êà÷åñòâå åùå îäíîãî ïðèìåðà ðàññìîòðèì ñïîñîá ïðåäñòàâëåíèÿ
íåêîòîðûõ äàííûõ ñ èñïîëüçîâàíèåì ôóíêöèè ïîëüçîâàòåëÿ. Íåîáõîäèìî
ðåøèòü ñëåäóþùóþ çàäà÷ó. Ó íàñ èìååòñÿ òàáëèöà ñ äàííûìè î òîâàðàõ:
íàèìåíîâàíèÿ, öåíû è ò.ä. Ýòà òàáëèöà, â ÷àñòíîñòè, ìîæåò èñïîëüçîâàòüñÿ
äëÿ ôîðìèðîâàíèÿ òàê íàçûâàåìûõ «ïðàéñ-ëèñòîâ». Öåíû íà òîâàðû
ìåíÿþòñÿ òàê ÷àñòî, ÷òî ìåíåäæåðû åäâà óñïåâàþò ìåíÿòü «öåííèêè» íà
òîâàðû (íåáîëüøèå ëèñòî÷êè ñ èíôîðìàöèåé î íàèìåíîâàíèè è öåíû òîâàðà, à
òàêæå äàòû ôîðìèðîâàíèÿ «öåííèêà» — ðèñ. 4.15).
Ýòè «öåííèêè» íàì íóæíî ôîðìèðîâàòü â îäíîì èç ëèñòîâ Excel (íàïðèìåð,
Ëèñò1), ïîñêîëüêó òàáëèöó ñ òîâàðàìè èç êàêîãî-ëèáî èñòî÷íèêà äàííûõ
òàêæå ëåãêî ïîìåùàòü èìåííî â Excel (ðèñ. 4.16).
Ðèñ. 4.15
«Öåííèê» ñ èíôîðìàöèåé î òîâàðå: íàèìåíîâàíèå, öåíà (â
ðóá.) è äàòà èçìåíåíèÿ öåíû

Äëÿ ðåøåíèÿ ýòîé çàäà÷è ñëåäóåò ê ïðîåêòó VBAProject(CENA.XLS) äîáà-


âèòü ìîäóëü è â ýòîì ìîäóëå ñîçäàòü äâå ôóíêöèè, êàê ïîêàçàíî íà ðèñ. 4.17.
Ôóíêöèÿ CENA âîçâðàùàåò ñòðîêó ñî ñëîâîì «Öåíà», çíà÷åíèåì öåíû èç
öåòâåðòîãî ñòîëáöà ëèñòà Ëèñò1, ñëîâîì (äëÿ ïðèëîæåíèé Windows ýòî äâà
ñëîâà) «ðóá.» è òåêóùåé äàòîé.
Ôóíêöèÿ new_name âîçâðàùàåò íàèìåíîâàíèå òîâàðà áåç ñëóæåáíîé
èíôîðìàöèè, çàêëþ÷åííîé â êðóãëûå ñêîáêè. Äëÿ ýòîãî ïðè ïîìîùè ôóíêöèè
Ôóíêöèè â Visual Basic 191

InStr íàõîäèòñÿ ïîçèöèÿ ñèìâîëà “)” (ïåðâîå âõîæäåíèå ñëåâà), à çàòåì èç


âõîäíîé ñòðîêè (ïîëíîãî èìåíè) âûäåëÿþòñÿ ñèìâîëû, íàõîäÿùèåñÿ ñïðàâà îò
ñèìâîëà “)”.
Äàëåå â äðóãîì ðàáî÷åì ëèñòå (íàïðèìåð, Ëèñò2) íåîáõîäèìî çàïîëíèòü, íà-
ïðèìåð, òðè ÿ÷åéêè ïåðâîé ñòðîêè çàãîëîâêîì ×Ï «Ïåòðîâ Ï.Â.» — íàèìåíî-
âàíèå òîðãóþùåé îðãàíèçàöèè (ðèñ. 4.15).  ÿ÷åéêè âòîðîé ñòðîêè ñëåäóåò çà-
ïèñàòü ôîðìóëû =new_name(Ëèñò1!B1), =new_name(Ëèñò1!B2) è =new_na-
me(Ëèñò1!B3), ñîîòâåòñòâåííî.  ÿ÷åéêè òðåòüåé ñòðîêè îñòàåòñÿ ïîìåñòèòü
ôîðìóëû =CENA(Ëèñò1!D1), =CENA(Ëèñò1!D2) è =CENA(Ëèñò1!D3), ñîîòâåò-
ñòâåííî (ñ÷èòàåì, ÷òî öåíû â ðóáëÿõ çàïèñàíû â êîëîíêå D). Ñðàçó æå ïîñëå
âûïîëíåíèÿ ýòèõ îïåðàöèé íà ýòîì ëèñòå äîëæíà ïîÿâèòüñÿ èíôîðìàöèÿ î òî-
âàðàõ â òîì âèäå, êàê ýòî ïîêàçàíî íà ðèñ. 4.18.

Ðèñ. 4.16
Òàáëèöà
ñ èíôîðìàöèåé
î òîâàðàõ (êîä,
íàèìåíîâàíèå,
öåíû: â $ è ðóá.)

Ðèñ. 4.17
Ôóíêöèè CENA
è new_name
â ìîäóëå
ïðîåêòà äëÿ
ôîðìàòèðîâàíèÿ
äàííûõ â âèäå
«öåííèêîâ»

Îñòàëîñü ñîâñåì íåìíîãî — âûäåëèòü ÿ÷åéêè A1–D3, ïîìåñòèòü êóðñîð


ìûøè â ïðàâûé íèæíèé óãîë ÿ÷åéêè D3 (êóðñîð äîëæåí ïðèíÿòü âèä òåìíîãî
êðåñòèêà), ïðîòàùèòü êóðñîð âíèç íà ÷èñëî ÿ÷ååê êðàòíîå òðåì è ñ óäîâîëüñòâè-
åì íàáëþäàòü íà ýêðàíå äîâîëüíî ëåãêî ïîëó÷èâøèåñÿ «öåííèêè» (ðèñ. 4.19).
Åñëè äàííûå î òîâàðàõ èçìåíèëèñü, ñëåäóåò òîëüêî èñïðàâèòü èõ â ëèñòå Ëèñò1.
192 Ãëàâà 4

Ðèñ. 4.18
Íåîáõîäèìî
çàïîëíèòü òîëüêî
ïåðâûå íåñêîëüêî
ñòðîê ñ
èñïîëüçîâàíèåì
ôóíêöèé CENA
è new_name äëÿ
ôîðìàòèðîâàíèÿ
äàííûõ â âèäå
«öåííèêîâ»

Ðèñ. 4.19
Çàäà÷à
ôîðìàòèðîâàíèÿ
äàííûõ â âèäå
«öåííèêîâ»
ðåøåíà
Èçìåíåíèå
5
ïîðÿäêà âûïîëíåíèÿ
îïåðàòîðîâ â VBA
Äî ñèõ ïîð ìû èìåëè äåëî ñ ïðîöåäóðàìè è ôóíêöèÿìè, êîòîðûå VBA âû-
ïîëíÿåò òîëüêî â ëèíåéíîì ïîðÿäêå. Âî ìíîãîì òàê æå VBA âûïîëíÿåò çàïè-
ñàííûé ðåêîðäåðîì ìàêðîñ: VBA íà÷èíàåò âûïîëíåíèå êîäà ñ ïåðâîãî îïåðà-
òîðà ïîñëå ñòðîêè îáúÿâëåíèÿ ïðîöåäóðû èëè ôóíêöèè è ïðîäîëæàåò âûïîë-
íÿòü êàæäûé îïåðàòîð ïîñòðî÷íî äî òåõ ïîð, ïîêà íå áóäåò äîñòèãíóò îïåðàòîð
End Sub èëè End Function, îòìå÷àþùèé êîíåö îïðåäåëåíèÿ ýòîé ïðîöåäóðû
èëè ôóíêöèè, èëè äî òåõ ïîð, ïîêà íå âîçíèêíåò runtime-îøèáêà (íà ýòî, î÷å-
âèäíî, ïîëàãàòüñÿ íå ñòîèò).
Ïîäîáíûå ïðîöåäóðû è ôóíêöèè, õîòÿ è ìîãóò âûïîëíÿòü î÷åíü ñëîæíûå
çàäà÷è, íî íå ìîãóò ìåíÿòü ïîðÿäîê âûïîëíåíèÿ îïåðàòîðîâ-èíñòðóêöèé ïðè
îïðåäåëåííûõ îáñòîÿòåëüñòâàõ. Íà ñàìîì äåëå, î÷åíü ÷àñòî âñòðå÷àþòñÿ òàêèå
ñèòóàöèè, êîãäà íåîáõîäèìî, ÷òîáû ïðîöåäóðû èëè ôóíêöèè âûïîëíÿëè ðàç-
ëè÷íûå äåéñòâèÿ ïðè ðàçíûõ óñëîâèÿõ. Íàïðèìåð, åñëè âû ïèøèòå ïðîöåäó-
ðó, êîòîðàÿ ïîëó÷àåò èìÿ ðàáî÷åé êíèãè îò ïîëüçîâàòåëÿ, à çàòåì îòêðûâàåò
ýòó ðàáî÷óþ êíèãó, ìîæåò ïîíàäîáèòüñÿ, ÷òîáû âàøà ïðîöåäóðà èìåëà âîç-
ìîæíîñòü ñîçäàòü ðàáî÷óþ êíèãó, åñëè êíèãà åùå íå ñóùåñòâóåò. Â ïîäîáíîé
ñèòóàöèè íåîáõîäèìî, ÷òîáû ïðîöåäóðà âûïîëíÿëà òå èëè èíûå îïåðàòîðû,
ïðåäîñòàâëÿÿ ïîëüçîâàòåëþ âîçìîæíîñòü ñîçäàòü ðàáî÷óþ êíèãó èëè
îòêàçàòüñÿ îò ïðîäîëæåíèÿ âûïîëíåíèÿ êîäà, åñëè, íàïðèìåð, ïîëüçîâàòåëü
ïðîñòî åùå íå ïåðåçàïèñàë íåîáõîäèìóþ åìó ðàáî÷óþ êíèãó ñ ïåðåíîñíîãî
íàêîïèòåëÿ.
Êîìàíäû, èçìåíÿþùèå ïîðÿäîê âûïîëíåíèÿ îïåðàòîðîâ, ÷àñòî èñïîëüçóþò
îöåíêó êîíêðåòíûõ ýëåìåíòîâ äàííûõ äëÿ âûáîðà ðàçëè÷íûõ ïðåäîïðåäåëåííûõ
äåéñòâèé. Íàïðèìåð, ìîæíî íàïèñàòü ïðîöåäóðó, ïðîâåðÿþùóþ, âñå ëè ÷èñëà
ñòîëáöà â ðàáî÷åì ëèñòå íàõîäÿòñÿ â äèàïàçîíå îò 1 äî 10. Ýòà ïðîöåäóðà ìîæåò
ïðîâåðÿòü êàæäûé ýëåìåíò ââîäà â ñòîëáöå îòäåëüíî è âûïîëíÿòü íåêîòîðûé íà-
áîð îïåðàòîðîâ, êîãäà âñòðå÷àåòñÿ ýëåìåíò ââîäà âíå óêàçàííîãî äèàïàçîíà.
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ íå âñåãäà ñâÿçàíî ñ ðåàêöèåé
íà âîçíèêàþùèå â ïðîöåññå ðàáîòû ïðîãðàììû ïðîáëåìû. Åñëè âàì íåîáõîäè-
ìî, ÷òîáû ïîëüçîâàòåëü ïðîöåäóðû äåëàë íåêîòîðûé âûáîð ïî ïîâîäó ïîñëå-
äóþùåãî äåéñòâèÿ ïðîöåäóðû, ìîæíî èñïîëüçîâàòü ôóíêöèþ InputBox äëÿ
ïîëó÷åíèÿ òåêñòîâîãî ââîäà îò ïîëüçîâàòåëÿ èëè èñïîëüçîâàòü ôóíêöèþ
MsgBox, äàâàÿ âîçìîæíîñòü ïîëüçîâàòåëþ äåëàòü âûáîð ùåë÷êîì íà êîìàíä-
194 Ãëàâà 5

íîé êíîïêå â îêíå ñîîáùåíèÿ. Ïîñëå ïîëó÷åíèÿ ïîëüçîâàòåëüñêîãî âûáîðà


ïðîöåäóðà äîëæíà âûïîëíèòü äåéñòâèå, ñîîòâåòñòâóþùåå ýòîìó âûáîðó.
Êîíå÷íî, ïðîöåäóðû íå ìîãóò íà ñàìîì äåëå «ïðèíèìàòü ðåøåíèÿ» òàê æå,
êàê ýòî äåëàåò ÷åëîâåê. Îäíàêî ïðîöåäóðû «ìîãóò âûáèðàòü» ïðåäîïðåäåëåí-
íûå äåéñòâèÿ íà îñíîâå ïðîñòûõ óñëîâèé è «ïðèíèìàòü» îòíîñèòåëüíî ñëîæ-
íûå ðåøåíèÿ, îáúåäèíÿÿ áîëåå ïðîñòûå ðåøåíèÿ, ïðåäîñòàâëåííûå
ðàçðàáîò÷èêîì êîäà.
Ïðè èñïîëüçîâàíèè VBA-îïåðàòîðîâ èçìåíåíèÿ ïîðÿäêà âûïîëíåíèÿ êîäà
îïðåäåëÿåòñÿ óñëîâèå èëè íàáîð óñëîâèé, ïðè êîòîðûõ VBA âûïîëíÿåò òó èëè
èíóþ âåòâü (branch) êîäà ïðîöåäóðû. Ïîñêîëüêó òàêèå îïåðàòîðû âëèÿþò íà
ïîñëåäîâàòåëüíîñòü âûïîëíåíèÿ ïðîãðàììû, èõ ÷àñòî íàçûâàþò îïåðàòîðàìè
óïðàâëåíèÿ ïîòîêîì (flow control) èëè îïåðàòîðàìè óïðàâëåíèÿ ïðîãðàììîé
(program control), íî íà ïðàêòèêå îíè áîëåå èçâåñòíû êàê îïåðàòîðû óñëîâíîãî
è áåçóñëîâíîãî ïåðåõîäà (conditional è unconditional branching).
Îïåðàòîð óñëîâíîãî ïåðåõîäà — ýòî ñòðóêòóðà, êîòîðàÿ âûáèðàåò òó èëè
èíóþ âåòâü êîäà ïðîöåäóðû íà îñíîâå íåêîòîðîãî ïðåäîïðåäåëåííîãî óñëîâèÿ
èëè ãðóïïû óñëîâèé. Îïåðàòîð áåçóñëîâíîãî ïåðåõîäà — ýòî îïåðàòîð, ïðîñòî
èçìåíÿþùèé ïîñëåäîâàòåëüíîñòü âûïîëíåíèÿ êîäà ïðîöåäóðû íåçàâèñèìî íè
îò êàêîãî êîíêðåòíîãî óñëîâèÿ. Óñëîâíûé ïåðåõîä èñïîëüçóåòñÿ ãîðàçäî ÷àùå,
÷åì áåçóñëîâíûé.
Ïðè âûïîëíåíèè îïåðàòîðà óñëîâíîãî ïåðåõîäà, òàêîãî êàê If…Then, VBA
ñíà÷àëà îöåíèâàåò óêàçàííîå óñëîâèå. Åñëè óñëîâèå ðàâíî True, VBA âûïîë-
íÿåò çàäàííóþ ãðóïïó îïåðàòîðîâ. ×òîáû îïðåäåëèòü óñëîâèå äëÿ îïåðàòîðà
óñëîâíîãî ïåðåõîäà, èñïîëüçóåòñÿ ëîãè÷åñêîå âûðàæåíèå. Ïðè âûïîëíåíèè
îïåðàòîðà áåçóñëîâíîãî ïåðåõîäà (GoTo) VBA íåìåäëåííî íà÷èíàåò âûïîëíå-
íèå îïåðàòîðîâ, óêàçàííûõ êîìàíäîé ïåðåõîäà.
Êðèòåðèè, íà îñíîâå êîòîðûõ VBA «ïðèíèìàåò ðåøåíèå» â îïåðàòîðàõ óñ-
ëîâíîãî ïåðåõîäà, îïðåäåëÿþòñÿ ïóòåì ñîçäàíèÿ ëîãè÷åñêîãî âûðàæåíèÿ, îïè-
ñûâàþùåãî óñëîâèå, ïðè êîòîðîì íåîáõîäèìî âûïîëíåíèå èëè íåâûïîëíåíèå
îïðåäåëåííîé ñåðèè îïåðàòîðîâ. Äëÿ ñîçäàíèÿ ëîãè÷åñêèõ âûðàæåíèé â îïåðà-
òîðàõ ïåðåõîäà èñïîëüçóþòñÿ ðàçëè÷íûå îïåðàòîðû ñðàâíåíèÿ è ëîãè÷åñêèå
îïåðàòîðû VBA (êîòîðûå îïèñûâàþòñÿ â ãëàâå 3).

Ïðîñòîé âûáîð
Ïðîñòåéøèìè 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

Condition — ëþáîå ëîãè÷åñêîå âûðàæåíèå, à Statements — îäèí, íåñêîëüêî èëè íè


îäíîãî îïåðàòîðà VBA; âñå îïåðàòîðû äîëæíû ïîìåùàòüñÿ â îäíîé è òîé æå ñòðî-
êå. Ïðè âûïîëíåíèè ïîäîáíîãî îïåðàòîðà VBA ñíà÷àëà îöåíèâàåò ëîãè÷åñêîå âû-
ðàæåíèå, ïðåäñòàâëåííîå ñ ïîìîùüþ Condition; åñëè ýòî ëîãè÷åñêîå âûðàæåíèå
ðàâíî True, òî âûïîëíÿåòñÿ îïåðàòîð (èëè îïåðàòîðû) ïîñëå êëþ÷åâîãî ñëîâà Then
äî êîíöà ñòðîêè. Çàòåì VBA âîçîáíîâëÿåò âûïîëíåíèå êîäà ñ ïåðâîãî îïåðàòîðà
ïîñëå ñòðîêè, ñîäåðæàùåé îïåðàòîð If…Then.

Åñëè ëîãè÷åñêîå âûðàæåíèå, ïðåäñòàâëåííîå ñ ïîìîùüþ Condition, ðàâíî


False, òî âûïîëíÿåòñÿ ïåðâûé îïåðàòîð â ñòðîêå ïîñëå ñòðîêè, ñîäåðæàùåé
îïåðàòîð If…Then, áåç âûïîëíåíèÿ àëüòåðíàòèâíîé âåòâè. Ñëåäóþùèé ôðàã-
ìåíò ïðîöåäóðû ïîêàçûâàåò òèïè÷íûé îäíîñòðî÷íûé îïåðàòîð If…Then
If temperature > 100 Then MsgBox «Ñëèøêîì ãîðÿ÷î!»
Ìîæíî âêëþ÷àòü íåñêîëüêî îïåðàòîðîâ VBA â îäíó ñòðîêó, îòäåëÿÿ êàæ-
äûé èç íèõ äâîåòî÷èåì (:), êàê ïîêàçàíî â ñëåäóþùåì ïðèìåðå:
Statement1 : Statement2 : StatementN
 ýòîé ñòðîêå Statement1, Statement2 è StatementN êàæäûé ïðåäñòàâëÿåò
îäèí äîïóñòèìûé îïåðàòîð VBA. Ìîæíî âêëþ÷àòü ñòîëüêî îïåðàòîðîâ â îäíó
ñòðîêó, ñêîëüêî íåîáõîäèìî äî ìàêñèìàëüíîé äëèíû ñòðîêè äëÿ ìîäóëÿ. Îä-
íàêî ñòðîêè ñî ìíîãèìè îïåðàòîðàìè òðóäíî ÷èòàòü è ïîíèìàòü. Îáû÷íî ñëå-
äóåò ïîìåùàòü òîëüêî îäèí îïåðàòîð â êàæäóþ ñòðîêó.
 ëèñòèíãå 5.1 ïðèâåäåí êîä ôóíêöèè, êîòîðàÿ ïðèíèìàåò îò ïîëüçîâàòåëÿ
íîâîå íàèìåíîâàíèå êíèãè â âèäå ñòðîêè è, åñëè ñòðîêà ïóñòàÿ (íå ñîäåðæèò
ñèìâîëîâ, êðîìå ïðîáåëîâ), âûäàåò ñîîáùåíèå îá ýòîì.

Ëèñòèíã 5.1. Ôóíêöèÿ GetBookName


1: Function GetBookName() As String
2: Dim lTitle As String, lPrmpt As String, lDflt As String
3:
4: lTitle = "Ââîä íàèìåíîâàíèÿ êíèãè"
5: lPrmpt = "Ââåäèòå íàèìåíîâàíèå íîâîé êíèãè"
6: lDflt = "Îò÷åò î ïðîäàæàõ"
7:
8: 'èñïîëüçîâàíèå InputBox äëÿ ïîëó÷åíèÿ èìåíè ôàéëà.
9: GetBookName = Trim(InputBox(prompt:=lPrmpt, _
10: Title:=lTitle, _
11: Default:=lDflt))
12:
13: 'ïðîâåðèòü íàëè÷èå ñòðîêè ââîäà
14: If Len(GetBookName) = 0 Then _
15: MsgBox "Íàèìåíîâàíèå íå ââåäåíî!"
16:
17: End Function ‘GetBookName

Îïåðàöèÿ ïîëó÷åíèÿ íàèìåíîâàíèÿ ôóíêöèè (ñòðîêà 9) ñîâìåùåíà ñ


óäàëåíèåì íåíóæíûõ ïðîáåëîâ ïîñðåäñòâîì ôóíêöèè Trim. Ôóíêöèÿ Trim
ïðèíèìàåò ðåçóëüòàò ôóíêöèè InputBox è âîçâðàùàåò ââåäåííóþ ñòðîêó áåç
ëåâûõ è ïðâûõ ïðîáåëîâ.
Îáðàòèòå âíèìàíèå íà ñòðîêó 15, êîòîðàÿ ñîäåðæèò îäíîñòðî÷íûé îïåðàòîð
If…Then (ñèìâîë ïåðåõîäà íà íîâóþ ñòðîêó íå ÿâëÿåòñÿ ïðè÷èíîé ñ÷èòàòü îïå-
ðàòîð íåîäíîñòðî÷íûì: ýòî — òîëüêî âîçìîæíîñòü íàïèñàíèÿ áîëåå äëèííîãî
196 Ãëàâà 5

îïåðàòîðà, ÷åì ïîçâîëÿåò ðàçìåð ñòðàíèöû). Ïðè âûïîëíåíèè ñòðîêè 15 VBA


ñíà÷àëà îöåíèâàåò óñëîâíîå âûðàæåíèå Len(GetBookName) = 0, êîòîðîå âîç-
âðàùàåò çíà÷åíèå True, åñëè ïîëüçîâàòåëü ââåë ñòðîêó, ñîñòîÿùóþ òîëüêî èç
ïðîáåëîâ (çäåñü áûëà èñïîëüçîâàíà ðàíåå îáñóæäàâøàÿñÿ ôóíêöèÿ LenTrim).
 ýòîì ñëó÷àå âûïîëíÿåòñÿ îïåðàòîð:
MsgBox "Íàèìåíîâàíèå íå ââåäåíî!"
Åñëè âûðàæåíèå Len(GetBookName) = 0 âîçâðàùàåò False, òî VBA íå
âûïîëíÿåò îïåðàòîð ïîñëå êëþ÷åâîãî ñëîâà Then.
Âèäèìî, ñåé÷àñ âàì óæå íå òðóäíî áóäåò íàïèñàòü ïðîöåäóðó òåñòèðîâàíèÿ
ôóíêöèè, ïîýòîìó ìû íå áóäåì íà ýòîì îñòàíàâëèâàòüñÿ, à ñðàçó ïåðåéäåì
ê «êðèòèêå» ôóíêöèè. Íåäîñòàòêîì ýòîé ôóíêöèè ÿâëÿåòñÿ òî, ÷òî â ñëó÷àå
ââîäà â äèàëîãîâîì îêíå ôóíêöèè InputBox îäíèõ ïðîáåëîâ ìû òîëüêî ïîëó-
÷èì îá ýòîì ñîîáùåíèå, à ôóíêöèÿ GetBookName âîçâðàòèò íàì ïóñòóþ ñòðî-
êó. Åñëè ìû òîëüêî òåñòèðóåì ýòó ôóíêöèþ, íè÷åãî ïëîõîãî â ýòîì ñëó÷àå íå
ïðîèçîéäåò. À ÷òî, åñëè íàì íóæíî ñîçäàòü ñ ïîëó÷åííûì íàèìåíîâàíèåì êà-
êîé-ëèáî îáúåêò: êíèãó, ëèñò, ôàéë? Íà ýòîò ñëó÷àé íåîáõîäèìî âñåãäà ôîðìè-
ðîâàòü êàêîå-òî çàïàñíîå (ïî óìîë÷àíèþ) èìÿ. Íà ñàìîì äåëå, â ýòîì è çàêëþ-
÷àåòñÿ ñìûñë ñîçäàíèÿ îáîëî÷êè âîêðóã ôóíêöèè InputBox. Åñëè áû âñå ïîëü-
çîâàòåëè áûëè «ïðàâèëüíûìè», ìîæíî áûëî áû âñåãäà îáõîäèòüñÿ ôóíêöèåé
InputBox, ïîñêîëüêó «ïðàâèëüíûå» ïîëüçîâàòåëè íèêîãäà íå äîãàäàëèñü áû â
êà÷åñòâå èìåíè íîâîé êíèãè ââåñòè ïðîáåëû.
Èòàê, íàì íóæíî, ÷òîáû ôóíêöèÿ ââîäà íàèìåíîâàíèÿ êíèãè âñåãäà âîçâðà-
ùàëà íåïóñòóþ ñòðîêó, äàæå åñëè ïîëüçîâàòåëü ðåøèë ïîøóòèòü è ñëîìàòü
âàøó ïðîãðàììó. Äëÿ ýòîãî íåîáõîäèìî, êðîìå ñîîáùåíèÿ î òîì, ÷òî øóòêà
îöåíåíà, ïðèñâîèòü âîçâðàùàåìîìó çíà÷åíèþ ôóíêöèè èìÿ ïî óìîë÷àíèþ, íà-
ïðèìåð, òî, êîòîðîå áûëî ðàíåå ïðåäëîæåíî ïîëüçîâàòåëþ, íî îòâåðãíóòî èì.
Äëÿ ýòîãî ðàññìîòðèì ñëåäóþùóþ ôîðìó îïåðàòîðà If…Then.
Âòîðàÿ ôîðìà ñèíòàêñèñà îïåðàòîðà If…Then íàçûâàåòñÿ áëîêîì (block)
îïåðàòîðà If. Â áëîêå îïåðàòîðà If…Then óñëîâèå è îïåðàòîðû çàïèñûâàþòñÿ â
îòäåëüíûõ ñòðîêàõ, êàê ïîêàçàíî â ñëåäóþùåé ñèíòàêñè÷åñêîé ôîðìå:
Ñèíòàêñèñ
If Condition Then
Statements
End If
Çäåñü Condition, êàê è â îäíîñòðî÷íîì îïåðàòîðå If…Then, ïðåäñòàâëÿåò ëîãè÷å-
ñêîå âûðàæåíèå, îïðåäåëÿþùåå óñëîâèå, ïðè êîòîðîì VBA ñëåäóåò âûïîëíèòü
àëüòåðíàòèâíûå îïåðàòîðû. Statements — ýòî îäèí, íåñêîëüêî èëè íè îäíîãî îïå-
ðàòîðà VBA; îïåðàòîðû ìîãóò íàõîäèòüñÿ â îäíîé èëè íåñêîëüêèõ ñòðîêàõ. Íàêî-
íåö, êëþ÷åâûå ñëîâà End If óêàçûâàþò VBA, ÷òî äîñòèãíóò êîíåö àëüòåðíàòèâíîé
âåòâè îïåðàòîðîâ. Êëþ÷åâûå ñëîâà End If äîëæíû ïîÿâëÿòüñÿ â îòäåëüíîé ñòðîêå,
õîòÿ â ýòó ñòðîêó ìîæíî âêëþ÷àòü êîíå÷íûé êîììåíòàðèé (ñì. ñõåìó 5.1).
Êàê è â ñëó÷àå ñ îäíîñòðî÷íûì îïåðàòîðîì If…Then, VBA ñíà÷àëà îöåíèâà-
åò ëîãè÷åñêîå âûðàæåíèå, ïðåäñòàâëåííîå ñ ïîìîùüþ Condition. Åñëè ýòî âû-
ðàæåíèå ðàâíî True, VBA âûïîëíÿåò îïåðàòîðû â àëüòåðíàòèâíîé âåòâè, íà-
÷èíàÿ ñ ïåðâîãî îïåðàòîðà â ñòðîêå, ïîñëå ñòðîêè, ñîäåðæàùåé êëþ÷åâûå ñëî-
âà If…Then. VBA ïðîäîëæàåò âûïîëíåíèå îïåðàòîðîâ â àëüòåðíàòèâíîé âåòâè
äî òåõ ïîð, ïîêà íå äîñòèãíåò êëþ÷åâûõ ñëîâ End If. Çàòåì ïðîäîëæàåòñÿ âû-
ïîëíåíèå îïåðàòîðîâ, íà÷èíàÿ ñ ïåðâîãî îïåðàòîðà ïîñëå End If.
Èçìåíèì êîä ôóíêöèè GetBookName, êàê ïîêàçàíî â ëèñòèíãå 5.2.
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 197

Ëèñòèíã 5.2. Ôóíêöèÿ GetBookName2


1: Function GetBookName2() As String
2: Dim lTitle As String, lPrmpt As String, lDflt As String
3:
4: lTitle = "Ââîä íàèìåíîâàíèÿ êíèãè"
5: lPrmpt = "Ââåäèòå íàèìåíîâàíèå íîâîé êíèãè"
6: lDflt = "Îò÷åò î ïðîäàæàõ"
7:
8: 'èñïîëüçîâàíèå InputBox äëÿ ïîëó÷åíèÿ èìåíè ôàéëà.
9: GetBookName2 = Trim(InputBox(prompt:=lPrmpt, _
10: Title:=lTitle, _
11: Default:=lDflt))
12:
13: 'ïðîâåðèòü íàëè÷èå ñòðîêè ââîäà
14: If Len(GetBookName2) = 0 Then
15: MsgBox "Íàèìåíîâàíèå íå ââåäåíî!"
16: GetBookName2 = lDflt 'èìÿ ïî óìîë÷àíèþ
17: End If
18:
19: End Function 'GetBookName
20:
21: Sub test_GetBookName2()
22: 'Òåñòèðîâàíèå ôóíêöèè GetBookName2
23: NewBookName = GetBookName2()
24: MsgBox NewBookName
25: End Sub

Ëèñòèíã 5.2 ñîäåðæèò êîä óæå îáñóæäåííîé ôóíêöèè GetBookName2, êîòî-


ðàÿ íèêîãäà íå âîçâðàùàåò ïóñòóþ ñòðîêó, è òåñòèðóþùåé ïðîöåäóðû, èñïîëü-
çóþùåé MsgBox äëÿ îòîáðàæåíèÿ ðåçóëüòàòà âûçîâà GetBookName2.
 íåêîòîðûõ ñëó÷àÿõ ïðè ââîäå íàèìåíîâàíèÿ íîâîãî ôàéëà (êíèãè) óäîá-
íåå çàäàâàòü êîíêðåòíîå èìÿ ïî óìîë÷àíèþ, êîòîðîå çàâèñèò îò êàêèõ-ëèáî äî-
ïîëíèòåëüíûõ óñëîâèé. Ýòî òðåáóåò ââîäà èìåíè ïî óìîë÷àíèþ â êà÷åñòâå àð-
ãóìåíòà ôóíêöèè. Íî, ñ äðóãîé ñòîðîíû, õîòåëîñü áû îñòàâèòü âîçìîæíîñòü
èñïîëüçîâàòü ôóíêöèþ ââîäà áåç àðãóìåíòîâ. Ïîýòîìó ïðåæäå ÷åì ðàññìàòðè-
âàòü äàëåå áîëåå ñëîæíûå êîíñòðóêöèè îïåðàòîðîâ óïðàâëåíèÿ ïîñëåäîâàòåëü-
íîñòüþ âûïîëíåíèÿ êîäà, îáñóäèì òàêóþ âîçìîæíîñòü VBA, êàê íåîáÿçàòåëü-
íûå àðãóìåíòû ôóíêöèè.
198 Ãëàâà 5

Èñïîëüçîâàíèå íåîáÿçàòåëüíûõ àðãóìåíòîâ


Îáû÷íî àðãóìåíòû, êîòîðûå ïðèâîäÿòñÿ â ñïèñêå àðãóìåíòîâ ôóíêöèè-ïðî-
öåäóðû, äîëæíû ïðåäîñòàâëÿòüñÿ êàæäûé ðàç, êîãäà âûçûâàåòñÿ ôóíêöèÿ;
ýòè àðãóìåíòû ÿâëÿþòñÿ îáÿçàòåëüíûìè (required). Âû óæå çíàåòå î íåîáÿçà-
òåëüíûõ àðãóìåíòàõ ôóíêöèè ïî ðàáîòå ñ VBA-ôóíêöèÿìè InputBox è
MsgBox. Íî, ÷òî ñàìîå çàìå÷àòåëüíîå, âû òàêæå ìîæåòå èñïîëüçîâàòü íåîáÿçà-
òåëüíûå àðãóìåíòû äëÿ âàøèõ ñîáñòâåííûõ ôóíêöèé-ïðîöåäóð.
Ïðè âêëþ÷åíèè íåîáÿçàòåëüíûõ àðãóìåíòîâ â ñïèñîê àðãóìåíòîâ íåîáõîäè-
ìî ïåðå÷èñëÿòü ñíà÷àëà âñå îáÿçàòåëüíûå àðãóìåíòû; ïîñëå ïåðâîãî íåîáÿçà-
òåëüíîãî àðãóìåíòà âñå ïîñëåäóþùèå àðãóìåíòû â ýòîì ñïèñêå äîëæíû áûòü
òàêæå íåîáÿçàòåëüíûìè. Ìîæíî äàæå îïðåäåëÿòü òèï äàííûõ è çíà÷åíèå ïî
óìîë÷àíèþ äëÿ íåîáÿçàòåëüíûõ àðãóìåíòîâ ôóíêöèè.
Äëÿ ñîçäàíèÿ íåîáÿçàòåëüíîãî àðãóìåíòà âñòàâüòå VBA-êëþ÷åâîå ñëîâî
Optional ïåðåä èìåíåì ýòîãî àðãóìåíòà â ñïèñêå àðãóìåíòîâ ïðè îáúÿâëåíèè
ôóíêöèè-ïðîöåäóðû. Ëèñòèíã 5.3 ñîäåðæèò î÷åðåäíóþ âåðñèþ ôóíêöèè
GetBookName, êîòîðàÿ ïîçâîëÿåò óêàçàòü â êà÷åñòâå íåîáÿçàòåëüíîãî àðãó-
ìåíòà èìÿ íîâîé êíèãè. Ñ ïîìîùüþ âñòðîåííîé ôóíêöèè IsMissing â êîäå
îïðåäåëÿåòñÿ ôàêò èñïîëüçîâàíèÿ íåîáÿçàòåëüíîãî àðãóìåíòà ïðè âûçîâå
ôóíêöèè GetBookName. Åñëè àðãóìåíò íå áûë ââåäåí, ôóíêöèÿ èñïîëüçóåò
ñâîþ âíóòðåííþþ ñòðîêîâóþ êîíñòàíòó â êà÷åñòâå íàèìåíîâàíèÿ êíèãè.

Ëèñòèíã 5.3. Ôóíêöèÿ GetBookName3


1: Function GetBookName3(Optional lDflt) As String
2: Dim lTitle As String, lPrmpt As String
3:
4: lTitle = "Ââîä íàèìåíîâàíèÿ êíèãè"
5: lPrmpt = "Ââåäèòå íàèìåíîâàíèå íîâîé êíèãè"
6:
7: 'âêëþ÷åí ëè lDflt â ñïèñîê àðãóìåíòîâ
8: If IsMissing(lDflt) Then lDflt = "Êíèãà1"
9:
10: 'èñïîëüçîâàíèå InputBox äëÿ ïîëó÷åíèÿ èìåíè ôàéëà.
11: GetBookName3 = Trim(InputBox(prompt:=lPrmpt, _
12: Title:=lTitle, _
13: Default:=lDflt))
14:
15: 'ïðîâåðèòü íàëè÷èå ñòðîêè ââîäà
16: If Len(GetBookName3) = 0 Then
17: MsgBox "Íàèìåíîâàíèå íå ââåäåíî!"
18: GetBookName3 = lDflt 'èìÿ ïî óìîë÷àíèþ
19: End If
20:
21: End Function 'GetBookName
22:
23:
24: Sub test_GetBookName3()
25: 'Òåñòèðîâàíèå ôóíêöèè GetBookName2
26:
27: 'âûçîâ ôóíêöèè áåç ïàðàìåòðà
28: NewBookName = GetBookName3()
29: MsgBox "Íàèìåíîâàíèå íîâîé êíèãè: " & NewBookName
30:
31: 'âûçîâ ôóíêöèè ñ ïàðàìåòðîì
32: NewBookName = GetBookName3(lDflt:="Êíèãà20")
33: MsgBox "Íàèìåíîâàíèå íîâîé êíèãè: " & NewBookName
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 199

34: End Sub

Ïðîäîëæèì ðàññìîòðåíèå îïåðàòîðîâ, ïîçâîëÿþùèõ èçìåíÿòü ïîñëåäîâà-


òåëüíîñòü âûïîëíåíèÿ êîäà ïðîöåäóðû èëè ôóíêöèè.

Âûáîð âåòâè ñ ïîìîùüþ If…Then…Else


Îïåðàòîð If…Then äàåò âîçìîæíîñòü çàäàâàòü îäíó àëüòåðíàòèâíóþ âåòâü
îïåðàòîðîâ â ïðîöåäóðå. Îäíàêî ÷àñòî áûâàåò íåîáõîäèìî âûáðàòü îäíó èç
äâóõ ðàçëè÷íûõ âåòâåé îïåðàòîðîâ â çàâèñèìîñòè îò îïðåäåëåííîãî óñëîâèÿ.
Äëÿ ýòîãî VBA ïðåäîñòàâëÿåò îïåðàòîðû If…Then…Else è If…Then…ElseIf.
Êàê è If…Then, VBA-îïåðàòîð If…Then…Else èìååò äâå ôîðìû: îäíîñòðî÷íóþ
è áëî÷íóþ. Ñèíòàêñèñ îäíîñòðî÷íîãî îïåðàòîðà If…Then…Else ñëåäóþùèé:
Ñèíòàêñèñ
If Condition Then Statements Else ElseStatements
Condition — ëþáîå äîïóñòèìîå ëîãè÷åñêîå âûðàæåíèå. Statements — îäèí èëè íå-
ñêîëüêî îïåðàòîðîâ VBA. Êàê è â îäíîñòðî÷íîì îïåðàòîðå If…Then, âñå îïåðàòîðû
è êëþ÷åâûå ñëîâà îäíîñòðî÷íîãî If…Then…Else äîëæíû íàõîäèòüñÿ â îäíîé è òîé
æå ñòðîêå.

Ïðè âûïîëíåíèè îäíîñòðî÷íîãî îïåðàòîðà If…Then…Else VBA ñíà÷àëà îöå-


íèâàåò ëîãè÷åñêîå âûðàæåíèå, ïðåäñòàâëåííîå ñ ïîìîùüþ Condition; åñëè ýòî
âûðàæåíèå ðàâíî True, VBA âûïîëíÿåò îïåðàòîðû (ïðåäñòàâëåííûå ñ ïîìî-
ùüþ Statements) ìåæäó êëþ÷åâûìè ñëîâàìè Then è Else è âîçîáíîâëÿåò âû-
ïîëíåíèå êîäà ñ ïåðâîãî îïåðàòîðà ïîñëå ñòðîêè, êîòîðàÿ ñîäåðæèò
If…Then…Else.
Åñëè ëîãè÷åñêîå âûðàæåíèå, ïðåäñòàâëåííîå ñ ïîìîùüþ Condition, ðàâíî
False, VBA âûïîëíÿåò îïåðàòîðû ïîñëå êëþ÷åâîãî ñëîâà Else äî êîíöà ñòðî-
êè (ïðåäñòàâëåííûå ñ ïîìîùüþ ElseStatements) è ïðîäîëæàåò âûïîëíåíèå
êîäà ñ ïåðâîãî îïåðàòîðà ïîñëå ñòðîêè, ñîäåðæàùåé If…Then…Else.
 ñëåäóþùåé ñòðîêå ïîêàçàí òèïè÷íûé ïðèìåð îäíîñòðî÷íîãî îïåðàòîðà
If…Then…Else:
If Âåñ > 100 Then MsgBox "Òÿæåëî!" Else MsgBox "Íå òàê òÿæåëî!"
 ýòîì ïðèìåðå, åñëè çíà÷åíèå ïåðåìåííîé Âåñ áîëüøå 100, òî óñëîâíîå
âûðàæåíèå ðàâíî True è VBA âûïîëíÿåò îïåðàòîð MsgBox äëÿ îòîáðàæåíèÿ ñî-
îáùåíèÿ «Òÿæåëî!». Åñëè ïåðåìåííàÿ Âåñ ñîäåðæèò ÷èñëî, ðàâíîå èëè
ìåíüøåå 100, òî ðàññìàòðèâàåìîå óñëîâèå ðàâíî False è VBA âûïîëíÿåò îïåðà-
òîð MsgBox ïîñëå êëþ÷åâîãî ñëîâà Else äëÿ îòîáðàæåíèÿ ñîîáùåíèÿ «Íå òàê òÿ-
æåëî!».
Êàê âèäíî èç ïðèìåðà îäíîñòðî÷íîãî îïåðàòîðà If…Then…Else, îäíîñòðî÷-
íóþ ôîðìó íå âñåãäà ïðîñòî ÷èòàòü. Êðîìå òîãî, ïîñêîëüêó âñå ýëåìåíòû îäíî-
ñòðî÷íîãî îïåðàòîðà If…Then…Else äîëæíû íàõîäèòüñÿ â îäíîé è òîé æå ñòðî-
êå, ðàçìåð è êîëè÷åñòâî îïåðàòîðîâ, êîòîðûå ìîæíî âêëþ÷àòü â àëüòåðíàòèâ-
íûå âåòâè âûïîëíåíèÿ, îãðàíè÷èâàþòñÿ èìåþùèìñÿ â ñòðîêå ìåñòîì.
Áëîê îïåðàòîðîâ If…Then…Else ëåã÷å ÷èòàòü è ïîíèìàòü è, ïîñêîëüêó ìîæ-
íî ðàñïîëàãàòü îïåðàòîðû â ðàçíûõ ñòðîêàõ âíóòðè áëîêà îïåðàòîðà
If…Then…Else, îí íå èìååò îãðàíè÷åíèÿ ïî ðàçìåðó è ÷èñëó îïåðàòîðîâ, êîòî-
200 Ãëàâà 5

ðûå ìîæíî ïîìåùàòü â àëüòåðíàòèâíûå âåòâè. Áëîê îïåðàòîðà If…Then…Else


èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
If Condition Then
Statements
Else
ElseStatements
End If
Condition — ëþáîå äîïóñòèìîå ëîãè÷åñêîå âûðàæåíèå; Statements è
ElseStatements ïðåäñòàâëÿþò îäèí, íåñêîëüêî èëè íè îäíîãî îïåðàòîðà VBA. Ïðè
âûïîëíåíèè áëîêà îïåðàòîðà If…Then…Else VBA ñíà÷àëà îöåíèâàåò ëîãè÷åñêîå
âûðàæåíèå, ïðåäñòàâëåííîå ñ ïîìîùüþ Condition. Åñëè ýòî âûðàæåíèå ðàâíî
True, òî VBA âûïîëíÿåò âñå îïåðàòîðû (ïðåäñòàâëåííûå ñ ïîìîùüþ Statements)
ìåæäó êëþ÷åâûì ñëîâîì Then è êëþ÷åâûì ñëîâîì Else. Çàòåì VBA âîçîáíîâëÿåò
âûïîëíåíèå êîäà ñ ïåðâîãî îïåðàòîðà, ïîÿâëÿþùåãîñÿ ïîñëå êëþ÷åâûõ ñëîâ End
If, êîòîðûå óêàçûâàþò íà êîíåö áëîêà îïåðàòîðà If…Then…Else.
Åñëè ëîãè÷åñêîå âûðàæåíèå, ïðåäñòàâëåííîå ñ ïîìîùüþ Condition, ðàâíî False,
VBA âûïîëíÿåò âñå îïåðàòîðû (ïðåäñòàâëåííûå ñ ïîìîùüþ ElseStatements) ìåæäó
êëþ÷åâûì ñëîâîì Else è êëþ÷åâûìè ñëîâàìè End If. Çàòåì VBA ïðîäîëæàåò âû-
ïîëíåíèå êîäà ñ ïåðâîãî îïåðàòîðà, ïîÿâëÿþùåãîñÿ ïîñëå êëþ÷åâûõ ñëîâ End If.
Êàê è â áëîêå îïåðàòîðà If…Then, êëþ÷åâûå ñëîâà End If äîëæíû ïîìåùàòüñÿ â
îòäåëüíîé ñòðîêå, õîòÿ â ýòó ñòðîêó ìîæíî äîáàâëÿòü êîíå÷íûé êîììåíòàðèé (ñì.
ñõåìó 5.2).

Îïåðàòîð If…Then…Else âûáèðàåò îäíó èëè äðóãóþ âåòâü, íî íèêîãäà íå


âûáèðàåò îáå âåòâè îäíîâðåìåííî. Â ñëåäóþùåì ïðèìåðå (ëèñòèíã 5.4) ïîêà-
çàí òèïè÷íûé áëîê îïåðàòîðà If…Then…Else:

Ëèñòèíã 5.4. Ôóíêöèÿ GetBookName4


1: Function GetBookName4(Optional lDflt) As String
2: Dim lTitle As String, lPrmpt As String, lVar As String
3:
4: lTitle = "Ââîä íàèìåíîâàíèÿ êíèãè"
5: lPrmpt = "Ââåäèòå íàèìåíîâàíèå íîâîé êíèãè"
6:
7: 'âêëþ÷åí ëè lDflt â ñïèñîê àðãóìåíòîâ
8: If IsMissing(lDflt) Then lDflt = "Îò÷åò î ïðîäàæàõ"
9:
10: 'èñïîëüçîâàíèå InputBox äëÿ ïîëó÷åíèÿ èìåíè ôàéëà.
11: lVar = Trim(InputBox(prompt:=lPrmpt, _
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 201

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

Íèêàêèõ ïðåèìóùåñòâ ó ýòîãî êîäà ïî ñðàâíåíèþ ñ êîäîì ëèñòèíãà 5.3 íåò,


íî çäåñü áûë èñïîëüçîâàí îïåðàòîð If…Then…Else è ñòðîêè 16–21 ïðåäñòàâëÿ-
þò ñîáîé áîëåå ïîíÿòíûé êîä. Ýòîò ïðèìåð ñîäåðæèò òîò æå îïåðàòîð, ïðèâî-
äèìûé äëÿ îäíîñòðî÷íîãî If…Then…Else, íî òåïåðü èñïîëüçóåò ôîðìó áëîêà.

Ñëîæíûé âûáîð
Âû óçíàëè, êàê ñîçäàâàòü îïåðàòîðû ïåðåõîäà, âûáèðàþùèå îäíó èëè îäíó
èç äâóõ àëüòåðíàòèâíûõ âåòâåé êîäà ïðîöåäóðû. Îäíàêî ÷àñòî áûâàåò íåîáõî-
äèìî âûïîëíèòü áîëåå ñëîæíûé âûáîð â ïðîöåäóðàõ, âûáèðàÿ ìåæäó òðåìÿ,
÷åòûðüìÿ è áîëåå âåòâÿìè.

Âëîæåííûå îïåðàòîðû If…Then


Ïðè íåîáõîäèìîñòè ïðèíÿòèÿ áîëåå ñëîæíûõ ðåøåíèé ìîæíî ïîìåùàòü
îïåðàòîð If…Then èëè If…Then…Else âíóòðü äðóãîãî îïåðàòîðà If…Then èëè
If…Then…Else, ÷òî íàçûâàåòñÿ âëîæåíèåì îïåðàòîðîâ (nesting). (Âëîæåíèå
îçíà÷àåò ïîìåùåíèå îäíîãî òèïà ñòðóêòóðû óïðàâëåíèÿ âûïîëíåíèåì êîäà
âíóòðü äðóãîé.) (ñì. ñõåìó 5.3)

Õîòÿ ìîæíî âêëàäûâàòü è îäíîñòðî÷íûå ôîðìû îïåðàòîðîâ If…Then


è If…Then…Else, òàêèå îïåðàòîðû òðóäíî ïîíèìàòü. Ïðè âëîæåíèè If…Then
è If…Then…Else èñïîëüçóéòå äëÿ ÿñíîñòè áëî÷íóþ ôîðìó ýòèõ îïåðàòîðîâ.
Ëèñòèíã 5.5 ïîêàçûâàåò ïðîñòóþ ïðîöåäóðó äëÿ èëëþñòðàöèè òîãî, êàê ðà-
áîòàþò âëîæåííûå îïåðàòîðû If…Then…Else. Ïðîöåäóðà EvalDiscount ïîëó-
202 Ãëàâà 5

÷àåò îò ïîëüçîâàòåëÿ êîëè÷åñòâî ïîêóïåìîãî êëèåíòîì òîâàðà (÷èñëîâîå çíà÷å-


íèå), à çàòåì îöåíèâàåò ýòî ÷èñëî è îïðåäåëÿåò ñêèäêó, íà êîòîðóþ ìîæåò ðàñ-
ñ÷èòûâàòü êëèåíò.

Ëèñòèíã 5.5. Âëîæåííûå îïåðàòîðû If…Then…Else

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.5 îò


íåïðàâèëüíûõ äåéñòâèé ïîëüçîâàòåëÿ. Âî-ïåðâûõ, ôóíêöèÿ Applicati-
on.InputBox íå äàåò âîçìîæíîñòè ââåñòè â îêíî ââîäà íå÷èñëîâîå çíà÷åíèå.
Âî-âòîðûõ, åñëè ïîëüçîâàòåëü èñïîëüçóåò «ñïàñèòåëüíóþ» êíîïêó Cancel, ÷òî-
áû îòêàçàòüñÿ îò ââîäà, ïðîãðàììà (â ñòðîêå 10) ïðîâåðèò ðåçóëüòàò ââîäà, êî-
òîðûé ïðè ùåë÷êå íà êíîïêå Cancel èìååò òèï Boolean, è âûáåðåò íåîáõîäè-
ìóþ âåòâü îïåðàòîðà If…Then…Else. Ïðè ùåë÷êå íà êíîïêå Cancel âûïîëíèòñÿ
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 203

îïåðàòîð â ñòðîêå 23 è íà ýêðàí áóäåò âûäàíî ñîîáùåíèå î òîì, ÷òî êîëè÷åñòâî


òîâàðà íå óêàçàíî.

Ðèñ. 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

 ñëåäóþùåì ëèñòèíãå (5.6) ïîêàçàíî, êàê ñ ó÷åòîì âûøåèçëîæåííîãî


ìîæíî èçìåíèòü ñòðîêè 12–20 ëèñòèíãà 5.5.

Ëèñòèíã 5.6. Èñïîëüçîâàíèå If…Then…ElseIf


1 Sub EvalDiscount2()
2 'Îïðåäåëåíèå ñêèäêè (â %) â çàâèñèìîñòè îò
3 'êîëè÷åñòâà ïðîäàâàåìîãî òîâàðà
4 Dim lStr As String
5 Dim IntNum
6 IntNum = Application.InputBox( _
7 prompt:="Ââåäèòå êîëè÷åñòâî òîâàðà", _
8 Title:="Ïðîöåäóðà EvalDiscount2", _
9 Type:=1)
10 If Not (TypeName(IntNum) = "Boolean") Then
11
12 If IntNum > 1000 Then
13 lStr = "10"
14 ElseIf IntNum > 500 Then
15 lStr = "5"
16 Else
17 lStr = "0"
18 End If
19 MsgBox "Ñêèäêà " & lStr & "%"
20 Else
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 205

21 MsgBox "Êîëè÷åñòâî íå óêàçàíî"


22 End If
23
24 End Sub

Ýòîò îïåðàòîð If…Then…ElseIf äåéñòâóåò òî÷íî òàê æå, êàê âëîæåííûé


îïåðàòîð If…Then…Else â ñòðîêàõ 12–20 ëèñòèíãà 5.5, è ñ òåìè æå ðåçóëüòàòà-
ìè, òîëüêî ýòà ôîðìà áîëåå êîìïàêòíà.
Ïðè æåëàíèè ìîæíî âêëþ÷àòü áîëåå îäíîãî ïðåäëîæåíèÿ ElseIf â îïåðà-
òîð If…Then…ElseIf; âñå ïðåäëîæåíèÿ ElseIf ñëåäóþò ïåðåä Else. VBA âû-
ïîëíÿåò îïåðàòîðû â ïðåäëîæåíèè ElseIf, åñëè òîëüêî ëîãè÷åñêîå âûðàæå-
íèå â ElseIf ðàâíî True.
Èñïîëüçîâàíèå îïåðàòîðà If…Then…ElseIf ÿâëÿåòñÿ âîïðîñîì ïðîôåññèî-
íàëüíîãî ïðåäïî÷òåíèÿ. Ìíîãèå ïðîãðàììèñòû ñ÷èòàþò, ÷òî èõ êîä áîëåå ïî-
íÿòåí è óäîáåí ïðè èñïîëüçîâàíèè âëîæåííûõ îïåðàòîðîâ If…Then…Else è èç-
áåãàþò èñïîëüçîâàíèÿ îïåðàòîðà If…Then…ElseIf. Ïåðâîíà÷àëüíî îïåðàòîð
If…Then…ElseIf áûë äîáàâëåí â BASIC äëÿ îáåñïå÷åíèÿ âîçìîæíîñòåé, êîòî-
ðûå îáåñïå÷èâàþòñÿ îïåðàòîðîì Select…Case (îïèñûâàåòñÿ â ñëåäóþùåì ðàç-
äåëå); îí îñòàåòñÿ â VBA äëÿ ëåãêîé òðàíñëÿöèè ñóùåñòâóþùèõ ïðîãðàìì
ñ BASIC íà VBA. Ïðè âûïîëíåíèè âûáîðà èç íåñêîëüêèõ âàðèàíòîâ îïåðàòîð
Select…Case ïðåâîñõîäèò âëîæåííûé îïåðàòîð If…Then…Else èëè åùå áîëåå
êîìïàêòíûé îïåðàòîð If…Then…ElseIf.

Îïåðàòîð 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) .

Ïðè âûïîëíåíèè VBA-îïåðàòîðà Select Case ñíà÷àëà îöåíèâàåòñÿ


TestExpression, à çàòåì ñðàâíèâàåòñÿ ðåçóëüòàò ýòîãî âûðàæåíèÿ ñ êàæäûì
âûðàæåíèåì, ïåðå÷èñëåííûì â êàæäîì ExpressionList. Åñëè çíà÷åíèå, ïðåä-
ñòàâëåííîå ñ ïîìîùüþ TestExpression ñîâïàäàåò ñ âûðàæåíèåì â Expres-
sionList äëÿ îäíîãî èç Case, VBA âûïîëíÿåò îïåðàòîðû äëÿ ýòîãî ïðåäëîæå-
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 207

íèÿ 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

Íàïðèìåð, äëÿ îïðåäåëåíèÿ äèàïàçîíà ÷èñåë îò 10 äî 150 â îïåðàòîðå Case


ExpressionList èñïîëüçóåòñÿ ñëåäóþùåå âûðàæåíèå:
Case 10 To 150
Äëÿ âûáîðà âåòâåé íà îñíîâå cðàâíåíèÿ, ÿâëÿåòñÿ ëè TestExpression áîëü-
øå, ìåíüøå èëè ðàâíûì êàêîìó-ëèáî çíà÷åíèþ, èëè íà îñíîâå êàêîãî-ëèáî
äðóãîãî ðåëÿöèîííîãî ñðàâíåíèÿ, èñïîëüçóéòå ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Is ComparisonOperator expression
 ýòîé ñòðîêå ComparisonOperator — ýòî ëþáûå VBA-îïåðàòîðû îòíîøåíèÿ, êðîìå
îïåðàòîðîâ Is è Like; expression — ëþáîå âûðàæåíèå VBA.

Äëÿ âûïîëíåíèÿ îïåðàòîðîâ â âåòâè Case, êîãäà, íàïðèìåð, TestExpression


áîëüøå 10, èñïîëüçóåòñÿ ñëåäóþùåå âûðàæåíèå:
Case Is > 10
Êëþ÷åâîå ñëîâî Is çäåñü — ýòî íå òî æå ñàìîå, ÷òî îïåðàòîð Is.  ýòîì îïå-
ðàòîðå Is îçíà÷àåò ññûëêó íà TestExpression.
Ëèñòèíã 5.7 ïðåäñòàâëÿåò ïðèìåð îïåðàòîðà Select Case.

Ëèñòèíã 5.7. Îïåðàòîð Select Case

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

Îáðàòèòå âíèìàíèå íà ñòðîêè 11–18. Ïîñëå ðàññìîòðåíèÿ äâóõ ïðåäûäó-


ùèõ ïðèìåðîâ ýòè ñòðîêè íå ìîãóò íå âûçâàòü âçäîõ îáëåã÷åíèÿ. Ýòà êîíñòðóê-
öèÿ õîðîøà è ïðîñòîòîé äëÿ ïîíèìàíèÿ, è ëåãêîñòüþ ïðè íàðàùèâàíèè íîâûõ
óñëîâèé. Â îñòàëüíîì êîä ýòîãî ïðèìåðà ïåðåïèñàí èç ïðåäûäóùèõ ëèñòèíãîâ.

Áåçóñëîâíûé ïåðåõîä
Îïåðàòîð áåçóñëîâíîãî ïåðåõîäà, ïîæàëóé, ñàìûé ñïîðíûé îïåðàòîð âî
âñåõ ÿçûêàõ ïðîãðàììèðîâàíèÿ. Â ðàííèõ ÿçûêàõ îí ÿâëÿëñÿ ïî÷òè åäèíñò-
âåííûì ñðåäñòâîì îðãàíèçàöèè öèêëè÷åñêèõ âûïîëíåíèé áëîêîâ êîäà. Ñòî-
ðîííèêè ñòðóêòóðíîãî ïðîãðàììèðîâàíèÿ ïîñâÿùàþò ìíîãî âðåìåíè êðèòèêå
ïðîãðàìì è ÿçûêîâ ïðîãðàììèðîâàíèÿ, â êîòîðûõ èñïîëüçóåòñÿ ýòîò îïåðàòîð.
Ïîýòîìó íå î÷åíü óâëåêàéòåñü ïðèìåíåíèåì ýòîãî îïåðàòîðà â ñâîåì êîäå è
ñòàðàéòåñü âñïîìèíàòü î íåì òîëüêî â ÷ðåçâû÷àéíûõ ñèòóàöèÿõ, êîãäà âñå
äðóãèå ñðåäñòâà óæå èñïðîáîâàíû è íå ïîìîãëè.
Îïåðàòîð áåçóñëîâíîãî ïåðåõîäà âñåãäà èçìåíÿåò ïîðÿäîê âûïîëíåíèÿ îïå-
ðàòîðîâ â ïðîöåäóðå èëè ôóíêöèè VBA. Ïðè ýòîì VBA íå ïðîâåðÿåò íèêàêèõ
óñëîâèé (îòñþäà òåðìèí áåçóñëîâíûé (unconditional)), à ïðîñòî ïåðåõîäèò
ê âûïîëíåíèþ êîäà ñ äðóãîãî ìåñòà.
VBA èìååò òîëüêî îäèí îïåðàòîð áåçóñëîâíîãî ïåðåõîäà: GoTo. Ñóùåñòâóåò
î÷åíü ìàëî ïðè÷èí äëÿ èñïîëüçîâàíèÿ îïåðàòîðà GoTo; â äåéñòâèòåëüíîñòè,
ïðîöåäóðû, êîòîðûå èñïîëüçóþò íåñêîëüêî îïåðàòîðîâ GoTo, òðóäíû äëÿ ïî-
íèìàíèÿ. Ïî÷òè â êàæäîì ñëó÷àå, êîãäà âû ìîæåòå èñïîëüçîâàòü îïåðàòîð
GoTo, ìîæíî èñïîëüçîâàòü îäèí èç îïåðàòîðîâ If, îïåðàòîð Select Case èëè
îäíó èç ñòðóêòóð îðãàíèçàöèè öèêëîâ, î êîòîðûõ âû óçíàåòå â ãëàâå 7, äëÿ âû-
ïîëíåíèÿ òîé æå çàäà÷è ñ áîëüøåé ëåãêîñòüþ è ÿñíîñòüþ.
Îïåðàòîð GoTo îñòàëñÿ îò ðàííèõ âåðñèé ÿçûêà ïðîãðàììèðîâàíèÿ BASIC,
êîòîðûå íå èìåëè ñëîæíîãî îïåðàòîðà ïðèíÿòèÿ ðåøåíèé Select Case, îïè-
ñàííîãî â ýòîé ãëàâå, èëè ìîùíûõ ñòðóêòóð îðãàíèçàöèè öèêëîâ. Ïðîãðàììè-
ñòû, ðàáîòàâøèå ñ ðàííèìè âåðñèÿìè BASIC, èñïîëüçîâàëè GoTo äëÿ èìèòà-
öèè ðåçóëüòàòîâ áîëåå ñëîæíûõ îïåðàòîðîâ VBA.
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 209

Ñëåäóåò çíàòü, êàê îïåðàòîð GoTo ðàáîòàåò â êà÷åñòâå îïåðàòîðà áåçóñëîâíî-


ãî ïåðåõîäà, ãëàâíûì îáðàçîì äëÿ òîãî, ÷òîáû ïîíèìàòü, êàê äåéñòâóåò îáðà-
áîò÷èê îøèáîê GoTo, íî òàêæå ïîòîìó, ÷òî âàì ìîæåò âñòðåòèòüñÿ ýòà êîìàí-
äà, èñïîëüçóåìàÿ äðóãèìè ïðîãðàììèñòàìè.
Îïåðàòîð GoTo èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
GoTo line
Âûðàæåíèå line ïðåäñòàâëÿåò ëþáóþ äîïóñòèìóþ ìåòêó èëè íîìåð ñòðîêè â òîé æå
ïðîöåäóðå èëè ôóíêöèè, êîòîðàÿ ñîäåðæèò îïåðàòîð GoTo. Ïðè âûïîëíåíèè îïå-
ðàòîðà GoTo VBA íåìåäëåííî ïåðåõîäèò ê âûïîëíåíèþ îïåðàòîðà â ñòðîêå, îïðåäå-
ëåííîé ñ ïîìîùüþ line.

Ìåòêà ñòðîêè (line label) — ýòî îñîáûé òèï èäåíòèôèêàòîðà, êîòîðûé çàäàåò
îïðåäåëåííóþ ñòðîêó ïî èìåíè. Ìåòêè ñòðîê èìåþò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Name:
Âûðàæåíèå name — ëþáîé äîïóñòèìûé èäåíòèôèêàòîð VBA. Ìåòêà ñòðîêè ìîæåò
íà÷èíàòüñÿ â ëþáîì ñòîëáöå â ñòðîêå, åñëè îíà ÿâëÿåòñÿ ïåðâûì íåïóñòûì ñèìâî-
ëîì â ñòðîêå. Íîìåð ñòðîêè (line number) — â îñíîâíîì, òî æå ñàìîå, ÷òî è ìåòêà
ñòðîêè, íî îí ÿâëÿåòñÿ ïðîñòî íîìåðîì, à íå èäåíòèôèêàòîðîì. Èñïîëüçîâàíèå íî-
ìåðîâ ñòðîê â ïðîöåäóðàõ VBA ÿâëÿåòñÿ êðàéíå íåæåëàòåëüíûì, ñëåäóåò âñåãäà
èñïîëüçîâàòü ìåòêó ñòðîêè âìåñòî íèõ.

 ëèñòèíãå 5.8 ïîêàçàíà ïðîöåäóðà, äåìîíñòðèðóþùàÿ íàèáîëåå îáîñíîâàí-


íîå èñïîëüçîâàíèå îïåðàòîðà GoTo â ïðîöåäóðå VBA: ýòà ïðîöåäóðà èñïîëüçóåò
îïåðàòîð GoTo äëÿ ïåðåõîäà ê êîíöó ïðîöåäóðû ïðè âûáîðå ïîëüçîâàòåëåì êî-
ìàíäíîé êíîïêè Îòìåíà (Cancel) â îêíå ââîäà.

Ëèñòèíã 5.8. Ïðèìåð èñïîëüçîâàíèÿ îïåðàòîðà GoTo


1 Sub EvalDiscount4()
2 'Îïðåäåëåíèå ñêèäêè (â %) â çàâèñèìîñòè îò
3 'êîëè÷åñòâà ïðîäàâàåìîãî òîâàðà
4 Dim lStr As String
5 Dim IntNum
6 IntNum = Application.InputBox( _
7 prompt:="Ââåäèòå êîëè÷åñòâî òîâàðà", _
8 Title:="Ïðîöåäóðà EvalDiscount4", _
9 Type:=1)
10
11 If TypeName(VarWeight) = "Boolean" Then GoTo EndSubCancel
12
13 Select Case IntNum
14 Case Is > 1000
15 lStr = "10"
16 Case Is > 500
17 lStr = "5 "
18 Case Else
19 lStr = "0 "
20 End Select
21
22 MsgBox "Ñêèäêà " & lStr & "%"
23 GoTo EndSub
210 Ãëàâà 5

24
25 EndSubCancel: 'îáðàáîòêà îòìåíû ââîäà â îêíå InputBox
26 MsgBox "Êîëè÷åñòâî íå óêàçàíî"
27
28 EndSub: 'óñïåøíîå îêîí÷àíèå ðàáîòû
29
30 End Sub

 ñòðîêå 11 îïðåäåëÿåòñÿ, áûëè ëè ââåäåíû äàííûå â îêíå äèàëîãà. Åñëè


ïîëüçîâàòåëåì áûëà âûáðàíà êíîïêà Îòìåíà, êîä ïðîäîëæàåò âûïîëíÿòüñÿ ñî
ñòðîêè 25, íà êîòîðóþ óêàçûâàåò ìåòêà EndSubCancel. Åñëè æå äàííûå ââåäå-
íû óñïåøíî, ïðîöåäóðà ïðîäîëæàåò âûïîëíÿòüñÿ ñî ñòðîêè 13. Â ñòðîêå 23
ñíîâà âñòðå÷àåòñÿ îïåðàòîð áåçóñëîâíîãî ïåðåõîäà äëÿ òîãî, ÷òîáû îáîéòè
ñòðîêó 26 è íå âûäàâàòü ñîîáùåíèÿ î òîì, ÷òî êîëè÷åñòâî íå áûëî ââåäåíî.
Åùå ðàç îòìåòèì, ÷òî òàê ïðîöåäóðû ïèñàòü íå íóæíî. Ýòî — ïðîñòî ïðè-
ìåð îïåðàòîðà GoTo. È ëó÷øå ïîêà çàáûòü î ñóùåñòâîâàíèè ýòîãî îïåðàòîðà.

Èñïîëüçîâàíèå MsgBox äëÿ îáåñïå÷åíèÿ


âîçìîæíîñòè âûáîðà
Äî ñèõ ïîð ìû èñïîëüçîâàëè îïåðàòîð MsgBox ñ öåëüþ îòîáðàæåíèÿ ñîîáùå-
íèé äëÿ ïîëüçîâàòåëÿ â äèàëîãîâûõ îêíàõ ñ çàãîëîâêàìè. Êàê óæå îòìå÷àëîñü
â ãëàâå 4, ïðè ïîìîùè íåîáÿçàòåëüíîãî àðãóìåíòà Buttons ìîæíî èñïîëüçî-
âàòü VBA-ïðîöåäóðó MsgBox êàê ôóíêöèþ äëÿ ïîëó÷åíèÿ âûáîðà îò ïîëüçîâà-
òåëÿ â îòâåò íà ñîîáùåíèÿ èëè âîïðîñû, êîòîðûå îòîáðàæàåò âàøà ïðîöåäóðà.
Äëÿ ìíîãèõ ïðîñòûõ âàðèàíòîâ âûáîðà èñïîëüçîâàíèå ôóíêöèè MsgBox äëÿ
ïîëó÷åíèÿ îòâåòà îò ïîëüçîâàòåëÿ ÿâëÿåòñÿ ãîðàçäî áîëåå ëåãêèì, ÷åì ïîëó÷å-
íèå òåêñòîâîãî ââîäà ñ ïîìîùüþ ôóíêöèè InputBox è ïîñëåäóþùèé àíàëèç
ýòîãî òåêñòà äëÿ îïðåäåëåíèÿ òîãî, êàêîé âûáîð ñäåëàë ïîëüçîâàòåëü.
Ïðè âêëþ÷åíèè àðãóìåíòà Buttons ñ íåîáõîäèìûìè êðóãëûìè ñêîáêàìè
îïåðàòîð MsgBox ðàáîòàåò ïîäîáíî ôóíêöèè è îòîáðàæàåò îêíî ñîîáùåíèÿ, ñî-
äåðæàùåå ðàçëè÷íûå êîìàíäíûå êíîïêè. MsgBox âîçâðàùàåò ÷èñëåííûé ðå-
çóëüòàò, óêàçûâàþùèé, êàêóþ êîìàíäíóþ êíîïêó âûáðàë ïîëüçîâàòåëü. ×èñ-
ëî è òèï êîìàíäíûõ êíîïîê, îòîáðàæàåìûõ äèàëîãîâûì îêíîì MsgBox, çàäà-
åòñÿ ñ ïîìîùüþ àðãóìåíòà Buttons.
 ëèñòèíãå 5.9 ïîêàçàíà ïðîñòàÿ ïðîöåäóðà, êîòîðàÿ äåìîíñòðèðóåò èñ-
ïîëüçîâàíèå àðãóìåíòà Buttons.

Ëèñòèíã 5.9. Èñïîëüçîâàíèå MsgBox è àðãóìåíòà Buttons


äëÿ ïîëó÷åíèÿ ïîëüçîâàòåëüñêîãî ââîäà

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

11: Case Is = vbYes


12: MsgBox prompt:="Âû âûáðàëè êíîïêó 'Äà'", _
13: Title:=mTitle, _
14: Buttons:=vbInformation
15: Case Is = vbNo
16: MsgBox prompt:="Âû âûáðàëè êíîïêó 'Íåò'", _
17: Title:=mTitle, _
18: Buttons:=vbInformation
19: Case Is = vbCancel
20: MsgBox prompt:="Âû âûáðàëè êíîïêó 'Îòìåíà'", _
21: Title:=mTitle, _
22: Buttons:=vbCritical
23: End Select
24: End Sub

Ïðîöåäóðà Demo_MsgBoxFunction äåìîíñòðèðóåò èñïîëüçîâàíèå îïåðàòîðà


MsgBox êàê ôóíêöèè, ðåçóëüòàòû èñïîëüçîâàíèÿ ðàçëè÷íûõ àðãóìåíòîâ
Buttons è îöåíêó çíà÷åíèÿ, êîòîðîå âîçâðàùàåò ôóíêöèÿ MsgBox. Äèàëîãîâîå
îêíî, â êîòîðîì ïîëüçîâàòåëþ íåîáõîäèìî ñäåëàòü âûáîð, ïðåäñòàâëåíî íà
ðèñ. 5.3. Ðåçóëüòàòû ðàáîòû êîäà ýòîé ïðîöåäóðû ïðè âñåõ òðåõ (ïî îòäåëüíî-
ñòè, êîíå÷íî) âûáîðàõ ïðåäñòàâëåíû íà ðèñ. 5.4.
Ðèñ. 5.3
Îêíî êîäà ëèñòèíãà 5.9 ïðåäîñòàâëÿåò ïîëüçîâàòåëþ
âûáîð èç òðåõ êíîïîê

Ðèñ. 5.4. Òàêèå ñîîáùåíèÿ ìîæíî ïîëó÷èòü ïðè âûáîðå ðàçëè÷íûõ êíîïîê â
äèàëîãîâîì îêíå ôóíêöèè MsgBox

Àðãóìåíò Buttons äëÿ MsgBox ïîçâîëÿåò çàäàâàòü êîëè÷åñòâî è òèï êíîïîê


è íàëè÷èå èëè îòñóòñòâèå â îêíå ñîîáùåíèÿ îäíîãî èç çíà÷êîâ Windows äëÿ
îáîçíà÷åíèÿ ïðåäóïðåäèòåëüíîãî ñîîáùåíèÿ (Warning message), ñîîáùåíèÿ çà-
ïðîñà (Query message), èíôîðìàöèîííîãî ñîîáùåíèÿ (Information message)
è êðèòè÷åñêîãî ïðåäóïðåäèòåëüíîãî ñîîáùåíèÿ (Critical Warning message).
Ìîæíî òàêæå èñïîëüçîâàòü àðãóìåíò Buttons äëÿ îïðåäåëåíèÿ òîãî, êàêàÿ èç
îòîáðàæàåìûõ êíîïîê (êíîïêà 1, 2, 3 èëè 4) ÿâëÿåòñÿ êíîïêîé ïî óìîë÷àíèþ
â îêíå ñîîáùåíèÿ. Êàæäûé ðàç ìîæíî çàäàâàòü òîëüêî îäèí òèï êíîïêè, îäèí
çíà÷îê è îäíó êíîïêó ïî óìîë÷àíèþ.
×àùå èñïîëüçóéòå â ðàçðàáàòûâàåìûõ âàìè èíòåðôåéñíûé îêíàõ êíîïêè
ïî óìîë÷àíèþ. Ýòî ýêîíîìèò ïîëüçîâàòåëÿì òàêèõ ïðîãðàìì ìíîãî âðåìåíè,
òàê êàê âñåãäà ìîæíî äëÿ ïîäà÷è êîìàíäû ïðèëîæåíèþ âìåñòî ìûøè èñïîëü-
çîâàòü êëàâèàòóðó. Ïîíÿòíî, ÷òî «óäàðèòü» ïî êíîïêå Enter íà êëàâèàòóðå
212 Ãëàâà 5

áûñòðåå è ëåã÷å, ÷åì ïåðåìåñòèòü ìûøü (íå âñåãäà â õîðîøåì ñîñòîÿíèè) â îï-
ðåäåëåííîå ìåñòî íà ýêðàíå è ùåëêíóòü ëåâîé êëàâèøåé.
 ñòðîêå 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

×òîáû èçìåíèòü êîìàíäíóþ êíîïêó ïî óìîë÷àíèþ, äîáàâüòå îäíó èç âíóò-


ðåííèõ êîíñòàíò VBA — vbDefaultButton1, vbDefaultButton2, vbDefa-
ultButton3 èëè vbDefaultButton4 — ê àðãóìåíòó Buttons. Ñëåäóþùèé
ôðàãìåíò ïðîöåäóðû ïîêàçûâàåò îïåðàòîð MsgBox èç ñòðîê 7–9 ëèñòèíãà 5.9,
ìîäèôèöèðîâàííûé òàê, ÷òîáû êîìàíäíîé êíîïêîé ïî óìîë÷àíèþ â îêíå ñîîá-
ùåíèÿ áûëà êíîïêà No:
Resp = MsgBox(prompt:="Âûáåðèòå êíîïêó", _
Title:=mTitle, _
Buttons:=vbYesNoCancel + vbQuestion + _
VbDefaultButton2)
Ïðè âûïîëíåíèè ýòîãî îïåðàòîðà VBA îòîáðàæàåò äèàëîãîâîå îêíî, ïîêàçàííîå
íà ðèñ. 5.5. Ýòî îêíî èäåíòè÷íî îêíó, ïîêàçàííîìó ðàíåå íà ðèñ. 5.3, çà èñêëþ÷å-
íèåì òîãî, ÷òî äîáàâëåíèå çíà÷åíèÿ vbDefaultButton2 ê àðãóìåíòó Buttons äåëà-
åò âòîðóþ êíîïêó (â äàííîì ñëó÷àå — êíîïêó No) êíîïêîé ïî óìîë÷àíèþ.

Äîïîëíèòåëüíûå ñâîéñòâà ïðîöåäóð è ôóíêöèé


Òåïåðü, êîãäà âû çíàåòå óæå äîñòàòî÷íî ìíîãî î ïðîöåäóðàõ è ôóíêöèÿõ,
à òàêæå îá óïðàâëåíèè âûïîëíåíèåì êîäà íà VBA, ðàññìîòðèì íåêîòîðûå äî-
ïîëíèòåëüíûå ñâîéñòâà ïðîöåäóð è ôóíêöèé, èñïîëüçîâàíèå êîòîðûõ îòêðû-
âàåò íîâûå âîçìîæíîñòè äëÿ íàïèñàíèÿ õîðîøåãî êîäà.

Ðàííåå îêîí÷àíèå ïðîöåäóð, ôóíêöèé è öåëûõ ïðîãðàìì


Ñóùåñòâóþò îáñòîÿòåëüñòâà, òàêèå êàê îòìåíà îêíà ââîäà ïîëüçîâàòåëåì èëè
îòñóòñòâèå íåêîòîðûõ îæèäàåìûõ äàííûõ, ïðè êîòîðûõ íåò ñìûñëà ïðîäîë-
æàòü âûïîëíåíèå ïðîöåäóðû èëè ôóíêöèè. Åñëè ó âàñ èìååòñÿ ïðîãðàììà, ñî-
äåðæàùàÿ ïðîöåäóðû, êîòîðûå âûçûâàþò äðóãèå ôóíêöèè è ïðîöåäóðû, âû ìî-
æåòå çàäàòü óñëîâèÿ, ïðè êîòîðûõ âñÿ ïðîãðàììà äîëæíà ïðåêðàùàòü âûïîëíå-
íèå: íàïðèìåð, îòñóòñòâóåò ðàáî÷èé ëèñò, äèàïàçîí, äîêóìåíò è òàê äàëåå.
VBA èìååò îïåðàòîðû Exit è End, êîòîðûå äàþò âîçìîæíîñòü ëèáî çàâåð-
øàòü ïðîöåäóðó èëè ôóíêöèþ, ëèáî îñòàíàâëèâàòü âñþ ïðîãðàììó.

Èñïîëüçîâàíèå îïåðàòîðà Exit


Äëÿ òîãî ÷òîáû ïðîöåäóðà èëè ôóíêöèÿ ïðåêðàòèëà âûïîëíåíèå, èñïîëüçó-
åòñÿ îäíà èç äâóõ äîñòóïíûõ ôîðì VBA-îïåðàòîðà Exit, â çàâèñèìîñòè îò òîãî,
íåîáõîäèìî ëè çàâåðøèòü ôóíêöèþ èëè ïðîöåäóðó.
Îïåðàòîð Exit èìååò äâå ñèíòàêñè÷åñêèå ôîðìû:
Exit Sub
Exit Function
214 Ãëàâà 5

Exit Sub è Exit Function ðàáîòàþò îäèíàêîâî è èìåþò îäèí è òîò æå ðå-
çóëüòàò; Exit Sub èñïîëüçóåòñÿ äëÿ îêîí÷àíèÿ ïðîöåäóðû, à Exit Function —
äëÿ îêîí÷àíèÿ ôóíêöèè.
Ñíà÷àëà ðàññìîòðèì ïðîñòîé ïðèìåð — ëèñòèíã 5.10, êîòîðûé îòëè÷àåòñÿ
îò ëèñòèíãà 5.8 òåì, ÷òî â íåì íåò îïåðàòîðà GoTo.

Ëèñòèíã 5.10. Ïðèìåð èñïîëüçîâàíèÿ îïåðàòîðà Exit Sub


1:Sub EvalDiscount5()
2:'Îïðåäåëåíèå ñêèäêè (â %) â çàâèñèìîñòè îò
3:'êîëè÷åñòâà ïðîäàâàåìîãî òîâàðà
4: Dim lStr As String
5: Dim IntNum
6: IntNum = Application.InputBox( _
7: prompt:="Ââåäèòå êîëè÷åñòâî òîâàðà", _
8: Title:="Ïðîöåäóðà EvalDiscount5", _
9: Type:=1)
10:
11: If TypeName(VarWeight) = "Boolean" Then
12: MsgBox "Êîëè÷åñòâî íå óêàçàíî"
13: Exit Sub
14: End If
15:
16: Select Case IntNum
17: Case Is > 1000
18: lStr = "10"
19: Case Is > 500
20: lStr = "5 "
21: Case Else
22: lStr = "0 "
23: End Select
24:
25: MsgBox "Êîëè÷åñòâî: " & Str(IntNum) & ". Ñêèäêà " & lStr & "%"
26:
27:End Sub

 ñòðîêàõ 11–14 ýòîé ïðîöåäóðû ñîäåðæèòñÿ êîä ïðîâåðêè òîãî, áûëà ëè


âûáðàíà ïîëüçîâàòåëåì â îêíå ââîäà êíîïêà Cancel. Åñëè ýòî — òàê, ïðîãðàììà
âûäàåò ñîîáùåíèå î òîì, ÷òî êîëè÷åñòâî íå óêàçàíî, è ïðåêðàùàåò âûïîëíåíèå
êîäà îïåðàòîðîì Exit Sub. Äëÿ òàêîé íåáîëüøîé çàäà÷è ýòî — ñàìûé ïîäõî-
äÿùèé êîä. Âèäèìî, äàæå ñòîðîííèêè ñòðóêòóðíîãî ïðîãðàììèðîâàíèÿ íå
íàéäóò çäåñü ïðè÷èí äëÿ êðèòèêè, õîòÿ îïåðàòîð Exit Sub òàêæå íåëüçÿ îòíå-
ñòè ê ñòðóêòóðíûì ÿçûêîâûì êîíñòðóêöèÿì.
 ëèñòèíãå 5.11 ïðèâåäåíà ïðîöåäóðà MakeSalesRpt_Chart, â êîòîðîé òàê-
æå äëÿ ðàííåãî îêîí÷àíèÿ ïðîöåäóðû èñïîëüçóþòñÿ îïåðàòîðû Exit Sub.
Ïðè÷èíîé ðàííåãî îêîí÷àíèÿ ïðîöåäóðû ÿâëÿåòñÿ îòêàç ïîëüçîâàòåëÿ îò ââî-
äà èìåíè ðàáî÷åãî ëèñòà (â Excel). Ìîæíî òîëüêî ïðåäñòàâèòü ïîñëåäñòâèÿ âû-
ïîëíåíèÿ êîäà áåç ïðîâåðêè òîãî, ââåë ëè ïîëüçîâàòåëü èìÿ ëèñòà äëÿ äàëü-
íåéøåé åãî îáðàáîòêè!

Ëèñòèíã 5.11. Èñïîëüçîâàíèå îïåðàòîðà Exit Sub


1: Sub MakeSalesRpt_Chart()
2: 'Çàïðàøèâàåò èìÿ ëèñòà, ñîäåðæàùåãî èñõîäíûå äàííûå,
3: 'çàòåì çàïðàøèâàåò äèàïàçîí ÿ÷ååê ñ äàííûìè äëÿ äèàãðàììû.
4: 'Äàëåå çàïðàøèâàåòñÿ èìÿ ëèñòà äëÿ ïîìåùåíèÿ â íåãî êðóãîâîé
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 215

5: 'äèàãðàììû. Çàòåì ïðîöåäóðà ñîçäàåò äèàãðàììó è èñïîëüçóåò


6: 'ìåòîä ChartWizard äëÿ ïîëó÷åíèÿ êðóãîâîé äèàãðàììû
7:
8: Const sTitle = "Îò÷åò î ïðîäàæàõ"
9:
10: Dim SrcShtName As String
11: Dim SourceRng As String
12: Dim DestShtName As String
13:
14: 'ïîëó÷èòü èìÿ èñõîäíîãî ëèñòà
15: SrcShtName = InputBox(prompt:= _
16: "Ââåäèòå èìÿ ëèñòà, " & _
17: "ñîäåðæàùåãî äàííûå äëÿ äèàãðàììû", _
18: Title:=sTitle)
19: 'ïðîâåðèòü: ââåäåíî ëè èìÿ
20: If Len(Trim(SrcShtName)) = 0 Then
21: MsgBox "Èìÿ ñ äàííûìè íå ââåäåíî - êîíåö ðàáîòû"
22: Exit Sub
23: End If
24: 'âûáîð ëèñòà, íà êîòîðûé óêàçàë ïîëüçîâàòåëü
25: Sheets(SrcShtName).Select
26:
27: 'ïîëó÷èòü äèàïàçîí (ñ äàííûìè)
28: SourceRng = InputBox(prompt:= _
29: "Ââåäèòå äèàïàçîí ñ äàííûìè äëÿ äèàãðàììû, " & _
30: "èñïîëüçóÿ R1C1 ôîðìàò:", _
31: Title:=sTitle)
32: 'ïðîâåðêà: ââåäåí ëè äèàïàçîí
33: If Len(Trim(SourceRng)) = 0 Then
34: MsgBox "Äèàïàçîí äàííûõ íå ââåäåí - êîíåö ðàáîòû"
35: Exit Sub
36: End If
37:
38: 'ïîëó÷èòü èìÿ ëèñòà äëÿ ïîìåùåíèÿ â íåãî äèàãðàììû
39: DestShtName = InputBox(prompt:="Ââåäèòå èìÿ ëèñòà " & _
40: "äëÿ äèàãðàììû:", _
41: Title:=sTitle)
42: 'ïðîâåðêà: íå âûáðàíà ëè Îòìåíà
43: If Len(Trim(DestShtName)) = 0 Then
44: MsgBox "Ëèñò äëÿ äèàãðàììû íå ââåäåí " & _
45: "- êîíåö ðàáîòû"
46: Exit Sub
47: End If
48:
49: 'âûáîð ëèñòà è ñîçäàíèå äèàãðàììû
50: Sheets(DestShtName).Select
51: ActiveSheet.ChartObjects.Add(96, 37.5, 234, 111).Select
52:
53: 'èñïîëüçîâàíèå ìåòîäà ChartWizard äëÿ ñîçäàíèÿ äèàãðàììû
54: With Sheets(SrcShtName)
55: ActiveChart.ChartWizard Source:=.Range(SourceRng), _
56: Gallery:=xlPie, _
57: Format:=7, _
58: PlotBy:=xlColumns, _
59: CategoryLabels:=1, _
60: SeriesLabels:=1, _
61: HasLegend:=1, _
62: Title:="Îò÷åò î ïðîäàæàõ«
63: End With
64: End Sub
216 Ãëàâà 5

Ïðîöåäóðà MakeSalesRpt_Chart ÿâëÿåòñÿ îòðåäàêòèðîâàííîé âåðñèåé çà-


ïèñàííîãî ðåêîðäåðîì ìàêðîñà Excel. Ñíà÷àëà áûë çàïèñàí ìàêðîñ äëÿ ñîçäà-
íèÿ ôðàãìåíòà äèàãðàììû. Çàòåì ýòîò ìàêðîñ áûë ñêîïèðîâàí â äðóãîé ìî-
äóëü è îòðåäàêòèðîâàí ñ äîáàâëåíèåì îáúÿâëåíèÿ ðàçëè÷íûõ êîíñòàíò è ïåðå-
ìåííûõ. Â ïðîöåäóðó áûëè äîáàâëåíû îïåðàòîðû VBA äëÿ ââîäà äàííûõ îò
ïîëüçîâàòåëÿ è îöåíêè ââîäèìûõ äàííûõ. (Çàìåòüòå, ÷òî ïðîöåäóðà ðàáîòàåò
òîëüêî â Excel.)
 ïåðåìåííîé SrcShtName ñîõðàíÿåòñÿ (ñòðîêè 15–18) èìÿ ðàáî÷åãî ëèñòà,
â êîòîðîì ñîäåðæàòñÿ äàííûå äëÿ ãðàôè÷åñêîãî èçîáðàæåíèÿ, â SourceRng
(ñòðîêè 28–31) — äèàïàçîí äàííûõ äëÿ äèàãðàììû, â DestShtName (ñòðîêè
39–41) — èìÿ ðàáî÷åãî ëèñòà äëÿ ïîìåùåíèÿ â íåãî äèàãðàììû.
Ïîñëå êàæäîãî ââîäà äàííûõ ðåçóëüòàò îïåðàöèè ââîäà ïðîâåðÿåòñÿ. Åñëè
äàííûå íå ââåäåíû, ðàáîòà ïðîöåäóðû çàêàí÷èâàåòñÿ îïåðàòîðîì Exit Sub.
Îïåðàòîð Exit Sub ïðèâîäèò ê òîìó, ÷òî VBA íåìåäëåííî ïðåêðàùàåò âû-
ïîëíåíèå êîäà ïðîöåäóðû. Ïîñëå âûïîëíåíèÿ îïåðàòîðîâ Exit Sub VBA ïðå-
êðàùàåò âûïîëíåíèå òåêóùåé ïðîöåäóðû è âîçâðàùàåòñÿ ê âûïîëíåíèþ òîé
ïðîöåäóðû èëè ôóíêöèè, êîòîðàÿ âûçâàëà ïðîöåäóðó, ñîäåðæàùóþ îïåðàòîð
Exit Sub.
Ñîâåò
Èñïîëüçóéòå îïåðàòîð Exit Sub èëè Exit Function âìåñòî GoTo äëÿ ðàííåãî îêîí÷àíèÿ ïðîöåäóðû
èëè ôóíêöèè. Îïåðàòîð Exit Sub áîëåå î÷åâèäíî ïîêàçûâàåò, ÷òî ïðîöåäóðà çàêîí÷èò âûïîëíå-
íèå. È, ñëåäîâàòåëüíî, åå ëåã÷å ïèñàòü, ÷èòàòü è ïîíèìàòü.

Èñïîëüçîâàíèå îïåðàòîðà End


Âû óæå çíàêîìû ñ êëþ÷åâûìè ñëîâàìè End Sub è End Function, èñïîëü-
çóåìûìè äëÿ ñîîáùåíèÿ VBA î äîñòèæåíèè êîíöà ïðîöåäóðû èëè ôóíêöèè.
Ýòè êëþ÷åâûå ñëîâà-èíñòðóêöèè óêàçûâàþò VBA ïðåêðàòèòü âûïîëíåíèå
êîäà òåêóùåé ïðîöåäóðû èëè ôóíêöèè è âîçîáíîâèòü âûïîëíåíèå êîäà ïðîöå-
äóðû èëè ôóíêöèè, êîòîðàÿ âûçâàëà òåêóùóþ ïðîöåäóðó èëè ôóíêöèþ; åñëè
òåêóùàÿ ïðîöåäóðà íå áûëà âûçâàíà äðóãîé ïðîöåäóðîé, VBA ïðåêðàùàåò âû-
ïîëíåíèå âñåõ îïåðàòîðîâ.
Îäíèì èç õîðîøèõ ïðèíöèïîâ ïðîãðàììèðîâàíèÿ ÿâëÿåòñÿ ïðèíöèï ìî-
äóëüíîñòè. Ïðîöåäóðà íå äîëæíà ñîäåðæàòü áåñêîíå÷íî äëèííûé êîä, ÷àñòè
êîòîðîãî âûïîëíÿþò ñîâåðøåííî íå ñâÿçàííûå ìåæäó ñîáîé çàäà÷è. Ñëåäóåò
ïîìåùàòü â êàæäóþ ïðîöåäóðó íåáîëüøîé è ôóíêöèîíàëüíî çàêîí÷åííûé
êîä, êîòîðûé ëåãêî ÷èòàòü è ñîïðîâîæäàòü. Íàïðèìåð, õîðîøî ïîíèìàåòñÿ
êîä ñî ñëåäóþùåé ñòðóêòóðîé:
Sub ÃëàâíàÿÏðîöåäóðà()

'Âûçîâ ïðîöåäóðû Ïðîöåäóðà1


Call Ïðîöåäóðà1

'Âûçîâ ïðîöåäóðû Ïðîöåäóðà2


Call Ïðîöåäóðà2

'Âûçîâ ïðîöåäóðû Ïðîöåäóðà3


Call Ïðîöåäóðà3

End Sub

Sub Ïðîöåäóðà1()
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 217

'Êîä ïðîöåäóðû
End Sub
Sub Ïðîöåäóðà2()
'Êîä ïðîöåäóðû
End Sub
Sub Ïðîöåäóðà3()
'Êîä ïðîöåäóðû
End Sub
Ìîæíî òàêæå âñòðåòèòü è ñëåäóþùèé êîä:
Sub ÃëàâíàÿÏðîöåäóðà()

'Âûçîâ ïðîöåäóðû Ïðîöåäóðà1


Call Ïðîöåäóðà1

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.12. Ïðåêðàùåíèå âûïîëíåíèÿ ïðîãðàììû îïåðàòîðîì End


1: Function GetBookName(ByVal lDflt As String, _
2: Optional Prmpt, _
3: Optional lTitle) As String
4: 'âêëþ÷åí ëè ïàðàìåòð Prmpt â ñïèñîê àðãóìåíòîâ?
5: If IsMissing(Prmpt) Then Prmpt = "Ââåäèòå èìÿ êíèãè:"
6:
7: 'åñëè lDflt íå ÿâëÿåòñÿ ïóñòîé ñòðîêîé, ïðåîáðàçîâàòü åå
8: 'ê âåðõíåìó ðåãèñòðó, èíà÷å ïðèñâîèòü lDflt èìÿ
9: If lDflt <> "" Then
10: lDflt = UCase(lDflt)
11: Else
12: lDflt = "NEWFILE.XLS"
13: End If
14:
15: 'èñïîëüçîâàòü InputBox äëÿ ïîëó÷åíèÿ èìåíè ôàéëà
16: GetBookName = InputBox(prompt:=Prmpt, _
17: Title:=lTitle, _
18: Default:=lDflt)
19:
20:
21: 'ïðîâåðêà: íå áûëà ëè ïðîèçâåäåíà îòìåíà
22: If Len(Trim(GetBookName)) = 0 Then
23: MsgBox prompt:="Îêîí÷àíèå ïðîãðàììû", Title:=lTitle
24: End
25: End If
26: End Function
27:
28:
29: Sub TestGetBook_Name()
30: 'Òåñòèðîâàíèå ôóíêöèè GetBookName
31:
32: MsgBox GetBookName(lDflt:="", _
33: lTitle:="Òåñòèðîâàíèå âûõîäà èç ïðîãðàììû")
34: End Sub

Ïèøèòå ïðîöåäóðû èëè ôóíêöèè, èñïîëüçóþùèå îïåðàòîð End, äëÿ îòîáðà-


æåíèÿ íåêîòîðîãî ñîîáùåíèÿ ïîëüçîâàòåëþ î òîì, ÷òî áóäåò ïðîèñõîäèòü è ïî-
÷åìó, ïåðåä îïåðàòîðîì, êîòîðûé ôàêòè÷åñêè ñîäåðæèò îïåðàòîð End.  ïðî-
òèâíîì ñëó÷àå ïîëüçîâàòåëè âàøåé ïðîöåäóðû ìîãóò íå ïîíÿòü, ïî÷åìó ïðîöå-
äóðà èëè ïðîãðàììà, êîòîðóþ îíè èñïîëüçóþò, âíåçàïíî ïðåêðàòèëà ðàáîòó.
Åñëè ïðîãðàììà ïåðåñòàíåò âûïîëíÿòüñÿ âñëåäñòâèå êàêîãî-ëèáî äåéñòâèÿ
ïîëüçîâàòåëÿ, òàêîãî êàê îòìåíà îêíà ââîäà, áåç îáúÿñíåíèÿ, ïîëüçîâàòåëü
ïðîöåäóðû ìîæåò íèêîãäà íå óçíàòü, ïî÷åìó ïðîöåäóðà çàêàí÷èâàåòñÿ; â äåé-
ñòâèòåëüíîñòè, ïîëüçîâàòåëè ñêëîííû ñ÷èòàòü, ÷òî ýòî ïðîèñõîäèò èç-çà îøèá-
êè â ïðîöåäóðå.
Íå çàáûâàéòå çàêðûâàòü ðàáî÷èå êíèãè èëè âûïîëíÿòü äðóãóþ ñåðâèñíóþ
ðàáîòó ïåðåä âûïîëíåíèåì îïåðàòîðà End, ÷òîáû ïîëüçîâàòåëþ ïðîãðàììû íå
ïðèõîäèëîñü, íàïðèìåð, äîäåëûâàòü íàïîëîâèíó çàêîí÷åííûå äèàãðàììû èëè
èìåòü äåëî ñ ðàáî÷èìè êíèãàìè, êîòîðûå èìåþò íåñîõðàíåííûå äàííûå, êîãäà
âàøà ïðîãðàììà ïðåêðàùàåò âûïîëíåíèå.
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 219

Äîïîëíèòåëüíûå ñâîéñòâà íåîáÿçàòåëüíûõ àðãóìåíòîâ


Íåîáÿçàòåëüíûå àðãóìåíòû ôóíêöèè ìîãóò îáúÿâëÿòüñÿ ñ òèïîì (èíà÷å, ïî
óìîë÷àíèþ, îíè èìåþò òèï Variant). Òèï íåîáÿçàòåëüíîãî àðãóìåíòà îáúÿâ-
ëÿåòñÿ ïî òåì æå ïðè÷èíàì, ÷òî è òèï îáÿçàòåëüíîãî àðãóìåíòà: äëÿ òîãî, ÷òî-
áû ïðàâèëüíî èñïîëüçîâàòü ôóíêöèè è îáíàðóæèâàòü îïåðàòîðû, êîòîðûå ïå-
ðåäàþò ôóíêöèè íåâåðíûå çíà÷åíèÿ.
Òèï íåîáÿçàòåëüíîãî àðãóìåíòà îáúÿâëÿåòñÿ òåì æå ñïîñîáîì, ÷òî è òèï
îáÿçàòåëüíîãî àðãóìåíòà — ñ ïîìîùüþ êëþ÷åâîãî ñëîâà As. Ñëåäóþùèé ôðàã-
ìåíò êîäà ïîêàçûâàåò îáúÿâëåíèå ôóíêöèè ñ òèïîì íåîáÿçàòåëüíîãî àðãóìåí-
òà nChar êàê Long:
Function UpCase(tStr As String, Optional nChar As Long) As String
Âñÿêèé ðàç ïðè îáúÿâëåíèè íåîáÿçàòåëüíîãî àðãóìåíòà ôóíêöèè VBA ðå-
çåðâèðóåò ìåñòî äëÿ ýòîãî àðãóìåíòà. Ïîñêîëüêó íåîáÿçàòåëüíûå àðãóìåíòû
ìîãóò ïðèñóòñòâîâàòü èëè íå ïðèñóòñòâîâàòü âî âðåìÿ âûçîâà ôóíêöèè, ìîæíî
óêàçàòü VBA ïðèñâàèâàòü íåîáÿçàòåëüíîìó àðãóìåíòó çíà÷åíèå ïî óìîë÷à-
íèþ. VBA èñïîëüçóåò çíà÷åíèå ïî óìîë÷àíèþ êàæäûé ðàç, êîãäà ôóíêöèÿ âû-
çûâàåòñÿ áåç ýòîãî âêëþ÷åííîãî êîíêðåòíîãî íåîáÿçàòåëüíîãî àðãóìåíòà. Çíà-
÷åíèå ïî óìîë÷àíèþ ïðèñâàèâàåòñÿ íåîáÿçàòåëüíîìó àðãóìåíòó ñ ïîìîùüþ
çíàêà ðàâåíñòâà (=) è ïðåäîñòàâëåíèÿ êîíñòàíòíîãî çíà÷åíèÿ òàê æå, êàê ïðè
îáúÿâëåíèè èìåííîâàííîé êîíñòàíòû.
Function GetBookName5(Optional lDflt As String = "Êíèãà1") As String
Ëèñòèíã 5.13 ñîäåðæèò ôóíêöèþ GetBookName5, ïîëó÷åííóþ èç ïîäîáíîé
ôóíêöèè ëèñòèíãà 5.4. Çäåñü íåîáÿçàòåëüíûé àðãóìåíò îáúÿâëåí ñ òèïîì è
çíà÷åíèåì ïî óìîë÷àíèþ.
Çàìå÷àíèå
Ôóíêöèÿ IsMissing ðàáîòàåò òîëüêî ñ íåîáÿçàòåëüíûìè àðãóìåíòàìè òèïà Variant. Äëÿ âñåõ
äðóãèõ òèïîâ íåîáÿçàòåëüíûõ àðãóìåíòîâ VBA èíèöèàëèçèðóåò çíà÷åíèå àðãóìåíòà, êàê
äëÿ ëþáîé íîâîé ïåðåìåííîé (ñòðîêè èìåþò íóëåâóþ äëèíó è ÷èñëåííûå òèïû ðàâíû 0), à
IsMissing âñåãäà âîçâðàùàåò False. ×òîáû îáíàðóæèòü ïðîïóùåííûé òèïèçèðîâàííûé íå-
îáÿçàòåëüíûé àðãóìåíò, òåñòèðóéòå åãî íà ðàâåíñòâî 0 èëè ñòðîêå íóëåâîé äëèíû.

Ëèñòèíã 5.13. Ôóíêöèÿ GetBookName5


1: Function GetBookName5(Optional lDflt As String = "Êíèãà1") As String
2: Dim lTitle As String, lPrmpt As String, lVar As String
3:
4: lTitle = "Ââîä íàèìåíîâàíèÿ êíèãè"
5: lPrmpt = "Ââåäèòå íàèìåíîâàíèå íîâîé êíèãè"
6:
7: 'èñïîëüçîâàíèå InputBox äëÿ ïîëó÷åíèÿ èìåíè ôàéëà.
8: lVar = Trim(InputBox(prompt:=lPrmpt, _
9: Title:=lTitle, _
10: Default:=lDflt))
11:
12: 'ïðîâåðèòü íàëè÷èå ñòðîêè ââîäà
13: If Len(lVar) = 0 Then
14: MsgBox "Íàèìåíîâàíèå íå ââåäåíî!"
15: GetBookName5 = lDflt 'èìÿ ïî óìîë÷àíèþ
16: Else
17: GetBookName5 = lVar
18: End If
19:
220 Ãëàâà 5

20: End Function 'GetBookName


21:
22: 'Òåñòèðîâàíèå ôóíêöèè GetBookName5
23: Sub Test_GetBookName5()
24: MsgBox GetBookName5("Íîâàÿ_Êíèãà")
25: End Sub

Ñðàâíèòå ýòîò êîä ñ êîäîì ëèñòèíãà 5.4. Íåïðàâäà ëè, ýòîò êîä áîëåå èçÿùåí?

Óïðàâëåíèå ïåðåäà÷åé àðãóìåíòîâ


Òåïåðü, êîãäà âû çíàåòå, êàê ñîçäàâàòü ôóíêöèè-ïðîöåäóðû ñ òèïèçèðîâàí-
íûìè è íåîáÿçàòåëüíûìè àðãóìåíòàìè, êàæåòñÿ, ÷òî åùå ìîæíî äåëàòü ñ àð-
ãóìåíòàìè, ÷òîáû ïðîãðàììû îáëàäàëè áîëüøèìè âîçìîæíîñòÿìè? Îêàçûâà-
åòñÿ, ñóùåñòâóþò ìåõàíèçìû, êîòîðûå VBA èñïîëüçóåò äëÿ ôàêòè÷åñêîé ïåðå-
äà÷è (è âîçâðàùåíèÿ) äàííûõ-àðãóìåíòîâ ôóíêöèè-ïðîöåäóðå, è âû ìîæåòå
óïðàâëÿòü ýòèìè ìåõàíèçìàìè.

Ïåðåäà÷à àðãóìåíòîâ ïî ññûëêå è ïî çíà÷åíèþ


Ñóùåñòâóåò äâà ñïîñîáà, êîòîðûìè VBA ïåðåäàåò èíôîðìàöèþ â ôóíê-
öèþ-ïðîöåäóðó: ïî ññûëêå (by reference) è ïåðåäà÷à àðãóìåíòîâ ïî çíà÷åíèþ (by
value). Ïî óìîë÷àíèþ VBA ïåðåäàåò âñå àðãóìåíòû ïî ññûëêå. Ïðè ïåðåäà÷å
äàííûõ ôóíêöèè ïîñðåäñòâîì àðãóìåíòà ïî ññûëêå VBA, íà ñàìîì, äåëå òîëüêî
ïåðåäàåò àäðåñ ïàìÿòè, êîòîðûé ññûëàåòñÿ íà èñõîäíûå äàííûå, îïðåäåëåííûå
â ñïèñêå àðãóìåíòîâ ôóíêöèè âî âðåìÿ âûçîâà ôóíêöèè. Ýòî îçíà÷àåò, ÷òî åñëè
ôóíêöèÿ èçìåíÿåò çíà÷åíèÿ â ëþáîì èç àðãóìåíòîâ, èñõîäíûå äàííûå, ïåðå-
äàííûå ôóíêöèè ïîñðåäñòâîì ýòîãî àðãóìåíòà, òàêæå èçìåíÿþòñÿ.
Ïðè ïåðåäà÷å àðãóìåíòà ïî çíà÷åíèþ VBA äåëàåò êîïèþ èñõîäíûõ äàííûõ
è ïåðåäàåò ýòó êîïèþ ôóíêöèè. Åñëè ôóíêöèÿ èçìåíÿåò çíà÷åíèå â àðãóìåíòå,
ïåðåäàâàåìîì ïî çíà÷åíèþ, èçìåíÿåòñÿ òîëüêî êîïèÿ äàííûõ; èñõîäíûå äàí-
íûå íå èçìåíÿþòñÿ. Ïåðåäà÷à ïî ññûëêå ïîçâîëÿåò ñ ïîìîùüþ ôóíêöèè èçìå-
íÿòü èñõîäíûå äàííûå, ïåðåäàâàåìûå ôóíêöèè ïîñðåäñòâîì àðãóìåíòà; ïåðå-
äà÷à æå ïî çíà÷åíèþ íå ïîçâîëÿåò èçìåíÿòü çíà÷åíèå èñõîäíûõ äàííûõ.
Ïîñêîëüêó ïåðåäà÷à ïî ññûëêå ïîçâîëÿåò ôóíêöèè èçìåíÿòü çíà÷åíèå èñ-
õîäíûõ äàííûõ åå àðãóìåíòîâ, àðãóìåíòû, ïåðåäàâàåìûå ïî ññûëêå, ìîãóò ïî-
ëó÷èòü íåæåëàòåëüíûå ïîáî÷íûå çíà÷åíèÿ. Ëèñòèíã 5.14 ñîäåðæèò êîä ôóíê-
öèè Sconcat, êîòîðàÿ îáúåäèíÿåò äâå ñòðîêè, ïåðåäàâàåìûå åé êàê ïàðàìåòðû
ïî ññûëêå. Ïåðåä îáúåäèíåíèåì ñòðîê èç íèõ óäàëÿþòñÿ íà÷àëüíûå è õâîñòî-
âûå ïðîáåëû. Ïðè ýòîì îïåðàòîðû óäàëåíèÿ ïðîáåëîâ â êà÷åñòâå ïðîìåæóòî÷-
íûõ ïåðåìåííûõ èñïîëüçóþò ñàìè àðãóìåíòû, òàêèì îáðàçîì ìåíÿÿ èõ çíà÷å-
íèÿ. Ðåçóëüòàò ðàáîòû ïðîãðàììû òåñòèðîâàíèÿ ôóíêöèè Sconcat ïðèâåäåí íà
ðèñ. 5.6.

Ëèñòèíã 5.14. Ïîáî÷íûå ðåçóëüòàòû ôóíêöèè Sconcat


1: Function Sconcat(arg1 As String, arg2 As String) As String
2: arg1 = Trim(arg1)
3: arg2 = Trim(arg2)
4: Sconcat = arg1 & arg2
5: End Function
6:
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 221

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

Îïðåäåëåíèå ñïîñîáà ïåðåäà÷è àðãóìåíòà


Ïîíÿòíî, ÷òî ïîáî÷íûå ðåçóëüòàòû, âûçâàííûå èçìåíåíèåì ôóíêöèåé çíà-
÷åíèé â àðãóìåíòàõ, ïåðåäàâàåìûõ ïî ññûëêå, ÿâëÿþòñÿ íåîáÿçàòåëüíûìè è â
áîëüøèíñòâå ñëó÷àåâ — íåæåëàòåëüíûìè. Îíè ìîãóò ïðèâåñòè ê ñåðüåçíûì
ïðîáëåìàì â ïðîãðàììàõ. ×àñòî áûâàåò òðóäíî îòñëåäèòü ïðîáëåìû, âûçâàí-
íûå ïîáî÷íûìè ðåçóëüòàòàìè, ïîòîìó ÷òî ðåäêî ïðè÷èíà êàêîãî-ëèáî èçìåíå-
íèÿ çíà÷åíèÿ ïåðåìåííîé ÿâëÿåòñÿ î÷åâèäíîé. (Ïîáî÷íûé ðåçóëüòàò [side
effect] — ýòî îáùèé òåðìèí äëÿ îáîçíà÷åíèÿ ëþáîãî èçìåíåíèÿ â çíà÷åíèè ïå-
ðåìåííîé â ñðåäå âûïîëíÿþùåéñÿ ïðîãðàììû, êîòîðîå íå çàïðîãðàììèðîâàíî
ÿâíî.)
Äëÿ ïðåäóïðåæäåíèÿ òàêèõ ïîáî÷íûõ ðåçóëüòàòîâ íåîáõîäèìî, ÷òîáû
ôóíêöèÿ ðàáîòàëà ñ êîïèåé çíà÷åíèÿ àðãóìåíòà, à íå ñ èñõîäíûìè äàííûìè.
Ìîæíî áûëî áû, êîíå÷íî, îáúÿâèòü ëîêàëüíóþ ïåðåìåííóþ â ôóíêöèè-ïðîöå-
äóðå è êîïèðîâàòü àðãóìåíò â ýòó ëîêàëüíóþ ïåðåìåííóþ. Êîïèðîâàíèå çíà÷å-
íèé àðãóìåíòà â ëîêàëüíûå ïåðåìåííûå ôóíêöèè îáû÷íî íåæåëàòåëüíî. Äî-
ïîëíèòåëüíûå ïåðåìåííûå óâåëè÷èâàþò îáúåì ïàìÿòè, íåîáõîäèìîé äëÿ
ôóíêöèè, è êîëè÷åñòâî âûïîëíÿåìîé ïðîãðàììèñòîì ðàáîòû. Äîïîëíèòåëü-
íûå ïåðåìåííûå ìîãóò òàêæå ïðèâåñòè â áåñïîðÿäîê ïðîãðàììíûé êîä, óñ-
ëîæíÿÿ åãî äî îøèáî÷íîãî.
Áîëåå ëåãêèé è ïðåäïî÷òèòåëüíûé ñïîñîá îáåñïå÷èòü ðàáîòó ôóíêöèè òîëü-
êî ñ êîïèÿìè çíà÷åíèÿ àðãóìåíòà, à íå ñ èñõîäíûì çíà÷åíèåì — ýòî óêàçàòü
VBA, ÷òî àðãóìåíò äîëæåí ïåðåäàâàòüñÿ ïî çíà÷åíèþ, à íå ïî ññûëêå. (Ïîìíè-
òå, ïåðåäà÷à ïî çíà÷åíèþ äàåò ôóíêöèè êîïèþ çíà÷åíèÿ àðãóìåíòà; ïåðåäà÷à
ïî ññûëêå îòêðûâàåò ôóíêöèè äîñòóï ê èñõîäíûì äàííûì â àðãóìåíòå.)
×òîáû ÿâíî óêàçàòü, ïåðåäàåò VBA àðãóìåíò ïî çíà÷åíèþ èëè ïî ññûëêå,
èñïîëüçóéòå êëþ÷åâîå ñëîâî ByVal èëè ByRef ïåðåä àðãóìåíòîì, äëÿ êîòîðîãî
íåîáõîäèìî çàäàòü ìåòîä ïåðåäà÷è. Êàê ìîæíî ïîíÿòü ïî èìåíàì êëþ÷åâûõ
ñëîâ, ïðè èñïîëüçîâàíèè ByVal VBA ïåðåäàåò àðãóìåíò ïî çíà÷åíèþ, à ïðè
ByRef — ïî ññûëêå.
Èçìåíèì îáúÿâëåíèå ôóíêöèè Sconcat2 (ëèñòèíã 5.15) ñ öåëüþ ïåðåäà÷è åé
àðãóìåíòîâ ïî çíà÷åíèþ è ïðîòåñòèðóåì ïîëó÷èâøèéñÿ êîä.

Ëèñòèíã 5.15. Óñòðàíåíèå ïîáî÷íûõ ðåçóëüòàòîâ ôóíêöèè Sconcat


â ôóíêöèè Sconcat2
222 Ãëàâà 5

1: Function Sconcat2(ByVal arg1 As String, ByVal arg2 As String) As String


2: arg1 = Trim(arg1)
3: arg2 = Trim(arg2)
4: Sconcat2 = arg1 & arg2
5: End Function
6:
7: Sub Test_Sconcat2()
8: Dim a1 As String, a2 As String
9: a1 = " Çíà÷åíèå à1: "
10: a2 = " Çíà÷åíèå à2: "
11: MsgBox a1 & a2, , "Äî âûçîâà Sconcat2"
12: MsgBox Sconcat2(a1, a2), , "Ïðè âûçîâå Sconcat2"

13: MsgBox a1 & a2, , "Ïîñëå âûçîâà Sconcat2"


14: End Sub
Îáðàòèòå âíèìàíèå íà òî, ÷òî çíà÷åíèÿ ïåðåìåííûõ a1 è a2 íå èçìåíèëèñü
ïîñëå âûçîâà ôóíêöèè Sconcat2.

Ðèñ. 5.7. Ðåçóëüòàòû


òåñòèðîâàíèÿ
ôóíêöèè Sconcat2
èç ëèñòèíãà 5.15

Íå ñëåäóåò îáúÿâëÿòü àðãóìåíòû ïî çíà÷åíèþ (ByVal), åñëè òîëüêî ôóíê-


öèÿ-ïðîöåäóðà íå èçìåíÿåò ýòîò àðãóìåíò, ïîòîìó ÷òî ïåðåäà÷à àðãóìåíòîâ ïî
çíà÷åíèþ ìîæåò èñïîëüçîâàòü áîëüøå ïàìÿòè è âðåìåíè äëÿ âûïîëíåíèÿ, ÷åì
ïðè ïåðåäà÷å àðãóìåíòîâ ïî ññûëêå — ïåðåäà÷à àðãóìåíòîâ ïî çíà÷åíèþ ïðè-
âîäèò ê òîìó, ÷òî VBA äåëàåò êîïèþ äàííûõ äëÿ àðãóìåíòà.
Îáúÿâëÿéòå àðãóìåíò ñ êëþ÷åâûì ñëîâîì ByVal äëÿ ïåðåäà÷è åãî ïî çíà÷å-
íèþ, åñëè ó âàñ èìåþòñÿ ñîìíåíèÿ, ñëåäóåò ëè ïåðåäàâàòü ýòîò êîíêðåòíûé àð-
ãóìåíò ïî ññûëêå èëè ïî çíà÷åíèþ: ïîòåðè â îáúåìå ïàìÿòè è ñêîðîñòè ïðè ïå-
ðåäà÷å ïî çíà÷åíèþ íå ñëèøêîì âåëèêè. Êðîìå òîãî, ïåðåäà÷à àðãóìåíòà ïî
çíà÷åíèþ ýôôåêòèâíåå è äåëàåò êîä áîëåå ïîíÿòíûì, ÷åì ñîçäàíèå âàøåé ñîá-
ñòâåííîé êîïèè çíà÷åíèÿ àðãóìåíòà â ëîêàëüíîé ïåðåìåííîé.

Ðåêóðñèÿ
 êîíöå ýòîé ãëàâû, ïîñâÿùåííîé íàïèñàíèþ ïîëüçîâàòåëüñêèõ ôóíê-
öèé-ïðîöåäóð, íåîáõîäèìî îáúÿñíèòü åùå îäíî âàæíîå ïîíÿòèå, õîòÿ îíî è íå
ÿâëÿåòñÿ íåïîñðåäñòâåííî ÷àñòüþ ïðîöåññà ñîçäàíèÿ ôóíêöèé-ïðîöåäóð VBA.
Áîëåå òîãî, ýòîò ìàòåðèàë ïðåäíàçíà÷åí íå äëÿ íà÷èíàþùèõ ïðîãðàììèñòîâ è
ìîæåò áûòü ïðîïóùåí ïðè ïåðâîì ÷òåíèè äàííîé êíèãè.
Ðåêóðñèâíàÿ (recursive) ôóíêöèÿ èëè ïðîöåäóðà — ýòî ôóíêöèÿ èëè ïðîöå-
äóðà, êîòîðàÿ âûçûâàåò ñàìà ñåáÿ. Ïî÷òè âî âñåõ ñëó÷àÿõ, ðåêóðñèÿ ÿâëÿåòñÿ
îøèáêîé ïðîãðàììèðîâàíèÿ è ïðèâîäèò ê ïîëíîìó ñáîþ ïðîãðàììû. Íàèáîëåå
îáùèì ñèìïòîìîì âîçíèêíîâåíèÿ ýòîé ïðîáëåìû ÿâëÿåòñÿ îøèáêà èç-çà íå-
õâàòêè ïàìÿòè èëè îøèáêà èç-çà íåõâàòêè ïàìÿòè â ñòåêå. Ñòåê (stack) — ýòî
âðåìåííàÿ ðàáî÷àÿ îáëàñòü êîìïüþòåðíîé ïàìÿòè. VBA èñïîëüçóåò ñòåêîâóþ
ïàìÿòü äëÿ ñîõðàíåíèÿ âíóòðåííèõ ðåçóëüòàòîâ âûðàæåíèé, êîïèé àðãóìåí-
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 223

òîâ ôóíêöèé, ïåðåäàâàåìûõ ïî çíà÷åíèþ, ðåçóëüòàòîâ ôóíêöèé-ïðîöåäóð è â


äðóãèõ ñëó÷àÿõ, êîãäà íåîáõîäèìà âðåìåííàÿ ðàáî÷àÿ îáëàñòü.

Ïðèìåðû ðåêóðñèâíûõ ôóíêöèé


Ñàìûé ïðîñòîé ïðèìåð, êîòîðûé ìîæåò ïðîäåìîíñòðèðîâàòü ðåêóðñèâíóþ
ôóíêöèþ, ýòî — ïðèìåð ôóíêöèè âîçâåäåíèÿ ÷èñëà â ñòåïåíü. Àëãîðèòì
ôóíêöèè fPower îñíîâàí íà òîì ôàêòå, ÷òî ÷èñëî, âîçâåäåííîå â ñòåïåíü n,
ðàâíî ýòîìó æå ÷èñëó, óìíîæåííîìó ñàìî íà ñåáÿ â ñòåïåíè n–1. Íàïðèìåð, 23
ðàâíî 2x23–1 èëè 2x22 .
Ëèñòèíã 5.16 ñîäåðæèò êîä ôóíêöèè fPower, âîçâðàùàþùåé ñòåïåíü ÷èñëà.
 êà÷åñòâå àðãóìåíòîâ ôóíêöèÿ ïðèíèìàåò ÷èñëî è ñòåïåíü, â êîòîðóþ íóæíî
âîçâåñòè ýòî ÷èñëî.

Ëèñòèíã 5.16. Ôóíêöèÿ fPower: ïðèìåð ðåêóðñèè


1: Function fPower(num As Double, pwr As Integer) As Double
2: 'ðåêóðñèâíîå âîçâåäåíèå â ñòåïåíü
3: If pwr = 0 Then
4: fPower = 1 'îêîí÷àíèå ðåêóðñèè
5: Else
6: fPower = num * fPower(num, pwr - 1) 'ðåêóðñèÿ
7: End If
8: End Function
9:
10: Sub Test_fPower()
11: MsgBox fPower(2, 3)
12: End Sub

Ôóíêöèÿ fPower èìååò äâà îáÿçàòåëüíûõ àðãóìåíòà: num è pwr, è âîçâðà-


ùàåò ðåçóëüòàò òèïà Double. Â ñòðîêå 6 ôóíêöèÿ âûçûâàåò ñàìà ñåáÿ. ×òîáû
ïîíÿòü, êàê ðàáîòàåò ôóíêöèÿ fPower, ðàññìîòðèì ïîðÿäîê âûïîëíåíèÿ êîäà
ôóíêöèè, âûçâàííîé ïðîöåäóðîé Test_fPower.
 ýòîì ñëó÷àå ïðè ïåðâîì îáðàùåíèè àðãóìåíò num (è âñåãäà) èìååò çíà÷å-
íèå 2, à pwr — çíà÷åíèå 3.  ñòðîêå 3 íà÷èíàåòñÿ îïåðàòîð If…Then, êîòîðûé
îïðåäåëÿåò ìîìåíò ïðåêðàùåíèÿ ðåêóðñèè. Çäåñü ïðîâåðÿåòñÿ, ðàâíî ëè çíà-
÷åíèå ïåðåìåííîé pwr íóëþ.  ýòîì âûçîâå çíà÷åíèå pwr ðàâíî 3, ïîýòîìó âû-
ïîëíåíèå ôóíêöèè ïðîäîëæàåòñÿ â ñòðîêå 6.
 ñòðîêå 6 âûïîëíÿåòñÿ ïðèñâàèâàíèå ôóíêöèè; âûðàæåíèå, ïðèñâàèâàå-
ìîå ðåçóëüòàòó ôóíêöèè fPower, óêàçûâàåò íà òî, ÷òî ðåçóëüòàò ôóíêöèè ðà-
âåí çíà÷åíèþ num, óìíîæåííîìó íà ðåçóëüòàò ñëåäóþùåãî âûçîâà ôóíêöèè
fPower ñî âòîðûì àðãóìåíòîì, ðàâíûì pwr–1.
Åñëè ïîäñòàâèòü ëèòåðàëüíûå ïðîìåæóòî÷íûå çíà÷åíèÿ äëÿ ýòîãî ïðèìåðà
â äàííîå âûðàæåíèå, âûçîâ ôóíêöèè fPower â ñòðîêå 6 â ýòîì ìåñòå áóäåò ñëå-
äóþùèì:
FPower(2,2)
Ýòî — âòîðîé âûçîâ ôóíêöèè fPower; çíà÷åíèå àðãóìåíòà pwr òåïåðü ðàâ-
íî 2.  ñòðîêå 3 ïðîâåðÿåòñÿ, ðàâíî ëè íóëþ çíà÷åíèå àðãóìåíòà pwr; åñëè —
íåò, VBA ñíîâà âûïîëíÿåò ïðèñâàèâàíèå ôóíêöèè â ñòðîêå 6. Âûðàæåíèå
â ïðèñâàèâàíèè ôóíêöèè âûçûâàåò ôóíêöèþ fPower ñíîâà, ïåðåäàâàÿ pwr–1
â êà÷åñòâå âòîðîãî àðãóìåíòà.
224 Ãëàâà 5

Åñëè ìû îïÿòü ïîäñòàâèì ëèòåðàëüíûå ïðîìåæóòî÷íûå çíà÷åíèÿ äëÿ ýòîãî


ïðèìåðà â âûðàæåíèå â ñòðîêå 6, âûçîâîì ôóíêöèè fPower â ýòîì ìåñòå áóäåò:
FPower(2,1)
 ýòîì òðåòüåì âûçîâå ôóíêöèè fPower çíà÷åíèå pwr òåïåðü ðàâíî 1.
 ñòðîêå 3 ïðîâåðÿåòñÿ, íå ðàâíî ëè íóëþ çíà÷åíèå àðãóìåíòà pwr; åñëè —
íåò, òî ïðèñâàèâàíèå ôóíêöèè â ñòðîêå 6 âûïîëíÿåòñÿ òðåòèé ðàç, ïðèâîäÿ
â ðåçóëüòàòå ê ÷åòâåðòîìó âûçîâó fPower.
 ÷åòâåðòîì âûçîâå ôóíêöèè fPower çíà÷åíèå pwr ðàâíî 0; ðåçóëüòàòîì
ïðîâåðêè (â ñòðîêå 3) íà ðàâåíñòâî íóëþ çíà÷åíèÿ àðãóìåíòà pwr ÿâëÿåòñÿ
True, è VBA âûïîëíÿåò ñòðîêó 4, çàêàí÷èâàÿ ðåêóðñèþ. Ñòðîêà 4 — ýòî åùå
îäèí îïåðàòîð ïðèñâàèâàíèÿ ôóíêöèè, íà ýòîò ðàç ïðèñâàèâàþùèé ÷èñëî 1
êàê ðåçóëüòàò ôóíêöèè. (Ëþáîå ÷èñëî, âîçâåäåííîå â ñòåïåíü 0, ðàâíî 1).
 âûçîâàõ 1–3 ôóíêöèè fPower ôóíêöèÿ íå âîçâðàòèëà íèêàêîãî ðåçóëüòà-
òà; VBA íå ìîæåò ïîëíîñòüþ âû÷èñëèòü âûðàæåíèå â îïåðàòîðå ïðèñâàèâàíèÿ
ôóíêöèè (ñòðîêà 6) äî òåõ ïîð, ïîêà ñåðèÿ ðåêóðñèâíûõ âûçîâîâ íå ïðåêðàùà-
åòñÿ â ÷åòâåðòîì âûçîâå ôóíêöèè fPower. Òåïåðü, êîãäà ôóíêöèÿ fPower âîç-
âðàùàåò ðåçóëüòàò, ðåêóðñèâíûé ïðîöåññ ïðåêðàùàåòñÿ, è êàæäûé îòäåëüíûé
âûçîâ ôóíêöèè fPower âîçâðàùàåò åå ðåçóëüòàò.
×åòâåðòûé âûçîâ fPower âîçâðàùàåò ÷èñëî 1 â âûðàæåíèå â ñòðîêå 6 òðåòüå-
ãî âûçîâà ôóíêöèè fPower. Ïîäñòàâèì ëèòåðàëüíûå ïðîìåæóòî÷íûå çíà÷åíèÿ
èç ïðèìåðà, è ýòî âûðàæåíèå áóäåò ðàâíî 2 · 1. Ðåçóëüòàò, âîçâðàùàåìûé
òðåòüèì âûçîâîì ôóíêöèè fPower, ðàâåí 2.
VBA âîçâðàùàåò ýòî çíà÷åíèå 2 âûðàæåíèþ ïðèñâàèâàíèÿ ôóíêöèè âî âòî-
ðîì âûçîâå ôóíêöèè òàê, ÷òî (ïîäñòàâëÿåì ëèòåðàëüíûå ïðîìåæóòî÷íûå çíà-
÷åíèÿ) ýòî âûðàæåíèå ðàâíî òåïåðü 2×2. Âòîðîé âûçîâ ôóíêöèè fPower âîçâðà-
ùàåò 4 âûðàæåíèþ ïðèñâàèâàíèÿ ôóíêöèè ïåðâîãî âûçîâà ôóíêöèè fPower.
Ñíîâà ïîäñòàâëÿþòñÿ ëèòåðàëüíûå çíà÷åíèÿ, è âûðàæåíèå èç ïåðâîãî âûçî-
âà ôóíêöèè Power ðàâíî òåïåðü 2 · 4. Íàêîíåö, èñõîäíûé ïåðâûé âûçîâ ôóíê-
öèè fPower âîçâðàùàåò çíà÷åíèå 8 — ïðàâèëüíûé ðåçóëüòàò âîçâåäåíèÿ 2
â òðåòüþ ñòåïåíü.
Åñëè âû õîòèòå ïðîñëåäèòü ïîñëåäîâàòåëüíîñòü ïåðåäà÷è àðãóìåíòîâ ôóíê-
öèè fPower, âñòàâüòå ïåðåä ñòðîêîé 3 ñëåäóþùèé îïåðàòîð:
MsgBox num & " è " & pwr
Ïðè ýòîì â ïðîöåññå òåñòèðîâàíèÿ ïðåäûäóùåãî ïðèìåðà âû óâèäèòå ïîñëå-
äîâàòåëüíîñòü îêîí, îòîáðàæåííóþ íà ðèñ. 5.8.

Ðèñ. 5.8.
Îêíà ñ
ïðîìåæóòî÷íûìè
ðåçóëüòàòàìè ðàáîòû
ôóíêöèè fPower

Íà ñàìîì äåëå, íåò íåîáõîäèìîñòè ïèñàòü ôóíêöèþ fPower: VBA îïåðàòîð


âîçâåäåíèÿ â ñòåïåíü (^) èìååò òàêîé æå ðåçóëüòàò. Ôóíêöèÿ fPower áûëà âû-
áðàíà äëÿ èëëþñòðàöèè ðåêóðñèè, ïîòîìó ÷òî îíà ïðåäîñòàâëÿåò ñàìûé ïðî-
ñòîé ïðèìåð ðàáîòû ðåêóðñèè.
Ðàññìîòðèì ïðèìåð ôóíêöèè íàõîæäåíèÿ íàèáîëüøåãî îáùåãî äåëèòåëÿ
äâóõ öåëûõ ÷èñåë ñ ïîìîùüþ êëàññè÷åñêîãî àëãîðèòìà Åâêëèäà, êîòîðûé çà-
êëþ÷àåòñÿ â ñëåäóþùåì:
Èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ îïåðàòîðîâ â VBA 225

1) èìåþòñÿ äâà öåëûõ ÷èñëà a è b; 2) åñëè îñòàòîê îò äåëåíèÿ a íà b ðàâåí


íóëþ, òî b — óæå íàèáîëüøèé îáùèé äåëèòåëü, èíà÷å âûïîëíèòü: (a0 = b),
(a1= a Mod b), a = a0, b = a1 è âåðíóòüñÿ ê íà÷àëó ïóíêòà 2.

Ëèñòèíã 5.17. Ôóíêöèÿ GCD: ïðèìåð ðåêóðñèè

1: Function GCD(a As Integer, b As Integer) As Integer


2: If (a Mod b) = 0 Then
3: GCD = b
4: Else
5: GCD = GCD(b, (a Mod b))
6: End If
7: End Function
8:
9: Sub Test_GCD()
10: Dim d As Integer
11: MsgBox GCD(a:=342, b:=612)
12: End Sub

Ñòðóêòóðà êîäà ýòîé ðåêóðñèâíîé ôóíêöèè î÷åíü ïîõîæà íà ñòðóêòóðó ïðå-


äûäóùåãî ïðèìåðà, ïîýòîìó, âèäèìî, íåò íàäîáíîñòè àíàëèçèðîâàòü åå òàê æå
ïîäðîáíî. Â ðåçóëüòàòå òåñòèðîâàíèÿ ôóíêöèè GCD ïðè ïîìîùè ïðîöåäóðû
Test_GCD áóäåò ïîëó÷åí ðåçóëüòàò 18, êîòîðûé è ÿâëÿåòñÿ íàèáîëüøèì îá-
ùèì äåëèòåëåì èñõîäíûõ ÷èñåë.

Êàê èçáåæàòü ñëó÷àéíîé ðåêóðñèè è äðóãèõ ïðîáëåì


Òåïåðü, êîãäà âû çíàåòå î òîì, êàê ðàáîòàåò ðåêóðñèâíàÿ ôóíêöèÿ-ïðîöåäó-
ðà, âû ãîòîâû ê ðàññìîòðåíèþ íåäîñòàòêîâ ðåêóðñèâíûõ ïðîãðàìì.
Îäíèì èç íàèáîëåå î÷åâèäíûõ íåäîñòàòêîâ ðåêóðñèâíûõ ôóíêöèé è ïðîöå-
äóð ÿâëÿåòñÿ òî, ÷òî èõ ÷àñòî òðóäíî ïîíèìàòü. Äðóãîé íåäîñòàòîê çàêëþ÷àåò-
ñÿ â òîì, ÷òî îíè èñïîëüçóþò áîëüøîé îáúåì ïàìÿòè; êàæäûé ðàç, êîãäà ðå-
êóðñèâíàÿ ôóíêöèÿ âûçûâàåò ñàìà ñåáÿ, VBA ïåðåäàåò âñå åå àðãóìåíòû ñíîâà
è äëÿ ðåçóëüòàòà ôóíêöèè ðåçåðâèðóåòñÿ îáëàñòü ïàìÿòè. Îáúåì ïàìÿòè, èñ-
ïîëüçóåìûé ñåðèåé âûçîâîâ ðåêóðñèâíîé ôóíêöèè, ìîæåò áûòü çíà÷èòåëüíûì
â çàâèñèìîñòè îò ðàçìåðà àðãóìåíòîâ (â áàéòàõ) è ðàçìåðà âîçâðàùàåìîãî
ôóíêöèåé çíà÷åíèÿ (â áàéòàõ).
Ïî÷òè âñÿêóþ çàäà÷ó, êîòîðóþ ìîæíî âûïîëíèòü ñ ïîìîùüþ ðåêóðñèâíîé
ôóíêöèè, ìîæíî òàêæå âûïîëíèòü ñ ïîìîùüþ ñòðóêòóðû öèêëà áåç äîïîëíè-
òåëüíûõ ïîòåðü ïàìÿòè; ñòðóêòóðó öèêëà ÷àñòî ëåã÷å ïîíÿòü, ÷åì ôóíêöèþ,
âûïîëíÿþùóþ ðàáîòó ïîñðåäñòâîì ðåêóðñèè. (Ñòðóêòóðû öèêëà îïèñûâàþòñÿ
â ãëàâå 7.)
Íå÷àÿííàÿ ðåêóðñèÿ — ýòî äîâîëüíî ðàñïðîñòðàíåííàÿ îøèáêà ïðîãðàììè-
ðîâàíèÿ, îñîáåííî äëÿ íà÷èíàþùèõ ïðîãðàììèñòîâ. Êîãäà âû íà÷èíàåòå ðàç-
ðàáàòûâàòü ñâîè ôóíêöèè, ëåãêî îøèáèòüñÿ ïðè íàïèñàíèè îïåðàòîðà ïðè-
ñâàèâàíèÿ ôóíêöèè è íå÷àÿííî ñîçäàòü îïåðàòîð, êîòîðûé âûçûâàåò ôóíêöèþ
ðåêóðñèâíî, âìåñòî ïðèñâàèâàíèÿ ðåçóëüòàòà ôóíêöèè. Ïîñêîëüêó âû óêàçû-
âàåòå VBA, êàêîå çíà÷åíèå äîëæíî áûòü âîçâðàùåíî êàê ðåçóëüòàò ôóíêöèè ñ
ïîìîùüþ ïðèñâàèâàíèÿ ôóíêöèè, ëåãêî òàêæå çàáûòü, ÷òî èìÿ ôóíêöèè íå
ÿâëÿåòñÿ ïåðåìåííîé, è ïîïûòàòüñÿ ðàáîòàòü ñ èìåíåì ôóíêöèè êàê ñ èìåíåì
ïåðåìåííîé; òàêèå ïîïûòêè îáû÷íî ïðèâîäÿò ê ñëó÷àéíûì ðåêóðñèâíûì âû-
çîâàì.
226 Ãëàâà 5

Åñëè âû ñëó÷àéíî ñîçäàëè ðåêóðñèâíóþ ôóíêöèþ-ïðîöåäóðó, ìàëîâåðîÿò-


íî, ÷òî ðåêóðñèÿ êîãäà-ëèáî çàêîí÷èòñÿ. Ðåêóðñèâíûå ôóíêöèè äîëæíû ðàç-
ðàáàòûâàòüñÿ î÷åíü òùàòåëüíî, ÷òîáû îáÿçàòåëüíî áûëî êàêîå-ëèáî óñëîâèå,
ïðåêðàùàþùåå ðåêóðñèâíûå âûçîâû. Åñëè ôóíêöèÿ íå òåñòèðóåò êàêîå-ëèáî
óñëîâèå, ÷òîáû ÿâíî çàâåðøàòü ðåêóðñèþ (êàê äåëàåò ôóíêöèÿ fPower), âûçî-
âû ðåêóðñèâíîé ôóíêöèè ïðîäîëæàþòñÿ äî òåõ ïîð, ïîêà ó VBA íå çàêàí÷èâà-
åòñÿ ïàìÿòü (ñ âîçíèêíîâåíèåì îøèáêè âðåìåíè èñïîëíåíèÿ).
Îáû÷íî ïðè âûïîëíåíèè ôóíêöèè, êîòîðàÿ ñîäåðæèò íå÷àÿííûé ðåêóðñèâ-
íûé âûçîâ, êîìïüþòåð êàê áû ïðåðûâàåò ðàáîòó íà íåñêîëüêî ñåêóíä ïåðåä
òåì, êàê VBA îòîáðàæàåò îøèáêó âðåìåíè èñïîëíåíèÿ èç-çà íåõâàòêè ïàìÿòè.
Ââåäåíèå â îáúåêòû
6
è êîëëåêöèè
Ýòà ãëàâà ïîñâÿùåíà îäíîé èç ñàìûõ èíòåðåñíûõ òåì â ïðîãðàììèðîâàíèè.
Ìàòåðèàë, ïðåäñòàâëåííûé çäåñü, ìîæåò âîñïðèíèìàòüñÿ ïî-ðàçíîìó â çàâèñè-
ìîñòè îò óðîâíÿ ïîäãîòîâëåííîñòè ÷èòàòåëÿ. Îáùåïðèçíàííûì ñ÷èòàåòñÿ ìíå-
íèå î òîì, ÷òî îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå ëåã÷å âîñïðèíè-
ìàåòñÿ òåìè, êòî íå ñëèøêîì ìíîãî âðåìåíè çàíèìàëñÿ òðàäèöèîííûì (ìî-
äóëüíûì) ïðîãðàììèðîâàíèåì. Ïîñêîëüêó ýòà êíèãà â îñíîâíîì
ïðåäíàçíà÷åíà äëÿ òåõ, êòî âîîáùå íèêîãäà íå ïðîãðàììèðîâàë (äëÿ ýòîãî òàê
ïîäðîáíî è ðàçáèðàþòñÿ ìíîãî÷èñëåííûå ïðèìåðû), òî èìååòñÿ íàäåæäà, ÷òî
è ýòîò ìàòåðèàë áóäåò ïîíÿòåí è çàèíòåðåñóåò ÷èòàòåëÿ. Ïî êðàéíåé ìåðå,
èìåííî ïîñëå ïðî÷òåíèÿ ýòîé ãëàâû ìîæíî íà÷èíàòü «ïî-íàñòîÿùåìó» ïðî-
ãðàììèðîâàòü â VBA, ïîñêîëüêó ýòà ñèñòåìà ÿâëÿåòñÿ îáúåêòíî-îðèåíòèðîâàí-
íîé.
VBA ÿâëÿåòñÿ èäåàëüíûì èíñòðóìåíòîì äëÿ èçó÷åíèÿ îñíîâ îáúåêòíî-îðè-
åíòèðîâàííîãî ïðîãðàììèðîâàíèÿ, òàê êàê èìååò âñòðîåííûå îáúåêòû (ðàáî-
÷èå êíèãè è ëèñòû, ÿ÷åéêè, äîêóìåíòû è âûäåëåííûå ôðàãìåíòû òåêñòà), èõ
ñâîéñòâà è ìåòîäû. Ýòè îáúåêòû — íå âûäóìêà, îíè ðåàëüíû, èõ íåîáõîäè-
ìîñòü îùóòèìà. Ïîýòîìó äëÿ èëëþñòðàöèè îáúåêòîâ, ñâîéñòâ è ìåòîäîâ íå
íóæíî îáðàùàòüñÿ ê îáúåêòàì, íå èìåþùèì íèêàêîãî îòíîøåíèÿ ê ïðîãðàì-
ìèðîâàíèþ, íàïðèìåð, àâòîìîáèëÿì ñ èõ ñâîéñòâàìè (öâåò, ðàçìåð, ñêîðîñòü)
è ìåòîäàìè (èçìåíåíèå ñêîðîñòè, ïîäà÷à ñèãíàëà è ò.ä.). Íà ïðèìåðå îáúåêòîâ,
ñâîéñòâ è ìåòîäîâ, ñ êîòîðûìè ðàáîòàåò VBA, ìîæíî ñîçäàâàòü ñâîè ñîáñòâåí-
íûå, ïîëåçíûå âàì îáúåêòû. Ìîæíî ê ñâîéñòâàì è ìåòîäàì âñòðîåííûõ îáúåê-
òîâ VBA äîáàâëÿòü íîâûå, ñâÿçàííûå ñ âàøèìè çàäà÷àìè.

Îáúåêòû
 ñåðåäèíå 80-õ ãîäîâ áûëà ðàçðàáîòàíà íîâàÿ êîíöåïöèÿ â êîìïüþòåðíîì
ïðîãðàììèðîâàíèè, èçâåñòíàÿ êàê îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðî-
âàíèå (object-oriented programming, OOP). Ïîïóëÿðíîñòü îáúåêòíî-îðèåíòèðî-
âàííîãî ïðîãðàììèðîâàíèÿ ñ ãîäàìè âîçðàñòàåò; íîâûé Ðàáî÷èé ñòîë (desktop)
â Windows 95, Windows NT 4.0 è Active Desktop â Windows 98/2000/XP, ôàê-
òè÷åñêè âîïëîùàþò ìíîãèå îáúåêòíî-îðèåíòèðîâàííûå ïðèíöèïû. Öåíòðàëü-
íàÿ èäåÿ îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ çàêëþ÷àåòñÿ â òîì,
÷òî ïðîãðàììíîå ïðèëîæåíèå (êàê è ðåàëüíûé ìèð âîêðóã íàñ) äîëæíî ñîñòî-
228 Ãëàâà 6

ÿòü èç îñîáûõ îáúåêòîâ, êàæäûé èç êîòîðûõ èìååò ñîáñòâåííûå ñïåöèôè÷å-


ñêèå êà÷åñòâà è ïîâåäåíèå.
Îáúåêòíî-îðèåíòèðîâàííîå ïðèëîæåíèå îðãàíèçóåò äàííûå è âûïîëíÿåìûå
îïåðàòîðû ïðîãðàììíîãî êîäà â ñâÿçàííûå îáúåêòû, ÷òî îáëåã÷àåò ðàçðàáîòêó,
îðãàíèçàöèþ è ðàáîòó ñî ñëîæíûìè ñòðóêòóðàìè äàííûõ è äåéñòâèÿìè, âû-
ïîëíÿåìûìè íàä ýòèìè äàííûìè (èëè ñ íèìè). Êàæäûé îáúåêò â ïðîãðàììíîì
ïðèëîæåíèè ñîäåðæèò äàííûå è îïåðàòîðû (ìåòîäû), ñâÿçàííûå âìåñòå è îáðà-
çóþùèå åäèíûé ýëåìåíò. Áîëüøèíñòâî ïðèëîæåíèé ñîäåðæàò ìíîãî ðàçëè÷-
íûõ òèïîâ îáúåêòîâ. Îäíè îáúåêòû ìîãóò ñîñòîÿòü èç äðóãèõ îáúåêòîâ,
íàïðèìåð, îáúåêò ïðèëîæåíèÿ Excel ðàáî÷àÿ êíèãà, ñîñòîèò èç îáúåêòîâ
ëèñòîâ, êîòîðûå, â ñâîþ î÷åðåäü, ñîñòîÿò èç ÿ÷ååê èëè ãðàôè÷åñêèõ îáúåêòîâ.
 Word îáúåêòàìè ÿâëÿþòñÿ äîêóìåíòû, äèàïàçîíû òåêñòà, òàáëèöû, ãðà-
ôè÷åñêèå îáúåêòû, äèàëîãîâûå îêíà è ñàìî ïðèëîæåíèå Word.
Òî, ÷òî âû óçíàåòå èç ýòîé ãëàâû, ïîìîæåò âàøåé ðàáîòå ñ VBA íå òîëüêî
â Word è Excel. Âñå host-ïðèëîæåíèÿ VBA, òàêèå êàê Access è Microsoft
Project, èìåþò îáúåêòû, äîñòóïíûå äëÿ VBA òàêèì æå îáðàçîì, êàê îáúåêòû
Word è Excel. Îáúåêòû â äðóãèõ host-ïðèëîæåíèÿõ VBA ñóùåñòâóþò ïî òåì
æå ïðè÷èíàì, ÷òî è îáúåêòû â Word è Excel. Êîíêðåòíûå îáúåêòû â host-ïðè-
ëîæåíèè VBA âàðüèðóþò â çàâèñèìîñòè îò ïðèëîæåíèÿ. Îáúåêòû â Access, íà-
ïðèìåð, — âñå èìåþò îòíîøåíèå ê áàçàì äàííûõ è ìàíèïóëèðîâàíèþ áàçàìè
äàííûõ, òîãäà êàê îáúåêòû â Excel ñâÿçàíû ñ ïîíÿòèÿìè ðàáî÷èõ ëèñòîâ, êíèã
è òàê äàëåå.

Ñâîéñòâà îáúåêòà
Êàê è îáúåêòû ðåàëüíîãî ìèðà, îáúåêòû VBA èìåþò ðàçëè÷íûå ïðèñóùèå
èì êà÷åñòâà èëè ñâîéñòâà (properties). Îáúåêòû â Word è Excel èìåþò
ñâîéñòâà, îïðåäåëÿþùèå èõ âèä è ïîâåäåíèå: òåêñò â äîêóìåíòå Word ìîæåò
îòîáðàæàòüñÿ èëè íå îòîáðàæàòüñÿ ïîëóæèðíûì øðèôòîì èëè êóðñèâîì,
ðàáî÷èé ëèñò Excel ìîæåò áûòü âèäèìûì èëè íåò, ñòðîêè â ðàáî÷åì ëèñòå èëè
òàáëèöå èìåþò ñâîéñòâî âûñîòû, ñòîëáöû èìåþò ñâîéñòâî øèðèíû è òàê
äàëåå.
Ñâîéñòâà ðåãóëèðóþò âèä è ïîâåäåíèå îáúåêòà. ×òîáû èçìåíèòü âèä è ïîâå-
äåíèå îáúåêòà, íåîáõîäèìî èçìåíèòü åãî ñâîéñòâà. Â Excel ìîæíî èçìåíèòü ïî-
âåäåíèå ðàáî÷åãî ëèñòà, èçìåíÿÿ ñâîéñòâî âû÷èñëåíèÿ ñ àâòîìàòè÷åñêîãî íà
ðó÷íîå, èëè ìîæíî èçìåíèòü âèä ðàáî÷åãî ëèñòà, çàäàâ íîâûé öâåò äëÿ òåêñòà
èëè ãðàôèêè â ëèñòå. Â Word ìîæíî èçìåíèòü ïîâåäåíèå äîêóìåíòà, èçìåíÿÿ
ñâîéñòâî, êîòîðîå ðåãóëèðóåò ïîêàç îðôîãðàôè÷åñêèõ îøèáîê âî âðåìÿ íàáîðà
òåêñòà; ìîæíî èçìåíèòü âèä äîêóìåíòà, çàäàâ íîâûå çíà÷åíèÿ äëÿ ñâîéñòâ ðàç-
ìåòêè ñòðàíèöû.
×òîáû óçíàòü î òåêóùåì âèäå è ïîâåäåíèè îáúåêòà, íåîáõîäèìî óçíàòü
î åãî ñâîéñòâàõ. Âû ìîæåòå îïðåäåëèòü äèñê, ïàïêó è èìÿ ðàáî÷åé êíèãè
Excel èëè äîêóìåíòà Word, ðàññìîòðåâ ñâîéñòâî FullName ýòîé ðàáî÷åé êíè-
ãè èëè äîêóìåíòà.
Íåêîòîðûå ñâîéñòâà îáúåêòà ìîæíî èçìåíÿòü, íåêîòîðûå — íåò. Íàïðèìåð,
â ðàáî÷åé êíèãå Excel ìîæíî èçìåíèòü èìÿ àâòîðà êíèãè, èçìåíÿÿ ñâîéñòâî
Author, íî íåëüçÿ èçìåíèòü ñâîéñòâî Name ðàáî÷åé êíèãè. (Ñâîéñòâî Name
ðàáî÷åé êíèãè ñîäåðæèò èìÿ ôàéëà íà äèñêå è íå ìîæåò áûòü èçìåíåíî áåç
Ââåäåíèå â îáúåêòû è êîëëåêöèè 229

ñîçäàíèÿ íîâîãî äèñêîâîãî ôàéëà èëè ïåðåèìåíîâàíèÿ ôàéëà ðàáî÷åé êíèãè


âíå Excel).
Íåêîòîðûå îáúåêòû èìåþò ñâîéñòâà ñ îäíèìè è òåìè æå èëè ïîäîáíûìè
èìåíàìè: îáúåêòû Application, Workbook è Worksheet â Excel — âñå èìåþò
ñâîéñòâî Name. Êàæäûé îáúåêò ðàáî÷åãî ëèñòà ñîõðàíÿåò äàííûå äëÿ ñâîèõ
ñâîéñòâ âíóòðè ñàìîãî ðàáî÷åãî ëèñòà âìåñòå ñ ïîëüçîâàòåëüñêèìè äàííûìè.
[Ïîëüçîâàòåëüñêèå äàííûå (user data) — ýòî ëþáûå äàííûå, ñîõðàíÿåìûå îáú-
åêòîì, êîòîðûå ïîñòóïàþò íåïîñðåäñòâåííî îò ïîëüçîâàòåëÿ ïîäîáíî äàííûì,
ñîäåðæàùèìñÿ â ÿ÷åéêàõ ðàáî÷åãî ëèñòà.]

Ìåòîäû îáúåêòà
Îáúåêòû ðåàëüíîãî ìèðà ïî÷òè âñåãäà èìåþò òîò òèï ïðèñóùåãî èì ïîâåäå-
íèÿ èëè äåéñòâèÿ, êîòîðûé îíè ìîãóò âûïîëíèòü. Îáúåêòû 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

Åñëè âû çàïóñòèòå â ñðåäå VBA Word ïðîöåäóðó ëèñòèíãà 6.1, òî ïîëó÷èòå


íå÷òî ïîäîáíîå òîìó, ÷òî âû âèäèòå íà ðèñ. 6.1, ò.å. â äèàëîãîâîì îêíå ôóíêöèè
MsgBox áóäåò îòîáðàæåíî íàèìåíîâàíèå àêòèâíîãî äîêóìåíòà, õîòÿ ñàìà ïðîöå-
äóðà ìîæåò ïðèíàäëåæàòü äðóãîìó äîêóìåíòó (îòêðûòîìó, íî íå àêòèâíîìó).

Ëèñòèíã 6.1. Àêòèâíûé äîêóìåíò

1: Sub ActDocum()
2: MsgBox "Àêòèâíûé äîêóìåíò: " & ActiveDocument.Name
3: End Sub

Îáðàòèòå âíèìàíèå íà òî, ÷òî òî÷êà (.) îòäåëÿåò îáúåêòíóþ ññûëêó îò èìåíè
ñâîéñòâà èëè ìåòîäà.  íåêîòîðîì ñìûñëå ýòà òî÷êà-ðàçäåëèòåëü òàêæå
ñîåäèíÿåò îáúåêòíóþ ññûëêó ñ èäåíòèôèêàòîðîì ñâîéñòâà èëè ìåòîäà.
Ïîñêîëüêó âû îáðàùàåòåñü ê ñâîéñòâó èëè ìåòîäó ïîñðåäñòâîì îáúåêòà,
íåîáõîäèìî îïðåäåëÿòü îáúåêòíóþ ññûëêó è èäåíòèôèêàòîð ñâîéñòâà èëè
ìåòîäà âìåñòå. Òî÷êà-ðàçäåëèòåëü óêàçûâàåò VBA, ãäå çàêàí÷èâàåòñÿ
îáúåêòíàÿ ññûëêà è ãäå íà÷èíàåòñÿ èäåíòèôèêàòîð ñâîéñòâà èëè ìåòîäà.  òî
æå ñàìîå âðåìÿ òî÷êà-ðàçäåëèòåëü ñîåäèíÿåò îáúåêòíóþ ññûëêó è èìÿ
ñâîéñòâà èëè ìåòîäà äëÿ îáðàçîâàíèÿ åäèíîãî èäåíòèôèêàòîðà â îïåðàòîðå
VBA.
Ðèñ. 6.1
Ðåçóëüòàò âûïîëíåíèÿ êîäà ëèñòèíãà 6.1

 òàáë. 6.1 ïðèâåäåíû íåñêîëüêî èç íàèáîëåå âàæíûõ îáúåêòîâ (ñ òî÷êè


çðåíèÿ ïðîãðàììèñòà VBA) â Excel. Â òàáëèöå ïîêàçàíî èìÿ îáúåêòà è êðàòêîå
îïèñàíèå ýòîãî îáúåêòà. (Èìåéòå â âèäó, ÷òî Excel ñîäåðæèò íàìíîãî áîëüøå
îáúåêòîâ, ÷åì ïåðå÷èñëåíî â òàáë. 6.1.)
Òàáëèöà 6.1. Îáùèå îáúåêòû Excel

Îáúåêò Îïèñàíèå
Application Ñàìî ïðèëîæåíèå Excel (host-ïðèëîæåíèå)
Chart Äèàãðàììà â ðàáî÷åé êíèãå
Ýòîò îáúåêò ñîäåðæèò àòðèáóòû øðèôòà è ñòèëÿ äëÿ òåêñòà,
Font
îòîáðàæàåìîãî â ðàáî÷åì ëèñòå
Name Çàäàííîå èìÿ äëÿ äèàïàçîíà ÿ÷ååê ðàáî÷åãî ëèñòà
Äèàïàçîí ÿ÷ååê (îäíà èëè áîëåå) èëè èìåíîâàííûé äèàïàçîí
Range
â ðàáî÷åì ëèñòå
Ëþáîå îêíî â Excel; îêíà èñïîëüçóþòñÿ äëÿ îòîáðàæåíèÿ
Window
ðàáî÷èõ ëèñòîâ, äèàãðàìì è ò.ä.
Workbook Îòêðûòàÿ ðàáî÷àÿ êíèãà
Worksheet Ðàáî÷àÿ òàáëèöà â êíèãå
232 Ãëàâà 6

 òàáë. 6.2 ïåðå÷èñëåíû íàèáîëåå âàæíûå îáúåêòû â Word.  òàáëèöå ïðè-


âîäèòñÿ èìÿ îáúåêòà è êðàòêîå îïèñàíèå ýòîãî îáúåêòà. (Èìåéòå â âèäó, ÷òî
Word ñîäåðæèò íàìíîãî áîëüøå îáúåêòîâ, ÷åì ïåðå÷èñëåíî â òàáë. 6.2.)
Òàáëèöà 6.2. Îáùèå îáúåêòû Word

Îáúåêò Îïèñàíèå
Application Ñàìî ïðèëîæåíèå Word (host-ïðèëîæåíèå)
Bookmark Îòäåëüíàÿ çàêëàäêà â äîêóìåíòå
Document Îòêðûòûé äîêóìåíò
Ñîäåðæèò àòðèáóòû øðèôòà è ñòèëÿ äëÿ òåêñòà, îòîáðàæàåìîãî
Font
â îáúåêòå
Paragraph Îòäåëüíûé ïàðàãðàô â äîêóìåíòå
Range Íåïðåðûâíàÿ îáëàñòü â äîêóìåíòå
Âñòðîåííûé èëè îïðåäåëåííûé ïîëüçîâàòåëåì ôîðìàòèðóþùèé
Style
ñòèëü â äîêóìåíòå
Table Îòäåëüíàÿ òàáëèöà â äîêóìåíòå
TableOfContent
Îòäåëüíàÿ òàáëèöà ñîäåðæàíèÿ äîêóìåíòà
s
Template Øàáëîí äîêóìåíòà
Window Ëþáîå îêíî â Windows

Èç òàáëèö 6.1 è 6.2 âèäíî, ÷òî Excel è Windows èìåþò ïîõîæèå îáúåêòû.

Èñïîëüçîâàíèå ñâîéñòâ îáúåêòîâ


Ñâîéñòâà îáúåêòîâ ìîæíî èñïîëüçîâàòü òîëüêî äâóìÿ ñïîñîáàìè: ïîëó÷àòü
çíà÷åíèå ñâîéñòâà èëè óñòàíàâëèâàòü åãî. Êàê óæå áûëî óïîìÿíóòî â íà÷àëå
ýòîé ãëàâû, íå âñå ñâîéñòâà îáúåêòà èçìåíÿåìû. Ñâîéñòâà îáúåêòîâ, êîòîðûå
íåëüçÿ èçìåíÿòü, íàçûâàþò ñâîéñòâàìè, äîñòóïíûìè òîëüêî íà ÷òåíèå
(read-only); ñâîéñòâà, êîòîðûå ìîæíî óñòàíàâëèâàòü, íàçûâàþò ñâîéñòâàìè,
äîñòóïíûìè íà ÷òåíèå/çàïèñü (read-write).
Ñâîéñòâà îáû÷íî ñîäåðæàò ÷èñëåííûå, ñòðîêîâûå, çíà÷åíèÿ òèïà Boolean,
õîòÿ íåêîòîðûå ñâîéñòâà ìîãóò âîçâðàùàòü çíà÷åíèÿ òèïà Object èëè äðóãèå
òèïû äàííûõ.
Îáðàùåíèå ê ñâîéñòâó îáúåêòà èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Object.Property
Object — äîïóñòèìàÿ îáúåêòíàÿ ññûëêà VBA, òîãäà êàê Property ïðåäñòàâëÿåò ëþ-
áîå äîïóñòèìîå èìÿ ñâîéñòâà äëÿ îáúåêòà, íà êîòîðûé âûïîëíÿåòñÿ ññûëêà.

Ñâîéñòâà èñïîëüçóþòñÿ â âûðàæåíèÿõ òàê æå, êàê ëþáîå äðóãîå çíà÷åíèå


ïåðåìåííîé èëè êîíñòàíòû. Ìîæíî ïðèñâàèâàòü çíà÷åíèå ñâîéñòâà ïåðåìåí-
íîé, èñïîëüçîâàòü ñâîéñòâà îáúåêòîâ â âûðàæåíèÿõ êàê àðãóìåíòû ê ôóíêöè-
ÿì è ïðîöåäóðàì èëè êàê àðãóìåíòû äëÿ ìåòîäîâ êàêîãî-ëèáî îáúåêòà.
Ââåäåíèå â îáúåêòû è êîëëåêöèè 233

×òîáû ïðèñâîèòü íåêîòîðîé ïåðåìåííîé çíà÷åíèå ñâîéñòâà îáúåêòà, èñ-


ïîëüçóéòå ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Variable = Object.Property
Variable — ëþáàÿ äîïóñòèìàÿ ïåðåìåííàÿ, èìåþùàÿ ñîâìåñòèìûé ñî ñâîéñòâîì
îáúåêòà òèï; Object — ëþáàÿ äîïóñòèìàÿ ññûëêà íà îáúåêò, à Property — ëþáîå äî-
ïóñòèìîå èìÿ ñâîéñòâà äëÿ îáúåêòà, íà êîòîðûé âûïîëíÿåòñÿ ññûëêà.

 ñëåäóþùåì ïðèìåðå ñòðîêà, ñîõðàíÿåìàÿ â ñâîéñòâå Name ðàáî÷åãî ëèñòà


Excel, íà êîòîðóþ ññûëàåòñÿ îáúåêòíàÿ ïåðåìåííàÿ aSheet, ïðèñâàèâàåòñÿ ïå-
ðåìåííîé AnyStr:
AnyStr = aSheet.Name
Ìîæíî òàêæå èñïîëüçîâàòü ñâîéñòâî îáúåêòà íåïîñðåäñòâåííî â êàêîì-ëèáî
âûðàæåíèè èëè â êà÷åñòâå àðãóìåíòà ôóíêöèè èëè ïðîöåäóðû. Ñëåäóþùèå
ñòðîêè ïðåäñòàâëÿþò îáîñíîâàííîå èñïîëüçîâàíèå ñâîéñòâà îáúåêòà (â êàæäîé
ñòðîêå InstSheet ÿâëÿåòñÿ îáúåêòíîé ïåðåìåííîé, çàäàííîé äëÿ ññûëêè íà ðà-
áî÷èé ëèñò Excel):
MsgBox InstSheet.Name
AnyStr = "Ýòà ÿ÷åéêà èìååò èìÿ: " & InstSheet.Name
MsgBox LCase(InstSheet.Name)
Ïî÷òè êàæäûé îáúåêò â VBA èìååò ñâîéñòâî, êîòîðîå ñîäåðæèò åãî èìÿ.
Ñëåäóþùèé îïåðàòîð èñïîëüçóåò MsgBox äëÿ îòîáðàæåíèÿ ñâîéñòâà FullName
â îáúåêòå ðàáî÷åé êíèãè Excel; ñâîéñòâî FullName ñîäåðæèò èìÿ äèñêà, ïóòü
ê ïàïêå è èìÿ ôàéëà ðàáî÷åé êíèãè:
MsgBox InstBook.FullName
 ïðèâåäåííîì âûøå ïðèìåðå InstBook — ýòî ïåðåìåííàÿ, çàäàííàÿ äëÿ
ññûëêè íà îáúåêò îòêðûòîé ðàáî÷åé êíèãè. Åñëè InstBook ññûëàåòñÿ íà ðàáî-
÷óþ êíèãó ñ èìåíåì Sales.xls â ïàïêå My Documents, òî îêíî ñîîáùåíèÿ, âû-
çûâàåìîå ïðèâåäåííûì âûøå îïåðàòîðîì, îòîáðàæàåò ñòðîêó "C:\My Docu-
ments\SALES.XLS".
×òîáû çàäàòü ñâîéñòâî îáúåêòà, ïðîñòî ïðèñâîéòå ñâîéñòâó íîâîå çíà÷åíèå,
èñïîëüçóÿ ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Object.Property = Expression
Object — ëþáàÿ äîïóñòèìàÿ îáúåêòíàÿ ññûëêà, Property — ëþáîå ñâîéñòâî îáúåêòà,
íà êîòîðûé âûïîëíÿåòñÿ ññûëêà, à Expression — ëþáîå âûðàæåíèå VBA, êîòîðîå
âû÷èñëÿåòñÿ äî òèïà, ñîâìåñòèìîãî ñî ñâîéñòâîì.

Ñëåäóþùàÿ ñòðîêà, íàïðèìåð, èçìåíÿåò èìÿ ðàáî÷åãî ëèñòà, íà êîòîðûé


ññûëàåòñÿ îáúåêòíàÿ ïåðåìåííàÿ InstSheet, ïðèñâàèâàÿ çíà÷åíèå ñâîéñòâó
Name ëèñòà:
InstSheet.Name = "Òðåòèé êâàðòàë"
Ñëåäóþùèé ïðèìåð èçìåíÿåò òåêñò, îòîáðàæàåìûé â ñòðîêå ñîñòîÿíèÿ
â íèæíåì ëåâîì óãëó îêíà ïðèëîæåíèÿ, ïðèñâàèâàÿ ñòðîêó ñâîéñòâó
StatusBar îáúåêòà Application (îáúåêò Application — ýòî host-ïðèëîæå-
íèå VBA, â äàííîì ñëó÷àå — Excel):
234 Ãëàâà 6

Application.StatusBar = "Ãåíåðèðîâàòü îò÷åò çà òðåòèé êâàðòàë"


Èñïîëüçóéòå ñâîéñòâî Application.StatusBar â ñâîèõ ïðîöåäóðàõ äëÿ
îòîáðàæåíèÿ ñîîáùåíèé î äåéñòâèÿõ, êîòîðûå âûïîëíÿåò ïðîöåäóðà, îñîáåííî
åñëè íåêîòîðûå èç ýòèõ äåéñòâèé çàíèìàþò ìíîãî âðåìåíè (íàïðèìåð, ñîðòè-
ðîâêà äëèííîãî ñïèñêà). Äîáàâëÿÿ ñîîáùåíèå â ñòðîêó ñîñòîÿíèÿ, âû äàåòå
çíàòü ïîëüçîâàòåëþ, ÷òî ïðîöåäóðà âñå åùå ðàáîòàåò. Èñïîëüçóéòå îïåðàòîð,
ïîäîáíûé ñëåäóþùåìó:
Application.StatusBar = "Ñîîáùåíèå î òåêóùèõ äåéñòâèÿõ"
Íå çàáûâàéòå âîçâðàùàòü óïðàâëåíèå ñòðîêå ñîñòîÿíèÿ ïðè ðàáîòå â Excel.
 Excel íåîáõîäèìî óñòàíàâëèâàòü ñâîéñòâî Application.StatusBar
â False, êîãäà ïðîöåäóðà âûïîëíåíà, èíà÷å Excel ïðîäîëæàåò îòîáðàæàòü çà-
äàííîå âàìè ñîîáùåíèå ñòðîêè ñîñòîÿíèÿ. Èñïîëüçóéòå îïåðàòîð, ïîäîáíûé
ñëåäóþùåìó, äëÿ óäàëåíèÿ ñîîáùåíèÿ èç ñòðîêè ñîñòîÿíèÿ è âîçâðàòà óïðàâ-
ëåíèÿ ñòðîêå ñîñòîÿíèÿ:
Application.StatusBar = False
 òàáë. 6.3 ïåðå÷èñëåíû íåêîòîðûå èç íàèáîëåå óïîòðåáèòåëüíûõ èëè ïî-
ëåçíûõ ñâîéñòâ îáúåêòîâ â Excel âåðñèè Visual Basic for Application. Â òàáëèöå
ïðåäñòàâëåíî èìÿ ñâîéñòâà, òèï è çíà÷åíèå, à òàêæå îáúåêòû, êîòîðûå èìåþò
ýòî ñâîéñòâî.
Òàáëèöà 6.3. Íàèáîëåå óïîòðåáèòåëüíûå ñâîéñòâà îáúåêòîâ â Excel

Ñâîéñòâî Òèï/×òî îçíà÷àåò Ãäå íàéòè


Object: àêòèâíàÿ ÿ÷åéêà â ðàáî÷åì
ActiveCell Application, Window
ëèñòå
Application, Window,
ActiveChart Object: àêòèâíàÿ äèàãðàììà
Workbook
Application, Window,
ActiveSheet Object: àêòèâíûé ëèñò
Workbook
Âîçâðàùàåò êîîðäèíàòû ÿ÷åéêè
Address Range
óêàçàííîãî îáúåêòà
Application, Range,
Cells Äèàïàçîí îáúåêòà Range
Worksheet
Charts Êîëëåêöèÿ äèàãðàìì Application, Workbook
Integer: ÷èñëî îáúåêòîâ â êîëëåêöèè
Count Âñå îáúåêòû êîëëåêöèè

String: ôîðìóëà äëÿ ÿ÷åéêè ðàáî÷åãî


Formula Äèàïàçîí
ëèñòà
Index Integer: ÷èñëî îáúåêòîâ â êîëëåêöèè Worksheet
Application, Workbook
Name String: èìÿ îáúåêòà
è â äðóãèõ îáúåêòàõ
String: äðàéâåð è êàòàëîã, â êîòîðîì AddIn, Application,
Path
ñîõðàíåí îáúåêò Workbook
Boolean: ñîõðàíÿëàñü ëè ðàáî÷àÿ
Saved Workbook
êíèãà ïîñëå ïîñëåäíèõ èçìåíåíèé
Ââåäåíèå â îáúåêòû è êîëëåêöèè 235

Ñâîéñòâî Òèï/×òî îçíà÷àåò Ãäå íàéòè


Object: òåêóùèé âûäåëåííûé
Selection Application, Window
ôðàãìåíò
Sheets Êîëëåêöèÿ ëèñòîâ ðàáî÷åé êíèãè Application, Workbook
StatusBar String: ñîîáùåíèå â ñòàòóñíîé ñòðîêå Application
Object: ðàáî÷àÿ êíèãà, èç êîòîðîé
ThisWorkBook Application
âûïîëíÿåòñÿ òåêóùàÿ ïðîöåäóðà
Integer: ÷èñëî, óêàçûâàþùåå òèï
Type Window, Worksheet, Chart
îáúåêòà
Application, Worksheet,
Boolean: îòîáðàæàåòñÿ èëè íåò
Visible Range
îáúåêò íà ýêðàíå
è â äðóãèõ îáúåêòàõ
(âàðüèðóåòñÿ): äåéñòâèòåëüíîå
Value Range
çíà÷åíèå, îòîáðàæàåìîå â ÿ÷åéêå
Workbooks Êîëëåêöèÿ ðàáî÷èõ êíèã Application
Worksheets Êîëëåêöèÿ ðàáî÷èõ ëèñòîâ Application, Workbook

Íåêîòîðûå ñâîéñòâà èç òàáëèöû 6.3 èñïîëüçîâàíû â êîäå ëèñòèíãà 6.2. ×òî-


áû ïîñìîòðåòü, êàê ðàáîòàåò ýòîò êîä, çàïóñòèòå Excel, âûáåðèòå, íàïðèìåð,
ëèñò ñ èìåíåì Ëèñò2 è ïåðåèìåíóéòå åãî â Ëèñò äëÿ òåñòîâ. Ââåäèòå â ÿ÷åéêó,
íàïðèìåð, Ñ6, ñëåäóþùèé òåêñò Ñîäåðæèìîå àêòèâíîé ÿ÷åéêè.  ýòîò ìîìåíò
ñðåäà Excel ãîòîâà ê çàïóñêó êîäà ëèñòèíãà 6.2 è âûãëÿäèò, êàê ïîêàçàíî íà
ðèñ. 6.2. Âîéäèòå â Ðåäàêòîð VBA è ââåäèòå êîä ëèñòèíãà 6.2.

Ëèñòèíã 6.2. Àêòèâíûé ëèñò, ÿ÷åéêà


1: Sub TestObject01()
2: 'èìÿ àêòèâíîãî ëèñòà
3: MsgBox ActiveSheet.Name
4:
5: 'àäðåñ àêòèâíîé ÿ÷åéêè:
6: MsgBox ActiveCell.Address
7:
8: 'ñîäåðæèìîå àêòèâíîé ÿ÷åéêè
9: MsgBox ActiveCell.Formula
10:
11: End Sub

Ïðîöåäóðà ïðè ïîìîùè ôóíêöèè MsgBox ïî î÷åðåäè îòîáðàçèò îêíà, ïðåä-


ñòàâëåííûå íà ðèñ. 6.3.
Êàê âèäèòå, äàæå íåáîëüøèå çíàíèÿ îá îáúåêòàõ äàþò íåêîòîðûå äîïîëíè-
òåëüíûå âîçìîæíîñòè äëÿ ðàáîòû ñî ñðåäîé Excel. Íî âñå åùå âïåðåäè.
 òàáë. 6.4 ïðèâåäåíû íåêîòîðûå èç íàèáîëåå óïîòðåáèòåëüíûõ èëè ïîëåç-
íûõ ñâîéñòâ îáúåêòîâ â Word. Â òàáëèöå ïðåäñòàâëåíî èìÿ ñâîéñòâà, òèï, çíà-
÷åíèå è îáúåêòû, êîòîðûå èìåþò ýòî ñâîéñòâî.
236 Ãëàâà 6

Ðèñ. 6.2
Ñðåäà Excel
ïîäãîòîâëåíà äëÿ
çàïóñêà êîäà
ëèñòèíãà 10

Òàáëèöà 6.4. Óïîòðåáèòåëüíûå è ïîëåçíûå ñâîéñòâà îáúåêòîâ Word

Ñâîéñòâî Òèï/Çíà÷åíèå Èìååòñÿ â îáúåêòàõ


ActiveDocument Object: àêòèâíûé äîêóìåíò Application
ActivePrinter String: èìÿ àêòèâíîãî ïðèíòåðà Application
ActiveWindow Object: àêòèâíîå îêíî Application, Document
Count Long: ÷èñëî îáúåêòîâ â êîëëåêöèè Âî âñåõ îáúåêòàõ êîëëåêöèé
Application, Bookmark,
Name String: èìÿ îáúåêòà Dictionary, Document
è â äðóãèõ
AddIn, Application,
String: äðàéâåð è ïóòü ê ïàïêå,
Path Dictionary, Document
â êîòîðîé ñîõðàíåí îáúåêò
è â äðóãèõ
Object: ÷àñòü äîêóìåíòà, Bookmark, Paragraph,
Range
ñîäåðæàùàÿñÿ â óêàçàííîì îáúåêòå Selection, Table è â äðóãèõ
Boolean: áûë ëè ñîõðàíåí òåêñò
Saved Document, template
ïîñëå ïîñëåäíåãî èçìåíåíèÿ
Object: òåêóùèé âûäåëåííûé
Selection Application, Pane, Window
ôðàãìåíò
StatusBar String; ñîîáùåíèå ñòðîêè ñîñòîÿíèÿ Application
Boolean: îòîáðàæàåòñÿ îáúåêò íà
Visible Application, Border
ýêðàíå èëè íåò

Ðèñ. 6.3
Ðåçóëüòàò
âûïîëíåíèÿ êîäà
ëèñòèíãà 6.2
Ââåäåíèå â îáúåêòû è êîëëåêöèè 237

Ïåðåä ïîäðîáíûì èçó÷åíèåì ñâîéñòâ è ìåòîäîâ âñòðîåííûõ îáúåêòîâ ïðèâå-


äåì íåêîòîðûå ïðèìåðû èñïîëüçîâàíèÿ ñâîéñòâ è ìåòîäîâ èç òàáëèöû.
Çàïóñòèòå Word. Îòêðîéòå äâà äîêóìåíòà. Â îäíîì èç íèõ â Ðåäàêòîðå VBA
ñîçäàéòå íîâûé ìîäóëü è ââåäèòå êîä ëèñòèíãà 6.3.

Ëèñòèíã 6.3. Àêòèâíûé äîêóìåíò

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)

 ñòðîêàõ 3–4 çàïèñàí îïåðàòîð, êîòîðûé âûäàåò íà ýêðàí èìÿ àêòèâíîãî


äîêóìåíòà (ðèñ. 6.4 a) ñ ïîìîùüþ ïðîöåäóðû MsgBox. Ñëåäóþùèé îïåðàòîð
(â ñòðîêàõ 6–7) âûäàåò îêíî, â êîòîðîì óêàçûâàåòñÿ ïóòü ê ìåñòó õðàíåíèÿ
ôàéëà íà äèñêå (ðèñ. 6.4 b). Íå ìåíåå, ÷åì äâà ïðåäûäóùèõ, èíòåðåñåí îïåðà-
òîð â ñòðîêå 9. Ýòîò îïåðàòîð çàêðûâàåò àêòèâíûé äîêóìåíò! Çàìåòüòå, ýòî äå-
ëàåòñÿ íå ïðè ïîìîùè ïðèâû÷íîãî ìåíþ, à èç êîäà VBA. Áîëåå òîãî, ïðåäâàðè-
òåëüíî ïîëüçîâàòåëþ (÷òî íåîáÿçàòåëüíî è ìîæåò áûòü îòêëþ÷åíî) çàäàåòñÿ âî-
ïðîñ, íå ñëåäóåò ëè ñîõðàíèòü ïîñëåäíèå èçìåíåíèÿ â äîêóìåíòå (ðèñ. 6.4 c).

Èñïîëüçîâàíèå ìåòîäîâ îáúåêòà


Ìåòîäû îáúåêòà èñïîëüçóþòñÿ â îïåðàòîðàõ VBA òàê, êàê èñïîëüçîâàëèñü
áû ëþáûå âñòðîåííûå ïðîöåäóðû VBA.
Ìåòîä îáúåêòà èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Object.Method
238 Ãëàâà 6

Äëÿ ìåòîäîâ îáúåêòîâ, èìåþùèõ îáÿçàòåëüíûå è íåîáÿçàòåëüíûå àðãóìåíòû, èñ-


ïîëüçóéòå òàêîé ñèíòàêñèñ:
Object.Method Argument1, Argument2, Argument3 ...
 îáåèõ ñòðîêàõ ñèíòàêñèñà Object ïðåäñòàâëÿåò ëþáóþ äîïóñòèìóþ îáúåêòíóþ
ññûëêó VBA, à Method — èìÿ ëþáîãî ìåòîäà, ïðèíàäëåæàùåãî îáúåêòó, íà êîòî-
ðûé âûïîëíÿåòñÿ ññûëêà. Âî âòîðîé ñòðîêå ñèíòàêñèñà Argument1, Argument2
è òàê äàëåå ïðåäñòàâëÿþò àðãóìåíòû â ñïèñêå àðãóìåíòîâ ìåòîäà. Êàê â ñëó÷àå
ñ àðãóìåíòàìè äëÿ âûçîâà ïðîöåäóðû VBA, íåîáõîäèìî ïåðå÷èñëÿòü àðãóìåíòû
ìåòîäà â îïðåäåëåííîì ïîðÿäêå, îòäåëÿÿ êàæäûé àðãóìåíò â ñïèñêå çàïÿòîé
è âêëþ÷àÿ îòìå÷àþùèå çàïÿòûå (place holding commas) äëÿ ïðîïóùåííûõ íåîáÿ-
çàòåëüíûõ àðãóìåíòîâ. Ìåòîä ìîæåò èìåòü îäèí èëè íåñêîëüêî àðãóìåíòîâ â ñâîåì
ñïèñêå èëè íå èìåòü èõ ñîâñåì; àðãóìåíòû ìåòîäà ìîãóò áûòü îáÿçàòåëüíûìè èëè
íåîáÿçàòåëüíûìè.

Ïðèìåð: ðàáî÷èå êíèãè 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

Õîòÿ â ýòîì ïðèìåðå ìåòîä Address âûçûâàåòñÿ áåç êàêèõ-ëèáî àðãóìåí-


òîâ, îí, íà ñàìîì äåëå, èìååò íåñêîëüêî íåîáÿçàòåëüíûõ àðãóìåíòîâ. Ýòè íå-
îáÿçàòåëüíûå àðãóìåíòû îïðåäåëÿþò ñòèëü àäðåñà ÿ÷ååê ðàáî÷åãî ëèñòà, âîç-
âðàùàåìîãî ìåòîäîì, à òàêæå, ÿâëÿþòñÿ ëè êîîðäèíàòû ÿ÷ååê àáñîëþòíûìè
èëè îòíîñèòåëüíûìè. Â ñëåäóþùåì ïðèìåðå ïîêàçàí âûçîâ ìåòîäà Address
ñ åãî òðåòüèì íåîáÿçàòåëüíûì àðãóìåíòîì (êîòîðûé îïðåäåëÿåò ñòèëü âîçâðà-
ùàåìûõ êîîðäèíàò ÿ÷ååê):
MsgBox myRange.Address(, , xlR1C1)
 ýòîì îïåðàòîðå íåîáõîäèìî â ñïèñîê àðãóìåíòîâ ìåòîäà âêëþ÷àòü îòìå÷àþ-
ùèå çàïÿòûå äëÿ ïðîïóùåííûõ íåîáÿçàòåëüíûõ àðãóìåíòîâ, êàê äëÿ ëþáîé
äðóãîé ïðîöåäóðû èëè ôóíêöèè. Ïîñêîëüêó àðãóìåíò ññûëî÷íîãî ñòèëÿ ÿâëÿåò-
ñÿ òðåòüèì àðãóìåíòîì, åìó ïðåäøåñòâóþò äâå îòìå÷àþùèå çàïÿòûå â ñïèñêå
àðãóìåíòîâ. xlR1C1 — ýòî âíóòðåííÿÿ êîíñòàíòà Excel, óêàçûâàþùàÿ íà òî, ÷òî
êîîðäèíàòû ÿ÷ååê ðàáî÷åãî ëèñòà èñïîëüçóþò ñòèëü çàïèñè R1C1; åñëè îáúåêò-
íàÿ ïåðåìåííàÿ myRange ññûëàåòñÿ íà ÿ÷åéêó âî âòîðîé ñòðîêå è òðåòüåì
ñòîëáöå, òî îòîáðàæàåòñÿ ñòðîêà R2C3 (âòîðàÿ ñòðîêà, òðåòüÿ êîëîíêà).
Ìåòîäû èìåþò òàêæå èìåíîâàííûå àðãóìåíòû, êàê è äðóãèå ïðîöåäóðû
è ôóíêöèè VBA. Ìîæíî ïåðåïèñàòü ïîñëåäíèé ïðèìåð, èñïîëüçóÿ èìåíîâàí-
íûå àðãóìåíòû, ñëåäóþùèì îáðàçîì:
MsgBox myRange.Address(ReferenceStyle:=xlR1C1)
Èñïîëüçóéòå èìåíîâàííûå àðãóìåíòû, ÷òîáû áûëî ëåã÷å ÷èòàòü êîä VBA.
 êàæäîì èç ñëåäóþùèõ ïðèìåðîâ ïîêàçàí îïåðàòîð, âûçûâàþùèé ìåòîä
SaveAs îáúåêòà ðàáî÷åé êíèãè Excel (ýòîò ìåòîä íå âîçâðàùàåò ðåçóëüòàò) äëÿ
ñîõðàíåíèÿ ðàáî÷åé êíèãè ïîä äðóãèì èìåíåì (îáúåêòíàÿ ïåðåìåííàÿ
InstBook ññûëàåòñÿ íà ðàáî÷óþ êíèãó):
InstBook.SaveAs "NEWNAME.XLS", xlNormal, , , , True
InstBook.SaveAs FileName:="NEWNAME.XLS" , _
FileFormat:=xlNormal, _
CreateBackup:=True
Îáà îïåðàòîðà èñïîëüçóþò òîëüêî òðè èç øåñòè íåîáÿçàòåëüíûõ àðãóìåíòîâ
äëÿ ìåòîäà SaveAs. Ïåðâûé îïåðàòîð èñïîëüçóåò ñòàíäàðòíûé ñïèñîê àðãó-
ìåíòîâ, âòîðîé — èìåíîâàííûå àðãóìåíòû. Íàìíîãî ëåã÷å ïîíÿòü íàçíà÷åíèå
è äåéñòâèå âòîðîãî îáðàùåíèÿ ê ìåòîäó SaveAs, ÷åì ïåðâîãî
Ìåæäó ìåòîäîì îáúåêòà è ëþáîé äðóãîé ïðîöåäóðîé VBA (âñòðîåííîé èëè
ïîëüçîâàòåëüñêîé) èìååòñÿ îäíî ñóùåñòâåííîå îòëè÷èå — ìåòîä ïðèíàäëåæèò
îïðåäåëåííîìó îáúåêòó è ìåòîä ìîæíî èñïîëüçîâàòü, îáðàùàÿñü ê íåìó òîëüêî
ïîñðåäñòâîì ýòîãî îáúåêòà. ×àñòî ìîæíî ðàñïîçíàòü âûçîâ ìåòîäîâ â êîäå VBA
ïî òîìó ôàêòó, ÷òî ìåòîä ñâÿçàí ñî ññûëêîé íà îáúåêò ñ ïîìîùüþ òî÷êè-ðàçäå-
ëèòåëÿ, êàê ïîêàçàíî â ïðèìåðàõ ýòîãî ðàçäåëà.
 òàáë. 6.5 ïðèâåäåíû íåêîòîðûå èç íàèáîëåå óïîòðåáèòåëüíûõ èëè ïîëåç-
íûõ ìåòîäîâ â Excel. Â òàáëèöå ïðåäñòàâëåíî èìÿ, êðàòêîå îïèñàíèå ìåòîäà
è îáúåêòû, èìåþùèå ýòîò ìåòîä.
Òàáëèöà 6.5. Îáùåóïîòðåáèòåëüíûå è ïîëåçíûå ìåòîäû îáúåêòîâ Excel
240 Ãëàâà 6

Ìåòîä Íàçíà÷åíèå Èìååòñÿ â îáúåêòàõ


Window, Workbook,
Activate Àêòèâèçèðóåò îáúåêò Worksheet, Range
è â äðóãèõ îáúåêòàõ
Âûïîëíÿåò âû÷èñëåíèÿ â îòêðûòîé
Application, Range,
Calculate ðàáî÷åé êíèãå, ðàáî÷åì ëèñòå èëè
Worksheet
äèàïàçîíå
Óäàëÿåò äàííûå, ñîõðàíåííûå
Clear â óêàçàííîì Range
îáúåêòå
Window, Workbook,
Close Çàêðûâàåò óêàçàííûé îáúåêò
Workbooks
Âûðàâíèâàåò òåêñò, ñîõðàíåííûé
Justify Range
â óêàçàííîì îáúåêòå
Âûïîëíÿåò óêàçàííóþ ïðîöåäóðó èëè
Run Application, Range
ôóíêöèþ
Save Ñîõðàíÿåò ôàéë ðàáî÷åé êíèãè Application, Workbook
Ñîõðàíÿåò óêàçàííûé îáúåêò â äðóãîì
SaveAs Workbook, Worksheet
ôàéëå
Select Âûáèðàåò óêàçàííûé îáúåêò Range, Sheets, Worksheets
Ïåðåñûëàåò íàæàòèÿ êëàâèøè
SendKeys Application
â äèàëîãîâûå îêíà â host-ïðèëîæåíèè
Ðåãèñòðèðóåò ôóíêöèþ êàê
Volatile èçìåíÿþùóþñÿ Application
(ñì. ãë. 6)

Âåðíèòåñü ê ëèñòó ñ èìåíåì Ëèñò äëÿ òåñòîâ â ðàáî÷åé êíèãå Excel, çàíåñè-
òå êàêóþ-ëèáî èíôîðìàöèþ â ÿ÷åéêè ëèñòà è âûäåëèòå êàêóþ-íèáóäü ÿ÷åéêó,
íàïðèìåð, êàê ïîêàçàíî íà ðèñ. 6.5. Âûïîëíèòå êîä ëèñòèíãà 6.4.

Ëèñòèíã 6.4. Ìåòîä Clear äëÿ ÿ÷åéêè è äèàïàçîíà

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

18: End Sub

Ñíà÷àëà â ðåçóëüòàòå âûïîëíåíèÿ êîäà ýòîãî ëèñòèíãà (ñòðîêà 6) íà ýêðàí


âûäàåòñÿ â äèàëîãîâîì îêíå ñîäåðæèìîå àêòèâíîé ÿ÷åéêè Ñ4. Ìåòîä
ActiveCell.Clear î÷èùàåò ýòó ÿ÷åéêó, à îïåðàòîð â ñòðîêå 13 âûäàåò íà ýêðàí
ïóñòîå ñîîáùåíèå. Íàêîíåö, îïåðàòîð â ñòðîêå 16 î÷èùàåò äèàïàçîí ÿ÷ååê
C6:D7. Ðàáî÷èé ëèñò èìååò âèä, ïðåäñòàâëåííûé íà ðèñ. 6.6. Îáðàòèòå
âíèìàíèå íà òî, êàê çàäàåòñÿ äèàïàçîí ÿ÷ååê äëÿ âûïîëíåíèÿ ìåòîäà Clear.

Ðèñ. 6.5
Ñîäåðæèìîå ëèñòà äî
âûïîëíåíèÿ êîäà
ëèñòèíãà 6.4

Ðèñ. 6.6
Ñîäåðæèìîå ëèñòà
ïîñëå âûïîëíåíèÿ
êîäà ëèñòèíãà 6.4

 òàáë. 6.6 ïðèâåäåíû íåêîòîðûå èç íàèáîëåå óïîòðåáèòåëüíûõ èëè ïîëåç-


íûõ ìåòîäîâ â Word. Â òàáëèöå ïðèâåäåíî èìÿ ìåòîäà, êðàòêîå îïèñàíèå ìåòî-
äà è îáúåêòû, èìåþùèå ýòîò ìåòîä.
242 Ãëàâà 6

Òàáëèöà 6.6. Íàèáîëåå óïîòðåáèòåëüíûå è ïîëåçíûå ìåòîäû îáúåêòîâ Word

Ìåòîä Íàçíà÷åíèå Èìååòñÿ â ýòèõ îáúåêòàõ


Window, Document, Pane
Activate Àêòèâèçèðóåò îáúåêò
è â äðóãèõ îáúåêòàõ
Ïðîâåðÿåò îðôîãðàôèþ óêàçàííîãî
CheckSpelling Document, Range
äîêóìåíòà èëè äèàïàçîíà
Close Çàêðûâàåò óêàçàííûé îáúåêò Window, Document
Óäàëÿåò óêàçàííûé îáúåêò èëè óäàëÿåò Bookmark, Range
Delete
ñèìâîëû è ñëîâà è â äðóãèõ îáúåêòàõ
Ïåðåìåùàåò êóðñîð â íà÷àëüíîå
ïîëîæåíèå ýëåìåíòà, òàêîãî êàê
GoTo Document, Range, Selection
ñòðàíèöà, çàêëàäêà èëè ïîëå;
âîçâðàùàåò îáúåêò Range
Application, Document,
PrintOut Ïå÷àòàåò óêàçàííûé îáúåêò
Envelope, Window
Âûïîëíÿåò óêàçàííóþ ïðîöåäóðó èëè
Run Application
ôóíêöèþ
Save Ñîõðàíÿåò óêàçàííûé îáúåêò Document, Template
SaveAs Ñîõðàíÿåò äîêóìåíò â äðóãîì ôàéëå Document
Bookmark, Document, Field
Select Âûáèðàåò óêàçàííûé îáúåêò
è â äðóãèõ îáúåêòàõ

Ðàññìîòðèì ïîäðîáíåå ìåòîä SaveAs, êîòîðûé óæå èñïîëüçîâàëñÿ â ïðèìå-


ðàõ ýòîé ãëàâû.
Äëÿ ìåòîäà SaveAs íåîáõîäèìû äîïîëíèòåëüíûå ïàðàìåòðû, òàê êàê íåò
ñìûñëà ñîõðàíÿòü äîêóìåíò ïîä òåì æå èìåíåì ìåòîäîì, îòëè÷íûì îò Save
(íà ñàìîì äåëå, Save òîæå èìååò íåîáÿçàòåëüíûå ïàðàìåòðû). ×òîáû ïîëó÷èòü
ñïèñîê ïàðàìåòðîâ ìåòîäà, ìîæíî âîñïîëüçîâàòüñÿ ñèñòåìîé Auto Quick Info.
Êàê òîëüêî âû íàáåðåòå ñòðîêó
ActiveDocument.SaveAs(
ñèñòåìà ïîäñêàçêè âûäàñò íà ýêðàí ñïèñîê âñåõ ïàðàìåòðîâ ìåòîäà SaveAs,
êàê ýòî îáû÷íî äåëàåòñÿ äëÿ îáû÷íûõ ôóíêöèé (ðèñ. 6.7).
Ñîãëàñíî âûäàííîìó ñèñòåìîé Auto Quick Info âñïëûâàþùåìó îêíó ìåòîä
SaveAs èìååò äîâîëüíî ìíîãî àðãóìåíòîâ, õîòÿ âñå îíè — íåîáÿçàòåëüíûå.
Åñëè èíòóèòèâíî âàì íåïîíÿòíî íàçíà÷åíèå ïàðàìåòðîâ êàêîé-ëèáî ôóíêöèè
â îêíå Auto Quick Info, îáðàòèòåñü çà ïîìîùüþ ê ñïðàâî÷íîé ñèñòåìå. Äëÿ ýòî-
ãî ëèáî âûäåëèòå, íàïðèìåð, ñòðîêó ActiveDocument.SaveAs è íàæìèòå êëà-
âèøó F1.  îêíå ñïðàâî÷íîé ñèñòåìû âû ïîëó÷èòå èñ÷åðïûâàþùóþ èíôîðìà-
öèþ î ñèíòàêñèñå ìåòîäà SaveAs:
Ñèíòàêñèñ
expression.SaveAs(FileName, FileFormat, LockComments, Password,
AddToRecentFiles, WritePassword, ReadOnlyRecommended,
EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData,
SaveAsAOCELetter)
Ââåäåíèå â îáúåêòû è êîëëåêöèè 243

Âñå ïàðàìåòðû ìåòîäà, êðîìå expression, — íåîáÿçàòåëüíûå è îïèñûâàþòñÿ â ñïðà-


âî÷íîé ñèñòåìå ñëåäóþùèì îáðàçîì:
w expression — âûðàæåíèå, âîçâðàùàþùåå îáúåêò Document.
w FileName — àðãóìåíò òèïà Variant. ßâëÿåòñÿ íîâûì èìåíåì ñîõðàíÿåìîãî äî-
êóìåíòà. Ïî óìîë÷àíèþ ýòî — òåêóùèå ïàïêà è èìÿ ôàéëà. Åñëè äîêóìåíò
åùå íè ðàçó íå ñîõðàíÿëñÿ, èñïîëüçóåòñÿ èìÿ ïî óìîë÷àíèþ (íàïðèìåð,
Doc1.doc). Åñëè äîêóìåíò ñ èìåíåì FileName óæå ñóùåñòâóåò, îí áóäåò ïåðå-
çàïèñàí áåç ñîîáùåíèÿ îá ýòîì ïîëüçîâàòåëþ.
w FileFormat — àðãóìåíò òèïà Variant. Ôîðìàò, â êîòîðîì ñîõðàíÿåòñÿ äîêóìåíò.
Ìîæåò áûòü îäíîé èç ñëåäóþùèõ WdSaveFormat-êîíñòàíò: wdFormatDocument,
wdFormatDOSText, wdFormatDOSTextLineBreaks, wdFormatEncodedText,
wdFormatHTML, wdFormatRTF, wdFormatTemplate, wdFormatText,
wdFormatTextLineBreaks èëè wdFormatUnicodeText.
w LockComments — àðãóìåíò òèïà Variant. ×òîáû áëîêèðîâàòü äîêóìåíò äëÿ
êîììåíòàðèåâ, äîëæåí èìåòü çíà÷åíèå True.
w Password — àðãóìåíò òèïà Variant. Ñòðîêà ïàðîëÿ äëÿ îòêðûòèÿ äîêóìåíòà.
w AddToRecentFiles — àðãóìåíò òèïà Variant. True — äëÿ äîáàâëåíèÿ èìåíè
ôàéëà ê ñïèñêó íåäàâíî èñïîëüçóåìûõ äîêóìåíòîâ â ìåíþ File.
w WritePassword — àðãóìåíò òèïà Variant. Ñòðîêà ïàðîëÿ äëÿ ñîõðàíåíèÿ èç-
ìåíåíèé â äîêóìåíòå.
w ReadOnlyRecommended — àðãóìåíò òèïà Variant. True — äëÿ òîãî, ÷òîáû Word
óñòàíàâëèâàë ñòàòóñ «òîëüêî íà ÷òåíèå» ïðè îòêðûòèè äîêóìåíòà.
w EmbedTrueTypeFonts — àðãóìåíò òèïà Variant. True — äëÿ ñîõðàíåíèÿ
TrueType-øðèôòîâ âìåñòå ñ äîêóìåíòîì.
w SaveNativePictureFormat — àðãóìåíò òèïà Variant. Åñëè â äîêóìåíò èìïîð-
òèðîâàëèñü ãðàôè÷åñêèå èçîáðàæåíèÿ äðóãèõ ïëàòôîðì (íàïðèìåð,
Macintosh), True — äëÿ ñîõðàíåíèÿ òîëüêî Windows-âåðñèè èìïîðòèðîâàí-
íûõ èçîáðàæåíèé.
w SaveFormsData — àðãóìåíò òèïà Variant. True — äëÿ ñîõðàíåíèÿ äàííûõ,
ââåäåííûõ ïîëüçîâàòåëåì â ôîðìó êàê çàïèñè.
w SaveAsAOCELetter — àðãóìåíò òèïà Variant. Åñëè äîêóìåíò èìååò ïðèêðåï-
ëåííûé ôàéë ýëåêòðîííîé ïî÷òû, True — äëÿ ñîõðàíåíèÿ äîêóìåíòà êàê
AOCE-ïèñüìà (ôàéë ýëåêòðîííîé ïî÷òû ñîõðàíÿåòñÿ).
w Encoding — (ïåðå÷èñëèìûé òèï MsoEncoding). Îïðåäåëÿåò êîäîâóþ ñòðàíèöó
(èëè íàáîð ñèìâîëîâ) äëÿ äîêóìåíòîâ, ñîõðàíÿåìûõ êàê íåêîäèðóåìûå òåê-
ñòîâûå ôàéëû. Ïî óìîë÷àíèþ — ñèñòåìíàÿ êîäîâàÿ ñòðàíèöà.
w InsertLineBreaks — àðãóìåíò òèïà Variant. Åñëè äîêóìåíò ñîõðàíÿåòñÿ êàê
òåêñòîâûé ôàéë, çíà÷åíèå True èñïîëüçóåòñÿ äëÿ âñòàâêè â êîíåö êàæäîé
ñòðîêè òåêñòà ñèìâîëà êîíöà ñòðîêè.
w AllowSubstitutions — àðãóìåíò òèïà Variant. Åñëè äîêóìåíò ñîõðàíÿåòñÿ
êàê òåêñòîâûé ôàéë, çíà÷åíèå True óêàçûâàåò ïðèëîæåíèþ Word çàìåíÿòü
íåêîòîðûå ñèìâîëû íà òåêñò, êîòîðûé âûãëÿäèò ïîäîáíûì îáðàçîì. Íàïðè-
ìåð, ñèìâîë, copyright-ñèìâîë çàñåíÿåòñÿ íà (c). Çíà÷åíèå ïî óìîë÷àíèþ —
False.
244 Ãëàâà 6

w LineEnding — àðãóìåíò òèïà Variant. Ñïîñîá, ïðè ïîìîùè êîòîðîãî Word îò-
ìå÷àåò êîíåö ñòðîêè èëè ïàðàãðàôà â äîêóìåíòå, ñîõðàíÿåìîì êàê òåêñòîâûé
ôàéë. Ìîæíî èñïîëüçîâàòü ñëåäóþùèå WdLineEndingType-êîíñòàíòû:
wdCRLF (çíà÷åíèå ïî óìîë÷àíèþ) èëè wdCROnly.
w AddBiDiMarks — àðãóìåíò òèïà Variant. Çíà÷åíèå True äîáàâëÿåò óïðàâëÿþ-
ùèå ñèìâîëû â âûõîäíîé ôàéë äëÿ ñîõðàíåíèÿ äâóñòîðîííåãî ðàñïîëîæåíèÿ
(bi-directional layout) òåêñòà â îðèãèíàëüíîì äîêóìåíòå.
 ñïðàâî÷íîé ñèñòåìå î÷åíü ïîäðîáíî ïðèâåäåíî îïèñàíèå êàæäîãî ìåòîäà, è ñëå-
äóåò ïî÷àùå ïðèáåãàòü ê åå óñëóãàì. Âïðî÷åì, Ðåäàêòîð VBA ïîñòîÿííî ïðåäëàãà-
åò ýòó ïîìîùü â ïðîöåññå âàøåé ðàáîòû ñ íèì.

Ðèñ. 6.7. Ñèñòåìà Auto Quick Info äëÿ ìåòîäîâ ðàáîòàåò òàê æå, êàê è äëÿ ôóíêöèé

Îáúÿâëåíèå îáúåêòíûõ ïåðåìåííûõ


Âîçìîæíî, âû ïîìíèòå èç ãëàâû, ïîñâÿùåííîé òèïàì äàííûõ, ÷òî â äîïîë-
íåíèå ê òèïàì Byte, Integer, Long, Single, Double è String VBA òàêæå
èìååò òèï Object. Ïåðåìåííûå èëè âûðàæåíèÿ òèïà Object ññûëàþòñÿ íà
îáúåêò VBA èëè íà îáúåêò, ïðèíàäëåæàùèé host-ïðèëîæåíèþ, òàêîé êàê
Excel-îáúåêòû Workbook, Worksheet è Range èëè Word-îáúåêòû Document,
Range, Paragraph.
Êàê è â ñëó÷àå ñ äðóãèìè òèïàìè VBA, ìîæíî îáúÿâëÿòü ïåðåìåííûå â ìî-
äóëÿõ, ïðîöåäóðàõ è ôóíêöèÿõ ñ îïðåäåëåííûì òèïîì Object, ÷òî ïîêàçàíî
â ñëåäóþùåì îïåðàòîðå:
Dim myObject As Object
Ââåäåíèå â îáúåêòû è êîëëåêöèè 245

Ìîæíî çàäàâàòü ïåðåìåííóþ myObject, ñîçäàâàåìóþ ïðåäøåñòâóþùèì îïå-


ðàòîðîì Dim, ÷òîáû îíà ñîäåðæàëà ññûëêó íà ëþáîé îáúåêò VBA èëè îáúåêò
host-ïðèëîæåíèÿ. Åñëè âû ñîáèðàåòåñü èñïîëüçîâàòü ïåðåìåííóþ òèïà Object
äëÿ íåêîòîðûõ ñïåöèôè÷åñêèõ òèïîâ îáúåêòîâ, ìîæíî òàêæå îáúÿâëÿòü îáú-
åêòíóþ ïåðåìåííóþ äëÿ ýòîãî ñïåöèôè÷åñêîãî òèïà îáúåêòà:
Dim InstBook As Workbook
Îáúåêòíóþ ïåðåìåííóþ InstBook, ñîçäàâàåìóþ ýòèì îïåðàòîðîì Dim, ìîæ-
íî èñïîëüçîâàòü òîëüêî äëÿ ñîõðàíåíèÿ ññûëîê íà îáúåêòû Workbook; ïðè ïî-
ïûòêå ïðèñâîèòü ïåðåìåííîé InstBook ññûëêó íà îáúåêò Range èëè
Worksheet VBA îòîáðàæàåò ñîîáùåíèå îá îøèáêå íåñîâïàäåíèÿ òèïîâ. Àíàëî-
ãè÷íî, ñëåäóþùåå ïðåäëîæåíèå îáúÿâëÿåò îáúåêòíóþ ïåðåìåííóþ, êîòîðàÿ
ìîæåò ñîõðàíÿòü òîëüêî îáúåêòû Document:
Dim InstDoc As Document
Ìîæíî èñïîëüçîâàòü VBA-ôóíêöèþ IsObject äëÿ îïðåäåëåíèÿ òîãî, îáðà-
çóåò ëè ïåðåìåííàÿ èëè âûðàæåíèå äîïóñòèìóþ îáúåêòíóþ ññûëêó. Ôóíêöèÿ
IsObject èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
IsObject(Object)
Object ïðåäñòàâëÿåò ïåðåìåííóþ èëè âûðàæåíèå, êîòîðîå íåîáõîäèìî ïðîòåñòèðî-
âàòü; IsObject âîçâðàùàåò çíà÷åíèå True, åñëè Object ÿâëÿåòñÿ äîïóñòèìîé îáúåêò-
íîé ññûëêîé, è False — èíà÷å.

Äëÿ îïðåäåëåíèÿ îáúåêòíîãî òèïà ïåðåìåííîé, ìîæíî òàêæå èñïîëüçîâàòü


VBA-ôóíêöèþ TypeName (â ïðåäûäóùèõ ãëàâàõ ýòà ôóíêöèÿ óæå ïðèìåíÿëàñü).

Îáúåêòû â âûðàæåíèÿõ
Îáúåêòíîå âûðàæåíèå (object expression) — ýòî ëþáîå âûðàæåíèå VBA, êî-
òîðîå îïðåäåëÿåò îòäåëüíûé îáúåêò. Âñå îáúåêòíûå âûðàæåíèÿ äîëæíû âû-
÷èñëÿòüñÿ äî åäèíñòâåííîé îáúåêòíîé ññûëêè (ññûëêè íà îáúåêò); îáúåêòíûå
âûðàæåíèÿ èñïîëüçóþòñÿ ñ åäèíñòâåííîé öåëüþ — ñîçäàíèå ññûëîê íà ñïåöè-
ôè÷åñêèå îáúåêòû â âàøèõ ïðîãðàììàõ VBA.
Îáúåêòíîå âûðàæåíèå ìîæåò ñîñòîÿòü èç îáúåêòíûõ ïåðåìåííûõ, îáúåêò-
íûõ ññûëîê èëè îáúåêòíîãî ìåòîäà èëè ñâîéñòâà, êîòîðîå âîçâðàùàåò îáúåêò.
Âñå ïîñëåäóþùèå ïðèìåðû ÿâëÿþòñÿ ïðàâèëüíûìè îáúåêòíûìè âûðàæåíèÿ-
ìè (èñïîëüçóþùèìè îáúåêòû Excel):

Application Èìÿ îáúåêòà: ññûëàåòñÿ íà îáúåêò ïðèëîæåíèÿ


Îáúåêòíîå ñâîéñòâî, êîòîðîå âîçâðàùàåò ññûëêó íà
Application.ActiveSheet îáúåêò:
àêòèâíûé ëèñò
Îáúåêòíûé ìåòîä, êîòîðûé âîçâðàùàåò êîëëåêöèþ
Application.Workbooks îáúåêòîâ:
âñå îòêðûòûå ðàáî÷èå êíèãè
Îáúåêòíàÿ ïåðåìåííàÿ: èíèöèàëèçèðîâàííàÿ â îïåðàòîðå
ABook Set,
ññûëàåòñÿ íà îáúåêò
246 Ãëàâà 6

Íåëüçÿ èñïîëüçîâàòü ïåðåìåííûå òèïà Object èëè îáúåêòíûå âûðàæåíèÿ


â àðèôìåòè÷åñêèõ, ëîãè÷åñêèõ èëè îïåðàöèÿõ ñðàâíåíèÿ. Îáúåêòíàÿ ññûëêà,
ñîçäàííàÿ ñ ïîìîùüþ îáúåêòíîãî âûðàæåíèÿ èëè ñîõðàíåííàÿ â îáúåêòíîé ïå-
ðåìåííîé, â äåéñòâèòåëüíîñòè, ÿâëÿåòñÿ òîëüêî àäðåñîì, óêàçûâàþùèì ìåñòî
â ïàìÿòè êîìïüþòåðà, ãäå ñîõðàíåí îáúåêò, íà êîòîðûé âûïîëíÿåòñÿ ññûëêà.
Ïîñêîëüêó îáúåêòíàÿ ññûëêà — ýòî àäðåñ ïàìÿòè, àðèôìåòè÷åñêèå, ëîãè÷å-
ñêèå îïåðàòîðû è îïåðàòîðû ñðàâíåíèÿ íå èìåþò ñìûñëà.
Ïåðåä èñïîëüçîâàíèåì îáúåêòíîé ïåðåìåííîé äëÿ ññûëêè íà îáúåêò íåîáõî-
äèìî çàäàòü ýòó ïåðåìåííóþ, ÷òîáû îíà ñîäåðæàëà ññûëêó íà íóæíûé îáúåêò.
Ïðèñâàèâàíèå îáúåêòíîé ññûëêè îáúåêòíîé ïåðåìåííîé îòëè÷àåòñÿ îò ïðè-
ñâàèâàíèé äðóãèõ ïåðåìåííûõ; ÷òîáû ïðèñâîèòü îáúåêòíóþ ññûëêó îáúåêòíîé
ïåðåìåííîé, èñïîëüçóéòå îïåðàòîð Set.
Îïåðàòîð Set èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Set Var = Object
Var — ýòî ëþáàÿ îáúåêòíàÿ ïåðåìåííàÿ èëè ïåðåìåííàÿ òèïà Variant. Object —
ëþáàÿ äîïóñòèìàÿ îáúåêòíàÿ ññûëêà; ýòî ìîæåò áûòü äðóãàÿ îáúåêòíàÿ ïåðåìåí-
íàÿ èëè îáúåêòíîå âûðàæåíèå. Åñëè Var — ïåðåìåííàÿ, îáúÿâëåííàÿ ñ êàêèì-ëèáî
îïðåäåëåííûì òèïîì (íàïðèìåð, Range èëè Workbook), ýòîò òèï äîëæåí áûòü ñî-
âìåñòèì ñ îáúåêòîì, íà êîòîðûé ññûëàåòñÿ Object.

 ñëåäóþùåì ôðàãìåíòå ïðîãðàììû òèïû ïåðåìåííîé è îáúåêòîâ èñïîëüçó-


þòñÿ ïðàâèëüíî (äëÿ îáúåêòîâ Excel):
Dim InstSheet As Worksheet
Set InstSheet = Application.ActiveSheet
Ñëåäóþùèé ôðàãìåíò ïðîãðàììû VBA èìååò â ðåçóëüòàòå îøèáêó íåñîâïà-
äåíèÿ òèïîâ ïîòîìó, ÷òî ñâîéñòâî ActiveSheet âîçâðàùàåò îáúåêò
Worksheet, à íå Workbook:
Dim InstBook As Workbook
Set InstBook = Application.ActiveSheet
×òîáû çàäàòü îòäåëüíûé îáúåêò â âûðàæåíèè èëè îáúåêòíóþ ïåðåìåííóþ
äëÿ ññûëêè íà ýòîò îáúåêò, èñïîëüçóéòå ìåòîäû è ñâîéñòâà, âîçâðàùàþùèå
îáúåêòû, òàêèå êàê ñâîéñòâà ActiveWorkbook è ActiveSheet îáúåêòà Appli-
cation èëè ìåòîä Cells îáúåêòà Worksheet (â Excel). Àíàëîãè÷íûå
ïðèíöèïû ïðèìåíèìû â Word: èñïîëüçóéòå ñâîéñòâî ActiveDocument
îáúåêòà Application äëÿ ïîëó÷åíèÿ ññûëêè íà òåêóùèé äîêóìåíò è òàê
äàëåå.
Õîòÿ ñòàíäàðòíûå îïåðàòîðû ñðàâíåíèÿ (<, <=, >, >=, <>, =) íå ÿâëÿþòñÿ
çíà÷èìûìè ïðè èñïîëüçîâàíèè ñ îáúåêòàìè, VBA ïðåäîñòàâëÿåò îäèí îïåðà-
òîð ñðàâíåíèÿ, ïðåäíàçíà÷åííûé èñêëþ÷èòåëüíî äëÿ èñïîëüçîâàíèÿ ñ îáúåêò-
íûìè âûðàæåíèÿìè è ïåðåìåííûìè — îïåðàòîð (îïåðàöèþ) Is.
Îïåðàòîð Is èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Object1 Is Object2
Object1 è Object2 — ëþáûå äîïóñòèìûå îáúåêòíûå ññûëêè. Èñïîëüçóéòå îïåðàòîð
Is äëÿ îïðåäåëåíèÿ òîãî, îáîçíà÷àþò ëè äâå îáúåêòíûå ññûëêè îäèí è òîò æå îáú-
Ââåäåíèå â îáúåêòû è êîëëåêöèè 247

åêò. Ðåçóëüòàò îïåðàöèè ñðàâíåíèÿ Is ðàâåí True, åñëè îáúåêòíûå ññûëêè ÿâëÿþò-
ñÿ îäíèìè è òåìè æå, èíà÷å — False.

 ëèñòèíãå 6.5 ïîêàçàíà VBA-ïðîöåäóðà äëÿ Excel, âûïîëíÿþùàÿ ðåçåðâ-


íóþ êîïèþ àêòèâíîé ðàáî÷åé êíèãè. Ìîæíî èñïîëüçîâàòü ïîäîáíóþ ïðîöåäó-
ðó, åñëè íåîáõîäèìî ïðåäîñòàâèòü ïîëüçîâàòåëþ ëåãêèé ñïîñîá ñîõðàíÿòü êî-
ïèþ àêòèâíîé ðàáî÷åé êíèãè ïîä äðóãèì èìåíåì áåç èçìåíåíèÿ èìåíè ôàéëà
àêòèâíîé ðàáî÷åé êíèãè â ïàìÿòè, êàê ýòî äåëàåòñÿ ñ ïîìîùüþ êîìàíäû File |
Save As (Ôàéë | Ñîõðàíèòü êàê…).

Ëèñòèíã 6.5. Ïðîöåäóðà ñîçäàíèÿ ðåçåðâíîé êîïèè àêòèâíîé ðàáî÷åé êíèãè


1: Sub SaveActiveBook()
2: 'Ñîçäàåò êîïèþ àêòèâíîé ðàáî÷åé êíèãè ïîä íîâûì èìåíåì,
3: 'èñïîëüçóÿ ìåòîä SaveCopyAs. Íîâîå èìÿ èìååò äîáàâêó "_bp"
4:
5: Dim FName As String 'èìÿ ôàéëà-êîïèè
6: Dim OldComment As String 'êîììåíòàðèè
7:
8: 'ñîõðàíèòü êîììåíòàðèè èñõîäíîãî ôàéëà
9: OldComment = ActiveWorkbook.Comments
10:
11: 'äîáàâèòü íîâûå êîììåíòàðèè ê backup-ôàéëó
12: ActiveWorkbook.Comments = "Ðåçåðâíàÿ êîïèÿ ôàéëà " & _
13: ActiveWorkbook.Name & _
14: ", âûïîëíåííàÿ ïðîöåäóðîé SaveActiveBook"
15:
16: 'Ñôîðìèðîâàòü íîâîå èìÿ ôàéëà èç èñõîäíîãî
17: FName = Left(ActiveWorkbook.Name, _
18: InStr(ActiveWorkbook.Name, ".") - 1) & "_bp.xlsm"
19:
20: 'äîáàâëåíèå ê èìåíè ôàéëà ïóòè
21: FName = ActiveWorkbook.Path & "\" & FName
22:
23: ActiveWorkbook.SaveCopyAs Filename:=FName
24: ActiveWorkbook.Comments = OldComment 'âîññòàíîâèòü êîììåíòàðèè
25: End Sub

 ýòîé ïðîöåäóðå èñïîëüçóþòñÿ äâà îáúåêòà Excel, èõ ñâîéñòâà è ìåòîäû.


Îáúåêòíàÿ ññûëêà ActiveWorkbook ÿâëÿåòñÿ ñâîéñòâîì Excel-îáúåêòà
Application, êîòîðîå âîçâðàùàåò îáúåêòíóþ ññûëêó íà àêòèâíóþ â äàííûé
ìîìåíò ðàáî÷óþ êíèãó. ( ñëåäóþùåì ðàçäåëå âû óçíàåòå, ÷òî îáû÷íî ìîæíî
îïóñêàòü îáúåêòíóþ ññûëêó äëÿ ñâîéñòâ è ìåòîäîâ îáúåêòà Application.)
 ñòðîêå 9 êîïèðóåòñÿ ñòðîêà ñâîéñòâà Comments îáúåêòà ActiveWorkbook
â ïåðåìåííóþ OldComment. Çàòåì â ñòðîêàõ 12–14 çàäàåòñÿ íîâîå çíà÷åíèå
äëÿ ñâîéñòâà Comments îáúåêòà ActiveWorkbook (ýòî ñâîéñòâî èçìåíÿåòñÿ
è äëÿ èñõîäíîé ðàáî÷åé êíèãè). Ñâîéñòâî Êîììåíòàðèè ýòîãî îáúåêòà ñîäåð-
æèò òåêñò êîììåíòàðèÿ, îáû÷íî ââîäèìîãî âàìè â äèàëîãîâîå îêíî Ñâîéñòâà,
êîòîðîå Excel îòîáðàæàåò ïðè ñîõðàíåíèè ðàáî÷åé êíèãè â ïåðâûé ðàç èëè ïðè
èñïîëüçîâàíèè êîìàíäû File | Properties (Ôàéë | Ñâîéñòâà). Íà ðèñ. 6.8 ïðèâåäåíî
îêíî Ñâîéñòâà äëÿ ôàéëà, êîòîðûé áûë ïîëó÷åí â ðåçóëüòàòå ðåçåðâíîãî êîïè-
ðîâàíèÿ. Îáðàòèòå âíèìàíèå íà ïîëå Êîììåíòàðèè. Â ýòîì ïîëå äîëæåí íàõî-
äèòüñÿ òåêñò, êîòîðûé ìîæíî ïîëó÷èòü, åñëè ïåðåä ñòðîêîé 16 âñòàâèòü îïåðà-
òîð:
248 Ãëàâà 6

MsgBox ActiveWorkBook.Comments
 ñòðîêàõ 17–19 ôîðìèðóåòñÿ èìÿ íîâîãî ôàéëà èç èìåíè òåêóùåãî. Ýòîò
îïåðàòîð èñïîëüçóåò ôóíêöèè Left è InStr, ïîìîãàÿ ñîçäàòü íîâîå èìÿ ôàéëà
äëÿ ðåçåðâíîé êîïèè àêòèâíîé ðàáî÷åé êíèãè. Ôóíêöèÿ InStr âîçâðàùàåò ïî-
ëîæåíèå ðàçäåëèòåëÿ èìåíè ôàéëà (.) â ñâîéñòâå Name îáúåêòà
ActiveWorkbook. (Ñâîéñòâî Name ðàáî÷åé êíèãè ñîäåðæèò èìÿ ôàéëà ðàáî÷åé
êíèãè). Ðåçóëüòàò ôóíêöèè InStr îïðåäåëÿåò, ñêîëüêî ñèìâîëîâ ôóíêöèÿ
Left êîïèðóåò èç ñâîéñòâà Name îáúåêòà ActiveWorkbook. Ïîñêîëüêó ôóíê-
öèÿ InStr âîçâðàùàåò ïîçèöèþ ðàçäåëèòåëÿ èìåíè ôàéëà (.), Left âîçâðàùà-
åò èìÿ ôàéëà, íå âêëþ÷àÿ ðàçäåëèòåëü è ðàñøèðåíèå. Ê ïîëó÷åííîìó èìåíè
äîáàâëÿåòñÿ ñòðîêà "_bp.xlsm".

Ðèñ. 6.8
Óáåäèòåñü â ïðàâèëüíîñòè êîììåíòàðèåâ ïðè
ðåçåðâíîì êîïèðîâàíèè àêòèâíîé ðàáî÷åé
êíèãè

 ñòðîêå 21 ê ïóòè, ïîëó÷àåìîìó ïðè ïîìîùè ìåòîäà ActiveWorkbo-


ok.Path, äîáàâëÿåòñÿ èìÿ íîâîãî ôàéëà.
Ñòðîêà 23 èñïîëüçóåò ìåòîä ActiveWorkbook.SaveCopyAs äëÿ ñîõðàíåíèÿ
àêòèâíîé ðàáî÷åé êíèãè ñ íîâûì èìåíåì ôàéëà íà òåêóùåì äèñêå è êàòàëîãå;
èìÿ ôàéëà àêòèâíîé ðàáî÷åé êíèãè â ïàìÿòè îñòàåòñÿ òåì æå.
Íàêîíåö, â ñòðîêå 24 âîññòàíàâëèâàåòñÿ îðèãèíàëüíîå ñîäåðæèìîå ñâîéñò-
âà ActiveWorkbook.Comments; ôàéë àêòèâíîé ðàáî÷åé êíèãè òåïåðü íàõîäèò-
ñÿ òî÷íî â òàêîì æå ñîñòîÿíèè, â êàêîì îí áûë ïåðåä òåì, êàê íà÷èíàåòñÿ âû-
ïîëíåíèå ýòîé ïðîöåäóðû.
Ââåäåíèå â îáúåêòû è êîëëåêöèè 249

Ññûëêà íà îáúåêòû ñ ïîìîùüþ With…End With


Êàê âèäíî èç ëèñòèíãà 6.5, ïðîöåäóðû ìîãóò ññûëàòüñÿ íà îäèí è òîò æå
îáúåêò ÷àñòî ñ ïîìîùüþ íåñêîëüêèõ îïåðàòîðîâ â îäíîé ñòðîêå. Êàæäûé îïå-
ðàòîð â ëèñòèíãå 6.5 â ñòðîêàõ ñ 9 ïî 23 èñïîëüçóåò ñâîéñòâî èëè ìåòîä îáúåê-
òà, íà êîòîðûé ññûëàåòñÿ ActiveWorkbook. VBA ïðåäîñòàâëÿåò îñîáóþ ñòðóê-
òóðó — ñòðóêòóðó With…End With, ïîçâîëÿþùóþ ññûëàòüñÿ íà ñâîéñòâà èëè
ìåòîäû, êîòîðûå ïðèíàäëåæàò îäíîìó è òîìó æå îáúåêòó, áåç çàäàíèÿ âñåé
îáúåêòíîé ññûëêè êàæäûé ðàç.
Ñòðóêòóðà With…End With èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
With Object
'îïåðàòîðû, èñïîëüçóþùèå ñâîéñòâà è ìåòîäû Object
End With
Object — ýòî ëþáàÿ äîïóñòèìàÿ îáúåêòíàÿ ññûëêà.

 ëèñòèíãå 6.6 ïîêàçàíà ïðîöåäóðà SaveActiveBook2, íà ýòîò ðàç — ñî


ñòðóêòóðîé With…End With.

Ëèñòèíã 6.6. Äîáàâëåíèå ê ïðîöåäóðå SaveActiveBook ñòðóêòóðû With…End With


1: Sub SaveActiveBook2()
2: 'Ñîçäàåò êîïèþ àêòèâíîé ðàáî÷åé êíèãè ïîä íîâûì èìåíåì,
3: 'èñïîëüçóÿ ìåòîä SaveCopyAs. Íîâîå èìÿ èìååò äîáàâêó "_bp2"
4:
5: Dim FName As String 'èìÿ ôàéëà-êîïèè
6: Dim OldComment As String 'êîììåíòàðèè
7:
8: With ActiveWorkbook
9: 'ñîõðàíèòü êîììåíòàðèè èñõîäíîãî ôàéëà
10: OldComment = .Comments
11:
12: 'äîáàâèòü íîâûå êîììåíòàðèè ê backup-ôàéëó
13: .Comments = "ðåçåðâíàÿ êîïèÿ ôàéëà " & .Name & _
14: ", âûïîëíåííàÿ ïðîöåäóðîé SaveActiveBook2"
15:
16: 'Ñôîðìèðîâàòü íîâîå èìÿ ôàéëà èç èñõîäíîãî
17: FName = Left(.Name, InStr(.Name, ".") - 1) & "_bp2.xlsm"
18:
19: FName = .Path & "\" & FName
20:
21: .SaveCopyAs Filename:=FName
22: .Comments = OldComment 'âîññòàíîâèòü êîììåíòàðèè
23: End With
24: End Sub

Ýòà âåðñèÿ ïðîöåäóðû ðàáîòàåò òî÷íî òàê æå, êàê ïîêàçàííàÿ â ëèñòèí-
ãå 6.5. Çäåñü èñïîëüçóåòñÿ ñòðóêòóðà With…End With. Ñòðîêà 8 íà÷èíàåòñÿ
ñ êëþ÷åâîãî ñëîâà With, çà êîòîðûì ñëåäóåò îáúåêòíàÿ ññûëêà ActiveWork-
book, íà÷èíàÿ òàêèì îáðàçîì âñþ ñòðóêòóðó With…End With.
 ñòðîêå 10 ñîäåðæèìîå ñâîéñòâà ActiveWorkbook.Comments ïðèñâàèâà-
åòñÿ ñòðîêîâîé ïåðåìåííîé OldComment. Çàìåòèì, ÷òî íà ýòîò ðàç òîëüêî òî÷-
êà-ðàçäåëèòåëü (.) âêëþ÷àåòñÿ â íà÷àëî ñâîéñòâà Comments. Ïîñêîëüêó ýòîò
250 Ãëàâà 6

îïåðàòîð íàõîäèòñÿ âíóòðè ñòðóêòóðû With ActiveWorkbook, VBA «çíàåò»,


÷òî îáúåêòíîé ññûëêîé äëÿ ñâîéñòâà .Comments ÿâëÿåòñÿ ActiveWorkbook.
Âñå ñêàçàííîå îòíîñèòñÿ êî âñåì îñòàëüíûì îïåðàòîðàì, èñïîëüçóþùèì
ñâîéñòâà îáúåêòà ActiveWorkbook.
Íàêîíåö, ñòðîêà 23 çàâåðøàåò ñòðóêòóðó With…End With êëþ÷åâûìè ñëî-
âàìè End With.
Íå çàáûâàéòå ñîõðàíÿòü ëþáûå äàííûå, êîòîðûå õîòèòå èçìåíèòü òîëüêî íà
íåêîòîðîå âðåìÿ. Ïðîöåäóðà SaveActiveBook2, íàïðèìåð, èçìåíÿåò ñâîéñòâî
Comments àêòèâíîé ðàáî÷åé êíèãè. SaveActiveBook2 èñïîëüçóåò ïåðåìåííóþ
äëÿ ñîõðàíåíèÿ îðèãèíàëüíîãî êîììåíòàðèÿ ïåðåä âûïîëíåíèåì èçìåíåíèé,
à çàòåì âîññòàíàâëèâàåò îðèãèíàëüíûé êîììåíòàðèé.
Íå ñëåäóåò ïîëó÷àòü äàííûå ââîäà îò ïîëüçîâàòåëÿ, åñëè îíè âàì äåéñòâè-
òåëüíî íå íóæíû. Ïðîöåäóðà SaveActiveBook2 ìîãëà áû áûòü çàïèñàíà ñ îïå-
ðàòîðîì InputBox äëÿ ïîëó÷åíèÿ èìåíè ôàéëà âìåñòî ãåíåðàöèè ýòîãî èìåíè
àâòîìàòè÷åñêè. Àâòîìàòè÷åñêîå ãåíåðèðîâàíèå îáåñïå÷èâàåò òî, ÷òî ðåçåðâ-
íûå ôàéëû, ñîçäàâàåìûå ýòîé ïðîöåäóðîé, ëåãêî èäåíòèôèöèðóþòñÿ è ïîëüçî-
âàòåëþ íå ïðèõîäèòñÿ âûïîëíÿòü ââîä èìåíè ôàéëà. Ãåíåðèðîâàíèå íîâîãî
èìåíè ôàéëà â ïðîöåäóðå óñòðàíÿåò òàêæå ïîòåíöèàëüíûå ïðîáëåìû, ñâÿçàí-
íûå ñ ââîäîì íåâåðíîãî èìåíè ôàéëà ïîëüçîâàòåëåì.
Î÷åâèäíî, ÷òî íàáîð êîäà ëèñòèíãà 6.6 òðåáóåò ìåíüøèõ óñèëèé, ÷åì íàáîð
êîäà ëèñòèíãà 6.5; òàêîé êîä ê òîìó æå ëåã÷å ÷èòàòü è ïîíèìàòü. Óïðîùàéòå
ñâîé êîä, èñïîëüçóÿ ñòðóêòóðó With…End With âñÿêèé ðàç, êîãäà ó âàñ íå-
ñêîëüêî ïðîãðàììíûõ îïåðàòîðîâ èñïîëüçóþò ñâîéñòâà èëè ìåòîäû îäíîé îáú-
åêòíîé ññûëêè.

Ðàáîòà ñ êîëëåêöèÿìè îáúåêòîâ


è êîíòåéíåðàìè îáúåêòîâ
Êîëëåêöèÿ (collection) îáúåêòîâ — ýòî ãðóïïà ñâÿçàííûõ îáúåêòîâ, òàêèõ
êàê âñå ðàáî÷èå ëèñòû â ðàáî÷åé êíèãå èëè âñå ñèìâîëû â ïàðàãðàôå. Îáúåêò
â êîëëåêöèè íàçûâàåòñÿ ýëåìåíòîì (element) ýòîé êîëëåêöèè.
Ñàìà êîëëåêöèÿ ÿâëÿåòñÿ îáúåêòîì; êîëëåêöèè èìåþò ñîáñòâåííûå ñâîéñò-
âà è ìåòîäû. Êàæäàÿ êîëëåêöèÿ, íàïðèìåð, èìååò ñâîéñòâî Count, êîòîðîå
âîçâðàùàåò ÷èñëî ýëåìåíòîâ â êîëëåêöèè. Åñëè â àêòèâíîé ðàáî÷åé êíèãå èìå-
åòñÿ 16 ðàáî÷èõ ëèñòîâ, òî ñëåäóþùåå âûðàæåíèå âû÷èñëÿåòñÿ äî ÷èñëà 16:
Application.ActiveWorkbook.Worksheets.Count
 ýòîì âûðàæåíèè Worksheets — êîëëåêöèÿ âñåõ ðàáî÷èõ ëèñòîâ â ðàáî-
÷åé êíèãå, ActiveWorkbook — ñâîéñòâî Excel-îáúåêòà Application, âîçâðà-
ùàþùåå àêòèâíóþ ðàáî÷óþ êíèãó, à Count — ñâîéñòâî êîëëåêöèè
Worksheets, âîçâðàùàþùåå îáùåå ÷èñëî ðàáî÷èõ ëèñòîâ â êîëëåêöèè.
Ýòî ïðîñòîå âûðàæåíèå ïîìîãàåò ïðîèëëþñòðèðîâàòü òî, ÷òî îäíè îáúåêòû
ñîäåðæàò äðóãèå îáúåêòû. Êîíòåéíåð (container) — ýòî ëþáîé îáúåêò, ñîäåð-
æàùèé îäèí èëè íåñêîëüêî äðóãèõ îáúåêòîâ. Â äàííîì ïðèìåðå Application
ñîäåðæèò îáúåêò, íà êîòîðûé ññûëàåòñÿ ActiveWorkbook, ñîäåðæàùèé,
â ñâîþ î÷åðåäü, êîëëåêöèþ îáúåêòîâ Worksheets. Âñå êîíòåéíåðíûå îáúåêò-
íûå ññûëêè ñîåäèíÿþòñÿ âìåñòå ñ ïîìîùüþ òî÷êè-ðàçäåëèòåëÿ (.) äëÿ îáðàçî-
âàíèÿ îäíîãî îáúåêòíîãî âûðàæåíèÿ.
Ââåäåíèå â îáúåêòû è êîëëåêöèè 251

Ìíîãèå îáúåêòû ñîäåðæàò äðóãèå îáúåêòû ðàçëè÷íûõ òèïîâ: ðàáî÷àÿ êíèãà


ñîäåðæèò îáúåêòû Module, Chart è Worksheets; ðàáî÷èé ëèñò ìîæåò ñîäåð-
æàòü îáúåêòû DrawingObjects, ChartObjects èëè OLEObjects. Èåðàðõèÿ
îáúåêòîâ è êîíòåéíåðîâ íàçûâàåòñÿ îáúåêòíîé ìîäåëüþ (object model).
Îáúåêò Application è â Excel, è â Word (êàê, âïðî÷åì, è â äðóãèõ ïðèëîæåíè-
ÿõ) íàçûâàåòñÿ âíåøíèì êîíòåéíåðîì è ñîäåðæèò âñå äðóãèå îáúåêòû è êîëëåê-
öèè. Íàïðèìåð, Excel-îáúåêò Application ñîäåðæèò êîëëåêöèè Workbooks,
AddIns è äðóãèå; Workbooks — ýòî êîëëåêöèÿ âñåõ îòêðûòûõ ðàáî÷èõ êíèã,
à AddIns — êîëëåêöèÿ âñåõ èíñòàëëèðîâàííûõ ïðèëîæåíèé-íàäñòðîåê
(Add-ins). Excel-êîëëåêöèÿ Workbooks, â ñâîþ î÷åðåäü, ñîäåðæèò êîëëåêöèè
Worksheets, Charts è ò.ä. Êîëëåêöèÿ Worksheets ñîäåðæèò îòäåëüíûå ëèñ-
òû.
Word-îáúåêò Application ñîäåðæèò êîëëåêöèè Documents — äîêóìåíòû,
AddIns — íàäñòðîéêè, Dialogs — äèàëîãè, Dictionaries — ñëîâàðè è ìíîãî
äðóãèõ êîëëåêöèé. Íåêîòîðûå Word-êîëëåêöèè Application ñàìè ñîäåðæàò
êîëëåêöèè, íàïðèìåð, êîëëåêöèÿ Documents — ýòî êîëëåêöèÿ âñåõ îòêðûòûõ
äîêóìåíòîâ.
×òîáû óêàçàòü VBA, íà êàêîé îáúåêò íåîáõîäèìà ññûëêà, ìîæåò ïîíàäî-
áèòüñÿ îïðåäåëèòü êîíòåéíåð îáúåêòà. Äëÿ ññûëêè íà îïðåäåëåííûé ëèñò ðà-
áî÷åé êíèãè Excel, íàïðèìåð, ìîæåò áûòü íåîáõîäèìî âêëþ÷èòü ññûëêó íà ðà-
áî÷óþ êíèãó, êîòîðàÿ ñîäåðæèò ýòîò ðàáî÷èé ëèñò:
Workbook("Sales.xlsx").Worksheets("Îò÷åò")
 äàííîì îáúåêòíîì âûðàæåíèè èñïîëüçóåòñÿ Excel-êîëëåêöèÿ Workbooks
äëÿ ññûëêè íà ðàáî÷óþ êíèãó Sales.xls, à çàòåì èñïîëüçóåòñÿ êîëëåêöèÿ
Worksheets, ñîäåðæàùàÿñÿ â îáúåêòå ðàáî÷åé êíèãè Sales.xls, äëÿ ññûëêè íà
êîíêðåòíûé ëèñò. (Êàê îáîçíà÷àþòñÿ îòäåëüíûå ýëåìåíòû â êîëëåêöèè, îïè-
ñûâàåòñÿ íåìíîãî äàëüøå â ýòîé ãëàâå.) Ñëåäóþùèé ïðèìåð âûðàæåíèÿ ïîêà-
çûâàåò åùå áîëåå ñëîæíóþ îáúåêòíóþ ññûëêó:
Application.Workbooks("Sales.xlsx").Worksheets("Îò÷åò").Range("A1")
Çäåñü îáúåêòíîå âûðàæåíèå ññûëàåòñÿ íà ÿ÷åéêó À1 â ëèñòå Îò÷åò ðàáî÷åé
êíèãè Sales.xls. Êàê âèäíî èç ýòèõ äâóõ ïðèìåðîâ, îïðåäåëåíèå ïîëíîé îáú-
åêòíîé ññûëêè ïîñðåäñòâîì âñåõ êîíòåéíåðîâ îáúåêòà ìîæåò áûòü äîâîëüíî
óòîìèòåëüíûì. Ê ñ÷àñòüþ, VBA ïîçâîëÿåò îïóñêàòü îáúåêòíóþ ññûëêó
Application ïî÷òè äëÿ âñåõ îáúåêòîâ, êîòîðûå ñîäåðæèò îáúåêò
Application. Åñëè îïóñêàåòñÿ îáúåêòíàÿ ññûëêà Application, VBA «ïîëàãà-
åò», ÷òî èìååòñÿ â âèäó host-ïðèëîæåíèå, è ïîäñòàâëÿåò ññûëêó àâòîìàòè÷å-
ñêè. Ñëåäóþùåå îáúåêòíîå âûðàæåíèå ññûëàåòñÿ íà òîò æå îáúåêò, ÷òî è ïðå-
äûäóùåå âûðàæåíèå (ÿ÷åéêà À1 â ëèñòå Îò÷åò ðàáî÷åé êíèãè Sales.xls):
Workbooks("Sales.xlsx").Worksheets("Îò÷åò").Range("A1")
Âàì íåîáõîäèìî îïðåäåëÿòü Excel-îáúåêòíóþ ññûëêó Workbooks òîëüêî òî-
ãäà, êîãäà ññûëêà ìîæåò áûòü íåîäíîçíà÷íîé èëè ïðè èñïîëüçîâàíèè âñòðîåí-
íûõ ôóíêöèé ðàáî÷èõ ëèñòîâ Excel.
Åñëè Excel-îáúåêòíàÿ ññûëêà Workbooks (èëè îáúåêòíàÿ ññûëêà
Documents â Word) îïóñêàåòñÿ, VBA îáû÷íî (íî íå âñåãäà) «ïîëàãàåò», ÷òî
èìååòñÿ â âèäó òåêóùàÿ àêòèâíàÿ ðàáî÷àÿ êíèãà èëè äîêóìåíò. Ñëåäóþùåå
îáúåêòíîå âûðàæåíèå ýêâèâàëåíòíî ïðåäûäóùåìó ïðè óñëîâèè, ÷òî ðàáî÷àÿ
êíèãà Sales.xls ÿâëÿåòñÿ àêòèâíîé:
Worksheets("Îò÷åò").Range("A1")
252 Ãëàâà 6

Åñëè Sales.xls — àêòèâíàÿ ðàáî÷àÿ êíèãà, à Îò÷åò — àêòèâíûé ëèñò, òî ñëå-


äóþùåå îáúåêòíîå âûðàæåíèå òàêæå ýêâèâàëåíòíî ïðåäûäóùåìó:
Range("A1")
Îäíàêî âî ìíîãèõ ïðîöåäóðàõ íåâîçìîæíî îïðåäåëèòü ñ óâåðåííîñòüþ, ÷òî
êàêàÿ-ëèáî îòäåëüíàÿ ðàáî÷àÿ êíèãà (ðàáî÷èé ëèñò èëè äîêóìåíò) ÿâëÿåòñÿ
àêòèâíîé, âî âðåìÿ âûïîëíåíèÿ ïðîöåäóðû, ïîýòîìó, âåðîÿòíî, ïîòðåáóåòñÿ
îïðåäåëèòü, ïî êðàéíåé ìåðå, íåêîòîðûå èç êîíòåéíåðîâ äëÿ îáúåêòà, íà êîòî-
ðûé íåîáõîäèìà ññûëêà.
Íå çàáûâàéòå èñïîëüçîâàòü ìåòîäû è ñâîéñòâà, âîçâðàùàþùèå îáúåêòû (òà-
êèå êàê ActiveWorkbook è ActiveDocument), ÷òîáû äåëàòü êîíòåéíåðíûå
îáúåêòíûå ññûëêè êîðî÷å. Èñïîëüçîâàíèå ñòðóêòóðû With…End With ÿâëÿåò-
ñÿ èäåàëüíûì ñïîñîáîì èçáåæàòü çàïèñè äëèííûõ îáúåêòíûõ ññûëîê áîëåå îä-
íîãî èëè äâóõ ðàç â îäíîé ïðîöåäóðå.
×òîáû ëó÷øå ïîíÿòü êîíòåéíåðíûå îáúåêòû è êîëëåêöèè, íåîáõîäèìî ïîì-
íèòü, ÷òî ïðîãðàììíûé îáúåêò íå ÿâëÿåòñÿ ôèçè÷åñêèì ïðåäìåòîì, íàõîäÿ-
ùèìñÿ â äðóãîì ôèçè÷åñêîì ïðåäìåòå. Ïîìíèòå, ÷òî îáúåêò, ñîäåðæàùèé äðó-
ãîé îáúåêò, íà ñàìîì äåëå ïðîñòî èìååò àäðåñ ïàìÿòè äðóãîãî îáúåêòà. Êîíòåé-
íåðû ññûëàþòñÿ íà îáúåêòû, êîòîðûå îíè «ñîäåðæàò», ïîñðåäñòâîì èõ
àäðåñîâ. Òî÷íî òàê, êàê ìíîãèå ðàçëè÷íûå ëþäè ìîãóò èìåòü âàø ïî÷òîâûé
àäðåñ, íî âû íå ïðèñóòñòâóåòå ôèçè÷åñêè â èõ äîìå, íà ëþáîé îòäåëüíûé ïðî-
ãðàììíûé îáúåêò ìîãóò ññûëàòüñÿ íåñêîëüêî äðóãèõ îáúåêòîâ ÷åðåç åãî àäðåñ.
Ïðè íåîáõîäèìîñòè ññûëàòüñÿ íà êîíòåéíåð êàêîãî-ëèáî îáúåêòà èñïîëü-
çóéòå ñâîéñòâî Parent ýòîãî îáúåêòà. Âñå îáúåêòû èìåþò ñâîéñòâî Parent, êî-
òîðîå âîçâðàùàåò îáúåêòíóþ ññûëêó íà êîíòåéíåð îáúåêòà. Íàïðèìåð, ñëå-
äóþùåå îáúåêòíîå âûðàæåíèå ññûëàåòñÿ íà Excel-îáúåêò Application, ñîäåð-
æàùèé êîëëåêöèþ Workbooks:
Workbooks.Parent
 òàáë. 6.7 ïåðå÷èñëåíû íåñêîëüêî íàèáîëåå ÷àñòî èñïîëüçóåìûõ êîëëåê-
öèé îáúåêòîâ â Excel âåðñèè Visual Basic for Applications. Â òàáëèöå ïðèâîäèò-
ñÿ èìÿ êîëëåêöèè è êðàòêîå îïèñàíèå åå íàçíà÷åíèÿ.
 òàáë. 6.8 ïåðå÷èñëåíû íåêîòîðûå íàèáîëåå ÷àñòî èñïîëüçóåìûå êîëëåê-
öèè îáúåêòîâ â Word âåðñèè VBA. Â òàáëèöå ïðèâîäèòñÿ èìÿ êîëëåêöèè
è êðàòêîå îïèñàíèå åå íàçíà÷åíèÿ.
Òàáëèöà 6.7. Îáùèå êîëëåêöèè Excel

Êîëëåêöèÿ Íàçíà÷åíèå
AddIns Êîëëåêöèÿ íàäñòðîåê ïðèëîæåíèÿ.
Charts Êîëëåêöèÿ âñåõ òàáëèö (Chart sheets) â ðàáî÷åé êíèãå.
ChartObjects Êîëëåêöèÿ âñåõ îáúåêòîâ Chart â ðàáî÷åì ëèñòå.
Dialogs Êîëëåêöèÿ âñåõ äèàëîãîâ â ïðèëîæåíèè.
Êîëëåêöèÿ âñåõ îêîí â ïðèëîæåíèè, íåçàâèñèìî îò òîãî,
Windows
îòîáðàæàåòñÿ ëè îêíî íà ýêðàíå.
Êîëëåêöèÿ âñåõ îòêðûòûõ â äàííûõ ìîìåíò ðàáî÷èõ êíèã
Workbooks
â ïðèëîæåíèè.
Worksheets Êîëëåêöèÿ âñåõ ðàáî÷èõ ëèñòîâ â ðàáî÷åé êíèãå.
Ââåäåíèå â îáúåêòû è êîëëåêöèè 253

Òàáëèöà 6.8. Îáùèå êîëëåêöèè Word

Êîëëåêöèÿ Íàçíà÷åíèå
AddIns Êîëëåêöèÿ íàäñòðîåê ïðèëîæåíèÿ.
Êîëëåêöèÿ âñåõ çàêëàäîê â äîêóìåíòå, ðàçäåëå èëè äèàïàçîíå
Bookmarks
(â çàâèñèìîñòè îò êîíòåéíåðà).
Êîëëåêöèÿ âñåõ ñèìâîëîâ â äîêóìåíòå, ðàçäåëå èëè äèàïàçîíå
Characters (â çàâèñèìîñòè îò êîíòåéíåðà). Êàæäûé ýëåìåíò â êîëëåêöèè
Characters ÿâëÿåòñÿ îáúåêòîì Range, ñîäåðæàùèì îäèí ñèìâîë.
Comments Êîëëåêöèÿ âñåõ êîììåíòàðèåâ äîêóìåíòà.
Dialogs Êîëëåêöèÿ äèàëîãîâ ïðèëîæåíèÿ.
Documents Êîëëåêöèÿ âñåõ îòêðûòûõ â äàííûé ìîìåíò äîêóìåíòîâ.
Êîëëåêöèÿ îáúåêòîâ Paragraph â äîêóìåíòå, ðàçäåëå èëè äèàïàçîíå
Paragraphs
(â çàâèñèìîñòè îò êîíòåéíåðà).
Êîëëåêöèÿ ðàçäåëîâ â äîêóìåíòå, ðàçäåëå èëè äèàïàçîíå
Sections
(â çàâèñèìîñòè îò êîíòåéíåðà).
Êîëëåêöèÿ îïèñàíèé ñòèëåé â äîêóìåíòå äëÿ âñòðîåííûõ
Styles
è îïðåäåëåííûõ ïîëüçîâàòåëåì ñòèëåé.
Templates Êîëëåêöèÿ âñåõ øàáëîíîâ ïðèëîæåíèÿ.
Êîëëåêöèÿ âñåõ îêîí â ïðèëîæåíèè èëè êîëëåêöèÿ âñåõ îêîí
Windows
(îòîáðàæàþùèõ äîêóìåíò â çàâèñèìîñòè îò êîíòåéíåðà).

Äîáàâëåíèå îáúåêòîâ ê êîëëåêöèÿì


Áîëüøóþ ÷àñòü âðåìåíè âû áóäåòå ðàáîòàòü ñ ýëåìåíòàìè, óæå ñóùåñòâóþùè-
ìè â êîëëåêöèè. Âðåìÿ îò âðåìåíè áóäåò íåîáõîäèìî äîáàâèòü êàêîé-ëèáî ýëå-
ìåíò â êîëëåêöèþ. Â Excel âû, âåðîÿòíî, çàõîòèòå ñîçäàòü íîâóþ ðàáî÷óþ êíèãó
èëè äîáàâèòü íîâûé ðàáî÷èé ëèñò â ðàáî÷óþ êíèãó; â Word íóæíî áóäåò ñîçäàòü
íîâûé äîêóìåíò èëè äîáàâèòü íîâóþ çàêëàäêó â äîêóìåíò.  ýòèõ ñëó÷àÿõ íåîá-
õîäèìî äîáàâëÿòü íîâûé ýëåìåíò â ñîîòâåòñòâóþùóþ êîëëåêöèþ îáúåêòîâ.
Êàæäàÿ êîëëåêöèÿ èìååò ìåòîä Add (ýòî îäèí èç áàçîâûõ ìåòîäîâ êîëëåê-
öèè), êîòîðûé äîáàâëÿåò íîâûé ýëåìåíò â ýòó êîëëåêöèþ. Ìíîãèå èç ìåòîäîâ
Add èìåþò îäèí èëè íåñêîëüêî àðãóìåíòîâ, êîòîðûå ïîçâîëÿþò çàäàâàòü ðàç-
ëè÷íûå íà÷àëüíûå çíà÷åíèÿ èëè óñëîâèÿ äëÿ ñâîéñòâ íîâûõ îáúåêòîâ. Ñëå-
äóþùèé îïåðàòîð ïîêàçûâàåò ìåòîä Add êîëëåêöèè Workbooks, èñïîëüçóå-
ìûé äëÿ ñîçäàíèÿ íîâîé ðàáî÷åé êíèãè Excel:
Workbooks.Add
Ýòîò îïåðàòîð ñîçäàåò íîâóþ ðàáî÷óþ êíèãó è äåëàåò åå àêòèâíîé. Ñëåäóþ-
ùèé îïåðàòîð ïîêàçûâàåò ìåòîä Add êîëëåêöèè Documents, èñïîëüçóåìîé äëÿ
ñîçäàíèÿ íîâîãî äîêóìåíòà Word:
Documents.Add
Ýòîò îïåðàòîð ñîçäàåò íîâûé äîêóìåíò è äåëàåò åãî àêòèâíûì.
254 Ãëàâà 6

Ññûëêà íà êîíêðåòíûå îáúåêòû â êîëëåêöèè èëè êîíòåéíåðå


Äëÿ çàäàíèÿ îòäåëüíîãî ýëåìåíòà â êîëëåêöèè èñïîëüçóéòå ñëåäóþùèé
ñèíòàêñèñ:
Ñèíòàêñèñ
Collection (Index)
Collection — ëþáîå äîïóñòèìîå îáúåêòíîå âûðàæåíèå, ññûëàþùååñÿ íà êîëëåê-
öèþ. Index ìîæåò áûòü ëèáî ñòðîêîé, ëèáî öåëûì, îáîçíà÷àþùèì êîíêðåòíûé íå-
îáõîäèìûé ýëåìåíò. Åñëè àðãóìåíò Index ÿâëÿåòñÿ ñòðîêîé, ñòðîêà äîëæíà ñîäåð-
æàòü òåêñòîâîå èìÿ îáúåêòà.

Íàïðèìåð, â Excel ìîæíî èñïîëüçîâàòü èìÿ ðàáî÷åãî ëèñòà (ïîêàçàíî íà ÿð-


ëû÷êå ëèñòà), èìåíîâàííîãî äèàïàçîíà â ðàáî÷åì ëèñòå, ôàéëà ðàáî÷åé êíèãè,
êíîïêè ïàíåëè èíñòðóìåíòîâ èëè êîìàíäû ìåíþ è òàê äàëåå â êà÷åñòâå Index
äëÿ ñîîòâåòñòâóþùåé êîëëåêöèè. Íàïðèìåð, äëÿ ññûëêè íà ðàáî÷èé ëèñò
ñ èìåíåì Äàííûå èþëÿ â àêòèâíîé ðàáî÷åé êíèãå ñëåäóåò èñïîëüçîâàòü òàêîé
îïåðàòîð:
Worksheets("Äàííûå èþëÿ")
 Word ìîæíî èñïîëüçîâàòü èìÿ ôàéëà äîêóìåíòà, çàêëàäêè, ñòèëÿ è òàê
äàëåå â êà÷åñòâå àðãóìåíòà Index äëÿ êîëëåêöèè. Íàïðèìåð, äëÿ ññûëêè íà çà-
êëàäêó ñ èìåíåì Ïîñëåäíÿÿ çàêëàäêà â äîêóìåíòå Îò÷åò çà èþëü íóæíî èñ-
ïîëüçîâàòü ñëåäóþùèé îïåðàòîð:
Documents("Îò÷åò çà èþëü").Bookmarks("Ïîñëåäíÿÿ çàêëàäêà")
Êîãäà Index — öåëîå, îíî ÿâëÿåòñÿ íîìåðîì ýëåìåíòà â êîëëåêöèè. Êàæ-
äûé ýëåìåíò íóìåðóåòñÿ â òîì ïîðÿäêå, â êîòîðîì îí äîáàâëÿåòñÿ â êîëëåê-
öèþ. Ïîýòîìó íå ñóùåñòâóåò ëåãêîãî ñïîñîáà îïðåäåëåíèÿ èíäåêñíîãî íîìåðà
ëþáîãî äàííîãî ýëåìåíòà êîëëåêöèè.
Îáû÷íî ñëåäóåò èñïîëüçîâàòü òåêñòîâîå èìÿ äëÿ ññûëêè íà ýëåìåíò â êîë-
ëåêöèè; ýòî íå òîëüêî ïîçâîëÿåò òî÷íî îïðåäåëèòü, íà êàêîé ýëåìåíò íåîáõî-
äèìà ññûëêà, íî è äåëàåò êîä áîëåå ÷èòàáåëüíûì. Worksheets("Îò÷åò") ãîðàç-
äî ïîíÿòíåå, ÷åì Worksheets(5).
Äëÿ ññûëêè íà âñå ýëåìåíòû â êîëëåêöèè íå âêëþ÷àéòå íèêàêîãî èíäåêñà.
Ñëåäóþùèé îïåðàòîð çàêðûâàåò âñå âèäèìûå îòêðûòûå ðàáî÷èå êíèãè â Excel:
Workbooks.Close
Ñëåäóåò ïîìíèòü î òîì, ÷òî ìåòîäû è ñâîéñòâà â îáúåêòå Application ïðè-
íàäëåæàò host-ïðèëîæåíèþ, à íå VBA. Êîãäà âû ðàáîòàåòå ñ ðàçëè÷íûìè
host-ïðèëîæåíèÿìè VBA, íåêîòîðûå èç ìåòîäîâ è ñâîéñòâ â îáúåêòå
Application ìîãóò âàðüèðîâàòüñÿ â çàâèñèìîñòè îò êîíêðåòíîãî host-ïðèëî-
æåíèÿ: Excel, Word è ò.ä.
Íå çàáûâàéòå, ÷òî îáúåêò Application ïðåäîñòàâëÿåò ìíîãî ïîëåçíûõ ìå-
òîäîâ è ñâîéñòâ, à òàêæå ïðåäîñòàâëÿåò êîíòåéíåð äëÿ îáúåêòîâ host-ïðèëîæå-
íèÿ. Íàïðèìåð, ïîìíèòå, ÷òî Excel-ôóíêöèè ðàáî÷åãî ëèñòà, òàêèå êàê SUM,
MIN, MAX è òàê äàëåå, äîñòóïíû ÷åðåç îáúåêò Application. Word-îáúåêò
Application ñîäåðæèò ìåòîäû äëÿ ïðåîáðàçîâàíèÿ äþéìîâ â òî÷êè, òî÷åê
â äþéìû è äðóãèå.
Êàê óæå îòìå÷àëîñü, îáúåêò Application ìîæåò ñîäåðæàòü ìåòîäû ñ èìå-
íàìè, äóáëèðóþùèìè èìåíà ïðîöåäóð èëè ôóíêöèé VBA. Ïðè èñïîëüçîâàíèè
Ââåäåíèå â îáúåêòû è êîëëåêöèè 255

ìåòîäà host-ïðèëîæåíèÿ, äóáëèðóþùåãî èìÿ ïðîöåäóðû èëè ôóíêöèè VBA,


íåîáõîäèìî çàäàâàòü îáúåêò Application, èíà÷å VBA «ïîëàãàåò», ÷òî âû õî-
òèòå èñïîëüçîâàòü ïðîöåäóðó èëè ôóíêöèþ VBA.
Íàïðèìåð, Excel-îáúåêò Application ñîäåðæèò ìåòîä InputBox. Ex-
cel-ìåòîä InputBox — ýòî íå òî æå ñàìîå, ÷òî VBA-ôóíêöèÿ InputBox: Ex-
cel-ìåòîä Application.InputBox èìååò íà îäèí àðãóìåíò áîëüøå, ÷åì
VBA-ìåòîä InputBox; ýòîò äîïîëíèòåëüíûé àðãóìåíò ïîçâîëÿåò îãðàíè÷èâàòü
òèï äàííûõ (÷èñëåííûé, äàòû, òåêñòîâûé), ââîäèìûé ïîëüçîâàòåëåì
â äèàëîãîâîå îêíî. ×òîáû èñïîëüçîâàòü Excel-ìåòîä InputBox, íåîáõîäèìî
çàäàòü îáúåêò Application:
Application.InputBox
 ïðîòèâíîì ñëó÷àå VBA «ïîëàãàåò», ÷òî âû õîòèòå èñïîëüçîâàòü VBA-
ôóíêöèþ InputBox.

Ôèãóðû â ñëîå âåêòîðíîé ãðàôèêè


VBA ïîääåðæèâàåò îáùóþ ìîäåëü îáúåêòîâ ñëîÿ âåêòîðíîé ãðàôèêè
â Microsoft Word, Microsoft Excel è Microsoft PowerPoint. Âåðõíèì óðîâíåì
ýòîé ìîäåëè ÿâëÿåòñÿ êîëëåêöèÿ Shapes, ñîäåðæàùàÿ âñå ãðàôè÷åñêèå
îáúåêòû (Shape-îáúåêòû), êîòîðûå âêëþ÷àþòñÿ â ñëîé âåêòîðíîé ãðàôèêè.
Êðîìå êîëëåêöèè Shapes, ìîæíî â êà÷åñòâå êîëëåêöèè íåñêîëüêèõ
Shape-îáúåêòîâ èñïîëüçîâàòü êîëëåêöèþ ShapeRange, îáúåäèíÿþùóþ
íåêîòîðîå ïîäìíîæåñòâî ôèãóð â âåêòîðíîì ñëîå (÷àñòü êîëëåêöèè Shapes).

Äîáàâëåíèå ê êîëëåêöèè Shapes «àâòîôèãóð»


Ïðåæäå ÷åì ðàáîòàòü ñ Shape-îáúåêòîì, íåîáõîäèìî äîáàâèòü åãî ê (áûòü
ìîæåò, ïîêà åùå ïóñòîé) êîëëåêöèè Shapes, èñïîëüçóÿ åå ìåòîä AddShapes:
Ñèíòàêñèñ
expression.AddShape(Type, Left, Top, Width, Height)
Çäåñü expression — ëþáîå Shapes-âûðàæåíèå; Type — êîíñòàíòà (òèï Long), îïðå-
äåëÿþùàÿ òèï ôèãóðû è ïðèíèìàþùàÿ îäíî èç msoAutoShapeType-çíà÷åíèé (íà-
ïðèìåð, msoShapeFlowchartData, msoShapeFlowchartMerge, msoShapeLeft-
Bracket, msoShapeRectangle, msoShapeHeart, msoShapeRightTriangle, msoShape-
Hexagon, msoShapeHorizontalScroll, msoShapeWave — âñåãî îêîëî 140 êîíñòàíò);
Left — ïîëîæåíèå (òèï Single) ëåâîãî óãëà àâòîôèãóðû (èçìåðÿåòñÿ â «ïîèíòàõ»);
Top — ïîëîæåíèå (òèï Single) âåðõíåãî óãëà àâòîôèãóðû; Width— øèðèíà (òèï
Single) àâòîôèãóðû; Height — âûñîòà (òèï Single) àâòîôèãóðû.
Ïðè äîáàâëåíèè â êîëëåêöèþ Shapes ôèãóðà ïîëó÷àåò èìÿ (ñâîéñòâî Name) ïî
óìîë÷àíèþ, íî åãî ìîæíî óêàçàòü, èñïîëüçóÿ ñëåäóþùèé ñèíòàêñèñ:
expression.AddShape(Type, Left, Top, Width, Height).Name=<èìÿ ôèãóðû>

Äëÿ ïîëó÷åíèÿ ññûëêè íà âñþ êîëëåêöèþ îáúåêòîâ â ñëîå âåêòîðíîé ãðàôè-


êè íåîáõîäèìî èñïîëüçîâàòü ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
mDocument.Shapes.SelectAll
256 Ãëàâà 6

 ëèñòèíãå 6.7 ïðèâåäåí êîä, èñïîëüçóþùèé ìåòîä AddShape äëÿ äîáàâëå-


íèÿ ôèãóð ê êîëëåêöèè Shapes òåêóùåãî äîêóìåíòà Word. Íà ðèñ. 6.9 äîáàâ-
ëåííûå ôèãóðû îòîáðàæåíû â òåêóùåì äîêóìåíòå.

Ëèñòèíã 6.7. Äîáàâëåíèå ôèãóð ê äîêóìåíòó

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

×òîáû ïîëó÷èòü êîëëåêöèþ ShapeRange, ÿâëÿþùóþñÿ ïîäìíîæåñòâîì


êîëëåêöèè Shapes, íåîáõîäèìî èñïîëüçîâàòü ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Shapes.Range(index)
Çäåñü index — èìÿ/èíäåêñ ôèãóðû èëè ìàññèâ èìåí/èíäåêñîâ ôèãóð.

×òîáû ïîëó÷èòü êîëëåêöèþ ShapeRange, ïðåäñòàâëÿþùóþ âñå ôèãóðû


êîëëåêöèè Shapes, íåîáõîäèìî èñïîëüçîâàòü ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Selection.ShapeRange

×òîáû ïîëó÷èòü êîëëåêöèþ ShapeRange, ïðåäñòàâëÿþùóþ âñå ôèãóðû


êîëëåêöèè Shapes, íåîáõîäèìî èñïîëüçîâàòü ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Selection.ShapeRange(index)
Çäåñü index — èìÿ/èíäåêñ ôèãóðû èëè ìàññèâ èìåí/èíäåêñîâ ôèãóð.
Íàïðèìåð, ïðè ïîìîùè êîäà ëèñòèíãà 6.8 ìîæíî «çàêðàñèòü» ôèãóðû, ñîç-
äàííûå êîäîì ëèñòèíãà 6.7. Íà ðèñ. 6.10 îòîáðàæåíû çàêðàøåííûå ôèãóðû.

Ëèñòèíã 6.8. Èñïîëüçîâàíèå êîëëåêöèè ShapeRange


1: Sub ActDocumShapeRange()
2: 'Èñïîëüçîâàíèå êîëëåêöèè ShapeRange
3:
Ââåäåíèå â îáúåêòû è êîëëåêöèè 257

4: ' "çàêðàñèòü" ïåðâûå äâå ôèãóðû â êîëëåêöèè Shapes:


5: ActiveDocument.Shapes.Range(Array(1, 2)).Fill.PresetGradient _
6: msoGradientHorizontal, 1, msoGradientLateSunset
7:
8: 'âûäåëèòü âñå ôèãóðû êîëëåêöèè:
9: ActiveDocument.Shapes.SelectAll
10:
11: ' "çàêðàñèòü" òðåòüþ ôèãóðó êîëëåêöèè ShapeRange:
12: ActiveWindow.Selection.ShapeRange(3).Fill.PresetGradient _
13: msoGradientVertical, 1, msoGradientLateSunset
14:
15: End Sub

Äîáàâëåíèå ê êîëëåêöèè Shapes ñïåöèàëüíûõ ôèãóð


Êðîìå äîáàâëåíèÿ ê êîëëåêöèè Shapes äîêóìåíòà (ëèñòà, ïðåçåíòàöèè)
«àâòîôèãóðû» (ìåòîäîì AddShape), ìîæíî òàêæå äîáàâëÿòü ñïåöèàëüíûå ýëå-
ìåíòû îôîðìëåíèÿ, èñïîëüçóÿ òàêèå ìåòîäû, êàê AddCallout, AddComment
è äðóãèå (ñì. òàáëèöó 6.9).
Òàáëèöà 6.9. Ìåòîäû äëÿ äîáàâëåíèÿ ôèãóð â äîêóìåíòû, ëèñòû èëè ñëàéäû

Ìåòîä Ñèíòàêñèñ Íàçíà÷åíèå


Word:
Äîáàâëÿåò â äîêóìåíò íå
AddCallout(Type As
èìåþùóþ ãðàíèö âûíîñêó.
MsoCalloutType, Left As
Âîçâðàùàåò Shape-îáúåêò,
AddCallout Single, Top As Single,
ïðåäñòàâëÿþùèé ýòó âûíîñêó,
Width As Single, Height As
è äîáàâëÿåò åãî â êîëëåêöèþ
Single, [Anchor]) As Shape
Shapes.
Äîáàâëÿåò â äîêóìåíò
«ïîëîòíî» äëÿ ðèñîâàíèÿ
AddCanvas(Left As Single,
(drawing canvas). Âîçâðàùàåò
Top As Single, Width As
AddCanvas Shape-îáúåêò, ïðåäñòàâëÿþùèé
Single, Height As Single,
«ïîëîòíî» äëÿ ðèñîâàíèÿ,
[Anchor]) As Shape
è äîáàâëÿåò åãî â êîëëåêöèþ
Shapes
Âîçâðàùàåò â äîêóìåíò
AddCurve(SafeArrayOfPoints
AddCurve Shape-îáúåêò, êîòîðûé
, [Anchor]) As Shape
ïðåäñòàâëÿåò êðèâóþ Áåçüå.
AddDiagram(Type As
Âîçâðàùàåò â äîêóìåíò
MsoDiagramType, Left As
Shape-îáúåêò, êîòîðûé
AddDiagram Single, Top As Single,
ïðåäñòàâëÿåò òîëüêî ÷òî
Width As Single, Height As
ñîçäàííóþ äèàãðàììó.
Single, [Anchor]) As Shape
258 Ãëàâà 6

Ìåòîä Ñèíòàêñèñ Íàçíà÷åíèå


Äîáàâëÿåò â äîêóìåíò íàäïèñü
â âèäå ïðÿìîóãîëüíèêà
AddLabel(Orientation As
ñ íåâèäèìûìè ãðàíèöàìè
MsoTextOrientation, Left
è áåç çàëèâêè. Âîçâðàùàåò
AddLabel As Single, Top As Single,
Shape-îáúåêò, êîòîðûé
Width As Single, Height As
ïðåäñòàâëÿåò ýòó íàäïèñü,
Single, [Anchor]) As Shape
è äîáàâëÿåò åãî â êîëëåêöèþ
Shapes.
Äîáàâëÿåò ëèíèþ â äîêóìåíò.
AddLine(BeginX As Single,
Âîçâðàùàåò Shape-îáúåêò,
BeginY As Single, EndX As
AddLine êîòîðûé ïðåäñòàâëÿåò ýòó
Single, EndY As Single,
ñòðîêó, è äîáàâëÿåò åãî
[Anchor]) As Shape
â êîëëåêöèþ Shapes.
Ñîçäàåò ýëåìåíò óïðàâëåíèÿ
ActiveX (ðàíåå èçâåñòíûé êàê
OLE-ýëåìåíò óïðàâëåíèÿ).
AddOLEControl([ClassType],
(Òîëüêî â Word; â Excel
[Left], [Top], [Width],
AddOLEControl è PowerPoint èñïîëüçóéòå
[Height], [Anchor]) As
AddOLEObject) Âîçâðàùàåò
Shape
Shape-îáúåêò, êîòîðûé
ïðåäñòàâëÿåò íîâûé ýëåìåíò
óïðàâëåíèÿ ActiveX.
AddOLEObject([ClassType],
[FileName], [LinkToFile],
[DisplayAsIcon], Ñîçäàåò OLE-îáúåêò.
[IconFileName], Âîçâðàùàåò Shape-îáúåêò
AddOLEObject
[IconIndex], [IconLabel], êîòîðûé ïðåäñòàâëÿåò íîâûé
[Left], [Top], [Width], OLE-îáúåêò.
[Height], [Anchor]) As
Shape
AddPicture(FileName As Äîáàâëÿåò êàðòèíêó
String, [LinkToFile], â äîêóìåíò. Âîçâðàùàåò
[SaveWithDocument], Shape-îáúåêò, êîòîðûé
AddPicture
[Left], [Top], [Width], ïðåäñòàâëÿåò ýòó êàðòèíêó,
[Height], [Anchor]) As è äîáàâëÿåò åãî â êîëëåêöèþ
Shape Shapes.
Äîáàâëÿåò ëîìàíóþ ëèíèþ èëè
ìíîãîóãîëüíèê â äîêóìåíò.
Âîçâðàùàåò Shape-îáúåêò,
AddPolyline(SafeArrayOfPoi
AddPolyline êîòîðûé ïðåäñòàâëÿåò ýòó
nts, [Anchor]) As Shape
ëîìàíóþ ëèíèþ èëè
ìíîãîóãîëüíèê, è äîáàâëÿåò åãî
â êîëëåêöèþ Shapes.
Ââåäåíèå â îáúåêòû è êîëëåêöèè 259

Ìåòîä Ñèíòàêñèñ Íàçíà÷åíèå


Äîáàâëÿåò â äîêóìåíò
ïðèêðåïëåííóþ òåêñòîâóþ
AddTextbox(Orientation As ðàìêó â âèäå ïðÿìîóãîëüíèêà
MsoTextOrientation, Left ñ íåâèäèìûìè ãðàíèöàìè è áåç
AddTextbox As Single, Top As Single, çàëèâêè. Âîçâðàùàåò
Width As Single, Height As Shape-îáúåêò, êîòîðûé
Single, [Anchor]) As Shape ïðåäñòàâëÿåò ýòó òåêñòîâóþ
ðàìêó, è äîáàâëÿåò åãî
â êîëëåêöèþ Shapes.
AddTextEffect(PresetTextEf
fect As
MsoPresetTextEffect,
Äîáàâëÿåò WordArt-îáúåêò
Text As String,
â äîêóìåíò. Âîçâðàùàåò
FontName As String,
Shape-îáúåêò, êîòîðûé
AddTextEffect FontSize As Single,
ïðåäñòàâëÿåò ýòîò
FontBold As MsoTriState,
WordArt-îáúåêò è äîáàâëÿåò
FontItalic As MsoTriState,
åãî â êîëëåêöèþ Shapes.
Left As Single,
Top As Single, [Anchor])
As Shape
Excel:
AddCallout(Type As
Äîáàâëÿåò â äîêóìåíò íå
MsoCalloutType, Left As
èìåþùóþ ãðàíèö âûíîñêó.
AddCallout Single, Top As Single,
Âîçâðàùàåò Shape-îáúåêò,
Width As Single, Height As
ïðåäñòàâëÿþùèé ýòó âûíîñêó.
Single) As Shape
Ñîçäàåò ñîåäèíèòåëüíóþ
ëèíèþ. Âîçâðàùàåò
AddConnector(Type As
Shape-îáúåêò, êîòîðûé
MsoConnectorType, BeginX
ïðåäñòàâëÿåò íîâóþ
AddConnector As Single, BeginY As
ñîåäèíèòåëüíóþ ëèíèþ. Êîãäà
Single, EndX As Single,
äîáàâëÿåòñÿ ñîåäèíèòåëüíàÿ
EndY As Single) As Shape
ëèíèÿ, îíà íå ñîåäèíåíà íè
ñ ÷åì.
Êîãäà ïðèìåíÿåòñÿ ê îáúåêòó
êîëëåêöèè Shapes, âîçâðàùàåò
AddCurve(SafeArrayOfPoints
AddCurve Shape-îáúåêò, êîòîðûé
) As Shape
ïðåäñòàâëÿåò êðèâóþ Áåçüå
â ýëåêòðîííîé òàáëèöå.
AddDiagram(Type As
MsoDiagramType, Left As Ñîçäàåò äèàãðàììó. Âîçâðàùàåò
AddDiagram Single, Top As Single, Shape-îáúåêò, êîòîðûé
Width As Single, Height As ïðåäñòàâëÿåò íîâóþ äèàãðàììó.
Single) As Shape
260 Ãëàâà 6

Ìåòîä Ñèíòàêñèñ Íàçíà÷åíèå


AddFormControl(Type As Ñîçäàåò ýëåìåíò óïðàâëåíèÿ
XlFormControl, Left As Microsoft Excel. Âîçâðàùàåò
AddForm Long, Top As Long, Width Shape-îáúåêò, êîòîðûé
As Long, Height As Long) ïðåäñòàâëÿåò íîâûé ýëåìåíò
As Shape óïðàâëåíèÿ.
Äîáàâëÿåò â äîêóìåíò íàäïèñü
AddLabel(Orientation As
â âèäå ïðÿìîóãîëüíèêà
MsoTextOrientation, Left
ñ íåâèäèìûìè ãðàíèöàìè è áåç
AddLabel As Single, Top As Single,
çàëèâêè. Âîçâðàùàåò
Width As Single, Height As
Shape-îáúåêò, êîòîðûé
Single) As Shape
ïðåäñòàâëÿåò ýòó íîâóþ íàäïèñü.
Êîãäà ïðèìåíÿåòñÿ ê îáúåêòó
AddLine(BeginX As Single,
êîëëåêöèè Shapes, âîçâðàùàåò
BeginY As Single, EndX As
AddLine Shape-îáúåêò, êîòîðûé
Single, EndY As Single) As
ïðåäñòàâëÿåò íîâóþ ëèíèþ
Shape
â ýëåêòðîííîé òàáëèöå.
AddOLEObject([ClassType],
[Filename], [Link],
Ñîçäàåò OLE-îáúåêò.
[DisplayAsIcon],
Âîçâðàùàåò Shape îáúåêò,
AddOLEObject [IconFileName],
êîòîðûé ïðåäñòàâëÿåò ýòîò
[IconIndex], [IconLabel],
íîâûé OLE-îáúåêò.
[Left], [Top], [Width],
[Height]) As Shape
AddPicture(Filename As
String, LinkToFile As
Ñîçäàåò êàðòèíêó èç
MsoTriState,
ñóùåñòâóþùåãî ôàéëà.
SaveWithDocument As
AddPicture Âîçâðàùàåò Shape-îáúåêò,
MsoTriState, Left As
êîòîðûé ïðåäñòàâëÿåò íîâóþ
Single, Top As Single,
êàðòèíêó.
Width As Single, Height As
Single) As Shape
Ñîçäàåò ëîìàíóþ ëèíèþ èëè
ìíîãîóãîëüíèê. Âîçâðàùàåò
AddPolyline(SafeArrayOfPoi
AddPolyline Shape-îáúåêò, êîòîðûé
nts) As Shape
ïðåäñòàâëÿåò íîâóþ ëîìàíóþ
ëèíèþ èëè ìíîãîóãîëüíèê.
Ñîçäàåò ïðèêðåïëåííóþ
AddTextbox(Orientation As òåêñòîâóþ ðàìêó â âèäå
MsoTextOrientation, Left ïðÿìîóãîëüíèêà ñ íåâèäèìûìè
AddTextbox As Single, Top As Single, ãðàíèöàìè è áåç çàëèâêè.
Width As Single, Height As Âîçâðàùàåò Shape-îáúåêò,
Single) As Shape êîòîðûé ïðåäñòàâëÿåò íîâóþ
òåêñòîâóþ ðàìêó.
Ââåäåíèå â îáúåêòû è êîëëåêöèè 261

Ìåòîä Ñèíòàêñèñ Íàçíà÷åíèå


AddTextEffect(PresetTextEf
fect As
MsoPresetTextEffect, Text
As String, FontName As Ñîçäàåò WordArt-îáúåêò.
String, FontSize As Âîçâðàùàåò Shape-îáúåêò,
AddTextEffect
Single, FontBold As êîòîðûé ïðåäñòàâëÿåò íîâûé
MsoTriState, FontItalic As WordArt-îáúåêò.
MsoTriState, Left As
Single, Top As Single) As
Shape
PowerPoint:
AddCallout(Type As
Ñîçäàåò íå èìåþùóþ ãðàíèö
MsoCalloutType, Left As
âûíîñêó. Âîçâðàùàåò
AddCallout Single, Top As Single,
Shape-îáúåêò, ïðåäñòàâëÿþùèé
Width As Single, Height As
ýòó íîâóþ âûíîñêó
Single) As Shape
AddComment([Left As Single
Äîáàâëÿåò êîììåíòàðèé.
= 1], [Top As Single = 1],
Âîçâðàùàåò Shape-îáúåêò,
AddComment [Width As Single = 145],
êîòîðûé ïðåäñòàâëÿåò íîâûé
[Height As Single = 145])
êîììåíòàðèé.
As Shape
Ñîçäàåò ñîåäèíèòåëüíóþ
ëèíèþ. Âîçâðàùàåò
AddConnector(Type As
Shape-îáúåêò, êîòîðûé
MsoConnectorType, BeginX
ïðåäñòàâëÿåò íîâóþ
AddConnector As Single, BeginY As
ñîåäèíèòåëüíóþ ëèíèþ. Êîãäà
Single, EndX As Single,
äîáàâëÿåòñÿ ñîåäèíèòåëüíàÿ
EndY As Single) As Shape
ëèíèÿ, îíà íå ñîåäèíåíà íè
ñ ÷åì.
Ñîçäàåò êðèâóþ Áåçüå.
AddCurve(SafeArrayOfPoints Âîçâðàùàåò Shape-îáúåêò,
AddCurve
) As Shape êîòîðûé ïðåäñòàâëÿåò íîâóþ
êðèâóþ.
AddDiagram(Type As Âîçâðàùàåò Shape-îáúåêò,
MsoDiagramType, Left As êîòîðûé ïðåäñòàâëÿåò
AddDiagram Single, Top As Single, äèàãðàììó, âñòàâëåííóþ
Width As Single, Height As â ñëàéä, master-ñëàéä èëè slide
Single) As Shape range-ñëàéä.
Ñîçäàåò íàäïèñü â âèäå
AddLabel(Orientation As
ïðÿìîóãîëüíèêà ñ íåâèäèìûìè
MsoTextOrientation, Left
ãðàíèöàìè è áåç çàëèâêè.
AddLabel As Single, Top As Single,
Âîçâðàùàåò Shape-îáúåêò,
Width As Single, Height As
êîòîðûé ïðåäñòàâëÿåò ýòó
Single) As Shape
íîâóþ íàäïèñü.
AddLine(BeginX As Single,
Ñîçäàåò ëèíèþ. Âîçâðàùàåò
BeginY As Single, EndX As
AddLine Shape-îáúåêò, êîòîðûé
Single, EndY As Single) As
ïðåäñòàâëÿåò ýòó íîâóþ ëèíèþ.
Shape
262 Ãëàâà 6

Ìåòîä Ñèíòàêñèñ Íàçíà÷åíèå


AddMediaObject(FileName As
Ñîçäàåò media-îáúåêò.
String, [Left As Single],
Âîçâðàùàåò Shape-îáúåêò,
AddMediaObject [Top As Single], [Width As
êîòîðûé ïðåäñòàâëÿåò íîâûé
Single = –1], [Height As
media-îáúåêò.
Single = –1]) As Shape
AddOLEObject([Left As
Single], [Top As Single],
[Width As Single = –1],
[Height As Single = –1],
[ClassName As String],
Ñîçäàåò OLE-îáúåêò.
[FileName As String],
Âîçâðàùàåò Shape-îáúåêò,
AddOLEObject [DisplayAsIcon As
êîòîðûé ïðåäñòàâëÿåò íîâûé
MsoTriState],
OLE-îáúåêò.
[IconFileName As String],
[IconIndex As Long],
[IconLabel As String],
[Link As MsoTriState]) As
Shape
AddPicture(FileName As
String, LinkToFile As
MsoTriState, Ñîçäàåò êàðòèíêó èç
SaveWithDocument As ñóùåñòâóþùåãî ôàéëà.
AddPicture MsoTriState, Left As Âîçâðàùàåò Shape-îáúåêò,
Single, Top As Single, êîòîðûé ïðåäñòàâëÿåò íîâóþ
[Width As Single = –1], êàðòèíêó.
[Height As Single = –1])
As Shape
AddPlaceholder(Type As
Âîññòàíàâëèâàåò ðàíåå
PpPlaceholderType,
óäàëåííîå ïîëå äëÿ òåêñòà èëè
[Left As Single = –1],
ãðàôè÷åñêîãî îáúåêòà íà ñëàéäå.
AddPlaceholder [Top As Single = –1],
Âîçâðàùàåò Shape-îáúåêò,
[Width As Single = –1],
êîòîðûé ïðåäñòàâëÿåò ýòî
[Height As Single = –1])
âîññòàíîâëåííîå ïîëå.
As Shape
Ñîçäàåò ëîìàíóþ ëèíèþ èëè
ìíîãîóãîëüíèê. Âîçâðàùàåò
AddPolyline(SafeArrayOfPoi
AddPolyline Shape-îáúåêò, êîòîðûé
nts) As Shape
ïðåäñòàâëÿåò íîâóþ ëîìàíóþ
ëèíèþ èëè ìíîãîóãîëüíèê.
AddShape(Type As Ñîçäàåò àâòîôèãóðó
MsoAutoShapeType, Left As (AutoShape). Âîçâðàùàåò
AddShape Single, Top As Single, Shape-îáúåêò, êîòîðûé
Width As Single, Height As ïðåäñòàâëÿåò ýòó íîâóþ
Single) As Shape àâòîôèãóðó.
Ââåäåíèå â îáúåêòû è êîëëåêöèè 263

Ìåòîä Ñèíòàêñèñ Íàçíà÷åíèå


AddTable(NumRows As Long,
NumColumns As Long, [Left As
Single = –1], [Top As Single Äîáàâëÿåò îáúåêò-òàáëèöó
AddTable
= –1], [Width As Single = â ñëàéä.
–1], [Height As Single =
–1]) As Shape
Ñîçäàåò ïðèêðåïëåííóþ
AddTextbox(Orientation As òåêñòîâóþ ðàìêó â âèäå
MsoTextOrientation, Left ïðÿìîóãîëüíèêà ñ íåâèäèìûìè
AddTextbox As Single, Top As Single, ãðàíèöàìè è áåç çàëèâêè.
Width As Single, Height As Âîçâðàùàåò Shape-îáúåêò,
Single) As Shape êîòîðûé ïðåäñòàâëÿåò íîâóþ
òåêñòîâóþ ðàìêó.
AddTextEffect(PresetTextEf
fect As
MsoPresetTextEffect, Text
As String, FontName As Ñîçäàåò WordArt-îáúåêò.
String, FontSize As Âîçâðàùàåò Shape-îáúåêò,
AddTextEffect
Single, FontBold As êîòîðûé ïðåäñòàâëÿåò íîâûé
MsoTriState, FontItalic As WordArt-îáúåêò.
MsoTriState, Left As
Single, Top As Single) As
Shape
Âîññòàíàâëèâàåò ðàíåå
óäàëåííîå çàãëàâèå ñëàéäà.
AddTitle AddTitle() As Shape Âîçâðàùàåò Shape-îáúåêò,
êîòîðûé ïðåäñòàâëÿåò
âîññòàíîâëåííîå çàãëàâèå.

Ôèãóðû êîëëåêöèè Shapes ïîñëå èõ äîáàâëåíèÿ â êîëëåêöèþ ìîæíî ðåäàê-


òèðîâàòü: ïåðåìåùàòü, óäàëÿòü, èçìåíÿòü ðàçìåðû, èçìåíÿòü âíåøíèé âèä
(êàê ýòî, íàïðèìåð, äåëàåòñÿ â êîäå ëèñòèíãà 6.9), äîáàâëÿòü â íèõ òåêñò. Ðå-
äàêòèðîâàíèå ôèãóð îñóùåñòâëÿåòñÿ èçìåíåíèåì èõ ñâîéñòâ. Îáúåêòû êîëëåê-
öèè Shapes îáëàäàþò êàê îáùèìè (Left, Top, Height è Width), òàê è ñïåöè-
ôè÷åñêèìè (çàâèñÿùèìè îò òèïà îáúåêòà) ñâîéñòâàìè. Íàïðèìåð, êîä ëèñòèí-
ãà 6.10 ñíà÷àëà äîáàâëÿåò îáúåêò clock.avi ê ïåðâîìó ñëàéäó ïðåçåíòàöèè,
à çàòåì (ñòðîêè 12–15) èçìåíÿåò åãî âûñîòó (ñâîéñòâî Height) è øèðèíó (ñâîé-
ñòâî Width). Ðåçóëüòàò ðàáîòû êîäà ëèñòèíãà 6.10 ïðåäñòàâëåí íà ðèñ. 6.11.

Ëèñòèíã 6.9. Èçìåíåíèå ñâîéñòâ ôèãóðû êîëëåêöèè Shapes


1: Sub ActDocumShapesRange()
2: 'Èñïîëüçîâàíèå êîëëåêöèè ShapesRange
3:
4: 'âûäåëèòü âñå ôèãóðû êîëëåêöèè:
5: ActiveDocument.Shapes.SelectAll
6:
7: With ActiveDocument.Shapes(2)
8: .Height = 200
9: .Width = 200
10: End With
264 Ãëàâà 6

11:
12: End Sub

Ëèñòèíã 6.10. Èçìåíåíèå ñâîéñòâ ôèãóðû êîëëåêöèè Shapes


1: Sub PropertyChanging()
2: 'äîáàâëåíèå îáúåêòà ê êîëëåêöèè Shapes
3: 'è èçìåíåíèå åãî ðàçìåðîâ
4:
5: Set myDocument = ActivePresentation.Slides(1)
6:
7: 'äîáàâèòü îáúåêò ê êîëëåêöèè Shapes:
8: myDocument.Shapes.AddMediaObject FileName:="g:\windows\clock.avi", _
9: Left:=5, Top:=5, Width:=100, Height:=100
10:
11: 'èçìåíåíèå ðàçìåðîâ îáúåêòà:
12: With myDocument.Shapes(3)
13: .Height = 200
14: .Width = 200
15: End With
16:
17: End Sub

Ðèñ. 6.9. Äîáàâëåííûå ê êîëëåêöèè Shapes ôèãóðû îòîáðàæåíû â òåêóùåì äîêóìåíòå

Êîä ëèñòèíãà 6.11 ïðè äîáàâëåíèè ê êîëëåêöèè Shapes ïðÿìîóãîëüíèêà


ïîìåùàåò â íåãî òåêñò. Ðåçóëüòàò ðàáîòû êîäà ëèñòèíãà 6.11 (â Excel) ïðåä-
ñòàâëåí íà ðèñ. 6.12.

Ëèñòèíã 6.11. Èçìåíåíèå ñâîéñòâ ôèãóðû êîëëåêöèè Shapes


1: Sub PropertyChanging2()
Ââåäåíèå â îáúåêòû è êîëëåêöèè 265

2: 'äîáàâëåíèå ïðÿìîóãîëüíèêà ê êîëëåêöèè Shapes


3: 'è çàíåñåíèå â íåãî òåêñòà
4:
5: Set myDocument = Worksheets(1)
6:
7: With myDocument.Shapes.AddShape(msoShapeRectangle, _
8: 0, 0, 100, 40).TextFrame
9: .Characters.Text = “Ïðèìåð òåêñòà âíóòðè ïðÿìîóãîëüíèêà”
10: .MarginBottom = 10
11: .MarginLeft = 10
12: .MarginRight = 10
13: .MarginTop = 10
14: End With
15: End Sub

Ðèñ. 6.10. Äîáàâëåííûå ê êîëëåêöèè Shapes ôèãóðû çàêðàøåíû êîäîì ëèñòèíãà 6.8

Èñïîëüçîâàíèå Object Browser äëÿ ðàáîòû


ñ îáúåêòàìè, ìåòîäàìè è ñâîéñòâàìè
Âû óæå çíàåòå, êàê èñïîëüçîâàòü Object Browser äëÿ íàõîæäåíèÿ è ïîëó÷å-
íèÿ ñïðàâêè VBA è ôóíêöèé host-ïðèëîæåíèé, ïðîöåäóð è êîíñòàíò. Ïîäîá-
íûì îáðàçîì Object Browser èñïîëüçóåòñÿ ñ îáúåêòàìè, ìåòîäàìè è ñâîéñòâà-
ìè; â äåéñòâèòåëüíîñòè, îñíîâíîå íàçíà÷åíèå èíñòðóìåíòà Object Browser (êàê
ïðåäïîëàãàåò åãî èìÿ) — ýòî îáåñïå÷èâàòü âîçìîæíîñòü ïðîñìîòðà âñåõ äîñ-
òóïíûõ îáúåêòîâ (ñ èõ ðàçëè÷íûìè ìåòîäàìè è ñâîéñòâàìè) â VBA è host-ïðè-
ëîæåíèè.
Âû óæå çíàåòå, êàê çàïóñòèòü Object Browser: ùåëêíèòå íà êíîïêå Object
Browser íà ïàíåëè èíñòðóìåíòîâ Visual Basic èëè âûáåðèòå êîìàíäó View | Object
266 Ãëàâà 6

Browser (Âèä | Ïðîñìîòð îáúåêòîâ) äëÿ îòîáðàæåíèÿ îêíà Object Browser


(ðèñ. 6.13).
Ðèñ. 6.11
Èçìåíåíèå
ðàçìåðîâ îáúåêòà
êîëëåêöèè Shapes
êîäîì ëèñòèíãà 6.10

×òîáû ïðîñìîòðåòü ñïèñîê äîñòóïíûõ îáúåêòîâ host-ïðèëîæåíèÿ è ïðî-


ñìîòðåòü ñïèñîê ñâîéñòâ è ìåòîäîâ äëÿ êàæäîãî çàäàííîãî îáúåêòà, âûïîëíèòå
ñëåäóþùèå øàãè:
w Âûáåðèòå áèáëèîòåêó host-ïðèëîæåíèÿ â ðàñêðûâàþùåìñÿ ñïèñêå
Project/Library (Ïðîåêò | Áèáëèîòåêà) â âåðõíåé ÷àñòè îêíà Object Browser.
Íà ðèñ. 6.13 ïîêàçàíî îòêðûòîå îêíî Object Browser â ñåàíñå ðàáîòû Ðå-

Ðèñ. 6.12
Ââîä òåêñòà äëÿ
îáúåêòà êîëëåêöèè
Shapes êîäîì
ëèñòèíãà 6.11
Ââåäåíèå â îáúåêòû è êîëëåêöèè 267

äàêòîðà VB â Excel; áèáëèîòåêà Excel óæå âûáðàíà â ðàñêðûâàþùåìñÿ


ñïèñêå Project/Library. Ïîñëå âûáîðà host-ïðèëîæåíèÿ â ñïèñêå
Project/Library ñïèñîê Classes (Êëàññû) ñîäåðæèò âñå äîñòóïíûå äëÿ VBA
îáúåêòû host-ïðèëîæåíèÿ.
w  ñïèñêå Classes âûáåðèòå îáúåêò, ìåòîäû è ñâîéñòâà êîòîðîãî âàñ èí-
òåðåñóþò. Íà ðèñ. 6.13 ïîêàçàíà êîëëåêöèÿ Workbooks.
w ×òîáû ïîëó÷èòü áîëåå ïîäðîáíóþ èíôîðìàöèþ îá îáúåêòå, âûáðàííîì
âàìè â ñïèñêå Classes, ùåëêíèòå íà êíîïêå ñî çíàêîì âîïðîñà (?)
(â âåðõíåé ïðàâîé ÷àñòè îêíà Object Browser) äëÿ äîñòóïà ê ñïðàâî÷íîé
ñèñòåìå VBA. Ïîñëå âûáîðà îáúåêòà â ñïèñêå Classes ñïèñîê Members of
<class> (Êîìïîíåíò <êëàññ>) â îêíå Object Browser îòîáðàæàåò âñå ìåòî-
äû è ñâîéñòâà äëÿ ýòîãî îáúåêòà.
w  ñïèñêå Members of<class> âûáåðèòå íóæíûé âàì ìåòîä èëè ñâîéñòâî.
Object Browser òåïåðü îòîáðàæàåò èìÿ ìåòîäà èëè ñâîéñòâà â íèæíåé
÷àñòè îêíà; ïðè âûáîðå ìåòîäà, èìåþùåãî àðãóìåíòû, Object Browser
ïåðå÷èñëÿåò òàêæå âñå àðãóìåíòû ìåòîäà. Íà ðèñ. 6.13 ïîêàçàí âû-
áðàííûé ìåòîä Add êîëëåêöèè Workbooks.
w Ùåêíèòå íà êíîïêå ñ âîïðîñèòåëüíûì çíàêîì â îêíå Object Browser äëÿ
äîñòóïà ê ñïðàâî÷íîé ñèñòåìå VBA ñ öåëüþ ïîëó÷åíèÿ ïîäðîáíîé èí-
ôîðìàöèè î ìåòîäå èëè ñâîéñòâå, âûáðàííîì â ñïèñêå Members
of<class>.

×òîáû âû ìîãëè ðàçëè÷àòü ìåòîäû è ñâîéñòâà â ñïèñêå Members of <class>,


Object Browser îòîáðàæàåò îñîáûå çíà÷êè ñëåâà îò êàæäîãî ýëåìåíòà â ñïèñêå.
Ñâîéñòâà îáîçíà÷àþòñÿ çíà÷êîì ñ èçîáðàæåíèåì ðóêè, óêàçûâàþùåé íà èí-
äåêñíóþ êàðòó. Ìåòîäû îáîçíà÷àþòñÿ çíà÷êîì, ïîõîæèì íà çåëåíûé ïðÿìî-
óãîëüíèê. Ñèíèé «ìÿ÷èê» îáîçíà÷àåò, ÷òî ñâîéñòâî èëè ìåòîä ÿâëÿåòñÿ ãëî-
áàëüíî äîñòóïíûì.

Ðèñ. 6.13
Èñïîëüçóéòå Object Browser äëÿ îïðåäåëåíèÿ
òîãî, êàêèå îáúåêòû
äîñòóïíû è êàêèå ñâîéñòâà è ìåòîäû
ïðèíàäëåæàò îïðåäåëåííîìó îáúåêòó

 çàêëþ÷åíèå îòìåòèì, ÷òî ïî óìîë÷àíèþ VBA ïðåäëàãàåò âàì íå âñå îáú-


åêòû, ñ êîòîðûìè âû ìîæåòå ðàáîòàòü. Èç ëþáîïûòñòâà è äëÿ áîëåå ãëóáîêîãî
èçó÷åíèÿ îòêðûâàþùèõñÿ ïåðåä âàìè âîçìîæíîñòåé îòêðîéòå îêíî References
(ìåíþ Tools | References) â Ðåäàêòîðå VBA ëþáîãî ïðèëîæåíèÿ (ðèñ. 6.14).
268 Ãëàâà 6

Ðèñ. 6.14
 îêíå Available References
îòìå÷åíû ÷åòûðå áèáëèîòåêè
îáúåêòîâ, ê îáúåêòàì êîòîðûõ âû
èìååòå äîñòóï ïî óìîë÷àíèþ — îíè
ïîäêëþ÷åíû

 îêíå Available References îòìå÷åíû ÷åòûðå áèáëèîòåêè îáúåêòîâ, ê îáúåê-


òàì êîòîðûõ âû èìååòå äîñòóï ïî óìîë÷àíèþ — îíè ïîäêëþ÷åíû. Âñå îñòàëü-
íûå ïîêà íå ïîäêëþ÷åíû, íî «æäóò», êîãäà ìîãóò ïîíàäîáèòüñÿ âàì.
Ïîâòîðåíèå äåéñòâèé
7
â Visual Basic: öèêëû
è ìàññèâû
Ó íàñ îñòàëàñü, ïîæàëóé, ïîñëåäíÿÿ òåìà, áåç êîòîðîé ïîêà åùå íåâîçìîæ-
íî ïèñàòü äåéñòâèòåëüíî ïîëåçíûå (íî ïîêà åùå òîëüêî ïðîñòûå) ïðîãðàììû
íà ÿçûêå VBA. Òåïåðü, êîãäà âû, âîçìîæíî, íàó÷èëèñü âûáèðàòü ðàçëè÷íûå
äåéñòâèÿ íà îñíîâå ïðåäîïðåäåëåííûõ óñëîâèé, âû óçíàåòå, ÷òî íåîáõîäèìî äå-
ëàòü, ÷òîáû ïðîöåäóðû VBA ïîâòîðÿëè äåéñòâèÿ çàäàííîå êîëè÷åñòâî ðàç èëè
ïîêà âûïîëíÿåòñÿ (èëè íå âûïîëíÿåòñÿ) íåêîòîðîå óñëîâèå. Â ýòîé ãëàâå òàê-
æå îïèñûâàþòñÿ ìàññèâû. Ìàññèâû ÿâëÿþòñÿ ðàñïðîñòðàíåííûì è ïîëåçíûì
ñïîñîáîì ñîõðàíåíèÿ ìíîãèõ ðàçëè÷íûõ ÷àñòåé ñâÿçàííûõ äàííûõ. Ìàññèâû
ïîëåçíû ïðè ñîçäàíèè îòñîðòèðîâàííûõ è íåîòñîðòèðîâàííûõ ñïèñêîâ äàí-
íûõ, ïðè ñîõðàíåíèè òàáëèö äàííûõ è äëÿ âûïîëíåíèÿ ìíîãèõ äðóãèõ çàäà÷.
Öèêëû — ýòî ïðîãðàììíûå êîíñòðóêöèè, áåç êîòîðûõ îáðàáîòêà ìàññèâîâ
áûëà áû äîâîëüíî çàòðóäíèòåëüíîé.

Êîìàíäû îðãàíèçàöèè öèêëîâ


Êàê óæå âàì ñòàëî ÿñíî, ìàêðîðåêîðäåð ïîçâîëÿåò çàïèñûâàòü íå âñå íåîá-
õîäèìûå ïîëüçîâàòåëþ äåéñòâèÿ. Îñîáåííî ýòî íàãëÿäíî ïîêàçàíî íà ïðèìåðå
îïåðàòîðîâ, èçìåíÿþùèõ ïîðÿäîê âûïîëíåíèÿ êîäà ïðîöåäóð è ôóíêöèé. Òî
æå ñàìîå îòíîñèòñÿ è ê òàêèì îïåðàòîðàì, êîòîðûå ïîçâîëÿþò îðãàíèçîâàòü
öèêëè÷åñêîå ïîâòîðåíèå âûïîëíåíèÿ íåêîòîðûõ ÷àñòåé êîäà VBA.
Äëÿ îðãàíèçàöèè öèêëîâ VBA ïðåäîñòàâëÿåò íåñêîëüêî ìîùíûõ è ãèáêèõ
ñòðóêòóð, ïîçâîëÿþùèõ ëåãêî ïîâòîðÿòü ðàçëè÷íûå äåéñòâèÿ. Ïðîãðàììíûå
ñòðóêòóðû, ïðèâîäÿùèå ê íåîäíîêðàòíîìó ïîâòîðåíèþ îäíîãî èëè íåñêîëü-
êèõ îïåðàòîðîâ, íàçûâàþòñÿ ñòðóêòóðàìè îðãàíèçàöèè öèêëîâ, ïîòîìó ÷òî
ïîòîê âûïîëíåíèÿ îïåðàòîðîâ ïðîöåäóðû ïðîõîäèò öèêëè÷íî ïî îäíèì è òåì
æå îïåðàòîðàì è îáû÷íî íåîäíîêðàòíî.
Ïðîöåññ âûïîëíåíèÿ âñåõ îïåðàòîðîâ, çàêëþ÷åííûõ â ñòðóêòóðó öèêëà,
îäèí ðàç íàçûâàåòñÿ èòåðàöèåé (iteration) öèêëà. Íåêîòîðûå ñòðóêòóðû öèêëà
îðãàíèçóþòñÿ òàê, ÷òî îíè âñåãäà âûïîëíÿþòñÿ çàäàííîå êîëè÷åñòâî ðàç.
Ñòðóêòóðû öèêëà, âñåãäà âûïîëíÿþùèåñÿ çàäàííîå êîëè÷åñòâî ðàç, íàçûâà-
þòñÿ öèêëàìè ñ ôèêñèðîâàííûì ÷èñëîì èòåðàöèé (fixed iteration). Äðóãèå
òèïû ñòðóêòóð öèêëà ïîâòîðÿþòñÿ ïåðåìåííîå êîëè÷åñòâî ðàç â çàâèñèìîñòè
270 Ãëàâà 7

îò íåêîòîðîãî íàáîðà óñëîâèé. Ïîñêîëüêó êîëè÷åñòâî ðàç ïîâòîðåíèé ýòèõ ãèá-


êèõ ñòðóêòóð öèêëà ÿâëÿåòñÿ íåîïðåäåëåííûì, òàêèå öèêëû íàçûâàþòñÿ íå-
îïðåäåëåííûìè öèêëàìè (indefinite loops).
Ñóùåñòâóþò äâà îñíîâíûõ ñïîñîáà ñîçäàíèÿ íåîïðåäåëåííîãî öèêëà. Ìîæ-
íî ïîñòðîèòü öèêë òàê, ÷òî VBA áóäåò òåñòèðîâàòü íåêîòîðîå óñëîâèå (äåòåð-
ìèíàíò öèêëà) ïåðåä âûïîëíåíèåì öèêëà: åñëè óñëîâèå äëÿ ïîâòîðåíèÿ öèêëà
íå ðàâíî True, VBA ïðîïóñêàåò âñå îïåðàòîðû â öèêëå è ïðåêðàùàåò öèêë.
Ìîæíî òàêæå ïîñòðîèòü öèêë òàêèì îáðàçîì, ÷òî VBA áóäåò òåñòèðîâàòü óñëî-
âèå äåòåðìèíàíòà öèêëà ïîñëå âûïîëíåíèÿ îïåðàòîðîâ â öèêëå.
Äëÿ öèêëà, â êîòîðîì äåòåðìèíàíò ïðîâåðÿåòñÿ ïåðåä âûïîëíåíèåì îïåðà-
òîðîâ âíóòðè öèêëà, VBA îïðåäåëÿåò ñëåäóþùóþ ïîñëåäîâàòåëüíîñòü äåéñò-
âèé:
w  âåðõíåé ÷àñòè öèêëà òåñòèðóåòñÿ óñëîâèå äåòåðìèíàíòà.
w Åñëè óñëîâèÿ äëÿ âûïîëíåíèÿ öèêëà óäîâëåòâîðÿþòñÿ, âûïîëíÿþòñÿ
îïåðàòîðû âíóòðè öèêëà.
w Ïîñëå âûïîëíåíèÿ ïîñëåäíåãî îïåðàòîðà âíóòðè öèêëà VBA âîçâðàùà-
åòñÿ ê íà÷àëó öèêëà è ñíîâà îöåíèâàåò óñëîâèå äåòåðìèíàíòà öèêëà.
w Åñëè óñëîâèÿ äëÿ âûïîëíåíèÿ öèêëà âñå åùå óäîâëåòâîðÿþòñÿ, VBA
ïîâòîðÿåò îïåðàòîðû âíóòðè öèêëà è ñíîâà âîçâðàùàåòñÿ ê íà÷àëó
öèêëà äëÿ òåñòèðîâàíèÿ äåòåðìèíàíòà.
w Êàê òîëüêî óñëîâèÿ äëÿ âûïîëíåíèÿ öèêëà ïåðåñòàíóò óäîâëåòâîðÿòü-
ñÿ, VBA îñòàíàâëèâàåò âûïîëíåíèå öèêëà è íà÷èíàåò âûïîëíåíèå îïå-
ðàòîðîâ ïîñëå öèêëà.
Çàìåòüòå, ÷òî åñëè óñëîâèÿ äëÿ âûïîëíåíèÿ öèêëà íå óäîâëåòâîðÿþòñÿ, êî-
ãäà VBA òåñòèðóåò óñëîâèå äåòåðìèíàíòà öèêëà ïåðâûé ðàç, VBA íå âûïîëíÿ-
åò îïåðàòîðû âíóòðè öèêëà íè ðàçó; ïðè ýòîì òåëî öèêëà ïðîïóñêàåòñÿ (íå âû-
ïîëíÿåòñÿ). Òåëî (body) öèêëà — ýòî áëîê îïåðàòîðîâ VBA, íàõîäÿùèéñÿ ìåæ-
äó íà÷àëîì è êîíöîì öèêëà.
Äëÿ öèêëà, â êîòîðîì äåòåðìèíàíò ïðîâåðÿåòñÿ ïîñëå âûïîëíåíèÿ îïåðàòî-
ðîâ â òåëå öèêëà, VBA îïðåäåëÿåò ñëåäóþùóþ ïîñëåäîâàòåëüíîñòü äåéñòâèé:
w Âûïîëíÿþòñÿ âñå îïåðàòîðû â òåëå öèêëà.
w Ïðè äîñòèæåíèè êîíöà òåëà öèêëà, VBA îöåíèâàåò óñëîâèå äåòåðìè-
íàíòà öèêëà.
w Åñëè óñëîâèÿ äëÿ âûïîëíåíèÿ öèêëà óäîâëåòâîðÿþòñÿ, VBA âîçâðà-
ùàåòñÿ ê íà÷àëó öèêëà è ïîâòîðÿåò èíñòðóêöèè â òåëå öèêëà.
w  êîíöå öèêëà VBA ñíîâà òåñòèðóåò óñëîâèå äåòåðìèíàíòà öèêëà.
w Êàê òîëüêî óñëîâèÿ äëÿ âûïîëíåíèÿ öèêëà áîëüøå íå óäîâëåòâîðÿþò-
ñÿ, VBA ïðåêðàùàåò âûïîëíåíèå öèêëà è íà÷èíàåò âûïîëíåíèå îïåðà-
òîðîâ ïîñëå öèêëà.
Çàìåòüòå, ÷òî VBA âûïîëíÿåò îïåðàòîðû â òàêîì öèêëå, ïî êðàéíåé ìåðå,
îäèí ðàç.
Ìîæíî òàêæå ñîçäàòü íåîïðåäåëåííûé öèêë òàêèì îáðàçîì, ÷òîáû îí âîîá-
ùå íå èìåë óñëîâèÿ äåòåðìèíàíòà; öèêëû, íå èìåþùèå óñëîâèÿ äåòåðìèíàí-
òà, ïîâòîðÿþòñÿ áåñêîíå÷íî è íàçûâàþòñÿ áåñêîíå÷íûìè öèêëàìè (infinite
loops). Áåñêîíå÷íûé öèêë íå çàêàí÷èâàåòñÿ íèêîãäà; áîëüøèíñòâî áåñêîíå÷-
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 271

íûõ öèêëîâ ÿâëÿþòñÿ ðåçóëüòàòîì îøèáîê ïðîãðàììèðîâàíèÿ, õîòÿ èìååòñÿ


íåñêîëüêî ñëó÷àåâ, êîãäà óäîáíî èñïîëüçîâàòü áåñêîíå÷íûå öèêëû.

Ïîâòîðåíèå öèêëà ôèêñèðîâàííîå ÷èñëî ðàç:


öèêëû For
Ñàìîé ïðîñòîé ñòðóêòóðîé öèêëà ÿâëÿåòñÿ ôèêñèðîâàííûé öèêë. VBA ïðå-
äîñòàâëÿåò äâå ðàçëè÷íûå ñòðóêòóðû ôèêñèðîâàííîãî öèêëà: For…Next è For
Each…Next. Îáå ñòðóêòóðû ôèêñèðîâàííîãî öèêëà íàçûâàþòñÿ öèêëàìè For,
ïîòîìó ÷òî îíè âñåãäà âûïîëíÿþòñÿ äëÿ (for) çàäàííîãî êîëè÷åñòâà ðàç.

Èñïîëüçîâàíèå öèêëà For…Next


Ïåðâûé èç VBA-öèêëîâ For — ýòî öèêë For…Next. Èñïîëüçóéòå öèêë
For…Next, êîãäà âàì íåîáõîäèìî ïîâòîðèòü äåéñòâèå èëè ðÿä äåéñòâèé çàäàí-
íîå êîëè÷åñòâî ðàç, èçâåñòíîå äî íà÷àëà âûïîëíåíèÿ öèêëà.
Öèêë For…Next èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
For counter = Start To End [Step StepSize]
Statements
Next [counter]
Çäåñü counter — ëþáàÿ ÷èñëåííàÿ ïåðåìåííàÿ VBA, îáû÷íî — ïåðåìåííàÿ òèïà
Integer èëè Long; Start — ëþáîå ÷èñëåííîå âûðàæåíèå è îïðåäåëÿåò íà÷àëüíîå
çíà÷åíèå äëÿ ïåðåìåííîé counter; End — ýòî òàêæå ÷èñëåííîå âûðàæåíèå, îïðåäå-
ëÿåò êîíå÷íîå çíà÷åíèå äëÿ ïåðåìåííîé counter (ñì. ñõåìó 7.1).

Ïî óìîë÷àíèþ VBA óâåëè÷èâàåò ïåðåìåííóþ counter íà 1 êàæäûé ðàç ïðè


âûïîëíåíèè îïåðàòîðîâ â öèêëå (ñ÷èòàåò êîëè÷åñòâî öèêëîâ). Ìîæíî çàäàâàòü
äðóãîå çíà÷åíèå (StepSize), íà êîòîðîå áóäåò èçìåíÿòüñÿ counter, âêëþ÷àÿ íå-
îáÿçàòåëüíîå êëþ÷åâîå ñëîâî Step. Ïðè âêëþ÷åíèè êëþ÷åâîãî ñëîâà Step íå-
îáõîäèìî çàäàâàòü çíà÷åíèå äëÿ èçìåíåíèÿ ïåðåìåííîé counter.  óêàçàííîé
ñèíòàêñè÷åñêîé êîíñòðóêöèè StepSize ïðåäñòàâëÿåò ëþáîå ÷èñëåííîå âûðàæå-
íèå è îïðåäåëÿåò çíà÷åíèå äëÿ èçìåíåíèÿ ïåðåìåííîé counter.
Statements ïðåäñòàâëÿåò îäèí, íåñêîëüêî èëè íè îäíîãî îïåðàòîðà VBA.
Ýòè îïåðàòîðû ñîñòàâëÿþò òåëî öèêëà For; VBA âûïîëíÿåò êàæäûé èç ýòèõ
îïåðàòîðîâ ïðè êàæäîì âûïîëíåíèè öèêëà.
Êëþ÷åâîå ñëîâî Next ñîîáùàåò VBA î òîì, ÷òî äîñòèãíóò êîíåö öèêëà; íå-
îáÿçàòåëüíàÿ ïåðåìåííàÿ counter ïîñëå êëþ÷åâîãî ñëîâà Next äîëæíà áûòü
òîé æå ñàìîé ïåðåìåííîé counter, êîòîðàÿ áûëà çàäàíà ïîñëå êëþ÷åâîãî ñëîâà
For â íà÷àëå ñòðóêòóðû öèêëà. Âêëþ÷àéòå íåîáÿçàòåëüíóþ ïåðåìåííóþ
counter ïîñëå êëþ÷åâîãî ñëîâà Next äëÿ óëó÷øåíèÿ ÷èòàáåëüíîñòè ïðîãðàìì-
íîãî êîäà (îñîáåííî ïðè èñïîëüçîâàíèè âëîæåííûõ öèêëîâ For…Next) è äëÿ
ïîâûøåíèÿ ñêîðîñòè âûïîëíåíèÿ êîäà (èíà÷å VBA ïðèäåòñÿ ïîòðàòèòü âðåìÿ
íà îïðåäåëåíèå òîãî, êàêàÿ ïåðåìåííàÿ counter ÿâëÿåòñÿ ïðàâèëüíîé, äëÿ åå
èçìåíåíèÿ ïîñëå äîñòèæåíèÿ êëþ÷åâîãî ñëîâà Next).
Ïðè âûïîëíåíèè öèêëà For…Next VBA ïîñòóïàåò ñëåäóþùèì îáðàçîì:
w Ïðèñâàèâàåò çíà÷åíèå, ïðåäñòàâëåííîå Star, ïåðåìåííîé counter.
272 Ãëàâà 7

w Âûïîëíÿåò âñå îïåðàòîðû, ïðåäñòàâëåííûå ñ ïîìîùüþ Statements,


ïîêà íå äîñòèãíåò êëþ÷åâîãî ñëîâà Next. Êëþ÷åâîå ñëîâî Next óêàçû-
âàåò VBA íà òî, ÷òî äîñòèãíóò êîíåö òåëà öèêëà.
w Èçìåíÿåò ïåðåìåííóþ counter íà âåëè÷èíó StepSize (åñëè âêëþ÷àåòñÿ
íåîáÿçàòåëüíîå êëþ÷åâîå ñëîâî Step). Åñëè Step íå îïðåäåëåíî, òî
VBA óâåëè÷èâàåò ïåðåìåííóþ counter íà 1.
w Âîçâðàùàåòñÿ ê íà÷àëó öèêëà è ñðàâíèâàåò òåêóùåå çíà÷åíèå ïåðå-
ìåííîé counter ñî çíà÷åíèåì, ïðåäñòàâëåííûì ñ ïîìîùüþ End. Åñëè
çíà÷åíèå counter ìåíüøå èëè ðàâíî End, VBA âûïîëíÿåò öèêë ñíîâà.
Åñëè çíà÷åíèå counter áîëüøå End, VBA ïðîäîëæàåò âûïîëíåíèå êîäà
ñ ïåðâîãî îïåðàòîðà ïîñëå êëþ÷åâîãî ñëîâà Next.

Èñïîëüçîâàíèå For…Next ñ âîçðàñòàþùèì ñ÷åò÷èêîì


 ëèñòèíãå 7.1 äåìîíñòðèðóåòñÿ èñïîëüçîâàíèå öèêëà For…Next. Ýòà ïðî-
öåäóðà ïîëó÷àåò äâà ÷èñëà îò ïîëüçîâàòåëÿ, ñêëàäûâàåò âñå ÷èñëà â äèàïàçîíå,
çàäàííîì ýòèìè äâóìÿ ÷èñëàìè, à çàòåì îòîáðàæàåò ðåçóëüòèðóþùóþ ñóììó.

Ëèñòèíã 7.1. Äåìîíñòðàöèÿ öèêëà For…Next ñ âîçðàñòàþùèì ñ÷åò÷èêîì


1: Sub Demo_ForNext()
2:
3: Dim k As Integer
4: Dim sStart As String
5: Dim sEnd As String
6: Dim lSum As Long
7:
8: sStart = InputBox("Ââåäèòå öåëîå ÷èñëî:")
9: sEnd = InputBox("Ââåäèòå äðóãîå öåëîå ÷èñëî:")
10:
11: lSum = 0
12: For i = CInt(sStart) To CInt(sEnd)
13: lSum = lSum + i
14: Next i
15:
16: MsgBox "Ñóììà ÷èñåë îò " & sStart & _
17: " äî " & sEnd & " ðàâíà: " & lSum
18: End Sub
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 273

Ïåðåìåííàÿ i èñïîëüçóåòñÿ êàê ñ÷åò÷èê öèêëà For…Next (áóêâû i, j, k, l, m,


n ÷àùå âñåãî ïðèìåíÿþòñÿ ïðîãðàììèñòàìè â êà÷åñòâå ñ÷åò÷èêîâ öèêëà, âèäè-
ìî, îíè áîëüøå äðóãèõ íàïîìèíàþò ïåðåìåííûå öåëûõ òèïîâ); äðóãèå ïåðå-
ìåííûå èñïîëüçóþòñÿ äëÿ ñîõðàíåíèÿ íà÷àëüíîãî (sStart) è êîíå÷íîãî çíà÷å-
íèé (sEnd), ïîëó÷åííûõ îò ïîëüçîâàòåëÿ, è äëÿ ñîõðàíåíèÿ ñóììû ÷èñåë
(lSum). Îáðàòèòå âíèìàíèå íà òèïû ýòèõ ïåðåìåííûõ. Ïåðåìåííûå sStart
è sEnd â ýòîé ïðîöåäóðå ÷àùå âñåãî èñïîëüçóþòñÿ äëÿ ðàáîòû ñî ñòðîêàìè
(ñòðîêè 8, 9, 16–17) è òîëüêî â îäíîì îïåðàòîðå (ñòðîêà 12) íàì ïîíàäîáèëîñü
ïðåîáðàçîâàòü èõ â ÷èñëà. Ïåðåìåííàÿ lSum, ïî ñóùåñòâó, äîëæíà èìåòü òèï
÷èñëîâîé, ïðè÷åì êàê ìîæíî áîëüøèé, ïîòîìó ÷òî íåèçâåñòíî, íàñêîëüêî
áîëüøîé äèàïàçîí áóäåò ââîäèòüñÿ ïîëüçîâàòåëåì, êîòîðûé áóäåò èñïûòûâàòü
ýòîò êîä.
 ïðîöåäóðå ïðåäïîëàãàåòñÿ, ÷òî ïåðâîå ââîäèìîå ÷èñëî ìåíüøå, ÷åì âòî-
ðîå. Èíà÷å òåëî öèêëà íå âûïîëíèòñÿ íè ðàçó è çíà÷åíèå ïåðåìåííîé lSum áó-
äåò ðàâíî 0, òàê êàê îíà èíèöèàëèçèðóåòñÿ ýòèì çíà÷åíèåì â ñòðîêå 11.
Ñî ñòðîêè 12 íà÷èíàåòñÿ îïèñàíèå öèêëà For…Next. Ïðè îáðàáîòêå ýòîé
ñòðîêè VBA ñíà÷àëà âûïîëíÿåò âûçîâ ôóíêöèè CInt, êîòîðàÿ ïðåîáðàçóåò
ïîëüçîâàòåëüñêèé ñòðîêîâûé ââîä â ÷èñëà òèïà Integer, à çàòåì âñòàâëÿåò ðå-
çóëüòèðóþùèå öåëûå çíà÷åíèÿ â îïåðàòîð. VBA ïðèñâàèâàåò öåëûé ýêâèâà-
ëåíò çíà÷åíèÿ, õðàíèìîãî â sStart, ïåðåìåííîé ñ÷åò÷èêà i. Çàòåì çíà÷åíèå â i
ñðàâíèâàåòñÿ ñ öåëûì ýêâèâàëåíòîì ÷èñëà, ñîõðàíåííîãî â sEnd. Åñëè i ìåíü-
øå èëè ðàâíî çíà÷åíèþ â sEnd, VBA âûïîëíÿåò òåëî öèêëà.
Ýòîò öèêë èìååò òîëüêî îäèí îïåðàòîð â ñâîåì òåëå: âûðàæåíèå ñëîæåíèÿ
è ïðèñâàèâàíèÿ (â ñòðîêå 13).  ñòðîêå ñêëàäûâàåòñÿ òåêóùåå çíà÷åíèå i ñ òå-
êóùèì ñîäåðæèìûì ïåðåìåííîé lSum, à çàòåì ðåçóëüòàò ñëîæåíèÿ ïðèñâàè-
âàåòñÿ ïåðåìåííîé lSum.
Äàëåå VBA ïåðåõîäèò ê îïåðàòîðó Next (â ñòðîêå 14), êîòîðûé óêàçûâàåò íà
êîíåö òåëà öèêëà For; VBA óâåëè÷èâàåò ïåðåìåííóþ ñ÷åò÷èêà íà 1 (ïî óìîë-
÷àíèþ) è âîçâðàùàåòñÿ ê íà÷àëó öèêëà (ñòðîêà 12) è ñíîâà ñðàâíèâàåò çíà÷å-
íèå â ïåðåìåííîé ñ÷åò÷èêà i ñ ÷èñëîì, õðàíèìûì â ïåðåìåííîé sEnd.
Êàê òîëüêî çíà÷åíèå â ñ÷åò÷èêå öèêëà ïðåâûñèò çíà÷åíèå, îïðåäåëåííîå
äëÿ êîíå÷íîãî çíà÷åíèÿ ñ÷åò÷èêà (à ýòî çàâèñèò îò ââîäèìûõ äàííûõ), VBA
ïðåêðàùàåò âûïîëíåíèå öèêëà.
Òåïåðü, êîãäà öèêë çàêîí÷èëñÿ, VBA ïðîäîëæàåò âûïîëíåíèå êîäà ñ îïåðà-
òîðà MsgBox â ñòðîêå 16, êîòîðûé îòîáðàæàåò äâà ââåäåííûõ ÷èñëà è ñóììó
âñåõ öåëûõ â ýòîì äèàïàçîíå.
Åñëè âû õîðîøî ðàçîáðàëèñü ñ öèêëîì For…Next, òî, íàâåðíîå, çàìåòèëè,
÷òî ýòîò öèêë (êàê, âïðî÷åì, è ðàññìîòðåííûå äàëåå) ìîæíî ðåàëèçîâàòü îïå-
ðàòîðîì If…Then…Else. ×òîáû ýòî ïîíÿòü, äîñòàòî÷íî ñðàâíèòü äèàãðàììû,
ñïðîâîæäàþùèå ñèíòàêñèñ ýòèõ îïåðàòîðîâ. Äåëî òîëüêî â òîì, ÷òî îïåðàòîð
For…Next è êîðî÷å â çàïèñè, è áûñòðåå ïðè âûïîëíåíèè êîäà.

Èñïîëüçîâàíèå For…Next ñ óáûâàþùèì ñ÷åò÷èêîì


Íå âñåãäà áûâàåò íóæíî çàïèñûâàòü öèêëû For…Next ñ âîçðàñòàþùèì ñ÷åò-
÷èêîì. Èíîãäà ëåã÷å èëè ïîëåçíåå ïèñàòü öèêë For ñ óáûâàþùèì ñ÷åò÷èêîì.
×òîáû öèêë For…Next èìåë óáûâàþùèé ñ÷åò÷èê, èñïîëüçóéòå êëþ÷åâîå ñëîâî
Step è îòðèöàòåëüíîå ÷èñëî (â ñèíòàêñè÷åñêîé êîíñòðóêöèè StepSize ìîæåò
èìåòü ëþáîé çíàê) äëÿ çíà÷åíèÿ øàãà.
274 Ãëàâà 7

 ëèñòèíãå 7.2 ïîêàçàíà ïðîöåäóðà, ïîëó÷åííàÿ èç ïðåäûäóùåãî êîäà, íî


çäåñü äîáàâëåíà âîçìîæíîñòü ââîäèòü çíà÷åíèÿ øàãà öèêëà. Åñëè ïðè òåñòèðî-
âàíèè ñíà÷àëà ââåñòè áîëüøåå ÷èñëî, çàòåì — ìåíüøåå è –1, òî ìû ïîëó÷èì
öèêë For…Next ñ óáûâàþùèì ñ÷åò÷èêîì. Ïîíÿòíî, ÷òî ïðè ââîäå ñíà÷àëà
ìåíüøåãî ÷èñëà, çàòåì — áîëüøåãî è +1, ìû ïîëó÷èì îáû÷íûé öèêë ñ âîçðàñ-
òàþùèì ñ÷åò÷èêîì.

Ëèñòèíã 7.2. Öèêë For…Next ñ èñïîëüçîâàíèåì øàãà èçìåíåíèÿ ñ÷åò÷èêà öèêëà


1: Sub Demo_ForNext()
2:
3: Dim i As Integer
4: Dim sStart As String
5: Dim sEnd As String
6: Dim sStep As String
7: Dim uSum As Long
8:
9: uStart = InputBox("Ââåäèòå öåëîå ÷èñëî:")
10: uEnd = InputBox("Ââåäèòå äðóãîå öåëîå ÷èñëî:")
11: sStep = InputBox("Ââåäèòå øàã öèêëà (öåëîå ÷èñëî):")
12:
13: uSum = 0
14: For i = CInt(uStart) To CInt(uEnd) Step CInt(sStep)
15: uSum = uSum + i
16: Next i
17:
18: MsgBox "Ñóììà ÷èñåë îò " & uStart & _
19: " äî " & uEnd & " øàãîì " & sStep & " ðàâíà: " & uSum
20: End Sub

Ïðîñìàòðèâàÿ êîä ëèñòèíãà 7.2, ïîìíèòå, ÷òî ïðè óìåíüøåíèè ñ÷åò÷èêà


öèêëà For…Next öèêë âûïîëíÿåòñÿ, ïîêà ïåðåìåííàÿ ñ÷åò÷èêà áîëüøå èëè
ðàâíà êîíå÷íîìó çíà÷åíèþ, à êîãäà ñ÷åò÷èê öèêëà óâåëè÷èâàåòñÿ, öèêë âû-
ïîëíÿåòñÿ, ïîêà ïåðåìåííàÿ ñ÷åò÷èêà ìåíüøå èëè ðàâíà êîíå÷íîìó çíà÷åíèþ.
Ïðèâåäåì åùå îäèí ïðèìåð ñ èñïîëüçîâàíèåì öèêëà For…Next è îáðàáîòêè
ñòðîêîâûõ ïåðåìåííûõ. Äîâîëüíî ÷àñòî â ðàçëè÷íûõ ïðèëîæåíèÿõ ïðèõîäèòñÿ
ñîçäàâàòü óíèêàëüíûå ñòðîêè äëÿ èñïîëüçîâàíèÿ èõ â êà÷åñòâå êîäîâ íåêîòî-
ðûõ îáúåêòîâ (íàïðèìåð, â áàçàõ äàííûõ). Îáû÷íî äëÿ ýòèõ öåëåé èñïîëüçóþò
ãåíåðàòîðû ñëó÷àéíûõ (÷àùå âñåãî — ïñåâäîñëó÷àéíûõ) ÷èñåë è (ïðè íåîáõîäè-
ìîñòè) ïåðåâîäÿò èõ â ñòðîêè. Åñëè ïîëó÷àåìûå ñòðîêè èñïîëüçóþòñÿ è ñîçäà-
þòñÿ â òå÷åíèå äîëãîãî âðåìåíè, ñóùåñòâóåò âåðîÿòíîñòü ñîâïàäåíèÿ íîâûõ
ñòðîê ñî ñòàðûìè. Åñëè óíèêàëüíûå ñòðîêè (è ñîîòâåòñòâóþùèå èì äðóãèå äàí-
íûå) ðàñïîëàãàòü â ïîðÿäêå âîçðàñòàíèÿ (ñòðîêè âåäü òîæå ìîæíî ñðàâíèâàòü),
òî èõ ìîæíî ñîçäàâàòü òàê, ÷òî ñëåäóþùàÿ ñîçäàâàåìàÿ ñòðîêà äîëæíà áûòü
áîëüøå ïîñëåäíåé èìåþùåéñÿ â íàáîðå, îòëè÷àÿñü òîëüêî «íà îäèí ñèìâîë».
Íàïðèìåð, äëÿ ñòðîê èç ÷åòûðåõ ñèìâîëîâ ìîæíî çàïèñàòü íåðàâåíñòâà:
"A00X" < "A00Y" < "A00Z" < "A0010" ...
Êîä ëèñòèíãà 7.3 ÿâëÿåòñÿ ïðèìåðîì ôóíêöèè, êîòîðàÿ ñîçäàåò ñòðîêó, îò-
ëè÷àþùóþñÿ îò àðãóìåíòà òàê, êàê îòëè÷àþòñÿ äðóã îò äðóãà ñòðîêè, ïðèâå-
äåííûå âûøå.
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 275

Ëèñòèíã 7.3. Èñïîëüçîâàíèå For …Next — ïðèìåð â Excel


1: Function NetxCode(PrevCode As String) As String
2: 'ôóíêöèÿ âîçâðàùàåò êîä òàêîé æå äëèíû, ÷òî è âõîäíîé ïàðàìåòð
3: 'ïåðâûé ñèìâîë ñòðîêè âûáèðàåòñÿ èç äèàïàçîíà ñèìâîëîâ,
4: 'îòëè÷àþùåãîñÿ îò äèàïàçîíà äëÿ îñòàëüíûõ ñèìâîëîâ
5:
6: Dim mas1 As String, masi As String
7: Dim s4 As String, s3 As String, s2 As String, s1 As String
8: Dim lenmas1 As Integer, lenmas2 As Integer, lenmasNewCode
As Integer
9: Dim masNewCode() As String 'ìàññèâ ñ íîâûìè çíà÷åíèÿìè
10: 'ñèìâîëîâ êîäà
11: 'ñòðîêè äëÿ âûáîðà ñèìâîëîâ
12: mas1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 'äëÿ ïåðâîãî ñèìâîëà
13: masi = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 'äëÿ îñòàëüíûõ
14:
15: lenmas1 = Len(mas1) 'äëèíà ñòðîêè mas1
16: lenmasi = Len(masi) 'äëèíà ñòðîêè masi
17: lenmasNewCode = Len(PrevCode) 'äëèíà âõîäíîé ñòðîêè
18:
19: 'çàïîëíåíèå ìàññèâà ñèìâîëàìè âõîäíîé ñòðîêè:
20: For i = 1 To lenmasNewCode
21: ReDim Preserve masNewCode(i)
22: masNewCode(i - 1) = Mid(PrevCode, i, 1)
23: Next
24:
25: 'çàìåíà ñèìâîëîâ âõîäíîé ñòðîêè íà íîâûå,
26: 'íà÷èíàÿ ñ ïîñëåäíåãî ñèìâîëà:
27: For i = lenmasNewCode - 1 To 0 Step -1
28: If i > 0 Then
29: 'ïîëîæåíèå i-ãî ñèìâîëà â çàäàííîì äèàïàçîíå:
30: posi = InStr(1, masi, masNewCode(i))
31: If posi = lenmasi Then
32: 'ñèìâîë ïîñëåäíèé â äèàïàçîíå:
33: masNewCode(i) = Mid(masi, 1, 1)
34: Else
35: 'âûáîð ñëåäóþùåãî ñèìâîëà èç äèàïàçîíà:
36: masNewCode(i) = Mid(masi, posi + 1, 1)
37: Exit For
38: End If
39: Else
40: 'èçìåíåíèå ïåðâîãî ñèìâîëà â ñòðîêå:
41: posi = InStr(1, mas1, masNewCode(i))
42: If posi = lenmas1 Then
43: 'àâàðèéíûé, íî âðÿä ëè äîñòèæèìûé ñëó÷àé:
44: MsgBox "Ïåðâûé ñèìâîë âûøåë èç ñâîåãî äèàïàçîíà!"
45: Else
46: masNewCode(i) = Mid(mas1, posi + 1, 1)
47: End If
48: End If
49:
50: Next
51:
52: 'ôîðìèðîâàíèå ðåçóëüòàòà ôóíêöèè:
53: NetxCode = ""
54: For i = 0 To lenmasNewCode - 1
55: NetxCode = NetxCode & masNewCode(i)
56: Next
57:
58: End Function
276 Ãëàâà 7

Îñíîâíàÿ èäåÿ àëãîðèòìà, ðåàëèçîâàííîãî ýòèì êîäîì, çàêëþ÷àåòñÿ â ñëå-


äóþùåì. Êàæäàÿ ïîçèöèÿ â ãåíåðèðóåìîé ñòðîêå ìîæåò ñîäåðæàòü ñèìâîëû
èç íåêîòîðîãî äèàïàçîíà ñèìâîëîâ1, êîòîðûé ìîæíî çàäàâàòü ïðîèçâîëüíûì
îáðàçîì, íî ñèìâîëû äèàïàçîíà äîëæíû áûòü óïîðÿäî÷åíû ïî âîçðàñòàíèþ.
Ñ èñïîëüçîâàíèåì öèêëà ñ îòðèöàòåëüíûì øàãîì (ñòðîêè 27–50) âõîäíàÿ ñòðî-
êà ïðîñìàòðèâàåòñÿ, íà÷èíàÿ ñ ïîñëåäíåãî ñèìâîëà; îïðåäåëÿåòñÿ ïîçèöèÿ ïî-
ñëåäíåãî ñèìâîëà â çàäàííîì äëÿ íåãî äèàïàçîíå. Åñëè òåêóùèé ðàññìàòðèâàå-
ìûé ñèìâîë íå ñîâïàäàåò ñ ïîñëåäíèì ñèìâîëîì äîïóñòèìîãî äèàïàçîíà (íàõî-
äèòñÿ â ñåðåäèíå äèàïàçîíà), òî â âûõîäíîé ñòðîêå òîëüêî ýòîò ñèìâîë
çàìåíÿåòñÿ íà ñëåäóþùèé ñèìâîë èç äèàïàçîíà; íà ýòîì ðàáîòà àëãîðèòìà çàêàí-
÷èâàåòñÿ. Åñëè æå ðàññìàòðèâàåìûé ñèìâîë ñîâïàäàåò ñ ïîñëåäíèì ñèìâîëîì çà-
äàííîãî äèàïàçîíà, òî îí â âûõîäíîé ñòðîêå çàìåíÿåòñÿ íà ïåðâûé ñèìâîë äèàïà-
çîíà, c ñèìâîëîì, ñòîÿùèì âî âõîäíîé ñòðîêå ñëåâà îò ðàññìàòðèâàåìîãî, ïðîèç-
âîäÿòñÿ òå æå äåéñòâèÿ, ò.å. îí ñòàíîâèòñÿ òåêóùèì ðàññìàòðèâàåìûì ñèìâîëîì.
Äëÿ çàäàíèÿ äèàïàçîíà äîïóñòèìûõ ñèìâîëîâ èñïîëüçóþòñÿ ñòðîêè ñèìâî-
ëîâ: mas1 — äîïóñòèìûé äèàïàçîí íà÷àëà ñòðîêè (ïåðâûé ñèìâîë), masi — äî-
ïóñòèìûé äèàïàçîí äëÿ îñòàëüíûõ ñèìâîëîâ. Äëÿ ïîëîæåíèÿ òåêóùåãî ñèìâî-
ëà â äèàïàçîíå (â ïîäñòðîêå) èñïîëüçóåòñÿ ôóíêöèÿ InStr, ïîçâîëÿþùàÿ íàé-
òè ïîëîæåíèå îäíîé ñòðîêè â äðóãîé ñòðîêå. Ôóíêöèÿ Mid èñïîëüçóåòñÿ äëÿ
âûäåëåíèÿ óêàçàííîãî (èíäåêñîì) ñèìâîëà èç ñòðîêè.
Íà ðèñ. 7.1 ïðèâåäåí ïðèìåð èñïîëüçîâàíèÿ ôóíêöèè: â êîëîíêå A ïîìåùå-
íû çàäàííûå ñòðîêè (ðàçëè÷íîé äëèíû), à â êîëîíêå B — ôîðìóëû
NextCode(Ai). Îáðàòèòå âíèìàíèå íà òî, ÷òî ðåçóëüòèðóþùèå ñòðîêè îòëè÷à-
þòñÿ îò èñõîäíûõ íà îäèí èëè äâà ñèìâîëà (â êîíöå).
Ðèñ. 7.1
Èñïîëüçîâàíèå ôóíêöèè
ëèñòèíãà 7.3

Öèêë For Each…Next


Âòîðîé öèêë For, êîòîðûé èìååòñÿ â VBA — ýòî öèêë For Each…Next.
 îòëè÷èå îò öèêëà For…Next öèêë For Each…Next íå èñïîëüçóåò ñ÷åò÷èê
öèêëà. Öèêëû For Each…Next âûïîëíÿþòñÿ ñòîëüêî ðàç, ñêîëüêî èìååòñÿ

1  îáùåì ñëó÷àå äëÿ êàæäîé ïîçèöèè â ñòðîêå ìîæíî çàäàâàòü ñâîé äèàïàçîí äîïóñòèìûõ
ñèìâîëîâ. Â ðàññìàòðèâàåìîì êîäå òîëüêî ïåðâûé ñèìâîë âûõîäíîé ñòðîêè èìååò
äèàïàçîí ñèìâîëîâ, îòëè÷íûé îò äèàïàçîíà äëÿ îñòàëüíûõ ñèìâîëîâ, ÷òî îïðåäåëÿëîñü
ñïåöèôèêîé ðåàëüíîé çàäà÷è, êîòîðàÿ ïîñëóæèëà ïîâîäîì äëÿ âêëþ÷åíèÿ ýòîãî êîäà â
êíèãó.
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 277

ýëåìåíòîâ â îïðåäåëåííîé ãðóïïå, òàêîé êàê êîëëåêöèÿ îáúåêòîâ èëè ìàññèâ.


(Êîëëåêöèè îáúåêòîâ îïèñûâàþòñÿ â ïðåäûäóùåé, à ìàññèâû — äàëåå â ýòîé
ãëàâå.) Äðóãèìè ñëîâàìè, öèêë For Each…Next âûïîëíÿåòñÿ îäèí ðàç äëÿ êà-
æäîãî ýëåìåíòà â ãðóïïå.
Öèêë For Each…Next èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
For Each Element In Group
Statements
Next [Element]
Element — ýòî ïåðåìåííàÿ, èñïîëüçóåìàÿ äëÿ èòåðàöèè ïî âñåì ýëåìåíòàì â îïðå-
äåëåííîé ãðóïïå. Group — ýòî îáúåêò êîëëåêöèè èëè ìàññèâ. Åñëè Group — ýòî
îáúåêò êîëëåêöèè, òî Element äîëæåí áûòü ïåðåìåííîé òèïà Variant, Object èëè
çàäàííûì îáúåêòíûì òèïîì, òàêèì êàê Range, Worksheet, Document, Paragraph
è òàê äàëåå. Åñëè Group — ýòî ìàññèâ, òî Element äîëæåí áûòü ïåðåìåííîé òèïà
Variant; Statements — îäèí, íåñêîëüêî èëè íè îäíîãî îïåðàòîðà VBA, ñîñòàâëÿþ-
ùèõ òåëî öèêëà.
Öèêë For Each…Next èìååò ìåíüøå îïöèé, ÷åì öèêë For…Next. Öèêë For
Each…Next âñåãäà âûïîëíÿåòñÿ ñòîëüêî ðàç, ñêîëüêî èìååòñÿ ýëåìåíòîâ â îï-
ðåäåëåííîé (óêàçàííîé â îïåðàòîðå) ãðóïïå.
 ëèñòèíãå 7.4 ïîêàçàíà ôóíêöèÿ ñ èìåíåì SheetExists, èñïîëüçóþùàÿ
öèêë For Each…Next äëÿ îïðåäåëåíèÿ òîãî, ñóùåñòâóåò ëè îïðåäåëåííûé ëèñò
â ðàáî÷åé êíèãå Excel.

Ëèñòèíã 7.4. Èñïîëüçîâàíèå For Each…Next — ïðèìåð â Excel


1: Function SheetExists(sName As String) As Boolean
2: 'Âîçâðàùàåò True, åñëè ëèñò sName â àêòèâíîé êíèãå
3:
4: Dim aSheet As Object
5: SheetExists = False
6:
7: 'öèêë ïî âñåì ëèñòàì ñî ñðàâíåíèåì èìåí ñ sName,
8: 'ñðàâíåíèå òåêñòîâîå
9: For Each aSheet In ActiveWorkbook.Sheets
10: If (StrComp(aSheet.Name, sName, 1) = 0) Then
11: SheetExists = True 'íàéäåíî èìÿ
12: Exit For 'âûõîä èç öèêëà
13: End If
14: Next aSheet
15: End Function
16:
17: Sub Test_SheetExists()
18: 'òåñòèðóåò ôóíêöèþ SheetExists
19:
20: Dim uStr As String
21:
22: uStr = InputBox("Ââåäèòå èìÿ ëèñòà " & _
23: "òåêóùåé êíèãè:")
24: If SheetExists(uStr) Then
25: MsgBox "Ëèñò '" & uStr & _
26: "' â òåêóùåé êíèãå."
27: Else
28: MsgBox "Ëèñòà '" & uStr & _
29: "' ÍÅÒ â òåêóùåé êíèãå."
30: End If
278 Ãëàâà 7

31: End Sub

Ôóíêöèÿ SheetExists èìååò îäèí îáÿçàòåëüíûé àðãóìåíò sName, â êîòîðîì


ôóíêöèè ïåðåäàåòñÿ ñòðîêà, ñîäåðæàùàÿ èìÿ èñêîìîãî ëèñòà. SheetExists âîç-
âðàùàåò çíà÷åíèÿ òèïà Boolean: True, åñëè ëèñò ñ èìåíåì â sName, ñóùåñòâó-
åò â òåêóùåé ðàáî÷åé êíèãå, èíà÷å — False. Ìîæíî èñïîëüçîâàòü ïîäîáíóþ
ôóíêöèþ â îäíîé èç ïðîöåäóð, ÷òîáû óáåäèòüñÿ â òîì, ÷òî ðàáî÷èé ëèñò (èëè
äèàãðàììà) ñóùåñòâóåò, ïåðåä òåì, êàê ïðîöåäóðà âûïîëíèò êîìàíäó îáðàùå-
íèÿ ê ýòîìó ëèñòó. Åñëè ýòîãî íå ïðåäóñìîòðåòü, à ëèñò äåéñòâèòåëüíî îòñóòñò-
âóåò, òàêàÿ êîìàíäà âûçîâåò ñîîáùåíèå î runtime-îøèáêå è VBA ïðåêðàòèò
âûïîëíåíèå ïðîãðàììû. Ôóíêöèÿ, ïîäîáíàÿ SheetExists, ïîçâîëÿåò ïèñàòü
ïðîöåäóðû òàê, ÷òîáû îíè ìîãëè îáíàðóæèâàòü è èñêëþ÷àòü îøèáêè, êîòîðûå
ìîãóò âîçíèêíóòü, íàïðèìåð, êîãäà ïîëüçîâàòåëü ââîäèò èìÿ íåñóùåñòâóþùå-
ãî ðàáî÷åãî ëèñòà.
 ñòðîêå 4 îáúÿâëÿåòñÿ îáúåêòíàÿ ïåðåìåííàÿ aSheet äëÿ èñïîëüçîâàíèÿ
â öèêëå For Each…Next. Â ñòðîêå 5 ðåçóëüòàòó ôóíêöèè SheetExists ïðèñâàè-
âàåòñÿ çíà÷åíèå False. Òåïåðü ôóíêöèÿ äîëæíà òîëüêî óñòàíîâèòü, ñóùåñòâó-
åò ëè ëèñò, è ïðèñâîèòü True ðåçóëüòàòó ôóíêöèè â ñëó÷àå ïîëîæèòåëüíîãî
ðåçóëüòàòà. Åñëè ðåçóëüòàòó ôóíêöèè SheetExists íå óäàëîñü ïðèñâîèòü çíà÷å-
íèå True, çíà÷èò ëèñò íå íàéäåí èëè ñëó÷èëîñü ÷òî-òî åùå, ÷òî ïîäðàçóìåâàåò
îòñóòñòâèå ëèñòà.
 ñòðîêå 9 íà÷èíàåòñÿ öèêë For Each…Next, èñïîëüçóþùèé îáúåêòíóþ ïå-
ðåìåííóþ aSheet êàê ïåðåìåííóþ Element äëÿ öèêëà.  êà÷åñòâå Group çäåñü
âûñòóïàåò êîëëåêöèÿ ActiveWorkbook.Sheets. Ñâîéñòâî ActiveWorkbook —
ýòî ñâîéñòâî îáúåêòà Application è îíî âîçâðàùàåò îáúåêòíóþ ññûëêó íà òå-
êóùóþ àêòèâíóþ ðàáî÷óþ êíèãó. Sheets — ýòî ìåòîä ðàáî÷åé êíèãè, êîòîðûé
âîçâðàùàåò êîëëåêöèþ âñåõ ëèñòîâ â ðàáî÷åé êíèãå, âêëþ÷àÿ ðàáî÷èå ëèñòû
è äèàãðàììû.
 ñòðîêå 10 íà÷èíàåòñÿ òåëî öèêëà, êîòîðîå ñîñòîèò èç îäíîãî îïåðàòîðà
If…Then. Ïðè âûïîëíåíèè ñòðîêè 10 VBA ñíà÷àëà âûçûâàåò StrComp äëÿ
ñðàâíåíèÿ ñòðîêè â sName ñî ñòðîêîé, ñîõðàíåííîé â ñâîéñòâå Name ëèñòà, íà
êîòîðûé â äàííûé ìîìåíò ññûëàåòñÿ aSheet. Ýòîò âûçîâ ôóíêöèè StrComp îï-
ðåäåëÿåò, ÷òî ñðàâíåíèå äîëæíî áûòü òåêñòîâûì, è, ñëåäîâàòåëüíî, íà íåãî íå
îêàçûâàþò âëèÿíèå ðàçëè÷èÿ â ðåãèñòðå ñòðîêè â sName è ñòðîêè â ñâîéñòâå
Name ëèñòà.
Åñëè ñòðîêà â sName ñîâïàäàåò ñî ñòðîêîé â ñâîéñòâå Name ëèñòà, VBA âû-
ïîëíÿåò îïåðàòîð â ñòðîêå 11, êîòîðûé ïðèñâàèâàåò çíà÷åíèå True ðåçóëüòàòó
ôóíêöèè. Â ñòðîêå 12 ðàñïîëàãàåòñÿ îïåðàòîð Exit For. Åñëè âû åùå íå äîãà-
äàëèñü, ê ÷åìó ïðèâîäèò ýòîò îïåðàòîð, çíà÷èò, âû åùå íå çàäóìûâàëèñü íàä
òåì, ñêîëüêî æå ðàç áóäåò âûïîëíÿòüñÿ öèêë â äàííîì ïðèìåðå, äàæå åñëè íå-
îáõîäèìûé ëèñò íàéäåòñÿ â ïåðâîé æå èòåðàöèè. Íà ñàìîì äåëå Exit For —
ýòî îïåðàòîð íåìåäëåííîãî âûõîäà èç öèêëà. Îí íå çàâèñèò îò òåêóùåé èòåðà-
öèè. Äàííûé ïðèìåð, êàê íèêàêîé äðóãîé, ïîäõîäèò äëÿ äåìîíñòðàöèè ýòîãî
îïåðàòîðà. Êàê òîëüêî ñòðîêà â sName ñîâïàäåò ñî ñòðîêîé â ñâîéñòâå Name
ëèñòà, VBA âûïîëíèò îïåðàòîðû â ñòðîêàõ 11–12 è äàëüíåéøàÿ íåîáõîäè-
ìîñòü â öèêëå îòïàäåò, õîòÿ åãî ìîæíî áûëî áû áåç âðåäà äëÿ ïðîãðàììû âû-
ïîëíÿòü è äàëåå.  äàííîé ôóíêöèè äîñðî÷íûé âûõîä èç öèêëà ýêîíîìèò òîëü-
êî âðåìÿ (ñëîâî «òîëüêî» èñïîëüçîâàíî çäåñü íå â òîì ñìûñëå, ÷òî îá ýòîì íå
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 279

ñòîèò áåñïîêîèòüñÿ; ÷àùå âñåãî â ïðîãðàììàõ ñ õîðîøèì ïîëüçîâàòåëüñêèì


èíòåðôåéñîì âðåìÿ — îñíîâíàÿ õàðàêòåðèñòèêà ñèñòåìû ïîñëå íàäåæíîñòè).
Êîãäà çàêàí÷èâàåòñÿ (èëè ïðåðûâàåòñÿ) âûïîëíåíèå öèêëà, VBA ïðîäîëæà-
åò âûïîëíåíèå êîäà ñî ñòðîêè 15, êîòîðîé çàêàí÷èâàåòñÿ ôóíêöèÿ
SheetExists, è âîçâðàùàåò ðåçóëüòàò ôóíêöèè.
 ñòðîêàõ 17–30 îïèñàíà ïðîöåäóðà Test_SheetExists äëÿ òåñòèðîâàíèÿ
ôóíêöèè SheetExist. Ïðîöåäóðà èñïîëüçóåò òîëüêî óæå èçó÷åííûå âàìè îïå-
ðàòîðû, è, âèäèìî, íåò íåîáõîäèìîñòè â åå ïîäðîáíîì ðàçáîðå.
 ëèñòèíãå 7.5 ïîêàçàí åùå îäèí ïðèìåð èñïîëüçîâàíèÿ For Each…Next: íà
ýòîò ðàç — äëÿ Word. Ôóíêöèÿ BookmarkExists èç ëèñòèíãà 7.5 ïðîâåðÿåò, ñó-
ùåñòâóåò ëè îïðåäåëåííàÿ çàêëàäêà â àêòèâíîì â äàííûé ìîìåíò äîêóìåíòå,
è åñëè — ñóùåñòâóåò, ïåðåâîäèò êóðñîð ê ýòîé çàêëàäêå.

Ëèñòèíã 7.5. Ïîèñê çàêëàäêè â äîêóìåíòå Word


1: Function BookmarkExists(BkMark As String) As Boolean
2: 'Âîçâðàùàåò True, åñëè çàêëàäêà BkMark ñóùåñòâóåò
3: 'â àêòèâíîì äîêóìåíòå
4:
5: Dim InstBkMark As Object
6:
7: BookmarkExists = False 'ïðåäïîëîæèì, çàêëàäêà íå íàéäåíà
8:
9: 'öèêë ïî âñåì çàêëàäêàì; ñðàâíåíèå èìåíè êàæäîé
10: 'çàêëàäêè ñ BkMark; ñðàâíåíèå òåêñòîâîå
11: For Each InstBkMark In ActiveDocument.Bookmarks
12: If (StrComp(InstBkMark.Name, BkMark, vbTextCompare) = 0) Then
13: 'ïåðåéòè ê çàêëàäêå:
14: Selection.GoTo What:=wdGoToBookmark, Name:=BkMark
15: BookmarkExists = True
16: Exit For
17: End If
18: Next InstBkMark
19: End Function
20:
21:
22: Sub Test_BookmarkExists()
23: 'òåñòèðóåò ôóíêöèþ BookmarkExists
24:
25: Dim uStr As String
26:
27: uStr = InputBox("Ââåäèòå èìÿ çàêëàäêè " & _
28: "â òåêóùåì äîêóìåíòå:")
29: If BookmarkExists(uStr) Then
30: MsgBox "Çàêëàäêà '" & uStr & _
31: "' ÍÀÕÎÄÈÒÑß â ýòîì äîêóìåíòå"
32: Else
33: MsgBox "Çàêëàäêè '" & uStr & _
34: "' ÍÅÒ â ýòîì äîêóìåíòå"
35: End If
36: End Sub

Ôóíêöèÿ BookmarkExists ðàáîòàåò â îñíîâíîì òàê æå, êàê è ôóíêöèÿ


SheetExists. BookmarkExists èìååò îäèí îáÿçàòåëüíûé àðãóìåíò BkMark, êî-
òîðûé ñîäåðæèò ñòðîêó, ïðåäñòàâëÿþùóþ èìÿ çàêëàäêè, ïîèñê êîòîðîé âû-
ïîëíÿåòñÿ. BookmarkExists âîçâðàùàåò çíà÷åíèå òèïà Boolean: True, åñëè çà-
280 Ãëàâà 7

êëàäêà, îïðåäåëÿåìàÿ ñ ïîìîùüþ BkMark, íàõîäèòñÿ â òåêóùåì äîêóìåíòå,


èíà÷å — False.
 ñòðîêå 5 îáúÿâëÿåòñÿ îáúåêòíàÿ ïåðåìåííàÿ InstBkMark äëÿ èñïîëüçîâà-
íèÿ â öèêëå For Each…Next.
 ñòðîêå 11 íà÷èíàåòñÿ öèêë For Each…Next, èñïîëüçóþùèé îáúåêòíóþ
ïåðåìåííóþ InstBkMark êàê ïåðåìåííóþ Element äëÿ öèêëà.  êà÷åñòâå Gro-
up âûñòóïàåò êîëëåêöèÿ ActiveDocument.Bookmarks: ActiveDocument —
ýòî ñâîéñòâî îáúåêòà Word Application, êîòîðîå âîçâðàùàåò îáúåêòíóþ
ññûëêó íà àêòèâíûé â òåêóùèé ìîìåíò äîêóìåíò. Bookmarks — ýòî ìåòîä äî-
êóìåíòà, âîçâðàùàþùèé êîëëåêöèþ âñåõ çàêëàäîê â äîêóìåíòå.
 ñòðîêå 12 íà÷èíàåòñÿ òåëî öèêëà, êîòîðîå ñîñòîèò èç îäíîãî îïåðàòîðà
If…Then. Ïðè âûïîëíåíèè ñòðîêè 12 VBA ñíà÷àëà âûçûâàåò ôóíêöèþ
StrComp äëÿ ñðàâíåíèÿ ñòðîêè â BkMark ñî ñòðîêîé, ñîõðàíåííîé â ñâîéñòâå
Name çàêëàäêè, íà êîòîðóþ â äàííûé ìîìåíò ññûëàåòñÿ InstBkMark. Ïðè
ñðàâíåíèè ñòðîê èñïîëüçóåòñÿ ôóíêöèÿ StrComp äëÿ òåêñòîâîãî ñðàâíåíèÿ
ñòðîê íåçàâèñèìî îò óñòàíîâîê Option Compare.
Åñëè ñòðîêà â BkMark ñîâïàäàåò ñî ñòðîêîé â ñâîéñòâå Name çàêëàäêè, VBA
âûïîëíÿåò êîä â ñòðîêàõ 14–15.  ñòðîêå 15 ïðèñâàèâàåòñÿ çíà÷åíèå True ðå-
çóëüòàòó ôóíêöèè. Ñ ýòèì âû óæå âñòðå÷àëèñü â ïðåäûäóùåì ëèñòèíãå.  14
ñòðîêå ðàñïîëàãàåòñÿ îïåðàòîð ïåðåõîäà ê íàéäåííîé çàêëàäêå. Ýòîò îïåðàòîð
áûë ïîëó÷åí èç ìàêðîñà, çàïèñàííîãî ðåêîðäåðîì, è ñîñòîèò èç âûçîâà ìåòîäà
GoTO îáúåêòà Selection. Ìåòîä èìååò äâà àðãóìåíòà: What, êîòîðîìó ïðè-
ñâàèâàåòñÿ çíà÷åíèå âñòðîåííîé êîíñòàíòû wdGoToBookmark (âûäåëåííûé
ôðàãìåíò — çàêëàäêà), è Name (íàèìåíîâàíèå çàêëàäêè), êîòîðîìó ïðèñâàèâà-
åòñÿ çíà÷åíèå íàéäåííîé ìåòêè.
Êàê è â ïðåäûäóùåì ëèñòèíãå, çäåñü èñïîëüçóåòñÿ «äîñðî÷íûé» âûõîä èç
öèêëà, åñëè çàêëàäêà íàéäåíà.
Êîãäà âûïîëíåíèå öèêëà äëÿ âñåõ îáúåêòîâ â êîëëåêöèè ActiveDo-
cument.Bookmarks çàêàí÷èâàåòñÿ, VBA ïðîäîëæàåò âûïîëíåíèå êîäà ñî ñòðî-
êè 19, êîòîðàÿ çàêàí÷èâàåò ôóíêöèþ BookmarkExists è âîçâðàùàåò ðåçóëüòàò
ôóíêöèè.
 ñòðîêàõ 22–36 îáúÿâëÿåòñÿ ïðîöåäóðà Test_BookmarkExists äëÿ òåñòèðî-
âàíèÿ ôóíêöèè BookmarkExists.

Öèêëû Do
VBA èìååò ÷ðåçâû÷àéíî ìîùíûé îïåðàòîð öèêëà äëÿ ñîçäàíèÿ íåîïðåäå-
ëåííûõ ñòðóêòóð öèêëà â ïðîöåäóðàõ è ôóíêöèÿõ. Îáû÷íî âñå VBA-íåîïðåäå-
ëåííûå öèêëû ñòðîÿòñÿ ñ ïîìîùüþ îäíîãî îïåðàòîðà íåîïðåäåëåííîãî öèêëà:
îïåðàòîðà Do. Îïåðàòîð Do èìååò òàê ìíîãî îïöèé è ÿâëÿåòñÿ íàñòîëüêî ãèá-
êèì, ÷òî, â äåéñòâèòåëüíîñòè, îí ïðåäîñòàâëÿåò ÷åòûðå ðàçëè÷íûõ êîíñòðóê-
öèè öèêëà â äâóõ áàçîâûõ êàòåãîðèÿõ.
Äâå áàçîâûå êàòåãîðèè êîíñòðóêöèé öèêëà Do — ýòî öèêëû, êîòîðûå òåñòè-
ðóþò óñëîâèå äåòåðìèíàíòà äî âûïîëíåíèÿ òåëà öèêëà, è öèêëû, êîòîðûå òåñ-
òèðóþò óñëîâèå äåòåðìèíàíòà ïîñëå âûïîëíåíèÿ òåëà öèêëà.
Óñëîâèå äåòåðìèíàíòà äëÿ íåîïðåäåëåííîãî öèêëà çàäàåòñÿ ñ ïîìîùüþ ëî-
ãè÷åñêîãî âûðàæåíèÿ òàêèì æå îáðàçîì, êàêèì ñîçäàþòñÿ ëîãè÷åñêèå âûðà-
æåíèÿ äëÿ èñïîëüçîâàíèÿ ñ îïåðàòîðàìè If…Then.
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 281

VBA ïðåäîñòàâëÿåò äâà ðàçëè÷íûõ ñïîñîáà òåñòèðîâàíèÿ óñëîâèÿ äåòåðìè-


íàíòà äëÿ öèêëà. Ìîæíî ïîñòðîèòü öèêë òàê, ÷òîáû îí âûïîëíÿëñÿ, ïîêà óñ-
ëîâèå äåòåðìèíàíòà öèêëà áóäåò ðàâíî True, è ïðåêðàùàë âûïîëíåíèå, êîãäà
ýòî óñëîâèå ñòàíîâèòñÿ ðàâíûì False. Ìîæíî òàêæå ñîçäàòü öèêë òàê, ÷òîáû
îí âûïîëíÿëñÿ, ïîêà óñëîâèå äåòåðìèíàíòà öèêëà áóäåò ðàâíî False, è ïðå-
êðàùàë âûïîëíåíèå, êîãäà ýòî óñëîâèå ñòàíåò ðàâíûì True.
×òîáû öèêë âûïîëíÿëñÿ, ïîêà åãî óñëîâèå äåòåðìèíàíòà ðàâíî True, èñ-
ïîëüçóéòå â îïåðàòîðå öèêëà Do íåîáÿçàòåëüíîå êëþ÷åâîå ñëîâî While.  ýòîì
ñëó÷àå VBA âûïîëíÿåò öèêë, ïîêà (while) óñëîâèå äåòåðìèíàíòà ðàâíî True,
è ïðåêðàùàåò âûïîëíåíèå öèêëà, êàê òîëüêî ýòî óñëîâèå ñòàíîâèòñÿ ðàâíûì
False.
Ïðåäïîëîæèì, âàì íåîáõîäèìî íàïèñàòü ïðîöåäóðó, ïîìîãàþùóþ ïîëüçî-
âàòåëþ ââîäèòü äàííûå â ðàáî÷èé ëèñò. Äëÿ ïðîöåäóðû ââîäà äàííûõ îáû÷íî
æåëàòåëüíî, ÷òîáû ïðîöåäóðà ïîâòîðÿëà íåêîòîðûå îïåðàòîðû, ïîëó÷àþùèå
èíôîðìàöèþ îò ïîëüçîâàòåëÿ, ïîêà åùå åñòü äàííûå äëÿ ââîäà, è ïðåêðàùàëà
ïîâòîðåíèå ýòèõ îïåðàòîðîâ, êîãäà äàííûõ áîëüøå íåò. Ìîæíî íàïèñàòü öèêë
Do, íåîäíîêðàòíî ïîëó÷àþùèé äàííûå îò ïîëüçîâàòåëÿ, ïðîäîëæàþùèéñÿ,
ïîêà ïîëüçîâàòåëü ââîäèò íåïóñòûå ñòðîêè, è ïðåêðàùàþùèé âûïîëíåíèå,
êàê òîëüêî ïîëüçîâàòåëü ââîäèò ïóñòóþ ñòðîêó. Óñëîâèå äåòåðìèíàíòà äëÿ
ýòîãî öèêëà çàïèñûâàåòñÿ òàê, ÷òîáû ëîãè÷åñêîå âûðàæåíèå áûëî ðàâíî True
(è ïîýòîìó öèêë ïðîäîëæàë âûïîëíÿòüñÿ), ïîêà ïîëüçîâàòåëüñêèé ââîä íå ÿâ-
ëÿåòñÿ ïóñòîé ñòðîêîé. Åñëè ïîëüçîâàòåëüñêèé ââîä ñîõðàíÿåòñÿ â ïåðåìåííîé
ñ èìåíåì uStr, ëîãè÷åñêîå âûðàæåíèå äëÿ äåòåðìèíàíòà öèêëà ìîæåò áûòü
ëþáûì èç ñëåäóþùèõ (îáà ëîãè÷åñêèõ âûðàæåíèÿ ðàâíû True, êîãäà ñòðîêà
â uStr èìååò íåíóëåâóþ äëèíó):
uStr <> ""
Len(Trim(uStr)) <> 0
Äëÿ òîãî ÷òîáû öèêë âûïîëíÿëñÿ, ïîêà åãî óñëîâèå äåòåðìèíàíòà ðàâíî
False, èñïîëüçóéòå â îïåðàòîðå öèêëà Do íåîáÿçàòåëüíîå êëþ÷åâîå ñëîâî
Until. VBA âûïîëíÿåò òàêîé öèêë äî òåõ ïîð, ïîêà (until) óñëîâèå íå áóäåò
ðàâíî True, òî åñòü öèêë ïðîäîëæàåò âûïîëíÿòüñÿ, ïîêà óñëîâèå äåòåðìèíàí-
òà ðàâíî False, è ïðåêðàùàåò âûïîëíåíèå, êàê òîëüêî ýòî óñëîâèå ñòàíîâèòñÿ
ðàâíûì True.
Íàïðèìåð, ìîæåò ïîíàäîáèòüñÿ íàïèñàòü ïðîöåäóðó, ïðîäâèãàþùóþñÿ ïî
ñòîëáöàì ðàáî÷åãî ëèñòà, ïðèìåíÿÿ îïðåäåëåííîå ôîðìàòèðîâàíèå òåêñòà, è îñ-
òàíàâëèâàþùóþñÿ â ïåðâîì ïóñòîì ñòîëáöå. Ìîæíî íàïèñàòü öèêë Do, êîòîðûé
ïîâòîðÿåò îïåðàòîðû äëÿ ôîðìàòèðîâàíèÿ çàãîëîâêà ñòîëáöà ïî äîñòèæåíèè
ïóñòîé ÿ÷åéêè. Óñëîâèå äåòåðìèíàíòà äëÿ ýòîãî öèêëà çàïèñûâàåòñÿ òàê, ÷òî
ñîîòâåòñòâóþùåå ëîãè÷åñêîå âûðàæåíèå ðàâíî False, ïîêà òåêóùàÿ ÿ÷åéêà íå
ÿâëÿåòñÿ ïóñòîé, è ðàâíî True, êîãäà òåêóùàÿ ÿ÷åéêà ïóñòàÿ. Ïðè èñïîëüçîâà-
íèè ñâîéñòâà ActiveCell îáúåêòà Application äëÿ âîçâðàòà òåêóùåé àêòèâ-
íîé ÿ÷åéêè è ïðè èñïîëüçîâàíèè ñâîéñòâà Value äëÿ ïîëó÷åíèÿ ñîäåðæèìîãî
ÿ÷åéêè ýòî ëîãè÷åñêîå âûðàæåíèå äëÿ äåòåðìèíàíòà ìîæåò áûòü ëþáûì èç ñëå-
äóþùèõ (îáà âûðàæåíèÿ ðàâíû True, åñëè òåêóùàÿ ÿ÷åéêà ïóñòàÿ):
ActiveCell.Value = ""
Len(Trim(ActiveCell.Value)) = 0
Èñïîëüçóåòñÿ ëè êëþ÷åâîå ñëîâî While èëè Until — çàâèñèò â îñíîâíîì îò
òîãî, êàê âû ïðåäñòàâëÿåòå óñëîâèå, îïðåäåëÿþùåå, äîëæåí ëè öèêë âûïîë-
282 Ãëàâà 7

íÿòüñÿ, è îò âàøåãî óìåíèÿ ñòðîèòü ëîãè÷åñêîå âûðàæåíèå äëÿ óñëîâèÿ äåòåð-


ìèíàíòà öèêëà:
¨ èñïîëüçóéòå While, åñëè õîòèòå, ÷òîáû öèêë ïðîäîëæàë âûïîëíÿòüñÿ,
ïîêà çàäàííîå óñëîâèå ðàâíî True.
¨ èñïîëüçóéòå Until, åñëè õîòèòå, ÷òîáû öèêë ïðîäîëæàë âûïîëíÿòüñÿ,
ïîêà çàäàííîå óñëîâèå ðàâíî False.

Êàê ïðåðâàòü âûïîëíåíèå ìàêðîñà èëè ïðîöåäóðû


Ïîñêîëüêó îäíîé èç íàèáîëåå ðàñïðîñòðàíåííûõ ïðîáëåì, âîçíèêàþùèõ
ïðè ðàáîòå ñ íåîïðåäåëåííûìè öèêëàìè, ÿâëÿåòñÿ íå÷àÿííîå ñîçäàíèå áåñêî-
íå÷íîãî öèêëà, âàæíî çíàòü, êàê ïðåðûâàòü ðàáîòó VBA, êîãäà âûïîëíÿþòñÿ
ìàêðîñû è ïðîöåäóðû. Èñïîëüçóéòå îäèí è òîò æå ìåòîä äëÿ ïðåðûâàíèÿ çàïè-
ñàííûõ ðåêîðäåðîì ìàêðîñîâ èëè äëÿ ïðåðûâàíèÿ ïðîöåäóð è ôóíêöèé, íàïè-
ñàííûõ âàìè ñàìîñòîÿòåëüíî.
Äëÿ ïðåðûâàíèÿ âûïîëíåíèÿ VBA íàæìèòå êëàâèøó Esc èëè êîìáèíàöèþ
êëàâèø Ctrl+Break. VBA çàêàí÷èâàåò âûïîëíåíèå òåêóùåãî îïåðàòîðà, ïåðåõî-
äèò â ñîñòîÿíèå îæèäàíèÿ è îòîáðàæàåò îêíî ñîîáùåíèÿ î runtime-îøèáêå,
ïîêàçàííîå íà ðèñ. 7.2. Êîìàíäíûå êíîïêè â ýòîì îêíå ñîîáùåíèÿ òå æå è èìå-
þò òî æå íàçíà÷åíèå, ÷òî è â ëþáîì äðóãîì îêíå ñîîáùåíèÿ î runtime-îøèáêå:
¨ Continue. Âîçîáíîâëÿåò VBA-âûïîëíåíèå ïðîãðàììíûõ îïåðàòîðîâ.
Îáû÷íî íå ñëåäóåò âûáèðàòü ýòó êíîïêó ïîñëå ïðåðûâàíèÿ áåñêîíå÷íîãî
öèêëà, ïîñêîëüêó îíà ïðîñòî çàïóñòèò áåñêîíå÷íûé öèêë ñíîâà.
¨ End. Çàêàí÷èâàåò ïðîãðàììó. Âñå ïåðåìåííûå è èõ ñîäåðæèìîå òåðÿþò-
ñÿ. Ýòî êîìàíäíàÿ êíîïêà, êîòîðóþ îáû÷íî ñëåäóåò âûáèðàòü ïîñëå ïðå-
ðûâàíèÿ áåñêîíå÷íîãî öèêëà.
¨ Debug. Àêòèâèçèðóåò VBA-ðåæèì Break (ðåæèì ïðåðûâàíèÿ), ÷òîáû âû
ìîãëè ïðîâåðèòü ñîäåðæèìîå ïåðåìåííûõ è ïî øàãàì ïðîéòè âûïîëíå-
íèå öèêëà äëÿ îïðåäåëåíèÿ ïðè÷èíû çàöèêëèâàíèÿ.
¨ Help. Àêòèâèçèðóåò ñïðàâî÷íóþ ñèñòåìó VBA äëÿ îòîáðàæåíèÿ èíôîðìà-
öèè î òîì, ïî÷åìó áûëî ïðåðâàíî âûïîëíåíèå êîäà. Êíîïêà Help íå î÷åíü
ïîëåçíà, åñëè âû ïðåðâàëè âûïîëíåíèå êîäà íàæàòèåì íà êëàâèøó Esc
èëè íà Ctrl+Break; ðàçäåë ñïðàâêè êîíñòàòèðóåò, ÷òî âûïîëíåíèå êîäà
áûëî ïðåêðàùåíî â ðåçóëüòàòå íàæàòèÿ íà Esc èëè Ctrl+Break, è äàåò èí-
ñòðóêöèè, êàê ââåñòè ðåæèì Break èëè çàêîí÷èòü âûïîëíåíèå êîäà.

Ðèñ. 7.2
VBA îòîáðàæàåò ýòî îêíî, êîãäà âû
íàæèìàåòå Esc èëè Ctrl+Break äëÿ
ïðåðûâàíèÿ âûïîëíÿþùåéñÿ
ïðîöåäóðû (èëè ìàêðîñà)
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 283

Íå ñëåäóåò ïðåðûâàòü VBA âî âðåìÿ îòîáðàæåíèÿ äèàëîãîâîãî îêíà; íåîá-


õîäèìî çàêðûòü âñå îêíà ââîäà, îêíà ñîîáùåíèÿ èëè äðóãèå äî òîãî, êàê âû
ïðåðâåòå ïðîöåäóðó.
 çàâèñèìîñòè îò êîíêðåòíîãî öèêëà è îïåðàòîðîâ, êîòîðûå â íåì ñîäåð-
æàòñÿ, VBA ìîæåò íå ðåàãèðîâàòü íà îäíî íàæàòèå íà Esc èëè Ctrl+Break.
 äåéñòâèòåëüíîñòè, îáû÷íî íåîáõîäèìî íàæèìàòü è óäåðæèâàòü íàæàòîé
êëàâèøó Esc äëÿ ïðåðûâàíèÿ âûïîëíÿþùåéñÿ ïðîöåäóðû. Åñëè âû óäåðæè-
âàåòå íàæàòîé êëàâèøó Esc, âû ìîæåòå íå÷àÿííî çàêðûòü îêíî ñîîáùåíèÿ
î runtime-îøèáêå. Â ðåçóëüòàòå ýòîãî îêíî ñîîáùåíèÿ îá îøèáêå ìîæåò ïðî-
ìåëüêíóòü íà ýêðàíå ñëèøêîì áûñòðî, è âû íå ñìîæåòå åãî ïðî÷èòàòü. Åñëè
òàêîå ñëó÷èòñÿ, íå ñòîèò áåñïîêîèòüñÿ, âû ìîæåòå ïîíÿòü, êàêîé öèêë áûë çà-
áëîêèðîâàí, çíàÿ, íàñêîëüêî áûëà âûïîëíåíà ïðîöåäóðà ïåðåä ñáîåì.

Èñïîëüçîâàíèå öèêëîâ, òåñòèðóþùèõ óñëîâèÿ


äî âûïîëíåíèÿ òåëà öèêëà
Äëÿ VBA-òåñòèðîâàíèÿ óñëîâèÿ äåòåðìèíàíòà öèêëà äî âûïîëíåíèÿ òåëà
öèêëà ñëåäóåò ïîìåùàòü ëîãè÷åñêîå âûðàæåíèå äëÿ äåòåðìèíàíòà öèêëà â íà-
÷àëî áëîêà îïåðàòîðîâ, ñîñòàâëÿþùåãî òåëî öèêëà.

Öèêëû Do While
Ïåðâîé êîíñòðóêöèåé öèêëà, òåñòèðóþùåé ñâîå óñëîâèå äåòåðìèíàíòà äî
âûïîëíåíèÿ öèêëà, ÿâëÿåòñÿ Do While ñî ñëåäóþùèì ñèíòàêñèñîì:
Ñèíòàêñèñ
Do While Condition
Statements
Loop
Condition — ëîãè÷åñêîå âûðàæåíèå äëÿ äåòåðìèíàíòà öèêëà; Statements — îäèí,
íè îäíîãî èëè íåñêîëüêî îïåðàòîðîâ, êîòîðûå ñîñòàâëÿþò òåëî öèêëà. Êëþ÷åâîå
ñëîâî Loop ïîñëå Statements óêàçûâàåò íà îêîí÷àíèå òåëà öèêëà è îáîçíà÷àåò ìå-

ñòî, èç êîòîðîãî VBA âîçâðàùàåòñÿ â íà÷àëî öèêëà äëÿ ïðîâåðêè óñëîâèÿ äåòåðìè-
íàíòà (ñì. ñõåìó 7.2).

 îïåðàòîðå Do While âûðàæåíèå Condition íàõîäèòñÿ â íà÷àëå öèêëà, ïî-


ýòîìó VBA ïðîâåðÿåò óñëîâèå äåòåðìèíàíòà äî âûïîëíåíèÿ öèêëà. Ïîñêîëüêó
284 Ãëàâà 7

â ýòîé ôîðìå èñïîëüçóåòñÿ êëþ÷åâîå ñëîâî 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.

Ëèñòèíã 7.6. Äåìîíñòðàöèÿ öèêëà Do While


1: Sub Test_DoWhile()
2: 'ñ÷èòàåò íå÷åòíûå ÷èñëà, ââîäèìûå ïîëüçîâàòåëåì;
3: 'çàïîìèíàåò ñòðîêó ñ íå÷åòíûìè ÷èñëàìè;
4: 'îñòàíàâëèâàåòñÿ, êîãäà èõ ñóììà íå÷åòíûõ ÷èñåë ïðåâûñèò 100;
5: 'âûâîäèò ñòðîêó ñ íå÷åòíûìè ÷èñëàìè â äèàëîãîâîì îêíå
6:
7: Const ocTitle = "Ñóììàòîð íå÷åòíûõ ÷èñåë"
8:
9: Dim OddSum As Integer 'ñóììà íå÷åòíûõ ÷èñåë
10: Dim OddStr As String 'ñòðîêà ñ íå÷åòíûìè ÷èñëàìè
11: Dim Num 'äëÿ ïðèåìà äàííûõ ïîëüçîâàòåëÿ
12:
13: OddStr = "" 'èíèöèàëèçàöèÿ âûõîäíîé ñòðîêè
14: OddSum = 0 'èíèöèàëèçàöèÿ ñóììû OddSum
15:
16: Do While OddSum < 100 'íà÷àëî öèêëà
17: Num = InputBox("Ââåäèòå ÷èñëî:", ocTitle)
18: If (Num Mod 2) <> 0 Then 'ïðîâåðêà íà ÷åòíîñòü
19: OddSum = OddSum + Num 'èçìåíåíèå ñóììû OddSum
20: OddStr = OddStr & Num & " "
21: End If
22: Loop
23:
24: 'âûâîä ñòðîêè ñ íå÷åòíûìè ÷èñëàìè:
25: MsgBox prompt:="Âû ââåëè ñëåäóþùèå íå÷åòíûå " & _
26: "÷èñëà: " & Chr(13) & OddStr, _
27: Title:=ocTitle
28: End Sub

Ïðîöåäóðà Test_DoWhile äåìîíñòðèðóåò èñïîëüçîâàíèå öèêëà Do While.


Öèêë â ïðîöåäóðå âûïîëíÿåòñÿ, ïîêà ñóììà ââåäåííûõ ïîëüçîâàòåëåì íå÷åò-
íûõ ÷èñåë [íå÷åòíîå (odd) ÷èñëî — ýòî ÷èñëî, êîòîðîå íåëüçÿ ðàçäåëèòü íà 2
áåç îñòàòêà] ìåíüøå 100. Î÷åâèäíî, ÷òî ýòó çàäà÷ó íåëüçÿ âûïîëíèòü ñ ïîìî-
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 285

ùüþ öèêëà For…Next (áåç äîïîëíèòåëüíîãî èñïîëüçîâàíèÿ óñëîâíîãî îïåðàòî-


ðà).
Çàìåòüòå, ÷òî ïåðåìåííàÿ OddSum, êîòîðàÿ âõîäèò â óñëîâèå äåòåðìèíàí-
òà, èçìåíÿåòñÿ òîëüêî, êîãäà ïîëüçîâàòåëü ââîäèò íå÷åòíîå ÷èñëî. Ïîýòîìó
öèêë Do While â ýòîé ïðîöåäóðå âñåãäà áóäåò âûïîëíÿòüñÿ ðàçëè÷íîå êîëè÷å-
ñòâî ðàç: âñå çàâèñèò îò ïîëüçîâàòåëüñêîãî ââîäà.
Åñëè âû íå ðàç çàïóñòèòå ýòó ïðîöåäóðó, òî, âåðîÿòíî, îáðàòèòå âíèìàíèå,
÷òî â äèàëîãîâîì îêíå ââîäà, êðîìå êíîïêè OK, íàõîäèòñÿ êíîïêà Cancel. ×åì
ìåíüøèå íå÷åòíûå ÷èñëà âû áóäåòå ââîäèòü äëÿ òåñòèðîâàíèÿ ïðîöåäóðû, òåì
÷àùå (òàê êàê ñóììà áóäåò ðàñòè ìåäëåííî) áóäåòå âèäåòü, ýòè äâå êíîïêè. Êî-
ãäà-íèáóäü âû ïîääàäèòåñü ñîáëàçíó íàæàòü íà êíîïêó Cancel, è óâèäèòå, ÷òî
ïðîãðàììà ïðåêðàòèò ðàáîòó ñ âûäà÷åé îêíà runtime-îøèáêè. Ýòî îáñòîÿòåëü-
ñòâî íå ÿâëÿåòñÿ òàêèì óæ íåîæèäàííûì: ïðîãðàììà ðàññ÷èòàíà íà «ïðàâèëü-
íîãî» ïîëüçîâàòåëÿ, êîòîðûé äîëæåí ââîäèòü ÷åòíûå è íå÷åòíûå ÷èñëà è íå
«êàïðèçíè÷àòü». Êîíå÷íî, åñëè áû ìû ìîãëè óáðàòü èç äèàëîãîâîãî îêíà êíîï-
êó Cancel, òî âñå ïðîáëåìû áûëè áû ðåøåíû.
Âûõîä èç ýòîé ñèòóàöèè ìîæåò áûòü îäèí — ïðîâåðÿòü, íå áûëà ëè íàæàòà
êíîïêà Cancel âî âðåìÿ ââîäà ÷èñåë.  ëèñòèíãå 7.7 ñîäåðæèòñÿ êîä, êîòîðûé
ó÷èòûâàåò âîçìîæíîñòü îòêàçà îò ââîäà äàííûõ.

Ëèñòèíã 7.7. Äåìîíñòðàöèÿ öèêëà Do While

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

Ïðîãðàììà Test_DoWhile2 íåìíîãî ïðîäâèíóòà îòíîñèòåëüíî ñâîåé ïðåä-


øåñòâåííèöû. Âî-ïåðâûõ, îíà ïîçâîëÿåò ââîäèòü â äèàëîãå ïðåäåë ñóììû íå-
÷åòíûõ ÷èñåë, ïîñëå êîòîðîãî ïðîèñõîäèò âûõîä èç öèêëà (ñòðîêà 18), âî-âòî-
ðûõ, â îêíå ââîäà ìîæíî èñïîëüçîâàòü âñå (äâå) êíîïêè, òàê êàê îïåðàòîðû
â ñòðîêàõ 19 è 23 ïðîâåðÿþò, íå áûëà ëè íàæàòà êíîïêà Cancel, è â ïåðâîì ñëó-
÷àå (ñòðîêà 19) ïðåêðàùàþò âûïîëíåíèå ïðîöåäóðû, à âî âòîðîì (ñòðîêà 23) —
öèêëà Do While.
Âî âñÿêîì ñëó÷àå, åñëè âû ðàçðàáàòûâàåòå êîä íå äëÿ ñåáÿ, ñëåäóåò ó÷èòû-
âàòü äàæå òàêèå ìåëî÷è. Èíà÷å ïîëüçîâàòåëåé âàøèõ òåñòîâ áóäóò áîëüøå çà-
íèìàòü ïðîáëåìû íåðàáîòîñïîñîáíîñòè êîäà, ÷åì åãî àëãîðèòìè÷åñêàÿ ñóù-
íîñòü.

Öèêëû 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).

VBA òåñòèðóåò óñëîâèå äåòåðìèíàíòà öèêëà Do Until äî âûïîëíåíèÿ îïå-


ðàòîðîâ öèêëà. Ïîñêîëüêó ýòà ôîðìà âêëþ÷àåò êëþ÷åâîå ñëîâî Until, VBA
âûïîëíÿåò öèêë, ïîêà ëîãè÷åñêîå âûðàæåíèå, ïðåäñòàâëåííîå âûðàæåíèåì
Condition, ðàâíî çíà÷åíèþ False.
Ïðè âûïîëíåíèè öèêëà Do Until VBA ñíà÷àëà òåñòèðóåò ëîãè÷åñêîå âûðà-
æåíèå, ïðåäñòàâëåííîå ñ ïîìîùüþ Condition; åñëè îíî ðàâíî False, VBA âû-
ïîëíÿåò îïåðàòîðû, ïðåäñòàâëåííûå ñ ïîìîùüþ Statements. Ïîñëå äîñòèæå-
íèÿ êëþ÷åâîãî ñëîâà Loop VBA âîçâðàùàåòñÿ â íà÷àëî öèêëà è ñíîâà ïðîâåðÿ-
åò, ðàâíî ëè ëîãè÷åñêîå âûðàæåíèå Condition çíà÷åíèþ False. Åñëè Condition
ðàâíî False, VBA âûïîëíÿåò öèêë ñíîâà; åñëè æå îíî ðàâíî True, VBA ïðî-
äîëæàåò âûïîëíåíèå êîäà ñ îïåðàòîðîâ ïîñëå êëþ÷åâîãî ñëîâà Loop, ò.å. ïðå-
êðàùàåò ðàáîòó öèêëà.
Åñëè Condition ðàâíî True, êîãäà VBA âñòðå÷àåò îïåðàòîð Do Until â ïåð-
âûé ðàç, VBA ïðîïóñêàåò öèêë áåç åãî âûïîëíåíèÿ. Ò.å. öèêë Do Until ïîçâî-
ëÿåò íè ðàçó íå âûïîëíÿòü îïåðàòîðû âíóòðè íåãî.
 ëèñòèíãå 7.8 ïîêàçàí ïðîñòîé ïðèìåð öèêëà Do Until, êîòîðûé íåîäíî-
êðàòíî ïîëó÷àåò ÷èñëî îò ïîëüçîâàòåëÿ, ïðåêðàùàÿñü, êîãäà ïîëüçîâàòåëü ââî-
äèò ÷åòíîå ÷èñëî, áîëüøåå 10.
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 287

Ëèñòèíã 7.8. Äåìîíñòðàöèÿ öèêëà Do Until


1: Sub Test_DoUntil()
2: 'ïðèíèìàåò îò ïîëüçîâàòåëÿ ÷èñëà, ïîêà íå áóäåò
3: 'ââåäåíî ÷åòíîå ÷èñëî, áîëüøåå äåñÿòè
4:
5: Const evTitle = "Îñòàíîâ ïðè ÷åòíîì, áîëüøåì äåñÿòè"
6:
7: Dim EvenFlag As Boolean
8: Dim Num
9:
10: EvenFlag = False
11: Do Until EvenFlag
12: Num = InputBox("Ââåäèòå ÷èñëî:", evTitle)
13: If Len(Num) = 0 Or TypeName(Num) <> "Integer" Then Exit Do
14: If ((Num Mod 2) = 0) Then
15: If Num > 10 Then
16: MsgBox prompt:="Âû ââåëè ÷åòíîå ÷èñëî, " & _
17: "áîëüøåå, ÷åì 10 - Öèêë çàêàí÷èâàåòñÿ", _
18: Title:=evTitle
19: EvenFlag = True
20: Else
21: MsgBox prompt:="Âû ââåëè ÷åòíîå ÷èñëî, " & _
22: "ìåíüøåå, ÷åì (èëè ðàâíîå) 10", _
23: Title:=evTitle
24: End If
25: Else
26: MsgBox prompt:="Âû ââåëè íå÷åòíîå ÷èñëî", _
27: Title:=evTitle
28: End If
29: Loop
30:
31: MsgBox prompt:="Âûïîëíåíèå öèêëà ïðåêðàùåíî", Title:=evTitle
32: End Sub

Ïðîöåäóðà Test_DoUntil ïîêàçûâàåò, êàê ïîñòðîèòü öèêë Do Until. Öèêë


â ýòîé ïðîöåäóðå äåìîíñòðèðóåò óïðàâëÿåìûé óñëîâèåì öèêë è âûïîëíÿåòñÿ
äî òåõ ïîð, ïîêà ïîëüçîâàòåëü íå ââåäåò ÷åòíîå ÷èñëî, áîëüøåå 10. Óñëîâèå, çà-
êàí÷èâàþùåå âûïîëíåíèå öèêëà — ýòî ââîä ïîëüçîâàòåëåì ÷åòíîãî ÷èñëà. Íà
ñàìîì äåëå, ýòèì óñëîâèåì ÿâëÿåòñÿ ïîëó÷åíèå çíà÷åíèÿ True ïåðåìåííîé
EvenFlag, ÷òî ïðîèñõîäèò (â ñòðîêå 19), êîãäà êîä îáíàðóæèâàåò ñ ïîìîùüþ
âëîæåííûõ îïåðàòîðîâ If (â ñòðîêàõ 14–15) ôàêò ââåäåíèÿ ïîëüçîâàòåëåì ÷åò-
íîãî ÷èñëà, áîëüøåãî 10.
Ïåðåä âûïîëíåíèåì öèêëà ïåðåìåííîé EvenFlag ïðèñâàèâàåòñÿ çíà÷åíèå
False, ÷åì è îáåñïå÷èâàåòñÿ, ïî êðàéíåé ìåðå, ïåðâîå âûïîëíåíèå öèêëà.
Âíóòðè öèêëà îðãàíèçóåòñÿ ïðèåì ÷èñëà, è àíàëèç åãî íà ïðåäìåò ÷åòíîñòè
è ïðåâûøåíèÿ 10. Åñëè ýòè ïîñëåäíèå ïðîâåðêè äàþò ïîëîæèòåëüíûé ðåçóëü-
òàò, âûâîäèòñÿ ñîîáùåíèå (ñòðîêè 16–17) îá îêîí÷àíèè öèêëà è ïåðåìåííàÿ
EvenFlag ïîëó÷àåò çíà÷åíèå True, ÷òî ïðèâîäèò ê îêîí÷àíèþ öèêëà.
 ñòðîêå 13 íàõîäèòñÿ îïåðàòîð, ïðåäóïðåæäàþùèé âîçíèêíîâåíèå
runtime-îøèáîê ïðè ðàáîòå ñ ïðîãðàììîé ïîëüçîâàòåëåé, ñêëîííûõ ê ýêñïåðè-
ìåíòàì.
288 Ãëàâà 7

Èñïîëüçîâàíèå öèêëîâ, òåñòèðóþùèõ óñëîâèÿ


ïîñëå âûïîëíåíèÿ òåëà öèêëà
Äëÿ VBA-òåñòèðîâàíèÿ óñëîâèé ïîñëå âûïîëíåíèÿ òåëà öèêëà íåîáõîäèìî
ïîìåñòèòü ëîãè÷åñêîå âûðàæåíèå äëÿ äåòåðìèíàíòà öèêëà â êîíåö áëîêà îïå-
ðàòîðîâ, ñîñòàâëÿþùèõ òåëî öèêëà, ïîñëå êëþ÷åâîãî ñëîâà Loop, êîòîðîå ñîîá-
ùàåò î êîíöå öèêëà.

Öèêëû Do…Loop While


Ïåðâàÿ ðàññìàòðèâàåìàÿ íàìè êîíñòðóêöèÿ öèêëà, òåñòèðóþùàÿ óñëîâèå
äåòåðìèíàíòà ïîñëå âûïîëíåíèÿ òåëà öèêëà, — ýòî Do…Loop While.
Îïåðàòîð Do…Loop While èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Do
Statements
Loop While Condition
Statements — îäèí, íè îäíîãî èëè íåñêîëüêî îïåðàòîðîâ VBA, ñîñòàâëÿþùèõ òåëî
öèêëà. Êëþ÷åâîå ñëîâî Loop ïîñëå Statements îáîçíà÷àåò êîíåö òåëà öèêëà è òàê-
æå óêàçûâàåò ìåñòî, èç êîòîðîãî VBA âîçâðàùàåòñÿ â íà÷àëî öèêëà; Condition
ïðåäñòàâëÿåò ëîãè÷åñêîå âûðàæåíèå äëÿ äåòåðìèíàíòà öèêëà (ñì. ñõåìó 7.3).

 ýòîé ôîðìå ñèíòàêñèñà îïåðàòîðà Do…Loop While VBA ïðîâåðÿåò óñëîâèå


äåòåðìèíàíòà ïîñëå âûïîëíåíèÿ îïåðàòîðîâ öèêëà. Ïîñêîëüêó ýòà ôîðìà îïå-
ðàòîðà Do èñïîëüçóåò êëþ÷åâîå ñëîâî While, VBA âûïîëíÿåò öèêë, ïîêà ëîãè-
÷åñêîå âûðàæåíèå, ïðåäñòàâëåííîå ñ ïîìîùüþ Condition, ðàâíî True.
Ïðè âûïîëíåíèè îïåðàòîðà Do…Loop While VBA ñíà÷àëà âûïîëíÿåò îïåðà-
òîðû, ïðåäñòàâëåííûå ñ ïîìîùüþ Statements. Êîãäà VBA äîñòèãàåò êëþ÷åâûõ
ñëîâ Loop While, âûïîëíÿåòñÿ òåñòèðîâàíèå ëîãè÷åñêîãî âûðàæåíèÿ, ïðåä-
ñòàâëåííîãî ñ ïîìîùüþ Condition; åñëè ýòî âûðàæåíèå ðàâíî True, VBA âîç-
âðàùàåòñÿ â íà÷àëî öèêëà è ñíîâà âûïîëíÿåò òåëî öèêëà. Êîãäà VBA ñíîâà
äîñòèãàåò êëþ÷åâûõ ñëîâ Loop While â êîíöå öèêëà, ñíîâà âûïîëíÿåòñÿ ïðî-
âåðêà, ÿâëÿåòñÿ ëè ëîãè÷åñêîå âûðàæåíèå Condition âñå åùå ðàâíûì True.
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 289

Åñëè Condition ðàâíî True, VBA âûïîëíÿåò öèêë ñíîâà; åñëè — íåò, VBA ïðî-
äîëæàåò âûïîëíåíèå êîäà ñ ëþáûõ îïåðàòîðîâ ïîñëå ñòðîêè, ñîäåðæàùåé êëþ-
÷åâîå ñëîâî Loop, ò.å. ïðåêðàùàåò ðàáîòó öèêëà.
Çàìåòüòå, ÷òî íåçàâèñèìî îò çíà÷åíèÿ ëîãè÷åñêîãî âûðàæåíèÿ, ïðåäñòàâ-
ëåííîãî ñ ïîìîùüþ âûðàæåíèÿ Condition, ýòîò öèêë âñåãäà âûïîëíÿåòñÿ, ïî
êðàéíåé ìåðå, îäèí ðàç. (Ñðàâíèòå ñ öèêëàìè, ïðîâåðÿþùèìè óñëîâèå äåòåð-
ìèíàíòà äî âûïîëíåíèÿ òåëà öèêëà.)
Ïðîöåäóðà Test_DoLoopWhile â ëèñòèíãå 7.9 èñïîëüçóåò êîíñòðóêöèþ öèê-
ëà Do…Loop While äëÿ ïîëó÷åíèÿ â äèàëîãîâîì îêíå äàííûõ îò ïîëüçîâàòåëÿ
äî òåõ ïîð, ïîêà ïîëüçîâàòåëü íå ââåäåò ñëîâî «exit», óêàçûâàÿ íà òî, ÷òî ââîä
äàííûõ çàâåðøåí.

Ëèñòèíã 7.9. Ïðèìåð èñïîëüçîâàíèÿ ñòðóêòóðû Do…Loop While


1: Sub Test_DoLoopWhile()
2: 'äåìîíñòðèðóåò ñòðóêòóðó Do...Loop While. Öèêë
3: 'ïîâòîðÿåòñÿ, ïîêà íå áóäåò ââåäåíî ñëîâî "exit"
4:
5: Const iTitle = "Ââîä äàííûõ"
6: Dim uStr As String
7:
8: Do
9: uStr = InputBox(prompt:="Ââåäèòå ñòðîêó " & _
10: "('exit' äëÿ îêîí÷àíèÿ):", _
11: Title:=iTitle, _
12: Default:="exit")
13: 'îïåðàòîðû îáðàáîòêè èëè ïðîâåðêè ââîäèìûõ äàííûõ
14: 'èëè ñîõðàíåíèÿ äàííûõ â ÿ÷åéêàõ ðàáî÷åãî ëèñòà è ò.ä.
15: MsgBox prompt:="Âû ââåëè: " & uStr, Title:=iTitle
16: Loop While uStr <> "exit"
17:
18: MsgBox prompt:="Ââîä äàííûõ çàâåðøåí.", _
19: Title:=iTitle, buttons:=vbExclamation
20: End Sub

Ïî-âèäèìîìó, êîììåíòèðîâàòü çäåñü íå÷åãî. Ê ìîìåíòó ðàññìîòðåíèÿ ýòîãî


ëèñòèíãà âû äîëæíû èìåòü çíàíèÿ, äîñòàòî÷íûå äëÿ òîãî, ÷òîáû ïîíÿòü ïðåä-
ñòàâëåííûé êîä.

Öèêëû Do…Loop Until


Äëÿ ïîñòðîåíèÿ Do-öèêëà, òåñòèðóþùåãî ñâîå óñëîâèå äåòåðìèíàíòà ïîñëå
âûïîëíåíèÿ òåëà öèêëà ìîæíî òàêæå èñïîëüçîâàòü ôîðìó Do…Loop Until
îïåðàòîðà Do.
Îïåðàòîð Do…Loop Until èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Do
Statements
Loop Until Condition
Statements ïðåäñòàâëÿåò îïåðàòîðû VBA, ñîñòàâëÿþùèå òåëî öèêëà; Condition —
ëîãè÷åñêîå âûðàæåíèå äëÿ äåòåðìèíàíòà öèêëà (ñì. äèàãðàììó ñèíòàêñèñà öèêëà
Do…Loop While).
290 Ãëàâà 7

VBA ïðîâåðÿåò óñëîâèå äåòåðìèíàíòà öèêëà Do…Loop Until ïîñëå âûïîë-


íåíèÿ òåëà öèêëà. Ïîñêîëüêó ýòà ôîðìà Do-îïåðàòîðà èñïîëüçóåò êëþ÷åâîå
ñëîâî Until, VBA âûïîëíÿåò öèêë, ïîêà ëîãè÷åñêîå âûðàæåíèå, ïðåäñòàâëåí-
íîå ñ ïîìîùüþ Condition, ðàâíî False.
Ïðè âûïîëíåíèè îïåðàòîðà Do…Loop Until VBA ñíà÷àëà âûïîëíÿåò îïåðà-
òîðû, ïðåäñòàâëåííûå ñ ïîìîùüþ Statements. Êîãäà VBA äîñòèãàåò êëþ÷åâîãî
ñëîâà Loop, âûïîëíÿåòñÿ òåñòèðîâàíèå ëîãè÷åñêîãî âûðàæåíèÿ, ïðåäñòàâëåí-
íîãî ñ ïîìîùüþ Condition; åñëè ëîãè÷åñêîå âûðàæåíèå ðàâíî False, VBA âîç-
âðàùàåòñÿ â íà÷àëî öèêëà è ñíîâà âûïîëíÿåò òåëî öèêëà. Êîãäà VBA ñíîâà
äîñòèãàåò êëþ÷åâîãî ñëîâà Loop â êîíöå öèêëà, ñíîâà âûïîëíÿåòñÿ ïðîâåðêà,
ÿâëÿåòñÿ ëè ëîãè÷åñêîå âûðàæåíèå Condition ðàâíûì False. Åñëè Condition
ðàâíî False, VBA âûïîëíÿåò öèêë ñíîâà; åñëè îíî ðàâíî True, VBA ïðîäîë-
æàåò âûïîëíåíèå êîäà ñ ëþáûõ îïåðàòîðîâ ïîñëå ñòðîêè, ñîäåðæàùåé êëþ÷å-
âîå ñëîâî Loop, ò.å. ïðåêðàùàåò ðàáîòó öèêëà.
Çàìåòüòå, ÷òî ýòîò öèêë âñåãäà âûïîëíÿåòñÿ, ïî êðàéíåé ìåðå, îäèí ðàç, íå-
çàâèñèìî îò çíà÷åíèÿ ëîãè÷åñêîãî âûðàæåíèÿ, ïðåäñòàâëåííîãî ñ ïîìîùüþ
Condition. (Ñðàâíèòå ñ öèêëàìè, ïðîâåðÿþùèìè óñëîâèå äåòåðìèíàíòà äî âû-
ïîëíåíèÿ òåëà öèêëà.)
Ïðîöåäóðà Test_DoLoopWhile â ëèñòèíãå 7.10 èñïîëüçóåò êîíñòðóêöèþ
öèêëà Do…Loop While äëÿ ïîëó÷åíèÿ äàííûõ ââîäà îò ïîëüçîâàòåëÿ äî òåõ
ïîð, ïîêà ïîëüçîâàòåëü íå ââåäåò ñëîâî «exit», óêàçûâàÿ íà òî, ÷òî ââîä äàí-
íûõ çàâåðøåí.

Ëèñòèíã 7.10. Ïðèìåð èñïîëüçîâàíèÿ ñòðóêòóðû Do…Loop Until


1: Sub Test_DoLoopUntil()
2: 'äåìîíñòðèðóåò ñòðóêòóðó Do…Loop Until. Öèêë
3: 'ïîâòîðÿåòñÿ, ïîêà íå áóäåò ââåäåíî ñëîâî "exit"
4:
5: Const iTitle = "Ââîä äàííûõ"
6: Dim uStr As String
7:
8: Do
9: uStr = InputBox(prompt:="Ââåäèòå ñòðîêó " & _
10: "('exit' äëÿ îêîí÷àíèÿ):", _
11: Title:=iTitle, _
12: Default:="exit")
13: 'îïåðàòîðû îáðàáîòêè èëè ïðîâåðêè ââîäèìûõ äàííûõ
14: 'èëè ñîõðàíåíèÿ äàííûõ â ÿ÷åéêàõ ðàáî÷åãî ëèñòà è ò.ä.
15: MsgBox prompt:="Âû ââåëè: " & uStr, Title:=iTitle
16: Loop Until uStr = "exit"
17:
18: MsgBox prompt:="Ââîä äàííûõ çàâåðøåí.", _
19: Title:=iTitle, buttons:=vbExclamation
20: End Sub

Êîä ýòîãî ëèñòèíãà ïðàêòè÷åñêè íè÷åì íå îòëè÷àåòñÿ îò êîäà ïðåäûäóùåãî


ëèñòèíãà, êðîìå òîãî, ÷òî çäåñü èñïîëüçóåòñÿ ñòðóêòóðà Do…Loop Until, à íå
Do…Loop While (ñòðîêà 16).
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 291

Âëîæåííûå öèêëû
Ìîæíî ïîìåùàòü öèêëû âíóòðü äðóãèõ öèêëîâ, àíàëîãè÷íî òîìó, êàê ìîæ-
íî ïîìåùàòü îïåðàòîðû If…Then îäèí â äðóãîé. Ïîìåùåíèå îäíîé ñòðóêòóðû
öèêëà â äðóãóþ íàçûâàþò âëîæåíèåì (nesting) öèêëîâ. Ìîæíî ïîìåùàòü
ñòðóêòóðû öèêëîâ ëþáîãî òèïà (ñìåøàííûå For è Do öèêëû) â ëþáîé óðîâåíü.
¨ Ïðè âëîæåíèè öèêëîâ íåîáõîäèìî ñîáëþäàòü ñëåäóþùèå ïðàâèëà:
¨ Ïðè âëîæåíèè öèêëîâ For…Next êàæäûé öèêë äîëæåí èìåòü ñâîþ óíè-
êàëüíóþ ïåðåìåííóþ ñ÷åò÷èêà.
¨ Ïðè âëîæåíèè öèêëîâ For Each…Next êàæäûé öèêë äîëæåí èìåòü ñâîþ
óíèêàëüíóþ element-ïåðåìåííóþ.
¨ Åñëè âû èñïîëüçóåòå îïåðàòîð Exit For èëè Exit Do âî âëîæåííîì öèê-
ëå, ýòèì îïåðàòîðîì çàêàí÷èâàåòñÿ òîëüêî âûïîëíÿåìûé â äàííûé ìî-
ìåíò öèêë; VBA ïðîäîëæàåò âûïîëíåíèå ñëåäóþùåãî öèêëà áîëåå âûñî-
êîãî óðîâíÿ.

Âëîæåíèå öèêëîâ For


 ëèñòèíãå 7.11 ïîêàçàíà ïðîñòàÿ ïðîöåäóðà, êîòîðàÿ èñïîëüçóåò âëîæåí-
íûå öèêëû For…Next. Ïðîöåäóðà Test_ForNext ïðåäíàçíà÷åíà äëÿ èñïîëüçî-
âàíèÿ â Excel è ïðèìåíÿåò ïîëóæèðíûé øðèôò ê ïåðâûì n (ââîäèòñÿ ïîëüçî-
âàòåëåì) ñòðîêàì ïåðâûõ m (ââîäèòñÿ ïîëüçîâàòåëåì) ñòîëáöîâ àêòèâíîãî
â äàííûé ìîìåíò ðàáî÷åãî ëèñòà. Âíåøíèé öèêë â ïðîöåäóðå ñ÷èòàåò ñòðîêè,
à âíóòðåííèé — ñòîëáöû.

Ëèñòèíã 7.11. Âëîæåííûå öèêëû For…Next


1: Sub Test_ForNext()
2: 'Ïðèìåíÿåò øðèôò Arial, ïîëóæèðíûé
3: 'ê ïåðâûì n ñòðîêàì è m ñòîëáöàì àêòèâíîé ðàáî÷åé êíèãè
4: Dim sTitle As String
5: Dim Rnum As Integer, Cnum As Integer
6:
7: Dim n As Integer, m As Integer
8: sTitle = "Ôîðìàòèðîâàíèå ÿ÷ååê ëèñòà"
9:
10: n = Application.InputBox(prompt:="Ââåäèòå ÷èñëî ñòðîê", _
11: Title:="Ôîðìàòèðîâàíèå ÿ÷ååê", Type:=1)
12: If n = 0 Then Exit Sub
13:
14: m = Application.InputBox(prompt:="Ââåäèòå ÷èñëî ñòîëáöîâ", _
15: Title:="Ôîðìàòèðîâàíèå ÿ÷ååê", Type:=1)
16: If m = 0 Then Exit Sub
17:
18: Worksheets("Sheet1").Activate
19: For Rnum = 1 To n
20: For Cnum = 1 To m
21:
22: Cells(Rnum, Cnum).Select
23:
24: With Selection.Font
25: .Name = "Arial"
26: .FontStyle = "Bold"
27: .Strikethrough = False
292 Ãëàâà 7

28: .Superscript = False


29: .Subscript = False
30: .OutlineFont = False
31: .Shadow = False
32: .Underline = xlNone
33: .ColorIndex = xlAutomatic
34: End With
35:
36: Next Cnum
37: Next Rnum
38: End Sub

Ïðîöåäóðà Test_ForNext èñïîëüçóåò öèêëû For…Next, îäèí, âëîæåííûé


â äðóãîé, äëÿ ïðèìåíåíèÿ ïîëóæèðíîãî øðèôòà Arial ê ÿ÷åéêàì ëèñòà, íà÷è-
íàÿ ñ ïåðâîé è çàêàí÷èâàÿ â ñòðîêå n è ñòîëáöå m. Çíà÷åíèÿ n è m ââîäÿòñÿ
â ñòðîêàõ 10–11, 14–15 ïðè ïîìîùè ìåòîäà Application.InputBox, êîòî-
ðûé, êàê óæå îòìå÷àëîñü, ïîçâîëÿåò ñîêðàòèòü ïðîâåðî÷íûé êîä ïîëüçîâàòåëÿ
èñïîëüçîâàíèåì íåîáÿçàòåëüíîãî àðãóìåíòà Type. Ïðè çíà÷åíèè Type, ðàâíîì
1, ïîëüçîâàòåëü íå ñìîæåò ââåñòè â îêíå ââîäà íè÷åãî, êðîìå ÷èñëà. Âû ìîæå-
òå ñàìè â ýòîì óáåäèòüñÿ. Íàáîð ÷åãî-ëèáî, íå ïîõîæåãî íà ÷èñëî, ïðèâåäåò
ê âûäà÷å îêíà ñîîáùåíèÿ, ïîäîáíîãî ïðèâåäåííîìó íà ðèñ. 7.3.

Ðèñ. 7.3
Excel-ìåòîä Application.InputBox íå
ïîçâîëÿåò ââîäèòü íè÷åãî, êðîìå òîãî, ÷òî
îïðåäåëåíî åãî íåîáÿçàòåëüíûì
àðãóìåíòîì Type

Êðîìå êîíòðîëÿ çà ââîäîì, â ïðîöåäóðå ïðîâåðÿåòñÿ, íå ââåäåíû ëè íóëå-


âûå èëè îòðèöàòåëüíûå çíà÷åíèÿ äëÿ n è m (ñòðîêè 12, 16). Ðàáîòà ïðîöåäóðû
ïðîäîëæàåòñÿ òîëüêî ïðè ââåäåíèè ïîëîæèòåëüíûõ çíà÷åíèé ýòèõ ïåðåìåí-
íûõ.
Ñ÷åò÷èê âíåøíåãî öèêëà For…Next èçìåíÿåòñÿ îò 1 äî n, è ïðîöåäóðà èñ-
ïîëüçóåò ïåðåìåííóþ ñ÷åò÷èêà âíåøíåãî öèêëà äëÿ ïðåäîñòàâëåíèÿ êîîðäè-
íàò ñòðîêè êàæäûé ðàç ïðè âûïîëíåíèè öèêëà. Ñëåäîâàòåëüíî, âíåøíèé öèêë
îáðàáàòûâàåò n ñòðîê îò íà÷àëà ðàáî÷åãî ëèñòà.
Ñ÷åò÷èê âíóòðåííåãî öèêëà For…Next èçìåíÿåòñÿ îò 1 äî m, è ïðîöåäóðà
èñïîëüçóåò ïåðåìåííóþ ñ÷åò÷èêà âíóòðåííåãî öèêëà äëÿ ïðåäîñòàâëåíèÿ êî-
îðäèíàò ñòîëáöà êàæäûé ðàç ïðè âûïîëíåíèè öèêëà. Ñëåäîâàòåëüíî, âíóòðåí-
íèé öèêë îáðàáàòûâàåò â ðàáî÷åì ëèñòå m ñòîëáöîâ ñëåâà íàïðàâî.
 ñòðîêå 22 èñïîëüçóåòñÿ ìåòîä Cells îáúåêòà Application Excel äëÿ âîç-
âðàùåíèÿ îáúåêòà Range, îïðåäåëåííîãî ñ èñïîëüçîâàíèåì Rnum è Cnum â êà-
÷åñòâå êîîðäèíàò ñòðîêè è ñòîëáöà. Îïåðàòîð èñïîëüçóåò òàêæå ìåòîä Select
îáúåêòà Range äëÿ âûáîðà çàäàííîé ÿ÷åéêè â àêòèâíîì ðàáî÷åì ëèñòå. Îïåðà-
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 293

òîð Cells áûë ñêîïèðîâàí èç çàïèñàííîãî ðåêîðäåðîì ìàêðîñà, êîòîðûé ñî-


äåðæàë òîëüêî äâà äåéñòâèÿ: âûáîð ÿ÷åéêè è ïðèìåíåíèå íóæíîãî ôîðìàòèðî-
âàíèÿ. Îïåðàòîð âûáîðà ÿ÷åéêè áûë ñêîïèðîâàí â ýòó ïðîöåäóðó, à ëèòåðàëü-
íûå çíà÷åíèÿ èç çàïèñàííîãî ðåêîðäåðîì îïåðàòîðà áûëè çàìåíåíû
ïåðåìåííûìè Rnum è Cnum.
 ñòðîêàõ 24–34 ðàñïîëîæåí îïåðàòîð With, èñïîëüçóåìûé äëÿ òåêóùåãî
âûäåëåííîãî ôðàãìåíòà (ÿ÷åéêè). Îáúåêò Selection.Font ñîäåðæèò âñå óñòà-
íîâêè øðèôòà äëÿ òåêóùåãî âûáîðà. Îïåðàòîðû âíóòðè With (â ñòðîêàõ
25–33) èçìåíÿþò ñâîéñòâà îáúåêòà Selection.Font òàê, ÷òîáû âûáîð èìåë
íóæíûé ïîëóæèðíûé øðèôò Arial. Ýòè îïåðàòîðû áûëè òàêæå ñêîïèðîâàíû
èç çàïèñàííîãî ðåêîðäåðîì ìàêðîñà.

Âëîæåííûå öèêëû Do
 ëèñòèíãå 7.9 ïîêàçàíà ïðîöåäóðà, èñïîëüçóþùàÿ âëîæåííûå öèêëû Do,
÷òîáû ïîëüçîâàòåëü ìîã âûïîëíèòü ââîä äàííûõ, íåîáõîäèìûõ äëÿ ïîëó÷åíèÿ
íàêëàäíîé. Âíåøíèé öèêë â ïðîöåäóðå MakeInv ïîëó÷àåò íîìåðà íàêëàäíûõ
îò ïîëüçîâàòåëÿ äî òåõ ïîð, ïîêà ïîëüçîâàòåëü íå îòìåíèò îêíî ââîäà. Âíóò-
ðåííèé öèêë â ïðîöåäóðå MakeInv ïîëó÷àåò ýëåìåíòû çàïèñåé íàêëàäíîé äî
òåõ ïîð, ïîêà ïîëüçîâàòåëü íå îòìåíèò îêíî ââîäà. Êîãäà âû áóäåòå èçó÷àòü ýòó
ïðîöåäóðó, ïîìíèòå, ÷òî ýòî ïðîñòî ýñêèçíàÿ ïðîöåäóðà. Íà ñàìîì äåëå âàì,
âåðîÿòíî, ïîòðåáóåòñÿ ïîëó÷èòü ãîðàçäî áîëüøå èíôîðìàöèè, ÷åì èñïîëüçóåò-
ñÿ çäåñü. Âàì, êîíå÷íî, ïðåäñòîèò òàêæå ñàìèì ïèñàòü êîä äëÿ çàíåñåíèÿ ââî-
äèìîé èíôîðìàöèè â êàêèå-ëèáî õðàíèëèùà äàííûõ. (Ëèñòèíã 7.12 áóäåò âû-
ïîëíÿòüñÿ è â Excel, è â Word).

Ëèñòèíã 7.12. Âëîæåííûå öèêëû Do


1: Sub MakeInv()
2: 'îáåñïå÷èâàåò ââîä äàííûõ äëÿ íàêëàäíûõ è ýëåìåíòû
3: 'çàïèñåé äëÿ êàæäîé íàêëàäíîé. Âíåøíèé öèêë ïîëó÷àåò
4: 'èíôîðìàöèþ îá îòäåëüíîé íàêëàäíîé, âíóòðåííèé -
5: 'î çàïèñÿõ ýòîé íàêëàäíîé (íàèìåíîâàíèå è êîëè÷åñòâî
6: 'òîâàðà)
7:
8: Const miTitle = ""
9:
10: Dim InvcNum As String * 5 'íîìåð íàêëàäíîé
11: Dim ItemNum1 As String * 16
12: Dim ItemNum2 As String * 16
13: Dim ItemDone As Boolean
14: Dim InvcDone As Boolean
15: Dim pos As Integer
16:
17:
18: InvcDone = False
19: Do Until False
20: InvcNum = InputBox(prompt:="Ââåäèòå íîìåð íàêëàäíîé:", _
21: Title:=miTitle)
22: If Trim(InvcNum) = "" Then
23: MsgBox prompt:="Îòìåíà ââîäà íàêëàäíîé.", _
24: Title:="Ââîä íàêëàäíûõ", Buttons:=vbExclamation
25: Exit Do
26: End If
27:
294 Ãëàâà 7

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

Ïðîöåäóðà MakeInv äåìîíñòðèðóåò ïðèìåíåíèå âëîæåííûõ Do-öèêëîâ íà


ïðèìåðå èìèòàöèè ââîäà íàêëàäíûõ.  ïðîöåäóðå èñïîëüçîâàíû áåñêîíå÷íûå
öèêëû (ñòðîêè 19, 29), âûõîä èç êîòîðûõ îñóùåñòâëÿåòñÿ îïåðàòîðîì Exit Do
(ñòðîêè 25, 50). Íàêëàäíàÿ èìååò íîìåð è çàïèñè, âêëþ÷àþùèå íàèìåíîâàíèå
òîâàðà è êîëè÷åñòâî.
Íîìåðà íàêëàäíûõ ââîäÿòñÿ âî âíåøíåì öèêëå (íà÷èíàåòñÿ â ñòðîêå 19).
Ñðàçó ïîñëå ââîäà íàêëàäíîé ïðîèçâîäèòñÿ ïðîâåðêà íåîáõîäèìîñòè âûõîäà èç
öèêëà (ñòðîêè 22–26). Åñëè ïîëüçîâàòåëü íå ââåë íîìåð èëè íàæàë êíîïêó
Cancel, âíåøíèé öèêë ïðåêðàùàåòñÿ ñ ïðåäâàðèòåëüíûì ñîîáùåíèåì îá îòìåíå
ââîäà íàêëàäíîé (ñòðîêè 23–24 ).
Ïåðåä íà÷àëîì âûïîëíåíèÿ âíóòðåííåãî öèêëà ïåðåìåííîé pos (ñ÷åò÷èê
êîëè÷åñòâà ïîçèöèé â íàêëàäíîé) ïðèñâàèâàåòñÿ çíà÷åíèå 1 (ñòðîêà 28).
 êîíöå âíóòðåííåãî öèêëà (ñòðîêà 60) çíà÷åíèå ñ÷åò÷èêà óâåëè÷èâàåòñÿ íà
åäèíèöó. Â òåëå âíóòðåííåãî öèêëà ââîäÿòñÿ íàèìåíîâàíèÿ (ñòðîêè 32–34)
è êîëè÷åñòâà (ñòðîêè 43–45) òîâàðîâ. Ïîñëå ââîäà êàæäîãî èç ýòèõ ýëåìåíòîâ
ïðîèçâîäèòñÿ ïðîâåðêà ââîäà (ñòðîêè 35–40, 46–50), ïîñëå êîòîðîé âûïîëíå-
íèå âíóòðåííåãî öèêëà ìîæåò áûòü çàâåðøåíî îïåðàòîðàìè Exit Do (ñòðîêè
39, 50). Åñëè íàèìåíîâàíèå è êîëè÷åñòâî òîâàðîâ ââåäåíû óñïåøíî, â êîíöå
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 295

âíóòðåííåãî öèêëà (ñòðîêè 55–58) ïðîèçâîäèòñÿ êîíòðîëüíàÿ âûäà÷à ââåäåí-


íûõ äàííûõ íà ýêðàí.

Ïðèìåð èñïîëüçîâàíèÿ êîëëåêöèè â Word


Ïðåäûäóùàÿ ãëàâà áûëà ïîñâÿùåíà îáúåêòàì è êîëëåêöèÿì ïðèëîæåíèé.
Çäåñü ìû ðàññìîòðèì ïðèìåð èñïîëüçîâàíèÿ êîëëåêöèè Selection â Word
(òåêóùàÿ âûäåëåííàÿ ÷àñòü) ñ ïðèìåíåíèåì öèêëà For…Next.
Äëÿ âûäåëåíèÿ â òåêñòå äàííîé êíèãè íàèìåíîâàíèé ýëåìåíòîâ óïðàâëåíèÿ
äèàëîãîâûõ îêîí èñïîëüçóåòñÿ øðèôò Arial, Bold. Íàïðèìåð, êíîïêà Cancel.
Ïðè ïåðâîé âåðñòêå îêàçàëîñü, ÷òî íà ôîíå îñíîâíîãî òåêñòà òàêîé øðèôò
ñëèøêîì âåëèê. Ïðàâèëüíåå áûëî áû óìåíüøèòü åãî íà îäèí ïóíêò. Òàê âîç-
íèêëà çàäà÷à — íàïèñàòü ìàêðîñ, êîòîðûé äîëæåí óìåíüøèòü ðàçìåð øðèôòà
äëÿ ñëîâ, îòôîðìàòèðîâàííûõ ïðè ïîìîùè Arial, Bold.
 ëèñòèíãå 7.13 ïðèâåäåí êîä ïðîöåäóðû, êîòîðàÿ (â ñòðîêå 6) îïðåäåëÿåò êîëè-
÷åñòâî âûäåëåííûõ àáçàöåâ, à çàòåì â öèêëå For…Next (ñòðîêè 9–22) äëÿ êàæäîãî
àáçàöà ïðîâåðÿåò åãî ñòèëü (ñâîéñòâî Selection.Paragraphs(i).Style). Åñëè
íàèìåíîâàíèå ñòèëÿ ñîâïàäàåò ñ «Îáû÷íûé», «Ðèñ_òåêñò» è äð., òî âî âëîæåííîì
öèêëå (ñòðîêè 15–20) äëÿ êàæäîãî ñëîâà àáçàöà ïðîâåðÿåòñÿ èìÿ ôîíòà. Ïðè ñîâ-
ïàäåíèè åãî ñ Arial ñâîéñòâî Font.Size óìåíüøàåòñÿ íà åäèíèöó (ñòðîêà 17).

Ëèñòèíã 7.13. Ôîðìàòèðîâàíèå îòäåëüíûõ ñëîâ äîêóìåíòà


1: Sub ÇàìåíàArial()
2: 'óìåíüøàåò ðàçìåð ñëîâà, îòôîðìàòèðîâàííîãî êàê Aria, Bold
3: Dim ZZ
4:
5: 'êîëè÷åñòâî âûäåëåííûõ àáçàöåâ:
6: ii = Selection.Paragraphs.Count()
7:
8: 'öèêë ïî àáçàöàì:
9: For i = 1 To ii
10: If Selection.Paragraphs(i).Style = "Îáû÷íûé" Or _
11: Selection.Paragraphs(i).Style = "Ðèñ_òåêñò" Or _
12: Selection.Paragraphs(i).Style = "Ðèñ_íîìåð" _
13: Or Selection.Paragraphs(i).Style = "Îñíîâíîé òåêñò" _
14: Or Selection.Paragraphs(i).Style = "No" Then
15: For j = 1 To Selection.Paragraphs(i).Range.Words.Count
16: If Selection.Paragraphs(i).Range.Words(j).Font.Name =
"Arial" Then
17: ZZ =
Selection.Paragraphs(i).Range.Words(j).Font.Size - 1
18: Selection.Paragraphs(i).Range.Words(j).Font.Size = ZZ
19: End If
20: Next
21: End If
22: Next
23:
24: End Sub

Ìàññèâû
Ìàññèâ (array) — ýòî êîëëåêöèÿ ïåðåìåííûõ, êîòîðûå èìåþò îáùèå èìÿ
è áàçîâûé òèï. Ìàññèâ ÿâëÿåòñÿ óäîáíûì ñïîñîáîì õðàíåíèÿ íåñêîëüêèõ ñâÿ-
çàííûõ ýëåìåíòîâ äàííûõ â åäèíîì êîíòåéíåðå äëÿ áîëüøåãî óäîáñòâà è ýô-
296 Ãëàâà 7

ôåêòèâíîñòè ïðîãðàììèðîâàíèÿ. Âñå ýëåìåíòû äàííûõ, ñîõðàíÿåìûõ â ìàññè-


âå, äîëæíû èìåòü îäèí è òîò æå òèï; íàïðèìåð, ïðè ñîçäàíèè ìàññèâà äëÿ ñî-
õðàíåíèÿ òèïîâ Integer (Double, String, Currency è ò.ä.) âñå ýëåìåíòû
äàííûõ, ñîõðàíåííûõ â ýòîì ìàññèâå, äîëæíû áûòü ÷èñëàìè Integer
(Double, String, Currency è ò.ä.).
Ìàññèâ ïîçâîëÿåò ñîõðàíÿòü è ìàíèïóëèðîâàòü ìíîãèìè ýëåìåíòàìè äàí-
íûõ ïîñðåäñòâîì åäèíñòâåííîé ïåðåìåííîé. Êðîìå óìåíüøåíèÿ îáùåãî ÷èñëà
ðàçëè÷íûõ èìåí ïåðåìåííûõ, êîòîðûå íåîáõîäèìî îòñëåæèâàòü, äðóãèì îñ-
íîâíûì ïðåèìóùåñòâîì èñïîëüçîâàíèÿ ìàññèâîâ ÿâëÿåòñÿ òî, ÷òî ìîæíî èñ-
ïîëüçîâàòü öèêëû äëÿ ëåãêîé îáðàáîòêè ðàçëè÷íûõ ýëåìåíòîâ ìàññèâîâ. Îáúå-
äèíÿÿ ìàññèâû è ñòðóêòóðû öèêëà (îáû÷íî For…Next èëè For…Each), ìîæíî
íàïèñàòü íåáîëüøîå ÷èñëî îïåðàòîðîâ, êîòîðûå îáðàáàòûâàþò áîëüøîé îáúåì
äàííûõ. Âûïîëíåíèå òåõ æå çàäà÷ ñ èñïîëüçîâàíèåì îòäåëüíûõ ïåðåìåííûõ
ìîæåò ïîòðåáîâàòü íàïèñàíèÿ ñîòåí îïåðàòîðîâ.

Ðàçìåðíîñòü ìàññèâà
 ÿçûêàõ ïðîãðàììèðîâàíèÿ îáû÷íî èñïîëüçóþòñÿ îäíîìåðíûå è ìíîãî-
ìåðíûå ìàññèâû, îäíè èç êîòîðûõ îïèñûâàþò îòíîñèòåëüíî ïðîñòûå, à äðó-
ãèå — áîëåå ñëîæíûå îáúåêòû.

Îäíîìåðíûå ìàññèâû
Íàèìåíåå ñëîæíûé ìàññèâ — ýòî ïðîñòî ñïèñîê ýëåìåíòîâ äàííûõ; òàêîãî
ðîäà ìàññèâ íàçûâàåòñÿ ïðîñòûì (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.

10.2 11.2 22.1 1.1 21.3 123.0 0.11 1.1


0-é 1-é 2-é 3-é 4-é 5-é 6-é 7-é
ýëåìåíò ýëåìåíò ýëåìåíò ýëåìåíò ýëåìåíò ýëåìåíò ýëåìåíò ýëåìåíò
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 297

Ðèñ. 7.4. Îäíîìåðíûé ÷èñëîâîé ìàññèâ; îäíîìåðíûå ìàññèâû — ýòî, â îñíîâíîì, ïðîñòî
ñïèñêè äàííûõ îäíîãî è òîãî æå òèïà

Ïîñìîòðèòå ñíîâà íà ðèñ. 7.5 è îáðàòèòå âíèìàíèå, ÷òî ýëåìåíò ìàññèâà


ñ íîìåðîì 6 ñîäåðæèò çíà÷åíèå 0.11. Ïðè âûïîëíåíèè ïðèâåäåííîãî âûøå
îïåðàòîðà VBA âûáèðàåò çíà÷åíèå 0.11 èç óêàçàííîãî ýëåìåíòà ìàññèâà è ñî-
õðàíÿåò ýòî çíà÷åíèå â ïåðåìåííîé DoubleAny — òî÷íî òàê æå, êàê â ëþáîì
äðóãîì ïðèñâàèâàíèè ïåðåìåííîé.
Ìîæíî òàêæå èñïîëüçîâàòü èíäåêñ âñÿêèé ðàç, êîãäà íåîáõîäèìî ñîõðà-
íèòü äàííûå â îòäåëüíîì ýëåìåíòå ìàññèâà. Íàïðèìåð, ñëåäóþùèé îïåðàòîð
ñîõðàíÿåò ÷èñëî 12.3 â âîñüìîì ýëåìåíòå ìàññèâà, ïîêàçàííîì íà ðèñ. 7.5:
DoubleArray (7) = 12.3
Ïðè âûïîëíåíèè ýòîãî îïåðàòîðà VBA ïîìåùàåò çíà÷åíèå 12.3 â óêàçàííûé
ýëåìåíò ìàññèâà, çàìåíÿÿ ïðåäûäóùåå ñîäåðæèìîå ýòîãî ýëåìåíòà — òî÷íî
òàê æå, êàê â ëþáîì äðóãîì ïðèñâàèâàíèè ïåðåìåííîé. Ìîæíî èñïîëüçîâàòü
ýëåìåíò ìàññèâà â ëþáîì âûðàæåíèè VBA — òî÷íî òàê æå, êàê èñïîëüçóåòñÿ
çíà÷åíèå êîíñòàíòû èëè ïåðåìåííîé â êàêîì-ëèáî âûðàæåíèè.
Îäíîìåðíûå ìàññèâû îáû÷íî èñïîëüçóþòñÿ äëÿ ïðåäñòàâëåíèÿ ðàçëè÷íûõ
ñïèñêîâ äàííûõ.

Ìíîãîìåðíûå ìàññèâû
Îäíîìåðíûå ìàññèâû õîðîøî ïîäõîäÿò äëÿ ïðåäñòàâëåíèÿ ïðîñòûõ ñïèñêîâ
äàííûõ. Îäíàêî ÷àñòî áûâàåò íåîáõîäèìî ïðåäñòàâèòü òàáëèöû äàííûõ â ïðî-
ãðàììàõ ñ îðãàíèçàöèåé äàííûõ â ôîðìàòå ñòðîê è ñòîëáöîâ, ïîäîáíî ÿ÷åéêàì
â ðàáî÷èõ ëèñòàõ Excel. Äëÿ ýòîãî íåîáõîäèìî èñïîëüçîâàòü ìíîãîìåðíûå
(multi-dimensional) ìàññèâû. Ïîñêîëüêó âû óæå èìååòå îïûò ðàáîòû ñ ÿ÷åéêà-
ìè Excel, òî íåò íåîáõîäèìîñòè â ïîäðîáíîì ðàçúÿñíåíèè ñóùíîñòè äâóìåðíî-
ãî ìàññèâà. Àäðåñ êàæäîé ÿ÷åéêè ëèñòà ñîñòîèò èç äâóõ ÷èñåë (èçìåðåíèé),
îäíî èç êîòîðûõ (íîìåð ñòðîêè) ÿâëÿåòñÿ ïåðâûì èíäåêñîì, à âòîðîå (íîìåð
ñòîëáöà) — âòîðûì èíäåêñîì ìàññèâà. Íà ïðèìåðå îðãàíèçàöèè ëèñòîâ Excel
ìîæíî ïðåäñòàâèòü è òðåõìåðíûå ìàññèâû. Çäåñü òðåòüèì èíäåêñîì ìàññèâà
ìîæåò áûòü íîìåð ëèñòà.
 VBA ìîæíî òàêæå ñîçäàâàòü ìàññèâû, èìåþùèå áîëåå òðåõ èçìåðåíèé;
ôàêòè÷åñêè, VBA ïîçâîëÿåò ñîçäàâàòü ìàññèâû, èìåþùèå äî 60 èçìåðåíèé. Ðà-
áîòà ñ ìàññèâàìè, èìåþùèìè 4 èëè áîëåå èçìåðåíèé, áûñòðî ñòàíîâèòñÿ çàïó-
òàííîé; ê ñ÷àñòüþ, âàì, âåðîÿòíî, íå ïðèäåòñÿ ðàáîòàòü ñ òàêèìè ìàññèâàìè.
×àùå âñåãî â ïðîãðàììèðîâàíèè èñïîëüçóþòñÿ îäíî- è äâóìåðíûå ìàññèâû.

Ñòàòè÷åñêèå è äèíàìè÷åñêèå ìàññèâû


 ñëåäóþùåì ðàçäåëå âû óçíàåòå, ÷òî ÷èñëî ýëåìåíòîâ â ìàññèâå îáû÷íî çà-
äàåòñÿ âî âðåìÿ îáúÿâëåíèÿ ìàññèâà. Îáúÿâëåíèå ìàññèâà óêàçûâàåò VBA âå-
ëè÷èíó ðàçëè÷íûõ èçìåðåíèé ìàññèâà (äèàïàçîí èçìåíåíèÿ êàæäîãî èíäåê-
ñà). Ïîñëå òîãî êàê ìàññèâ îáúÿâëåí, VBA âûäåëÿåò äîñòàòî÷íûé îáúåì ïàìÿ-
òè äëÿ âñåõ ýëåìåíòîâ ìàññèâà. Íàïðèìåð, äëÿ ìàññèâà íà ðèñ. 7.5 VBA
âûäåëèò îáúåì ïàìÿòè, äîñòàòî÷íûé äëÿ 8 ÷èñåë òèïà Double.
Ïåðåìåííûå òèïà ìàññèâ ïîä÷èíÿþòñÿ òåì æå ïðàâèëàì îáëàñòè äåéñòâèÿ,
÷òî è ëþáûå äðóãèå ïåðåìåííûå.
298 Ãëàâà 7

VBA ñîõðàíÿåò çàðåçåðâèðîâàííîé îáëàñòü ïàìÿòè äëÿ âñåõ ýëåìåíòîâ


â ìàññèâå, ïîêà ñóùåñòâóåò ïåðåìåííàÿ òèïà ìàññèâ. Ïîäîáíûå ìàññèâû íàçû-
âàþòñÿ ñòàòè÷åñêèìè (static), ïîòîìó ÷òî ÷èñëî ýëåìåíòîâ â ìàññèâå íå ìåíÿ-
åòñÿ.
Âûáîð ðàçìåðà ìàññèâà ìîæåò áûòü çàòðóäíåí, åñëè íåèçâåñòíî, ñêîëüêî
äàííûõ áóäåò ââåäåíî â ìàññèâ, èëè åñëè îáúåì äàííûõ, ñîáèðàåìûõ äëÿ ìàñ-
ñèâà, çíà÷èòåëüíî ìåíÿåòñÿ. Åñëè âàì èíîãäà ïðèõîäèòñÿ ñîõðàíÿòü 100 çíà-
÷åíèé, à èíîãäà — òîëüêî 10 çíà÷åíèé, òî ïîòåíöèàëüíî íàïðàñíî ðàñõîäóåòñÿ
îáëàñòü ïàìÿòè, íåîáõîäèìàÿ äëÿ ñîõðàíåíèÿ 90 çíà÷åíèé.
Äëÿ ïîäîáíûõ ñèòóàöèé VBA ïîääåðæèâàåò îñîáûé òèï ìàññèâîâ, íàçûâàå-
ìûé äèíàìè÷åñêèì (dynamic) ìàññèâîì. Äèíàìè÷åñêèå ìàññèâû ïîëó÷èëè
ñâîå íàçâàíèå, ïîòîìó ÷òî ìîæíî èçìåíÿòü ÷èñëî ýëåìåíòîâ â ìàññèâå ïðè âû-
ïîëíåíèè VBA-ïðîãðàììû. Äèíàìè÷åñêèé ìàññèâ (â ñî÷åòàíèè ñ ïðàâèëüíûì
ïðîãðàììèðîâàíèåì) ìîæåò óâåëè÷èâàòüñÿ èëè ñæèìàòüñÿ (óìåíüøàòüñÿ
â ðàçìåðå), ÷òîáû âìåùàòü òî÷íî íåîáõîäèìîå ÷èñëî ýëåìåíòîâ áåç íàïðàñíîãî
ðàñõîäîâàíèÿ ïàìÿòè. Äëÿ èçìåíåíèÿ ðàçìåðà äèíàìè÷åñêîãî ìàññèâà èñïîëü-
çóéòå îïåðàòîð ReDim, îïèñûâàåìûé äàëåå â ýòîé ãëàâå.

Îïåðàòîð Option Base


Îáû÷íî â VBA èñïîëüçóþòñÿ ìàññèâû ñ íóëåâîé áàçîé.  ñèñòåìå íóìåðà-
öèè ñ íóëåâîé áàçîé èíäåêñ äëÿ ïåðâîãî ýëåìåíòà â ëþáîì èçìåðåíèè ìàññèâà
ÿâëÿåòñÿ ðàâíûì 0; ìàññèâ ñ 10 ýëåìåíòàìè èìååò èíäåêñû îò 0 äî 9. Î÷åâèä-
íî, ÷òî ñèñòåìà íóìåðàöèè ñ íóëåâîé áàçîé ìîæåò áûòü íåïîíÿòíîé, ïîòîìó
÷òî èíäåêñ 0, â äåéñòâèòåëüíîñòè, îáîçíà÷àåò 1-é ýëåìåíò ìàññèâà, èíäåêñ 5
îáîçíà÷àåò 6-é ýëåìåíò ìàññèâà è òàê äàëåå.
Áûëî áû ãîðàçäî óäîáíåå, åñëè áû ýëåìåíòû ìàññèâà íóìåðîâàëèñü, íà÷è-
íàÿ ñ 1, à íå ñ 0. Åñëè áû íóìåðàöèÿ ýëåìåíòîâ íà÷èíàëàñü ñ 1, òî èíäåêñ 1 îáî-
çíà÷àë áû 1-é ýëåìåíò ìàññèâà, èíäåêñ 5 — 5-ûé è òàê äàëåå.
VBA ïîçâîëÿåò çàäàâàòü íà÷àëüíîå ÷èñëî äëÿ ýëåìåíòîâ ìàññèâà. Ìîæíî çà-
äàâàòü íèæíåå ÷èñëî äëÿ èíäåêñîâ ìàññèâà ïðè îáúÿâëåíèè ìàññèâà (îïèñûâà-
åòñÿ äàëåå â ýòîé ãëàâå), èëè èñïîëüçîâàòü äèðåêòèâó êîìïèëÿòîðà Option
Base äëÿ óêàçàíèÿ òîãî, äîëæíà ëè íóìåðàöèÿ èíäåêñîâ íà÷èíàòüñÿ ñ 0 èëè ñ 1.
Äèðåêòèâà êîìïèëÿòîðà Option Base èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Option Base 0 | 1

Îïåðàòîð Option Base ïîçâîëÿåò çàäàâàòü 0 èëè 1 êàê íà÷àëüíîå ÷èñëî ïî


óìîë÷àíèþ äëÿ èíäåêñîâ ìàññèâà. Åñëè îïåðàòîð Option Base íå èñïîëüçóåò-
ñÿ, VBA íà÷èíàåò íóìåðàöèþ èíäåêñîâ ìàññèâà ñ 0 (ïî óìîë÷àíèþ). Íåîáõîäè-
ìî ïîìåùàòü îïåðàòîð Option Base â îáëàñòü îáúÿâëåíèé ìîäóëÿ ïåðåä îáú-
ÿâëåíèÿìè ëþáûõ ïåðåìåííûõ, êîíñòàíò èëè ïðîöåäóð. Íåëüçÿ ïîìåùàòü îïå-
ðàòîð Option Base âíóòðè ïðîöåäóðû. Ìîæíî èìåòü òîëüêî îäèí îïåðàòîð
Option Base â ìîäóëå. Îïåðàòîð Option Base âëèÿåò íà âñå ìàññèâû, îáúÿâ-
ëÿåìûå â ìîäóëå, íåçàâèñèìî îò òîãî, ÿâëÿþòñÿ ëè îíè ëîêàëüíûìè â ïðîöåäó-
ðå èëè îáúÿâëÿþòñÿ íà ìîäóëüíîì óðîâíå.
Ñëåäóþùèå äâà îïåðàòîðà ÿâëÿþòñÿ ïðèìåðàìè äèðåêòèâû êîìïèëÿòîðà
Option Base:
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 299

Option Base 0 'óñòàíîâêà ïî óìîë÷àíèþ


Option Base 1 'èíäåêñû ìàññèâîâ íà÷èíàþòñÿ ñ 1

Îáúÿâëåíèå ìàññèâîâ
Âû óæå çíàêîìû ñ îïåðàòîðîì Dim, èñïîëüçóåìûì äëÿ îáúÿâëåíèÿ ïåðå-
ìåííûõ. Ýòîò æå îïåðàòîð èñïîëüçóåòñÿ è äëÿ îáúÿâëåíèÿ ìàññèâîâ. Â äåéñò-
âèòåëüíîñòè, êëþ÷åâîå ñëîâî Dim ÿâëÿåòñÿ ñîêðàùåíèåì ñëîâà dimension (èç-
ìåðåíèå).  îðèãèíàëüíîì ÿçûêå ïðîãðàììèðîâàíèÿ BASIC êëþ÷åâîå ñëîâî
Dim èñïîëüçîâàëîñü èñêëþ÷èòåëüíî äëÿ èçìåíåíèÿ ðàçìåðîâ ìàññèâîâ
(dimensioning), îòñþäà è ñîêðàùåíèå Dim. Îäíàêî ñîâðåìåííûé ÿçûê VBA ðàñ-
øèðèë èñïîëüçîâàíèå êëþ÷åâîãî ñëîâà Dim äî èñïîëüçîâàíèÿ ñî âñåìè ïåðå-
ìåííûìè. Ñ ïîìîùüþ Dim ìîæíî îáúÿâëÿòü êàê îäíîìåðíûå, òàê è ìíîãîìåð-
íûå ìàññèâû.
Îáúÿâëåíèå ìàññèâà ñ ïîìîùüþ îïåðàòîðà Dim èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Dim VarName([Subscripts]) [As Type]
VarName — ëþáîå èìÿ äëÿ ìàññèâà, óäîâëåòâîðÿþùåå VBA-ïðàâèëàì äëÿ èìåí
èäåíòèôèêàòîðîâ. Subscripts — èçìåðåíèå (èçìåðåíèÿ) ìàññèâà. Ìîæíî îáúÿâëÿòü
ìàññèâû, èìåþùèå äî 60 èçìåðåíèé. Äëÿ îäíîìåðíîãî ìàññèâà âêëþ÷àåòñÿ îäèí
Subscripts; äëÿ äâóìåðíîãî ìàññèâà — äâà (îòäåëåííûå äðóã îò äðóãà çàïÿòîé) è òàê
äàëåå. Êàæäûé Subscripts äîáàâëÿåò íîâîå èçìåðåíèå â ìàññèâ.

Ìîæíî òàêæå îáúÿâëÿòü ñòàòè÷åñêèå è äèíàìè÷åñêèå ìàññèâû, èñïîëüçóÿ


êëþ÷åâûå ñëîâà Public, Private è Static — òî÷íî òàê æå, êàê äëÿ ëþáîé
äðóãîé ïåðåìåííîé è ñ òåì æå âëèÿíèåì íà îáëàñòü äåéñòâèÿ. Èñïîëüçóéòå ïî-
êàçàííûé çäåñü ñèíòàêñèñ îáúÿâëåíèÿ ìàññèâà è ïðîñòî ïîäñòàâëÿéòå êëþ÷å-
âîå ñëîâî Public, Private èëè Static âìåñòî êëþ÷åâîãî ñëîâà Dim, åñëè íå-
îáõîäèìî.
Îïåðàòîð Subscripts èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
[lower To] upper [,[lower To] upper]...
Çäåñü lower îïðåäåëÿåò íèæíèé äèàïàçîí äîïóñòèìûõ èíäåêñîâ äëÿ ìàññèâà;
upper — âåðõíèé ïðåäåë. Çàìåòüòå, ÷òî òîëüêî âåðõíèé ïðåäåë ÿâëÿåòñÿ îáÿçàòåëü-
íûì; ÷àñòü lower To îïåðàòîðà Subscripts ÿâëÿåòñÿ íåîáÿçàòåëüíîé. Ïðè îïðåäåëå-
íèè òîëüêî ïðåäåëà upper VBA íóìåðóåò ýëåìåíòû ìàññèâà â çàâèñèìîñòè îò óñòà-
íîâêè Option Base. Åñëè äåéñòâóåò óñòàíîâêà Option Base 1, VBA íóìåðóåò ýëå-
ìåíòû â ìàññèâå îò 1 äî upper; èíà÷å — îò 0 äî upper.

Âêëþ÷åíèå ÷àñòè lower To îïåðàòîðà Subscripts ïîìîãàåò ñäåëàòü êîä áîëåå


ëåãêèì è ïîíÿòíûì, à òàêæå âûÿâèòü îøèáêè ïðîãðàììèðîâàíèÿ. Ýòî òàêæå
ïîçâîëÿåò îïðåäåëÿòü èíîé íà÷àëüíûé èíäåêñ äëÿ ìàññèâà, ÷åì 0 èëè 1. Íà-
ïðèìåð, ìîæíî ñîçäàòü ìàññèâ ñ ýëåìåíòàìè, èìåþùèìè íîìåðà îò 5 äî 10 èëè
îò –5 äî 0, â çàâèñèìîñòè îò êîíêðåòíîé âûïîëíÿåìîé çàäà÷è.
Ïîäîáíî îáû÷íûì îáúÿâëåíèÿì ïåðåìåííûõ, ìîæíî îáúÿâëÿòü
îïðåäåëåííûé òèï äàííûõ äëÿ ìàññèâà, âêëþ÷àÿ â îáúÿâëåíèå îïåðàòîð As
type. Ïðè ýòîì type ïðåäñòàâëÿåò ëþáîé äîïóñòèìûé òèï VBA — Currency,
Double, String è òàê äàëåå. Ìîæíî òàêæå îáúÿâëÿòü ìàññèâû, èìåþùèå
300 Ãëàâà 7

îïðåäåëåííûé ïîëüçîâàòåëåì òèï (ñîçäàíèå ïîëüçîâàòåëüñêèõ òèïîâ â êíèãå


íå ðàññìàòðèâàåòñÿ). Åñëè îïóñòèòü type, âñå ýëåìåíòû â ìàññèâå èìåþò òèï
Variant. VBA èíèöèàëèçèðóåò ýëåìåíòû ÷èñëîâûõ ìàññèâîâ íóëÿìè
è ýëåìåíòû ñòðîêîâûõ ìàññèâîâ ïóñòûìè ñòðîêàìè.
Çàìåòüòå, ÷òî îïåðàòîð Subscripts ÿâëÿåòñÿ íåîáÿçàòåëüíûì. Äëÿ ñîçäàíèÿ
äèíàìè÷åñêîãî ìàññèâà íå èñïîëüçóéòå îïåðàòîð Subscripts (íåîáõîäèìî âêëþ-
÷àòü êðóãëûå ñêîáêè â îáúÿâëåíèå ìàññèâà, íåçàâèñèìî îò òîãî, îïðåäåëÿåòñÿ
ëè Subscripts).
Ñëåäóþùèå ïðèìåðû ÿâëÿþòñÿ äîïóñòèìûìè îáúÿâëåíèÿìè ìàññèâà:
Dim str_array(1 To 100) As String
Dim variant_array()
Dim str_Multiplication(0 To 15, 0 To 15) As String
Ïðè îáúÿâëåíèè ìàññèâîâ ñëåäóåò ïîìíèòü, ÷òî âêëþ÷åíèå îïåðàòîðà
Subscripts â îáúÿâëåíèå ìàññèâà ñîçäàåò ñòàòè÷åñêèé ìàññèâ ñ ôèêñèðîâàííûì
÷èñëîì ýëåìåíòîâ, ïðîïóñê îïåðàòîðà Subscripts â îáúÿâëåíèè ìàññèâà ñîçäàåò
äèíàìè÷åñêèé ìàññèâ, à óñòàíîâêà Option Base ìîæåò ïîâëèÿòü íà îáùåå
÷èñëî ýëåìåíòîâ â ìàññèâå.

Èñïîëüçîâàíèå ìàññèâîâ
Ïîñëå îáúÿâëåíèÿ ìàññèâà èñïîëüçîâàòü åãî â êîäå VBA äîâîëüíî ïðîñòî.
Êàê óæå îáúÿñíÿëîñü â íà÷àëå ýòîé ãëàâû, äëÿ äîñòóïà ê ýëåìåíòó ìàññèâà íå-
îáõîäèìî óêàçàòü èìÿ ìàññèâà, çà êîòîðûì ñëåäóåò çíà÷åíèå èíäåêñà, çàêëþ-
÷åííîå â êðóãëûå ñêîáêè.
Îáðàùåíèå ê ýëåìåíòó ìàññèâà èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
arrayName(validIndex1, [validIndex2]…)
Çäåñü arrayName — èìÿ ìàññèâà; validIndex1 — äîïóñòèìîå çíà÷åíèå èíäåêñà äëÿ
ïåðâîãî èçìåðåíèÿ ìàññèâà; validIndex2 — äîïóñòèìîå çíà÷åíèå èíäåêñà äëÿ âòî-
ðîãî èçìåðåíèÿ ìàññèâà, åñëè òàêîâîå èìååòñÿ. Íåîáõîäèìî ïðåäîñòàâëÿòü çíà÷å-
íèå èíäåêñà äëÿ êàæäîãî èçìåðåíèÿ ìàññèâà ïðè êàæäîì îáðàùåíèè ê êàêîìó-ëè-
áî ýëåìåíòó â ìàññèâå.

Íàïðèìåð, äëÿ äâóìåðíîãî ìàññèâà íåîáõîäèìî âñåãäà îïðåäåëÿòü äâà èí-


äåêñà. Äîïóñòèìûì èíäåêñîì ÿâëÿåòñÿ ëþáàÿ ïåðåìåííàÿ VBA èëè âûðàæå-
íèå, èìåþùåå ðåçóëüòàòîì öåëîå ÷èñëî â äèàïàçîíå îáúÿâëåííûõ èçìåðåíèé
ìàññèâà. Íàïðèìåð, äîïóñòèìûì çíà÷åíèåì èíäåêñà äëÿ îäíîìåðíîãî ìàññè-
âà, îáúÿâëåííîãî ñ èíäåêñàìè 1–10, ìîæåò áûòü ëþáîå âûðàæåíèå VBA, èìåþ-
ùåå ðåçóëüòàòîì öåëîå ÷èñëî â äèàïàçîíå îò 1 äî 10. Èñïîëüçîâàíèå ìåíüøåãî
èëè áîëüøåãî èíäåêñà, ÷åì äèàïàçîí äëÿ îïðåäåëåííîãî èçìåðåíèÿ â ìàññèâå,
ïðèâîäèò ê òîìó, ÷òî VBA îòîáðàæàåò runtime-îøèáêó.
Ñëåäóþùèé ôðàãìåíò êîäà ïîêàçûâàåò òèïè÷íîå îáúÿâëåíèå è èñïîëüçîâà-
íèå ìàññèâà.
Dim Factorial(0 To 30) As Double 'îáúÿâëåíèå ìàññèâà èç 31 ýëåìåíòà
Factorial(0) = 1 'èíèöèàëèçèðîâàòü 1-é ýëåìåíò
For i = 1 To 30 'íà÷àëî öèêëà äëÿ ðàáîòû ñ ìàññèâîì
Factorial(i) = i* Factorial(i - 1) 'èçìåíèòü i-é ýëåìåíò
Next I
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 301

Ðàññìîòðèì ïðîñòîé ïðèìåð ðàáîòû ñ îäíîìåðíûì ìàññèâîì, ïðåäñòàâëåí-


íûé êîäîì ëèñòèíãà 7.14. Ïðîöåäóðà â ïåðâîì öèêëå For…Next ïðèíèìàåò
â äèàëîãîâîì îêíå öåëûå ÷èñëà (äëÿ ïðîñòîòû áåç âñÿêîé ïðîâåðêè) è çàíîñèò
èõ â ýëåìåíòû ìàññèâà. Âî âòîðîì öèêëå çíà÷åíèÿ ýëåìåíòîâ ìàññèâà çàíîñÿò-
ñÿ â ñòðîêó è âûâîäÿòñÿ íà ýêðàí â äèàëîãîâîì îêíå îïåðàòîðà MsgBox.

Ëèñòèíã 7.14. Ðàáîòà ñî ñòàòè÷åñêèì îäíîìåðíûì ìàññèâîì


1: Sub DemoStatArray()
2: Dim Int_Array(5) As Integer
3: Dim str_msg As String
4:
5: str_msg = ""
6:
7: For i = 1 To 5
8: Int_Array(i) = InputBox("Ââåäèòå öåëîå ÷èñëî äëÿ " _
9: & i & "-ãî ýëåìåíòà ìàññèâà", _
10: "Ââîä ýëåìåíòîâ ìàññèâà")
11: Next
12:
13: For j = 1 To 5
14: str_msg = str_msg & Int_Array(j) & ", "
15: Next
16:
17: MsgBox "Ââåäåíî: " & str_msg, _
18: , "Âûâîä ðàíåå ââåäåííîãî ìàññèâà"
19:
20: End Sub

 ñòðîêå 2 îáúÿâëÿåòñÿ îäíîìåðíûé ìàññèâ Int_Array (ðàçìåðíîñòüþ 5 ýëå-


ìåíòîâ) öåëûõ ÷èñåë Int_Array. Äàëåå (ñòðîêà 3) îáúÿâëåíà ðàáî÷àÿ ïåðåìåí-
íàÿ str_msg äëÿ çàâåðøàþùåãî âûâîäà äàííûõ èç ìàññèâà â äèàëîãîâîì îêíå
(ñòðîêà 19). Â ïåðâîì öèêëå For…Next (ñòðîêè 7–11) â ìàññèâ Int_Array çàïè-
ñûâàþòñÿ çíà÷åíèÿ èç îêíà ââîäà. Îáðàòèòå âíèìàíèå, êàê ôîðìèðóåòñÿ çíà-
÷åíèå àðãóìåíòà Prompt ôóíêöèè InputBox. Íà ðèñ. 7.5 ïðèâåäåí ôðàãìåíò
ââîäà 3-ãî ýëåìåíòà ìàññèâà.
 ñòðîêàõ 13–15 ðàñïîëàãàåòñÿ âòîðîé öèêë, êîòîðûé ôîðìèðóåò ñòðîêó èç
çíà÷åíèé ýëåìåíòîâ ìàññèâà äëÿ âûäà÷è åå â äèàëîãîâîì îêíå (ðèñ. 7.6).
Ïðîöåäóðà DemoStatArray2 â ëèñòèíãå 7.15 ïðåäíàçíà÷åíà äëÿ äåìîíñòðà-

Ðèñ. 7.5
Ôðàãìåíò ââîäà 3-ãî ýëåìåíòà
ìàññèâà

öèè ðàáîòû ñ äâóìåðíûì ìàññèâîì.

Ëèñòèíã 7.15. Ðàáîòà ñî ñòàòè÷åñêèì äâóìåðíûì ìàññèâîì


1: Sub DemoStatArray2()
302 Ãëàâà 7

Ðèñ. 7.6
Ðåçóëüòàò ðàáîòû êîäà ëèñòèíãà 7.14

2: Dim Int_Array(3, 6) As Integer


3: Dim str_msg As String
4:
5: str_msg = ""
6:
7: For i = 1 To 3
8: For j = 1 To 6
9: Int_Array(i,j)=InputBox("Ââåäèòå öåëîå ÷èñëî äëÿ " _
10: & " ýëåìåíòà (" & i & "," & j & ")", _
11: "Ââîä ýëåìåíòîâ ìàññèâà; ñòðîêà " & i)
12: Next j
13: Next i
14:
15: For i = 1 To 3
16: For j = 1 To 6
17: str_msg = str_msg & Int_Array(i, j) & ", "
18: Next j
19:
20: str_msg = str_msg & Chr(13) 'ïåðåâîä ñòðîêè
21: Next i
22:
23: MsgBox "Ââåäåíî: " & Chr(13) & str_msg, _
24: , "Âûâîä ðàíåå ââåäåííîãî ìàññèâà"
25:
26: End Sub

Äëÿ èíèöèàëèçàöèè ìàññèâà èñïîëüçóåòñÿ âëîæåííûé öèêë â ñòðîêàõ


7–13. Îáðàòèòå âíèìàíèå íà ñòðîêè 12–13. Çäåñü, êàê ðàíåå îòìå÷àëîñü, óêà-
çûâàåòñÿ, ïî êàêîé ïåðåìåííîé çàêàí÷èâàåòñÿ öèêë. Ýòî íåîáÿçàòåëüíî, íî
ëó÷øå ïðèâûêíóòü ê òàêîìó ñòèëþ ïðîãðàììèðîâàíèÿ ñ ñàìîãî íà÷àëà.
 îêíå ââîäà òåïåðü äëÿ óêàçàíèÿ, êàêîé ýëåìåíò ââîäèòñÿ â êîíêðåòíûé
ìîìåíò âðåìåíè, âûâîäÿòñÿ îáà èíäåêñà (ðèñ. 7.7). Ýòî óæå äîâîëüíî äðóæåñò-
âåííûé èíòåðôåéñ äëÿ ââîäà äâóìåðíîãî ìàññèâà: ïîëüçîâàòåëþ òðóäíî íå äî-
ãàäàòüñÿ, ÷åãî îò íåãî «äîáèâàåòñÿ» ïðîãðàììà. ×òîáû ïîíÿòü, êàê ýòî äîñòè-
ãàåòñÿ, âíèìàòåëüíî ïðîàíàëèçèðóéòå îïåðàòîð â ñòðîêàõ 9–11.
Âòîðàÿ ÷àñòü ïðîöåäóðû DemoStatArray2 òàêæå ñîñòîèò èç âëîæåííûõ
öèêëîâ è, êàê è â ïðåäûäóùåì ëèñòèíãå, ýòà ÷àñòü ïðåäíàçíà÷åíà äëÿ âûäà÷è
èíèöèàëèçèðîâàííîãî ìàññèâà â îêíå MsgBox ïðè ïîìîùè ïåðåìåííîé

Ðèñ. 7.7
Äðóæåñòâåííûé èíòåðôåéñ äëÿ ââîäà
ýëåìåíòà äâóìåðíîãî ìàññèâà
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 303

str_msg. Äëÿ îñóùåñòâëåíèÿ ýòîé çàäà÷è âî âíóòðåííåì öèêëå (ñòðîêè 16–18)


ôîðìèðóåòñÿ ñòðîêà èç ýëåìåíòîâ ìàññèâà ïðè ïîñòîÿííîì ïåðâîì èíäåêñå (ïå-
ðåìåííàÿ i). Ïðè ýòîì ìåíÿåòñÿ òîëüêî âòîðîé èíäåêñ (ïåðåìåííàÿ j). Ïîñëå
çàïîëíåíèÿ ñòðîêè, íî ïåðåä èçìåíåíèåì ïåðâîãî èíäåêñà ê ïåðåìåííîé
str_msg äîáàâëÿåòñÿ ñèìâîë ïåðåõîäà íà äðóãóþ ñòðîêó (ñòðîêà 20).
Ðåçóëüòàò ðàáîòû êîäà ëèñòèíãà 7.15 ïðèâåäåí íà ðèñ. 7.8.

Èñïîëüçîâàíèå ReDim ñ äèíàìè÷åñêèìè ìàññèâàìè


Ðèñ. 7.8
 ðåçóëüòàòå ðàáîòû êîäà ëèñòèíãà 7.15
èíèöèàëèçèðîâàí ìàññèâ ðàçìåðíîñòüþ 3õ6

Êàê óïîìèíàëîñü ðàíåå â ýòîé ãëàâå, ìîãóò ñëîæèòüñÿ îáñòîÿòåëüñòâà, ïðè


êîòîðûõ òî÷íî íå èçâåñòíî, ñêîëüêî ýëåìåíòîâ ïîòðåáóåòñÿ õðàíèòü â ìàññèâå.
 VBA èìååòñÿ âîçìîæíîñòü ïåðåîïðåäåëÿòü ðàçìåðíîñòü ìàññèâîâ, à âî âðåìÿ
îáúÿâëåíèÿ íå óêàçûâàòü ðàçìåðíîñòü. Èñïîëüçóÿ äèíàìè÷åñêèé ìàññèâ, ìîæ-
íî ñîçäàâàòü ìàññèâ òàêîé áîëüøîé èëè òàêîé ìàëåíüêèé, êàêîé íåîáõîäèìî.
Äèíàìè÷åñêèå ìàññèâû ñîçäàþòñÿ ñ ïîìîùüþ îïåðàòîðà Dim, çàòåì èõ ðàçìåð
óñòàíàâëèâàåòñÿ ñ ïîìîùüþ îïåðàòîðà ReDim âî âðåìÿ âûïîëíåíèÿ ïðîöåäóðû.
Îïåðàòîð ReDim èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
ReDim [Preserve] varname(subscripts) [As type] [, varname(subscripts)
[As type]]
Íåîáÿçàòåëüíîå êëþ÷åâîå ñëîâî Preserve, êàê ïðåäïîëàãàåò åãî èìÿ, ïðèâîäèò
ê òîìó, ÷òî VBA ñîõðàíÿåò äàííûå â èìåþùåìñÿ ìàññèâå, êîãäà èçìåíÿåòñÿ ðàç-
ìåð ìàññèâà ñ ïîìîùüþ ReDim; varname — èìÿ ñóùåñòâóþùåãî ìàññèâà;
subscripts — ýòî èçìåðåíèÿ ìàññèâà (ñèíòàêñèñ äëÿ îïåðàòîðà subscripts â îïåðàòî-
ðå ReDim òàêîé æå, êàê äëÿ îïåðàòîðà Dim); type — ëþáîé òèï VBA èëè îïðåäåëåí-
íûé ïîëüçîâàòåëåì òèï. Íåîáõîäèìî èñïîëüçîâàòü îòäåëüíûé îïåðàòîð As type äëÿ
êàæäîãî ìàññèâà, êîòîðûé âû îïðåäåëÿåòå.

Äàëåå ñëåäóþò äîïóñòèìûå ïðèìåðû îáúÿâëåíèé äèíàìè÷åñêèõ ìàññèâîâ


è âîçìîæíûå îïåðàòîðû ReDim, èñïîëüçóåìûå ñ ýòèìè äèíàìè÷åñêèìè ìàññè-
âàìè:
Dim aMonth() As String 'îáúÿâëÿåò äèíàìè÷åñêèé ìàññèâ aMonth
ReDim aMonth(1 To 30) 'èçìåíÿåò ðàçìåð ìàññèâà äî 30 ýëåìåíòîâ
ReDim aMonth(31) 'èçìåíÿåò ðàçìåð ìàññèâà äî 31 ýëåìåíòà
ReDim Preserve aMonth(1 To 31) 'èçìåíÿåò ðàçìåð ìàññèâà äî 31
'ýëåìåíòà, ñîõðàíÿÿ ñîäåðæèìîå
Dim Table()As Integer 'îáúÿâëÿåò äèíàìè÷åñêèé ìàññèâ
ReDim Table(3, 15) 'äåëàåò ìàññèâ äâóìåðíûì
ReDim Table(4, 20) 'èçìåíÿåò ðàçìåð äâóìåðíîãî ìàññèâà
ReDim Preserve Table(4, 25) 'òîëüêî èçìåíÿåò ïîñëåäíèé ðàçìåð ìàññèâà
Dim Mas as Variant 'îáúÿâëÿåò ïåðåìåííóþ òèïà Variant
ReDim Mas(20) As Integer 'ñîçäàåò ìàññèâ 20 öåëûõ â Variant
304 Ãëàâà 7

Ïðåäûäóùèå ïðèìåðû èëëþñòðèðóþò íåêîòîðûå âàæíûå ìîìåíòû, îòíîñÿ-


ùèåñÿ ê äèíàìè÷åñêèì ìàññèâàì. Âî-ïåðâûõ, ìîæíî èçìåíÿòü òîëüêî ïîñëåä-
íåå èçìåðåíèå ìíîãîìåðíîãî ìàññèâà, êîãäà èñïîëüçóåòñÿ êëþ÷åâîå ñëîâî
Preserve. Âî-âòîðûõ, ìîæíî èñïîëüçîâàòü ReDim äëÿ ñîçäàíèÿ òèïèçèðîâàí-
íîãî ìàññèâà âíóòðè ïåðåìåííîé òèïà Variant. Ïîñêîëüêó ïåðåìåííûå òèïà
Variant ìîãóò ñîäåðæàòü äàííûå ëþáîãî òèïà, ìîæíî èñïîëüçîâàòü ïåðåìåí-
íóþ òèïà Variant äëÿ ñîõðàíåíèÿ äèíàìè÷åñêîãî ìàññèâà! (Èñïîëüçîâàíèå
ïåðåìåííîé òèïà Variant äëÿ ñîõðàíåíèÿ äèíàìè÷åñêîãî ìàññèâà äàåò âîç-
ìîæíîñòü èçìåíÿòü ðàçìåð ìàññèâà ñ ïîìîùüþ ReDim è èçìåíÿòü òèï äàííûõ
ìàññèâà.)
Îáû÷íî îïåðàòîð ReDim èñïîëüçóåòñÿ äëÿ èçìåíåíèÿ ðàçìåðà äèíàìè÷åñêî-
ãî ìàññèâà, êîòîðûé óæå áûë îáúÿâëåí ðàíåå ñ ïîìîùüþ îïåðàòîðîâ Dim,
Private, Public èëè Static. Ìîæíî èñïîëüçîâàòü îïåðàòîð ReDim äëÿ èçìå-
íåíèÿ ÷èñëà ýëåìåíòîâ è èçìåðåíèé â äèíàìè÷åñêîì ìàññèâå ñòîëüêî ðàç,
ñêîëüêî íåîáõîäèìî. Îäíàêî íåëüçÿ èñïîëüçîâàòü îïåðàòîð ReDim äëÿ èçìåíå-
íèÿ òèïà äàííûõ ìàññèâà, åñëè òîëüêî ìàññèâ íå ñîäåðæèòñÿ â ïåðåìåííîé
òèïà Variant èëè ñàìè ýëåìåíòû ìàññèâà íå èìåþò òèï Variant. Åñëè äèíà-
ìè÷åñêèé ìàññèâ ñîõðàíÿåòñÿ â ïåðåìåííîé òèïà Variant, ìîæíî èçìåíÿòü
òèï äàííûõ, èñïîëüçóÿ îïåðàòîð As type â îïåðàòîðå ReDim.
Çàìå÷àíèå
Ïîïûòêà èñïîëüçîâàòü ReDim äëÿ ñòàòè÷åñêîãî ìàññèâà (ìàññèâ, èçìåðåíèÿ êîòîðîãî áûëè ÿâíî
îïðåäåëåíû â îáúÿâëåíèè Dim, Public, Private èëè Static) ïðèâîäèò ê òîìó, ÷òî VBA îòîáðàæàåò
runtime-îøèáêó.

Êîä ëèñòèíãà 7.16 ÿâëÿåòñÿ ïðèìåðîì èñïîëüçîâàíèÿ äèíàìè÷åñêîãî îäíî-


ìåðíîãî ìàññèâà è âûïîëíÿåò çàäà÷ó ââîäà äàííûõ â ìàññèâ, ïîäîáíóþ ðåøàå-
ìîé â ëèñòèíãå 7.14. Ýòî äåëàåòñÿ äëÿ òîãî, ÷òîáû êîíöåíòðèðîâàòü âíèìàíèå
÷èòàòåëÿ íà îòëè÷èÿõ èñïîëüçîâàíèÿ ðàçíûõ òèïîâ ìàññèâîâ, à íå äåòàëÿõ
ðàçëè÷íûõ çàäà÷.

Ëèñòèíã 7.16. Ðàáîòà ñ äèíàìè÷åñêèì îäíîìåðíûì ìàññèâîì


1: Option Base 1
2: Sub DemoDinArray()
3: Dim Int_Array() As Integer
4: Dim str_msg As String, i As Integer
5: Dim Num
6:
7: str_msg = ""
8: i = 0
9:
10: Do
11: i = i + 1
12: Num = InputBox("Ââåäèòå öåëîå ÷èñëî äëÿ " _
13: & i & "-ãî ýëåìåíòà ìàññèâà", _
14: "Ââîä ýëåìåíòîâ ìàññèâà")
15: If Len(Num) = 0 Then Exit Do 'âûõîä èç öèêëà
16:
17: 'èçìåíåíèå ðàçìåðà ìàññèâà
18: 'ñ ñîõðàíåíèåì ýëåìåíòîâ
19: ReDim Preserve Int_Array(i)
20:
21: 'ââîä äàííûõ â i-é ýëåìåíò ìàññèâà
22: Int_Array(i) = Num
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 305

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

 ñòðîêå 3 îáúÿâëåí ìàññèâ Int_Array áåç óêàçàíèÿ ðàçìåðíîñòè. Ýòî ïîäðà-


çóìåâàåò, ÷òî ãäå-òî â êîäå ïðè ïîìîùè îïåðàòîðà ReDim ðàçìåðíîñòü áóäåò
óêàçàíà. Äëÿ ââîäà äàííûõ â ìàññèâ èñïîëüçóåòñÿ áåñêîíå÷íûé öèêë Do (ñòðî-
êè 10–23), òàê êàê êîëè÷åñòâî ââîäèìûõ äàííûõ çàðàíåå íåèçâåñòíî.  öèêëå
â äèàëîãîâîì îêíå ôóíêöèè InputBox (ñòðîêè 12–14) ââîäÿòñÿ çíà÷åíèÿ äëÿ
ýëåìåíòîâ ìàññèâà. Åñëè çíà÷åíèå ââåäåíî (ïîëüçîâàòåëü íå îòêàçàëñÿ îò ââîäà
ïîñðåäñòâîì êíîïêè Cancel), ðàçìåðíîñòü ìàññèâà óâåëè÷èâàåòñÿ (ñòðîêà 19)
ñ ñîõðàíåíèåì ïðåäûäóùèõ çíà÷åíèé ýëåìåíòîâ ìàññèâà è î÷åðåäíîìó (íîâî-
ìó) ýëåìåíòó ìàññèâà ïðèñâàèâàåòñÿ ââåäåííîå çíà÷åíèå (ñòðîêà 22). Çà êîëè-
÷åñòâîì ýëåìåíòîâ â ìàññèâå «ñëåäèò» öåëàÿ ïåðåìåííàÿ i, çíà÷åíèå êîòîðîé
óâåëè÷èâàåòñÿ â íà÷àëå öèêëà. Åñëè ïîëüçîâàòåëü îòêàçûâàåòñÿ îò ââîäà, îïå-
ðàòîð Exit Do (ñòðîêà 15) ïðåêðàùàåò ðàáîòó öèêëà Do. Ïðè ýòîì çíà÷åíèå ïå-
ðåìåííîé i â ýòîò ìîìåíò îêàçûâàåòñÿ íà åäèíèöó áîëüøå ðàçìåðíîñòè ìàññè-
âà: îïåðàòîð â ñòðîêå 11 âûïîëíèëñÿ (óâåëè÷åíèå i), à â ñòðîêå 19 — íåò (óâå-
ëè÷åíèå ðàçìåðíîñòè ìàññèâà).
Âî âòîðîé ÷àñòè ïðîöåäóðû ðàçìåðíîñòü ìàññèâà óæå èçâåñòíà (i–1), ïîýòî-
ìó ìîæíî äëÿ ôîðìèðîâàíèÿ ñòðîêè âûäà÷è íà ýêðàí èñïîëüçîâàòü öèêë ñ îï-
ðåäåëåííûì êîëè÷åñòâîì èòåðàöèé, ò.å. öèêë For…Next (ñòðîêè 25–27). Îñ-
òàëüíîå ïî ïðè÷èíå ñõîäñòâà ñ ïðåäûäóùèìè äâóìÿ ëèñòèíãàìè äîëæíî áûòü
ïîíÿòíî áåç êîììåíòàðèåâ.
 ëèñòèíãå 7.17 ïðèâåäåí êîä, êîòîðûé äåìîíñòðèðóåò îäèí èç âîçìîæíûõ
ñïîñîáîâ ðàáîòû ñ äèíàìè÷åñêèì ìàññèâîì.

Ëèñòèíã 7.17. Ðàáîòà ñ äèíàìè÷åñêèì äâóìåðíûì ìàññèâîì


1: Option Base 1
2: Sub DemoDinArray2()
3: Dim Int_Array1() As Integer
4: Dim Int_Array() As Integer
5: Dim str_msg As String
6: Dim i As Integer, m As Integer, n As Integer
7: Dim Num
8:
9: str_msg = ""
10: i = 0
11:
12: Do
13: i = i + 1
14: Num = InputBox("Ââåäèòå öåëîå ÷èñëî äëÿ " _
15: & i & "-ãî ýëåìåíòà ìàññèâà", _
16: "Ââîä ýëåìåíòîâ ìàññèâà")
17: If Len(Num) = 0 Then Exit Do 'âûõîä èç öèêëà
18:
19: 'èçìåíåíèå ðàçìåðà ìàññèâà
306 Ãëàâà 7

20: 'ñ ñîõðàíåíèåì ýëåìåíòîâ


21: ReDim Preserve Int_Array1(i)
22:
23: 'ââîä äàííûõ â i-é ýëåìåíò ìàññèâà
24: Int_Array1(i) = Num
25: Loop
26:
27: m = i - 1 'âòîðàÿ ðàçìåðíîñòü ìàññèâà
28:
29: 'ââåñòè ïåðâóþ ðàçìåðíîñòü:
30: n = InputBox("Ââåäèòå êîëè÷åñòâî ñòðîê ìàññèâà ")
31: ReDim Int_Array(n, m)
32:
33: 'çàïèñü â âûõîäíîé ìàññèâ óæå ââåäåííîé ñòðîêè:
34: For j = 1 To m
35: Int_Array(1, j) = Int_Array1(j)
36: Next
37:
38:
39: 'òåïåðü ðàáîòàåì ñ îáû÷íûì äâóìåðíûì ìàññèâîì,
40: 'òîëüêî ïåðâóþ ñòðîêó íå çàïîëíÿåì:
41: For i = 2 To n
42: For j = 1 To m
43: Int_Array(i, j) = InputBox("Ââåäèòå öåëîå ÷èñëî äëÿ " _
44: & " ýëåìåíòà (" & i & "," & j & ")", _
45: "Ââîä ýëåìåíòîâ ìàññèâà; ñòðîêà " & i)
46: Next j
47: Next i

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

 ïåðâîé ÷àñòè ïðîöåäóðû DemoDinArray2 (ñòðîêè 9–27) â äèíàìè÷åñêèé


ìàññèâ Int_Array1 çàïèñûâàåòñÿ ïåðâàÿ ñòðîêà áóäóùåãî ìíîãîìåðíîãî ìàññè-
âà è îïðåäåëÿåòñÿ åãî âòîðàÿ (êîëè÷åñòâî ñòîëáöîâ) ðàçìåðíîñòü. Êàê òîëüêî
ïîëüçîâàòåëü âî âðåìÿ ââîäà ïåðâîé ñòðîêè îòêàçàëñÿ îò ââîäà, ôîðìèðîâàíèå
ïåðâîé ñòðîêè çàêàí÷èâàåòñÿ.  ýòîò ìîìåíò ïðîãðàììå èçâåñòíà âòîðàÿ ðàç-
ìåðíîñòü áóäóùåãî äâóìåðíîãî ìàññèâà: m=i–1. Â ñòðîêå 30 ôóíêöèÿ Input-
Box çàïðàøèâàåò ââåñòè ïåðâóþ ðàçìåðíîñòü ìàññèâà Int_Array, à â ñòðîêå 31
îáúÿâëÿåòñÿ ýòîò äâóìåðíûé ìàññèâ. Â ñòðîêàõ 33–36 äàííûå èç îäíîìåðíîãî
ìàññèâà Int_Array1 ïåðåïèñûâàþòñÿ â ïåðâóþ ñòðîêó äâóìåðíîãî ìàññèâà
Int_Array.
Ñî ñòðîêè 41 ïðîãðàììà ïî÷òè íè÷åì íå îòëè÷àåòñÿ îò êîäà ëèñòèíãà 7.15,
íà÷èíàÿ ñî ñòðîêè 7. Îòëè÷èå ñîñòîèò òîëüêî â òîì, ÷òî â ïîñëåäíåì êîäå çà-
ïîëíåíèå äâóìåðíîãî ìàññèâà âî âëîæåííîì öèêëå îñóùåñòâëÿåòñÿ ñî âòîðîé
ñòðîêè è ïðåäåëû öèêëà çàäàíû íå ëèòåðàìè, à ïåðåìåííûìè.
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 307

 êà÷åñòâå åùå îäíîãî ïðèìåðà èñïîëüçîâàíèÿ äèíàìè÷åñêîãî ìàññèâà ðàñ-


ñìîòðèì ïðîãðàììó, ïðè ïîìîùè êîòîðîé ìîæíî ïðîíóìåðîâàòü âûäåëåííîå
êîëè÷åñòâî ñòðîê. Ïðè ýòîì ýòà íóìåðàöèÿ áóäåò îòëè÷àòüñÿ îò àâòîíóìåðàöèè
Word òåì, ÷òî ñòðîêè, ïðîíóìåðîâàííûå òàêèì îáðàçîì, íè÷åì íå îòëè÷àþòñÿ
îò îáû÷íîãî òåêñòà è ìîãóò áûòü âîñïðèíÿòû äðóãèìè ðåäàêòîðàìè ïðè ïåðå-
äà÷å â íèõ äàííîãî òåêñòà.

Ëèñòèíã 7.18. Íóìåðàöèÿ ñòðîê


1:' ÍóìåðàöèÿÑòðîê Macro
2:' Macro recorded 28.04.01 by Âëàäèìèð Êóçüìåíêî
3:'
4:' Íóìåðóåò ñòðîêè âûäåëåííîãî òåêñòà
5:' Âûçîâ: Ctrl+Alt+N
6:
7: 'êîëè÷åñòâî âûäåëåííûõ ñòðîê:
8: ii = Selection.Paragraphs.Count()
9:
10: 'îáúÿâëåíèå ìàññèâà äëÿ õðàíåíèÿ ñòðîê:
11: Dim mas() As String
12:
13: 'öèêë ñ÷èòûâàíèÿ ñòðîê è äîáàâëåíèÿ íóìåðàöèè:
14: For i = 1 To ii
15: ReDim Preserve mas(i)
16: tt = Selection.Paragraphs(i)
17: mas(i) = Str(i) & ":" & vbTab & tt
18: Next
19:
20: 'óäàëåíèå âûäåëåííîãî ôðàãìåíòà:
21: Selection.Cut
22:
23: 'öèêë ïå÷àòè ìàññèâà:
24: For i = 1 To ii
25: Selection.TypeText Text:=mas(i)
26: Next
27:

Åñëè âàì íåîáõîäèìî íà÷èíàòü íóìåðàöèþ ñ íåêîòîðîãî ÷èñëà è âìåñòî


ñèìâîëà ":" èñïîëüçîâàòü êàêîé-ëèáî äðóãîé, ìàêðîñ ìîæíî ïåðåïèñàòü, íà-
ïðèìåð, òàê, êàê ýòî ñäåëàíî â ñëåäóþùåì ëèñòèíãå.

Ëèñòèíã 7.19. Ðàáîòà ñ äèíàìè÷åñêèì îäíîìåðíûì ìàññèâîì


1.Sub ÍóìåðàöèÿÑòðîê()
2.'
3.' ÍóìåðàöèÿÑòðîê Macro
4.' Macro recorded 28.04.01 by Âëàäèìèð Êóçüìåíêî
5.'
6.' Íóìåðóåò ñòðîêè âûäåëåííîãî òåêñòà
7.' Âûçîâ: Ctrl+Alt+N
8.'
9.
10. BeginNumber = CInt(InputBox("Ââåäèòå íà÷àëüíûé íîìåð ñòðîêè", _
11. "Ââîä íîìåðà ïåðâîé ñòðîêè", 1))
12.
13. NumberChar = InputBox("Ââåäèòå ñèìâîë ðàçäåëåíèÿ", _
14. "Ââîä ñèìâîëà ðàçäåëåíèÿ", ":")
15.
308 Ãëàâà 7

16. 'êîëè÷åñòâî âûäåëåííûõ ñòðîê:


17. ii = Selection.Paragraphs.Count()
18.
19. 'îáúÿâëåíèå ìàññèâà äëÿ õðàíåíèÿ ñòðîê:
20. Dim mas() As String
21.
22. 'öèêë ñ÷èòûâàíèÿ ñòðîê è äîáàâëåíèÿ íóìåðàöèè:
23. For i = 1 To ii
24. ReDim Preserve mas(i)
25. tt = Selection.Paragraphs(i)
26. mas(i) = Str(i + BeginNumber - 1) & NumberChar & vbTab & tt
27. Next
28.
29. 'óäàëåíèå âûäåëåííîãî ôðàãìåíòà:
30. Selection.Cut
31.
32. 'öèêë ïå÷àòè ìàññèâà:
33. For i = 1 To ii
34. Selection.TypeText Text:=mas(i)
35. Next
36.End Sub

Êàê è â ïðåäûäóùåì ìàêðîñå, â ñòðîêå 26, êðîìå ââîäèìîãî ñèìâîëà ðàçäå-


ëåíèÿ íîìåðà è êîäà, èñïîëüçóåòñÿ ñèìâîë òàáóëÿöèè (åãî ðîëü èãðàåò êîí-
ñòàíòà vbTab). Ýòî íåîáõîäèìî äëÿ òîãî, ÷òîáû ñòðîêè êîäà áûëè âûðîâíåíû
ñëåâà. Çàìåòüòå, ÷òî äëÿ íóìåðàöèè ïîñëåäíåãî ìàêðîñà â êà÷åñòâå ñèìâîëà
ðàçäåëåíèÿ èñïîëüçîâàëñÿ ñèìâîë ".".

Ôóíêöèè LBound è UBound


Äëÿ êîíòðîëÿ çà ðàçìåðàìè êàê ñòàòè÷åñêèõ, òàê è äèíàìè÷åñêèõ ìàññèâîâ
ìîæíî èñïîëüçîâàòü îäíó èëè ïàðó ïåðåìåííûõ äëÿ ñîõðàíåíèÿ ìèíèìàëüíî-
ãî è ìàêñèìàëüíîãî èíäåêñà ìàññèâà, êàê ýòî äåëàåòñÿ â ðàíåå ðàññìîòðåííûõ
ëèñòèíãàõ. Åñëè äëÿ îòñëåæèâàíèÿ âåðõíåãî è íèæíåãî ïðåäåëîâ èíäåêñîâ
ìàññèâà ïîëüçîâàòåëü ïîëàãàåòñÿ íà ñîáñòâåííûå ïåðåìåííûå, òî îí ïîëíîñòüþ
îòâå÷àåò çà îáíîâëåíèå è òî÷íîñòü ýòèõ ïåðåìåííûõ.  ïðîòèâíîì ñëó÷àå ïðî-
öåäóðû íå áóäóò ðàáîòàòü ïðàâèëüíî — áóäåò îáðàáàòûâàòüñÿ ìåíüøå ýëåìåí-
òîâ, ÷åì â äåéñòâèòåëüíîñòè ñîäåðæèò ìàññèâ, èëè áóäåò ïîëó÷åíî ñîîáùåíèå
îá îøèáêå ïðè ïîïûòêå äîñòóïà ê ìàññèâó ñ èíäåêñàìè, âûõîäÿùèìè çà ôàê-
òè÷åñêèé ðàçìåð ìàññèâà. Òàêèå ïðîãðàììíûå îøèáêè áûâàåò òðóäíî îòñëå-
æèâàòü.
VBA èìååò ïàðó ôóíêöèé, êîòîðûå îñâîáîæäàþò ïîëüçîâàòåëÿ îò íåîáõîäè-
ìîñòè âðó÷íóþ îòñëåæèâàòü âåðõíèé è íèæíèé ïðåäåëû ìàññèâà — ôóíêöèè
LBound è UBound. Ýòè ôóíêöèè âîçâðàùàþò íèæíåå è âåðõíåå ãðàíè÷íûå çíà-
÷åíèÿ èíäåêñîâ ñòàòè÷åñêîãî èëè äèíàìè÷åñêîãî ìàññèâà.

Ôóíêöèè LBound è UBound èìåþò ñëåäóþùèé ñèíòàêñèñ:


Ñèíòàêñèñ
LBound(arrayName [, dimension])
UBound(arrayName [, dimension])
Ôóíêöèÿ LBound âîçâðàùàåò ïåðâûé èíäåêñ ìàññèâà, ïðåäñòàâëåííîãî ñ ïîìîùüþ
arrayName. Ôóíêöèÿ UBound âîçâðàùàåò íàèáîëüøèé èíäåêñ ìàññèâà, ïðåäñòàâ-
ëåííîãî ñ ïîìîùüþ arrayName. Ìîæíî èñïîëüçîâàòü ýòè äâå ôóíêöèè êàê ñî ñòà-
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 309

òè÷åñêèìè, òàê è ñ äèíàìè÷åñêèìè ìàññèâàìè. Àðãóìåíò dimension ïðåäñòàâëÿåò


öåëîå ÷èñëî, îïðåäåëÿþùåå èçìåðåíèå ìàññèâà, äëÿ êîòîðîãî íåîáõîäèìî ïîëó-
÷èòü íèæíèé èëè âåðõíèé ïðåäåë. Åñëè îïóñòèòü dimension, VBA âîçâðàùàåò ïðå-
äåë äëÿ ïåðâîãî èçìåðåíèÿ ìàññèâà.

Ñëåäóþùèå ôðàãìåíòû êîäà ÿâëÿþòñÿ ïðèìåðàìè èñïîëüçîâàíèÿ ôóíêöèé


LBound è UBound:
Dim A(3 To 9) As String
For I = LBound(A) To UBound(A)
A(I) = String(10, 65 + I)
Next I

Dim aMatrix(1 To 365, 1990 To 1999)


For i = LBound(aMatrix, 1) To UBound(aMatrix, 1)
For j = LBound(aMatrix, 2) To UBound(aMatrix, 2)
Matrix(i, j) = Rnd
Next j
Next i
Çàìåòüòå, ÷òî âî âòîðîì ïðèìåðå ôóíêöèè LBound è UBound èñïîëüçóþò íå-
îáÿçàòåëüíûé àðãóìåíò dimension. Âíåøíèé öèêë For…Next âûïîëíÿåòñÿ
ñòîëüêî ðàç, ñêîëüêî ýëåìåíòîâ èìååòñÿ â ïåðâîì èçìåðåíèè ìàññèâà aMatrix,
òîãäà êàê âíóòðåííèé öèêë For…Next âûïîëíÿåòñÿ ñòîëüêî ðàç, ñêîëüêî ýëå-
ìåíòîâ èìååòñÿ âî âòîðîì èçìåðåíèè ìàññèâà aMatrix.

Èñïîëüçîâàíèå Erase äëÿ î÷èñòêè èëè óäàëåíèÿ ìàññèâîâ


VBA èìååò îñîáûé îïåðàòîð Erase, ïîçâîëÿþùèé âûïîëíÿòü îäíó èç äâóõ
çàäà÷ â çàâèñèìîñòè îò òîãî, êàêèì ìàññèâîì ìàíèïóëèðóåò ïîëüçîâàòåëü —
ñòàòè÷åñêèì èëè äèíàìè÷åñêèì.  ñëó÷àå ñòàòè÷åñêèõ ìàññèâîâ Erase ïîçâî-
ëÿåò î÷èùàòü âñå ýëåìåíòû ìàññèâà, â îñíîâíîì ïåðåóñòàíàâëèâàÿ ìàññèâ â òî
æå ñàìîå ñîñòîÿíèå, êàêîå îí èìåë, êîãäà VBA ñîçäàâàë åãî â îïåðàòèâíîé ïà-
ìÿòè.  ñëó÷àå äèíàìè÷åñêèõ ìàññèâîâ Erase ïîçâîëÿåò ïîëíîñòüþ óäàëÿòü
ìàññèâ è åãî ñîäåðæèìîå èç îïåðàòèâíîé ïàìÿòè.
Êîãäà ýëåìåíòû ìàññèâà çàïîëíåíû, äàííûå â ìàññèâå îñòàþòñÿ (íåçàâèñè-
ìî îò òîãî, ÿâëÿåòñÿ äàííûé ìàññèâ ñòàòè÷åñêèì èëè äèíàìè÷åñêèì) äî òåõ
ïîð, ïîêà ïîëüçîâàòåëü íå ïðèñâîèò íîâûå çíà÷åíèÿ ýëåìåíòàì ìàññèâà èëè
ïîêà VBA íå îñâîáîäèòñÿ îò ìàññèâà. (Ìàññèâû ñëåäóþò òåì æå ïðàâèëàì îá-
ëàñòè äåéñòâèÿ è ïåðñèñòåíöèè, ÷òî è ëþáàÿ äðóãàÿ ïåðåìåííàÿ â VBA.)
Ïðè íåêîòîðûõ îáñòîÿòåëüñòâàõ ìîæåò ïîíàäîáèòüñÿ î÷èñòèòü âñå çíà÷åíèÿ
â ìàññèâå, óñòàíàâëèâàÿ ÷èñëîâûå çíà÷åíèÿ íà 0, ñòðîêîâûå çíà÷åíèÿ íà ïóñ-
òûå ñòðîêè è òàê äàëåå. Îáû÷íî ñëåäóåò èñïîëüçîâàòü öèêë For…Next èëè
For…Each äëÿ óñòàíîâêè âñåõ ýëåìåíòîâ â ìàññèâå íà îïðåäåëåííîå çíà÷åíèå.
Ñëåäóþùèå ôðàãìåíòû êîäà ïîêàçûâàþò îáà öèêëà For…Next è For…Each, èñ-
ïîëüçóåìûå äëÿ èíèöèàëèçàöèè âñåõ çíà÷åíèé â ÷èñëîâîì ìàññèâå íà 0:
For k = LBound(NumArray) To UBound(NumArray)
NumArray(k) = 0
Next k

For Each Num In NumArray


Num = 0
Next Num
310 Ãëàâà 7

Ïåðâûé ôðàãìåíò êîäà èñïîëüçóåò öèêë For…Next è ôóíêöèè LBound


è UBound äëÿ ïðîõîæäåíèÿ â öèêëå ïî âñåì ýëåìåíòàì ìàññèâà; âòîðîé ôðàã-
ìåíò êîäà èñïîëüçóåò For…Each äëÿ ïðîõîæäåíèÿ â öèêëå ïî êàæäîìó ýëåìåí-
òó ìàññèâà, òàêæå óñòàíàâëèâàÿ êàæäûé ýëåìåíò íà 0. Õîòÿ ýòè öèêëû äî-
âîëüíî êîðîòêèå, ìîæíî âûïîëíèòü òó æå ñàìóþ çàäà÷ó äëÿ ñòàòè÷åñêîãî ìàñ-
ñèâà äàæå áîëåå ýôôåêòèâíî ñ ïîìîùüþ åäèíñòâåííîãî îïåðàòîðà Erase:
Erase NumArray
Ìàññèâû «èìåþò òåíäåíöèþ» çàíèìàòü îòíîñèòåëüíî áîëüøîé îáúåì îïåðà-
òèâíîé ïàìÿòè — íàïðèìåð, ìàññèâ èç 20 ýëåìåíòîâ çàíèìàåò òàêîé æå îáúåì
ïàìÿòè, êàê 20 îòäåëüíûõ ïåðåìåííûõ îäíîãî è òîãî æå òèïà. Ïîñêîëüêó ìàñ-
ñèâàì òðåáóåòñÿ òàê ìíîãî ïàìÿòè, ñëåäóåò óäàëÿòü äèíàìè÷åñêèå ìàññèâû èç
îïåðàòèâíîé ïàìÿòè, êîãäà îíè ôàêòè÷åñêè íå èñïîëüçóþòñÿ. (Ñòàòè÷åñêèå
ìàññèâû íå ìîãóò óäàëÿòüñÿ èç îïåðàòèâíîé ïàìÿòè äî òåõ ïîð, ïîêà VBA àâ-
òîìàòè÷åñêè íå îñâîáîæäàåòñÿ îò ìàññèâà.)
VBA óäàëÿåò èç ïàìÿòè ìàññèâû, îáúÿâëÿåìûå ëîêàëüíî â ïðîöåäóðå (òàê
æå, êàê è ëþáûå äðóãèå ëîêàëüíûå ïåðåìåííûå), êàæäûé ðàç, êîãäà ïðîöåäó-
ðà ïðåêðàùàåò âûïîëíÿòüñÿ. Îäíàêî ìàññèâû, îáúÿâëÿåìûå íà ìîäóëüíîì
óðîâíå, ñóùåñòâóþò ïîêà ëþáàÿ ïðîöåäóðà â ýòîì ìîäóëå âûïîëíÿåòñÿ. Åñëè
ïðîãðàììà áîëüøàÿ, âàì ìîæåò ïîíàäîáèòüñÿ âîññòàíîâèòü ðåñóðñ ïàìÿòè, èñ-
ïîëüçóåìîé äèíàìè÷åñêèìè ìàññèâàìè ìîäóëüíîãî óðîâíÿ. Îïåðàòîð Erase
ïîçâîëÿåò äåëàòü èìåííî ýòî.
Îïåðàòîð Erase èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Erase array1 [, array2, …]
Çäåñü array1 è array2 ïðåäñòàâëÿþò ëþáîå äîïóñòèìîå èìÿ ìàññèâà VBA. Ìîæíî
ïåðå÷èñëèòü ñòîëüêî ìàññèâîâ â îïåðàòîðå Erase, ñêîëüêî õîòèòå, îòäåëÿÿ êàæäîå
èìÿ ìàññèâà çàïÿòîé.

Îïåðàòîð Erase óäàëÿåò èç ïàìÿòè äèíàìè÷åñêèå ìàññèâû, îñâîáîæäàÿ îá-


ëàñòü ïàìÿòè, ðàíåå èñïîëüçóåìóþ ýòèì ìàññèâîì. Ïðè óäàëåíèè äèíàìè÷å-
ñêîãî ìàññèâà ñ ïîìîùüþ îïåðàòîðà Erase íåîáõîäèìî ïîâòîðíî ñîçäàòü ìàññèâ
ñ ïîìîùüþ îïåðàòîðà ReDim ïåðåä òåì, êàê ìîæíî áóäåò èñïîëüçîâàòü ýòîò îï-
ðåäåëåííûé äèíàìè÷åñêèé ìàññèâ ñíîâà. Ïðè ïîïûòêå äîñòóïà ê ýëåìåíòàì
â äèíàìè÷åñêîì ìàññèâå, äëÿ êîòîðîãî áûë èñïîëüçîâàí îïåðàòîð Erase, áåç
åãî ïåðåîïðåäåëåíèÿ VBA îòîáðàæàåò ñîîáùåíèå î runtime-îøèáêå.
Ïîâåäåíèå îïåðàòîðà Erase äëÿ ñòàòè÷åñêèõ ìàññèâîâ íåìíîãî ñëîæíåå
è çàâèñèò îò êîíêðåòíîãî òèïà ýëåìåíòîâ ìàññèâà. Â ñëåäóþùåé òàáëèöå îïè-
ñûâàåòñÿ äåéñòâèå îïåðàòîðà Erase ñî ñòàòè÷åñêèìè ìàññèâàìè ðàçëè÷íûõ òè-
ïîâ:

Òèï ñòàòè÷åñêîãî
Äåéñòâèå îïåðàòîðà Erase
ìàññèâà
Ëþáîé ÷èñëîâîé òèï Óñòàíàâëèâàåò ýëåìåíòû ìàññèâà íà 0.
Óñòàíàâëèâàåò ýëåìåíòû ìàññèâà íà ñòðîêó íóëåâîé
Ëþáîé ñòðîêîâûé òèï äëèíû (""); óñòàíàâëèâàåò ñòðîêè ôèêñèðîâàííîé äëèíû
êàê âñå ñèìâîëû ïðîáåëîâ.
Variant Óñòàíàâëèâàåò ýëåìåíòû ìàññèâà íà Empty.
Ïîâòîðåíèå äåéñòâèé â Visual Basic: öèêëû è ìàññèâû 311

Òèï ñòàòè÷åñêîãî
Äåéñòâèå îïåðàòîðà Erase
ìàññèâà
Object Óñòàíàâëèâàåò ýëåìåíòû ìàññèâà íà Nothing.
Óñòàíàâëèâàåò êàæäóþ ïåðåìåííóþ â ïîëüçîâàòåëüñêîì
Ëþáîé òèïå èíäèâèäóàëüíî: ÷èñëåííûå òèïû óñòàíàâëèâàþòñÿ
ïîëüçîâàòåëüñêèé òèï íà 0, ñòðîêîâûå — íà ñòðîêè íóëåâîé äëèíû, Variant —
íà Empty, Object — íà Nothing.

Èñïîëüçîâàíèå ìàññèâîâ â êà÷åñòâå àðãóìåíòîâ


ïðîöåäóð è ôóíêöèé
VBA äàåò âîçìîæíîñòü ïåðåäàâàòü ìàññèâû â êà÷åñòâå àðãóìåíòîâ ïðîöåäóð
è ôóíêöèé. Ýòà âîçìîæíîñòü ìîæåò áûòü î÷åíü ïîëåçíîé; ïîñêîëüêó íåò íåîá-
õîäèìîñòè çàäàâàòü ðàçìåð ìàññèâà, êîòîðûé ïåðåäàåòñÿ êàê àðãóìåíò, ìîæíî
ïèñàòü óíèâåðñàëüíûå ïðîöåäóðû èëè ôóíêöèè îáðàáîòêè ìàññèâà. Íàïðè-
ìåð, ìîæíî íàïèñàòü ôóíêöèþ, ïîëó÷àþùóþ ÷èñëîâîé ìàññèâ â êà÷åñòâå àð-
ãóìåíòà è âîçâðàùàþùóþ ñðåäíåå çíà÷åíèå âñåõ ÷èñåë â ìàññèâå êàê ðåçóëü-
òàò ôóíêöèè. Åùå îäèí ïðèìåð: ìîæíî íàïèñàòü ïðîöåäóðó, ïîëó÷àþùóþ
ìàññèâ â êà÷åñòâå àðãóìåíòà, ïåðåäàâàåìîãî ïî ññûëêå, è ñîðòèðóþùóþ ýòîò
ìàññèâ. È â îäíîì, è â äðóãîì ïðèìåðàõ ìîæíî íàïèñàòü ïðîöåäóðó èëè ôóíê-
öèþ äëÿ ðàáîòû ñ ìàññèâîì ëþáîãî ðàçìåðà — ïÿòü ýëåìåíòîâ, 10 ýëåìåíòîâ,
100 ýëåìåíòîâ è òàê äàëåå.
Îáùèé ñèíòàêñèñ äëÿ àðãóìåíòîâ-ìàññèâîâ äëÿ ïðîöåäóð èëè ôóíêöèé òà-
êîé æå, êàê äëÿ ëþáûõ àðãóìåíòîâ ïðîöåäóð èëè ôóíêöèé:
Ñèíòàêñèñ
[ByVal | ByRef] arrayname() As type
Êàê â ñëó÷àå àðãóìåíòîâ ïðîöåäóð è ôóíêöèé, î êîòîðûõ âû óæå çíàåòå, êëþ÷åâîå
ñëîâî ByVal óêàçûâàåò VBA ïåðåäàòü àðãóìåíò-ìàññèâ ïî çíà÷åíèþ, à êëþ÷åâîå
ñëîâî ByRef óêàçûâàåò VBA, ÷òî ñëåäóåò ïåðåäàâàòü àðãóìåíò-ìàññèâ ïî ññûëêå.
Åñëè ByVal è ByRef ïðîïóùåíû, VBA ïåðåäàåò àðãóìåíò-ìàññèâ ïî ññûëêå.
 ýòîé ñèíòàêñè÷åñêîé êîíñòðóêöèè arrayname() ïðåäñòàâëÿåò àðãóìåíò-ìàññèâ;
ìîæíî èñïîëüçîâàòü ëþáîé äîïóñòèìûé èäåíòèôèêàòîð VBA â êà÷åñòâå èìåíè àð-
ãóìåíòà-ìàññèâà. Íåîáõîäèìî âñåãäà âêëþ÷àòü ïóñòûå êðóãëûå ñêîáêè ïîñëå
arrayname; êðóãëûå ñêîáêè óêàçûâàþò VBA, ÷òî ýòîò àðãóìåíò ÿâëÿåòñÿ ìàññè-
âîì. Ïàðàìåòð type ïðåäñòàâëÿåò ëþáîé äîïóñòèìûé òèï VBA èëè îïðåäåëåííûé
ïîëüçîâàòåëåì òèï.

Ñëåäóþùèé ôðàãìåíò êîäà ïîêàçûâàåò, êàê âêëþ÷àòü ìàññèâû â êà÷åñòâå


àðãóìåíòîâ äëÿ ïðîöåäóð è ôóíêöèé:
Sub ShowText(Lines(), NumLines As Integer)
'ïîëó÷àåò ìàññèâ òèïà Variant, ïåðåäàâàåìûé ïî ññûëêå
...
End Sub
Sub SortList(ByRef List() As String, NumLines As Integer)
'ïîëó÷àåò ìàññèâ òèïà String, ïåðåäàâàåìûé ïî ññûëêå
...
End Sub
Åñëè âû ïîìíèòå, ïåðåäà÷à àðãóìåíòîâ ïî çíà÷åíèþ (ñ ïîìîùüþ êëþ÷åâîãî
ñëîâà ByVal) ïðèâîäèò ê òîìó, ÷òî VBA ïåðåäàåò êîïèþ äàííûõ ôóíêöèè èëè
312 Ãëàâà 7

ïðîöåäóðå. Íå ïåðåäàâàéòå ìàññèâû ïî çíà÷åíèþ, åñëè â ýòîì íåò îñîáîé íåîá-


õîäèìîñòè — ïåðåäà÷à áîëüøèõ ìàññèâîâ ïî çíà÷åíèþ ìîæåò áûñòðî èñ÷åð-
ïàòü ðåñóðñû ïàìÿòè âàøåãî êîìïüþòåðà, ïðèâîäÿ ê runtime-îøèáêàì èç-çà
íåõâàòêè ïàìÿòè.
Åñëè âû îáðàòèëè âíèìàíèå, â äâóõ èç òðåõ ïîñëåäíèõ ïðèìåðàõ âìåñòå
ñ èìåíàìè ìàññèâîâ â êà÷åñòâå ïàðàìåòðîâ ïåðåäàþòñÿ öåëûå ïåðåìåííûå
NumLines. Çäåñü ïîäðàçóìåâàåòñÿ ïåðåäà÷à âìåñòå ñ ññûëêîé íà ìàññèâ åãî
ðàçìåðíîñòè. Îäíàêî çàìå÷àòåëüíûì ñâîéñòâîì VBA ÿâëÿåòñÿ òî, ÷òî îí ïî-
çâîëÿåò ïîñðåäñòâîì ðàíåå ðàññìîòðåííûõ íàìè ôóíêöèé LBound è UBound
âíóòðè ïðîöåäóðû, êîòîðàÿ ïðèíèìàåò ìàññèâ â êà÷åñòâå àðãóìåíòà, îïðåäå-
ëèòü ðàçìåðíîñòü ïåðåäàííîãî åé ìàññèâà. Îòìåòèì, ÷òî äàëåêî íå âñå ñèñòåìû
ïðîãðàììèðîâàíèÿ îáëàäàþò òàêîé âîçìîæíîñòüþ. Íèæå (ëèñòèíã 7.20) ïðè-
âåäåí ïðèìåð ïåðåäà÷è ìàññèâà â êà÷åñòâå ïàðàìåòðà ïðîöåäóðå, åäèíñòâåí-
íûé îïåðàòîð êîòîðîé âûäàåò â äèàëîãîâîì îêíå ðàçìåðíîñòü ïåðåäàííîãî åé
ìàññèâà.

Ëèñòèíã 7.20. Îïðåäåëåíèå ðàçìåðíîñòè ìàññèâà-àðãóìåíòà


1: Sub TestUBoundLBound(mas())
2: MsgBox "ðàçìåðíîñòü ìàññèâà " & "(" & _
3: UBound(mas, 1) & "," & UBound(mas, 2) & ")"
4: End Sub
5:
6: Sub a()
7: Dim arr(9, 7)
8: Call TestUBoundLBound(arr)
9: End Sub

 ðåçóëüòàòå ðàáîòû ýòîãî êîäà íà ýêðàíå ïîÿâëÿåòñÿ äèàëîãîâîå îêíî,


ïðåäñòàâëåííîå íà ðèñ. 7.9.

Ðèñ. 7.9
Ðàçìåðíîñòü ìàññèâà, ïåðåäàâàåìîãî
â êà÷åñòâå àðãóìåíòà, ëåãêî îïðåäåëÿåòñÿ
â âûçûâàþùåé ïðîöåäóðå
Óïðàâëåíèå ôàéëàìè
8
ñ ïîìîùüþ VBA
Óïðàâëåíèå ôàéëàìè — ýòî îäíà èç èíòåðåñíåéøèõ çàäà÷ äëÿ ïðîãðàììè-
ñòà â ëþáîé ñèñòåìå ïðîãðàììèðîâàíèÿ. Áîëååå òîãî, ïðîãðàììèðîâàòü â ñðå-
äå, ñîñòîÿùåé èç ôàéëîâ, è íå óìåòü ðàáîòàòü ñ ýòèìè ôàéëàìè (íàõîäèòü, êî-
ïèðîâàòü èëè óäàëÿòü äîêóìåíò, ðàáî÷óþ êíèãó èëè äðóãîé ôàéë, çàïèñûâàòü
â ôàéë èëè ÷èòàòü èç íåãî äàííûå) — íå î÷åíü ïîëåçíîå çàíÿòèå. Visual Basic
for Applications ïðåäîñòàâëÿåò ðàçëè÷íûå îïåðàòîðû, ôóíêöèè è ìåòîäû äëÿ
âûïîëíåíèÿ îáùèõ çàäà÷ óïðàâëåíèÿ ôàéëàìè.

Óïðàâëåíèå ôàéëàìè
 ýòîì ðàçäåëå îïèñûâàåòñÿ, ÷òî òàêîå óïðàâëåíèå ôàéëàìè, îáñóæäàþòñÿ
íåêîòîðûå èç òèïè÷íûõ äåéñòâèé, êîòîðûå ìîæíî âûïîëíÿòü êàê ÷àñòü çàäà÷
óïðàâëåíèÿ ôàéëàìè, à òàêæå îïèñûâàþòñÿ VBA-ôóíêöèè, îïåðàòîðû è ìåòî-
äû óïðàâëåíèÿ ôàéëàìè.

×òî òàêîå óïðàâëåíèå ôàéëàìè


Óïðàâëåíèå ôàéëàìè (file management) — òåðìèí, èñïîëüçóåìûé äëÿ îïè-
ñàíèÿ äåéñòâèé, êîòîðûå âûïîëíÿþòñÿ ñ ôàéëàìè, ñîõðàíåííûìè íà äèñêî-
âûõ äðàéâåðàõ. Óïðàâëåíèå ôàéëàìè âêëþ÷àåò äåéñòâèÿ, òàêèå êàê êîïèðîâà-
íèå ôàéëîâ, óäàëåíèå íåèñïîëüçóåìûõ ôàéëîâ äëÿ îñâîáîæäåíèÿ îáëàñòè äèñ-
êîâîé ïàìÿòè, ïåðåìåùåíèå ôàéëîâ ñ îäíîãî äèñêà (èëè ïàïêè) íà äðóãèå
è ñîçäàíèå èëè óäàëåíèå êàòàëîãîâ äèñêà. Óïðàâëåíèå ôàéëàìè âêëþ÷àåò òàê-
æå òàêèå âèäû îáðàáîòêè, êàê ïðîñìîòð ñïèñêà ôàéëîâ â ïàïêå äëÿ îïðåäåëå-
íèÿ ðàçìåðà ôàéëà èëè äàòû è âðåìåíè, êîãäà ýòîò ôàéë áûë ìîäèôèöèðîâàí
â ïîñëåäíèé ðàç.
VBA ïîçâîëÿåò âûïîëíÿòü íàèáîëåå îáùèå çàäà÷è óïðàâëåíèÿ ôàéëàìè ïîä
êîíòðîëåì ïðîöåäóðû èëè ôóíêöèè, êîòîðóþ âû ìîæåòå íàïèñàòü ñàìè.
Windows Desktop è ñïðàâî÷íàÿ ñèñòåìà èñïîëüçóþò òåðìèí ïàïêà (folder)
äëÿ îáîçíà÷åíèÿ òîãî, ÷òî îïûòíûå ïîëüçîâàòåëè Windows èëè DOS çíàþò êàê
êàòàëîãè (directories). Â ýòîé êíèãå èñïîëüçóåòñÿ òåðìèí ïàïêà äëÿ ñîãëàñî-
âàííîñòè ñ òåðìèíîëîãèåé Windows; â íåêîòîðûõ ñëó÷àÿõ òàêæå èñïîëüçóåòñÿ
òåðìèí êàòàëîã.
314 Ãëàâà 8

Âîçìîæíîñòè VBA ïî óïðàâëåíèþ ôàéëàìè


 òàáë. 8.1 ïðèâåäåíû VBA-ôóíêöèè, îïåðàòîðû è ìåòîäû óïðàâëåíèÿ ôàé-
ëàìè.  ïåðâîì ñòîëáöå òàáëèöû íàõîäèòñÿ êëþ÷åâîå ñëîâî VBA, âî âòîðîì —
óêàçûâàåòñÿ, ïðåäíàçíà÷åíî ëè êëþ÷åâîå ñëîâî äëÿ ôóíêöèè, îïåðàòîðà èëè
îáúåêòíîãî ìåòîäà. Íàêîíåö, â òðåòüåì ñòîëáöå ñîäåðæèòñÿ êðàòêîå îïèñàíèå
íàçíà÷åíèÿ êàæäîé ôóíêöèè, îïåðàòîðà èëè ìåòîäà.
Òàáëèöà 8.1. Ôóíêöèè, ìåòîäû è îïåðàòîðû óïðàâëåíèÿ ôàéëàìè

Èìÿ Êàòåãîðèÿ Íàçíà÷åíèå


ChDir Îïåðàòîð Èçìåíÿåò òåêóùèé êàòàëîã (ïàïêó).
ChDrive Îïåðàòîð Èçìåíÿåò òåêóùèé äðàéâåð äèñêà.
CurDir Ôóíêöèÿ Âîçâðàùàåò òåêóùèé êàòàëîã (ïàïêó).
Âîçâðàùàåò èìÿ êàòàëîãà èëè ôàéëà,
ñîâïàäàþùåå ñ îïðåäåëåííûì èìåíåì ôàéëà
(âêëþ÷àÿ ñèìâîëû óíèâåðñàëüíîãî
Dir Ôóíêöèÿ
ñîïîñòàâëåíèÿ), ïåðåäàâàåìûì êàê ñòðîêîâûé
àðãóìåíò. Ïðåäíàçíà÷åíà äëÿ íàõîæäåíèÿ
îäíîãî èëè íåñêîëüêèõ ôàéëîâ íà äèñêå.
FileCopy Îïåðàòîð Êîïèðóåò ôàéë.
Âîçâðàùàåò çíà÷åíèå òèïà Date, ñîäåðæàùåå
FileDateTime Ôóíêöèÿ äàòó è âðåìÿ, êîãäà ýòîò ôàéë áûë èçìåíåí
ïîñëåäíèé ðàç.
FileLen Ôóíêöèÿ Âîçâðàùàåò äëèíó ôàéëà â áàéòàõ.
Âîçâðàùàåò ÷èñëî, ïðåäñòàâëÿþùåå
GetAttr Ôóíêöèÿ îáúåäèíåííûå àòðèáóòû ôàéëà èëè êàòàëîãà
äèñêà, òàêèå êàê System, Hidden è òàê äàëåå.
Îòîáðàæàåò Excel-äèàëîãîâîå îêíî Open
GetOpenFileName Ìåòîä è âîçâðàùàåò èìÿ ôàéëà, âûáðàííîå
ïîëüçîâàòåëåì. Â Word íå èìååòñÿ.
Îòîáðàæàåò Excel-äèàëîãîâîå îêíî (Save As)
GetSaveAsFileName Ìåòîä è âîçâðàùàåò èìÿ ôàéëà, âûáðàííîå
ïîëüçîâàòåëåì. Â Word íå èìååòñÿ.
Kill Îïåðàòîð Óäàëÿåò ôàéëû ñ äèñêà.
MkDir Îïåðàòîð Ñîçäàåò êàòàëîã äèñêà (ïàïêó).
Name Îïåðàòîð Ïåðåèìåíîâûâàåò èëè ïåðåìåùàåò ôàéë.
RmDir Îïåðàòîð Óäàëÿåò êàòàëîã äèñêà (ïàïêó).
SetAttr Îïåðàòîð Óñòàíàâëèâàåò àòðèáóòû ôàéëà.

Âû ìîãëè çàìåòèòü, ÷òî â òàáë. 8.1 íå ïðèâîäÿòñÿ àðãóìåíòû íè äëÿ êàêèõ


ýëåìåíòîâ (ôóíêöèé, ìåòîäîâ, îïåðàòîðîâ). Íåñêîëüêî èç ýòèõ ôóíêöèé, îïå-
ðàòîðîâ è ìåòîäîâ èìåþò äîâîëüíî ñëîæíûå ñïèñêè àðãóìåíòîâ è îïöèé. Íà-
÷èíàÿ ñî ñëåäóþùåãî ðàçäåëà â ýòîé ãëàâå, êàæäàÿ VBA-ôóíêöèÿ, îïåðàòîð
èëè ìåòîä óïðàâëåíèÿ ôàéëàìè îïèñûâàåòñÿ ïîëíîñòüþ ñî âñåìè àðãóìåíòàìè
è îïöèÿìè.
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 315

Îïåðàòîðû, ôóíêöèè è îáúåêòíûå ìåòîäû, èìåþùèåñÿ â VBA, äåëÿòñÿ íà


øåñòü ðàçëè÷íûõ ôóíêöèîíàëüíûõ ÷àñòåé:
w Ïîëó÷åíèå èëè èçìåíåíèå àòðèáóòîâ ôàéëà.
w Âûáîðêà èëè íàõîæäåíèå èìåí ôàéëîâ.
w Ïîëó÷åíèå èëè èçìåíåíèå òåêóùåãî äðàéâåðà äèñêà è ïàïêè èëè ñîç-
äàíèå è óäàëåíèå ïàïîê äèñêà.
w Êîïèðîâàíèå èëè óäàëåíèå ôàéëîâ.
w Ïåðåèìåíîâàíèå èëè ïåðåìåùåíèå ôàéëîâ.
w Ïîëó÷åíèå èíôîðìàöèè î ôàéëàõ, òàêîé êàê äëèíà ôàéëà, äàòà è âðå-
ìÿ, êîãäà ýòîò ôàéë áûë ìîäèôèöèðîâàí ïîñëåäíèé ðàç.

Àòðèáóòû ôàéëà
Êàæäûé ôàéë, ñîõðàíåííûé íà ëþáîì äèñêå 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

õîäèìî ðåçåðâèðîâàíèå. Åñëè ôàéë íå èìååò àòðèáóòà Archive, òî


ýòîò ôàéë íå èçìåíÿëñÿ ñî âðåìåíè, êîãäà îí áûë ðåçåðâèðîâàí ïî-
ñëåäíèé ðàç.
w Directory. Åñëè ôàéë èìååò àòðèáóò Directory, ýòî îçíà÷àåò, ÷òî
ôàéë, â äåéñòâèòåëüíîñòè, ÿâëÿåòñÿ êàòàëîãîì èëè ïîäêàòàëîãîì
(ïàïêîé — â òåðìèíîëîãèè Windows). Êàòàëîã äèñêà — ýòî ôàéë, êî-
òîðûé ñîäåðæèò èíôîðìàöèþ î äðóãèõ ôàéëàõ; êîãäà âû ñîçäàåòå êà-
òàëîã, Windows ñîçäàåò ñïåöèàëüíûé ôàéë êàòàëîãà è äàåò åìó àòðè-
áóò Directory. Àòðèáóò Directory ñîîáùàåò Windows î òîì, ÷òî ýòîò
ôàéë ñîäåðæèò èíôîðìàöèþ î äðóãèõ ôàéëàõ è ïðåïÿòñòâóåò ïåðåèìå-
íîâàíèþ, êîïèðîâàíèþ èëè óäàëåíèþ êàòàëîãà.
w Hidden. Åñëè ôàéë èìååò àòðèáóò Hidden, Windows «ñêðûâàåò» ôàéë,
íå ïîêàçûâàÿ åãî â áîëüøèíñòâå ñëó÷àåâ ïðè îòîáðàæåíèè êàòàëîãà,
õîòÿ Windows èìååò îïöèþ ïðîñìîòðà, êîòîðàÿ îòîáðàæàåò èìåíà
ñêðûòûõ ôàéëîâ.
w Normal. Àòðèáóò ôàéëà Normal ÿâëÿåòñÿ, íà ñàìîì äåëå, ïðèçíàêîì
îòñóòñòâèÿ êàêèõ-ëèáî ñïåöèàëüíûõ àòðèáóòîâ. Òàê íàçûâàåìûé
Normal-àòðèáóò (èíîãäà íàçûâàåìûé general) ôàéëà ïðîñòî îçíà÷àåò,
÷òî ôàéë íå èìååò íèêàêèõ äðóãèõ àòðèáóòîâ, êðîìå, âîçìîæíî, àòðè-
áóòà Archive (äëÿ óêàçàíèÿ, íåîáõîäèìî ëè ðåçåðâèðîâàíèå äëÿ ýòîãî
ôàéëà).
w Read-Only. Àòðèáóò Read-Only îçíà÷àåò, ÷òî âû ìîæåòå òîëüêî ÷èòàòü
èç ôàéëà, íî íå ìîæåòå èçìåíÿòü åãî. Windows 95/98 ïðåïÿòñòâóåò èç-
ìåíåíèþ, óäàëåíèþ èëè ïåðåèìåíîâàíèþ ôàéëà, êîòîðûé èìååò àòðè-
áóò Read-Only.
w System. Àòðèáóò System óêàçûâàåò Windows, ÷òî ôàéë ÿâëÿåòñÿ ÷à-
ñòüþ îïåðàöèîííîé ñèñòåìû êîìïüþòåðà. Êàê â ñëó÷àå ñ ôàéëàìè
Read-Only, Windows ïðåïÿòñòâóåò èçìåíåíèþ ôàéëà, èìåþùåãî àò-
ðèáóò System. Êðîìå òîãî, åñëè âû ñîçäàåòå äèñê àâòîçàïóñêà DOS-êî-
ìàíäîé SYS (èëè ñ Windows Conrol Panel), ëþáûå ôàéëû, èìåþùèå àò-
ðèáóò System, ïåðåíîñÿòñÿ íà íîâûé äèñê àâòîçàãðóçêè.
w Volume Label. Àòðèáóò Volume Label íôîðìèðóåò Windows î òîì, ÷òî
ôàéë ÿâëÿåòñÿ ìåòêîé òîìà äèñêà. [Ìåòêà òîìà (volume label) — ýòî
èìÿ, êîòîðîå âû äàåòå æåñòêîìó äèñêó (èëè äèñêåòå) ïðè ôîðìàòèðî-
âàíèè, èñïîëüçîâàíèè DOS-êîìàíäû LABEL èëè èçìåíåíèè ñâîéñòâà
Label â ëèñòå ñâîéñòâ äèñêà.] Äèñê ìîæåò èìåòü òîëüêî îäíó ìåòêó
òîìà îäíîâðåìåííî.
Windows ïðåäñòàâëÿåò êàæäûé îòäåëüíûé àòðèáóò ôàéëà óíèêàëüíûì ÷èñ-
ëîì è ñîõðàíÿåò ýòî ÷èñëî ñ èíôîðìàöèåé îá èìåíè è ðàçìåðå ôàéëà. Åñëè
ôàéë èìååò íåñêîëüêî àòðèáóòîâ, Windows ñêëàäûâàåò êîäîâûå ÷èñëà äëÿ êà-
æäîãî àòðèáóòà è ñîõðàíÿåò èõ ñóììó. Â ñëåäóþùåì ðàçäåëå îïèñûâàåòñÿ, êàê
ìîæíî íàéòè è èíòåðïðåòèðîâàòü êîäîâîå ÷èñëî äëÿ àòðèáóòîâ ôàéëà.
 òàáë. 8.2 ïåðå÷èñëÿþòñÿ êîäû àòðèáóòîâ ôàéëîâ, êîòîðûå èñïîëüçóåò
Windows, è âíóòðåííèå êîíñòàíòû VBA äëÿ ýòèõ êîäîâ àòðèáóòîâ. Êàê è â ñëó-
÷àå ñ äðóãèìè ÷èñëîâûìè êîäàìè, äëÿ êîòîðûõ VBA îïðåäåëÿåò êîíñòàíòó,
ñëåäóåò èñïîëüçîâàòü VBA-êîíñòàíòó äëÿ êîäîâîãî ÷èñëà âìåñòî ñàìîãî êîäî-
âîãî ÷èñëà.
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 317

Òàáëèöà 8.2. Êîíñòàíòû àòðèáóòîâ ôàéëà Visual Basic for Applications

Êîíñòàíòà
Çíà÷åíèå ×òî îçíà÷àåò
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.

Ïîëó÷åíèå àòðèáóòîâ ôàéëà


Äëÿ òîãî ÷òîáû îïðåäåëèòü, êàêèå àòðèáóòû èìååò îïðåäåëåííûé ôàéë, èñ-
ïîëüçóéòå VBA-ôóíêöèþ GetAttr.
Ôóíêöèÿ GetAttr âîçâðàùàåò ÷èñëî, ñîäåðæàùåå ñóììó âñåõ ÷èñëîâûõ êî-
äîâ äëÿ àòðèáóòîâ ôàéëà, è èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
GetAttr(pathname)
Àðãóìåíò pathname — ëþáîå ñòðîêîâîå âûðàæåíèå VBA, ïðåäñòàâëÿþùåå äîïóñ-
òèìîå èìÿ ôàéëà; pathname ìîæåò âêëþ÷àòü áóêâåííóþ ìåòêó äèñêà è ïîëíûé
ïóòü ïàïêè; åñëè âû íå âêëþ÷àåòå áóêâåííóþ ìåòêó, GetAttr èùåò óêàçàííûé
ôàéë íà òåêóùåì äðàéâåðå äèñêà; åñëè âû íå âêëþ÷àåòå ïóòü ïàïêè, ôóíêöèÿ
GetAttr âûïîëíÿåò ïîèñê â òåêóùåé ïàïêå.

 ëèñòèíãå 8.1 ñîäåðæèòñÿ ïðèìåð, â êîòîðîì èñïîëüçóåòñÿ ôóíêöèÿ


GetAttr è ïîêàçûâàåòñÿ, êàê èíòåðïðåòèðîâàòü ðåçóëüòàò ôóíêöèè.

Ëèñòèíã 8.1. Èñïîëüçîâàíèå ôóíêöèè GetAttr è èíòåðïðåòàöèÿ ðåçóëüòàòà


1: Sub ShowFA(fName As String)
2: 'îòîáðàæàåò îêíî ñ ñîîáùåíèåì îá àòðèáóòàõ
3: 'ôàéëà, èìÿ êîòîðîãî ïåðåäàåòñÿ êàê àðãóìåíò
4:
5: Dim fAttr As Integer
6: Dim mStr As String
7:
8: fAttr = GetAttr(fName)
9: mStr = UCase(fName)
10: mStr = mStr & " has these attributes: " & vbCr
11: If (fAttr And vbReadOnly) Then _
12: mStr = mStr & "Read-Only" & vbCr
13: If (fAttr And vbHidden) Then _
14: mStr = mStr & "Hidden" & vbCr
15: If (fAttr And vbSystem) Then _
16: mStr = mStr & "System" & vbCr
318 Ãëàâà 8

17: If (fAttr And vbVolume) Then _


18: mStr = mStr & "Volume" & vbCr
19: If (fAttr And vbDirectory) Then _
20: mStr = mStr & "Directory" & vbCr
21: If (fAttr And vbArchive) Then _
22: mStr = mStr & "Archive" & vbCr
23: MsgBox mStr
24: End Sub
25:
26: Sub ListFileAttr()
27:
28: Dim strPath As String
29:
30: ShowFA fName:="c:\io.sys"
31: ShowFA fName:="c:\msdos.sys"
32:
33: strPath = "C:\Program Files\Microsoft Office\Office\XlStart"
34: ShowFA fName:=strPath
35:
36: End Sub

 ëèñòèíãå 8.1 ñîäåðæàòñÿ äâå ïðîöåäóðû. Ïðîöåäóðà ShowFA çàíèìàåò


ñòðîêè 1–24, à ïðîöåäóðà ListFileAttr — ñòðîêè 26–36. Ïðîöåäóðà
ListFileAttr ïðîñòî âûçûâàåò ShowFA íåñêîëüêî ðàç, ïåðåäàâàÿ êàæäûé ðàç
äðóãîå èìÿ ôàéëà.
Ïðîöåäóðà ShowFA èìååò îäèí îáÿçàòåëüíûé àðãóìåíò ñ èìåíåì fName
è òèïîì String. Â ñòðîêå 5 îáúÿâëÿåòñÿ ïåðåìåííàÿ fAttr òèïà Integer äëÿ
ñîõðàíåíèÿ çíà÷åíèÿ, âîçâðàùàåìîãî ôóíêöèåé GetAttr.  ñòðîêå 6 îáúÿâëÿ-
åòñÿ ïåðåìåííàÿ mStr òèïà String äëÿ ñîõðàíåíèÿ ñîîáùåíèÿ, ôîðìèðóåìîãî
ýòîé ïðîöåäóðîé.
Ïðè âûïîëíåíèè îïåðàòîðà â ñòðîêå 8 VBA âûçûâàåò GetAttr, ïåðåäàâàÿ
ñòðîêó fName â êà÷åñòâå àðãóìåíòà è ñîõðàíÿÿ ðåçóëüòàò ôóíêöèè â ïåðåìåí-
íîé fAttr. Åñëè ñòðîêà â fName íå ñîäåðæèò äîïóñòèìîãî èìåíè ôàéëà, VBA
îòîáðàæàåò ñîîáùåíèå î runtime-îøèáêå (ðèñ. 8.1).

Ðèñ. 8.1
Ñîîáùåíèÿ VBA ïðè îøèáêå
â àðãóìåíòå ôóíêöèè GetAttr

Ñòðîêè 9 è 10 ôîðìèðóþò ïåðâóþ ÷àñòü ñîîáùåíèÿ, êîòîðîå îòîáðàæàåò


ïðîöåäóðà ShowFA. Â ñòðîêå 9 èñïîëüçóåòñÿ VBA-ôóíêöèÿ UÑase äëÿ ïðåîá-
ðàçîâàíèÿ èìåíè ôàéëà â fName â âåðõíèé ðåãèñòð ïî «êîñìåòè÷åñêèì» ïðè-
÷èíàì.
 ñòðîêàõ 11–22 íàõîäèòñÿ ðÿä îïåðàòîðîâ If…Then îöåíèâàþùèõ ÷èñëî,
ñîõðàíåííîå â fAttr, êîòîðîå ñîäåðæèò ñóììó âñåõ êîäîâûõ ÷èñåë äëÿ àòðèáó-
òîâ ýòîãî ôàéëà. Çàìåòüòå, ÷òî ýòè îïåðàòîðû If…Then íå ÿâëÿþòñÿ âëîæåííû-
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 319

ìè. Çíà÷åíèå â 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

 ïðîöåäóðå ShowFA íåò òåñòèðîâàíèÿ äëÿ àòðèáóòà ôàéëà Normal, ïîòîìó


÷òî àòðèáóò ôàéëà Normal — ýòî ïðîñòî îòñóòñòâèå ëþáûõ äðóãèõ àòðèáóòîâ.
Îáúÿâëÿéòå âñå ïåðåìåííûå, êîòîðûå èñïîëüçóåòå äëÿ ñîõðàíåíèÿ êîäîâ àò-
ðèáóòîâ ôàéëà, êàê ïåðåìåííûå òèïà Integer, òàê êîäîâîå ÷èñëî àòðèáóòà ôàé-
ëà âñåãäà íàõîäèòñÿ â äîïóñòèìîì äèàïàçîíå òèïà Integer. Íå ñëåäóåò òàêæå
çàáûâàòü, ÷òî êîäû àòðèáóòîâ âñåãäà îáðàáàòûâàþòñÿ êàê îäíî ÷èñëî, ñîäåðæà-
ùåå ñóììó âñåõ îòäåëüíûõ êîäîâûõ ÷èñåë äëÿ àòðèáóòîâ äàííîãî ôàéëà.

Èçìåíåíèå àòðèáóòîâ ôàéëà


Àòðèáóòû ôàéëîâ ìîæíî óñòàíàâëèâàòü èç êîäà VBA. Íàïðèìåð, ìîæíî èçìå-
íèòü àòðèáóòû ôàéëà øàáëîííîãî äîêóìåíòà, ÷òîáû âêëþ÷èòü àòðèáóò Read-
Only äëÿ ïðåäîòâðàùåíèÿ íå÷àÿííîãî óäàëåíèÿ ýòîãî øàáëîííîãî äîêóìåíòà.
320 Ãëàâà 8

Äëÿ èçìåíåíèÿ àòðèáóòîâ ôàéëà ïðåäíàçíà÷åí îïåðàòîð SetAttr, êîòîðûé


âûïîëíÿåò òó æå ñàìóþ çàäà÷ó, ÷òî è êîìàíäà Ôàéë | Ñâîéñòâà (äîñòóïíàÿ â ëþ-
áûõ îêíàõ êàòàëîãà Windows èëè ñ ïîìîùüþ ùåë÷êà ïðàâîé êíîïêîé ìûøè
íà çíà÷êå ôàéëà), à òàêæå DOS-êîìàíäà ATTRIB.
Îïåðàòîð SetAttr èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
SetAttr pathname, attributes
Çäåñü pathname — ëþáîå ñòðîêîâîå âûðàæåíèå, ñîäåðæàùåå äîïóñòèìóþ ñïåöèôè-
êàöèþ ôàéëà Windows [èìÿ ôàéëà è (íåîáÿçàòåëüíî) ïîëíûé ïóòü ê êàòàëîãó, è áó-
êâåííóþ ìåòêó äèñêà]; attributes — ýòî ÷èñëåííîå âûðàæåíèå. ×èñëåííîå âûðàæå-
íèå äëÿ attributes äîëæíî áûòü ÷èñëîì ìåæäó 1 è 255 è ñîñòîÿòü èç îäíîãî èç êîäî-
âûõ ÷èñåë àòðèáóòà ôàéëà èëè ñóììû êîäîâûõ ÷èñåë àòðèáóòîâ.

 ëèñòèíãå 8.2 ïîêàçàí ïðèìåð òîãî, êàê ìîæíî èñïîëüçîâàòü îïåðàòîð


SetAttr.

Ëèñòèíã 8.2. Èñïîëüçîâàíèå îïåðàòîðà SetAttr äëÿ èçìåíåíèÿ àòðèáóòîâ ôàéëà


1: Sub SetReadOnly(fName As String)
2: 'óñòàíàâëèâàåò àòðèáóò òîëüêî íà ÷òåíèå
3:
4: Dim fAttr As Integer
5:
6: fAttr = GetAttr(fName)
7:
8: 'íå óñòàíàâëèâàòü àòðèáóò, åñëè îí óæå óñòàíîâëåí
9: If Not CBool(fAttr And vbReadOnly) Then
10: SetAttr fName, fAttr + vbReadOnly
11: End If
12:
13: MsgBox prompt:="Àòðèáóò Read-only äëÿ " & _
14: fName & " óñòàíîâëåí.", _
15: Title:="Delete Protection"
16: End Sub
17:
18:
19: Sub Test_SetReadOnly()
20: Dim iName As String
21: iName = Application.GetOpenFilename
22: SetReadOnly iName
23: ShowFA iName
24: End Sub

Ïðîöåäóðà SetReadOnly çàùèùàåò ôàéëû îò ñëó÷àéíîãî óäàëåíèÿ òåì, ÷òî


ïðèñâàèâàåò ôàéëó àòðèáóò Read-Only, íå âëèÿÿ íà äðóãèå àòðèáóòû.
SetReadOnly èìååò îäèí îáÿçàòåëüíûé àðãóìåíò òèïà String ñ èìåíåì
fName, êîòîðûé èñïîëüçóåòñÿ äëÿ ïåðåäà÷è èìåíè ôàéëà â ïðîöåäóðó.  ñòðî-
êå 4 îáúÿâëÿåòñÿ ïåðåìåííàÿ fAttr; ïðîöåäóðà èñïîëüçóåò ýòó ïåðåìåííóþ äëÿ
ñîõðàíåíèÿ ÷èñëà äëÿ àòðèáóòîâ ôàéëà.
 ñòðîêå 6 èñïîëüçóåòñÿ ôóíêöèÿ GetAttr äëÿ ïîëó÷åíèÿ àòðèáóòîâ ôàéëà,
îïðåäåëåííîãî ñ ïîìîùüþ fName. Â ñòðîêàõ 9–11 ñîäåðæèòñÿ îïåðàòîð If, âû-
ïîëíÿþùèé îïåðàòîð SetAttr, åñëè òîëüêî ýòîé ôàéë íå èìååò óæå àòðèáóò
Read-Only.  ñòðîêå 10 ñîäåðæèòñÿ ôàêòè÷åñêèé âûçîâ îïåðàòîðà SetAttr.
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 321

Çàìåòüòå, ÷òî ñòàðûå àòðèáóòû ôàéëà àðèôìåòè÷åñêè ñêëàäûâàþòñÿ ñ êîí-


ñòàíòîé vbReadOnly äëÿ çàäàíèÿ íîâûõ àòðèáóòîâ. Òàêèì îáðàçîì, îðèãè-
íàëüíûå àòðèáóòû ôàéëà ñîõðàíÿþòñÿ.
Íàêîíåö, â ñòðîêàõ 13–15 ñîäåðæèòñÿ îïåðàòîð MsgBox, îòîáðàæàþùèé ñî-
îáùåíèå ïîëüçîâàòåëþ î òîì, ÷òî àòðèáóò Read-Only äëÿ ôàéëà óñòàíîâëåí.
Ïðîöåäóðà Test_SetReadOnly òåñòèðóåò ïðîöåäóðó SetReadOnly.
 ñòðîêå 21 èñïîëüçóåòñÿ Excel-ìåòîä GetOpenFileName (êîòîðûé áóäåò îïè-
ñàí â ñëåäóþùåì ðàçäåëå) äëÿ ïîëó÷åíèÿ èìåíè ôàéëà îò ïîëüçîâàòåëÿ.
 ñòðîêå 23 âûçûâàåòñÿ ïðîöåäóðà SetReadOnly äëÿ çàäàíèÿ àòðèáóòîâ ôàéëà
ñ öåëüþ âêëþ÷åíèÿ àòðèáóòà Read-Only. Íàêîíåö, â ñòðîêå 24 âûçûâàåòñÿ
ïðîöåäóðà ShowFA (ïðèâåäåííàÿ â ëèñòèíãå 8.1) äëÿ îòîáðàæåíèÿ îêíà ñîîá-
ùåíèÿ ñ íîâûìè àòðèáóòàìè ôàéëà.
Äëÿ äîáàâëåíèÿ íîâîãî àòðèáóòà ôàéëà ê èìåþùåìóñÿ íàáîðó àòðèáóòîâ èñ-
ïîëüçóéòå îïåðàòîð Or. Ïðèìåíåíèå îïåðàòîðà Or äëÿ îáúåäèíåíèÿ àòðèáóòîâ
ôàéëà â ïîáèòîâîé îïåðàöèè èñêëþ÷àåò ëþáûå âîçìîæíûå ïðîáëåìû, êîòîðûå
ìîãóò âîçíèêíóòü ïðè èñïîëüçîâàíèè àðèôìåòè÷åñêîãî ñëîæåíèÿ äëÿ îáúåäè-
íåíèÿ íîâûõ àòðèáóòîâ ñ óæå èìåþùèìèñÿ. Ðåçóëüòàòîì âûðàæåíèÿ 0 Or 1
ÿâëÿåòñÿ 1; ðåçóëüòàòîì âûðàæåíèÿ 1 Or 1 ÿâëÿåòñÿ òàêæå 1. Ïîýòîìó ìîæíî
îáúåäèíÿòü íîâûé àòðèáóò ôàéëà ñ èìåþùèìñÿ ÷èñëîì àòðèáóòà ôàéëà, èñ-
ïîëüçóÿ âûðàæåíèå, ïîäîáíîå OldAttr Or vbArchive. Åñëè àòðèáóò Archive
íå çàäàí â OldAttr, îí áóäåò çàäàí êàê ðåçóëüòàò îïåðàöèè Or. Åñëè àòðèáóò
Archive óæå çàäàí, îí îñòàíåòñÿ íåèçìåííûì.

Êàê íàõîäèòü ôàéëû


 ýòîì ðàçäåëå ñíà÷àëà áóäåò ïîêàçàíî, êàê èñïîëüçîâàòü VBA-ôóíêöèþ Dir
äëÿ ïîèñêà â ïàïêå îäíîãî èëè íåñêîëüêèõ ôàéëîâ, ñîâïàäàþùèõ ñ îïðåäåëåí-
íûì èìåíåì ôàéëà. Çàòåì âû óçíàåòå, êàê èñïîëüçîâàòü VBA äëÿ âêëþ÷åíèÿ
Word- èëè Excel-ñîáñòâåííûõ äèàëîãîâûõ îêîí Open (Îòêðûòèå äîêóìåíòà)
è Save As (Ñîõðàíåíèå äîêóìåíòà) â âàøè ïðîöåäóðû. Ìîæíî èñïîëüçîâàòü
Word- è Excel-âñòðîåííûå äèàëîãîâûå îêíà Open è Save As äëÿ ïðåäîñòàâëåíèÿ
âîçìîæíîñòè ïîëüçîâàòåëþ ëåãêî è ïðàâèëüíî ïåðåäàâàòü èìåíà ôàéëîâ ïðîöå-
äóðàì.

Èñïîëüçîâàíèå ôóíêöèè Dir äëÿ íàõîæäåíèÿ ôàéëîâ


Èíîãäà ìîæåò áûòü íåîáõîäèìî ïðîâåðèòü, ñîäåðæèò ëè êàòàëîã äèñêà îäèí
èëè íåñêîëüêî ôàéëîâ, ñîâïàäàþùèõ ñ îïðåäåëåííîé ñïåöèôèêàöèåé èìåíè
ôàéëà, òàêîé êàê \My Documents\*.xls èëè \My Documents\*.doc. Äëÿ ýòîãî
ìîæíî èñïîëüçîâàòü VBA-ôóíêöèþ Dir. Ôóíêöèÿ Dir âûïîëíÿåò â VBA òå æå
çàäà÷è, ÷òî è ñïèñîê ôàéëîâ â îêíå ïàïêè Windows èëè DOS-êîìàíäà DIR, —
äàåò âîçìîæíîñòü ïîñìîòðåòü, êàêèå ôàéëû ñîõðàíåíû â îïðåäåëåííîé ïàïêå
è êàêèå èìåþòñÿ äðóãèå ïàïêè.
Ôóíêöèÿ Dir èìååò ñëåäóþùèé îáùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Dir(pathname[, attributes])
322 Ãëàâà 8

Çäåñü pathname ïðåäñòàâëÿåò ëþáîå âûðàæåíèå òèïà String, èìåþùåå ðåçóëüòà-


òîì äîïóñòèìîå èìÿ ôàéëà. Èìÿ ôàéëà ìîæåò ñîäåðæàòü áóêâåííóþ ìåòêó äðàéâå-
ðà è ïîëíûé ïóòü ïàïêè. Èìÿ ïàïêè ìîæåò òàêæå âêëþ÷àòü ñèìâîëû óíèâåðñàëü-
íîãî ñîïîñòàâëåíèÿ ôàéëîâ. Íåîáÿçàòåëüíûé àðãóìåíò attributes ÿâëÿåòñÿ ÷èñëîì,
ïðåäñòàâëÿþùèì àòðèáóòû òåõ ôàéëîâ, êîòîðûå íåîáõîäèìî íàéòè. Ïðè èñïîëüçî-
âàíèè attributes ôóíêöèÿ Dir âûïîëíÿåò ïîèñê ôàéëîâ, èìåþùèõ ýòè àòðèáóòû.
Åñëè îïóñòèòü àðãóìåíò attributes, ôóíêöèÿ Dir âûïîëíÿåò ïîèñê îáû÷íûõ ôàé-
ëîâ, òî åñòü ëþáûõ ôàéëîâ, êðîìå èìåþùèõ àòðèáóòû Hidden, Volume Label,
Directory èëè System.
Ïðè âûçîâå ôóíêöèè Dir ñ àðãóìåíòîì pathname îíà âîçâðàùàåò ñòðîêó, ñîäåðæà-
ùóþ èìÿ ïåðâîãî íàéäåííîãî åþ ôàéëà, ñîâïàäàþùåå ñ èìåíåì ôàéëà â àðãóìåíòå
pathname. Åñëè èìÿ ôàéëà ñîäåðæèò ñèìâîëû óíèâåðñàëüíîãî ñîïîñòàâëåíèÿ (*
èëè ?), òî äëÿ òîãî, ÷òîáû íàéòè âñå ôàéëû â êàòàëîãå, ñîâïàäàþùèå ñ ýòèì èìåíåì
ôàéëà, íåîáõîäèìî èñïîëüçîâàòü ôóíêöèþ Dir â äâà ýòàïà. Âî-ïåðâûõ, âûçûâàòü
Dir ñ àðãóìåíòîì pathname äëÿ ïîëó÷åíèÿ ïåðâîãî ñîâïàäàþùåãî ôàéëà, çàòåì âû-
çûâàòü Dir íåîäíîêðàòíî áåç àðãóìåíòîâ äî òåõ ïîð, ïîêà Dir íå âîçâðàòèò ïóñòóþ
ñòðîêó. Êàê òîëüêî Dir âîçâðàùàåò ïóñòóþ ñòðîêó, çíà÷èò, áîëüøå íå îñòàåòñÿ
ôàéëîâ, ñîâïàäàþùèõ ñ ýòèì èìåíåì ôàéëà. Ïðè âûçîâå Dir áåç óêàçàíèÿ èìåíè
ôàéëà, VBA âûäàåò ñîîáùåíèå î runtime-îøèáêå.

 ëèñòèíãå 8.3 ïîêàçàí ïðèìåð èñïîëüçîâàíèÿ Dir äëÿ íàõîæäåíèÿ òîëüêî


îäíîãî ôàéëà.

Ëèñòèíã 8.3. Èñïîëüçîâàíèå Dir äëÿ íàõîæäåíèÿ îäíîãî ôàéëà


1: Function IsFile(fName As String) As Boolean
2: 'âîçâðàùàåò Èñòèíà (True), åñëè ôàéë íà äèñêå íàéäåí,
3: 'èíà÷å - Ëîæü (False)
4: If (Dir(fName) <> "") Then
5: IsFile = True
6: Else
7: IsFile = False
8: End If
9: End Function
10:
11:
12: Sub Test_IsFile()
13: Dim iName As String
14: Dim str_msg As String
15:
16: iName = InputBox(prompt:="Ââåäèòå èìÿ ôàéëà:", _
17: Title:="Òåñòèðîâàíèå ôóíêöèè IsFile")
18:
19: str_msg = "Ôàéë " & iName & "; ðåçóëüòàò ïîèñêà: "
20: If IsFile(iName) Then
21: str_msg = str_msg & " íàéäåí"
22: Else
23: str_msg = str_msg & " íå íàéäåí"
24: End If
25:
26: MsgBox str_msg
27: End Sub

 ñòðîêàõ 1–9 ñîäåðæèòñÿ ôóíêöèÿ IsFile, èìåþùàÿ îäèí îáÿçàòåëüíûé àð-


ãóìåíò fName òèïà String. IsFile âîçâðàùàåò ðåçóëüòàò ñ òèïîì Boolean:
True, åñëè èìÿ ôàéëà â fName íàõîäèòñÿ íà äðàéâåðå äèñêà, èíà÷å — False.
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 323

Ðàáîòà ôóíêöèè IsFile î÷åíü ïðîñòà.  ñòðîêå 4 ñîäåðæèòñÿ îïåðàòîð


If…Then…Else, êîòîðûé âûçûâàåò ôóíêöèþ Dir, ïåðåäàâàÿ ñîäåðæèìîå
fName â êà÷åñòâå èìåíè ôàéëà, ïîèñê êîòîðîãî íåîáõîäèìî âûïîëíèòü.  ýòîì
îáðàùåíèè ê ôóíêöèè Dir íèêàêîé àðãóìåíò äëÿ àòðèáóòîâ íå óêàçûâàåòñÿ,
ïîýòîìó îíà áóäåò íàõîäèòü ëþáîé ôàéë, êðîìå ôàéëîâ, èìåþùèõ àòðèáóòû
Hidden, System, Directory èëè Volume Label.
Ïîñêîëüêó íàçíà÷åíèåì ôóíêöèè IsFile ÿâëÿåòñÿ ïðîñòî îïðåäåëåíèå òîãî,
ñóùåñòâóåò ëè îïðåäåëåííûé ôàéë, âîçâðàùàåìûé ðåçóëüòàò ôóíêöèè Dir íå
èñïîëüçóåòñÿ, êðîìå ñðàâíåíèÿ åãî ñ ïóñòîé ñòðîêîé. Åñëè ðåçóëüòàò ôóíêöèè
Dir íå ÿâëÿåòñÿ ïóñòîé ñòðîêîé, òî Dir íàøëà óêàçàííûé ôàéë è VBA âûïîë-
íÿåò ñòðîêó 5, êîòîðàÿ ïðèñâàèâàåò ðåçóëüòàòó ôóíêöèè çíà÷åíèå True. Åñëè
ðåçóëüòàò ôóíêöèè Dir ÿâëÿåòñÿ ïóñòîé ñòðîêîé, òî íèêàêîãî ñîâïàäàþùåãî
ôàéëà íå áûëî íàéäåíî è VBA âûïîëíÿåò ñòðîêó 7, êîòîðàÿ ïðèñâàèâàåò False
ðåçóëüòàòó ôóíêöèè.
 ñòðîêàõ 12–27 îáúÿâëÿåòñÿ ïðîöåäóðà äëÿ òåñòèðîâàíèÿ ôóíêöèè IsFile.
Ó÷èòûâàÿ íîìåð òåêóùåé ãëàâû, íå áóäåì ïîäðîáíî îñòàíàâëèâàòüñÿ íà ðàçáî-
ðå ýòîãî êîäà. Åñëè â òàêîì ïðîñòîì êîäå ÷òî-òî íåÿñíî, ñëåäóåò ïðî÷èòàòü
âíèìàòåëüíåå ïðåäûäóùèå ãëàâû.
Ôóíêöèþ Dir ìîæíî òàêæå èñïîëüçîâàòü äëÿ íàõîæäåíèÿ â ïàïêå âñåõ
ôàéëîâ, ñîâïàäàþùèõ ñ îïðåäåëåííûì èìåíåì ôàéëà. Ýòà âîçìîæíîñòü ôóíê-
öèè Dir íàèáîëåå ïîëåçíà, êîãäà èìÿ ôàéëà ñîäåðæèò ñèìâîëû óíèâåðñàëüíî-
ãî ñîïîñòàâëåíèÿ. Ìîæíî èñïîëüçîâàòü ôóíêöèþ Dir òàêèì îáðàçîì, åñëè íå-
îáõîäèìî, ñêàæåì, íàéòè âñå ôàéëû øàáëîíîâ â îïðåäåëåííîé ïàïêå.
 ëèñòèíãå 8.4 ïîêàçàí ïðèìåð òîãî, êàê ôóíêöèÿ Dir èñïîëüçóåòñÿ äëÿ íà-
õîæäåíèÿ íåñêîëüêèõ ôàéëîâ.

Ëèñòèíã 8.4. Èñïîëüçîâàíèå ôóíêöèè Dir äëÿ íàõîæäåíèÿ íåñêîëüêèõ ôàéëîâ


1: Sub ShowFA(fName As String, Number As Integer)
2: 'îòîáðàæàåò îêíî ñ ñîîáùåíèåì îá àòðèáóòàõ
3: 'ôàéëà, èìÿ êîòîðîãî ïåðåäàåòñÿ êàê àðãóìåíò
4:
5: Dim fAttr As Integer
6: Dim mStr As String
7:
8: fAttr = GetAttr(fName)
9: mStr = UCase(fName)
10: mStr = mStr & " has these attributes: " & vbCr
11: If (fAttr And vbReadOnly) Then _
12: mStr = mStr & "Read-Only" & vbCr
13: If (fAttr And vbHidden) Then _
14: mStr = mStr & "Hidden" & vbCr
15: If (fAttr And vbSystem) Then _
16: mStr = mStr & "System" & vbCr
17: If (fAttr And vbVolume) Then _
18: mStr = mStr & "Volume" & vbCr
19: If (fAttr And vbDirectory) Then _
20: mStr = mStr & "Directory" & vbCr
21: If (fAttr And vbArchive) Then _
22: mStr = mStr & "Archive" & vbCr
23:
24: 'çàïèñü â ëèñò Excel:
25: Cells(Number, 1).Value = mStr
26: End Sub
27:
28: Sub ShowAllFiles()
324 Ãëàâà 8

29: 'îòîáðàæàåò èìåíà è àòðèáóòû âñåõ ôàéëîâ


30: 'â óêàçàííîì êàòàëîãå Ââåäèòå èìÿ êàòàëîãà:
31:
32: Dim sAttr As Integer
33: Dim fName As String
34: Dim pName As String
35: Dim fCount As Integer
36:
37: pName = InputBox("Ââåäèòå èìÿ êàòàëîãà:")
38: If Trim(pName) = "" Then Exit Sub
39: If Right(pName, 1) <> "\" Then pName = pName & "\"
40:
41: sAttr = vbDirectory + vbArchive + vbReadOnly + _
42: vbHidden + vbSystem
43:
44: 'ïîëó÷èòü ïåðâîå èìÿ ôàéëà è àòðèáóòû
45: fName = Dir(pName & "*.*", sAttr)
46: If (fName <> "") And _
47: ((fName <> ".") And (fName <> "..")) Then
48: fCount = 1
49: ShowFA pName & fName, fCount
50: End If
51:
52: Do While (fName <> "")
53: fName = Dir()
54: If (fName <> "") And _
55: ((fName <> ".") And (fName <> "..")) Then
56: fCount = fCount + 1
57: ShowFA pName & fName, fCount
58:
59: End If
60: Loop
61:
62: MsgBox "Íàéäåíî ôàéëîâ " & fCount
63: End Sub

 ýòîì ëèñòèíãå ñíà÷àëà (ñòðîêè 1–26) îïèñàíà ïðîöåäóðà ShowFA, êîòî-


ðàÿ óæå âñòðå÷àëàñü â ëèñòèíãå 8.1. Çäåñü áûëè âíåñåíû íåáîëüøèå èçìåíå-
íèÿ: òåïåðü ïðîöåäóðà èìååò åùå îäèí ïàðàìåòð Number òèïà Integer è ðå-
çóëüòèðóþùàÿ ñòðîêà âûäàåòñÿ íå â îêíå îïåðàòîðà MsgBox (ïðè äëèííîì ñïè-
ñêå ôàéëîâ ýòî áóäåò óòîìëÿòü ïîëüçîâàòåëÿ äàæå â ïðîöåññå òåñòèðîâàíèÿ
êîäà), à çàïèñûâàåòñÿ â Excel-ëèñò, ïðè÷åì Number óêàçûâàåò íîìåð ñòðîêè,
â êîòîðóþ áóäåò çàïèñûâàòüñÿ ðåçóëüòèðóþùàÿ ñòðîêà.
Ïðîöåäóðà ShowAllFiles çàïðàøèâàåò ïîëüçîâàòåëÿ ââåñòè èìÿ ïàïêè (êà-
òàëîãà), à çàòåì èñïîëüçóåò ôóíêöèþ Dir äëÿ íàõîæäåíèÿ âñåõ ôàéëîâ â ýòîì
êàòàëîãå. Â ñòðîêàõ 32–35 îáúÿâëÿþòñÿ íåñêîëüêî ïåðåìåííûõ. Ïåðåìåííàÿ
sAttr èñïîëüçóåòñÿ äëÿ ñîõðàíåíèÿ ÷èñëà àòðèáóòîâ ôàéëà, fName — äëÿ âðå-
ìåííîãî õðàíåíèÿ èìåí ôàéëîâ, âîçâðàùàåìûõ ôóíêöèåé Dir, pName — äëÿ
ñîõðàíåíèÿ ïóòè êàòàëîãà, êîòîðûé èùåò ýòà ïðîöåäóðà, fCount — äëÿ ñîõðà-
íåíèÿ ñ÷åò÷èêà âñåõ íàéäåííûõ ôàéëîâ è â êà÷åñòâå ïàðàìåòðà ôóíêöèè
ShowFA äëÿ çàïèñè äàííûõ î ôàéëå â î÷åðåäíóþ ñòðîêó ëèñòà.
 ñòðîêå 39 ïðîâåðÿåòñÿ, èìååò ëè ïóòü (ââåäåííûé ïîëüçîâàòåëåì â ñòðî-
êå 37) êàòàëîãà â êîíöå ñòðîêè ñèìâîë ðàçäåëèòåëÿ ïóòè (\), è äîáàâëÿåò åãî
â êîíåö ïóòè, ñîõðàíåííîãî â pName, åñëè ñèìâîë ïðîïóùåí.
 ñòðîêàõ 41–42 çàäàåòñÿ ïåðåìåííàÿ sAttr, ñîäåðæàùàÿ àòðèáóòû ôàéëîâ,
ïîèñê êîòîðûõ áóäåò âûïîëíÿòü ôóíêöèÿ Dir. Çàìåòüòå, ÷òî sAttr çàäàåòñÿ
òàê, ÷òî îíà ñîäåðæèò âñå âîçìîæíûå àòðèáóòû ôàéëà, êðîìå Volume Label.
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 325

Ïðè òàêèõ àòðèáóòàõ 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» (êîíå÷íî, íà êàêîì-òî ñëó÷àéíîì êîì-
ïüþòåðå).

Èñïîëüçîâàíèå âñòðîåííûõ äèàëîãîâûõ îêîí


Excel äëÿ ïîëó÷åíèÿ èìåí ôàéëîâ
Excel-îáúåêò Application èìååò äâà ìåòîäà — GetOpenFilename è Get-
SaveAsFilename, êîòîðûå ìîæíî èñïîëüçîâàòü â Excel-êîäå VBA äëÿ óïðîùå-
326 Ãëàâà 8

íèÿ çàäà÷è ïîëó÷åíèÿ èìåíè ôàéëà îò ïîëüçîâàòåëÿ.  ñëåäóþùèõ äâóõ ðàçäå-


ëàõ îïèñûâàåòñÿ, êàê èñïîëüçîâàòü ýòè äâà ìåòîäà â ïðîöåäóðàõ.
Ðèñ. 8.3. Îäèí èç
âîçìîæíûõ
ðåçóëüòàòîâ
ðàáîòû êîäà èç
ëèñòèíãà 8.4

Èñïîëüçîâàíèå ìåòîäà GetOpenFilename


Âî ìíîãèõ ïðèìåðàõ â ýòîé êíèãå èñïîëüçîâàëàñü ôóíêöèÿ InputBox äëÿ
ïîëó÷åíèÿ èìåí ôàéëîâ îò ïîëüçîâàòåëÿ ïðîöåäóðû. Õîòÿ ïîëó÷åíèå èìåíè
ôàéëà ñ ïîìîùüþ InputBox ÿâëÿåòñÿ îáû÷íîé ïðàêòèêîé, ïðè ýòîì íå èñïîëü-
çóþòñÿ ïðåèìóùåñòâà îðèåíòèðîâàííîãî íà ôàéë äèàëîãîâîãî îêíà, òàêîãî êàê
Excel-îêíî Open, êîòîðîå ïîçâîëÿåò óâèäåòü, êàêèå ôàéëû èìåþòñÿ íà äèñêå,
è ïðîñìàòðèâàòü ñïèñêè ôàéëîâ ðàçëè÷íûõ äðàéâåðîâ äèñêà è êàòàëîãîâ.
Ìîæíî èñïîëüçîâàòü Excel-ìåòîä GetOpenFilename â Excel-êîäå VBA äëÿ
îòîáðàæåíèÿ äèàëîãîâîãî îêíà, êîòîðîå âûãëÿäèò è ðàáîòàåò òàê æå, êàê äèà-
ëîãîâîå îêíî, îòîáðàæàåìîå Excel ïðè âûáîðå êîìàíäû File | Open (Ôàéë | Îò-
êðûòü). Ìåòîä GetOpenFilename âîçâðàùàåò ñòðîêó, êîòîðàÿ ñîäåðæèò èìÿ
ôàéëà, âûáðàííîãî ïîëüçîâàòåëåì, âêëþ÷àÿ áóêâåííóþ ìåòêó äèñêà è ïîëíûé
ïóòü ïàïêè. Åñëè ïîëüçîâàòåëü îòìåíÿåò äèàëîãîâîå îêíî, GetOpenFilename
âîçâðàùàåò Boolean-çíà÷åíèå False â êà÷åñòâå ðåçóëüòàòà.
Excel-ìåòîä GetOpenFilename èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
object.GetOpenFilename(fileFilter, filterIndex, title, buttonText,
multiSelect)
Çäåñü object — ýòî ññûëêà íà Excel-îáúåêò Application. Õîòÿ ññûëêà object íà
Excel-îáúåêò Application ÿâëÿåòñÿ îáÿçàòåëüíîé, âñå àðãóìåíòû GetOpen-
Filename ÿâëÿþòñÿ íåîáÿçàòåëüíûìè. Àðãóìåíò fileFilter ïðåäñòàâëÿåò ëþáîå äî-
ïóñòèìîå âûðàæåíèå String, ñïåöèàëüíî ôîðìàòèðîâàííîå äëÿ çàäàíèÿ ôèëüòðîâ
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 327

ôàéëà, ïåðå÷èñëåííûõ â îêíå ðàñêðûâàþùåãîñÿ ñïèñêà Files of type â äèàëîãîâîì


îêíå Open. Åñëè àðãóìåíò fileFilter îïóùåí, ôèëüòð ôàéëà äëÿ ðàñêðûâàþùåãîñÿ
ñïèñêà Files of type — ýòî All Files (*.*).
Àðãóìåíò filterIndex ïðåäñòàâëÿåò ëþáîå ÷èñëåííîå âûðàæåíèå è óêàçûâàåò, êà-
êîé ôèëüòð ôàéëà äîëæåí èñïîëüçîâàòü VBA êàê ôèëüòð ïî óìîë÷àíèþ äëÿ ðàñ-
êðûâàþùåãîñÿ ñïèñêà Files of type (Òèï ôàéëîâ). Åñëè ýòîò àðãóìåíò îïóñòèòü èëè
óêàçàòü ÷èñëî, áîëüøåå, ÷åì ôàêòè÷åñêîå êîëè÷åñòâî ôèëüòðîâ ôàéëà, òî ïåðâûé
ôèëüòð ôàéëà ñòàíîâèòñÿ ôèëüòðîì ïî óìîë÷àíèþ. Àðãóìåíò title ïðåäñòàâëÿåò
ëþáîå âûðàæåíèå òèïà String è ÿâëÿåòñÿ çàãîëîâêîì, îòîáðàæàåìûì VBA â äèà-
ëîãîâîì îêíå Open. Åñëè îïóñòèòü title, VBA îòîáðàæàåò äèàëîãîâîå îêíî ñ îáû÷-
íûì Open-çàãîëîâêîì.
Àðãóìåíò buttonText — íåîáÿçàòåëüíûé ïàðàìåòð òèïà Variant. Èñïîëüçóåòñÿ
òîëüêî â Macintosh.
Àðãóìåíò multiSelect ïðåäñòàâëÿåò ëþáîå âûðàæåíèå èëè çíà÷åíèå Boolean. Åñëè
multiSelect ðàâíî True, òî äèàëîãîâîå îêíî Open äàåò âîçìîæíîñòü ïîëüçîâàòåëþ
âûáèðàòü ìíîæåñòâî èìåí ôàéëîâ. Êîãäà multiSelect ðàâíî True,
GetOpenFilename âîçâðàùàåò ìàññèâ, ñîäåðæàùèé èìåíà âñåõ âûáðàííûõ ôàé-
ëîâ.
Äëÿ îïðåäåëåíèÿ ñòðîêè ôèëüòðà ôàéëà ôîðìàòèðóéòå ñòðîêó ñëåäóþùèì îáðà-
çîì:
"FilterName1,filespec1,FilterName2,filespec2,FilterNameN,filespecN"
Àðãóìåíò filterName ïðåäñòàâëÿåò òåêñò, êîòîðûé VBA îòîáðàæàåò â îêíå ðàñêðû-
âàþùåãîñÿ ñïèñêà Files of type. Àðãóìåíò filespec ïðåäñòàâëÿåò ñïåöèôèêàöèþ ôàé-
ëà, êîòîðóþ Windows èñïîëüçóåò äëÿ îãðàíè÷åíèÿ ôàéëîâ, ïðèâîäèìûõ â îêíå
Open. Ìîæíî âíîñèòü â ñïèñîê ñêîëü óãîäíî ìíîãî ôèëüòðîâ ôàéëà.

 ñëåäóþùåé ñòðîêå ïîêàçàí ïðèìåð ñòðîêè ôèëüòðà ôàéëà:


"Templates (*.xlt), *.xlt, Workbooks (*.xlsx), *.xlsm"
Ýòà ñòðîêà ôèëüòðà ïðèâîäèò ê ïîÿâëåíèþ äâóõ îïöèé (Templates
è Workbooks) â îêíå ðàñêðûâàþùåãîñÿ ñïèñêà Files of type.
 ëèñòèíãå 8.5 ïîêàçàí ïðèìåð, èñïîëüçóþùèé ìåòîä GetOpenFilename.

Ëèñòèíã 8.5. Èñïîëüçîâàíèå ìåòîäà GetOpenFilename


äëÿ ïîëó÷åíèÿ èìåíè ôàéëà îò ïîëüçîâàòåëÿ ïðîöåäóðû
1: Sub TestGetOpenFilename()
2: 'îòêðûâàåò óêàçàííóþ ðàáî÷óþ êíèãó è âûáèðàåò
3: 'ëèñò, óêàçûâàåìûé ïîëüçîâàòåëåì â îêíå ôóíêöèè InputBox
4:
5: Const iTitle = "Ââîä èìåíè ðàáî÷åé êíèãè"
6: Dim ShtName As String
7:
8: Const FilterList = _
9: "Templates (*.xlt),*.xlt,Workbooks (*.xlsx),*.xlsm"
10:
11: Dim fName As String
12:
13:
14: fName = Application.GetOpenFilename(Title:=iTitle, _
15: filefilter:=FilterList, _
16: filterindex:=2)
17:
18:
19: If fName = "False" Then 'äëÿ ðóññêîé âåðñèè "Ëîæü"
20: MsgBox prompt:="Îïåðàöèÿ îòìåíåíà!", _
328 Ãëàâà 8

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

Ïðîöåäóðà TestGetOpenFilename îòêðûâàåò ðàáî÷óþ êíèãó, âûáðàííóþ


ïîëüçîâàòåëåì â äèàëîãîâîì îêíå ñ çàãîëîâêîì, îïðåäåëÿåìûì êîíñòàíòîé
iTitle, à çàòåì âûáèðàåò ðàáî÷èé ëèñò ñ èìåíåì, óêàçûâàåìûì â îêíå ôóíêöèè
InputBox, â îòêðûòîé ðàáî÷åé êíèãå.
 ñòðîêàõ 8–9 îáúÿâëÿåòñÿ êîíñòàíòà FilterList, â äàëüíåéøåì ïåðåäàâàå-
ìàÿ â êà÷åñòâå ôèëüòðà ôàéëà ïðè îáðàùåíèè ê ìåòîäó GetOpenfilename.
 ñòðîêàõ 14–16 ñîäåðæèòñÿ îäèí îïåðàòîð, âûçûâàþùèé ìåòîä
GetOpenFilename è ïðèñâàèâàþùèé åãî ðåçóëüòàò ïåðåìåííîé fName. Ïðè
âûïîëíåíèè ýòîãî îïåðàòîðà VBA îòîáðàæàåò äèàëîãîâîå îêíî, ïîêàçàííîå íà
ðèñ. 8.4. Íà ýòîì ðèñóíêå ïîêàçàíî îòêðûòîå îêíî ñïèñêà Òèï ôàéëîâ (Files of
type), ÷òîáû ìîæíî áûëî âèäåòü äåéñòâèå àðãóìåíòà fileFilter. Çàìåòüòå, ÷òî
äèàëîãîâîå îêíî íà ðèñóíêå èäåíòè÷íî Excel-îêíó Open (Îòêðûòèå äîêóìåíòà),
çà èñêëþ÷åíèåì çàãîëîâêà îêíà è ñîäåðæèìîãî îêíà ñïèñêà Òèï ôàéëîâ (Files of
type). Ïîñêîëüêó àðãóìåíò filterIndex (ñòðîêà 16) èìååò çíà÷åíèå 2, ôèëüòðîì
ïî óìîë÷àíèþ ÿâëÿåòñÿ ôèëüòð Workbooks (*.xlsx), à íå Templates (*.xlt).

Ðèñ. 8.4. Ïðîöåäóðà


TestGetOpenFilena
me èñïîëüçóåò
ìåòîä
GetOpenFilename
äëÿ îòîáðàæåíèÿ
ýòîãî äèàëîãîâîãî
îêíà

Èìÿ â äèàëîãîâîì îêíå ìîæíî âûáðàòü òî÷íî òàê æå, êàê â Excel-îêíå Open.
Êîãäà âû âûáèðàåòå êíîïêó Open (Îòêðûòü), ìåòîä GetOpenFilename âîçâðàùà-
åò ñòðîêó, ñîäåðæàùóþ èìÿ ôàéëà, áóêâåííóþ ìåòêó äèñêà è ïîëíûé ïóòü êàòà-
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 329

ëîãà (àðãóìåíò multiSelect íå áûë èñïîëüçîâàí, ïîýòîìó ìîæíî âûáðàòü òîëüêî


îäíî èìÿ ôàéëà). Åñëè âû âûáåðèòå Cancel (Îòìåíà), GetOpenfilename âîçâðà-
ùàåò Boolean-çíà÷åíèå False. Ïîñêîëüêó â äàííîì ñëó÷àå fName ÿâëÿåòñÿ ïå-
ðåìåííîé String, VBA àâòîìàòè÷åñêè ïðåîáðàçóåò False â ñòðîêó «False».
Åñëè îïåðàòîðû â ñòðîêàõ 19–23 íå îáíàðóæàò ôàêò îòêàçà îò ââîäà èìåíè
ôàéëà, òî â ñòðîêå 25 âûçûâàåòñÿ ìåòîä Workbooks.Open, îòêðûâàþùèé âû-

Ðèñ. 8.5. Â ìîìåíò


ââîäà íàèìåíîâàíèÿ
íåîáõîäèìîãî ëèñòà
ÿðëû÷êè ëèñòîâ
âèäíû ïîëüçîâàòåëþ

áðàííóþ ïîëüçîâàòåëåì ðàáî÷óþ êíèãó. Â ñòðîêå 27 ñ ïîìîùüþ ôóíêöèè


InputBox ïîëüçîâàòåëü ìîæåò ââåñòè íàèìåíîâàíèå ëèñòà óæå îòêðûòîé ðàáî-
÷åé êíèãè.  ýòî âðåìÿ ÿðëû÷êè ñ èìåíàìè ëèñòîâ áóäóò âèäíû ïîëüçîâàòåëþ
(ðèñ. 8.5).
Çàâåðøàåòñÿ ïðîöåäóðà, êàê îáû÷íî, îïåðàòîðîì MsgBox ñ ñîîáùåíèåì îá
óñïåøíîì âûïîëíåíèè çàäà÷è ïðîöåäóðû.
Íå ñëåäóåò çàáûâàòü, ÷òî GetOpenFilename âîçâðàùàåò ñòðîêó, êîãäà ïîëü-
çîâàòåëü âûáèðàåò èìÿ ôàéëà, è Boolean-çíà÷åíèå False — ïðè îòìåíå äèà-
ëîãîâîãî îêíà. Åñëè âû ïðèñâàèâàåòå ðåçóëüòàò ìåòîäà GetOpenFilename ïå-
ðåìåííîé òèïà Variant, íåîáõîäèìî âûïîëíÿòü òåñòèðîâàíèå äëÿ çíà÷åíèÿ
False, à íå ñòðîêè «False».
Ìåòîä GetOpenFilename âîçâðàùàåò ìàññèâ ñòðîê, åñëè èñïîëüçóåòñÿ çíà-
÷åíèå True äëÿ íåîáÿçàòåëüíîãî àðãóìåíòà multiSelect, äàæå åñëè ïîëüçîâà-
òåëü âûáèðàåò òîëüêî îäèí ôàéë.

Èñïîëüçîâàíèå ìåòîäà GetSaveAsFilename


Âû ìîæåòå èñïîëüçîâàòü Excel-ìåòîä GetSaveAsFilename äëÿ îòîáðàæå-
íèÿ äèàëîãîâîãî îêíà, êîòîðîå âûãëÿäèò è ðàáîòàåò òàê æå, êàê îêíî, îòîáðà-
330 Ãëàâà 8

æàåìîå 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 îòîáðàæàåòñÿ ïåðâûé ðàç.

Ñòðîêè ôèëüòðà ôàéëà äëÿ ìåòîäà GetSaveAsFilename îïðåäåëÿéòå òàêèì


æå îáðàçîì, êàêèì ôîðìàòèðóåòå èõ äëÿ GetOpenFilename.
 ëèñòèíãå 8.6 ïîêàçàí ïðèìåð, èñïîëüçóþùèé ìåòîä GetSaveAsFilename.

Ëèñòèíã 8.6. Èñïîëüçîâàíèå GetSaveAsFilename


äëÿ ïîëó÷åíèÿ èìåíè ôàéëà îò ïîëüçîâàòåëÿ
1: Sub ConvTemplate()
2: 'ñîõðàíÿåò òåêóùóþ êíèãó êàê ôàéë øàáëîíà
3:
4: Const FilterList = "Templates (*.xlt),*.xlt"
5: Const iTitle = "Ïðåîáðàçîâàíèå ðàáî÷åé êíèãè â øàáëîí"
6: Static sN As String
7: Static TCount As Variant
8: Dim iName As String
9:
10: If IsEmpty(TCount) Then
11: TCount = 1
12: Else
13: TCount = TCount + 1
14: End If
15:
16: sN = "Temp" & CStr(TCount) & ".xlt"
17: iName = Application.GetSaveAsFilename(initialfilename:=sN, _
18: filefilter:=FilterList, _
19: Title:=iTitle)
20:
21: If iName = "False" Then
22: MsgBox prompt:="Ïðåîáðàçîâàíèå â øàáëîí îòìåíåíî", _
23: Title:=iTitle
24: Else
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 331

25: ActiveWorkbook.SaveAs Filename:=iName, _


26: FileFormat:=xlTemplate
27: End If
28: End Sub

Ïðîöåäóðà ConvTemplate ñîõðàíÿåò òåêóùóþ ðàáî÷óþ êíèãó êàê


Excel-øàáëîííûé ôàéë è èñïîëüçóåò ìåòîä GetSaveAsFilename äëÿ ïîëó÷å-
íèÿ èìåíè äëÿ íîâîãî øàáëîííîãî ôàéëà. Â ñòðîêå 4 îáúÿâëÿåòñÿ êîíñòàíòà
äëÿ ôèëüòðà ôàéëà; â ñòðîêå 5 — êîíñòàíòà äëÿ çàãîëîâêîâ äèàëîãîâûõ îêîí,
îòîáðàæàåìûõ ýòîé ïðîöåäóðîé.
 ñòðîêàõ 6 è 7 îáúÿâëÿþòñÿ Static-ïåðåìåííûå: sN èñïîëüçóåòñÿ äëÿ
èìåíè íîâîãî øàáëîííîãî ôàéëà, à TCount — äëÿ íóìåðàöèè øàáëîííûõ èìåí
ïî óìîë÷àíèþ. Ïåðåìåííàÿ iName èñïîëüçóåòñÿ äëÿ ñîõðàíåíèÿ âûáèðàåìîãî
ïîëüçîâàòåëåì èìåíè ôàéëà.
 ñòðîêàõ 10–16 óñòàíàâëèâàåòñÿ ñ÷åò÷èê øàáëîííûõ ôàéëîâ è ôîðìèðóåò-
ñÿ ïðåäëàãàåìîå èìÿ øàáëîííîãî ôàéëà. Â ñòðîêàõ 17–19 ñîäåðæèòñÿ îäèí
îïåðàòîð, êîòîðûé âûçûâàåò ìåòîä GetSaveAsFilename è ïðèñâàèâàåò åãî ðå-
çóëüòàò ïåðåìåííîé iName. Ïðè âûçîâå ýòîãî ìåòîäà VBA îòîáðàæàåò äèàëîãî-
âîå îêíî, ïîêàçàííîå íà ðèñ. 8.6. Çàìåòüòå, ÷òî ýòî îêíî òî÷íî òàêîå æå, êàê

Ðèñ. 8.6. Ïðîöåäóðà


ConvTemplate
èñïîëüçóåò ìåòîä
GetSaveAsFilename äëÿ
îòîáðàæåíèÿ ýòîãî
äèàëîãîâîãî îêíà

Excel-îêíî Ñîõðàíåíèå äîêóìåíòà (Save As), çà èñêëþ÷åíèåì çàãîëîâêà äèàëîãî-


âîãî îêíà (ïîñêîëüêó îí ôîðìèðóåòñÿ ïðîöåäóðîé è ÿâëÿåòñÿ àðãóìåíòîì ìå-
òîäà GetSaveAsFilename) è ñîäåðæèìîãî ñïèñêà Òèï ôàéëà (Save as type).
 ñòðîêå 21 ñ ïîìîùüþ îïåðàòîðà If…Then…Else ïðîâåðÿåòñÿ, íå îòìåíèë
ëè ïîëüçîâàòåëü äèàëîãîâîå îêíî ìåòîäà GetSaveAsFilename. Åñëè
ïîëüçîâàòåëü âûáðàë êíîïêó Cancel (Îòìåíà) [èëè íàæàë Esc], òî âûïîëíÿåòñÿ
îïåðàòîð â ñòðîêàõ 22–23, îòîáðàæàÿ îêíî ñîîáùåíèÿ, èíôîðìèðóþùåå
ïîëüçîâàòåëÿ î òîì, ÷òî ïðåîáðàçîâàíèå â øàáëîí áûëî îòìåíåíî. Èíà÷å
îïåðàòîð â ñòðîêàõ 25–26 âûçûâàåò ìåòîä SaveAs, ñîõðàíÿÿ àêòèâíóþ
ðàáî÷óþ êíèãó êàê Excel-øàáëîííûé ôàéë.
Íåîáõîäèìî ïîìíèòü, ÷òî è GetOpenFilename, è GetSaveAsFilename ìî-
ãóò èçìåíÿòü òåêóùèé äèñê è ïàïêó. Ìîæíî èñïîëüçîâàòü ôóíêöèþ CurDir
332 Ãëàâà 8

äëÿ ïîëó÷åíèÿ òåêóùåãî äèñêà è ïàïêè è ñîõðàíÿòü ðåçóëüòàò â ïåðåìåííîé,


÷òîáû ìîæíî áûëî ïåðåêëþ÷àòüñÿ ñíîâà íà òåêóùèé äèñê è ïàïêó ñ ïîìîùüþ
ChDrive è ChDir (îïèñûâàþòñÿ äàëåå â ýòîé ãëàâå).

Èñïîëüçîâàíèå âñòðîåííûõ äèàëîãîâûõ îêîí


Word äëÿ ïîëó÷åíèÿ èìåí ôàéëîâ
Word íå èìååò òåõ æå ñàìûõ ìåòîäîâ GetOpenFilename è GetSaveAsFile-
name, êîòîðûå ïðåäîñòàâëÿåò Excel. Îäíàêî Word ïîçâîëÿåò èñïîëüçîâàòü
VBA äëÿ îòîáðàæåíèÿ ëþáûõ âñòðîåííûõ äèàëîãîâûõ îêîí — ýòî òå æå ñàìûå
äèàëîãîâûå îêíà, êîòîðûå îòîáðàæàþòñÿ, êîãäà Word èñïîëüçóåòñÿ èíòåðàê-
òèâíî. Ìîæíî, ñëåäîâàòåëüíî, ïðèìåíÿòü ñîáñòâåííûå îêíà Word Îòêðûòèå äî-
êóìåíòà è Ñîõðàíåíèå äîêóìåíòà (Save As) â êîäå VBA äëÿ ïîëó÷åíèÿ èìåí ôàé-
ëîâ îò ïîëüçîâàòåëÿ.
Èñïîëüçîâàíèå âñòðîåííûõ äèàëîãîâûõ îêîí Word äëÿ ïîëó÷åíèÿ èìåíè
ôàéëà îò ïîëüçîâàòåëÿ íåìíîãî ñëîæíåå, ÷åì èñïîëüçîâàíèå Excel-ìåòîäîâ
GetOpenFilename è GetSaveAsFilename. Âñòðîåííûå äèàëîãîâûå îêíà Word
äîñòóïíû ïîñðåäñòâîì ñâîéñòâà Dialogs Word-îáúåêòà Application. Ñâîéñò-
âî Dialogs âîçâðàùàåò êîëëåêöèþ âñòðîåííûõ äèàëîãîâûõ îêîí Word. Äëÿ
óêàçàíèÿ íåîáõîäèìîãî äèàëîãîâîãî îêíà èñïîëüçóþòñÿ ðàçëè÷íûå ïðåäîïðå-
äåëåííûå êîíñòàíòû Word (êàæäàÿ èç êîòîðûõ îáîçíà÷àåòñÿ êàê wdDialog
ñ ïîñëåäóþùèì èìåíåì äèàëîãîâîãî îêíà). Ïðåäîïðåäåëåííàÿ Word-êîíñòàíòà
wdDialogFileopen îïðåäåëÿåò Word-äèàëîãîâîå îêíî Îòêðûòèå äîêóìåíòà,
à êîíñòàíòà wdDialogFileSaveAs — äèàëîãîâîå îêíî Ñîõðàíåíèå äîêóìåíòà.
Äëÿ ññûëêè íà îäíî èç âñòðîåííûõ îêîí Word íåîáõîäèìî èñïîëüçîâàòü
ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Object.Dialogs(wdDialogConstant)
Çäåñü Object — îáúåêòíàÿ ññûëêà íà Word-îáúåêò Application, êîòîðàÿ ÿâëÿåòñÿ
îáÿçàòåëüíîé; wdDialogConstant — ëþáàÿ èç ïðåäîïðåäåëåííûõ êîíñòàíò Word,
êîòîðûå îïðåäåëÿþò êîíêðåòíîå âñòðîåííîå äèàëîãîâîå îêíî.

Äëÿ ïðîñìîòðà ñïèñêà êîíñòàíò, ïðåäîïðåäåëåííûõ äëÿ Word, è ðàçäåëîâ


ñïðàâî÷íîé ñèñòåìû äëÿ ýòèõ êîíñòàíò èñïîëüçóéòå îêíî Object Browser. Word
ïðåäîñòàâëÿåò áîëåå ñîòíè êîíñòàíò — ñëèøêîì ìíîãî äëÿ ïîäðîáíîãî îáñóæ-
äåíèÿ â ýòîé êíèãå.
Äëÿ óïðàâëåíèÿ âñòðîåííûìè îêíàìè Word íåîáõîäèìî ñíà÷àëà ñîñëàòüñÿ
íà êîíêðåòíîå äèàëîãîâîå îêíî, êîòîðîå áóäåò èñïîëüçîâàòüñÿ, à çàòåì âûâåñòè
åãî íà ýêðàí ñ ïîìîùüþ ìåòîäà Display îáúåêòà Dialog. Ìåòîä Display îòî-
áðàæàåò äèàëîãîâîå îêíî; êîãäà ïîëüçîâàòåëü çàêðûâàåò äèàëîãîâîå îêíî, ìîæ-
íî íàõîäèòü âûáîð ïîëüçîâàòåëÿ èç ñâîéñòâ îáúåêòà Dialog. Ïðè æåëàíèè ìîæ-
íî òàêæå çàäàâàòü çíà÷åíèÿ ïî óìîë÷àíèþ äëÿ óñòàíîâîê äèàëîãîâîãî îêíà, çà-
äàâàÿ ñâîéñòâà îáúåêòà Dialog ïåðåä îòîáðàæåíèåì ýòîãî îêíà íà ýêðàíå.
Äâà íàèáîëåå âàæíûõ ñâîéñòâà äëÿ äèàëîãîâûõ îêîí, îïðåäåëÿåìûõ êîí-
ñòàíòàìè wdDialogFileOpen è wdDialogFileSaveAs, ÿâëÿþòñÿ òàêæå åäèí-
ñòâåííûìè îáùèìè äëÿ ýòèõ îêîí ñâîéñòâàìè: Name è Format.
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 333

Ñâîéñòâî Name — ýòî ñòðîêà, ñîõðàíÿþùàÿ èìÿ ôàéëà, êîòîðîå ïîëüçîâà-


òåëü âûáðàë â îêíå Îòêðûòèå äîêóìåíòà èëè â îêíå Ñîõðàíåíèå äîêóìåíòà. Ìîæíî
òàêæå ïðåäëàãàòü èìÿ ôàéëà â òåêñòîâîì îêíå Èìÿ ôàéëà (File Name) äèàëîãî-
âûõ îêîí Îòêðûòèå äîêóìåíòà è Ñîõðàíåíèå äîêóìåíòà, ïðèñâàèâàÿ çíà÷åíèå ñâîé-
ñòâó Name ïåðåä îòîáðàæåíèåì ýòèõ äèàëîãîâûõ îêîí. Ñâîéñòâî Format óêàçû-
âàåò, êàêîé òèï äîêóìåíòà îòêðûâàåòñÿ èëè ñîõðàíÿåòñÿ: äîêóìåíò èëè øàá-
ëîí. Ñâîéñòâî Format ìîæåò ñîäåðæàòü çíà÷åíèå îäíîé èç äâóõ Word-êîíñòàíò
òèïà ôàéëà: wdTypeDocument è wdTypeTemplate.
 öåëÿõ ñáîðà èíôîðìàöèè îò ïîëüçîâàòåëÿ äëÿ ïðîöåäóð VBA èñïîëüçóéòå
ìåòîä Display îáúåêòà Dialog. Ìåòîä Display âîçâðàùàåò çíà÷åíèå, óêàçû-
âàþùåå, çàêðûë ëè ïîëüçîâàòåëü äèàëîãîâîå îêíî ùåë÷êîì êíîïêè Îòêðûòü
èëè êíîïêè Îòìåíà.  òàáë. 8.3 ïðèâåäåíû âîçâðàùàåìûå çíà÷åíèÿ ìåòîäà
Display è ïîÿñíÿåòñÿ èõ ñìûë.
Òàáëèöà 8.3. Âîçâðàùàåìûå çíà÷åíèÿ ìåòîäà Display

×èñëîâîå
×òî îçíà÷àåò
çíà÷åíèå
–2 Äèàëîãîâîå îêíî áûëî çàêðûòî ñ ïîìîùüþ êíîïêè Îòìåíà.
Äèàëîãîâîå îêíî áûëî çàêðûòî ùåë÷êîì êíîïêè Îòêðûòü
–1
â äèàëîãîâûõ îêíàõ wdDialogFileOpen è wdDialogFileSaveAs.
0 Äèàëîãîâîå îêíî áûëî îòìåíåíî.
Êîìàíäíàÿ êíîïêà; 1 — äëÿ ïåðâîé êîìàíäíîé êíîïêè, 2 —
>0
äëÿ âòîðîé è òàê äàëåå.

Òåïåðü, êîãäà âû ïîíèìàåòå îñíîâû èñïîëüçîâàíèÿ Word-âñòðîåííûõ äèà-


ëîãîâûõ îêîí Îòêðûòèå äîêóìåíòà è Ñîõðàíåíèå äîêóìåíòà, ìîæíî ðàññìîòðåòü íå-
êîòîðûå êîíêðåòíûå ïðèìåðû ðàáîòû ýòèõ îêîí.

Èñïîëüçîâàíèå Word-äèàëîãîâîãî îêíà Open


 ëèñòèíãå 8.7 ïîêàçàíà ïðîöåäóðà, èñïîëüçóþùàÿ Word-âñòðîåííîå äèàëîãîâîå
îêíî Open (Îòêðûòèå äîêóìåíòà) äëÿ ïîëó÷åíèÿ èìåíè ôàéëà äîêóìåíòà îò ïîëüçî-
âàòåëÿ. Ïðîöåäóðà îòêðûâàåò äîêóìåíò è ïîìåùàåò êóðñîð â êîíåö äîêóìåíòà.

Ëèñòèíã 8.7. Èñïîëüçîâàíèå Word-âñòðîåííîãî äèàëîãîâîãî îêíà


wdDialogFileOpen äëÿ ïîëó÷åíèÿ èìåíè ôàéëà

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

15: If lRetVal <> -1 Then


16: MsgBox prompt:="Îïåðàöèÿ îòìåíåíà", _
17: Title:=iTitle
18: Exit Sub
19: End If
20:
21: Documents.Open FileName:=fName
22: Selection.EndKey unit:=wdStory
23:
24: MsgBox prompt:="Äîêóìåíò '" & fName & _
25: "' îòêðûò", _
26: Title:=iTitle & " çàâåðøåíî"
27: End Sub

Ïðîöåäóðà OpenWordFile èñïîëüçóåò òîëüêî îäíó êîíñòàíòó — iTitle —


â êà÷åñòâå çàãîëîâêîâ äèàëîãîâûõ îêîí, îòîáðàæàåìûõ ýòîé ïðîöåäóðîé (çàãî-
ëîâîê äèàëîãîâîãî îêíà Open èçìåíèòü íåâîçìîæíî). Â ñòðîêàõ 7 è 8 îáúÿâëÿ-
þòñÿ ïåðåìåííûå, èñïîëüçóåìûå ïðîöåäóðîé: fName èñïîëüçóåòñÿ äëÿ ñîõðà-
íåíèÿ èìåíè ôàéëà, ââåäåííîãî ïîëüçîâàòåëåì, à lRetVal — äëÿ ñîõðàíåíèÿ
ðåçóëüòàòà ìåòîäà Display, ÷òîáû ïðîöåäóðà ìîãëà îïðåäåëèòü, îòìåíèë ëè
ïîëüçîâàòåëü äèàëîãîâîå îêíî Word, íå äåëàÿ âûáîðà.

Ðèñ. 8.7.
Word-äèàëîãîâîå îêíî
Open (Îòêðûòèå
äîêóìåíòà),
îòîáðàæàåìîå
îïåðàòîðîì â ñòðîêå 11
ëèñòèíãà 8.7

 ñòðîêå 10 ïðîèçâîäèòñÿ ññûëêà íà äèàëîãîâîå îêíî Open (Îòêðûòèå äîêó-


ìåíòà), à ñòðîêå 11 èñïîëüçóåòñÿ ìåòîä Display îáúåêòà Dialog äëÿ âûâîäà íà
ýêðàí ýòîãî îêíà. Â ðåçóëüòàòå îòîáðàæàåòñÿ äèàëîãîâîå îêíî, ïîêàçàííîå íà
ðèñ. 8.7. Ýòî îêíî èäåíòè÷íî âî âñåõ îòíîøåíèÿõ îêíó, îòîáðàæàåìîìó Word,
êîãäà âûáèðàåòñÿ êîìàíäà Ôàéë | Îòêðûòü (File | Open).
Âûïîëíåíèå ïðîöåäóðû OpenWordFile ïðèîñòàíàâëèâàåòñÿ íà òî âðåìÿ,
ïîêà îòêðûòî äèàëîãîâîå îêíî; ïîñëå çàêðûòèÿ îêíà Îòêðûòèå äîêóìåíòà (ïîëü-
çîâàòåëåì) çíà÷åíèå, âîçâðàùàåìîå ìåòîäîì Display, ñîõðàíÿåòñÿ â lRetVal
è âûïîëíåíèå êîäà âîçîáíîâëÿåòñÿ ñî ñòðîêè 12. Â ýòîò ìîìåíò ñâîéñòâî Name
äèàëîãîâîãî îêíà ñîäåðæèò èìÿ ôàéëà, âûáðàííîå ïîëüçîâàòåëåì (èëè ñòðîêó
íóëåâîé äëèíû, åñëè ïîëüçîâàòåëü íå âûáðàë èìÿ ôàéëà).  ñòðîêå 12 çíà÷å-
íèå ñâîéñòâà Name äèàëîãîâîãî îêíà ñîõðàíÿåòñÿ â fName.
 ñòðîêàõ 15–19 îïåðàòîð If îöåíèâàåò âîçâðàùàåìûé ìåòîäîì Display
ðåçóëüòàò, êîòîðûé áûë ñîõðàíåí â ïåðåìåííîé lRetVal. Çíà÷åíèå –1 óêàçû-
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 335

âàåò, ÷òî äèàëîãîâîå îêíî áûëî çàêðûòî ùåë÷êîì íà êíîïêå Îòêðûòü (èëè ýêâè-
âàëåíòíûì äåéñòâèåì, òàêèì êàê äâîéíîé ùåë÷îê íà èìåíè ôàéëà). Åñëè îêíî
íå áûëî çàêðûòî ùåë÷êîì íà êíîïêå Îòêðûòü èëè åå ýêâèâàëåíòå, òî îòîáðàæà-
åòñÿ ñîîáùåíèå î òîì, ÷òî îïåðàöèÿ áûëà îòìåíåíà, èíà÷å — âûïîëíåíèå êîäà
ïðîäîëæàåòñÿ ñî ñòðîêè 21.
 ñòðîêå 21 âûáðàííûé ôàéë îòêðûâàåòñÿ, à â ñòðîêå 22 êóðñîð ïîìåùàåòñÿ
â êîíåö äîêóìåíòà. Íàêîíåö, â ñòðîêàõ 24–26 îòîáðàæàåòñÿ ñîîáùåíèå îá óñ-
ïåøíîì çàâåðøåíèè îïåðàöèè.

Èñïîëüçîâàíèå Word-äèàëîãîâîãî îêíà Ñîõðàíåíèå äîêóìåíòà


 ëèñòèíãå 8.8 ïîêàçàíà ïðîöåäóðà, èñïîëüçóþùàÿ Word-âñòðîåííîå äèàëî-
ãîâîå îêíî Ñîõðàíåíèå äîêóìåíòà (Save As) äëÿ ïîëó÷åíèÿ èìåíè ôàéëà äîêóìåí-
òà îò ïîëüçîâàòåëÿ, ïðåäëàãàþùåå ôîðìàò øàáëîíà äîêóìåíòà äëÿ ôàéëà, êî-
òîðûé äîëæåí áûòü ñîõðàíåí. Çàòåì ïðîöåäóðà ñîõðàíÿåò äîêóìåíò êàê
.dot-øàáëîí.

Ëèñòèíã 8.8. Èñïîëüçîâàíèå Word-âñòðîåííîãî äèàëîãîâîãî îêíà


wdDialogFileSaveAs äëÿ ïîëó÷åíèÿ èìåíè ôàéëà
1: Sub ConvWordTemplate()
2: 'ñîõðàíÿåò òåêóùèé äîêóìåíò êàê ôàéë øàáëîíà
3:
4: Const iTitle = "Ïðåîáðàçîâàòü äîêóìåíò â øàáëîí"
5: Static sName As String
6: Static TCount As Variant
7:
8: Dim iNameas As String
9: Dim lRetVal As Long
10:
11: If IsEmpty(TCount) Then
12: TCount = 1
13: Else
14: TCount = TCount + 1
15: End If
16:
17: sName = "Temp" & CStr(TCount) & ".dot"
18: With Application.Dialogs(wdDialogFileSaveAs)
19: .Name = sName
20: .Format = wdTypeTemplate
21: lRetVal = .Display
22: iName = .Name
23: End With
24:
25: If lRetVal <> -1 Then
26: MsgBox prompt:="Ïðåîáðàçîâàíèå îòìåíåíî", _
27: Title:=iTitle
28: Else
29: ActiveDocument.SaveAs FileName:=iName, _
30: fileformat:=wdTypeTemplate
31: End If
32: End Sub

Ïðîöåäóðà ConvWordTemplate ñîõðàíÿåò òåêóùèé äîêóìåíò êàê øàáëîí-


íûé Word-ôàéë è èñïîëüçóåò äèàëîãîâîå îêíî Ñîõðàíåíèå äîêóìåíòà äëÿ ïîëó÷å-
íèÿ èìåíè íîâîãî øàáëîííîãî ôàéëà.
336 Ãëàâà 8

 ñòðîêàõ 11–17 óñòàíàâëèâàåòñÿ ñ÷åò÷èê øàáëîííûõ ôàéëîâ è ôîðìèðóåò-


ñÿ ïðåäëàãàåìîå èìÿ ôàéëà.  ñòðîêå 18 íà÷èíàåòñÿ îïåðàòîð With, êîòîðûé
ññûëàåòñÿ íà äèàëîãîâûé îáúåêò Application.Dialogs(wdDialogFileSave-
As), òî åñòü äèàëîãîâîå îêíî, îòîáðàæàåìîå Word, êîãäà âûáèðàåòñÿ êîìàíäà
Ôàéë | Ñîõðàíèòü êàê (File | Save As).
 ñòðîêàõ 19 è 20 óñòàíàâëèâàþòñÿ íåêîòîðûå ïðåäëàãàåìûå óìîë÷àíèÿ
äëÿ îêíà Ñîõðàíåíèå äîêóìåíòà. Â ñòðîêå 19 çàäàåòñÿ ñâîéñòâî Name äèàëîãîâîãî
îêíà, ÷òîáû îíî ñîäåðæàëî ïðåäëàãàåìîå èìÿ ôàéëà øàáëîíà (â sName).
 ñòðîêå 20 óñòàíàâëèâàåòñÿ ñâîéñòâî Format äèàëîãîâîãî îêíà â çíà÷åíèå
wdTypeTemplate, ýòî ïðèâîäèò ê òîìó, ÷òî â äèàëîãîâîì îêíå Ñîõðàíåíèå äîêó-
ìåíòà â ñïèñêå Òèï ôàéëà (Save as type) âûáèðàåòñÿ òèï ôàéëà Øàáëîí äîêóìåíòà
(Document Template) â êà÷åñòâå òèïà ïî óìîë÷àíèþ.
Ïðè âûïîëíåíèè îïåðàòîðà â ñòðîêå 21 VBA îòîáðàæàåò äèàëîãîâîå îêíî,
ïîêàçàííîå íà ðèñ. 8.8. Çàìåòüòå, ÷òî ýòî îêíî òî÷íî òàêîå æå, êàê Word-äèà-

Ðèñ. 8.8.
Word-äèàëîãîâîå
îêíî, îòîáðàæàåìîå
îïåðàòîðîì â ñòðîêå
21 ëèñòèíãà 8.8

ëîãîâîå îêíî Ñîõðàíåíèå äîêóìåíòà. Êàê òîëüêî ïîëüçîâàòåëü äåëàåò âûáîð


â îêíå Ñîõðàíåíèå äîêóìåíòà, âîçâðàùàåìîå çíà÷åíèå ìåòîäà Display ñîõðàíÿ-
åòñÿ â lRetVal è âûïîëíåíèå êîäà ïðîäîëæàåòñÿ ñî ñòðîêè 22, ãäå âûáðàííîå
ïîëüçîâàòåëåì èìÿ ôàéëà (èç ñâîéñòâà Name äèàëîãîâîãî îêíà) ïîìåùàåòñÿ
â ïåðåìåííóþ iName.
 ñòðîêàõ 29–30 äîêóìåíò ñîõðàíÿåòñÿ ñ èñïîëüçîâàíèåì èìåíè ôàéëà
(â iName) è ôîðìàòà ôàéëà (wdTypeTemplate).

Ðàáîòà ñ äèñêàìè è ïàïêàìè


 ýòîì ðàçäåëå ðàññìàòðèâàåòñÿ, êàê èñïîëüçîâàòü ôóíêöèè è îïåðàòîðû
VBA äëÿ íàõîæäåíèÿ òåêóùåãî äèñêà è ïàïêè, êàê èçìåíÿòü òåêóùèé äèñê
èëè ïàïêó è êàê ñîçäàâàòü èëè óäàëÿòü ïîäïàïêè. Ïîìíèòå, òåêóùèé äèñê
(current drive) — ýòî äèñê, êîòîðûé èñïîëüçóåò Word èëè Excel, êîãäà íå óêà-
çûâàåòñÿ îïðåäåëåííàÿ áóêâåííàÿ ìåòêà äèñêà. Àíàëîãè÷íî, òåêóùàÿ ïàïêà
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 337

(current folder) — ýòî ïàïêà äèñêà, êîòîðóþ Excel (èëè Word) èñïîëüçóåò, åñëè
íå óêàçûâàåòñÿ îïðåäåëåííàÿ ïàïêà.

Ïîëó÷åíèå ïóòè òåêóùåé ïàïêè è áóêâåííîé ìåòêè äèñêà


Âûáîðêà òåêóùåãî äèñêà è ïóòè ïàïêè äîâîëüíî ïðîñòà. Îáå ÷àñòè èíôîð-
ìàöèè ìîæíî ïîëó÷èòü, èñïîëüçóÿ ôóíêöèþ CurDir. Ôóíêöèÿ CurDir âîç-
âðàùàåò ñòðîêó, êîòîðàÿ ñîäåðæèò ïîëíûé ïóòü òåêóùåé ïàïêè, âêëþ÷àÿ áóê-
âåííóþ ìåòêó äèñêà. (CurDir ÿâëÿåòñÿ àááðåâèàòóðîé ñëîâ current directory;
ïîìíèòå, ÷òî ïàïêà è êàòàëîã — ýòî îäíî è òî æå.)
Ôóíêöèÿ CurDir èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
CurDir[(drive)]
Çäåñü drive ïðåäñòàâëÿåò ëþáîå âûðàæåíèå òèïà String è óêàçûâàåò ôóíêöèè
CurDir, òåêóùàÿ ïàïêà êàêîãî äèñêà íåîáõîäèìà ïîëüçîâàòåëþ. Åñëè àðãóìåíò
drive îïóùåí, CurDir âîçâðàùàåò òåêóùóþ ïàïêó òåêóùåãî äèñêà. Îáû÷íî drive
ñîäåðæèò òîëüêî îäíó áóêâó; åñëè ïîëüçîâàòåëü ïåðåäàåò ñòðîêó ñ íåñêîëüêèìè
ñèìâîëàìè, CurDir èñïîëüçóåò ïåðâûé ñèìâîë ñòðîêè êàê áóêâåííóþ ìåòêó äèñ-
êà.

 ëèñòèíãå 8.9 ïîêàçàí ïðèìåð èñïîëüçîâàíèÿ ôóíêöèè CurDir.

Ëèñòèíã 8.9. Èñïîëüçîâàíèå ôóíêöèè CurDir äëÿ ïîëó÷åíèÿ òåêóùåãî


êàòàëîãà è äèñêà

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

Íàëè÷èå áîëüøîãî êîëè÷åñòâà êîììåíòàðèåâ è ïðîñòîòà ñèíòàêñèñà ôóíê-


öèè CurDir, âèäèìî, íå òðåáóþò àíàëèçà äàííîãî ëèñòèíãà. Â äîïîëíåíèå
ìîæíî ïðåäëîæèòü îäèí èç âîçìîæíûõ ðåçóëüòàòîâ ðàáîòû ïðîöåäóðû (íà
ðèñ. 8.9).
338 Ãëàâà 8

Èçìåíåíèå òåêóùåé ïàïêè


Ðèñ. 8.9
Òàêèå îêíà
ìîãóò ïîëó÷èòüñÿ â ðåçóëüòàòå
ðàáîòû êîäà
èç ëèñòèíãà 8.9

Åñëè âàì íåîáõîäèìî, ÷òîáû ïðîöåäóðà VBA èçìåíèëà òåêóùóþ ïàïêó íà


êàêóþ-ëèáî äðóãóþ, èñïîëüçóéòå îïåðàòîð ChDir. Åñëè ó âàñ åñòü îïûò ðàáîòû
ñ DOS, âû ïîéìåòå, ÷òî ChDir â VBA âûïîëíÿåò òó æå çàäà÷ó, ÷òî DOS-êîìàí-
äû CHDIR è CD. (ChDir — ýòî àááðåâèàòóðà ñëîâ change directory).
Îïåðàòîð ChDir èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
ChDir path
Àðãóìåíò path ïðåäñòàâëÿåò ëþáîå âûðàæåíèå òèïà String, èìåþùåå ðåçóëüòàòîì
äîïóñòèìûé ïóòü ïàïêè; path ìîæåò (íåîáÿçàòåëüíî) ñîäåðæàòü áóêâåííóþ ìåòêó
äèñêà. Åñëè ïîëüçîâàòåëü âêëþ÷àåò áóêâåííóþ ìåòêó â àðãóìåíò path, ChDir èçìå-
íÿåò òåêóùóþ ïàïêó äèñêà íà óêàçàííóþ â path áåç èçìåíåíèÿ òåêóùåãî äèñêà.

 ëèñòèíãå 8.10 ïîêàçàí ïðèìåð èñïîëüçîâàíèÿ îïåðàòîðà ChDir.

Ëèñòèíã 8.10. Èñïîëüçîâàíèå ChDir


1: Sub Test_ChDir()
2: 'äåìîíñòðèðóåò îïåðàòîð ChDir
3:
4: Dim oldDir As String 'äëÿ òåêóùåãî êàòàëîãà
5:
6: MsgBox "Òåêóùèé êàòàëîã: " & CurDir()
7:
8: 'ñîõðàíèòü òåêóùèé (ñòàðûé) êàòàëîã:
9: oldDir = CurDir()
10:
11: 'èçìåíèòü êàòàëîã:
12: ChDir "\Ìîè äîêóìåíòû"
13:
14: 'âûâåñòè íà ýêðàí íîâûé êàòàëîã:
15: MsgBox "Íîâûé êàòàëîã: " & CurDir()
16:
17: 'âåðíóòüñÿ ê ñòàðîìó êàòàëîãó
18: ChDir oldDir
19: MsgBox "Òåêóùèé êàòàëîã: " & CurDir()
20:
21: End Sub
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 339

Ýòà ïðîöåäóðà, ïî âñåé âèäèìîñòè, òàêæå íå íóæäàåòñÿ â êîììåíòàðèÿõ.

Èçìåíåíèå òåêóùåãî äèñêà


Äëÿ èçìåíåíèÿ òåêóùåãî äèñêà íåîáõîäèìî èñïîëüçîâàòü îïåðàòîð ChDrive.
(ChDrive — ýòî àááðåâèàòóðà ñëîâ change drive.)
Îïåðàòîð ChDrive èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
ChDrive drive
Àðãóìåíò drive — ýòî ëþáîå âûðàæåíèå òèïà String, ïðåäñòàâëÿþùåå áóêâåííóþ
ìåòêó äèñêà. Åñëè drive ñîäåðæèò áîëåå îäíîãî ñèìâîëà, ChDrive èñïîëüçóåò òîëü-
êî ïåðâûé ñèìâîë â ñòðîêå äëÿ áóêâåííîé ìåòêè. Åñëè äëÿ àðãóìåíòà drive çàäàåò-
ñÿ ïóñòàÿ ñòðîêà, òî òåêóùèé äèñê íå èçìåíÿåòñÿ. Åñëè çàäàåòñÿ ñèìâîë, íå ÿâ-
ëÿþùèéñÿ îäíîé èç áóêâ îò À äî Z, VBA îòîáðàæàåò runtime-îøèáêó. VBA îòîáðà-
æàåò òàêæå runtime-îøèáêó, åñëè çàäàåòñÿ áóêâåííàÿ ìåòêà äëÿ äèñêà, êîòîðîãî
ôàêòè÷åñêè íåò â äàííîé êîìïüþòåðíîé ñèñòåìå, õîòÿ âû ìîæåòå èñïîëüçîâàòü áó-
êâåííûå ìåòêè äèñêîâ, ñîåäèíåííûõ ñ âàøèì êîìïüþòåðîì ÷åðåç ñåòü.

 ëèñòèíãå 8.11 äåìîíñòðèðóåòñÿ èñïîëüçîâàíèå îïåðàòîðà ChDrive.

Ëèñòèíã 8.11. Èñïîëüçîâàíèå ChDrive äëÿ èçìåíåíèÿ òåêóùåãî äèñêà


1: Sub Test_ChDrive()
2: Dim oldDir As String
3:
4: 'çàïîìíèòü òåêóùèé (ñòàðûé) êàòàëîã:
5: oldDir = CurDir()
6:
7: 'âûäàòü íà ýêðàí òåêóùèé êàòàëîã:
8: MsgBox "Òåêóùèé êàòàëîã: " & oldDir
9:
10: 'èçìåíèòü äðàéâåð íà A:
11: ChDrive "D"
12:
13: 'âûäàòü íà ýêðàí íîâûé äðàéâåð è êàòàëîã:
14: MsgBox "Íîâûé äðàéâåð è êàòàëîã: " & CurDir
15:
16: 'âîññòàíîâèòü ñòàðûé äðàéâåð (èñïîëüçóåòñÿ
17: 'òîëüêî ïåðâûé ñèìâîë ñòðîêè, ñîäåðæàùèé äðàéâåð):
18: ChDrive oldDir
19:
20: 'âîññòàíîâèòü ñòàðûé êàòàëîã:
21: ChDir oldDir
22:
23: MsgBox "Òåêóùèé êàòàëîã: " & CurDir()
24: End Sub

Ñîçäàíèå äèñêîâûõ ïàïîê


Âàì ìîæåò ïîíàäîáèòüñÿ, ÷òîáû îäíà èç ïðîöåäóð ñîçäàâàëà íîâóþ äèñêî-
âóþ ïîäïàïêó äëÿ ñîõðàíåíèÿ â íåé íîâûõ ôàéëîâ ðàáî÷åé êíèãè èëè äîêó-
ìåíòà èëè ïî êàêèì-ëèáî äðóãèì ïðè÷èíàì. Äëÿ ñîçäàíèÿ äèñêîâîé ïàïêè èñ-
ïîëüçóéòå îïåðàòîð MkDir. Îïåðàòîð MkDir âûïîëíÿåò òó æå çàäà÷ó, ÷òî
340 Ãëàâà 8

DOS-êîìàíäû MKDIR èëè MD èëè êîìàíäà WINDOWS File | New | Folder (Ôàéë |
Ñîçäàòü | Ïàïêà). (MkDir — ýòî àááðåâèàòóðà ñëîâ make directory.)
Îïåðàòîð MkDir èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
MkDir path
Àðãóìåíò path ïðåäñòàâëÿåò ëþáîå âûðàæåíèå òèïà String, êîòîðîå èìååò ðåçóëü-
òàòîì äîïóñòèìûé ïóòü ïàïêè; path ìîæåò (íåîáÿçàòåëüíî) ñîäåðæàòü áóêâåííóþ
ìåòêó äèñêà. Åñëè áóêâåííàÿ ìåòêà äèñêà íå âêëþ÷åíà â àðãóìåíò path, MkDir ñîç-
äàåò íîâóþ ïàïêó íà òåêóùåì äèñêå. Åñëè path óêàçûâàåò èìåþùóþñÿ óæå ïàïêó
èëè âêëþ÷àåò íåäîïóñòèìûå ñèìâîëû èìåíè ôàéëà, VBA îòîáðàæàåò ñîîáùåíèå
î runtime-îøèáêå. Ïðè ïîïûòêå ñîçäàòü ïîäïàïêó â ïàïêå, êîòîðîé íå ñóùåñòâóåò,
VBA òàêæå îòîáðàæàåò ñîîáùåíèå î runtime-îøèáêå. Èñïîëüçîâàíèå MkDir íå èçìå-
íÿåò òåêóùåãî äèñêà èëè ïàïêè.

 ëèñòèíãå 8.12 ïîêàçàí ïðèìåð èñïîëüçîâàíèÿ îïåðàòîðà MkDir, íå òðå-


áóþùèé íèêàêîãî àíàëèçà.

Ëèñòèíã 8.12. Èñïîëüçîâàíèå MkDir äëÿ ñîçäàíèÿ íîâîãî äèñêîâîãî êàòàëîãà


1: Sub Test_MkDir()
2: 'äåìîíñòðèðóåò îïåðàòîð MkDir
3:
4: Dim newDir As String
5:
6: 'íîâûé (áóäóùèé) êàòàëîã:
7: newDir = "A:\test1"
8:
9: 'ñîçäàòü íîâûé êàòàëîã:
10: MkDir newDir
11:
12: 'ïåðåéòè ê íîâîìó (òîëüêî ÷òî ñîçäàííîìó) êàòàëîãó:
13: ChDir newDir
14:
15: 'ïðîâåðèòü ðåçóëüòàò ïåðåõîäà ê íîâîìó êàòàëîãó:

16: MsgBox "Òåêóùèé êàòàëîã äðàéâåðà À: " & _


17: CurDir("A")
18: End Sub

Ïåðåä çàïóñêîì ýòîé ïðîöåäóðû óáåäèòåñü, ÷òî â äèñêîâîäå À: èìååòñÿ


äèñê, èíà÷å VBA îòîáðàçèò ñîîáùåíèå î runtime-îøèáêå.

Óäàëåíèå äèñêîâûõ ïàïîê


Âàì ìîæåò ïîíàäîáèòüñÿ òàêæå, ÷òîáû îäíà èç ïðîöåäóð óäàëÿëà äèñêîâóþ
ïàïêó. Äëÿ óäàëåíèÿ äèñêîâîé ïàïêè èñïîëüçóéòå îïåðàòîð RmDir. Îïåðàòîð
RmDir âûïîëíÿåò òó æå çàäà÷ó, ÷òî è DOS-êîìàíäû RMDIR èëè RD; â Win-
dows èñïîëüçóåòñÿ êîìàíäà File | Delete (Ôàéë | Óäàëèòü) äëÿ óäàëåíèÿ êàê ôàé-
ëîâ, òàê è ïàïîê. (RmDir — ýòî àááðåâèàòóðà ñëîâ remove directory.)
Îïåðàòîð RmDir èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
RmDir path
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 341

Àðãóìåíò path ïðåäñòàâëÿåò ëþáîå âûðàæåíèå String, èìåþùåå ðåçóëüòàòîì äî-


ïóñòèìûé ïóòü ïàïêè; path ìîæåò (íåîáÿçàòåëüíî) ñîäåðæàòü áóêâåííóþ ìåòêó
äèñêà. Åñëè áóêâåííàÿ ìåòêà íå âêëþ÷åíà â àðãóìåíò path, RmDir óäàëÿåò ïàïêó
íà òåêóùåì äèñêå. Åñëè path îïðåäåëÿåò ïàïêó, êîòîðàÿ åùå íå ñóùåñòâóåò, èëè
âêëþ÷àåò íåäîïóñòèìûå ñèìâîëû èìåíè ôàéëà, òî VBA îòîáðàæàåò ñîîáùåíèå
î runtime-îøèáêå.

 ëèñòèíãå 8.13 ïîêàçàí ïðîñòîé ïðèìåð èñïîëüçîâàíèÿ îïåðàòîðà RmDir.

Ëèñòèíã 8.13. Èñïîëüçîâàíèå RmDir äëÿ óäàëåíèÿ ïàïêè


1: Sub Test_RmDir()
2: 'äåìîíñòðèðóåò îïåðàòîð RmDir
3:
4: Dim delDir As String
5:
6: 'èìÿ óäàëÿåìîé ïàïêè:
7: delDir = "A:\test1"
8:
9: 'åñëè óäàëÿåìàÿ ïàïêà - òåêóùàÿ, ïåðåéòè
10: 'â êîðíåâóþ; ÍÅËÜÇß ÓÄÀËßÒÜ ÒÅÊÓÙÓÞ ÏÀÏÊÓ
11: If CurDir("A") = delDir Then ChDir "A:\"
12:
13: 'óäàëèòü ïàïêó A:\test1
14: RmDir delDir
15:
16: End Sub

Ïðåäïîëàãàåòñÿ, ÷òî áûëà âûïîëíåíà ïðîöåäóðà â ëèñòèíãå 8.12 äëÿ ñîçäà-


íèÿ ïàïêè Test1 äëÿ äèñêà À:. Åñëè òåêóùàÿ ïàïêà äèñêà À: ÿâëÿåòñÿ òîé æå
ïàïêîé, êîòîðàÿ äîëæíà áûòü óäàëåíà, òî â ñòðîêå 11 âûçûâàåòñÿ ôóíêöèÿ
ChDir äëÿ èçìåíåíèÿ òåêóùåé ïàïêè äèñêà À: íà êîðíåâóþ ïàïêó. Íåëüçÿ
óäàëÿòü äèñêîâóþ ïàïêó, åñëè îíà ÿâëÿåòñÿ òåêóùåé èëè íåïóñòîé.

Êîïèðîâàíèå è óäàëåíèå ôàéëîâ


Êîïèðîâàíèå è óäàëåíèå ôàéëîâ — ýòî, âåðîÿòíî, äâå íàèáîëåå ÷àñòî âû-
ïîëíÿåìûå îïåðàöèè ïî óïðàâëåíèþ ôàéëàìè. Â ýòîì ðàçäåëå îïèñûâàåòñÿ,
êàê ìîæíî êîïèðîâàòü èëè óäàëÿòü ôàéëû ïîä êîíòðîëåì ïðîöåäóð VBA.
Êîïèðîâàíèå ôàéëîâ
Äëÿ êîïèðîâàíèÿ ôàéëà èñïîëüçóéòå îïåðàòîð FileCopy. Ýòîò îïåðàòîð
VBA ýêâèâàëåíòåí DOS-êîìàíäå COPY èëè êîìàíäå File | Copy (Ôàéë | Êîïèðî-
âàòü) â Windows.
Îïåðàòîð FileCopy èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
FileCopy source, destination
Êàê source, òàê è destination ÿâëÿþòñÿ âûðàæåíèÿìè òèïà String, èìåþùèå
ðåçóëüòàòîì äîïóñòèìûå èìåíà ôàéëà. Îíè ìîãóò (íåîáÿçàòåëüíî) âêëþ÷àòü
ïîëíûé ïóòü ïàïêè è áóêâåííóþ ìåòêó äèñêà. Ïðè ïîïûòêå êîïèðîâàòü ôàéë
â ñàìîãî ñåáÿ VBA âûäàåò runtime-îøèáêó. VBA òàêæå âûäàåò runtime-îøèáêó
342 Ãëàâà 8

ïðè ïîïûòêå êîïèðîâàòü ôàéë, êîãäà íåò äîñòàòî÷íîãî äèñêîâîãî ïðîñòðàíñòâà äëÿ
ñîõðàíåíèÿ êîïèðóåìîãî ôàéëà.

 ëèñòèíãå 8.14 èñïîëüçóåòñÿ îïåðàòîð FileCopy. Ïðîöåäóðó ñëåäóåò òåñ-


òèðîâàòü â Excel, òàê êàê îíà èñïîëüçóåò ìåòîäû GetOpenFilename è GetSa-
veAsFilename.

Ëèñòèíã 8.14. Ïðîöåäóðà, èñïîëüçóþùàÿ îïåðàòîð FileCopy


1: Sub Test_CopyFiles()
2: 'êîïèðóåò ôàéë, óêàçàííûé ïîëüçîâàòåëåì, â ôàéë
3: 'ñ íîâûì èìåíåì, äðàéâåðîì èëè êàòàëîãîì
4:
5: Dim sName As String
6: Dim dName As String
7:
8: Do
9: With Application
10: sName = .GetOpenFilename(Title:= _
11: "File Copy - Source")
12:
13: If sName = "False" Then Exit Sub
14:
15: dName = .GetSaveAsFilename(Title:= _
16: "File Copy - Destination")
17:
18: If dName = "False" Then Exit Sub
19:
20: End With
21:
22: FileCopy Source:=sName, Destination:=dName
23:
24: Loop
25:
26: End Sub

Ýòà ïðîöåäóðà äàåò âîçìîæíîñòü ïîëüçîâàòåëþ âûáèðàòü ôàéë-èñòî÷íèê,


äèñê, ïàïêó è èìÿ ôàéëà-ïðèåìíèêà, â êîòîðûé áóäåò îñóùåñòâëÿòüñÿ êîïèðî-
âàíèå (èíîãäà òàêîé ôàéë íàçûâàþò öåëåâûì). Â ñòðîêàõ 5 è 6 îáúÿâëÿþòñÿ
äâå ïåðåìåííûå òèïà String äëÿ èìåí èñõîäíîãî è öåëåâîãî ôàéëîâ. Â ñòðîêå
8 íà÷èíàåòñÿ áåñêîíå÷íûé öèêë Do (öèêë áåç äåòåðìèíàíòíîãî óñëîâèÿ). Öèêë
â ñòðîêàõ 8–24 âûïîëíÿåòñÿ äî òåõ ïîð, ïîêà ïîëüçîâàòåëü íå îòìåíèò îäíî èç
äâóõ ôàéëîâûõ äèàëîãîâûõ îêîí.  ñòðîêå 9 íà÷èíàåòñÿ îïåðàòîð With.
 ñòðîêàõ 10–11 ñîäåðæèòñÿ îäèí îïåðàòîð, âûçûâàþùèé ìåòîä GetOpen-
Filename äëÿ îòîáðàæåíèÿ äèàëîãîâîãî îêíà îòêðûòèÿ ôàéëà è ïðèñâàèâàþ-
ùèé èìÿ ôàéëà (ðåçóëüòàò ìåòîäà) ïåðåìåííîé sName.
 ñòðîêå 13 îïåðàòîð ïðîâåðÿåò, îòìåíèë ëè ïîëüçîâàòåëü äèàëîãîâîå îêíî
îòêðûòèÿ ôàéëà. Åñëè — äà, ïðîöåäóðà çàêàí÷èâàåòñÿ. Èíà÷å VBA âûïîëíÿåò
îïåðàòîð â ñòðîêàõ 15 è 16, êîòîðûé èñïîëüçóåò ìåòîä GetSaveAsFilename,
÷òîáû äàòü âîçìîæíîñòü ïîëüçîâàòåëþ âûáðàòü èìÿ ôàéëà, äèñê è ïàïêó äëÿ
êîïèðóåìîãî ôàéëà. Â ñòðîêå 18 ïðîâåðÿåòñÿ, îòìåíèë ëè ïîëüçîâàòåëü äèàëî-
ãîâîå îêíî îòêðûòèÿ ôàéëà. Åñëè — äà, âûïîëíåíèå ïðîöåäóðû ïðåêðàùàåò-
ñÿ. Èíà÷å VBA ïðîäîëæàåò âûïîëíÿòü êîä ñ îïåðàòîðà FileCopy â ñòðîêå 22.
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 343

Êîãäà VBA âûïîëíÿåò îïåðàòîð FileCopy â ñòðîêå 22, ôàéë (èìÿ êîòîðîãî
ñîõðàíåíî â sName) êîïèðóåòñÿ ñ íîâûì èìåíåì íà íîâûé äèñê è â íîâóþ ïàï-
êó, ñîõðàíåííûå â dName. Ïîñëå êîïèðîâàíèÿ ôàéëà öèêë Do ïîâòîðÿåòñÿ.

Óäàëåíèå ôàéëà
Äëÿ óäàëåíèÿ ôàéëà èñïîëüçóéòå îïåðàòîð ñ äðàìàòè÷åñêèì èìåíåì Kill.
Îïåðàòîð Kill âûïîëíÿåò òó æå çàäà÷ó, ÷òî DOS-êîìàíäà DEL èëè êîìàíäà
File | Delete (Ôàéë | Óäàëèòü) â Windows.
Îïåðàòîð Kill èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Kill pathname
Àðãóìåíò pathname — ýòî ëþáîå âûðàæåíèå òèïà String, èìåþùåå ðåçóëüòàòîì
äîïóñòèìóþ ñïåöèôèêàöèþ èìåíè ôàéëà; pathname ìîæåò âêëþ÷àòü áóêâåííóþ
ìåòêó äèñêà, ïîëíûé ïóòü ïàïêè è ñèìâîëû óíèâåðñàëüíîãî ñîïîñòàâëåíèÿ (* è ?).
Åñëè pathname âêëþ÷àåò ñèìâîëû óíèâåðñàëüíîãî ñîïîñòàâëåíèÿ, Kill óäàëÿåò
âñå ôàéëû, ñîâïàäàþùèå ñî ñïåöèôèêàöèåé â pathname.

 ëèñòèíãå 8.15 ïîêàçàí ïðèìåð îïåðàòîðà Kill.

Ëèñòèíã 8.15. Èñïîëüçîâàíèå Kill äëÿ óäàëåíèÿ ôàéëîâ


1: Sub Test_KillFiles()
2: 'óäàëÿåò ôàéëû, ïîêà ïîëüçîâàòåëü íå îòìåíèò äèàëîã
3:
4: Dim fName As String
5: Dim Ans As Integer
6:
7: Do
8:
9: fName = Application.GetOpenFilename(Title:= _
10: "Delete File")
11:
12: If fName = "False" Then Exit Sub
13:
14: Ans = MsgBox(prompt:="Delete " & fName & "?", _
15: Title:="Delete File", _
16: Buttons:=vbQuestion + vbYesNo)
17:
18: If Ans = vbYes Then
19: Kill fName
20: End If
21:
22: Loop
23: End Sub

Ýòà ïðîöåäóðà èñïîëüçóåò ìåòîä GetOpenFilename, äàþùèé âîçìîæíîñòü


ïîëüçîâàòåëþ âûáðàòü èìÿ ôàéëà, ïîäòâåðæäàåò óäàëåíèå, óäàëÿåò ôàéë. Ýòè
äåéñòâèÿ ïîâòîðÿþòñÿ â öèêëå.
 ñòðîêå 7 íà÷èíàåòñÿ áåñêîíå÷íûé öèêë Do, êîòîðûé âûïîëíÿåòñÿ äî òåõ
ïîð, ïîêà ïîëüçîâàòåëü íå îòìåíèò ôàéëîâîå äèàëîãîâîå îêíî. Â ñòðîêå 9 âû-
çûâàåòñÿ ìåòîä GetOpenFilename è åãî ðåçóëüòàò ïðèñâàèâàåòñÿ ïåðåìåííîé
fName. Â ñòðîêå 12 ïðîâåðÿåòñÿ, îòìåíèë ëè ïîëüçîâàòåëü ôàéëîâîå äèàëîãî-
344 Ãëàâà 8

âîå îêíî, è ïðîöåäóðà çàâåðøàåòñÿ, åñëè ïîëüçîâàòåëü åãî îòìåíèë. Â ñòðîêàõ


14–16 ñîäåðæèòñÿ îïåðàòîð MsgBox, çàïðàøèâàþùèé ïîëüçîâàòåëÿ ïîäòâåð-
äèòü óäàëåíèå âûáðàííîãî ôàéëà. Åñëè ïîëüçîâàòåëü ïîäòâåðæäàåò óäàëåíèå,
VBA âûïîëíÿåò îïåðàòîð Kill (â ñòðîêå 19), êîòîðûé óäàëÿåò ôàéë.
Íå ñëåäóåò ïûòàòüñÿ óäàëèòü ôàéë îòêðûòîé ðàáî÷åé êíèãè èëè äîêóìåíòà,
â òàêîì ñëó÷àå VBA âûäàåò runtime-îøèáêó. Ïðîâåðÿéòå àòðèáóòû ôàéëà ïå-
ðåä ïîïûòêîé óäàëèòü åãî. Ïðè ïîïûòêå óäàëèòü ôàéë, èìåþùèé êàêîé-ëèáî
èç àòðèáóòîâ Hidden, System èëè Read-Only VBA âûäàåò runtime-îøèáêó.
Èñïîëüçóéòå ôóíêöèþ GetAttr äëÿ âûáîðêè àòðèáóòîâ ôàéëà è îïåðàòîð
SetAttr — äëÿ èõ èçìåíåíèÿ ïðè íåîáõîäèìîñòè óäàëÿòü ôàéëû ñ àòðèáóòàìè
Hidden, System èëè Read-Only.

Ïåðåèìåíîâàíèå èëè ïåðåìåùåíèå ôàéëîâ


Âàì ìîæåò ïîíàäîáèòüñÿ èçìåíèòü èìÿ ôàéëà èëè ïåðåìåñòèòü ôàéë â äðó-
ãóþ ïàïêó íà òîì æå äèñêå. Äëÿ ïåðåèìåíîâàíèÿ ôàéëà èëè ïåðåìåùåíèÿ åãî
â äðóãóþ ïàïêó èñïîëüçóéòå îïåðàòîð Name.
Îïåðàòîð Name èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Name oldpathname As newpathame
Àðãóìåíòû oldpathname è newpathname — ýòî âûðàæåíèÿ òèïà String, èìåþùèå
ðåçóëüòàòîì äîïóñòèìûå èìåíà ôàéëîâ. Îáà ìîãóò (íåîáÿçàòåëüíî) ñîäåðæàòü ïîë-
íûé ïóòü ïàïêè, âêëþ÷àÿ áóêâåííóþ ìåòêó äèñêà. Åñëè ïîëüçîâàòåëü âêëþ÷àåò
áóêâåííóþ ìåòêó, îáà âûðàæåíèÿ oldpathname è newpathname äîëæíû âêëþ÷àòü
îäíó è òó æå áóêâåííóþ ìåòêó äèñêà, èíà÷å VBA âûäàåò runtime-îøèáêó. Åñëè
oldpathname è newpathname ññûëàþòñÿ íà ðàçíûå ïàïêè, VBA ïåðåìåùàåò ôàéë
â íîâóþ ïàïêó è èçìåíÿåò åãî èìÿ.

 ëèñòèíãå 8.16 ïîêàçàíà ïðîöåäóðà, èñïîëüçóþùàÿ îïåðàòîð Name äëÿ ïå-


ðåèìåíîâàíèÿ ôàéëîâ.

Ëèñòèíã 8.16. Èñïîëüçîâàíèå Name äëÿ ïåðåèìåíîâàíèÿ èëè ïåðåìåùåíèÿ ôàéëîâ


1: Sub Test_RenameOrMoveFile()
2: 'ïåðåèìåíîâûâàåò èëè ïåðåìåùàåò ôàéë
3:
4: Const iTitle = "Ïåðåèìåíîâàòü èëè óäàëèòü - "
5: Dim oldName As String
6: Dim newName As String
7: Dim oldDir As String
8:
9: oldDir = CurDir()
10: With Application
11: oldName = .GetOpenFilename(Title:=iTitle & "Èñòî÷íèê")
12: If oldName = "False" Then Exit Sub
13:
14: newName = .GetSaveAsFilename(InitialFilename:=oldName, _
15: Title:=iTitle & "Íîâîå èìÿ")
16: If newName = "False" Then Exit Sub
17: End With
18:
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 345

19: If Left(oldName, 1) = Left(newName, 1) Then


20: Name oldName As newName
21: Else
22: FileCopy oldName, newName
23: Kill oldName
24: End If
25:
26: ChDrive oldDir
27: ChDir oldDir
28: End Sub

Ýòà ïðîöåäóðà ïåðåèìåíîâûâàåò èëè ïåðåìåùàåò ôàéëû. Ïîëüçîâàòåëü ïðî-


öåäóðû âûáèðàåò èìÿ ôàéëà, ïàïêó è äèñê äëÿ îðèãèíàëüíîãî ôàéëà è äëÿ íî-
âîãî èìåíè è/èëè ìåñòîïîëîæåíèÿ.
 ñòðîêå 9 âûçûâàåòñÿ ôóíêöèÿ CurDir, ðåçóëüòàò êîòîðîé ñîõðàíÿåòñÿ â ïå-
ðåìåííîé oldDir.  ñòðîêå 10 íà÷èíàåòñÿ îïåðàòîð With äëÿ îáúåêòà Appli-
cation. Â ñòðîêå 11 èñïîëüçóåòñÿ ìåòîä GetOpenFilename äëÿ òîãî, ÷òîáû ïîëü-
çîâàòåëü ìîã âûáðàòü ôàéë, êîòîðûé áóäåò ïåðåèìåíîâàí èëè ïåðåìåùåí. Â ñòðî-
êå 12 èñïîëüçóåòñÿ îïåðàòîð If äëÿ ïðîâåðêè òîãî, îòìåíèë ëè ïîëüçîâàòåëü
äèàëîãîâîå îêíî GetOpenFilename; åñëè — äà, òî ïðîöåäóðà ïðåêðàùàåòñÿ.
 ñòðîêå 14 âûçûâàåòñÿ ìåòîä GetSaveAsFilename äëÿ òîãî, ÷òîáû ïîëüçî-
âàòåëü ìîã âûáðàòü íîâîå èìÿ ôàéëà, äèñê è ïàïêó. Çàìåòüòå, ÷òî ýòîò âûçîâ
GetSaveasFilename èñïîëüçóåò àðãóìåíò InitialFilename äëÿ çàïîëíåíèÿ
ïðåäëàãàåìîãî íîâîãî èìåíè ôàéëà. Â ñòðîêå 16 ïðîâåðÿåòñÿ, îòìåíèë ëè ïîëü-
çîâàòåëü ýòî äèàëîãîâîå îêíî, è, åñëè — îòìåíèë, ïðîöåäóðà çàêàí÷èâàåòñÿ.
 ñòðîêå 19 íà÷èíàåòñÿ îïåðàòîð If…Then…Else, êîòîðûé ïðîâåðÿåò, âû-
áðàë ëè ïîëüçîâàòåëü äðóãîé äèñê äëÿ ïåðåìåùåíèÿ íà íåãî ôàéëà. Ëîãè÷å-
ñêîå âûðàæåíèå äëÿ îïåðàòîðà If â ñòðîêå 19 èñïîëüçóåò ôóíêöèþ Left äëÿ
âîçâðàùåíèÿ ïåðâîé áóêâû ñòðîê oldName è newName. Åñëè ýòè äâå áóêâû
îäèíàêîâûå, òî ïîëüçîâàòåëü ïåðåèìåíîâûâàåò èëè ïåðåìåùàåò ôàéë íà òîì
æå ñàìîì äèñêå è VBA âûïîëíÿåò îïåðàòîð Name â ñòðîêå 20 äëÿ ïåðåèìåíîâà-
íèÿ ôàéëà. Åñëè ïóòè ïàïîê â oldName è newName ðàçëè÷íû, Name ïåðåìåùà-
åò ôàéë â íîâóþ ïàïêó.
Åñëè ïåðâûå áóêâû oldName è newName ðàçëè÷íûå, òî ïîëüçîâàòåëü âû-
áðàë ïåðåìåùåíèå ôàéëà íà äðóãîé äèñê. Íåëüçÿ èñïîëüçîâàòü Name äëÿ ïåðå-
ìåùåíèÿ ôàéëîâ íà äðóãîé äèñê, ïîýòîìó ïðîöåäóðà èñïîëüçóåò FileCopy äëÿ
êîïèðîâàíèÿ ôàéëà íà äðóãîé äèñê è çàòåì èñïîëüçóåò Kill äëÿ óäàëåíèÿ îðè-
ãèíàëüíîãî ôàéëà.
Íàêîíåö, îïåðàòîðû ChDrive è ChDir âîññòàíàâëèâàþò îðèãèíàëüíûé äèñê
è ïàïêó, êîòîðûå áûëè òåêóùèìè ïðè çàïóñêå ïðîöåäóðû. (Ïîìíèòå, ìåòîäû
GetOpenFilename GetSaveAsFilename ìîãóò èçìåíèòü òåêóùèé äèñê è ïàïêó.)

Ïîëó÷åíèå èíôîðìàöèè î ôàéëàõ


Èíîãäà áûâàåò âàæíî çíàòü ðàçìåð ôàéëà èëè äàòó è âðåìÿ, êîãäà ôàéë áûë
ìîäèôèöèðîâàí ïîñëåäíèé ðàç. Íàïðèìåð, èìåÿ ïðîöåäóðó, ðåçåðâèðóþùóþ
ôàéëû ðàáî÷åé êíèãè, ìîæíî íàïèñàòü åå òàê, ÷òîáû îíà ïðîâåðÿëà, íå çàìå-
íÿåò ëè îíà ôàéë áîëåå ñòàðîé âåðñèåé.
346 Ãëàâà 8

Ïîëó÷åíèå âðåìåíè è äàòû ñîçäàíèÿ/ìîäèôèêàöèè ôàéëà


Âñÿêèé ðàç, êîãäà îäíà èç ïðîãðàìì ïðèëîæåíèÿ, òàêàÿ êàê Word èëè
Excel, èçìåíÿåò äèñêîâûé ôàéë, ôàéëîâàÿ ñèñòåìà Windows çàïèñûâàåò äàòó
è âðåìÿ (â ñîîòâåòñòâèè ñ ÷àñàìè äàííîé êîìïüþòåðíîé ñèñòåìû) ñ ôàéëîì,
÷òîáû ìîæíî áûëî îïðåäåëèòü, êîãäà ýòîò ôàéë áûë ìîäèôèöèðîâàí ïîñëåä-
íèé ðàç. ×òîáû ñäåëàòü ýòó èíôîðìàöèþ äîñòóïíîé â ïðîöåäóðàõ VBA, èñ-
ïîëüçóéòå ôóíêöèþ FileDateTime. Ýòà ôóíêöèÿ âîçâðàùàåò èíôîðìàöèþ
î äàòå è âðåìåíè èç ôàéëà êàê VBA-çíà÷åíèå òèïà Date.
Ôóíêöèÿ FileDateTime èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
FiledateTime(pathname)
Àðãóìåíò pathname — ýòî ëþáîå âûðàæåíèå òèïà String, èìåþùåå ðåçóëüòàòîì
äîïóñòèìóþ ñïåöèôèêàöèþ ôàéëà; pathname ìîæåò íåîáÿçàòåëüíî âêëþ÷àòü áóê-
âåííóþ ìåòêó äèñêà è ïîëíûé ïóòü ïàïêè, íî íå ìîæåò ñîäåðæàòü ñèìâîëû óíè-
âåðñàëüíîãî ñîïîñòàâëåíèÿ (* èëè ?).

 ëèñòèíãå 8.17 â ñëåäóþùåì ðàçäåëå ïîêàçàí ïðèìåð, èñïîëüçóþùèé


ôóíêöèþ FileDateTime.

Ïîëó÷åíèå äëèíû ôàéëà


Äëÿ òîãî ÷òîáû îïðåäåëèòü äëèíó ôàéëà, èñïîëüçóéòå ôóíêöèþ FileLen.
FileLen âîçâðàùàåò äëèíó ôàéëà â áàéòàõ.
Ôóíêöèÿ FileLen èìååò ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
FileLen(pathname)
Àðãóìåíò pathname — ýòî âûðàæåíèå òèïà String, èìåþùåå ðåçóëüòàòîì äîïóñ-
òèìóþ ñïåöèôèêàöèþ èìåíè ôàéëà; pathname ìîæåò (íåîáÿçàòåëüíî) âêëþ÷àòü
áóêâåííóþ ìåòêó äèñêà è ïîëíûé ïóòü ïàïêè, íî íå ìîæåò âêëþ÷àòü ñèìâîëû óíè-
âåðñàëüíîãî ñîïîñòàâëåíèÿ. Åñëè pathname îïðåäåëÿåò îòêðûòûé ôàéë, FileLen
âîçâðàùàåò ðàçìåð ôàéëà, êàêèì îí áûë, êîãäà ôàéë áûë ñîõðàíåí íà äèñêå ïî-
ñëåäíèé ðàç.

 ëèñòèíãå 8.17 ïîêàçàí ïðèìåð, èñïîëüçóþùèé ôóíêöèþ FileLen, à íà


ðèñ. 8.10 — îäèí èç âîçìîæíûõ ðåçóëüòàòîâ ðàáîòû êîäà ýòîãî ëèñòèíãà.

Ëèñòèíã 8.17. Èñïîëüçîâàíèå ôóíêöèé FileDateTime è FileLen


1: Sub ShowFDS(sName As String)
2: 'îòîáðàæàåò ðàçìåð è äàòó ïîñëåäíåé ìîäèôèêàöèè ôàéëà
3:
4: Dim msg1 As String
5: Dim msg2 As String
6: Dim fDate As Date
7: Dim fLen As Long
8:
9: fDate = FileDateTime(sName)
10: fLen = FileLen(sName)
11: msg1 = "Ðàçìåð: " & Format(fLen, "###,###,###") & _
12: "áàéò."
Óïðàâëåíèå ôàéëàìè ñ ïîìîùüþ VBA 347

13: msg2 = "Ïîñëåäíÿÿ ìîäèôèêàöèÿ: " & _


14: Format(fDate, "long date") & _
15: " â " & Format(fDate, "long time")
16: MsgBox Title:="Äàòà è ðàçìåð ôàéëà", _
17: prompt:=sName & Chr(13) & _
18: msg1 & Chr(13) & msg2
19: End Sub
20:
21: Sub Test_ShowFDS()
22: Dim sName As String
23:
24: Do
25: With Application
26: sName = .GetOpenFilename(Title:="Äàòà/Ðàçìåð ôàéëà")
27: End With
28: If sName <> "False" Then ShowFDS sName
29: Loop Until sName = "False"
30: End Sub

Ïðîöåäóðà ShowFDS èñïîëüçóåò ôóíêöèè FileLen è FileDateTime äëÿ


îòîáðàæåíèÿ îêíà ñîîáùåíèÿ, ïîêàçûâàþùåãî òåêóùèé ðàçìåð ôàéëà è äàòó
è âðåìÿ, êîãäà ýòîò ôàéë ìîäèôèöèðîâàëñÿ ïîñëåäíèé ðàç. ShowFDS èìååò
åäèíñòâåííûé àðãóìåíò fName òèïà String, èñïîëüçóåìûé äëÿ óêàçàíèÿ ïðî-
öåäóðå ShowFDS, èíôîðìàöèÿ î êàêîì ôàéëå äîëæíà áûòü îòîáðàæåíà.
 ñòðîêàõ 4–7 îáúÿâëÿåòñÿ íåñêîëüêî ïåðåìåííûõ ýòîé ïðîöåäóðû. Ïåðâûå
äâå ïåðåìåííûå (msg1 è msg2) èñïîëüçóþòñÿ äëÿ ôîðìèðîâàíèÿ òåêñòà ñîîá-
ùåíèÿ, îòîáðàæàåìîãî ïðîöåäóðîé. Ïåðåìåííûå fDate è fLen èñïîëüçóþòñÿ
äëÿ ñîõðàíåíèÿ èíôîðìàöèè î äàòå è âðåìåíè è èíôîðìàöèè î ðàçìåðå ôàéëà,
ñîîòâåòñòâåííî. Çàìåòüòå, ÷òî fLen èìååò òèï Long, ïîòîìó ÷òî äëèíà ôàéëà
ìîæåò èñ÷èñëÿòüñÿ ìèëëèîíàìè áàéò.
 ñòðîêå 9 âûçûâàåòñÿ ôóíêöèÿ FileDateTime ñ àðãóìåíòîì sName â êà÷å-
ñòâå èìåíè ôàéëà, à ðåçóëüòàò ôóíêöèè ñîõðàíÿåòñÿ â fDate. Â ñòðîêå 10 âû-
çûâàåòñÿ ôóíêöèÿ FileLen òàêæå ñ èñïîëüçîâàíèåì sName äëÿ îïðåäåëåíèÿ
àðãóìåíòà èìåíè ôàéëà, à ðåçóëüòàò ýòîé ôóíêöèè ñîõðàíÿåòñÿ â fLen.
 ñòðîêàõ 11 è 12 ñîäåðæèòñÿ îäèí îïåðàòîð, êîòîðûé ôîðìèðóåò ïåðâóþ
÷àñòü ñîîáùåíèÿ, îòîáðàæàåìîãî ýòîé ïðîöåäóðîé, è ñîõðàíÿåò åå â msg1.
 ñòðîêàõ 13–15 ñîäåðæèòñÿ òàêæå îäèí îïåðàòîð, êîòîðûé ôîðìèðóåò âòîðóþ
÷àñòü ñîîáùåíèÿ, îòîáðàæàåìîãî ýòîé ïðîöåäóðîé, è ñîõðàíÿåò åå â msg2. Íà-

Ðèñ. 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 âêëþ÷àåò â ñåáÿ òàêæå ìîäóëü êëàññà,

1  ïåðåâîäíîé ëèòåðàòóðå âñòðå÷àåòñÿ òåðìèí «íàñòðàèâàåìûå» (îò àíãë. custom).


350 Ãëàâà 9

â êîòîðûé âû ìîæåòå äîáàâëÿòü ñîáñòâåííûå ìåòîäû è ñâîéñòâà èëè êîä îáðà-


áîòêè ñîáûòèé ôîðìû.
Ïåðâûé øàã â ñîçäàíèè ïîëüçîâàòåëüñêîãî äèàëîãîâîãî îêíà ñîñòîèò â äî-
áàâëåíèè ê ïðîåêòó íîâîé ôîðìû (îáúåêòà UserForm). Ôîðìà ñîäåðæèò ðàáî-
÷óþ îáëàñòü, â êîòîðóþ âû ìîæåòå ïîìåñòèòü ýëåìåíòû, íåîáõîäèìûå äëÿ âû-
ïîëíåíèÿ íåêîòîðîãî äèàëîãà ïîëüçîâàòåëÿ ñ ïðèëîæåíèåì. Ïîñêîëüêó îáúåê-
òû UserForm õðàíÿòñÿ â êîëëåêöèè UserForms ïðîåêòà, îíè ÿâëÿþòñÿ ÷àñòüþ
ïðîåêòà.
Äëÿ äîáàâëåíèÿ ê ïðîåêòó íîâîé ôîðìû èñïîëüçóéòå êîìàíäó VB-ðåäàêòîðà
Insert | UserForm (Âñòàâêà | UserForm). Ðåäàêòîð VB äîáàâëÿåò ê òåêóùåìó ïðîåê-
òó íîâóþ ôîðìó, ïðèñâàèâàÿ åé ïî óìîë÷àíèþ èìÿ UserFormN è èñïîëüçóÿ òó
æå ñèñòåìó íóìåðàöèè, ÷òî è äëÿ ìîäóëåé. Ðåäàêòîð VB âûâîäèò íîâóþ ôîðìó
â ðåæèìå ðàçðàáîòêè, êàê ïîêàçàíî íà ðèñ. 9.1. [Â ðåæèìå ðàçðàáîòêè âû ìî-
æåòå äîáàâëÿòü (èëè óäàëÿòü) ýëåìåíòû óïðàâëåíèÿ ê ôîðìå, óñòàíàâëèâàòü
ñâîéñòâà ôîðìû èëè åå ýëåìåíòîâ óïðàâëåíèÿ è âûïîëíÿòü äðóãèå ìàíèïóëÿ-
öèè ñ âíåøíèì âèäîì ôîðìû â èíòåðàêòèâíîì ðåæèìå. Êîãäà ôîðìà âûâåäåíà
è èñïîëüçóåòñÿ êàê ÷àñòü âûïîëíÿþùåéñÿ ïðîãðàììû, îíà íàõîäèòñÿ â ðåæè-
ìå âûïîëíåíèÿ.]
Íà ðèñ. 9.1 ïîêàçàíà äîáàâëåííàÿ â ïðîåêò ôîðìà UserForm1. Çàìåòèì, ÷òî
øèðîêàÿ ðàìêà âîêðóã ôîðìû óêàçûâàåò íà òî, ÷òî ôîðìà âûäåëåíà. Îáðàòèòå
âíèìàíèå íà ñåòêó èç òî÷åê íà ïîâåðõíîñòè ôîðìû è Ïàíåëü ýëåìåíòîâ (Toolbox).
Ñåòêà èç òî÷åê ïîìîãàåò âûðàâíèâàòü è êîíòðîëèðîâàòü ðàçìåðû ýëåìåíòîâ
óïðàâëåíèÿ, ïîìåùàåìûõ íà ôîðìó, è ïîÿâëÿåòñÿ òîëüêî â ðåæèìå ðàçðàáîò-
êè. Ïàíåëü ýëåìåíòîâ ÿâëÿåòñÿ «ïàëèòðîé», ñ ïîìîùüþ êîòîðîé âû ìîæåòå âû-
áèðàòü ýëåìåíòû óïðàâëåíèÿ è äîáàâëÿòü èõ ê ôîðìå. Ïàíåëü, êàê ïðàâèëî,
ïîÿâëÿåòñÿ òîëüêî â òîì ñëó÷àå, åñëè âûáðàíà ôîðìà èëè îäèí èç åå ýëåìåíòîâ
óïðàâëåíèÿ.

Ðèñ. 9.1
Íîâàÿ UserForm
â ðåæèìå ðàçðàáîòêè
Ýëåìåíòû äèàëîãîâûõ îêîí 351

Âû ìîæåòå ïåðåèìåíîâàòü îáúåêò UserForm òàê æå, êàê ñòàíäàðòíûé ìî-


äóëü èëè ìîäóëü êëàññà. Äëÿ ýòîãî îòðåäàêòèðóéòå â Properties Window (îêíî
ñâîéñòâ) ñâîéñòâî Name ýòîãî îáúåêòà.
Íå îñòàâëÿéòå âíîâü ñîçäàííîé ôîðìå èìÿ, ïðèñâîåííîå åé ïî óìîë÷àíèþ,
íàïðèìåð UserForm1 èëè UserForm2. Íàïðîòèâ, ïåðåèìåíîâûâàéòå íîâóþ
ôîðìó ñðàçó, êàê òîëüêî åå ñîçäàëè.
Êîãäà ôîðìà âûâîäèòñÿ íà ýêðàí â ðåæèìå ðàçðàáîòêè, âû ìîæåòå ïðîòåñ-
òèðîâàòü åå ïîâåäåíèå, èñïîëüçóÿ êîìàíäó Run | Run Sub/UserForm (Çàïóñê | Çà-
ïóñê ïîäïðîãðàììû/UserForm). Ïîñëå ýòîãî ðåäàêòîð VB âûâåäåò ôîðìó â ðå-
æèìå âûïîëíåíèÿ è âñå åå ýëåìåíòû óïðàâëåíèÿ áóäóò àêòèâíûìè. Îäíàêî
ñëåäóåò ïîìíèòü, ÷òî ëþáîé êîä, èñïîëüçóåìûé ôîðìîé, õðàíÿùèéñÿ íå â ìî-
äóëå êëàññà ôîðìû, íå ìîæåò áûòü èíèöèàëèçèðîâàí. Ïðè çàïóñêå ôîðìû
èíèöèàëèçèðóåòñÿ òîëüêî êîä, íàõîäÿùèéñÿ â ìîäóëå êëàññà ôîðìû. Ïåðå-
ìåííûå â ñòàíäàðòíûõ ìîäóëÿõ íåîáÿçàòåëüíî áóäóò èíèöèàëèçèðîâàòüñÿ.
 ðåçóëüòàòå ýòîãî, åñëè ôîðìà íå ÿâëÿåòñÿ ïîëíîñòüþ íåçàâèñèìîé, íåêîòî-
ðûå èç ïðîãðàìì ñâÿçàííûõ ñ íåé, ìîãóò íå âûïîëíÿòüñÿ, âûäàâàÿ ñîîáùåíèÿ
î ðàçëè÷íûõ runtime-îøèáêàõ.

Ñâîéñòâà îáúåêòà UserForm


Ôîðìà êàê îáúåêò èìååò íåêîòîðûå âñòðîåííûå ñâîéñòâà, è âû ìîæåòå óñòà-
íàâëèâàòü ýòè ñâîéñòâà èëè ïðîãðàììíûì îáðàçîì, èëè â Properties Window
(îêíå ñâîéñòâ) ðåäàêòîðà VB. Ñòðîãî ãîâîðÿ, äàííûå ñïîñîáû èçìåíåíèÿ
ñâîéñòâ ôîðì íå ÿâëÿþòñÿ ýêâèâàëåíòíûìè. Íåêîòîðûå èç ñâîéñòâ ìîãóò áûòü
óñòàíîâëåíû òîëüêî ïîñðåäñòâîì Properties Window. Ïðîãðàììíûì ñïîñîáîì
ñâîéñòâà ôîðì óñòàíàâëèâàþòñÿ òàêèì æå îáðàçîì, êàê è ñâîéñòâà äðóãèõ îáú-
åêòîâ: ïóòåì ïðèñâîåíèÿ ñâîéñòâó íîâîãî çíà÷åíèÿ.  òàáëèöå 9.1 ïåðå÷èñëå-
íû ñâîéñòâà UserForm, íà êîòîðûå âàì, ñêîðåå âñåãî, ïðèäåòñÿ ññûëàòüñÿ èëè
èçìåíÿòü èõ.
Òàáëèöà 9.1. Íàèáîëåå ÷àñòî èñïîëüçóåìûå ñâîéñòâà îáúåêòîâ UserForm

Ñâîéñòâî Îïèñàíèå
Âîçâðàùàåò îáúåêòíóþ ññûëêó íà ýëåìåíò óïðàâëåíèÿ,
ActiveControl
íàõîäÿùèéñÿ â ôîêóñå â äàííûé ìîìåíò. Òîëüêî äëÿ ÷òåíèÿ.
Öåëîå òèïà Long îïðåäåëÿåò öâåò ôîíà ôîðìû. Ñàìûé ïðîñòîé
ñïîñîá óñòàíîâèòü ýòî ñâîéñòâî — èñïîëüçîâàòü Properties Window;
BackColor
÷òîáû âûáðàòü æåëàåìûé öâåò (åñëè íåîáõîäèìî), ìîæíî
ñêîïèðîâàòü íîìåð öâåòà èç Properties Window â ñâîþ ïðîãðàììó.
Caption Òåêñò, âûâîäèìûé â êà÷åñòâå çàãîëîâêà ôîðìû. Çàïèñü/×òåíèå.
Âîçâðàùàåò êîëëåêöèþ âñåõ ýëåìåíòîâ óïðàâëåíèÿ ôîðìû. Òîëüêî
Controls
äëÿ ÷òåíèÿ.
Îïðåäåëÿåò, äîëæíî ëè íàæàòèå êëàâèøè òàáóëÿöèè âûçûâàòü
ïîñëåäîâàòåëüíûé âûáîð âñåõ ýëåìåíòîâ óïðàâëåíèÿ âî âñåõ
ãðóïïàõ è íà êàæäîé ñòðàíèöå ìíîãîñòðàíè÷íûõ ýëåìåíòîâ
Cycle
óïðàâëåíèÿ èëè òîëüêî â ïðåäåëàõ òåêóùåé ãðóïïû èëè ñòðàíèöû.
Ìîæåò ñîäåðæàòü îäíó èç äâóõ âñòðîåííûõ êîíñòàíò:
fmCycleAllForms èëè fmCycleCurrentForm. ×òåíèå/Çàïèñü.
352 Ãëàâà 9

Ñâîéñòâî Îïèñàíèå
Ñîäåðæèò çíà÷åíèå òèïà Boolean, óêàçûâàþùåå, äîñòóïíà ëè
Enabled ôîðìà. Åñëè åãî çíà÷åíèå ðàâíî False, íè îäèí èç ýëåìåíòîâ
óïðàâëåíèÿ ôîðìû íå äîñòóïåí. ×òåíèå/Çàïèñü.
Âîçâðàùàåò ññûëêó íà îáúåêò Font, ïîñðåäñòâîì êîòîðîãî âû
Font ìîæåòå âûáðàòü ïàðàìåòðû øðèôòà ôîðìû èëè ýëåìåíòà
óïðàâëåíèÿ.
Òî æå ñàìîå, ÷òî è ñâîéñòâî BackColor, íî óñòàíàâëèâàåò öâåò
ForeColor èñïîëüçóåìûé äëÿ ïåðåäíåãî ïëàíà (îáû÷íî — ýòî öâåò òåêñòà)
îáúåêòà ôîðìû.

Ìåòîäû îáúåêòà UserForm


Âñÿêèé ðàç ñîçäàâàÿ â ïðîåêòå íîâûé îáúåêò UserForm, âû ñîçäàåòå íîâûé
ïîäêëàññ îáúåêòà UserForm. Ëþáûå ïðîöåäóðû èëè ôóíêöèè, íàïèñàííûå
âàìè â ðàçäåëå General (îáùèé) ìîäóëÿ êëàññà, îòíîñÿùåãîñÿ ê ôîðìå, ñòàíî-
âÿòñÿ äîïîëíèòåëüíûìè ìåòîäàìè äëÿ îòäåëüíîãî ïîäêëàññà îáúåêòà. Âû òàê-
æå ìîæåòå ñîçäàòü äëÿ ôîðìû íîâûå ñâîéñòâà, äîáàâèâ â åå ìîäóëü êëàññà ïðî-
öåäóðû Property Get è Property Let. Âû ìîæåòå ñîçäàâàòü ýêçåìïëÿðû ïîä-
êëàññà âàøåé UserForm ñ ïîìîùüþ îïåðàòîðà Dim è êëþ÷åâîãî ñëîâà New.
Îäíàêî ÷àùå âñåãî âû áóäåòå ìàíèïóëèðîâàòü îáúåêòîì ôîðìû ïðè ïîìîùè
ñòàíäàðòíûõ ìåòîäîâ è ñâîéñòâ êëàññà UserForm è ïðè ïîìîùè ñîáñòâåííûõ
ïðîöåäóð îáðàáîòêè ñîáûòèé äëÿ îïðåäåëåííîé âàìè ôîðìû è åå ýëåìåíòîâ
óïðàâëåíèÿ.
 òàáë. 9.2 ïåðå÷èñëåíû íàèáîëåå ÷àñòî èñïîëüçóåìûå ìåòîäû äëÿ îáúåêòîâ
UserForm, êîòîðûìè âû ìîæåòå âîñïîëüçîâàòüñÿ, è êðàòêî èçëîæåíû èõ ñâîé-
ñòâà. Ýòè ìåòîäû áóäóò äîñòóïíû äëÿ êàæäîé ôîðìû, êîòîðóþ âû äîáàâëÿåòå
â ñâîé ïðîåêò.
Òàáëèöà 9.2. Íàèáîëåå ÷àñòî èñïîëüçóåìûå ìåòîäû äëÿ îáúåêòîâ UserForm

Ìåòîä Íàçíà÷åíèå
Êîïèðóåò âûäåëåííûé â ýëåìåíòå óïðàâëåíèÿ òåêñò â áóôåð îáìåíà
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.

Âñå ôîðìû VBA ÿâëÿþòñÿ ìîäàëüíûìè (modal) ïðèëîæåíèÿìè, ýòî îçíà÷à-


åò, ÷òî âû íå ñìîæåòå âûïîëíèòü êàêîå-ëèáî äðóãîå äåéñòâèå â ïðèëîæåíèè äî
òåõ ïîð, ïîêà ôîðìà äèàëîãà íå áóäåò çàêðûòà èëè ñêðûòà.
Êîãäà VBA âûïîëíÿåò ìåòîä Show äëÿ îòîáðàæåíèÿ ôîðìû äèàëîãîâîãî îêíà,
ïðîöåäóðà, ñîäåðæàùàÿ âûçîâ ìåòîäà Show, ïðèîñòàíàâëèâàåòñÿ äî òåõ ïîð, ïîêà
âûâåäåííàÿ ôîðìà íå áóäåò çàêðûòà ïîëüçîâàòåëåì. Îäíàêî VBA áóäåò âûïîë-
íÿòü ïðîãðàììó äëÿ ëþáûõ ñîáûòèéíûõ ïðîöåäóð â ìîäóëå êëàññà ôîðìû.

Ñîáûòèÿ è ñîáûòèéíûå ïðîöåäóðû


Ñîáûòèå (event) — ýòî ÷òî-òî, ÷òî ìîæåò ïðîèçîéòè ñ äèàëîãîâûì îêíîì
èëè ýëåìåíòîì óïðàâëåíèÿ äèàëîãîâîãî îêíà. Òèïè÷íûå ïðèìåðû ñîáûòèé:
ùåë÷îê íà êíîïêå, ïåðåêëþ÷àòåëå è ò.ä. Äðóãèå ïðèìåðû ñîáûòèé: èçìåíåíèå
ñîäåðæèìîãî îêíà ðåäàêòèðîâàíèÿ èëè âûáîð ýëåìåíòà ñïèñêà. Ùåë÷îê
ìûøüþ, íàæàòèå êëàâèøè è äåéñòâèÿ âíóòðåííèå äëÿ âàøåãî êîìïüþòåðà, —
âñå îíè çàïóñêàþò èëè, èíûìè ñëîâàìè, âëåêóò çà ñîáîé ñîáûòèÿ.
Èñïîëüçîâàíèå ñîáûòèé ïîçâîëÿåò ñîçäàâàòü äåéñòâèòåëüíî äèàëîãîâûå
ïðèëîæåíèÿ. Â òàêèõ ïðèëîæåíèÿõ âñå äåéñòâèÿ ïîëüçîâàòåëÿ ïðèâîäÿò ê îï-
ðåäåëåííîé ðåàêöèè ïðèëîæåíèÿ, åñëè ýòè äåéñòâèÿ ïðåäóñìîòðåíû è íå çà-
áëîêèðîâàíû. Åñëè âû õîòèòå, ÷òîáû âàøè ïîëüçîâàòåëè ÷óâñòâîâàëè ñåáÿ
êîìôîðòíî ïðè ðàáîòå ñ âàøèìè ïðîãðàììàìè, íà÷èíàéòå ñîçäàâàòü ñâîè äèà-
ëîãîâûå îêíà ñ ðàçðàáîòêè ñîáûòèéíûõ ïðîöåäóð.
Òàêèå îáúåêòû, êàê ôîðìû è ýëåìåíòû óïðàâëåíèÿ ïðèâîäÿò â äåéñòâèå, òî
åñòü äåëàþò äîñòóïíûìè, íåêîòîðûå ñîáûòèÿ. Âû ìîæåòå íàïèñàòü ñîáñòâåííûå
VBA-ïðîöåäóðû, ðåàãèðóþùèå íà ñîáûòèÿ. Òàêèå ïðîöåäóðû, íàçûâàþòñÿ ñîáû-
òèéíûìè ïðîöåäóðàìè (event procedures) èëè ïðîöåäóðàìè îáðàáîòêè ñîáûòèé.
Ñîáûòèéíûå ïðîöåäóðû ñëåäóåò çàïèñûâàòü â ìîäóëü êëàññà, êîòîðûé ÿâëÿ-
åòñÿ ÷àñòüþ UserForm. Ïðè ýòîì òàêèå ïðîöåäóðû äîëæíû èìåòü èìåíà â âèäå
354 Ãëàâà 9

ObjectName_EventName, ãäå ObjectName — èìÿ ôîðìû èëè ýëåìåíòà óïðàâëå-


íèÿ, à EventName — èìÿ ñîáûòèÿ, ñ êîòîðûì âû õîòèòå ðàáîòàòü. Òàêîé ôîðìàò
èìåíè ïîçâîëÿåò VBA ñîïîñòàâëÿòü çàäàííîìó ñîáûòèþ òðåáóåìóþ ïðîöåäóðó.
Áîëüøàÿ ÷àñòü ïðîãðàììû, êîòîðóþ âû çàïèñûâàåòå â ìîäóëü êëàññà ôîð-
ìû, áóäåò ñâÿçàíà ñ îáðàáîòêîé ñîáûòèé.  òàáëèöå 9.3 ïåðå÷èñëåíû ñîáûòèÿ,
äëÿ êîòîðûõ âû ìîæåòå íàïèñàòü ïðîöåäóðû îáðàáîòêè.
Òàáëèöà 9.3. Ñîáûòèÿ îáúåêòîâ UserForm

Ñèíòàêñèñ çàãîëîâêà
Ñîáûòèå ïðîöåäóðû îáðàáîòêè Îïèñàíèå
ñîáûòèÿ
Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà îêíî
ôîðìû ñòàíîâèòñÿ àêòèâíûì. Èñïîëüçóéòå
ýòî ñîáûòèå äëÿ îáíîâëåíèÿ ñîäåðæèìîãî
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() ñïåöèàëüíûõ ñëóæåáíûõ çàäà÷, êîòîðûå
íåîáõîäèìî âûïîëíèòü ïðåæäå, ÷åì
ïåðåìåííûå ôîðìû áóäóò âûãðóæåíû.

 äîïîëíåíèå ê ìåòîäàì, ñâîéñòâàì è ñîáûòèÿì, âñòðîåííûì â îáúåêò


UserForm, VBA ïðåäîñòàâëÿåò äâà îïåðàòîðà, êîòîðûå îñîáåííî ïîëåçíû ïðè
Ýëåìåíòû äèàëîãîâûõ îêîí 355

ðàáîòå ñ îáúåêòàìè ôîðì: Load è Unload. Âû ìîæåòå èñïîëüçîâàòü ýòè îïåðà-


òîðû äëÿ òîãî, ÷òîáû çàãðóçèòü ôîðìó â ïàìÿòü èëè æå óäàëèòü åå îòòóäà.

Ñèíòàêñèñ Load/Unload
Ñèíòàêñè÷åñêèå êîíñòðóêöèè äëÿ èñïîëüçîâàíèÿ îïåðàòîðîâ Load è Un-
load âûãëÿäÿò ñëåäóþùèì îáðàçîì:
Ñèíòàêñèñ
Load Object
Unload Object
Çäåñü Object ïðåäñòàâëÿåò ëþáóþ äîïóñòèìóþ ññûëêó íà îáúåêò UserForm.

Îïåðàòîð Load çàãðóæàåò â ïàìÿòü îáúåêò UserForm è çàïóñêàåò ìåòîä ôîð-


ìû Initialize, íî íå âûâîäèò ôîðìó íà ýêðàí. Êîãäà ôîðìà çàãðóæåíà, âû
ìîæåòå èñïîëüçîâàòü íàïèñàííóþ íà VBA ïðîãðàììó äëÿ ðàáîòû ñ îáúåêòîì
UserForm. Îïåðàòîð Unload óäàëÿåò èç ïàìÿòè UserForm, à òàêæå âñå ïåðå-
ìåííûå ôîðìû. Ïîñëå òîãî êàê ôîðìà âûãðóæåíà, îíà ïåðåñòàåò áûòü äîñòóï-
íîé äëÿ VBA-êîäà.

Ïðèìåðû ïðîãðàìì ìîäóëÿ êëàññà ôîðìû


Ðàññìîòðèì íåñêîëüêî ïðîñòûõ ïðèìåðîâ èñïîëüçîâàíèÿ ñâîéñòâ è ìåòîäîâ
ôîðìû ñ ïîìîùüþ ïðîöåäóð îáðàáîòêè ñîáûòèé. Áóäåì èíèöèèðîâàòü ñîáû-
òèÿ, îïèñàííûå â òàáë. 9.3, à â îòâåò íà íèõ ñ ïîìîùüþ îêíà ôóíêöèè MsgBox
áóäåì ñîîáùàòü î òèïå ñîáûòèÿ èëè ìåíÿòü âèäèìûå ñâîéñòâà ôîðìû. Íà÷íåì
ñ ñîáûòèÿ Click, òàê êàê ïðîöåäóðó îáðàáîòêè ýòîãî ñîáûòèÿ ëåã÷å âñåãî ñîç-
äàòü: äîñòàòî÷íî äâàæäû ùåëêíóòü íà ôîðìå (èñïîëüçóåì ñîçäàííóþ â íà÷àëå
ãëàâû ôîðìó) â ðåæèìå ðàçðàáîòêè, è âàì áóäåò ïðåäîñòàâëåí øàáëîí ïðîöå-
äóðû â âèäå:
Private Sub UserForm_Click()

End Sub
Çàïèøèòå ïîñëå çàãîëîâêà ïðîöåäóðû ñëåäóþùèé îïåðàòîð
MsgBox("Ñîáûòèå: Click")
Çàïóñòèòå ôîðìó íà âûïîëíåíèå êîìàíäîé Run | Run Sub/UserForm. Ïîñëå ïî-
ÿâëåíèÿ ôîðìû íà ýêðàíå ùåëêíèòå íà íåé ìûøüþ, íà ýêðàíå îòîáðàçèòñÿ ñî-
îáùåíèå, ïîäîáíîå ïðèâåäåííîìó íà ðèñ. 9.2.
Åñëè äàæå âàì íå ÷àñòî áóäåò íóæíî èñïîëüçîâàòü ïîäîáíîå ñîáûòèå äëÿ
ôîðìû, íå çàáûâàéòå î òàêîé âîçìîæíîñòè. À åùå ëó÷øå ïîñòóïàéòå ñëåäóþ-
ùèì îáðàçîì. Âñåãäà èñïîëüçóéòå ýòî ñîáûòèå íà ñëó÷àé, êîãäà ïîëüçîâàòåëü
âàøèõ ôîðì ïðè ïîïûòêå ùåëêíóòü íà êàêîì ëèáî ýëåìåíòå óïðàâëåíèÿ íå ñî-
âñåì òî÷íî ïîçèöèîíèðóåò êóðñîð ìûøè. Åñëè ïðè ýòîì áóäåò âûïîëíÿòüñÿ
ïðîöåäóðà îáðàáîòêè ñîáûòèÿ Click äëÿ ôîðìû ñ âûâîäîì øóòëèâîãî ñîîáùå-
íèÿ î íåäîñòàòî÷íîé óâåðåííîñòè â äåéñòâèÿõ ïîëüçîâàòåëÿ, ñ âàøèì ïðèëî-
æåíèåì ñòàíåò ïðèÿòíî ðàáîòàòü. Âû òàêæå íèêîãäà íå çàáóäåòå î âîçìîæíî-
ñòè èñïîëüçîâàòü ýòî ñîáûòèå, êîãäà äëÿ ýòîãî ïîÿâÿòñÿ ñåðüåçíûå ïðè÷èíû.
Ïðîäîëæèì ðàññìîòðåíèå ñîáûòèé è ïðîòåñòèðóåì ñîáûòèå Activate. Çà-
ïèøèòå â ìîäóëå ðàññìàòðèâàåìîé ôîðìû ñëåäóþùóþ ïðîöåäóðó:
356 Ãëàâà 9

Private Sub UserForm_Activate()


MsgBox ("Ñîáûòèå: Activate")
End Sub
Ñíîâà çàïóñòèòå ôîðìó íà âûïîëíåíèå êîìàíäîé Run | Run Sub/UserForm. Ïî-
ñëå ïîÿâëåíèÿ ôîðìû íà ýêðàíå âû óâèäèòå ñîîáùåíèå î òîì, ÷òî ïðîèçîøëî
ñîáûòèå Activate (ðèñ. 9.3).

Ðèñ. 9.2
Âûïîëíåíèå ïðîöåäóðû îáðàáîòêè ñîáûòèÿ
Click

Ðèñ. 9.3
Ñðàçó ïîñëå çàãðóçêè ôîðìû
ïðîèçîøëî ñîáûòèå Activate

Ðàññìîòðèì ñîáûòèÿ Deactivate è Terminate. Ïåðâîå èç íèõ èíèöèèðóåò-


ñÿ âñÿêèé ðàç, êîãäà ôîðìà ïåðåñòàåò áûòü àêòèâíîé, à âòîðîå — êîãäà ôîðìà
âûãðóæàåòñÿ èç ïàìÿòè. Ïðîöåäóðà îáðàáîòêè ñîáûòèÿ Terminate ïðîñòî äî-
áàâëÿåòñÿ ê èìåþùåéñÿ êîëëåêöèè ïðîãðàìì ôîðìû UserForm1 è âûïîëíÿåò-
ñÿ ïðè çàâåðøåíèè ðàáîòû ñ ôîðìîé. Äëÿ äåìîíñòðàöèè æå ñîáûòèÿ Deacti-
vate íåîáõîäèìî, íå âûõîäÿ èç ïðèëîæåíèÿ, ñäåëàòü ôîðìó UserForm1 íåàê-
òèâíîé. Ýòî ìîæíî îñóùåñòâèòü, åñëè àêòèâíîé ñòàíåò äðóãàÿ ôîðìà. È åå
íàäî ñîçäàòü.
Ñîçäàéòå íîâóþ ôîðìó ëèáî ïðè ïîìîùè êíîïêè Insert UserForm, ëèáî — êî-
ìàíäîé Insert | UserForm. Ïóñòü îíà èìååò èìÿ, êîòîðîå åé ïðèñâàèâàåòñÿ ïî
óìîë÷àíèþ: UserForm2. Ïîìíèòå, ÷òî ñëåäóåò âñåãäà ïåðåèìåíîâûâàòü ôîðìû
äëÿ óäîáñòâà ñîïðîâîæäåíèÿ ðàçðàáîòêè, íî äëÿ íàøåãî òåñòèðîâàíèÿ ñîáûòèé
ìû ýòîãî äåëàòü íå áóäåì. Íàìåòèì ïëàí òåñòèðîâàíèÿ:
1. Çàãðóæàåì ôîðìó UserForm1.
2. Ñîáûòèå Click ôîðìû UserForm1 âûçûâàåò ìåòîä Show äëÿ çàãðóçêè
ôîðìû UserForm2.
Ýëåìåíòû äèàëîãîâûõ îêîí 357

3. Çàãðóçêà/âûãðóçêà ôîðìû UserForm2 íå ñîïðîâîæäàåòñÿ íèêàêèìè ñî-


áûòèÿìè.
4. Ôîðìà UserForm1 èìååò ïðîöåäóðû îáðàáîòêè ñîáûòèé: Click,
Activate, Deactivate, Terminate.

Äëÿ âûïîëíåíèÿ ïîñòàâëåííîé çàäà÷è â ìîäóëü ôîðìû UserForm1 íåîáõî-


äèìî ïîìåñòèòü êîä Ëèñòèíãà 9.1.

Ëèñòèíã 9.1. Ïðîöåäóðû ñîáûòèé UserForm1


1: 'Îáðàáîò÷èê ñîáûòèÿ Click ôîðìû UserForm1
2: Private Sub UserForm_Click()
3: 'Âûâîä îêíà ñîîáùåíèÿ íà ýêðàí:
4: MsgBox ("Ñîáûòèå: Click. Âûâîäèì UserForm2")
5: 'Çàãðóçêà ôîðìû UserForm2:
6: UserForm2.Show
7: End Sub
8:
9: 'Îáðàáîò÷èê ñîáûòèÿ Activate ôîðìû UserForm1
10: Private Sub UserForm_Activate()
11: 'Âûâîä îêíà ñîîáùåíèÿ íà ýêðàí:
12: MsgBox ("Ñîáûòèå: Activate äëÿ ôîðìû UserForm1")
13: End Sub
14:
15: Private Sub UserForm_Deactivate()
16: 'Âûâîä îêíà ñîîáùåíèÿ íà ýêðàí:
17: MsgBox ("Ñîáûòèå: Deactivate äëÿ ôîðìû UserForm1")
18: End Sub
19:
20: Private Sub UserForm_Terminate()
21: 'Âûâîä îêíà ñîîáùåíèÿ íà ýêðàí:
22: MsgBox ("Ñîáûòèå: Terminate äëÿ ôîðìû UserForm1")
23: End Sub

Ñëåäóåò îòìåòèòü, ÷òî ïîñëå ñîçäàíèÿ íîâîé ôîðìû, âû íå ñðàçó ìîæåòå


íàéòè ìîäóëü ôîðìû UserForm1. Âàø ýêðàí ìîæåò áûòü ïîõîæèì íà òîò, êî-
òîðûé ïðèâåäåí íà ðèñ. 9.4.
Âûáåðèòå êîìàíäó Run | Run Sub/UserForm. Òåïåðü âû èìååòå âîçìîæíîñòü
ïðîñëåäèòü çà èíèöèàëèçàöèåé âñåõ ÷åòûðåõ ñîáûòèé. Ñðàçó ïîñëå çàãðóçêè
UserForm1 âûäàåòñÿ ñîîáùåíèå «Ñîáûòèå: Activate äëÿ ôîðìû UserForm1»
(ïðîöåäóðà UserForm_Activate). Ùåë÷îê íà ôîðìå ïðèâîäèò ê âûâîäó ñîîáùå-
íèÿ «Ñîáûòèå: Click. Âûâîäèì UserForm2» (ïðîöåäóðà UserForm_Click), çà-
ãðóçêå ôîðìû UserForm2 (ïðîöåäóðà UserForm_Click) è âûâîäó ñîîáùåíèÿ
«Ñîáûòèå: Deactivate äëÿ ôîðìû UserForm1» (ïðîöåäóðà UserForm_Deactiva-
te) â ðåçóëüòàòå òîãî, ÷òî ôîðìà UserForm1 ñòàíîâèòñÿ íåàêòèâíîé. Åñëè áû
ìû îïèñàëè ïðîöåäóðó ñîáûòèÿ Activate è äëÿ ôîðìû UserForm2, òî îäèí
ùåë÷îê ìûøè âûçâàë áû èíèöèàëèçàöèþ òðåõ ñîáûòèé. È, íàêîíåö, íå çà-
áóäüòå îáðàòèòü âíèìàíèå íà òî, ÷òî ïðè âûãðóçêå èç ïàìÿòè ôîðìû User-
Form1 íà ýêðàí âûäàåòñÿ ñîîáùåíèå ïðîöåäóðû UserForm_Terminate.
Ñîáûòèå Initialize èíèöèàëèçèðóåòñÿ ïðè çàãðóçêå ôîðìû ïðè ïîìîùè
îïåðàòîðà Load èëè ìåòîäà Show. Ïðè âûïîëíåíèè êîìàíäû Run | Run Sub/User-
Form ýòî ñîáûòèå íå èíèöèàëèçèðóåòñÿ. Ýòî ñîáûòèå ñëåäóåò èñïîëüçîâàòü ïðè
ïåðâîé çàãðóçêå ôîðìû äëÿ óñòàíîâêè êàêèõ-ëèáî ñâîéñòâ ôîðìû è åå ýëåìåí-
358 Ãëàâà 9

òîâ óïðàâëåíèÿ. Â ñëåäóþùåì ïðèìåðå (ëèñòèíã 9.2) äëÿ ýòîãî ñîáûòèÿ óñòà-
íàâëèâàåòñÿ ñâîéñòâî ôîðìû BackColor.

Ðèñ. 9.4
Ïîñëå ñîçäàíèÿ
íîâîé ôîðìû
î÷åíü ëåãêî
«ïîòåðÿòü»
ïðåäûäóùóþ

Ëèñòèíã 9.2. Ïðîöåäóðû ñîáûòèé UserForm2


1: Dim sRED, sGREEN, sBLUE 'ïåðåìåííûå äëÿ çàäàíèÿ öâåòà ôîðìû
2:
3: 'Ïðîöåäóðà îáðàáîòêè ñîáûòèÿ Initialize
4: 'Èíèöèàëèçèðóåòñÿ îäèí ðàç: ïðè çàãðóçêå
5: Private Sub UserForm_Initialize()
6: 'çàäàåì íà÷àëüíûé öâåò ôîðìû
7: sRED = 100
8: sGREEN = 100
9: sBLUE = 200
10: UserForm2.BackColor = RGB(sRED, sGREEN, sBLUE)
11: End Sub
12:
13: 'Ïðîöåäóðà îáðàáîòêè ñîáûòèÿ Click
14: 'Ïðè êàæäîé èíèöèàëèçàöèè ìåíÿåò öâåò ôîðìû
15: 'Ïðè íåäîïóñòèìûõ çíà÷åíèÿõ sRED, sGREEN, sBLUE âûäàåò
îøèáêó âðåìåíè èñïîëíåíèÿ
16: Private Sub UserForm_Click()
17: Dim I
18:
19: 'Ìåíÿåì öâåò ôîðìû:
20: sRED = sRED + 20
21: sGREEN = sGREEN + 10
22: sBLUE = sBLUE - 20
23: i = RGB(sRED, sGREEN, sBLUE)
24: UserForm2.BackColor = I
25:
26: 'Èçìåíèòü çàãîëîâîê ôîðìû:
27: UserForm2.Caption = "Öâåò: " & Str(i)
28: End Sub
Ýëåìåíòû äèàëîãîâûõ îêîí 359

Äëÿ çàãðóçêè ôîðìû UserForm2 èñïîëüçóéòå ôîðìó UserForm1 ñ ïðîãðàì-


ìàìè îáðàáîòêè ñîáûòèé èç ëèñòèíãà 9.1.
 ëèñòèíãå 9.2 äëÿ óñòàíîâêè ñâîéñòâà ôîðìû BackColor èñïîëüçóåòñÿ
ôóíêöèÿ RGB, êîòîðàÿ âîçâðàùàåò RGB-çíà÷åíèå òèïà Long, èñïîëüçóåìîå äà-
ëåå äëÿ ïðèñâîåíèÿ ñâîéñòâó UserForm2.BackColor. Ñèíòàêñèñ ôóíêöèè RGB :
Ñèíòàêñèñ
RGB(red, green, blue)
Èìåíîâàííûå àðãóìåíòû:

Àðãóìåíò Îïèñàíèå
Îáÿçàòåëüíûé; òèï: Variant (Integer). ×èñëî â äèàïàçîíå 0–255;
Red
ïðåäñòàâëÿåò êðàñíûé êîìïîíåíò öâåòà.
Îáÿçàòåëüíûé; òèï: Variant (Integer). ×èñëî â äèàïàçîíå 0–255;
Green
ïðåäñòàâëÿåò çåëåíûé êîìïîíåíò öâåòà.
Îáÿçàòåëüíûé; òèï: Variant (Integer). ×èñëî â äèàïàçîíå 0–255;
Blue
ïðåäñòàâëÿåò ñèíèé êîìïîíåíò öâåòà.

Ïîñëå âûâîäà ôîðìû ñ èìåíåì UserForm2 íà ýêðàí ñîáûòèå Click áóäåò


ïðèâîäèòü ê èçìåíåíèþ öâåòà è çàãîëîâêà ôîðìû.
Ìû íå ðàññìîòðåëè åùå äâà ñîáûòèÿ, ñâÿçàííûå ñ ôîðìîé: DblClick, êîòî-
ðîå ÿâëÿåòñÿ àíàëîãîì Click, è Resize — ñîáûòèå, êîòîðîå èíèöèàëèçèðóåò-
ñÿ ïðè èçìåíåíèè ðàçìåðîâ ôîðìû.
Ðàññìîòðèì ïîñëåäíåå ñîáûòèå, òàê êàê ïåðâîå äîëæíî áûòü ïîíÿòíûì
è â ðåàëèçàöèè ïîõîæèì íà ðàíåå ðàññìîòðåííûå.
Ðàçìåðû ôîðìû ìîãóò èçìåíÿòüñÿ êàê âî âðåìÿ äèàëîãà (åñëè ýòî ïðåäó-
ñìîòðåíî ðàçðàáîò÷èêîì ôîðìû), òàê è ïðîãðàììíûì ñïîñîáîì. Äëÿ èëëþñò-
ðàöèè ïðîãðàììû îáðàáîòêè ñîáûòèÿ èçìåíåíèÿ ôîðìû óäîáíåå èñïîëüçîâàòü
ïðîãðàììíûé ñïîñîá. Ëèñòèíã 9.3 ñîäåðæèò äâå ïðîöåäóðû: ïåðâàÿ îáðàáàòû-
âàåò ñîáûòèå Click (ïðè ýòîì èçìåíÿåòñÿ ñâîéñòâî ôîðìû Width), âòîðàÿ —
ñîáûòèå Resize.

Ëèñòèíã 9.3. Îáðàáîòêà ñîáûòèé Click è Resize


1: Private Sub UserForm_Click() 'Ìîæíî UserForm_DblClick
2: MsgBox ("Ñîáûòèå: Click")
3: 'Ìåíÿåì ðàçìåð ôîðìû:
4: UserForm1.Width = 400
5: End Sub
6:
7: Private Sub UserForm_Resize()
8: MsgBox ("Ñîáûòèå: Resize")
9: End Sub

Ýëåìåíòû óïðàâëåíèÿ
Îáúåêò UserForm ìîæåò ñîäåðæàòü òå æå ýëåìåíòû óïðàâëåíèÿ, ÷òî è íàõîäÿ-
ùèåñÿ â äèàëîãîâûõ îêíàõ Word, Excel èëè äðóãèõ ïðèëîæåíèé Windows. Ýëå-
360 Ãëàâà 9

ìåíòû óïðàâëåíèÿ (controls) — ýòî ýëåìåíòû äèàëîãîâîãî îêíà, êîòîðûå äàþò


âîçìîæíîñòü ïîëüçîâàòåëþ âçàèìîäåéñòâîâàòü ñ ïðîãðàììîé. Îíè âêëþ÷àþò
â ñåáÿ êíîïêè-ïåðåêëþ÷àòåëè, òåêñòîâûå ïîëÿ, ëèíåéêè ïðîêðóòêè, êîìàíäíûå
êíîïêè è òàê äàëåå. Â ýòîì ðàçäåëå âû ïîçíàêîìèòåñü ñî ñòàíäàðòíûìè ýëåìåíòà-
ìè óïðàâëåíèÿ, âêëþ÷åííûìè â VBA, êîòîðûå ñìîæåòå äîáàâëÿòü â ñâîè ôîðìû.
Ìíîãèå ïðîèçâîäèòåëè ïðîãðàììíîãî îáåñïå÷åíèÿ ðàçðàáàòûâàþò ïàêåòû,
ðàñøèðÿþùèå íàáîð ýëåìåíòîâ óïðàâëåíèÿ. Âû ìîæåòå äîáàâëÿòü ýëåìåíòû
óïðàâëåíèÿ (èçâåñòíûå êàê îáúåêòû ActiveX è Automation) ê ïàíåëè Toolbox
(ïàíåëè ýëåìåíòîâ), ïðåäâàðèòåëüíî ñîçäàâàÿ ññûëêó èç âàøåãî ïðîåêòà íà
áèáëèîòåêó, ñîäåðæàùóþ ðàñøèðåííûé íàáîð ýëåìåíòîâ óïðàâëåíèÿ. Ïîñëå
ýòîãî ìîæíî äîáàâëÿòü äàííûå ýëåìåíòû óïðàâëåíèÿ íà ïàíåëü Toolbox.
Êàæäûé ýëåìåíò óïðàâëåíèÿ — ýòî îáúåêò ñ îïðåäåëåííûìè ñâîéñòâàìè,
ìåòîäàìè è ñîáûòèÿìè. Êàê è äëÿ ôîðìû, èõ ñîäåðæàùåé, âû ìîæåòå óñòàíàâ-
ëèâàòü ñâîéñòâà ýëåìåíòîâ óïðàâëåíèÿ ïðîãðàììíûì ïóòåì èëè ïîñðåäñòâîì
Properties Window ðåäàêòîðà VB. Â ïðîãðàììå âû ìîæåòå ïðèñâàèâàòü èëè âîñ-
ñòàíàâëèâàòü çíà÷åíèÿ ñâîéñòâ ýëåìåíòîâ óïðàâëåíèÿ òàê æå, êàê äëÿ ëþáûõ
äðóãèõ îáúåêòîâ.
 òàáë. 9.4 ïåðå÷èñëåíû ñòàíäàðòíûå ýëåìåíòû óïðàâëåíèÿ, âêëþ÷åííûå
â VBA, è îïèñàíî íàçíà÷åíèå êàæäîãî ýëåìåíòà. Êàê âèäíî èç ýòîé òàáëèöû,
ê ñòàíäàðòíûì îòíîñÿòñÿ, ïðàêòè÷åñêè, âñå ýëåìåíòû óïðàâëåíèÿ, êîòîðûå
âàì âñòðå÷àëèñü â ïðèëîæåíèÿõ Windows. ( çàâèñèìîñòè îò host-ïðèëîæåíèÿ
VBA, â êîòîðîì âû ðàáîòàåòå, íà ïàíåëè Toolbox ìîãóò ïîÿâëÿòüñÿ
äîïîëíèòåëüíûå ýëåìåíòû óïðàâëåíèÿ, íå ïåðå÷èñëåííûå â òàáë. 9.4. Ýòè
äîïîëíèòåëüíûå ýëåìåíòû äîñòóïíû ïîñðåäñòâîì áèáëèîòåê ýëåìåíòîâ
óïðàâëåíèÿ, ïîñòàâëÿåìûõ ñ êàæäûì èç host-ïðèëîæåíèé.)
Òàáëèöà 9.4. Ñòàíäàðòíûå ýëåìåíòû óïðàâëåíèÿ, âêëþ÷åííûå â VBA

Ýëåìåíò
Íàçíà÷åíèå
óïðàâëåíèÿ
Ïîçâîëÿåò ñîçäàâàòü çàãîëîâêè ýëåìåíòîâ óïðàâëåíèÿ,
êîòîðûå íå èìåþò ñîáñòâåííûõ âñòðîåííûõ çàãîëîâêîâ.
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 ïåðå÷èñëåíû íàèáîëåå ÷àñòî èñïîëüçóåìûå ñâîéñòâà ýëå-
ìåíòîâ óïðàâëåíèÿ, êîòîðûå ìîãóò ïîíàäîáèòüñÿ äëÿ ðàáîòû ñ âàøèìè
VBA-ïðîãðàììàìè — ñâîéñòâà, êîòîðûå ïîçâîëÿþò èçìåíÿòü çàãîëîâîê, îïðå-
äåëÿòü ñîñòîÿíèå ýëåìåíòà óïðàâëåíèÿ (òî åñòü îáíàðóæèâàòü óñòàíîâêè, âû-
ïîëíåííûå ïîëüçîâàòåëåì) è òàê äàëåå.
Òàáëèöà 9.5. Íàèáîëåå ÷àñòî èñïîëüçóåìûå ñâîéñòâà
ñòàíäàðòíûõ ýëåìåíòîâ óïðàâëåíèÿ

Ñâîéñòâî Ãäå ïðèìåíÿåòñÿ Îïèñàíèå


CheckBox, Tab,
Ñîäåðæèò ñèìâîë, èñïîëüçóåìûé, â êà÷åñòâå
CommandButton,
áûñòðîé êëàâèøè âûçîâà, ýëåìåíòà óïðàâëåíèÿ.
Accelerator Label, Page,
Ïðè «íàæàòèè» Alt+<êëàâèøà áûñòðîãî âûçîâà>
OptionButton,
ïðîèñõîäèò âûáîð ýëåìåíòà óïðàâëåíèÿ.
ToggleButton
×èñëî, ïðåäñòàâëÿþùåå îïðåäåëåííûé öâåò ôîíà
BackColor Âñå ýëåìåíòû
ýëåìåíòà óïðàâëåíèÿ.
CheckBox,
CommandButton, Äëÿ íàäïèñè — òåêñò, îòîáðàæàåìûé, ýëåìåíòîì
Frame, Label, óïðàâëåíèÿ. Äëÿ äðóãèõ ýëåìåíòîâ óïðàâëåíèÿ —
Caption OptionButton, íàäïèñü, êîòîðàÿ ïîÿâëÿåòñÿ íà êíîïêå èëè
ToggleButton, âêëàäêå èëè ðÿäîì ñ ðàìêîé, ôëàæêîì èëè
Page, Tab, ïåðåêëþ÷àòåëåì.
UserForm
Çàäàåò êíîïêó îòìåíû äèàëîãîâîãî îêíà. Ïðè
«íàæàòèè» íà ýòó êíîïêó èëè êëàâèøó Esc
Cancel CommandButton
äèàëîãîâîå îêíî èñ÷åçàåò. Òîëüêî îäíà êíîïêà
ôîðìû ìîæåò èìåòü äàííîå ñâîéñòâî.
Îïðåäåëÿåò òåêñò, êîòîðûé îòîáðàæàåòñÿ â âèäå
ControlTipTe Âñå ýëåìåíòû âñïëûâàþùåé ïîäñêàçêè (ControlTip, íàçûâàåìîé
xt óïðàâëåíèÿ òàêæå ToolTip), êîãäà óêàçàòåëü ìûøè
ïîìåùàåòñÿ íà ýëåìåíò óïðàâëåíèÿ.
Ýëåìåíòû äèàëîãîâûõ îêîí 363

Ñâîéñòâî Ãäå ïðèìåíÿåòñÿ Îïèñàíèå


Îïðåäåëÿåò çàäàííóþ ïî óìîë÷àíèþ êíîïêó.
Êîãäà ïîëüçîâàòåëü íàæèìàåò â ïðîöåññå äèàëîãà
Default CommandButton
êëàâèøó Enter, ýòà êíîïêà âåäåò ñåáÿ òàê, êàê
åñëè áû ïî íåé ùåëêíóëè ìûøüþ.
Õðàíèò çíà÷åíèå òèïà Boolean, îïðåäåëÿþùåå
äîñòóïåí èëè íåò ýëåìåíò óïðàâëåíèÿ. Åñëè
Âñå ýëåìåíòû
Enabled Enabled èìååò çíà÷åíèå False, òî ýëåìåíò
óïðàâëåíèÿ
óïðàâëåíèÿ ïðîäîëæàåò îòîáðàæàòüñÿ
â äèàëîãîâîì îêíå, íî íå ìîæåò áûòü âûáðàí.
Òî æå ñàìîå, ÷òî è BackColor, íî óñòàíàâëèâàåò
Âñå ýëåìåíòû
ForeColor öâåò äëÿ ïåðåäíåãî ïëàíà ýëåìåíòà óïðàâëåíèÿ —
óïðàâëåíèÿ
êàê ïðàâèëî, ñèìâîëîâ òåêñòà.
Ìàññèâ òèïà Variant (îäíî- èëè ìíîãîìåðíûé),
ïðåäñòàâëÿåò ñïèñîê ñîäåðæàùèéñÿ â ýëåìåíòå
ComboBox,
List óïðàâëåíèÿ. Èñïîëüçóéòå ìåòîäû ýëåìåíòà
ListBox
óïðàâëåíèÿ AddItem è RemoveItem äëÿ
äîáàâëåíèÿ èëè óäàëåíèÿ ïóíêòîâ ñïèñêà.
Ïåðåìåííàÿ òèïà Long, îïðåäåëÿþùàÿ
ìàêñèìàëüíîå çíà÷åíèå ñ÷åò÷èêà, èëè çíà÷åíèå,
ScrollBar,
Max ïðè êîòîðîì ïîëîñà ïðîêðóòêè íàõîäèòñÿ â ñàìîì
SpinButton
âåðõó (äëÿ âåðòèêàëüíîé ïîëîñû) èëè ñïðàâà (äëÿ
ãîðèçîíòàëüíîé).
Ïåðåìåííàÿ òèïà Long, îïðåäåëÿþùàÿ
ìèíèìàëüíîå çíà÷åíèå ñ÷åò÷èêà èëè çíà÷åíèå,
ScrollBar,
Min ïðè êîòîðîì ïîëîñà ïðîêðóòêè íàõîäèòñÿ â ñàìîì
SpinButton
íèçó (äëÿ âåðòèêàëüíîé ïîëîñû) èëè ñëåâà (äëÿ
ãîðèçîíòàëüíîé).
Ñîäåðæèò èìÿ ýëåìåíòà óïðàâëåíèÿ. Âû ìîæåòå
Âñå ýëåìåíòû
Name óñòàíîâèòü äàííîå ñâîéñòâî òîëüêî ñ ïîìîùüþ
óïðàâëåíèÿ
Properties Window.
Çàäàåò èñòî÷íèê, èç êîòîðîãî ComboBox èëè
ComboBox, ListBox «áåðåò» ñïèñîê îáúåêòà. Â Excel VBA
RowSource
ListBox RowSource îáû÷íî èñïîëüçóåò äèàïàçîí ðàáî÷åãî
ëèñòà.
Âîçâðàùàåò ìàññèâ çíà÷åíèé òèïà Boolean äëÿ
ñïèñêà, êîòîðûé äîïóñêàåò ìíîæåñòâåííûé âûáîð.
Êàæäûé ýëåìåíò ìàññèâà ñîäåðæèò ïî îäíîìó
Selected ListBox ýëåìåíòó, ñîîòâåòñòâóþùåìó êàæäîìó ïóíêòó
ñïèñêà. Åñëè çíà÷åíèå ýëåìåíòà â ìàññèâå
Selected ðàâíî True, òî ñîîòâåòñòâóþùèé ïóíêò
ñïèñêà âûáðàí.
×èñëî, óêàçûâàþùåå ïîëîæåíèå ýëåìåíòà
Âñå ýëåìåíòû óïðàâëåíèÿ â ïîðÿäêå òàáóëÿöèè (ìîæåò èìåòü
TabIndex
óïðàâëåíèÿ çíà÷åíèå îò 0 äî çíà÷åíèÿ, ðàâíîãî êîëè÷åñòâó
ýëåìåíòîâ óïðàâëåíèÿ íà ôîðìå).
364 Ãëàâà 9

Ñâîéñòâî Ãäå ïðèìåíÿåòñÿ Îïèñàíèå


Çíà÷åíèå òèïà Boolean, óêàçûâàþùåå ìîæåò ëè
ýëåìåíò óïðàâëåíèÿ áûòü âûáðàí êëàâèøåé Tab.
Âñå ýëåìåíòû
TabStop Åñëè çíà÷åíèå TabStop ðàâíî False âû, òåì íå
óïðàâëåíèÿ
ìåíåå, ìîæåòå ùåëêíóòü íà ýëåìåíòå è òàêèì
îáðàçîì åãî âûáðàòü.
Çíà÷åíèå òåêóùèõ óñòàíîâîê ýëåìåíòà
óïðàâëåíèÿ: òåêñò â òåêñòîâîì ïîëå, êàêèå
Âñå ýëåìåíòû âûáðàíû ôëàæêè è ïåðåêëþ÷àòåëè, èíäåêñ
Value
óïðàâëåíèÿ âûáðàííîãî ðàçäåëà ñïèñêà èëè ÷èñëî,
óêàçûâàþùåå òåêóùåå ïîëîæåíèå ïîëîñû
ïðîêðóòêè èëè ñ÷åò÷èêà.
Âñå ýëåìåíòû Çíà÷åíèå òèïà Boolean, óêàçûâàþùåå, ÿâëÿåòñÿ
Visible
óïðàâëåíèÿ ëè ýëåìåíò óïðàâëåíèÿ âèäèìûì.

 òàáë. 9.6 ïåðå÷èñëåíû ñîáûòèÿ ýëåìåíòîâ óïðàâëåíèÿ, äëÿ êîòîðûõ âû


ìîæåòå íàïèñàòü ñîáñòâåííûå ïðîöåäóðû îáðàáîòêè ñîáûòèé. Êàæäûé ýëåìåíò
óïðàâëåíèÿ, êîòîðûé âû äîáàâèòå â ñâîþ ôîðìó, áóäåò èìåòü äîñòóï ê ýòèì ñî-
áûòèÿì.  ÷àñòíîñòè, äëÿ êíîïîê èñïîëüçóåòñÿ ñîáûòèå Click, à äëÿ òîãî, ÷òî-
áû ïðîâåðèòü äàííûå èëè îáíîâèòü äðóãèå ýëåìåíòû óïðàâëåíèÿ, — After-
Update èëè Change.
Òàáëèöà 9.6. Íàèáîëåå ÷àñòî èñïîëüçóåìûå ñîáûòèÿ îáúåêòîâ óïðàâëåíèÿ

Ñîáûòèå Ñèíòàêñèñ ïðîöåäóðû îáðàáîòêè Îïèñàíèå


äëÿ ýëåìåíòà Frame:
Private Sub
object_AddControl() Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà
ê ôîðìå (èëè ýëåìåíòàì Frame,
AddControl äëÿ ýëåìåíòà MultiPage: Page, MultiPage) äîáàâëÿåòñÿ
Private Sub êàêîé-ëèáî ýëåìåíò óïðàâëåíèÿ.
object_AddControl(index As
Long, ctrl As Control)
Private Sub Èíèöèèðóåòñÿ ïîñëå îáíîâëåíèÿ
AfterUpdate
object_AfterUpdate() çíà÷åíèÿ ýëåìåíòà óïðàâëåíèÿ.
Èíèöèèðóåòñÿ ïîñëå òîãî, êàê
Private Sub
áûëî èçìåíåíî çíà÷åíèå ýëåìåíòà
object_BeforeUpdate(ByVal
BeforeUpdate óïðàâëåíèÿ, íî ïåðåä òåì, êàê
Cancel As
áûë îáíîâëåí ñàì ýëåìåíò
MSForms.ReturnBoolean)
óïðàâëåíèÿ.
Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà
Change Private Sub object_Change() èçìåíÿåòñÿ çíà÷åíèå ýëåìåíòà
óïðàâëåíèÿ.
Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà
Click Private Sub object_Click() ïî ýëåìåíòó óïðàâëåíèÿ ùåëêàþò
ìûøüþ.
Ýëåìåíòû äèàëîãîâûõ îêîí 365

Ñîáûòèå Ñèíòàêñèñ ïðîöåäóðû îáðàáîòêè Îïèñàíèå


Private Sub Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà
DblClick object_DblClick(ByVal Cancel ïî ýëåìåíòó óïðàâëåíèÿ äâàæäû
As MSForms.ReturnBoolean) ùåëêàþò ìûøüþ.
Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà
Enter Private Sub object_Enter()
âûäåëÿåòñÿ ýëåìåíò óïðàâëåíèÿ.
Private Sub Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà
Exit object_Exit(ByVal Cancel As ñ ýëåìåíòà óïðàâëåíèÿ ñíèìàåòñÿ
MSForms.ReturnBoolean) âûäåëåíèå.
Èíèöèèðóåòñÿ âñÿêèé ðàç, êîãäà
Private Sub
ýëåìåíò óïðàâëåíèÿ
object_Error(Index As Long,
îáíàðóæèâàåò îøèáêó è íå ìîæåò
Error ByVal Number As integer,
âîçâðàòèòü èíôîðìàöèþ îá
ByVal Description As
îøèáêå â âûçûâàþùóþ
MSForms.ReturnString)
ïðîãðàììó.
Èíèöèèðóåòñÿ ïðè íàæàòèè
Private Sub
ïîëüçîâàòåëåì êàêîé-ëèáî
object_KeyDown(ByVal KeyCode
KeyDown êëàâèøè â òîò ìîìåíò, êîãäà
As MSForms.ReturnInteger,
ôîðìà âûïîëíÿåòñÿ è èìååò
ByVal Shift As fmShiftState)
ôîêóñ.
Private Sub
Èíèöèèðóåòñÿ, êîãäà
object_KeyPress(ByVal
KeyPress ïîëüçîâàòåëü íàæèìàåò
KeyANSI As
àëôàâèòíî-öèôðîâóþ êëàâèøó.
MSForms.ReturnInteger)
Private Sub
object_KeyUp(ByVal KeyCode Èíèöèèðóåòñÿ, êîãäà
KeyUp
As MSForms.ReturnInteger, ïîëüçîâàòåëü îòïóñêàåò êëàâèøó.
ByVal Shift As fmShiftState)
Èíèöèèðóåòñÿ, êîãäà èçìåíÿþòñÿ
Layout Private Sub object_Layout() ðàçìåðû ýëåìåíòà Frame (èëè
MultiPage).
366 Ãëàâà 9

Ñîáûòèå Ñèíòàêñèñ ïðîöåäóðû îáðàáîòêè Îïèñàíèå


äëÿ ýëåìåíòîâ MultiPage
è TabStrip:
Private Sub
object_MouseDown( index As
Long, ByVal Button As
fmButton, ByVal Shift As
fmShiftState, ByVal X As
Single, ByVal Y As Single)
Private Sub object_MouseUp(
index As Long, ByVal Button
As fmButton, ByVal Shift As Èíèöèèðóþòñÿ ïðè ùåë÷êå
fmShiftState, ByVal X As ìûøüþ. MouseDown: êîãäà
MouseDown, Single, ByVal Y As Single) ïîëüçîâàòåëü íàæèìàåò íà
MouseUp äëÿ äðóãèõ ýëåìåíòîâ êëàâèøó ìûøè; MouseUp: êîãäà
óïðàâëåíèÿ: ïîëüçîâàòåëü îòïóñêàåò êëàâèøó
Private Sub ìûøè.
object_MouseDown( ByVal
Button As fmButton, ByVal
Shift As fmShiftState, ByVal
X As Single, ByVal Y As
Single)
Private Sub object_MouseUp(
ByVal Button As fmButton,
ByVal Shift As fmShiftState,
ByVal X As Single, ByVal Y
As Single)
äëÿ ýëåìåíòîâ MultiPage
è TabStrip:
Private Sub
object_MouseMove(index As
Long, ByVal Button As
fmButton, ByVal Shift As
fmShiftState, ByVal X As
Single, ByVal Y As Single) Èíèöèèðóåòñÿ, êîãäà
MouseMove
äëÿ äðóãèõ ýëåìåíòîâ ïîëüçîâàòåëü ïåðåìåùàåò ìûøü.
óïðàâëåíèÿ:
Private Sub
object_MouseMove(ByVal
Button As fmButton, ByVal
Shift As fmShiftState, ByVal
X As Single, ByVal Y As
Single)
Ñîáûòèå SpinDown èíèöèèðóåòñÿ,
êîãäà ïîëüçîâàòåëü ùåëêàåò
Private Sub ñòðåëêó «âíèç» (èëè «âëåâî»)
SpinDown,
object_SpinDown() êíîïêè ñ÷åò÷èêà. Ñîáûòèå SpinUp
SpinUp
Private Sub object_SpinUp() èíèöèèðóåòñÿ, êîãäà ïîëüçîâàòåëü
ùåëêàåò ñòðåëêó «ââåðõ» (èëè
«âïðàâî») êíîïêè ñ÷åò÷èêà.
Ýëåìåíòû äèàëîãîâûõ îêîí 367

Ñîáûòèå Ñèíòàêñèñ ïðîöåäóðû îáðàáîòêè Îïèñàíèå


Private Sub
Èíèöèèðóåòñÿ ïðè èçìåíåíèè
Zoom object_Zoom(index As Long,
ñâîéñòâà Zoom.
Percent As Integer)

Èñïîëüçîâàíèå Toolbox (ïàíåëè ýëåìåíòîâ)


Ïðåæäå ÷åì ìû ðàññìîòðèì ïðèìåðû îáðàáîòêè ñîáûòèé, ñâÿçàííûõ ñ ýëå-
ìåíòàìè óïðàâëåíèÿ, âàì ñëåäóåò íàó÷èòüñÿ ïîìåùàòü ýëåìåíòû óïðàâëåíèÿ
íà ôîðìó è çàäàâàòü èì íåîáõîäèìûå ñâîéñòâà.
Ðåäàêòîð VB â ðåæèìå ðàçðàáîòêè âìåñòå ñ ôîðìîé âûâîäèò íà ýêðàí
Toolbox (ïàíåëü ýëåìåíòîâ) (åñëè âûâîä ýòîé ïàíåëè íå îòêëþ÷åí ïðè ïîìîùè
ìåíþ View | Toolbox). Íà ðèñ. 9.5 Toolbox ïîêàçàíà â âèäå ïëàâàþùåãî îêíà.
Êíîïêè íà ïàíåëè Toolbox àêòèâèçèðóþò ðàçëè÷íûå èíñòðóìåíòû, êîòîðûå ïî-
çâîëÿþò ïîìåùàòü íà ôîðìó ýëåìåíòû óïðàâëåíèÿ (íà ðèñ. 9.5 ïðèâåäåíà
ïàíåëü Excel).

Ðèñ. 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

Toolbox (ïîäîáíî âñåì äðóãèì ïàíåëÿì èíñòðóìåíòîâ) ìîæíî íàñòðàèâàòü.


Åñëè âû èëè äðóãîé ïîëüçîâàòåëü óñòàíîâèëè äîïîëíèòåëüíûå ýëåìåíòû
óïðàâëåíèÿ íåçàâèñèìûõ ïðîèçâîäèòåëåé èëè ïðîèçâåëè íàñòðîéêó ïàíåëè,
îíà ìîæåò âûãëÿäåòü èíà÷å, ÷åì òà, ÷òî ïîêàçàíà íà ðèñ. 9.5. Íà ðèñ. 9.5 ïðè-
ñóòñòâóþò òîëüêî ñòàíäàðòíûå ýëåìåíòû óïðàâëåíèÿ, ïîñòàâëÿåìûå âìåñòå
ñ VBA.
×òîáû âîñïîëüçîâàòüñÿ ïàíåëüþ Toolbox äëÿ äîáàâëåíèÿ ýëåìåíòîâ óïðàâëå-
íèÿ ê âàøåé ôîðìå, âûïîëíèòå ñëåäóþùèå äåéñòâèÿ:
1. Ùåëêíèòå íà Toolbox ïî êíîïêå, ñîîòâåòñòâóþùåé ýëåìåíòó óïðàâëåíèÿ,
êîòîðûé âû õîòèòå äîáàâèòü ê ôîðìå. Óêàçàòåëü ìûøè èçìåíèò ôîðìó
íà ïåðåêðåñòèå, êîãäà áóäåò íàõîäèòüñÿ íà ôîðìå.
2. Óñòàíîâèòå ïåðåêðåñòèå â òî ìåñòî ôîðìû, â êîòîðîì õîòèòå ïîìåñòèòü
âåðõíèé ëåâûé óãîë íîâîãî ýëåìåíòà óïðàâëåíèÿ.
368 Ãëàâà 9

3. Íàæìèòå è óäåðæèâàéòå ëåâóþ êíîïêó ìûøè.


4. Ïåðåìåùàéòå ìûøü âíèç è âïðàâî, ïîêà ýëåìåíò óïðàâëåíèÿ íå ïðèìåò
íóæíûé ðàçìåð, ïîñëå ÷åãî îòïóñòèòå êíîïêó ìûøè. Ðåäàêòîð VB âñòà-
âèò â ôîðìó ýëåìåíò óïðàâëåíèÿ, è óêàçàòåëü ìûøè âíîâü ïðèìåò ôîðìó
ñòðåëêè.
Âû ìîæåòå èçìåíèòü ðàçìåð ñàìîé ôîðìû. Ùåëêíèòå ïî ñòðîêå çàãîëîâêà
ôîðìû äëÿ åå âûäåëåíèÿ è çàòåì, ïåðåìåùàÿ îäèí èç ìàðêåðîâ èçìåíåíèÿ ðàç-
ìåðîâ, óâåëè÷üòå èëè óìåíüøèòå ðàçìåð ôîðìû äî æåëàåìîãî. Ìàðêåðû èçìå-
íåíèÿ ðàçìåðîâ (sizing handles) — ýòî ìàëåíüêèå êâàäðàòèêè, êîòîðûå ïîÿâëÿ-
þòñÿ â óãëàõ è íà ñåðåäèíàõ ñòîðîí ãðàôè÷åñêîãî îáúåêòà (íàðÿäó ñ òîëñòîé ñå-
ðîé ãðàíèöåé) ïðè âûäåëåíèè îáúåêòà.

Äîáàâëåíèå ê ôîðìå ýëåìåíòîâ óïðàâëåíèÿ


Êîãäà âû ñîçäàåòå íîâóþ ôîðìó, ðåäàêòîð VB ïðåäîñòàâëÿåò ÷èñòóþ (áåç ýëå-
ìåíòîâ óïðàâëåíèÿ) ôîðìó (ñìîòðè ðèñ. 9.1). Âû ìîæåòå äîáàâèòü ê ôîðìå ýëå-
ìåíòû óïðàâëåíèÿ ñ èñïîëüçîâàíèåì ðàçëè÷íûõ èíñòðóìåíòîâ ïàíåëè Toolbox.
×òîáû äîáàâèòü ê ôîðìå ýëåìåíò óïðàâëåíèÿ, èñïîëüçóéòå ïàíåëü Toolbox,
êàê îïèñàíî â ïðåäûäóùåì ïàðàãðàôå ýòîé ãëàâû.  êà÷åñòâå ïðèìåðà äîáàâ-
ëåíèÿ ê ôîðìå êîíêðåòíîãî ýëåìåíòà äîáàâüòå íà íîâóþ ôîðìó êíîïêó, âûïîë-
íèâ ñëåäóþùèå äåéñòâèÿ:
1. Âûáåðèòå êîìàíäó Insert | UserForm (Âñòàâêà | UserForm). Ðåäàêòîð VB äî-
áàâèò íîâóþ ôîðìó, îòîáðàæàÿ åå â ðåæèìå ðàçðàáîòêè, è, êðîìå òîãî,
íà ýêðàíå ïîÿâèòñÿ Toolbox.
2. Ùåëêíèòå íà ýëåìåíòå CommandButton ïàíåëè Toolbox. Êíîïêà ïåðåéäåò
â «óòîïëåííîå» ñîñòîÿíèå, óêàçûâàÿ âûáðàííûé âàìè ýëåìåíò.
3. Ïîìåñòèòå êóðñîð ìûøè íà ôîðìó. Êóðñîð ïðè ýòîì èçìåíèò ñâîþ ôîð-
ìó íà ïåðåêðåñòèå ñ ïðèêðåïëåííûì ê íåìó ñèìâîëîì âûáðàííîãî ýëå-
ìåíòà.
4. Ïîìåñòèòå ïåðåêðåñòèå â òó òî÷êó ôîðìû, â êîòîðîé äîëæåí áûòü âåðõ-
íèé ëåâûé óãîë êíîïêè.
5. Ïåðåìåñòèòå êóðñîð ìûøè âíèç è âïðàâî, ÷òîáû íàðèñîâàòü ýëåìåíò
óïðàâëåíèÿ CommandButton. Â ïðîöåññå ïåðåìåùåíèÿ êóðñîðà ìûøè ðå-
äàêòîð VB îòîáðàæàåò ïðÿìîóãîëüíûé êîíòóð, ïîêàçûâàþùèé ðàçìåð
êíîïêè.
6. Îòïóñòèòå êíîïêó ìûøè, êîãäà ðåøèòå, ÷òî CommandButton èìååò íåîá-
õîäèìûé ðàçìåð. Ðåäàêòîð VB ñîçäàñò ýëåìåíò óïðàâëåíèÿ CommandBut-
ton è ïîìåñòèò åãî íà ôîðìó. Íà ðèñ. 9.6 ïîêàçàíî, êàê âûãëÿäèò êíîï-
êà, ñðàçó æå ïîñëå òîãî, êàê áûëà ïîìåùåíà íà ôîðìó.
Äîáàâèâ ê ôîðìå êíîïêó, âû ìîæåòå çàìåòèòü, ÷òî âåðõíèé ëåâûé óãîë
êíîïêè (òàêæå êàê è ñàìà ãðàíèöà êíîïêè) àâòîìàòè÷åñêè âûðàâíèâàåòñÿ ïî
øàáëîíó ñåòêè íà ôîðìå. Ýòî äåéñòâèå, íàçûâàåìîå ïðèâÿçêà ê ñåòêå (snap to
grid), ïîìîæåò âàì âûðîâíÿòü ðàçìåùåííûå íà ôîðìå ýëåìåíòû óïðàâëåíèÿ
è òåêñò. Âû ìîæåòå âêëþ÷àòü è îòêëþ÷àòü ïðèâÿçêó ê ñåòêå, íàñòðàèâàòü øàã
ñåòêè èëè ñêðûâàòü åå, èçìåíÿÿ óñòàíîâêè â äèàëîãîâîì îêíå Option (Ïàðàìåò-
ðû) ðåäàêòîðà VB. Âûáåðèòå Tools | Options (Ñåðâèñ | Ïàðàìåòðû) è ùåëêíèòå ïî
âêëàäêå General (îáùèå), ÷òîáû âûâåñòè Form Grid Settings (Ïàðàìåòðû ñåòêè
â ôîðìå). Âûáåðèòå èëè ñáðîñüòå íåîáõîäèìûå îïöèè.
Ýëåìåíòû äèàëîãîâûõ îêîí 369

Âñå ýëåìåíòû óïðàâëåíèÿ ôîðìû äîëæíû èìåòü óíèêàëüíûå èìåíà. Ýòè


èìåíà ñëåäóåò èñïîëüçîâàòü ïðè ññûëêàõ íà ýëåìåíò óïðàâëåíèÿ â ñâîåé ïðî-
ãðàììå. Âñÿêèé ðàç, êîãäà âû äîáàâëÿåòå ê ôîðìå íîâûé ýëåìåíò óïðàâëåíèÿ,
VBA ïðèñâàèâàåò åìó èìÿ ïî óìîë÷àíèþ, ñîñòîÿùåå èç èìåíè òèïà ýëåìåíòà
è íîìåðà. Åñëè êíîïêà, êîòîðóþ âû äîáàâèëè â íà÷àëå ýòîãî ðàçäåëà, ÿâëÿåòñÿ
ïåðâîé êíîïêîé, îíà ïîëó÷èò èìÿ CommandButton1. Ñëåäóþùàÿ äîáàâëåííàÿ
Ðèñ. 9.6
UserForm1 ñðàçó æå ïîñëå
äîáàâëåíèÿ ýëåìåíòà CommandButton

âàìè êíîïêà áóäåò CommandButton2 è òàê äàëåå. Åñëè ïîñëå ýòîãî âû äîáàâèòå
ïîëå, îíî ïîëó÷èò èìÿ TextBox1.
Ïåðåä òåì êàê ïðîäîëæèòü ðàáîòó ñ ôîðìàìè, äàâàéòå äîãîâîðèìñÿ î íå-
ñëîæíûõ ïðàâèëàõ, êîòîðûå ïîìîãóò âàì ñ ïåðâûõ øàãîâ ñîçäàâàòü äèàëîãî-
âûå îêíà, ïî÷òè ïîõîæèå íà ïðîôåññèîíàëüíûå. Åñëè âû äî ñèõ ïîð íå îáðàùà-
ëè âíèìàíèÿ íà òî, ÷òî âñå îêíà «ñîëèäíûõ» ðàçðàáîò÷èêîâ èìåþò îáùèå ÷åð-
òû, òî ñåé÷àñ êàê ðàç òî âðåìÿ, êîãäà ýòî íóæíî ñäåëàòü. Íà ðèñ. 9.7 ïðèâåäåíà
ñõåìà, êîòîðîé ìîæíî ïðèäåðæèâàòüñÿ ïðè ðàçðàáîòêå ñâîèõ ïåðâûõ ôîðì.
Íàèìåíîâàíèå îêíà, êàê âû óæå çíàåòå, çàäàåòñÿ ñâîéñòâîì Caption ôîð-
ìû. Êíîïêà çàêðûòèÿ îêíà, åñëè íè÷åãî ñïåöèàëüíî íå ïðåäïðèíèìàòü, ïî

Ðèñ. 9.7
Ñõåìà òèïè÷íîãî
äèàëîãîâîãî
Windows-îêíà

óìîë÷àíèþ âñåãäà áóäåò â îêíå ïðèëîæåíèÿ. Åñëè îíà âàì íå íóæíà, òî ëó÷øå
îò íåå èçáàâèòüñÿ.
 «ïîëåçíîé» ÷àñòè îêíà ïîìåùàþòñÿ ôóíêöèîíàëüíî íåîáõîäèìûå ýëå-
ìåíòû óïðàâëåíèÿ, êîòîðûå îïðåäåëÿþòñÿ íàçíà÷åíèåì îêíà. Çäåñü ìîãóò
370 Ãëàâà 9

áûòü, íàïðèìåð, ýëåìåíòû äëÿ ââîäà íåêîòîðîé èíôîðìàöèè èëè èçìåíåíèÿ


íàñòðîåê ïðèëîæåíèÿ.
Ñ êíîïêîé ÎÊ îáû÷íî ñâÿçûâàþò ñîáûòèå, êîòîðîå ïîäâîäèò íåêîòîðûé
èòîã. Îáû÷íî â ïðîôåññèîíàëüíûõ ïðèëîæåíèÿõ âñå, ÷òî ââîäèòñÿ â äèàëîãî-
âîì îêíå, íå ñðàçó âñòóïàåò â äåéñòâèå, à òîëüêî ïîñëå òîãî, êàê ïîëüçîâàòåëü
ùåëêíåò êíîïêó OK. Ýòî äàåò âîçìîæíîñòü îòêàçàòüñÿ îò íåäîñòàòî÷íî îáäó-
ìàííûõ äåéñòâèé. Ðàçðàáîò÷èêó òàêèõ îêîí íå î÷åíü òðóäíî ñêîïèðîâàòü äàí-
íûå èç äèàëîãîâîãî îêíà â íåñêîëüêî ïåðåìåííûõ ïðåæäå, ÷åì ïðèñâîèòü èõ
êàêèì-ëèáî ñâîéñòâàì ýëåìåíòîâ óïðàâëåíèÿ, à ïîëüçîâàòåëþ óäîáíåå ðàáî-
òàòü ñ îêíîì, èç êîòîðîãî âñåãäà ìîæíî âûéòè áåç ïîñëåäñòâèé.
Èç ïðåäûäóùåãî àáçàöà, âèäèìî, ïîíÿòíî íàçíà÷åíèå êíîïêè Îòìåíà. Äî-
ïîëíèòåëüíîé åå ôóíêöèåé ÿâëÿåòñÿ âûõîä èç ïðîöåäóðû îáðàáîòêè ñîáûòèé
ôîðìû. Êíîïêà æå ÎÊ ìîæåò ðàçðåøèòü ïîëüçîâàòåëþ ïðîäîëæèòü ïóòåøåñò-
âèå «âíóòðü» ïðèëîæåíèÿ, êîòîðîå îòêðûëîñü äàííûì îêíîì (èíîãäà ãîâîðÿò
«ïàíåëüþ» èëè «äèàëîãîì»).
Êíîïêà Ñïðàâêà çíàêîìà âñåì «ñ äåòñòâà». Ê ñîæàëåíèþ, íå òàê ïðîñòî îðãà-
íèçîâàòü ïîìîùü, ïîäîáíóþ îáû÷íîé Windows-ñïðàâêå, íî ìîæíî ñíà÷àëà èñ-
ïîëüçîâàòü ýòó êíîïêó äëÿ ïðîñòûõ ïîäñêàçîê, êîòîðûå ñîçäàþòñÿ ïîìåùåíè-
åì íà ïóñòóþ ôîðìó ýëåìåíòà Label ñ òåêñòîì ïîäñêàçêè. Â äàëüíåéøåì, èçó-
÷èâ ñïîñîáû ïîñòðîåíèÿ ñëîæíûõ ñèñòåì ïîäñêàçîê, ìîæíî ñîçäàâàòü ïî÷òè
ïðîôåññèîíàëüíûå äèàëîãîâûå îêíà.
Ýòèõ íåõèòðûõ ïðàâèë, êîíå÷íî æå, âàì õâàòèò ïðè ïðîåêòèðîâàíèè íå-
ñëîæíûõ ôîðì. Ïðè ñîçäàíèè «õîðîøèõ» ôîðì ñëåäóåò îçíàêîìèòüñÿ ñ ðåêî-
ìåíäàöèÿìè ôèðìû Microsoft. Ýòè ðåêîìåíäàöèè èìåþò îòíîøåíèå ê ñëåäóþ-
ùèì àñïåêòàì:
¨ Ðàçìåùåíèå ýëåìåíòîâ óïðàâëåíèÿ íà ôîðìå (â òîì ÷èñëå è óñòàíîâêà èí-
òåðâàëîâ ìåæäó ýëåìåíòàìè).
¨ Âûðàâíèâàíèå ìåòîê (ìåòêè äîëæíû áûòü õîðîøèìè ïóòåâîäèòåëÿìè
ôîðìû).
¨ Èñïîëüçîâàíèå ñòàíäàðòíûõ øðèôòîâ (÷àñòî ïîëüçîâàòåëè ñîáèðàþò ïî
âñåìó ñâåòó èíòåðåñíûå øðèôòû è çàáûâàþò î òîì, ÷òî òàêèå øðèôòû ìî-
ãóò îòñóòñòâîâàòü ó äðóãèõ).
¨ Èñïîëüçîâàíèå öâåòà.
Ïðè ðàçìåùåíèè íà ôîðìå íåñêîëüêèõ ýëåìåíòîâ óïðàâëåíèÿ, êîòîðûå
ìîæíî óñëîâíî ðàçäåëèòü íà îòäåëüíûå ãðóïïû, ñëåäóåò èñïîëüçîâàòü ýëåìåíò
frame (ðàìêà). Ïðè ýòîì æåëàòåëüíî ïîëüçîâàòüñÿ ñâîéñòâîì, îïðåäåëÿþùèì
çàãîëîâîê ðàìêè.
Äëÿ áîëåå ëåãêîãî ÷òåíèÿ ïîëåé, ðàñïîëîæåííûõ äðóã ïîä äðóãîì, íåîáõî-
äèìî âûðàâíèâàòü èõ ïî ëåâîìó êðàþ.
Äëÿ âñåõ ýëåìåíòîâ óïðàâëåíèÿ èñïîëüçóéòå â êà÷åñòâå øðèôòà íîðìàëü-
íûé Sans Serif 8-ïóíêòîâ. Êîíå÷íî, ñëåäóåò ó÷èòûâàòü è çàïðîñû ïîòåíöèàëü-
íîãî ïîëüçîâàòåëÿ âàøåãî ïðîäóêòà, íî ïðè ïîäãîòîâêå òåñòîâîãî âàðèàíòà äëÿ
îáñóæäåíèÿ ñíà÷àëà íåîáõîäèìî ïðèäåðæèâàòüñÿ ðåêîìåíäàöèé Microsoft.
Ñàìûå îáû÷íûå ñåðûå öâåòà, êîòîðûå âû ìîæåòå âèäåòü âî âñåõ èçâåñòíûõ
ïðîäóêòàõ Windows, ðåêîìåíäóþòñÿ è äëÿ âàøèõ ïðèëîæåíèé. Õîòÿ â âàøåì
ðàñïîðÿæåíèè èìååòñÿ áîëüøîå êîëè÷åñòâî öâåòîâ, âñå ðàâíî áåç îñîáîé íóæ-
äû íå ñëåäóåò èçìåíÿòü öâåòà ïî óìîë÷àíèþ. Åñëè æå âû ìîæåòå ïðåäîñòàâèòü
Ýëåìåíòû äèàëîãîâûõ îêîí 371

ïîëüçîâàòåëþ ðàáîòàþùåãî ïðèëîæåíèÿ ñàìîìó èçìåíÿòü öâåòà ôîðìû è ýëå-


ìåíòîâ óïðàâëåíèÿ íà íåé, ýòî áóäåò îïèìàëüíûì âàðèàíòîì.
Ðèñ. 9.8
Ôîðìà ñ ñàìûìè
íåîáõîäèìûìè
êíîïêàìè

Èòàê, åñëè âû ñîãëàñíû ñ ïðåäëàãàåìûìè ïðàâèëàìè, ñîçäàéòå ñâîþ ïåðâóþ


ôîðìó â ñîîòâåòñòâèè ñî ñõåìîé ðèñ. 9.7, êàê ýòî ïîêàçàíî íà ðèñ. 9.8.
 ñëåäóþùåé òàáëèöå ïðèâåäåíû çíà÷åíèÿ ñâîéñòâ ýëåìåíòîâ óïðàâëåíèÿ,
êîòîðûå áûëè èçìåíåíû. Äëÿ ñâîèõ ïðèëîæåíèé â êà÷åñòâå äîêóìåíòàöèè âû
òîæå ìîæåòå ñîçäàâàòü òàêèå òàáëèöû äëÿ îáëåã÷åíèÿ ñîïðîâîæäåíèÿ ñâîåãî
ïðîãðàììíîãî ïðîäóêòà.

Ñâîéñòâî,
Òèï ýëåìåíòà êîòîðîå Çíà÷åíèå Ïðèìå÷àíèå
èçìåíåíî
Èìÿ ôîðìû, íà êîòîðîå ìîæíî
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 Ñïðàâêà Òåêñò íà êíîïêå.

 VBA (êàê è â Microsoft Visual Basic) êíîïêè (ýëåìåíòû CommandButton)


èìåþò ñïåöèàëüíîå ñâîéñòâî Cancel, êîòîðîå îïðåäåëÿåò êíîïêó Îòìåíà (íåçà-
âèñèìî îò òîãî, íàçûâàåòñÿ ëè ýòà êíîïêà Îòìåíà). Òîëüêî îäíà êíîïêà ôîðìû
ìîæåò èìåòü ñâîéñòâî Cancel, óñòàíîâëåííîå ðàâíûì True. Åñëè çàäàòü ýòî
ñâîéñòâî äëÿ îäíîé èç êíîïîê, àíàëîãè÷íîå ñâîéñòâî äëÿ âñåõ îñòàëüíûõ êíî-
ïîê ôîðìû áóäåò óñòàíîâëåíî ðàâíûì False. Åñëè ôîðìà ñîäåðæèò êíîïêó
ñ óñòàíîâëåííûì ñâîéñòâîì Cancel, òî íàæàòèå êëàâèøè Esc ïðèâîäèò ê òîìó
æå ðåçóëüòàòó, ÷òî è ùåë÷îê ïî êíîïêå.
Åñëè âû çàïóñòèòå ôîðìó íà âûïîëíåíèå (êîìàíäîé Run | Run Sub/UserForm),
òî íè ùåë÷îê íà êíîïêå, íè íàæàòèå êëàâèøè Esc íå ïðèâåäóò íè ê êàêîìó ðå-
çóëüòàòó, òàê êàê ñ êíîïêîé íå ñâÿçàíî íèêàêîãî ñîáûòèÿ. Íî äèàëîãîâîå îêíî
ïîÿâèòñÿ íà ýêðàíå â ðåæèìå âûïîëíåíèÿ è áóäåò ñîçäàâàòü âïå÷àòëåíèå ÷å-
ãî-òî ðàáîòàþùåãî (ðèñ. 9.9).
Åñëè âû áóäåòå ùåëêàòü êíîïêè ýòîãî îêíà, òî óáåäèòåñü â òîì, ÷òî îêíî ñî-
âåðøåííî «íå÷óâñòâèòåëüíî» ê âàøèì ìàíèïóëÿöèÿì. Åäèíñòâåííàÿ êíîïêà,
êîòîðàÿ áóäåò ðåàãèðîâàòü íà âàøè äåéñòâèÿ, íàõîäèòñÿ ââåðõó ñïðàâà (ñ èçî-
áðàæåíèåì ïåðåêðåñòèÿ). Ýòà êíîïêà çàêðîåò îêíî.
×òîáû êíîïêè, ïîìåùåííûå âàìè íà äèàëîãîâîé ïàíåëè, «îæèëè», íåîáõî-
äèìî äëÿ êàæäîé èç íèõ íàïèñàòü ïðîöåäóðû îáðàáîòêè ñîáûòèé Click (ùåë-
÷îê íà êíîïêå). Íà÷íåì ñ êíîïêè Îòìåíà, ÷òîáû âñåãäà èìåòü âîçìîæíîñòü âûé-
òè èç ïðèëîæåíèÿ. Ñâÿæåì ñ ùåë÷êîì íà êíîïêå Îòìåíà ïðîãðàììó, êîòîðàÿ
âûãðóçèò ôîðìó, ÷òî ïðèâåäåò ê îêîí÷àíèþ ðàáîòû ñ äèàëîãîâûì îêíîì. Äëÿ
ñîçäàíèÿ ïðîöåäóðû îáðàáîòêè ñîáûòèÿ äâàæäû ùåëêíèòå íà êíîïêå Îòìåíà
â ðåæèìå ðàçðàáîòêè è â ïîÿâèâøåìñÿ øàáëîíå ïðîöåäóðû îáðàáîòêè ñîáûòèÿ
ââåäèòå îïåðàòîð âûãðóçêè ôîðìû, êàê ýòî ïðåäñòàâëåíî â ëèñòèíãå 9.4.

Ëèñòèíã 9.4. Ïðîöåäóðà îáðàáîòêè ñîáûòèÿ — ùåë÷îê íà êíîïêå Îòìåíà


1: Private Sub CmdCancel _Click()
2: Unload Me 'Âûãðóæàåì ôîðìó, çàêàí÷èâàÿ ïðèëîæåíèå
3: End Sub

Ñíîâà çàïóñòèòå ôîðìó íà âûïîëíåíèå. Âû óâèäèòå òî æå äèàëîãîâîå îêíî,


÷òî è íà ðèñ. 9.9, íî òåïåðü ýòî îêíî — «íàñòîÿùåå» äèàëîãîâîå, ïîòîìó ÷òî
ïðè ùåë÷êå íà êíîïêå Îòìåíà âûïîëíÿåòñÿ ïðîãðàììà îáðàáîòêè ñîáûòèÿ
Ýëåìåíòû äèàëîãîâûõ îêîí 373

è îêíî çàêðûâàåòñÿ. Áîëåå òîãî, ïðè íàæàòèè íà êëàâèøó Esc âû ïîëó÷àåòå


òî÷íî òîò æå ðåçóëüòàò! Ïîíÿòíî, ÷òî ïðîöåäóðà îáðàáîòêè ñîáûòèÿ Click
(èìåííî ýòî ñîáûòèå è ñâÿçàíî ñ êíîïêîé) ìîæåò âûïîëíèòü è áîëåå ñåðüåçíóþ
ðàáîòó, ÷åì ïðîñòàÿ âûãðóçêà ôîðìû. ×òîáû ýòî áûëî äåéñòâèòåëüíî ïîíÿòíî,

Ðèñ. 9.9
Òàêîå îêíî òîæå «èìååò ïðàâî»
íàçûâàòüñÿ «äèàëîãîâûì»

äîáàâèì ê ïðîöåäóðå âûâîä ñîîáùåíèÿ î òîì, ÷òî âîçìîæåí âûõîä èç äèàëîãà


(ñì. ëèñòèíã 9.5).

Ëèñòèíã 9.5. Áîëåå «ïðîäâèíóòàÿ» ïðîöåäóðà îáðàáîòêè ñîáûòèÿ —


ùåë÷îê íà êíîïêå Îòìåíà

1: Private Sub CmdCancel _Click()


2: 'îáúÿâëåíèå ïåðåìåííûõ
3: Dim Msg, Title, Response As String
4:
5: 'âûäàâàåìîå â îêíå MsgBox ñîîáùåíèå
6: Msg = "Õîòèòå çàêîí÷èòü ðàáîòó?"
7:
8: 'ñîñòàâ êíîïîê è òèï çíà÷êà
9: Style = vbYesNo + vbCritical + vbDefaultButton2
10:
11: 'çàãîëîâîê îêíà
12: Title = "Âûõîä èç ïðîãðàììû"
13:
14: 'âûçîâ ôóíêöèè MsgBox ñ âîçâðàùàåìûì çíà÷åíèåì
15: Response = MsgBox(Msg, Style, _
16: Title)
17: 'àíàëèç âîçâðàùàåìîãî çíà÷åíèÿ
18: If Response = vbYes Then
19: Unload Me 'âûãðóçêà ôîðìû
20: End If
21:
22: End Sub

Åñëè âû çàïóñòèòå ôîðìó ñ òàêîé ïðîöåäóðîé îáðàáîòêè ñîáûòèÿ Click


è ùåëêíèòå íà êíîïêå Îòìåíà èëè íàæìåòå êëàâèøó Esc, òî íà ýêðàí áóäåò âû-
äàíî ñîîáùåíèå, ïîäîáíîå ïðèâåäåííîìó íà ðèñ. 9.10. Ýòà ïðîöåäóðà ñòàëà áî-
ëåå äðóæåñòâåííîé, ïîñêîëüêó íå ñðàçó çàêàí÷èâàåò ðàáîòó îêíà äèàëîãà. Ñëó-
÷àéíûé ùåë÷îê íà êíîïêå Îòìåíà èëè íàæàòèå íà êëàâèøó Esc íå ïðèâåäóò
ê íåìåäëåííîìó îêîí÷àíèþ ðàáîòû ñ äèàëîãîì.
374 Ãëàâà 9

Òåïåðü, êîãäà ó íàñ èìååòñÿ âîçìîæíîñòü ïîêèíóòü äèàëîãîâîå îêíî, ìîæíî


íàïèñàòü ïðîñòûå ïðîöåäóðû îáðàáîòêè ñîáûòèé äëÿ êíîïîê ÎÊ è Ñïðàâêà.
Êíîïêà ÎÊ â íà÷àëå ðàçðàáîòêè ïðèëîæåíèÿ ìîæåò áûòü ñâÿçàíà ñ ïðîöåäó-
ðîé, âûäàþùåé ñîîáùåíèå î òîì, ÷òî ïðèëîæåíèå ïîêà íå ãîòîâî ê ýêñïëóàòà-
öèè. Ñ êíîïêîé Ñïðàâêà äëÿ âàøèõ ïåðâûõ ïðèëîæåíèé ìîæíî ïîñòóïèòü
ïî-ðàçíîìó: íàïðèìåð, îäíèì èç ðåøåíèé ìîæåò áûòü âûäà÷à äëèííîãî ñîîá-
Ðèñ. 9.10
Ïðîöåäóðà îáðàáîòêè ñîîáùåíèÿ îò
êíîïêè Îòìåíà ñòàëà áîëåå
äðóæåñòâåííîé

ùåíèÿ ïîñðåäñòâîì ôóíêöèè MsgBox, à ìîæíî ñîçäàòü íîâîå äèàëîãîâîå îêíî


ñ ýëåìåíòîì Label, ñâîéñòâîì Caption êîòîðîãî áóäåò òàêæå äëèííîå ñîîáùå-
íèå î ïîëåçíîñòè ïðèëîæåíèÿ. Äàëåå áóäåò ðàññìîòðåíî ñîçäàíèå è âûçîâ äî-
ïîëíèòåëüíîãî äèàëîãîâîãî îêíà ïðèëîæåíèÿ.
Î÷åíü ïîëåçíîé ìîæåò îêàçàòüñÿ ïðîöåäóðà îáðàáîòêè ñîáûòèÿ Change —
ïðè ëþáîì èçìåíåíèè ñâîéñòâ ýëåìåíòîâ óïðàâëåíèÿ (â êîíå÷íîì èòîãå, âñå,
÷òî ïðîèñõîäèò â äèàëîãîâîì îêíå — ýòî èçìåíåíèå òåõ èëè èíûõ ñâîéñòâ)
ìîæíî âûïîëíÿòü íåêîòîðûå ïðîâåðêè íà äîïóñòèìîñòü èçìåíåíèé è ñîîáùàòü
ïîëüçîâàòåëþ î âîçìîæíûõ ïðîáëåìàõ. Ìîæíî òàêæå èñïîëüçîâàòü ñîáûòèå
Change äëÿ ïîäñêàçêè ïîëüçîâàòåëþ î ïðîèñõîäÿùèõ èçìåíåíèÿõ ñî ñâîéñòâà-
ìè ýëåìåíòîâ óïðàâëåíèÿ.  êà÷åñòâå ïðèìåðà ñîçäàéòå ôîðìó UserForm1 òàê,
÷òîáû îíà áûëà ïîõîæà íà ïðåäñòàâëåííóþ íà ðèñ. 9.11. ×òîáû ñîîòâåòñòâóþ-
ùåå ôîðìå äèàëîãîâîå îêíî ïîçâîëèëî ïðîäîëæèòü ðàáîòó ñ ïðèëîæåíèåì,
â ýòîì îêíå íåîáõîäèìî â îäíîì èç òåêñòîâûõ ïîëåé ââåñòè ëèáî ôàìèëèþ,
ëèáî èìÿ ïîëüçîâàòåëÿ. Ïðè èçìåíåíèè ñîäåðæèìîãî ëþáîãî ïîëÿ (ñâîéñòâî
Text) èíèöèèðóåòñÿ ïðîöåäóðà îáðàáîòêè ñîáûòèÿ Change, â êîòîðîé ñâîéñòâó
Enable êíîïêè ÎÊ_button (ñ çàãîëîâêîì ÎÊ) ïðèñâàèâàåòñÿ çíà÷åíèå True.

Ðèñ. 9.11
Ôîðìà äëÿ òåñòèðîâàíèÿ
ñîáûòèÿ Change äëÿ TextBox
Ýëåìåíòû äèàëîãîâûõ îêîí 375

Êíîïêà ÎÊ_button ïðåäíàçíà÷åíà äëÿ èçìåíåíèÿ ñâîéñòâà Caption ôîðìû


UserForm2 è âûâîäà ýòîé ôîðìû íà ýêðàí. Êíîïêà ñ çàãîëîâêîì Îòìåíà âñåãäà
äîñòóïíà è ïðåäíàçíà÷åíà äëÿ âûõîäà èç ïðîãðàììû. Ñâîéñòâî Cancel ýòîé
êíîïêè èìååò çíà÷åíèå True.
Äëÿ ñîçäàíèÿ òàêîé ôîðìû âûïîëíèòå ñëåäóþùåå:
1. Ñîçäàéòå íîâóþ ôîðìó ñ èìåíåì ïî óìîë÷àíèþ UserForm1.  Properties
Window èçìåíèòå ñâîéñòâî Caption ýòîãî ýëåìåíòà íà Òåñòèðîâàíèå ñî-
áûòèÿ Change.
2. Ïîìåñòèòå íà ôîðìó UserForm1 ýëåìåíò Frame. Ïî óìîë÷àíèþ åãî èìÿ
áóäåò Frame1. Èçìåíèòå ñâîéñòâî Caption ýòîãî ýëåìåíòà íà Äàííûå
î ïîëüçîâàòåëå. (Ðàçìåðû ýëåìåíòà íå âàæíû.)
3. Ïîìåñòèòå íà ôîðìó â îáëàñòü Frame1 ýëåìåíò TextBox (ñ èìåíåì ïî
óìîë÷àíèþ TextBox1) è ýëåìåíò Label ñ çàãîëîâêîì (ñâîéñòâî Caption)
Ôàìèëèÿ. Èìÿ ìåòêè äëÿ äàííîãî ñëó÷àÿ íå èìååò çíà÷åíèÿ.
4. Ïîìåñòèòå íà ôîðìó â îáëàñòü Frame1 ýëåìåíò TextBox (ñ èìåíåì ïî
óìîë÷àíèþ TextBox2) è ýëåìåíò Label ñ çàãîëîâêîì Èìÿ.
5. Ïîìåñòèòå íà ôîðìó (ñì. ðèñ. 9.10) ýëåìåíò CommandButton è èçìåíèòå
åãî ñâîéñòâî Name íà Cancel_button, à ñâîéñòâî Caption íà Îòìåíà. Óñòà-
íîâèòå ñâîéñòâî Cancel â True, ÷òîáû ïðè íàæàòèè íà êëàâèøó Esc ïðî-
ãðàììà âûïîëíÿëà òó æå ïðîöåäóðó, ÷òî è ïðè ùåë÷êå íà êíîïêå Îòìåíà.
6. Ïîìåñòèòå íà ôîðìó ýëåìåíò CommandButton è èçìåíèòå åãî ñâîéñòâî
Name íà OK_button, à ñâîéñòâî Caption íà ÎÊ. Èçìåíèòå ñâîéñòâî
Enabled ýòîé êíîïêè íà False. Ýòèì âû ñäåëàåòå êíîïêó ÎÊ íåäîñòóï-
íîé äëÿ ïîëüçîâàòåëÿ ïîñëå âûäà÷è äèàëîãîâîãî îêíà íà ýêðàí â ðåæèìå
âûïîëíåíèÿ. ×òîáû êíîïêà ñòàëà äîñòóïíîé è ïðèëîæåíèå ìîãëî âûïîë-
íèòü êàêóþ-ëèáî ðàáîòó ñ èñïîëüçîâàíèåì êíîïêè ÎÊ, ïîëüçîâàòåëü äîë-
æåí áóäåò èçìåíèòü ñîäåðæèìîå îäíîãî èç òåêñòîâûõ îêîí.
7. Îòêðîéòå ìîäóëü êëàññà ôîðìû UserForm1 è çàïèøèòå â íåãî êîä, ïðåä-
ñòàâëåííûé â ëèñòèíãå 9.6.
8. Ñîçäàéòå ôîðìó UserForm2 (áåç ýëåìåíòîâ óïðàâëåíèÿ) è çàïèøèòå â ìî-
äóëü êëàññà ýòîé ôîðìû êîä, íàïðèìåð, èç ëèñòèíãà 9.2.

Ñâîéñòâî,
Òèï ýëåìåíòà êîòîðîå Çíà÷åíèå Ïðèìå÷àíèå
èçìåíåíî
Èìÿ ãëàâíîé ôîðìû, íà êîòîðîå
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 ãëàâíîé ïðè ùåë÷êå íà êíîïêå
ÎÊ.

Âûïîëíèòå êîìàíäó Run | Run Sub/UserForm. Åñëè âû íå áóäåòå ðåäàêòèðîâàòü


(èçìåíÿòü) ñîäåðæèìîå òåêñòîâûõ îêîí, âàì áóäåò äîñòóïíà òîëüêî êíîïêà
Âûõîä. Êàê òîëüêî âû èçìåíèòå ñîäåðæèìîå êàêîãî-ëèáî òåêñòîâîãî îêíà (Ôà-
ìèëèÿ èëè Èìÿ), èíèöèèðóåòñÿ ñîáûòèå Change è ñâîéñòâó Enabled êíîïêè
ÎÊ áóäåò ïðèñâîåíî çíà÷åíèå True (ñòðîêà 17 ëèñòèíãà 9.6). Òàê êàê ñ êíîïêîé
ÎÊ ñâÿçàíà ïðîöåäóðà îáðàáîòêè ñîáûòèÿ Click, êîòîðàÿ çàãðóæàåò ôîðìó
UserForm2, ïîëüçîâàòåëü ïîëó÷àåò âîçìîæíîñòü äàëüíåéøåé ðàáîòû. Ïðè
ýòîì ñâîéñòâó Caption ôîðìû ïðèñâàèâàåòñÿ ñóììà ñîäåðæèìîãî ïîëåé
TextBox1 è TextBox2.

Ëèñòèíã 9.6. Îáðàáîòêà ñîáûòèÿ Change


1: 'Îáðàáîòêà ñîáûòèÿ Click êíîïêè Âûõîä
2: Private Sub Cancel_button_Click()
3: MsgBox ("Çàêàí÷èâàåì ïðîãðàììó!")
4: Unload Me
5: End Sub
6:
7: 'Îáðàáîòêà ñîáûòèÿ Click êíîïêè ÎÊ
8: Private Sub OK_button_Click()
9:
10: 'Èçìåíèòü çàãîëîâîê äèàëîãîâîãî îêíà UserForm2
11: UserForm2.Caption = TextBox1.Text + TextBox2.Text
Ýëåìåíòû äèàëîãîâûõ îêîí 377

12: UserForm2.Show 'çàãðóçêà îêíà UserForm2


13: End Sub
14:
15: 'Îáðàáîòêà ñîáûòèÿ Change òåêñòîâîãî îêíà ñ ìåòêîé Ôàìèëèÿ
16: Private Sub TextBox1_Change()
17: Next_button.Enabled = True
18: End Sub
19:
20: 'Îáðàáîòêà ñîáûòèÿ Change òåêñòîâîãî îêíà ñ ìåòêîé Èìÿ
21: Private Sub TextBox2_Change()
22: Next_button.Enabled = True
23: End Sub

Ðåäàêòèðîâàíèå ýëåìåíòîâ óïðàâëåíèÿ íà ôîðìå


Ïîìåñòèâ íà ôîðìó ýëåìåíò óïðàâëåíèÿ, âû èìååòå âîçìîæíîñòü èçìåíÿòü
åãî ðàçìåðû, äâèãàòü, êîïèðîâàòü, óäàëÿòü, ôîðìàòèðîâàòü (èçìåíÿòü ðàçìåð,
ñòèëü, ãàðíèòóðó øðèôòà) èëè èçìåíÿòü åãî ñâîéñòâà (òàêèå êàê èìÿ, çàãîëî-
âîê è òàê äàëåå).

Âûáîð ýëåìåíòîâ óïðàâëåíèÿ


×òîáû îòðåäàêòèðîâàòü ýëåìåíò óïðàâëåíèÿ, âû äîëæíû ñíà÷àëà âûäåëèòü
åãî ùåë÷êîì ìûøè. Âûäåëåííûé ýëåìåíò èìååò ñåðóþ ãðàíèöó ñ ìàðêåðàìè
èçìåíåíèÿ ðàçìåðîâ, êàê ïîêàçàíî äëÿ êíîïêè íà ðèñ. 9.5. ×òîáû âûäåëèòü
íåñêîëüêî ýëåìåíòîâ óïðàâëåíèÿ ñðàçó, óäåðæèâàéòå íàæàòîé êëàâèøó Shift,
êîãäà ùåëêàåòå ïî ýëåìåíòàì óïðàâëåíèÿ, êîòîðûå õîòèòå âûäåëèòü. Âûäå-
ëÿòü ñðàçó íåñêîëüêî ýëåìåíòîâ óïðàâëåíèÿ èìååò ñìûñë, åñëè âû õîòèòå âû-
ïîëíèòü ôîðìàòèðîâàíèå, êîòîðîå áóäåò ðàñïðîñòðàíÿòüñÿ íà âñå ýëåìåíòû
ôîðìû. Ýòî ìîæåò áûòü, íàïðèìåð, èçìåíåíèå ðàçìåðà øðèôòà, ñòèëÿ èëè
ãàðíèòóðû. Âûáîð íåñêîëüêèõ ýëåìåíòîâ óïðàâëåíèÿ ìîæåò òàêæå îêàçàòüñÿ
ïîëåçíûì, åñëè âû õîòèòå ïåðåìåñòèòü ýòè ýëåìåíòû îäíîâðåìåííî.
Âû ìîæåòå âðåìåííî ñãðóïïèðîâàòü íåñêîëüêî ýëåìåíòîâ óïðàâëåíèÿ, âîñ-
ïîëüçîâàâøèñü êîìàíäîé Format | Group (Ôîðìàò | Ãðóïïèðîâàòü). Åñëè ýëåìåí-
òû óïðàâëåíèÿ ñãðóïïèðîâàíû, îíè âåäóò ñåáÿ êàê îäèí îáúåêò, êîãäà âû èõ
âûáèðàåòå, ïåðåìåùàåòå, êîïèðóåòå èëè ðåäàêòèðóåòå. Ýëåìåíòû óïðàâëåíèÿ
îñòàþòñÿ ñãðóïïèðîâàííûìè äî òåõ ïîð, ïîêà âû íå ïðèìåíèòå ê âûäåëåííîé
ãðóïïå êîìàíäó Format | Ungroup (Ôîðìàò | Ðàçäåëèòü).

Ïåðåìåùåíèå ýëåìåíòîâ óïðàâëåíèÿ


×òîáû ïåðåìåñòèòü ýëåìåíò óïðàâëåíèÿ íà íîâîå ìåñòî â ôîðìå, ñíà÷àëà
âûäåëèòå åãî. Ïîñëå ýòîãî ïîìåñòèòå óêàçàòåëü ìûøè ïîâåðõ ëþáîé ÷àñòè ñå-
ðîé ãðàíèöû, îêðóæàþùåé âûáðàííûé ýëåìåíò óïðàâëåíèÿ, çà èñêëþ÷åíèåì
ìàðêåðîâ èçìåíåíèÿ ðàçìåðîâ. Òåïåðü ùåëêíèòå è ïåðåòàùèòå ýòîò ýëåìåíò íà
íîâîå ìåñòî.

Èçìåíåíèå ðàçìåðîâ ýëåìåíòîâ óïðàâëåíèÿ


×òîáû èçìåíèòü ðàçìåð ýëåìåíòà óïðàâëåíèÿ, ñíà÷àëà âûäåëèòå ýòîò ýëå-
ìåíò. Ïîñëå ýòîãî ïîìåñòèòå êóðñîð ìûøè ïîâåðõ ëþáîãî èç ìàðêåðîâ èçìåíå-
íèÿ ðàçìåðîâ. Êîãäà êóðñîð íàõîäèòñÿ íà ìàðêåðå èçìåíåíèÿ ðàçìåðà, îí ìå-
378 Ãëàâà 9

íÿåò ñâîþ ôîðìó íà äâîéíóþ ñòðåëêó, ïîêàçûâàþùóþ íàïðàâëåíèå, â êîòîðîì


âû ìîæåòå èçìåíÿòü ðàçìåð âûáðàííîãî ýëåìåíòà óïðàâëåíèÿ. Òåïåðü íàæìè-
òå (íå îòïóñêàÿ) êíîïêó ìûøè è ïåðåäâèíüòå ìàðêåð èçìåíåíèÿ ðàçìåðà íà
íóæíîå ìåñòî. Â ïðîöåññå ïåðåìåùåíèÿ ðåäàêòîð VB áóäåò îòîáðàæàòü êîíòóð,
ïîêàçûâàþùèé íîâûå ãðàíèöû ýëåìåíòà óïðàâëåíèÿ. Êîãäà ýëåìåíò óïðàâëå-
íèÿ ñòàíåò òðåáóåìîãî ðàçìåðà, îòïóñòèòå êíîïêó ìûøè, ðåäàêòîð VB ïåðåðè-
ñóåò ýëåìåíò óïðàâëåíèÿ â ñîîòâåòñòâèè ñ âíîâü çàäàííûì ðàçìåðîì.

Êîïèðîâàíèå, âñòàâêà è óäàëåíèå ýëåìåíòîâ óïðàâëåíèÿ


Îäèí èç ñàìûõ ïðîñòûõ ñïîñîáîâ ñîçäàòü íåñêîëüêî îäèíàêîâûõ ýëåìåíòîâ
óïðàâëåíèÿ, òàêèõ êàê íåñêîëüêî ôëàæêîâ èëè êíîïîê, ñîñòîèò â òîì, ÷òîáû
ñíà÷àëà ñîçäàòü îäèí ýëåìåíò óïðàâëåíèÿ, ñêîïèðîâàòü åãî, ïîñëå ÷åãî ïîìåñ-
òèòü ñêîïèðîâàííûé ýëåìåíò â ôîðìó ñòîëüêî ðàç, ñêîëüêî íåîáõîäèìî. ×òîáû
ñêîïèðîâàòü ýëåìåíò óïðàâëåíèÿ, ïðîñòî âûáåðèòå åãî è çàòåì âîñïîëüçóéòåñü
êîìàíäîé Edit | Copy (Ïðàâêà | Êîïèðîâàòü) èëè íàæìèòå Ctrl+C.
Ïîñëå òîãî êàê ýëåìåíò óïðàâëåíèÿ ñêîïèðîâàí, âû ìîæåòå âñòàâèòü åãî
â òó æå èëè äðóãóþ ôîðìó, èñïîëüçóÿ êîìàíäó Edit | Paste (Ïðàâêà | Âñòàâèòü)
èëè íàæàâ Ctrl+V. Ïîñëå âûïîëíåíèÿ îïåðàöèè âñòàâêè ïåðåìåñòèòå ýëåìåíò
óïðàâëåíèÿ â ïðåäíàçíà÷åííîå äëÿ íåãî ìåñòî.
×òîáû óäàëèòü ýëåìåíò(û) óïðàâëåíèÿ, âûäåëèòå åãî (èõ), ïîñëå ÷åãî íà-
æìèòå êëàâèøó Delete. Ðåäàêòîð VB óäàëèò âûäåëåííûé(-íûå) ýëåìåíò(-û)
óïðàâëåíèÿ.

Ðåäàêòèðîâàíèå èëè ôîðìàòèðîâàíèå


çàãîëîâêîâ ýëåìåíòîâ óïðàâëåíèÿ
Äëÿ ðåäàêòèðîâàíèÿ òåêñòà çàãîëîâêîâ òàêèõ ýëåìåíòîâ óïðàâëåíèÿ, êàê
êíîïêà, ïåðåêëþ÷àòåëü èëè ôëàæîê, ïðîñòî ùåëêíèòå ïî ýòîìó òåêñòó. Ðåäàê-
òîð VB ïîìåñòèò â òåêñò çàãîëîâêà êóðñîð âñòàâêè. Òåïåðü ìîæíî ðåäàêòèðî-
âàòü òåêñò, èñïîëüçóÿ ëþáûå ñòàíäàðòíûå êîìàíäû ðåäàêòèðîâàíèÿ òåêñòà
Windows, ñ êîòîðûìè âû óæå çíàêîìû. Îäíàêî äëÿ òîãî, ÷òîáû èçìåíèòü ãàðíè-
òóðó, ñòèëü èëè ðàçìåð øðèôòà, íåîáõîäèìî âûâåñòè äëÿ ñîîòâåòñòâóþùåãî ýëå-
ìåíòà óïðàâëåíèÿ Properties Window (îêíî ñâîéñòâ) è èçìåíèòü ñâîéñòâî Font.
×òîáû îòðåäàêòèðîâàòü òåêñò çàãîëîâêà ôîðìû, îòðåäàêòèðóéòå ñâîéñòâî
ôîðìû Caption â Properties Window. À äëÿ ôîðìàòèðîâàíèÿ òåêñòà çàãîëîâêà
ôîðìû âîñïîëüçóéòåñü ñâîéñòâîì ôîðìû Font.
Íåêîòîðûå ýëåìåíòû óïðàâëåíèÿ, òàêèå êàê ïîëÿ (TextBox), ñïèñêè
(ListBox) è ïîëÿ ñî ñïèñêîì (ComboBox) íå èìåþò âñòðîåííîé íàäïèñè (èëè
çàãîëîâêà). ×òîáû ïîìåòèòü òàêèå ýëåìåíòû íà ôîðìå, èñïîëüçóéòå ýëåìåíò
Label.

Óïðàâëåíèå ïîñëåäîâàòåëüíîñòüþ ïåðåõîäà


 àêòèâíîì ñîñòîÿíèè âàøà ôîðìà áóäåò âåñòè ñåáÿ ïîäîáíî äðóãèì äèàëî-
ãîâûì îêíàì Windows. Ïîëüçîâàòåëü âàøåãî äèàëîãîâîãî îêíà ìîæåò ïåðåõî-
äèòü îò îäíîãî ýëåìåíòà óïðàâëåíèÿ ê äðóãîìó âïåðåä è íàçàä, èñïîëüçóÿ ñîîò-
âåòñòâåííî êëàâèøè Tab èëè Shift+Tab. Ïîðÿäîê, â êîòîðîì áóäóò àêòèâèçèðî-
âàòüñÿ ýëåìåíòû óïðàâëåíèÿ â îòâåò íà íàæàòèå ïîëüçîâàòåëåì êëàâèø Tab
Ýëåìåíòû äèàëîãîâûõ îêîí 379

èëè Shif+Tab, íàçûâàåòñÿ ïîñëåäîâàòåëüíîñòüþ ïåðåõîäà (tab order) ýëåìåíòîâ


óïðàâëåíèÿ. Îáû÷íî ïîñëåäîâàòåëüíîñòü ïåðåõîäà äëÿ ýëåìåíòîâ óïðàâëåíèÿ
âûáèðàþò òàê, ÷òîáû îíà ñîîòâåòñòâîâàëà (ïðèáëèçèòåëüíî) ïåðåìåùåíèþ ñëå-
âà íàïðàâî è ñâåðõó âíèç. Âîîáùå ãîâîðÿ, âû äîëæíû ïîñòàðàòüñÿ òàê ðàñïîëî-
æèòü ýëåìåíòû óïðàâëåíèÿ, ÷òîáû ïîñëåäîâàòåëüíîñòü ïåðåõîäà îáåñïå÷èâàëà
ëîãè÷åñêîå ïåðåìåùåíèå îò îäíîãî ýëåìåíòà óïðàâëåíèÿ äèàëîãîâîãî îêíà
ê äðóãîìó. Íàïðèìåð, åñëè ïîëüçîâàòåëü ââîäèò íåêîòîðûå äàííûå ñ èñïîëü-
çîâàíèåì êëàâèàòóðû, òî åìó óäîáíåå íå ïðèáåãàòü ê ïîìîùè ìûøè äëÿ
ïåðåõîäà ê ñëåäóþùèì îêíàì ââîäà.  ýòîì ñëó÷àå ëîãè÷íûé äëÿ äàííîãî
äèàëîãîâîãî îêíà ïåðåõîä ê ðàçëè÷íûì ýëåìåíòàì óïðàâëåíèÿ áóäåò î÷åíü
êñòàòè.
Ðåäàêòîð VB ïî óìîë÷àíèþ óñòàíàâëèâàåò äëÿ ýëåìåíòîâ óïðàâëåíèÿ ïî-
ñëåäîâàòåëüíîñòü ïåðåõîäà, îïðåäåëÿåìóþ ïîðÿäêîì, â êîòîðîì îíè áûëè äî-
áàâëåíû íà ôîðìó. Î÷åíü ÷àñòî, ïîñëå òîãî, êàê âû ðàçìåñòèëè íà ôîðìå âñå
ýëåìåíòû óïðàâëåíèÿ è íåñêîëüêî ðàç èõ ïåðåäâèíóëè, ÷òîáû äîáèòüñÿ ïðèåì-
ëåìîãî âèäà ôîðìû, óñòàíîâëåííàÿ ïî óìîë÷àíèþ ïîñëåäîâàòåëüíîñòü ïåðåõî-
äà óæå áîëüøå íå îáåñïå÷èâàåò ëîãè÷åñêîé ïîñëåäîâàòåëüíîñòè ïåðåìåùåíèÿ
ïî ýëåìåíòàì óïðàâëåíèÿ äèàëîãîâîãî îêíà.

Ðèñ. 9.12
Èñïîëüçîâàíèå äèàëîãîâîãî
îêíà Tab Order äëÿ èçìåíåíèÿ
ïîñëåäîâàòåëüíîñòè ïåðåõîäà ê ýëåìåíòàì
óïðàâëåíèÿ ôîðìû

Äëÿ èçìåíåíèÿ ïîñëåäîâàòåëüíîñòè ïåðåõîäà, âûïîëíèòå ñëåäóþùèå äåé-


ñòâèÿ:
1. Âûáåðèòå êîìàíäó View | Tab Order (Âèä | Ïîñëåäîâàòåëüíîñòü ïåðåõîäà);
ðåäàêòîð VB îòîáðàæàåò äèàëîãîâîå îêíî Tab Order (Ïîñëåäîâàòåëüíîñòü
ïåðåõîäà), ïîêàçàííîå íà ðèñ. 9.12. Ñïèñîê Tab Order âûâîäèò âñå ýëåìåí-
òû óïðàâëåíèÿ ôîðìû â ñóùåñòâóþùåé íà äàííûé ìîìåíò ïîñëåäîâà-
òåëüíîñòè.
2. Â ñïèñêå Tab Order âûáåðèòå ýëåìåíòû, ïîëîæåíèå êîòîðûõ õîòèòå èçìå-
íèòü. (Íà ðèñ. 9.12 âûáðàí ýëåìåíò óïðàâëåíèÿ ñ èìåíåì TextBox1.)
3. Èñïîëüçóÿ êíîïêè Move Up (ââåðõ) è Move Down (âíèç), èçìåíèòå ïîëîæå-
íèå âûáðàííîãî ýëåìåíòà óïðàâëåíèÿ â ïîñëåäîâàòåëüíîñòè ïåðåõîäà.
Ùåë÷îê ïî êíîïêå Move Up ïåðåìåñòèò ýëåìåíò óïðàâëåíèÿ ââåðõ ïî ñïè-
ñêó (òî åñòü îí áóäåò àêòèâèçèðîâàòüñÿ ðàíüøå), à ùåë÷îê ïî êíîïêå
Move Down ïåðåìåñòèò ýòîò ýëåìåíò âíèç ïî ñïèñêó (òî åñòü îí áóäåò àêòè-
âèçèðîâàòüñÿ ïîçæå).
4. Ïîâòîðèòå ïóíêòû 2 è 3 äëÿ êàæäîãî ýëåìåíòà óïðàâëåíèÿ, ïîêà íå ïî-
ëó÷èòå óäîâëåòâîðÿþùóþ âàñ ïîñëåäîâàòåëüíîñòü ïåðåõîäà äëÿ ýëåìåí-
òîâ óïðàâëåíèÿ ôîðìû.
380 Ãëàâà 9

5. Âûáåðèòå â äèàëîãîâîì îêíå Tab Order êíîïêó OK, ÷òîáû ïîäòâåðäèòü ñäå-
ëàííûå âàìè èçìåíåíèÿ, ïîñëå ÷åãî çàêðîéòå îêíî.
Õîòÿ ýëåìåíòû Label òîæå ïîÿâëÿþòñÿ â äèàëîãîâîì îêíå Tab Order è âû
ìîæåòå ïîìåíÿòü èõ ïîëîæåíèå â ñïèñêå, â VBA íåëüçÿ âûáðàòü ýëåìåíò
óïðàâëåíèÿ Label. Ýòîò ýëåìåíò ïðåäíàçíà÷åí èñêëþ÷èòåëüíî äëÿ âûâîäà
òåêñòà.

Çàäàíèå ñâîéñòâ ôîðìû è ýëåìåíòîâ óïðàâëåíèÿ


â ðåæèìå ðàçðàáîòêè
Êàæäàÿ ôîðìà è êàæäûé ýëåìåíò óïðàâëåíèÿ ôîðìû èìåþò ñîáñòâåííûé íà-
áîð ñâîéñòâ òî÷íî òàê æå, êàê è äðóãèå îáúåêòû VBA èëè host-ïðèëîæåíèÿ. Íå-
êîòîðûå ñâîéñòâà ôîðìû è ýëåìåíòà óïðàâëåíèÿ ïðîùå è ïðàêòè÷íåå çàäàòü â ðå-
æèìå ðàçðàáîòêè, à íå â êîäå VBA. Óñòàíîâëåííûå âàìè ñâîéñòâà ôîðìû èëè ýëå-
ìåíòà óïðàâëåíèÿ ñòàíîâÿòñÿ äëÿ íèõ íîâûìè ñâîéñòâàìè ïî óìîë÷àíèþ.
Íàïðèìåð, õîòÿ âû ìîæåòå çàäàòü øðèôò, öâåò ôîíà è öâåò òåêñòà ýëåìåíòà
óïðàâëåíèÿ ñ ïîìîùüþ VBA-êîäà, îáû÷íî íåò íåîáõîäèìîñòè èçìåíÿòü ýòè
ñâîéñòâà â ïðîöåññå âûïîëíåíèÿ êîäà. Âìåñòî ýòîãî ãîðàçäî ïðîùå óñòàíîâèòü
äàííûå ñâîéñòâà â ïðîöåññå ðàçðàáîòêè. Âû òàêæå ìîæåòå çàäàòü äëÿ ôîðìû
çíà÷åíèÿ ïî óìîë÷àíèþ, çàäàâàÿ ñâîéñòâî Value ýëåìåíòà óïðàâëåíèÿ. Íà-
ïðèìåð, ÷òîáû ñîçäàòü íà ôîðìå ôëàæîê, êîòîðûé óñòàíîâëåí ïî óìîë÷àíèþ,
âû äîëæíû â ðåæèìå ðàçðàáîòêè, óñòàíîâèòü ñâîéñòâî Value äëÿ ýòîãî ôëàæ-
êà ðàâíûì True. Êàæäûé ðàç, êîãäà â ïðîöåññå âûïîëíåíèÿ ïðîãðàììû ôîðìà
áóäåò çàãðóæàòüñÿ â ïàìÿòü, ôëàæîê áóäåò óæå óñòàíîâëåí.
Àíàëîãè÷íî â ïðîöåññå ðàçðàáîòêè, ìîæíî çàïîëíèòü ñïèñêè ýëåìåíòîâ
óïðàâëåíèÿ, óñòàíîâèâ ñâîéñòâî RowSource ñïèñêà ýëåìåíòà óïðàâëåíèÿ.
 Excel âû ìîæåòå ñ ïîìîùüþ ñâîéñòâà RowSource ñâÿçàòü ñïèñîê ñ äèàïàçî-
íîì ÿ÷ååê ëèñòà è ñâÿçàòü ïîëå ñ ÿ÷åéêîé ëèñòà, óñòàíîâèâ ñâîéñòâî
ControlSource.
Âû òàêæå ìîæåòå çàäàòü çíà÷åíèå ïî óìîë÷àíèþ äëÿ ïîëÿ, ââåäÿ òåêñò íå-
ïîñðåäñòâåííî â ýëåìåíò óïðàâëåíèÿ TextBox íà ôîðìå. Ïîñëå ýòîãî êàæäûé
ðàç ïðè âûâîäå ôîðìû ïîëå áóäåò ñîäåðæàòü ââåäåííûé âàìè òåêñò.
Íåêîòîðûå ñâîéñòâà ýëåìåíòîâ óïðàâëåíèÿ, íàïðèìåð, Enabled (äîñòóï-
íîñòü) èëè Visible (âèäèìîñòü íà ôîðìå) óäîáíî óñòàíàâëèâàòü â ïðîöåññå
âûïîëíåíèÿ êîäà. Åñëè, íàïðèìåð, â íåêîòîðîå òåêñòîâîå îêíî íå ââåäåíî èìÿ
ôàéëà, äàííûå èç êîòîðîãî íåîáõîäèìî ñ÷èòàòü, òî êíîïêà äëÿ íà÷àëà
ñ÷èòûâàíèÿ âðÿä ëè äîëæíà äàâàòü âîçìîæíîñòü çàïóñòèòü êîä äëÿ ñ÷èòûâà-
íèÿ, ò.å. åå ñâîéñòâî Enabled äîëæíî èìåòü çíà÷åíèå False, à íå True. Èëè,
íàïðèìåð, íåò ñìûñëà â êíîïêå ñ çàãîëîâêîì (ñâîéñòâî Caption) Óäàëèòü,
åñëè èìÿ ôàéëà, êîòîðûé ñëåäóåò óäàëèòü, åùå íå ââåäåíî â äèàëîãîâîå îêíî.
Íåêîòîðûå ýëåìåíòû óïðàâëåíèÿ âîîáùå íåçà÷åì îòîáðàæàòü (ñâîéñòâî
Visible äîëæíî áûòü ðàâíûì False) äî òîãî ìîìåíòà, êàê îíè äåéñòâèòåëüíî
ñòàíóò íåîáõîäèìû.
 íåêîòîðûõ ñëó÷àÿõ áûâàåò óäîáíûì îäíè è òå æå ýëåìåíòû óïðàâëåíèÿ
èñïîëüçîâàòü äëÿ ðàçíûõ öåëåé, ìåíÿÿ, íàïðèìåð, èõ ñâîéñòâî Caption. Åñëè
âû èìååòå êíîïêó ñ çàãîëîâêîì Ðåäàêòèðîâàòü è óæå ùåëêíóëè íà íåé, áóäåò
âïîëíå ëîãè÷íî, åñëè íà ýòîé êíîïêå ïîÿâèòñÿ çàãîëîâîê Ñîõðàíèòü è êîä,
ñîîòâåòñòâóþùèé ýòîé êíîïêå, ñ êîäà ïîäãîòîâêè äëÿ ðåäàêòèðîâàíèÿ (è
Ýëåìåíòû äèàëîãîâûõ îêîí 381

èçìåíåíèÿ çàãîëîâêà íà Ñîõðàíèòü) èçìåíèòñÿ íà êîä ñîõðàíåíèÿ ðåçóëüòàòîâ


ðåäàêòèðîâàíèÿ (è èçìåíåíèÿ çàãîëîâêà Ðåäàêòèðîâàòü).
 ðåæèìå ðàçðàáîòêè ñâîéñòâà ôîðìû èëè ýëåìåíòà óïðàâëåíèÿ óñòàíàâëè-
âàþòñÿ â Properties Window, ãäå ïåðå÷èñëåíû âñå ñâîéñòâà îáúåêòà, êîòîðûå âû
ìîæåòå óñòàíîâèòü â ýòîì ðåæèìå. Êîíêðåòíûå ñâîéñòâà, ïîÿâëÿþùèåñÿ
â ýòîì îêíå, çàâèñÿò îò âûáðàííîãî âàìè ýëåìåíòà óïðàâëåíèÿ. Íà ðèñ. 9.13
ïîêàçàíî Properties Window äëÿ êíîïêè ñ èìåíåì ( ñâîéñòâîì Name) CmdOK è çà-
ãîëîâêîì (Caption) Âû÷èñëèòü äëÿ íåêîòîðîé ôîðìû.
Properties Window èìååò äâå ñòðàíèöû (âêëàäêè). Ïåðâàÿ — ïîêàçàíà íà
ðèñ. 9.13 è ñîäåðæèò ñïèñîê ñâîéñòâ îáúåêòà â àëôàâèòíîì ïîðÿäêå. Âòîðàÿ
ñòðàíèöà, ïîêàçàííàÿ íà ðèñ. 9.14, ñîäåðæèò ñïèñîê ñâîéñòâ, ðàçäåëåííûõ íà
êàòåãîðèè. Çàìåòüòå, ÷òî ðàçëè÷íûå êàòåãîðèè âûäåëåíû â Properties Window
æèðíûì øðèôòîì: Appearance (Âèä), Behavior (Ïîâåäåíèå), Font (Øðèôò) è òàê
äàëåå. Âû ìîæåòå ñâåðíóòü èëè ðàçâåðíóòü ñïèñîê ñâîéñòâ êîíêðåòíîé êàòåãî-
ðèè, ùåëêíóâ ïî êâàäðàòèêó ñëåâà îò çàãîëîâêà êàæäîé èç êàòåãîðèé.

Ðèñ. 9.13
Properties Window äëÿ êíîïêè, ïîêàçûâàþùåå
ñïèñîê ñâîéñòâ â àëôàâèòíîì ïîðÿäêå

Ðèñ. 9.14
Properties Window äëÿ êíîïêè, ïîêàçûâàþùåå
ñïèñîê ñâîéñòâ ïî êàòåãîðèÿì

×òîáû çàäàòü ñâîéñòâî ôîðìû èëè ýëåìåíòà óïðàâëåíèÿ, ùåëêíèòå â ïîëå,


ñîîòâåòñòâóþùåì ñâîéñòâó, êîòîðîå õîòèòå èçìåíèòü. Äëÿ áîëüøèíñòâà
382 Ãëàâà 9

ñâîéñòâ ïîÿâèòñÿ ðàñêðûâàþùèéñÿ ñïèñîê. Ùåëêíèòå ïî êíîïêå ñïèñêà è âû-


áåðèòå èç ñïèñêà íóæíîå çíà÷åíèå ñâîéñòâà. Äðóãèå ñâîéñòâà (òàêèå êàê Name
è Caption) äàþò âîçìîæíîñòü ââåñòè ëþáîé íåîáõîäèìûé òåêñò. Íåêîòîðûå
ñâîéñòâà ïðè èõ âûáîðå âûâîäÿò êíîïêó ñ ìíîãîòî÷èåì (…). Ùåë÷îê ïî òàêîé
êíîïêå îòêðûâàåò äîïîëíèòåëüíûå äèàëîãîâûå îêíà, ïîìîãàþùèå çàäàòü ýòî
ñâîéñòâî.
×òîáû èçìåíèòü ñâîéñòâà ôîðìû èëè ýëåìåíòà óïðàâëåíèÿ, âûïîëíèòå ñëå-
äóþùèå äåéñòâèÿ:
1. Âûáåðèòå ýëåìåíò óïðàâëåíèÿ, ñâîéñòâà êîòîðîãî õîòèòå èçìåíèòü. ×òî-
áû âûäåëèòü ôîðìó, ùåëêíèòå ãäå-íèáóäü íà ïîâåðõíîñòè ôîðìû, íå çà-
íÿòîé ýëåìåíòàìè óïðàâëåíèÿ.
2. Âûáåðèòå êîìàíäó View | Properties Window (Âèä | Îêíî ñâîéñòâ) äëÿ îòîáðà-
æåíèÿ Properties Window. (Âû ìîæåòå ñäåëàòü ýòî è ùåë÷êîì íà êíîïêå
Properties Window íà ïàíåëè èíñòðóìåíòîâ ðåäàêòîðà VB èëè, íàæàâ F4.)
3. Óñòàíîâèòå íåîáõîäèìîå ñâîéñòâî äëÿ âûáðàííîãî ýëåìåíòà óïðàâëåíèÿ.
4. Ùåëêíèòå ïî êíîïêå Close (çàêðûòü) â âåðõíåì ëåâîì óãëó îêíà Properties
Window, ÷òîáû åãî çàêðûòü.
Èòàê, âû ïîçíàêîìèëèñü ñ îñíîâíûìè ïîëîæåíèÿìè ñîçäàíèÿ è óïðàâëå-
íèÿ äèàëîãîâûìè îêíàìè è èõ ýëåìåíòàìè. Áîëåå ïîëíóþ èíôîðìàöèþ î êàæ-
äîì ýëåìåíòå óïðàâëåíèÿ ìîæíî ïîëó÷èòü èç ñïðàâî÷íîé ñèñòåìû VBA.

Èñïîëüçîâàíèå äîïîëíèòåëüíûõ ýëåìåíòîâ óïðàâëåíèÿ


Âàì î÷åíü ñêîðî ìîãóò ïîíàäîáèòüñÿ ýëåìåíòû óïðàâëåíèÿ, êîòîðûõ íåò íà
Toolbox. Íàïðèìåð, ñàìûìè ïîëåçíûìè ýëåìåíòàìè óïðàâëåíèÿ ÿâëÿþòñÿ
ýëåìåíòû, îòîáðàæàþùèå äàííûå â òàáëèöå — ñåòêå (â Excel ïàíåëü Toolbox
ñîäåðæèò ýëåìåíòû òèïà ñåòêè, íî òàêèõ ýëåìåíòîâ ìîæíî íàéòè áîëüøå, ÷åì
ñîäåðæèò Toolbox ïî óìîë÷àíèþ). Äðóãàÿ ãðóïïà ÷àñòî èñïîëüçóåìûõ
ýëåìåíòîâ — ýëåìåíòû óïðàâëåíèÿ äëÿ ðàáîòû ñ âíåøíèìè áàçàìè äàííûõ.
È òàê äàëåå.
Ìíîãèå ýëåìåíòû óïðàâëåíèÿ ïî óìîë÷àíèþ íå ïîìåùàþòñÿ íà Toolbox.
Ýòîò «íåäîñòàòîê» ëåãêî èñïðàâèòü, âîñïîëüçîâàâøèñü äèàëîãîâûì îêíîì, êî-
òîðîå «îòâå÷àåò» çà òî, êàêèå èìåííî ýëåìåíòû óïðàâëåíèÿ äîëæíû íàõîäèòü-
ñÿ íà Toolbox. Íî ïðåæäå ÷åì «îòïðàâëÿòüñÿ íà ïîèñêè» äîïîëíèòåëüíûõ ýëå-
ìåíòîâ óïðàâëåíèÿ, ïîäãîòîâüòå ñåáå ìåñòî íà Toolbox äëÿ ýòèõ äîïîëíèòåëü-
íûõ ýëåìåíòîâ. Åñëè ýòîãî íå ñäåëàòü, òî äîïîëíèòåëüíûå ýëåìåíòû áóäóò
ðàçìåùàòüñÿ íà âêëàäêå Controls ïàíåëè Toolbox. Âû, êîíå÷íî, ìîãëè ýòîãî è íå
çàìåòèòü, íî Toolbox, äåéñòâèòåëüíî, ñîäåðæèò âêëàäêó è ïîçâîëÿåò âàì äîáàâ-
ëÿòü è óäàëÿòü ñâîè âêëàäêè äëÿ ðàçìåùåíèÿ íà íèõ ýëåìåíòîâ óïðàâëåíèÿ.
Äîáàâèòü âêëàäêó íà Toolbox î÷åíü ïðîñòî: ïðàâûì ùåë÷êîì íà ïóñòîì ìåñ-
òå ïàíåëè Toolbox âûçîâèòå êîíòåêñòíîå ìåíþ (ðèñ. 9.15) è âûáåðèòå êîìàíäó
New Page. Â ðåçóëüòàòå âûïîëíåíèÿ ýòîé êîìàíäû ê Toolbox áóäåò äîáàâëåíà
âêëàäêà ñ èìåíåì ïî óìîë÷àíèþ (ðèñ. 9.16).
Ïðè ïîìîùè òîãî æå êîíòåêñòíîãî ìåíþ ìîæíî ïåðåèìåíîâàòü ëþáóþ
âêëàäêó â îêíå Rename (ðèñ. 9.17). Íàïðèìåð, íà ðèñ. 9.18 âêëàäêà èìååò íà-
èìåíîâàíèå Ñåòêè.
Äëÿ äîáàâëåíèÿ ýëåìåíòîâ óïðàâëåíèÿ íà òåêóùóþ âêëàäêó ñëåäóåò âû-
áðàòü êîìàíäû Tools | Additional Controls è â ïîÿâèâøåìñÿ îêíå Additional Controls
(ðèñ. 9.19) óêàçàòü ãðóïïó íåîáõîäèìûõ ýëåìåíòîâ óïðàâëåíèÿ (ôàêòè÷åñêè,
Ýëåìåíòû äèàëîãîâûõ îêîí 383

DLL-ôàéë). Íà ðèñ. 9.20 âêëàäêà Ñåòêè ïàíåëè Toolbox ñîäåðæèò ýëåìåíòû


DataGrid è MSFlexGrid, êîòîðûå âûáðàíû ïðè ïîìîùè ôëàæêîâ Microsoft DataGrig
Control 6.0 è Microsoft FlexGrig Control, version 6.0, ñîîòâåòñòâåííî.

Ðèñ. 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,
ñîîòâåòñòâåííî

Ðèñ. 9.21. Ôîðìà


ñ ýëåìåíòîì
óïðàâëåíèÿ
MSFlexGrigd,
çàïîëíåííûì
äàííûìè èç ðàáî÷åãî
ëèñòà
Ýëåìåíòû äèàëîãîâûõ îêîí 385

 ñòðîêàõ 12–20 ïðè ïîìîùè äâóõ öèêëîâ (îäèí èç êîòîðûõ âëîæåí â


äðóãîé) âûïîëíÿåòñÿ ñ÷èòûâàíèå äàííûõ èç ëèñòà ñ èìåíåì Ëèñò1 òåêóùåé
ðàáî÷åé êíèãè è çàïîëíåíèå ñåòêè.

Ëèñòèíã 9.7. Çàïîëíåíèå ñåòêè äàííûìè èç ðàáî÷åãî ëèñòà

1: Private Sub UserForm_Initialize()


2: ' êîä çàïîëíåíèÿ ñåòêè äàííûìè èç ðàáî÷åãî ëèñòà
3:
4: 'ðàçìåðû ñåòêè:
6: MSFlexGrid1.Rows = 20 'êîë-âî ñòðîê
7: MSFlexGrid1.Cols = 7 'êîë-âî ñòîëáöîâ
8: MSFlexGrid1.ColWidth(0) = 2600 'øèðèíà ïåðâîãî ñòîëáöà
9: MSFlexGrid1.ColAlignment(0) = Left 'âûðàâíèâàíèå äàííûõ
10:
11: 'çàïîëíåíèå ñåòêè äàííûìè:
12: For j = 0 To MSFlexGrid1.Rows - 1
13: MSFlexGrid1.Row = j 'òåêóùàÿ ñòðîêà
14: For I = 1 To MSFlexGrid1.Cols
15: MSFlexGrid1.Col = I - 1 'òåêóùèé ñòîëáåö
16: 'ñîäåðæèìîå ÿ÷åéêè ñåòêè:
17: MSFlexGrid1.Text = _
18: Worksheets("Ëèñò1").Cells(j + 1, I).Value
19: Next
20: Next
21:
22: End Sub
Óïðàâëåíèå
10
host-ïðèëîæåíèÿìè VBA
Âû óæå çíàåòå, ÷òî Visual Basic for Applications — ÿçûê ïðîãðàììèðîâà-
íèÿ, ïðåäíàçíà÷åííûé â îñíîâíîì äëÿ ðàáîòû ñ èìåþùèìñÿ ïðîãðàììíûì
îáåñïå÷åíèåì è äëÿ ðàñøèðåíèÿ åãî âîçìîæíîñòåé. Ïðèëîæåíèÿ Microsoft
Office èìåþò ìíîæåñòâî ðàçëè÷íûõ îáúåêòîâ, äîñòóïíûõ VBA. Ñâîéñòâà è ìå-
òîäû ýòèõ îáúåêòîâ ïîçâîëÿþò ïîñðåäñòâîì VBA-êîäà óïðàâëÿòü, ïðàêòè÷å-
ñêè, ëþáûì àñïåêòîì ðàáîòû ïðèëîæåíèé Microsoft Office. Èç ýòîé ãëàâû âû
óçíàåòå, êàê ïîñðåäñòâîì VBA-êîäà óïðàâëÿòü îñíîâíûìè îïåðàöèÿìè â Word
è Excel, à èìåííî:
¨ Êàê ðàáîòàòü ñ îáúåêòàìè Excel: Workbook è Worksheet.
¨ Êàê èñïîëüçîâàòü ìåòîäû îáúåêòà Excel, âîçâðàùàþùèå îáúåêòû Range,
âêëþ÷àÿ òî, êàê çàäàòü è âûäåëèòü äèàïàçîíû ÿ÷ååê â ëèñòå Excel.
¨ Êàê ââåñòè â ÿ÷åéêè ëèñòà Excel çíà÷åíèÿ è ôîðìóëû.
¨ Êàê ðàáîòàòü ñ îáúåêòàìè Word: Document è Template.
¨ Êàê èñïîëüçîâàòü ìåòîäû îáúåêòà Word, âîçâðàùàþùèå ðàçäåëû äîêó-
ìåíòîâ, âêëþ÷àÿ îáúåêòû Paragraphs, Characters è Range.
¨ Êàê äîáàâèòü, âûðåçàòü, ñêîïèðîâàòü èëè âñòàâèòü äàííûå â ëèñò Excel
èëè äîêóìåíò Word.

Ðàáîòà ñ Excel
 ïåðâîé ÷àñòè ýòîé ãëàâû âû óçíàåòå, êàê óïðàâëÿòü íàèáîëåå âàæíûìè
è îñíîâíûìè îáúåêòàìè Excel. Âî-ïåðâûõ, âû óçíàåòå îá îáúåêòàõ Workbook
è Worksheet, à çàòåì íàó÷èòåñü óïðàâëÿòü èíôîðìàöèåé, ñîäåðæàùåéñÿ
â îáúåêòå Worksheet. Äàëåå èç ýòîé æå ãëàâû âû óçíàåòå, êàê óïðàâëÿòü àíà-
ëîãè÷íûìè îáúåêòàìè â Word.

Âîçâðàùåíèå îáúåêòà Workbook


 Excel êàæäàÿ êíèãà ÿâëÿåòñÿ îáúåêòîì Workbook, à Workbooks — êîë-
ëåêöèåé âñåõ îòêðûòûõ êíèã â òåêóùåì ðàáî÷åì ñåàíñå Excel. Äëÿ ññûëîê íà
êîíêðåòíóþ êíèãó ñëåäóåò èñïîëüçîâàòü êîëëåêöèþ Workbooks îáúåêòà
Application:
388 Ãëàâà 10

Ñèíòàêñèñ
Workbooks(Index)
Index ìîæåò áûòü:
÷èñëåííûì âûðàæåíèåì, ïðåäñòàâëÿþùèì êíèãó, êîòîðóþ íåîáõîäèìî èñïîëüçî-
âàòü (÷èñëî 1 îçíà÷àåò ïåðâóþ êíèãó, îòêðûòóþ â òåêóùåì ðàáî÷åì ñåàíñå, 2 —
âòîðóþ è òàê äàëåå);
ñòðîêîâûì âûðàæåíèåì, ïðåäñòàâëÿþùèì èìÿ îòêðûòîé êíèãè, êîòîðóþ âû õîòè-
òå èñïîëüçîâàòü.

Áîëåå ðàñïðîñòðàíåííûé è îáû÷íî íàèáîëåå óäîáî÷èòàåìûé ñïîñîá — èñ-


ïîëüçîâàíèå â êà÷åñòâå Index òåêñòîâîé ñòðîêè. Ëèñòèíã 10.1 ñîäåðæèò ñîîò-
âåòñòâóþùèé ïðèìåð.

Ëèñòèíã 10.1. Èñïîëüçîâàíèå êîëëåêöèè Workbooks


1: Sub SetWorkbookProtection()
2: 'Óñòàíîâêà çàùèòû êíèãè
3:
4: Workbooks("Êíèãà8.xlsx").Protect Structure:=True, Windows:=True
5: MsgBox "Çàùèòà äëÿ ôàéëà Êíèãà8.xlsx óñòàíîâëåíà", , _
6: "Óñòàíîâêà çàùèòû êíèãè"
7: End Sub

Âûðàæåíèå â ñòðîêå 4, Workbooks("Êíèãà8.xlsx"), âîçâðàùàåò îáúåêòíóþ


ññûëêó íà îáúåêò Workbook ñ èìåíåì Êíèãà8.xlsx. Ìåòîä Protect óñòàíàâëè-
âàåò çàùèòó êíèãè. Îïåðàòîð MsgBox (â ñòðîêàõ 5–6) âûâîäèò ñîîáùåíèå, èí-
ôîðìèðóþùåå î òîì, ÷òî äëÿ äàííîé êíèãè áûëà óñòàíîâëåíà çàùèòà (ðèñ.
10.1). (Ïðåäïîëàãàåòñÿ, ÷òî êíèãà ñ èìåíåì Êíèãà8.xlsx â äàííûé ìîìåíò îò-
êðûòà. Åñëè ýòî — íå òàê, òî âû ïîëó÷èòå ñîîáùåíèå î runtime-îøèáêå.)

Ðèñ. 10.1
Ñîîáùåíèå î ðåçóëüòàòå âûïîëíåíèÿ êîäà ëèñòèíãà
10.1

Êàê îòêðûòü êíèãó


Åñëè íåîáõîäèìàÿ âàì êíèãà åùå íå îòêðûòà, âîñïîëüçóéòåñü ìåòîäîì Open
äëÿ çàãðóçêè åå â ïàìÿòü:
Ñèíòàêñèñ
Workbooks.Open(Filename)
Àðãóìåíò Filename — òåêñòîâàÿ ñòðîêà, ïðåäñòàâëÿþùàÿ ïîëíûé ïóòü ê êíèãå:
äèñê, ïàïêà è èìÿ ôàéëà. Åñëè âû íå çàäàäèòå èìÿ äèñêà èëè ïàïêó, Excel áóäåò
èñêàòü ôàéë íà òåêóùåì äèñêå è â òîé ïàïêå, êîòîðàÿ îòêðûòà â äàííûé ìîìåíò.

Ïðèìåð èñïîëüçîâàíèÿ ìåòîäà Open ïðåäñòàâëåí â ëèñòèíãå 10.2.

Ëèñòèíã 10.2. Ïðèìåíåíèå ìåòîäà Open äëÿ îòêðûòèÿ êíèãè


Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 389

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

 ýòîé ïðîöåäóðå ïåðåìåííàÿ WorkbookName îáúÿâëåíà ñ òèïîì String


(ñòðîêà 4). Ôóíêöèÿ InputBox ïðåäëàãàåò ïîëüçîâàòåëþ ââåñòè èìÿ ôàéëà
êíèãè (ñòðîêè 6 è 7). Îïåðàòîð If...Then (â ñòðîêå 8) ïðîâåðÿåò, íå îòìåíèë
ëè ïîëüçîâàòåëü äèàëîã ââîäà. Åñëè — íåò, äðóãèìè ñëîâàìè, åñëè ñòðîêà
WorkbookName íå ïóñòà, ìåòîä Open èñïîëüçóåò WorkbookName äëÿ îòêðû-
òèÿ ôàéëà (ñòðîêà 9).

Êàê ñîçäàòü íîâóþ êíèãó


Åñëè â âàøåé ïðîãðàììå òðåáóåòñÿ ñîçäàòü íîâóþ êíèãó, âîñïîëüçóéòåñü
ìåòîäîì Add êîëëåêöèè Workbooks:
Ñèíòàêñèñ
Workbooks.Add([Template])
Íåîáÿçàòåëüíûé àðãóìåíò Template îïðåäåëÿåò òèï êíèãè, ñîçäàâàåìîé Excel. Åñëè
âû îïóñòèòå Template, Excel ñîçäàñò êíèãó, çàäàííóþ ïî óìîë÷àíèþ è ñîäåðæàùóþ
íåêîòîðîå êîëè÷åñòâî ÷èñòûõ ëèñòîâ. Êîëè÷åñòâî ÷èñòûõ ëèñòîâ â íîâîé êíèãå çàäà-
åòñÿ íà âêëàäêå Îáùèå (General) â äèàëîãîâîì îêíå Ïàðàìåòðû (Options) (âûçâàòü
äàííîå äèàëîãîâîå îêíî ìîæíî, âûáðàâ êîìàíäó Ñåðâèñ | Ïàðàìåòðû (Tools |
Options)). Âû ìîæåòå òàêæå çàäàòü êîëè÷åñòâî ÷èñòûõ ëèñòîâ â íîâîé êíèãå ïðè ïî-
ìîùè ñâîéñòâà Application.SheetsInNewWorkBook.

Äëÿ òîãî ÷òîáû ñîçäàòü íîâóþ êíèãó, îñíîâûâàÿñü íà ñóùåñòâóþùåì øàá-


ëîíå, ïîäñòàâüòå â êà÷åñòâå àðãóìåíòà Template ñòðîêîâîå çíà÷åíèå, îïðåäå-
ëÿþùåå èìÿ øàáëîíà. Åñëè íåîáõîäèìûé âàì øàáëîí ðàñïîëîæåí íå â çàãðó-
çî÷íîé èëè íå â àëüòåðíàòèâíîé çàãðóçî÷íîé ïàïêå, âêëþ÷àéòå â àðãóìåíò
Template ïîëíûé ïóòü: èìÿ äèñêà, ïàïêó è èìÿ øàáëîíà.
×òîáû ñîçäàòü êíèãó, ñîäåðæàùóþ òîëüêî îäèí ëèñò, èñïîëüçóéòå îäíó èç
ñëåäóþùèõ âñòðîåííûõ êîíñòàíò àðãóìåíòà Template (ýòè êîíñòàíòû îïðåäå-
ëåíû â êëàññå xlWBATemplate): xlWBATWorksheet, xlWBATChart, xlWBATEx-
cel4MacroSheet èëè xlWBATExcel4IntlMacroSheet.
Ëèñòèíã 10.3 äåìîíñòðèðóåò ïðèìåð ïðîöåäóðû, ñîçäàþùåé íîâóþ êíèãó.

Ëèñòèíã 10.3. Èñïîëüçîâàíèå ìåòîäà Add äëÿ ñîçäàíèÿ íîâîé êíèãè

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

8: FileName = FilePath & "\Êíèãà8.xlsm"


9: Workbooks.Add Template:=FileName
10: With ActiveWorkbook
11: .Title = "Îò÷åò êîìïàíèè"
12: .Subject = "Îò÷åò çà ÄÅÊÀÁÐÜ 2003"
13: .Author = "Èâàí Ïåòðîâ"
14: End With
15:End Sub

Êîä ëèñòèíãà 10.3 ñîçäàåò íîâóþ êíèãó (ñòðîêà 9) íà áàçå øàáëîíà


Book15Template.xls — îáû÷íûé Excel-ôàéë, êîòîðûé áûë ïðåäâàðèòåëüíî ñîç-
äàí è îáðàáîòàí. Ëþáàÿ íîâàÿ êíèãà àâòîìàòè÷åñêè ñòàíîâèòñÿ àêòèâíîé êíè-
ãîé. Â ñòðîêàõ ñ 10 ïî 14 äëÿ äîáàâëåíèÿ â ôàéë íîâîé êíèãè íåêîòîðîé îáùåé
èíôîðìàöèè — Title, Subject è Author — èñïîëüçóåòñÿ îáúåêò
ActiveWorkbook. Äëÿ ïðîñìîòðà ðåçóëüòàòîâ ðàáîòû êîäà ñòðîê 9–13 èñïîëü-
çóéòå èëè âïëûâàþùóþ Explorer-ïîäñêàçêó (ñì. ðèñ. 10.2), èëè âêëàäêó
Summary äèàëîãîâîãî îêíà Properties äëÿ äàííîãî ôàéëà.

Ðèñ. 10.2
Îáùóþ èíôîðìàöèþ î ôàéëå ìîæíî
óâèäåòü, åñëè ïðîñòî íà íåêîòîðîå âðåìÿ
ïîìåñòèòü íà åãî çíà÷êå êóðñîð ìûøè

Êàê ñäåëàòü êíèãó àêòèâíîé


Åñëè âàøà VBA-ïðîãðàììà ðàáîòàåò ñ íåñêîëüêèìè îäíîâðåìåííî îòêðûòû-
ìè êíèãàìè, âàì ìîæåò ïîíàäîáèòüñÿ ïåðåêëþ÷àòüñÿ èç îäíîé êíèãè â äðóãóþ
äëÿ âûâîäà íà ýêðàí, íàïðèìåð, îò÷åòà èëè ââåäåííûõ äàííûõ.
×òîáû ñäåëàòü îòêðûòûé äîêóìåíò àêòèâíûì, èñïîëüçóéòå ìåòîä Activate:
Ñèíòàêñèñ
Object.Activate
 äàííîì ñëó÷àå Object ïðåäñòàâëÿåò ëþáóþ äîïóñòèìóþ îáúåêòíóþ ññûëêó íà
ëèñò, êîòîðûé íåîáõîäèìî ñäåëàòü àêòèâíûì.

 ëèñòèíãå 10.4 — ïðèìåð ïðîöåäóðû, èñïîëüçóþùåé ìåòîä Activate.

Ëèñòèíã 10.4. Èñïîëüçîâàíèå ìåòîäà Activate äëÿ ïåðåêëþ÷åíèÿ ê êíèãå


1: Sub ActivateTest()
2: 'Èçìåíåíèå àêòèâíîé êíèãè áåç âûâîäà íà ýêðàí
3:
4: Dim SaveBook As String
5:
6: SaveBook = ActiveWorkbook.Name
7:
8: Application.ScreenUpdating = False
9: Workbooks("Áàëàíñîâûé îò÷åò 1207.XLSX").Activate
10:
11: ' êîä, âûïîëíÿþùèé çàïîëíåíèå ôàéëà Áàëàíñîâûé îò÷åò 1202.XLS
12: ' . . .
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 391

13:
14: Workbooks(SaveBook).Activate
15: Application.ScreenUpdating = True
16: End Sub

Ýòà ïðîñòàÿ ïðîöåäóðà äåìîíñòðèðóåò äâà ïðèíöèïà õîðîøåãî ïðîãðàììè-


ðîâàíèÿ. Âî-ïåðâûõ, ïî âîçìîæíîñòè ñëåäóåò ñêðûâàòü îò ïîëüçîâàòåëÿ ïðîìå-
æóòî÷íûå îïåðàöèè, âûïîëíÿåìûå âàøåé ïðîãðàììîé. Íàïðèìåð, åñëè ïðîöå-
äóðà ñîäåðæèò îïåðàòîðû, ôîðìàòèðóþùèå äèàïàçîíû ÿ÷ååê è ââåäåííûå äàí-
íûå, âûïîëíÿéòå äàííûå äåéñòâèÿ «çà êóëèñàìè». Âûâîäèòå äëÿ ïîëüçîâàòåëÿ
íà ýêðàí ëèøü êîíå÷íûé ðåçóëüòàò. Ñäåëàòü ýòî ìîæíî, ïðèñâàèâàÿ ñâîéñòâó
ScreenUpdating îáúåêòà Application çíà÷åíèå False.
Âî-âòîðûõ, åñëè âû óñòàíàâëèâàåòå êíèãó àêòèâíîé, ïîòîìó ÷òî ýòî òðåáóåò-
ñÿ âàøåé ïðîãðàììå, à íå äëÿ òîãî, ÷òîáû ïîëüçîâàòåëü ìîã óâèäåòü äðóãîé
ôàéë, âàøà ïðîöåäóðà äîëæíà ïî çàâåðøåíèè «âîçâðàùàòü» ïîëüçîâàòåëÿ â òî
æå ñàìîå ìåñòî, ãäå îí íàõîäèëñÿ ïðè åå ñòàðòå. Îñîáåííî ýòî îòíîñèòñÿ ê ìàëî-
îïûòíûì ïîëüçîâàòåëÿì, êîòîðûå ïðèõîäÿò â çàìåøàòåëüñòâî, îáíàðóæèâ, ÷òî
ïî âûïîëíåíèè ïðîöåäóðû îíè îêàçûâàþòñÿ ñîâñåì â äðóãîé êíèãå, íå èìåÿ,
ïðè ýòîì, íèêàêèõ ðàçóìíûõ ïðåäïîëîæåíèé äëÿ îáúÿñíåíèÿ ýòîãî ôàêòà.
Íàçíà÷åíèå ïðåäñòàâëåííîé â ëèñòèíãå 10.4 ïðîöåäóðû — ïåðåêëþ÷èòüñÿ
èç òåêóùåé êíèãè â äðóãóþ êíèãó (Áàëàíñîâûé îò÷åò 1202.XLS), ïðîèçâåñòè
â íåé ïðîãðàììíûì îáðàçîì íåêîòîðûå èçìåíåíèÿ, à çàòåì âåðíóòüñÿ ê ïåðâî-
íà÷àëüíîé êíèãå. Ñíà÷àëà (â ñòðîêå 6) èìÿ òåêóùåé àêòèâíîé êíèãè ñîõðàíÿ-
åòñÿ â ñòðîêîâîé ïåðåìåííîé SaveBook. Äàëåå, ÷òîáû èçáàâèòü ïîëüçîâàòåëÿ
îò íàáëþäåíèÿ çà äåòàëÿìè âûïîëíåíèÿ ïðîöåäóðû, â ñòðîêå 8 ñâîéñòâó
ScreenUpdating ïðèñâàèâàåòñÿ çíà÷åíèå False.  ñòðîêå 9 êíèãà Áàëàíñî-
âûé îò÷åò 1202.XLS óñòàíàâëèâàåòñÿ àêòèâíîé. Ñòðîêè, ñëåäóþùèå äàëåå,
äîëæíû âûïîëíÿòü äåéñòâèÿ â êíèãå Áàëàíñîâûé îò÷åò 1202.XLS. Ðåàëüíàÿ
ïðîãðàììà, êîòîðàÿ âíîñèò èçìåíåíèÿ â Áàëàíñîâûé îò÷åò 1202.XLS, â äàí-
íîì ïðèìåðå îïóùåíà. Äëÿ òîãî ÷òîáû «âåðíóòü» ïîëüçîâàòåëÿ â òî æå ìåñòî,
â êîòîðîì îí íàõîäèëñÿ ïåðåä çàïóñêîì ïðîöåäóðû, â ñòðîêå 14 àêòèâíîé ñòà-
íîâèòñÿ ïåðâîíà÷àëüíàÿ êíèãà.  ñòðîêå 15 ñâîéñòâó ScreenUpdating ïðè-
ñâàèâàåòñÿ çíà÷åíèå True.

Êàê ñîõðàíèòü êíèãó


Åñëè âàøà VBA-ïðîãðàììà âíîñèò â êíèãó èçìåíåíèÿ, âû äîëæíû ïðåäëî-
æèòü ïîëüçîâàòåëþ ñîõðàíèòü èõ. Ñäåëàòü ýòî äîâîëüíî ïðîñòî, èëè âêëþ÷èâ
âñòðîåííóþ êîìàíäó Ñîõðàíèòü â ìåíþ âàøåé ïðîãðàììû, èëè äîáàâèâ êíîïêó
Ñîõðàíèòü íà ïàíåëü èíñòðóìåíòîâ ïðîãðàììû, åñëè ïðîãðàììà èìååò ìåíþ
èëè ïàíåëè èíñòðóìåíòîâ.
Âîçìîæíû ñëó÷àè, êîãäà ó âàñ âîçíèêíåò ïîòðåáíîñòü ñîõðàíèòü êíèãó ïîä
óïðàâëåíèåì ïðîöåäóðû. Íàïðèìåð, âû çàõîòèòå ñîçäàòü ñîáñòâåííóþ âåðñèþ
êîìàíäû Ôàéë | Ñîõðàíèòü. Áîëåå òîãî, âû, âîçìîæíî, ïîïûòàåòåñü ïðåäîñòåðå÷ü
íà÷èíàþùåãî ïîëüçîâàòåëÿ îò âûïîëíåíèÿ íåóäà÷íîé ïîñëåäîâàòåëüíîñòè êî-
ìàíä, òàêèõ êàê çàêðûòèå êíèãè, âûõîä èç ïðîãðàììû èëè èç Excel áåç ñîõðà-
íåíèÿ ðåçóëüòàòîâ ðàáîòû.
Äëÿ ñîõðàíåíèÿ êíèãè ñëåäóåò ïîëüçîâàòüñÿ ìåòîäîì Save:
Ñèíòàêñèñ
Object.Save
392 Ãëàâà 10

 äàííîì ñëó÷àå, Object — ýòî îáúåêòíàÿ ññûëêà íà îòêðûòûé îáúåêò Workbook,


êîòîðûé ñëåäóåò ñîõðàíèòü.

Ñóùåñòâóåò òàêæå î÷åíü óäîáíûé ìåòîä SaveCopyAs. Ýòîò ìåòîä ñîõðàíÿåò


êîïèþ óêàçàííîé êíèãè íà äèñê, íèêàê íå âëèÿÿ íà ýòó êíèãó â ïàìÿòè.
Îáùèé ñèíòàêñèñ ìåòîäà SaveCopyAs âûãëÿäèò ñëåäóþùèì îáðàçîì:
Ñèíòàêñèñ
Object.SaveCopyAs(Filename)
Object — ýòî îáúåêòíàÿ ññûëêà íà îáúåêò Workbook, êîòîðûé áóäåò ñîõðàíåí,
à Filename — ñòðîêîâîå âûðàæåíèå äëÿ èìåíè, êîòîðîå ñëåäóåò èñïîëüçîâàòü ïðè
ñîõðàíåíèè êîïèè êíèãè.

 ëèñòèíãå 10.5 ïðèâåäåí êîä, èñïîëüçóþùèé ìåòîäû Save è SaveCopyAs.

Ëèñòèíã 10.5. Èñïîëüçîâàíèå ìåòîäîâ Save è SaveCopyAs


1: Sub BackUpToZIP()
2: 'Ñîõðàíÿåò àêòèâíóþ êíèãó è äåëàåò åå êîïèþ íà ZIP-äèñêå H:
3:
4: Const SaveDrv = "H:"
5:
6: With ActiveWorkbook
7: If Not .Saved Then .Save
8: .SaveCopyAs Filename:=SaveDrv & "\Copy of " & .Name
9: End With
10: End Sub

Ýòà ïðîöåäóðà ñîõðàíÿåò àêòèâíóþ êíèãó è ñîçäàåò ðåçåðâíóþ êîïèþ íà ëî-


ãè÷åñêîì äèñêå H (ðèñ.10.3). Ïðîöåäóðà íà÷èíàåòñÿ ñ îáúÿâëåíèÿ åäèíñòâåí-
íîé êîíñòàíòû ñ èìåíåì äèñêà. Îïåðàòîð With âûïîëíÿåò íåñêîëüêî êîìàíä
äëÿ îáúåêòà ActiveWorkbook.

Ðèñ. 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

AddToMru (òèï Variant) — àðãóìåíò, êîòîðûé (ïðè ðàâåíñòâå çíà÷åíèþ True)


óêàçûâàåò íà òî, ÷òî ôàéë äîáàâëÿåòñÿ â ñïèñîê íåäàâíî èñïîëüçóåìûõ ôàéëîâ. Ïî
óìîë÷àíèþ ýòîò àðãóìåíò èìååò çíà÷åíèå False.
Ìåòîä SaveAs èìååò è äðóãèå ïàðàìåòðû, î êîòîðûõ âû ìîæåòå óçíàòü èç ñïðàâî÷-
íîé ñèñòåìû.

Êàê çàêðûòü êíèãó


Ïîñëå çàâåðøåíèÿ ðàáîòû ñ êíèãîé, ñëåäóåò åå çàêðûòü, ÷òîáû îñâîáîäèòü
ïàìÿòü è èçáåæàòü «çàñîðåíèÿ» ýêðàíà. Çàêðûòü êíèãó ìîæíî, âîñïîëüçîâàâ-
øèñü îäíîé èç ôîðì ìåòîäà Close:
Ñèíòàêñèñ
Workbooks.Close
Object.Close(SaveChanges)
Ïðè èñïîëüçîâàíèè ïåðâîé ñèíòàêñè÷åñêîé ôîðìû ìîæíî ïðîñòî çàêðûòü âñå îò-
êðûòûå êíèãè. Excel ïðåäëàãàåò ñîõðàíèòü èçìåíåíèÿ â êíèãàõ ïåðåä òåì, êàê èõ
çàêðûòü, åñëè ýòî íåîáõîäèìî. Âòîðàÿ ñèíòàêñè÷åñêàÿ ôîðìà ïîçâîëÿåò çàêðûòü
êîíêðåòíóþ êíèãó, íà êîòîðóþ óêàçûâàåò Object. Àðãóìåíò SaveChanges èñïîëüçó-
åòñÿ ñëåäóþùèì îáðàçîì:
w Åñëè SaveChanges ðàâåí True, Excel ñîõðàíÿåò êíèãó àâòîìàòè÷åñêè, ïåðåä
òåì êàê åå çàêðûòü.
w Åñëè SaveChanges ðàâåí False, Excel çàêðûâàåò êíèãó áåç ñîõðàíåíèÿ èçìåíå-
íèé.
w Åñëè âû îïóñòèòå àðãóìåíò SaveChanges, Excel ïðåäëîæèò (â ñëó÷àå íåîáõîäè-
ìîñòè) âûïîëíèòü ñîõðàíåíèå.

Ëèñòèíã 10.6 äåìîíñòðèðóåò èñïîëüçîâàíèå ìåòîäà Close.

Ëèñòèíã 10.6. Èñïîëüçîâàíèå ìåòîäà Close


1: Sub CloseAll()
2: 'Çàêðûâàåò âñå îòêðûòûå êíèãè è ïðåäëàãàåò ñîõðàíèòü ñäåëàííûå
3: ' â íèõ èçìåíåíèÿ
4: Const qButtons = vbYesNo + vbQuestion
5:
6: Dim Book As Workbook
7: Dim Ans As Integer
8: Dim MsgPrompt As String
9:
10: For Each Book In Workbooks
11: If Not (Book.Name = ThisWorkbook.Name) Then
12: If Not Book.Saved Then
13: MsgPrompt = "Ñîõðàíèòü èçìåíåíèÿ â " & Book.Name & "?"
14: Ans = MsgBox(prompt:=MsgPrompt, Buttons:=qButtons)
15: If Ans = vbYes Then
16: Book.Close SaveChanges:=True
17: Else
18: Book.Close SaveChanges:=False
19: End If
20: Else
21: Book.Close
22: End If
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 395

23: End If
24: Next Book
25: End Sub

Äàííàÿ ïðîöåäóðà çàêðûâàåò âñå îòêðûòûå êíèãè (çà èñêëþ÷åíèåì êíèãè,


ñîäåðæàùåé ïðîöåäóðó) è ïðåäëàãàåò ïîëüçîâàòåëþ ñîõðàíèòü èçìåíåíèÿ äëÿ
êàæäîé êíèãè, èìåþùåé íåñîõðàíåííûå èçìåíåíèÿ. Èñïîëüçóéòå ïðîöåäóðó,
ïîäîáíóþ ýòîé, âìåñòî ìåòîäà Workbooks.Close, êîãäà âàì íåîáõîäèìî, ÷òî-
áû ïîëüçîâàòåëü íå îòìåíÿë îïåðàöèþ ñîõðàíåíèÿ. Âñòðîåííàÿ â Excel êîìàí-
äà Ñîõðàíèòü èìååò êíîïêó Îòìåíà. Ïîñëå îáúÿâëåíèÿ êîíñòàíòû è íåñêîëüêèõ
ïåðåìåííûõ (ñòðîêè ñ 4 ïî 8) ïðîöåäóðà íà÷èíàåò öèêë For Each äëÿ îáðàáîò-
êè âñåõ êíèã â êîëëåêöèè Workbooks.
Ïîñêîëüêó çàêðûòèå êíèãè, ñîäåðæàùåé âûïîëíÿåìóþ â äàííûé ìîìåíò
ïðîöåäóðó, ïðèâåäåò ê åå îñòàíîâêå, ñòðîêà 11 ñîäåðæèò îïåðàòîð If…Then,
êîòîðûé ïðîâåðÿåò, íå èìååò ëè êíèãà, îáðàáàòûâàåìàÿ â äàííûé ìîìåíò, òî
æå ñàìîå èìÿ, ÷òî è êíèãà, ñîäåðæàùàÿ ïðîöåäóðó CloseAll. Åñëè — äà, òî
÷àñòü êîäà, âûïîëíÿþùàÿ çàêðûòèå êíèãè ïðîïóñêàåòñÿ; ñòðîêè ñ 12 ïî 22
âûïîëíÿþòñÿ òîëüêî â òîì ñëó÷àå, åñëè êíèãà íå ñîäåðæèò ïðîöåäóðû
CloseAll. (Ñâîéñòâî ThisWorkbook âîçâðàùàåò ññûëêó íà êíèãó, ñîäåðæà-
ùóþ âûïîëíÿåìûé â äàííûé ìîìåíò êîä.)
Åñëè êíèãà ñîäåðæèò èçìåíåíèÿ, êîòîðûå íå áûëè ñîõðàíåíû (ñòðîêà 12),
ôóíêöèÿ MsgBox (ñòðîêà 13) çàïðàøèâàåò ïîëüçîâàòåëÿ, íåîáõîäèìî ëè ñîõðà-
íÿòü èçìåíåíèÿ. Åñëè ïîëüçîâàòåëü âûáèðàåò Yes (òî åñòü ïåðåìåííàÿ Ans ïî-
ëó÷èò çíà÷åíèå vbYes), ïðîöåäóðà çàïóñêàåò ìåòîä Close ñ àðãóìåíòîì
SaveChanges, ðàâíûì çíà÷åíèþ True (ñòðîêà 16).  ïðîòèâíîì ñëó÷àå ïðîöå-
äóðà çàêðûâàåò êíèãó ñ SaveChanges, ðàâíûì çíà÷åíèþ False (ñòðîêà 18).
Åñëè â êíèãå îòñóòñòâóþò íåñîõðàíåííûå èçìåíåíèÿ, ïðîöåäóðà çàïóñòèò ìå-
òîä Close áåç àðãóìåíòîâ (ñòðîêà 21).

Ðàáîòà ñ îáúåêòàìè Worksheet


Îáúåêòû Worksheet ñîäåðæàò íàáîð ñâîéñòâ è ìåòîäîâ, êîòîðûå âû ìîæåòå
èñïîëüçîâàòü â ñâîåé ïðîãðàììå. Ýòè ñâîéñòâà è ìåòîäû ïîçâîëÿþò äåëàòü ëèñ-
òû àêòèâíûìè è ñêðûâàòü èõ, äîáàâëÿòü â êíèãó íîâûå ëèñòû, à òàêæå ïåðåìå-
ùàòü, êîïèðîâàòü, ïåðåèìåíîâûâàòü èëè óäàëÿòü èõ. Â ñëåäóþùèõ ðàçäåëàõ
îïèñûâàåòñÿ êàæäàÿ èç ýòèõ îïåðàöèé íàä ëèñòîì.

Âîçâðàùåíèå çíà÷åíèÿ îáúåêòà Worksheet


Êàæäûé ëèñò ÿâëÿåòñÿ îáúåêòîì Worksheet, à âñå ëèñòû äàííîé êíèãè îá-
ðàçóþò êîëëåêöèþ Worksheets. Äëÿ ññûëîê íà çàäàííûé ëèñò èñïîëüçóéòå
êîëëåêöèþ Worksheets îáúåêòà Workbook:
Ñèíòàêñèñ
Object.Worksheets(Index)
Object ïðåäñòàâëÿåò ññûëêó íà îáúåêò Workbook, ñîäåðæàùèé ëèñò. Index ìîæåò
áûòü:
w ×èñëîì, ïðåäñòàâëÿþùèì ëèñò, êîòîðûé ñëåäóåò èñïîëüçîâàòü. ×èñëî 1 îçíà-
÷àåò ïåðâûé ëèñò â êíèãå, 2 — âòîðîé ëèñò è òàê äàëåå.
396 Ãëàâà 10

w Èìÿ ëèñòà, êîòîðûé ñëåäóåò èñïîëüçîâàòü, â âèäå ñòðîêè. Ýòî èìÿ, êîòîðîå ïî-
ÿâëÿåòñÿ íà âêëàäêå ëèñòà.

Ëèñòèíã 10.7 ïðåäñòàâëÿåò ïðèìåð íàèáîëåå ÷àñòîãî ñïîñîáà èñïîëüçîâàíèÿ


ìåòîäà Worksheets — êîãäà ëèñò èäåíòèôèöèðóåòñÿ ñòðîêîé òåêñòà.

Ëèñòèíã 10.7. Èñïîëüçîâàíèå êîëëåêöèè Worksheets


1: Sub SetWorksheetProtection()
2: 'Àêòèâèçèðóåò çàùèòó ëèñòà
3:
4: Workbooks("Áàëàíñîâûé îò÷åò 1207.xlsx").Worksheets("Ðàñõîäû").Protect
_
5: Contents:=True, Scenarios:=True
6: MsgBox "Çàùèòà ëèñòà 'Ðàñõîäû' àêòèâèçèðîâàíà."
7: End Sub

Îáúåêò Workbooks("Áàëàíñîâûé îò÷åò 1207.XLSX").Worksheets("Ðàñõîäû")


âîçâðàùàåò ññûëêó íà ëèñò ñ èìåíåì Ðàñõîäû â êíèãå Áàëàíñîâûé îò÷åò
1207.xlsx. Ìåòîä Protect çàäàåò çàùèòó äëÿ ñîäåðæèìîãî è ñöåíàðèÿ. Ïðîöåäóðà
MsgBox èíôîðìèðóåò ïîëüçîâàòåëÿ î òîì, ÷òî çàùèòà ëèñòà àêòèâèçèðîâàíà.
Äëÿ ðàáîòû ðàññìàòðèâàåìîé ïðîãðàììû íåîáõîäèìî, ÷òîáû â êîëëåêöèè
Workbook èìåëàñü òà êíèãà, íà êîòîðóþ âûïîëíÿåòñÿ ññûëêà — Áàëàíñîâûé
îò÷åò 1202.xlsx. Åñëè ýòî — íå òàê, VBA âûäàñò ñîîáùåíèå îá runtime-
îøèáêå 9 «Subscript out of range», êîòîðîå âðÿä ëè ïîìîæåò âàì ñðàçó ïîíÿòü
ïðè÷èíó îøèáêè.
Õîðîøèì ïðàâèëîì ïðè ïðîãðàììèðîâàíèè ÿâëÿåòñÿ ïðîâåðêà íàëè÷èÿ
îáúåêòà â êîëëåêöèè ïåðåä ïîïûòêîé åãî èñïîëüçîâàíèÿ. Â ñëåäóþùåì ëèñ-
òèíãå çàùèòà ëèñòà êíèãè Áàëàíñîâûé îò÷åò 1202.xlsx âûïîëíÿåòñÿ â òîì ñëó-
÷àå, åñëè ýòà êíèãà íàõîäèòñÿ â êîëëåêöèè Workbooks. Íàëè÷èå ñàìîãî ëèñòà
â êíèãå íå ïðîâåðÿåòñÿ, õîòÿ ìîæíî áûëî áû ïðîâåðèòü è ýòî.

Ëèñòèíã 10.8. Èñïîëüçîâàíèå êîëëåêöèè Worksheets


1: Sub SetWorksheetProtection()
2: ' Àêòèâèçèðóåò çàùèòó ëèñòà ñ ïðîâåðêîé
3: ' íàëè÷èÿ êíèãè â êîëëåêöèè Workbooks
4: Dim ProtYes As Boolean
5: ProtYes = False
6:
7: For Each Book In Workbooks
8: If (Book.Name = "Áàëàíñîâûé îò÷åò 1207.xlsx") Then
9: Book.Worksheets("Ðàñõîäû").Protect _
10: Contents:=True, Scenarios:=True
11: MsgBox "Çàùèòà ëèñòà 'Ðàñõîäû' àêòèâèçèðîâàíà "
12: ProtYes = True
13: Exit For
14: End If
15: Next Book
16:
17: If Not ProtYes Then MsgBox "Êíèãà íå íàéäåíà!"
18:
19: End Sub
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 397

 ñòðîêàõ 4 è 5 îáúÿâëÿåòñÿ è èíèöèàëèçèðóåòñÿ ïåðåìåííàÿ ProtYes, êî-


òîðàÿ èñïîëüçóåòñÿ â êà÷åñòâå èíäèêàòîðà íàëè÷èÿ íåîáõîäèìîé êíèãè â êîë-
ëåêöèè Workbooks. Â öèêëå For Each (ñòðîêè 7–15) äëÿ êàæäîé êíèãè ïðîâå-
ðÿåòñÿ ñâîéñòâî Name. Ïðè ñîâïàäåíèè ýòîãî ñâîéñòâà ñî ñòðîêîé "Áàëàíñîâûé
îò÷åò 1202.xlsx" âûïîëíÿåòñÿ çàùèòà ëèñòà Ðàñõîäû (ñòðîêà 9), ïåðåìåííîé
ProtYes ïðèñâàèâàåòñÿ çíà÷åíèå True (êíèãà íàéäåíà), ïðîèñõîäèò âûõîä èç
öèêëà ïðè ïîìîùè îïåðàòîðà Exit For. Â ñòðîêå 17 âûäàåòñÿ ñîîáùåíèå îá îò-
ñóòñòâèè íåîáõîäèìîé êíèãè â êîëëåêöèè Workbooks, åñëè ïåðåìåííàÿ
ProtYes ñîäåðæèò çíà÷åíèå False.
Åñëè âàì íåîáõîäèìî ñîñëàòüñÿ íà àêòèâíûé ëèñò, èñïîëüçóéòå ñâîéñòâî
êíèãè ActiveSheet. Åñëè âàì íóæíî ñîñëàòüñÿ íà âñå ñòðàíèöû êíèãè (èëè
âû íå óâåðåíû, êàêîé òèï ëèñòà íåîáõîäèìî âûáðàòü), èñïîëüçóéòå âìåñòî êîë-
ëåêöèè WorkSheets êîëëåêöèþ Sheets. Êîëëåêöèÿ Sheets ñîäåðæèò íå òîëü-
êî ëèñòû, íî è äèàãðàììû.

Êàê ñäåëàòü ëèñò àêòèâíûì


Áîëüøèíñòâî êíèã ñîäåðæàò áîëåå îäíîãî ëèñòà, ïîýòîìó âàøåé ïðîãðàììå
ìîæåò ïîíàäîáèòüñÿ ïåðåêëþ÷àòüñÿ ñ îäíîãî ëèñòà íà äðóãîé. Íàïðèìåð, îòî-
áðàçèòü îäèí ëèñò äëÿ ââîäà äàííûõ è çàòåì ïåðåêëþ÷èòüñÿ íà äðóãîé ëèñò,
÷òîáû ïðîñìîòðåòü îò÷åò èëè äèàãðàììó. Âûïîëíÿòü ïåðåêëþ÷åíèå ìåæäó ëèñ-
òàìè ìîæíî ïðè ïîìîùè ìåòîäà Activate, èìåþùåãî ñëåäóþùèé ñèíòàêñèñ:
Ñèíòàêñèñ
Object.Activate
Object ïðåäñòàâëÿåò ññûëêó íà îáúåêò Worksheet, êîòîðûé ñëåäóåò ñäåëàòü àêòèâ-
íûì.

Ëèñòèíã 10.9 ñîäåðæèò ïðèìåð èñïîëüçîâàíèÿ ìåòîäà Activate.

Ëèñòèíã 10.9. Èñïîëüçîâàíèå ìåòîäà Activate äëÿ ïåðåõîäà íà çàäàííûé ëèñò


1: Sub DisplaySheet()
2: ' Óñòàíàâëèâàåò àêòèâíûì ëèñò "Ðàñõîäû"
3:
4: Dim Ans As Integer, qBtns As Integer
5: Dim mPrompt As String
6:
7: mPrompt = "Õîòèòå ïðîñìîòðåòü ""Ðàñõîäû""?"
8: qBtns = vbYesNo + vbQuestion + vbDefaultButton2
9: Ans = MsgBox(prompt:=mPrompt, Buttons:=qBtns)
10: If Ans = vbYes Then
11: Workbooks("Áàëàíñîâûé îò÷åò 1203.xlsx").Worksheets("Ðàñõîäû").Acti-
vate
12: End If
13: End Sub

 äàííîé ïðîöåäóðå ïîëüçîâàòåëþ çàäàåòñÿ âîïðîñ, õî÷åò ëè îí ïðîñìîòðåòü


îïðåäåëåííûé ëèñò, â äàííîì ñëó÷àå — Ðàñõîäû (ñòðîêè 7–9 ïðîãðàììû).
Åñëè ïîëüçîâàòåëü âûáèðàåò êíîïêó Yes, òî ëèñò ñ èìåíåì Ðàñõîäû ñòàíîâèòñÿ
àêòèâíûì (ñòðîêà 11).
Äëÿ âûáîðà ëèñòà èñïîëüçóéòå ìåòîä Select:
398 Ãëàâà 10

Object.Select
Äàííûé ìåòîä ïîëåçåí äëÿ ñîçäàíèÿ òðåõìåðíûõ ññûëîê è îïðåäåëåíèÿ
ëèñòîâ, êîòîðûå ñëåäóåò âûâåñòè íà ïå÷àòü. Òðåõìåðíàÿ ññûëêà (three-
dimensional reference) — ýòî ññûëêà íà äèàïàçîí ÿ÷ååê áîëåå ÷åì îäíîãî ëèñòà.
Íå ñëåäóåò áåç íåîáõîäèìîñòè äåëàòü ëèñò àêòèâíûì. Äëÿ áîëüøèíñòâà
ñâîéñòâ è ìåòîäîâ îáúåêòà Worksheet âû ìîæåòå ïðîñòî âîñïîëüçîâàòüñÿ ìåòî-
äîì Worksheets äëÿ ññûëîê íà ëèñò, êîòîðûé íóæíî èñïîëüçîâàòü. Íàïðè-
ìåð, ñëåäóþùèé îïåðàòîð âîçâðàùàåò ñòàíäàðòíóþ øèðèíó ëèñòà Ãðàôèê áà-
ëàíñà, íå äåëàÿ ýòîò ëèñò àêòèâíûì:
StdWidth = Worksheets("Ãðàôèê áàëàíñà").StandardWidth

Êàê ñîçäàòü íîâûé ëèñò


Êîëëåêöèÿ Worksheets èìååò ìåòîä Add, êîòîðûé âû ìîæåòå èñïîëüçîâàòü
äëÿ äîáàâëåíèÿ â êíèãó íîâûõ ëèñòîâ. Ñèíòàêñè÷åñêàÿ êîíñòðóêöèÿ ïðèìåíå-
íèÿ äàííîãî ìåòîäà ñëåäóþùàÿ:
Ñèíòàêñèñ
Object.Worksheets.Add([Before] [, Count] [, Type])
Object ïðåäñòàâëÿåò ññûëêó íà îáúåêò Workbook, â êîòîðûé äîáàâëÿåòñÿ íîâûé
ëèñò. Àðãóìåíò Before çàäàåò ëèñò, ïåðåä êîòîðûì äîáàâëÿåòñÿ íîâûé ëèñò, à àðãó-
ìåíò After — ëèñò, ïîñëå êîòîðîãî äîáàâèòñÿ íîâûé ëèñò. (Íåëüçÿ èñïîëüçîâàòü àð-
ãóìåíòû Before è After îäíîâðåìåííî â îäíîì è òîì æå îïåðàòîðå.) Åñëè îïóñòèòü
îáà àðãóìåíòà: êàê Before, òàê è After, VBA äîáàâèò íîâûé ëèñò ïåðåä àêòèâíûì
ëèñòîì.
Count — êîëè÷åñòâî âíîâü äîáàâëÿåìûõ ëèñòîâ. (Åñëè îïóñòèòü Count, ìåòîä Add
äîáàâèò îäèí ëèñò.) Type — òèï äîáàâëÿåìîãî ëèñòà. Ñóùåñòâóþò ñëåäóþùèå âîç-
ìîæíûå âàðèàíòû àðãóìåíòà Type (îïðåäåëåííûå â êëàññå XlSheetType):
xlWorksheet (óñòàíàâëèâàåòñÿ ïî óìîë÷àíèþ), xlChart, xlExcel4MacroSheet
èëè xlExcel4IntlMacroSheet.

Êàê ïåðåèìåíîâàòü ëèñò


Èìÿ ëèñòà — ýòî òåêñò, êîòîðûé ïîÿâëÿåòñÿ íà ÿðëû÷êå ëèñòà.  ñëó÷àå íå-
îáõîäèìîñòè ïåðåèìåíîâàòü ëèñò ñëåäóåò èçìåíèòü ñâîéñòâî Name ëèñòà:
Ñèíòàêñèñ
Object.Name
Object — ýòî ëèñò, êîòîðûé áóäåò ïåðåèìåíîâàí.

Êîïèðîâàíèå è ïåðåìåùåíèå ëèñòà


Åñëè âàì íåîáõîäèìî ðàñïîëîæèòü ëèñòû êíèãè â îïðåäåëåííîì ïîðÿäêå,
èñïîëüçóéòå ìåòîäû Copy è Move. Îáà ìåòîäà èìåþò îäèíàêîâûé ñèíòàêñèñ:
Ñèíòàêñèñ
Object.Copy([Before] [, After])
Object.Move([Before] [, After])
Object — îáúåêòíàÿ ññûëêà íà ëèñò, êîòîðûé íåîáõîäèìî ñêîïèðîâàòü èëè ïåðåìå-
ñòèòü. Before çàäàåò ëèñò ïåðåä êîòîðûì, à After — ëèñò ïîñëå êîòîðîãî áóäåò ïî-
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 399

ìåùåí êîïèðóåìûé èëè ïåðåìåùàåìûé ëèñò. (Íåëüçÿ èñïîëüçîâàòü àðãóìåíòû


Before è After îäíîâðåìåííî â îäíîì îïåðàòîðå.) Åñëè îïóñòèòü êàê Before, òàê
è After, VBA ñîçäàñò äëÿ êîïèðóåìîãî èëè ïåðåìåùàåìîãî ëèñòà íîâóþ êíèãó.

Ëèñòèíã 10.10 ñîäåðæèò ïðîöåäóðó, èñïîëüçóþùóþ ìåòîä Move.

Ëèñòèíã 10.10. Èñïîëüçîâàíèå ìåòîäà Move äëÿ ïåðåìåùåíèÿ ëèñòà


1: Sub CreateWorksheet()
2: 'Ñîçäàíèå íîâîãî ëèñòà è ïåðåìåùåíèå
3: 'åãî â êîíåö êíèãè
4:
5: Dim NewSheet As String
6:
7: Worksheets.Add before:=Worksheets(Worksheets.Count)
8: NewSheet = ActiveSheet.Name
9: With Worksheets(NewSheet)
10: .Move after:=Worksheets(Worksheets.Count)
11: .Activate
12: End With
13:
14: End Sub

Ñ ïîìîùüþ ìåòîäà Add â êíèãó äîáàâëÿåòñÿ ëèñò (ñòðîêà 7). Â äàííîì ñëó-
÷àå ìåòîä Add âûçûâàåòñÿ ñ íåîáÿçàòåëüíûì àðãóìåíòîì Before äëÿ òîãî, ÷òî-
áû äîáàâèòü íîâûé ëèñò íåïîñðåäñòâåííî ïåðåä ïîñëåäíèì ëèñòîì êíèãè. Íî-
ìåð ïîñëåäíåãî ëèñòà êíèãè îïðåäåëÿåòñÿ â ñòðîêå 7 ñ ïîìîùüþ ñâîéñòâà
Count, êîòîðîå âîçâðàùàåò êîëè÷åñòâî ëèñòîâ â êíèãå. Ïîñëå ÷åãî íîâîå íàçâà-
íèå ëèñòà ñîõðàíÿåòñÿ â ïåðåìåííîé NewSheet.
 ñòðîêå 10 ñ ïîìîùüþ ìåòîäà Move, íîâûé ëèñò ïîìåùàåòñÿ çà ïîñëåäíèì
ëèñòîì êíèãè. (Äëÿ òîãî ÷òîáû ïîëó÷èòü êîëè÷åñòâî ëèñòîâ â êíèãå, âíîâü èñ-
ïîëüçóåòñÿ ñâîéñòâî Count.) Ïîñëå ýòîãî íîâûé ëèñò óñòàíàâëèâàåòñÿ àêòèâ-
íûì (ñòðîêà 11).
Åñëè âû ðàçðàáàòûâàåòå ïðèëîæåíèå, â êîòîðîì ÷àñòî ïðèõîäèòñÿ ñîçäà-
âàòü è ïåðåìåùàòü ëèñòû, áóäåò íåïëîõîé ïðàêòèêîé óñòàíàâëèâàòü ïåðåä ýòè-
ìè îïåðàöèÿìè êîìàíäû îòêëþ÷åíèÿ îáíîâëåíèÿ ýêðàíà (Application.Scre-
enUpdating = False). Ïðè ýòîì ñëåäóåò íå çàáûâàòü âêëþ÷àòü îáíîâëåíèå ýêðà-
íà, åñëè âàøà ïðîöåäóðà åãî îòêëþ÷àëà (Application.ScreenUpdating = True).
Ïîìíèòå, ÷òî âû ìîæåòå äîáàâèòü ëèñò è ïîñëå ëþáîãî çàäàííîãî ëèñòà.
Ïðîöåäóðà â ëèñòèíãå 10.10 äîáàâëÿåò ëèñò ïåðåä ïîñëåäíèì ëèñòîì è çàòåì
ïåðåìåùàåò åãî, ïîñêîëüêó Excel íå ïîçâîëÿåò äîáàâëÿòü ëèñòû â êîíåö êíèãè.
Èñïîëüçîâàíèå àðãóìåíòà After, ñîâìåñòíî ñ ìåòîäîì Add ïîçâîëÿåò äîáàâèòü
íîâûé ëèñò ïîñëå ëþáîãî ñóùåñòâóþùåãî ëèñòà, çà èñêëþ÷åíèåì ïîñëåäíåãî.

Êàê óäàëèòü ëèñò


 öåëÿõ ïîääåðæàíèÿ óïðàâëÿåìîñòè êíèãàìè è ýêîíîìèè ìåñòà íà äèñêå
íåíóæíûå ëèñòû ñëåäóåò óäàëÿòü. Ýòî îñîáåííî àêòóàëüíî â ñëó÷àÿõ, êîãäà
ñîçäàííûå âàìè ïðèëîæåíèÿ èñïîëüçóþò äëÿ õðàíåíèÿ ïðîìåæóòî÷íûõ ðå-
çóëüòàòîâ âðåìåííûå ëèñòû. Äëÿ óäàëåíèÿ ëèñòà èñïîëüçóéòå ìåòîä Delete:
Ñèíòàêñèñ
Object.Delete
400 Ãëàâà 10

Object — ññûëêà íà ëèñò, êîòîðûé ñëåäóåò óäàëèòü.

Ëèñòèíã 10.11 äåìîíñòðèðóåò ïðèìåð èñïîëüçîâàíèÿ ìåòîäà Delete.

Ëèñòèíã 10.11. Èñïîëüçîâàíèå ìåòîäà Delete äëÿ óäàëåíèÿ ëèñòà


1: Sub DeleteTemporarySheets()
2: 'Óäàëåíèå âñåõ âðåìåííûõ ëèñòîâ
3:
4: Dim Sheet As Worksheet
5:
6: Application.DisplayAlerts = False
7:
8: For Each Sheet In Workbooks("Áàëàíñîâûé îò÷åò 1207.xlsx").Worksheets
9: If InStr(1, Sheet.Name, "Âðåìåííûé") Then
10: Sheet.Delete
11: End If
12: Next Sheet
13:
14: Application.DisplayAlerts = True
15: End Sub

Ýòà ïðîöåäóðà ïðîâåðÿåò êàæäûé ëèñò êíèãè è óäàëÿåò âñå ðàíåå ñîçäàííûå
âðåìåííûå ëèñòû. Ïðîöåäóðà «ïîëàãàåò», ÷òî âðåìåííûå ëèñòû äîëæíû íàçû-
âàòüñÿ Âðåìåííûé1, Âðåìåííûé2 è òàê äàëåå.
Ïðîöåäóðà îáúÿâëÿåò îáúåêòíóþ ïåðåìåííóþ Sheet (òèïà Worksheet) è çà-
äàåò ñâîéñòâî DisplayAlerts îáúåêòà Application, ðàâíûì çíà÷åíèþ False
(ñòðîêà 6). Òàêèì îáðàçîì ïîäàâëÿåòñÿ îáû÷íîå äèàëîãîâîå Excel-îêíî ïîä-
òâåðæäåíèÿ, êîòîðîå ïîÿâëÿåòñÿ âñÿêèé ðàç, êîãäà âû ïûòàåòåñü óäàëèòü
ëèñò.  ñòðîêå 8 íà÷èíàåòñÿ öèêë For Each, ïåðåáèðàþùèé âñå ëèñòû êíèãè
Áàëàíñîâûé îò÷åò 1202.xlsx. Ôóíêöèÿ InStr ïðîâåðÿåò êàæäûé ëèñò íà íàëè-
÷èå â íàçâàíèè ëèñòà ñòðîêè «Âðåìåííûé». Åñëè òàêàÿ ñòðîêà îáíàðóæèâàåò-
ñÿ, òî (â ñòðîêå 10 êîäà) ýòîò ëèñò óäàëÿåòñÿ. Êîãäà äàííûé ïðîöåññ çàâåðøàåò-
ñÿ, ñâîéñòâî DisplayAlerts âíîâü ïîëó÷àåò çíà÷åíèå True (ñòðîêà 14).
Ïðîöåäóðà â ëèñòèíãå 10.11 áóäåò ðàáîòàòü ïðàâèëüíî, åñëè Option
Compare Text ÿâëÿåòñÿ òåêóùåé ãëîáàëüíîé óñòàíîâêîé ñðàâíåíèÿ.

Ìåòîäû, âîçâðàùàþùèå îáúåêòû Range


Íàèáîëüøóþ äîëþ ïðè ðàáîòå ñ ëèñòîì ñîñòàâëÿþò: ââîä èíôîðìàöèè,
êîïèðîâàíèå äàííûõ, à òàêæå âûïîëíåíèå ôîðìàòèðîâàíèÿ, âêëþ÷àÿ ðàáîòó
ñ ÿ÷åéêàìè, äèàïàçîíàìè ÿ÷ååê è èõ èìåíàìè. Íåò íè÷åãî óäèâèòåëüíîãî
â òîì, ÷òî òàê ìíîãî ìåòîäîâ îáúåêòà Excel â VBA, â êîíå÷íîì ñ÷åòå,
âûïîëíÿþò êàêèå-ëèáî äåéñòâèÿ ñ äèàïàçîíîì ÿ÷ååê.
Ïðè îáû÷íîé äèàëîãîâîé ðàáîòå ñ Excel ïðåæäå ÷åì ðàáîòàòü ñ äèàïàçîíîì
ÿ÷ååê ëèñòà, äèàïàçîí íåîáõîäèìî âûäåëèòü. Äëÿ ïðîöåäóðû VBA ýòî îçíà÷à-
åò, ÷òî âû äîëæíû ñîñëàòüñÿ íà äèàïàçîí ÿ÷ååê ëèñòà, ïåðåä òåì êàê ñìîæåòå
÷òî-íèáóäü ñ íèì ñäåëàòü. Íàèáîëåå ðàñïðîñòðàíåííûì èç âñåõ îáúåêòîâ Excel
ÿâëÿåòñÿ îáúåêò Range. Îáúåêò Range ìîæåò áûòü îäíîé ÿ÷åéêîé, ñòðîêîé,
êîëîíêîé, íàáîðîì ÿ÷ååê è äàæå òðåõìåðíûì äèàïàçîíîì çíà÷åíèé (òî åñòü
íàáîðîì ÿ÷ååê íåñêîëüêèõ ëèñòîâ).
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 401

Èñïîëüçîâàíèå Range ìåòîäà


Íàèáîëåå ëåãêèé è ïðÿìîé ñïîñîá çàäàòü ÿ÷åéêó èëè äèàïàçîí ÿ÷ååê ñîñòî-
èò â èñïîëüçîâàíèè ìåòîäà Range:
Ñèíòàêñèñ
Object.Range(Name)
Object — ññûëêà íà îáúåêò Worksheet, êîòîðûé ñîäåðæèò äèàïàçîí ÿ÷ååê. Åñëè âû
îïóñòèòå Object, VBA áóäåò «ñ÷èòàòü», ÷òî ìåòîä ïðèìåíÿåòñÿ ê îáúåêòó
ActiveSheet. Àðãóìåíò Name — ññûëêà íà äèàïàçîí ÿ÷ååê èëè èìÿ äèàïàçîíà,
ââåäåííîå êàê òåêñò. Ìåòîä Range ðàáîòàåò òàêæå ñ èìåíîâàííûìè äèàïàçîíàìè
ÿ÷ååê.

Êîä ëèñòèíãà 10.12 äåìîíñòðèðóåò ïðèìåð èñïîëüçîâàíèÿ ìåòîäà Range.

Ëèñòèíã 10.12. Èñïîëüçîâàíèå ìåòîäà Range


1: Sub FormatRangeFont()
2: 'Ñ ïîìîùüþ ìåòîäà Range çàäàåòñÿ øðèôò äëÿ äèàïàçîíà ÿ÷ååê
3:
4: With Worksheets("Ëèñò1")
5: .Range("A1:L1").Font.Size = 24
6: .Range("A1:L1").Font.Bold = True
7: .Range("A1:L1").Font.Name = "Times New Roman"
8: End With
9: End Sub

 ýòîì ïðèìåðå âñå òðè îïåðàòîðà (ñòðîêè ñ 5 ïî 7) âîçâðàùàþò äèàïàçîí


ÿ÷ååê À1:L1 ëèñòà Ëèñò1. (Îáðàòèòå âíèìàíèå íà òî, ÷òî äèàïàçîí ÿ÷ååê ñëå-
äóåò çàêëþ÷àòü â êàâû÷êè.)
Ïðîöåäóðà ëèñòèíãà 10.12 óñòàíàâëèâàåò íåêîòîðûå àòðèáóòû øðèôòà äëÿ
çàäàííîãî äèàïàçîíà ÿ÷ååê. Font — ñâîéñòâî îáúåêòà Range. Font âîçâðàùàåò
ññûëêó íà îáúåêò Font, ñâÿçàííûé ñ çàäàííûì äèàïàçîíîì çíà÷åíèé. Ñâîéñò-
âà îáúåêòà Font — òå æå ñàìûå, ÷òî è àòðèáóòû øðèôòà, êîòîðûå ìîæíî çà-
äàòü ïðè ïîìîùè äèàëîãîâîãî îêíà Øðèôò: ïîëóæèðíûé, êóðñèâ, ïîä÷åðêíó-
òûé è äðóãèå. Íèæå â êà÷åñòâå ïðèìåðà ïðåäñòàâëåíî íåñêîëüêî1 ñâîéñòâ îáú-
åêòà Font (âî âñåõ ñëó÷àÿõ Object — îáúåêò òèïà Range):
¨ Object.Font.Bold: Óñòàíàâëèâàåò (èëè îòìåíÿåò) ïîëóæèðíûé ñòèëü
øðèôòà (True èëè False).
¨ Object.Font.Italic: Óñòàíàâëèâàåò (èëè îòìåíÿåò) êóðñèâ (True èëè
False).
¨ Object.Font.Underline: Óñòàíàâëèâàåò ýôôåêò ïîä÷åðêèâàíèÿ âêëþ-
÷åííûì èëè âûêëþ÷åííûì. Çíà÷åíèå ñâîéñòâà Underline ìîæåò áûòü
ðàâíî îäíîé èç âñòðîåííûõ êîíñòàíò, îïðåäåëåííûõ â êëàññå
XlUnderlineStyle: xlUnderlineStyleNone, xlUnderlineStyleSing-
le, xlUnderlineStyleDouble, xlUnderlineStyleSingleAccounting
èëè xlUnderlineStyleDoubleAccounting.

1 Äëÿ òîãî ÷òîáû ïðîñìîòðåòü ïîëíûé ñïèñîê ñâîéñòâ Font, èñïîëüçóéòå èíñòðóìåíò Ob-
ject Browser.
402 Ãëàâà 10

¨ Object.Font.Name: Óñòàíàâëèâàåò íàèìåíîâàíèå øðèôòà. Çíà÷åíèå


ñâîéñòâà Name îïðåäåëÿåòñÿ, íàïðèìåð, â âèäå ñòðîêè "Arial".
¨ Object.Font.Size: Óñòàíàâëèâàåò ðàçìåð øðèôòà (â ïóíêòàõ).
 Excel èìååòñÿ àëüòåðíàòèâíàÿ ñèíòàêñè÷åñêàÿ êîíñòðóêöèÿ äëÿ ìåòîäà
Range, ïðèìåíåíèå êîòîðîé òðåáóåò äâóõ àðãóìåíòîâ:
Ñèíòàêñèñ
Object.Range(Cell1, Cell2)
Êàê îáû÷íî, Object — ÿâëÿåòñÿ îáúåêòîì òèïà Worksheet, ñîäåðæàùèì äèàïàçîí
çíà÷åíèé ÿ÷ååê. Àðãóìåíò Cell1 îïðåäåëÿåò âåðõíèé ëåâûé óãîë äèàïàçîíà,
à Cell2 — ïðàâûé íèæíèé óãîë. Êàæäûé àðãóìåíò ìîæåò áûòü òåêñòîâûì àäðåñîì
ÿ÷åéêè, îáúåêòîì Range, ñîñòîÿùèì èç îäíîé ÿ÷åéêè, èëè æå öåëûì ñòîëáöîì
èëè ñòðîêîé.

Ïðåèìóùåñòâî èñïîëüçîâàíèÿ äàííîé ñèíòàêñè÷åñêîé êîíñòðóêöèè çàêëþ-


÷àåòñÿ â ðàçäåëåíèè óãëîâûõ çíà÷åíèé â ðàçëè÷íûõ àðãóìåíòàõ, ÷òî ïîçâîëÿåò
íåçàâèñèìî èçìåíÿòü çíà÷åíèå äëÿ êàæäîãî èç «óãëîâ» ïîä óïðàâëåíèåì ïðî-
öåäóðû. Íàïðèìåð, âû ìîæåòå çàäàâàòü èìåíà ïåðåìåííûõ, òàêèõ êàê
UpperLeft è LowerRight, è âîçâðàùàòü îáúåêòû Range ðàçëè÷íûõ ðàçìåðîâ
â âèäå
Range(UpperLeft, LowerRight)
Íå ñëåäóåò èñïîëüçîâàòü â ìåòîäå Range êîîðäèíàòû äèàïàçîíîâ, åñëè äîñòóï-
íû èõ èìåíà. Èìåíà äèàïàçîíîâ îáëåã÷àþò âîñïðèÿòèå è îòëàäêó ïðîãðàììû.

Èñïîëüçîâàíèå ìåòîäà Cells


Õîòÿ äëÿ òîãî ÷òîáû âûïîëíèòü ññûëêó íà îäíó ÿ÷åéêó, ìîæíî âîñïîëüçî-
âàòüñÿ ìåòîäîì Range, òàêóþ æå âîçìîæíîñòü äàåò è ìåòîä Cells, êîòîðûé
ÿâëÿåòñÿ áîëåå ãèáêèì:
Ñèíòàêñèñ
Object.Cells(RowIndex, ColumnIndex)
Object — ññûëêà èëè íà Worksheet, èëè íà îáúåêò Range, ñîäåðæàùèé ÿ÷åéêó,
ñ êîòîðîé íåîáõîäèìî ðàáîòàòü. Åñëè Object îïóùåí, ìåòîä ïðèìåíÿåòñÿ ê îáúåêòó
ActiveSheet.
RowIndex — íîìåð ñòðîêè, â êîòîðîé íàõîäèòñÿ ÿ÷åéêà. Åñëè Object — ëèñò, òî
RowIndex, ðàâíûé 1, ññûëàåòñÿ íà ñòðîêó 1 ëèñòà. Åñëè Object — äèàïàçîí çíà÷å-
íèé, òî RowIndex, ðàâíûé 1, ññûëàåòñÿ íà ïåðâóþ ñòðîêó äèàïàçîíà.
ColumnIndex — íîìåð ñòîëáöà, â êîòîðîì ðàñïîëîæåíà ÿ÷åéêà. Âû ìîæåòå ââåñòè
èëè áóêâó (êàê áóêâåííóþ êîíñòàíòó èëè êàê ñòðîêîâóþ ïåðåìåííóþ), èëè ÷èñëî,
çàäàþùåå ñòîëáåö. Åñëè Object — ëèñò, òî ColumnIndex, ðàâíûé "A" èëè 1, ññûëà-
åòñÿ íà ñòîëáåö A ëèñòà. Åñëè Object — äèàïàçîí çíà÷åíèé, òî ColumnIndex, ðàâ-
íûé "A" èëè 1, ññûëàåòñÿ íà ïåðâûé ñòîëáåö äèàïàçîíà.

 ëèñòèíãå 10.13 ïðèâåäåí ïðèìåð èñïîëüçîâàíèÿ ìåòîäà Cells.

Ëèñòèíã 10.13. Èñïîëüçîâàíèå ìåòîäà Cells


1: Sub CmdWrite_Click()
2: 'Ââîä äàííûõ èç äèàëîãîâîãî îêíà ôîðìû ïîëüçîâàòåëÿ â ëèñò
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 403

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). Ïðîöåäóðà CmdWrite_Click âûçûâàåòñÿ
ïðè íàæàòèè êíîïêè Çàïèñü äèàëîãîâîãî îêíà. Ïðîöåäóðà CmdWrite_Click çà-
ïèñûâàåò íîâûå äàííûå â ëèñò â êîíåö äèàïàçîíà ÿ÷ååê áàçû äàííûõ è óâåëè-
÷èâàåò äèàïàçîí ÿ÷ååê áàçû äàííûõ äëÿ âêëþ÷åíèÿ íîâîé ñòðîêè.

Ðèñ. 10.4
Äèàëîãîâîå îêíî (â ðåæèìå
ðàçðàáîòêè) äëÿ ââîäà äàííûõ

Îïèñàíèå ýëåìåíòîâ óïðàâëåíèÿ, íà êîòîðûå ññûëàåòñÿ êîä ïðîöåäóðû ëèñ-


òèíãà 10.13, ïðèâåäåíî â ñëåäóþùåé òàáëèöå:

Ñâîéñòâ
Òèï ýëåìåíòà Çíà÷åíèå Ïðèìå÷àíèå
î
Èìÿ ôîðìû, íà êîòîðîå ìîæíî ññûëàòüñÿ
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
ðàáîòàåò ñ äàííûìè, ââîäèìûìè
ñ èñïîëüçîâàíèåì äèàëîãîâîãî îêíà, ïîäîáíîãî
ýòîìó

 ñòðîêàõ ñ 4 ïî 6 îáúÿâëÿþòñÿ ïåðåìåííûå, èñïîëüçóåìûå â ïðîöåäóðå.


Ñòðîêà 8 íà÷èíàåòñÿ îïåðàòîðîì With, çàäàþùèì äèàïàçîí ÿ÷ååê, íà êîòîðûå
ññûëàåòñÿ èìÿ Áàçà_äàííûõ. Â ñòðîêå 10 ïåðåìåííîé DBNewRow ïðèñâàèâà-
åòñÿ çíà÷åíèå, ñîîòâåòñòâóþùåå ñòðîêå, ðàñïîëîæåííîé ñðàçó æå çà äèàïàçî-
íîì ÿ÷ååê áàçû äàííûõ — ýòî ñòðîêà, â êîòîðîé äîëæíû áûòü ñîõðàíåíû íî-
âûå äàííûå.
Öèêë For...Next (â ñòðîêàõ ñ 13 ïî 16) çàïèñûâàåò çíà÷åíèÿ èç äèàëîãîâîãî
îêíà ôîðìû ïîëüçîâàòåëÿ â ëèñò. Ñ÷åò÷èê öèêëà (I) «ïðîáåãàåò» çíà÷åíèÿ îò 1
äî ÷èñëà ñòîëáöîâ äèàïàçîíà ÿ÷ååê, ïîëó÷åííîãî ïðè íàõîæäåíèè ñâîéñòâà
Count êîëëåêöèè Columns äëÿ îáúåêòà Range. (Êîëëåêöèÿ Columns ñîäåðæèò
âñå ñòîëáöû îáúåêòà Range, à åãî ñâîéñòâî Count âîçâðàùàåò ÷èñëî ñòîëáöîâ.)
Âíóòðè öèêëà ìåòîä Cells (ñòðîêà 14) âîçâðàùàåò êàæäóþ ÿ÷åéêó â íîâîé
ñòðîêå è ñâîéñòâî Value ÿ÷åéêè óñòàíàâëèâàåòñÿ â çíà÷åíèå, ðàâíîå ñîîòâåòñò-
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 405

âóþùåìó òåêñòó â ýëåìåíòå óïðàâëåíèÿ îêíà ðåäàêòèðîâàíèÿ. Ïðåäïîëàãàåò-


ñÿ, ÷òî êàæäûé ýëåìåíò óïðàâëåíèÿ îêíà ðåäàêòèðîâàíèÿ â ôîðìå ïîëüçîâàòå-
ëÿ èìååò èìÿ (ïî óìîë÷àíèþ) TextBoxN, ãäå N — íîìåð òåêñòîâîãî îêíà â ïî-
ñëåäîâàòåëüíîñòè ïîìåùåíèÿ åãî íà ôîðìó è ñîîòâåòñòâóþùåãî ñòîëáöà
â äèàïàçîíå ÿ÷ååê áàçû äàííûõ. Òàêèì îáðàçîì, â ñòðîêå 15 ñîáèðàåòñÿ èìÿ
ýëåìåíòà óïðàâëåíèÿ îêíà ðåäàêòèðîâàíèÿ, èç êîòîðîãî áóäåò ïðåîáðàçîâàíî
çíà÷åíèå äàííûõ ïîñðåäñòâîì êîíêàòåíàöèè ñòðîêè, ýêâèâàëåíòíîé ïåðåìåí-
íîé òåêóùåãî ñ÷åò÷èêà öèêëà, ñ áóêâåííîé êîíñòàíòîé "TextBox". (Âìåñòî íå-
ñêîëüêèõ èìåí òåêñòîâûõ îêîí ìîæíî èñïîëüçîâàòü îäèí ìàññèâ òàêèõ îêîí
ñ îäíèì èìåíåì è ðàçíûìè èíäåêñàìè.)
×òîáû âêëþ÷èòü íîâóþ ñòðîêó â «áàçó äàííûõ», íåîáõîäèìî èçìåíèòü äèà-
ïàçîí ÿ÷ååê «áàçû äàííûõ». Ïåðåîïðåäåëèòü äèàïàçîí, íà êîòîðûé ññûëàåòñÿ
êîíêðåòíîå èìÿ, ìîæíî, èçìåíèâ ñâîéñòâî RefersTo ýòîãî èìåíè. (Èìåíîâàí-
íûå äèàïàçîíû ÿ÷ååê ëèñòà, ÿâëÿþòñÿ îáúåêòàìè òèïà Name è äîñòóïíû ïî-
ñðåäñòâîì êîëëåêöèè Names ëèñòà.) Ñâîéñòâî RefersTo äîëæíî ñîäåðæàòü
ñòðîêó âèäà "=sheet!reference", ãäå sheet — èìÿ ëèñòà, ñîäåðæàùåãî èìåíîâàí-
íûé äèàïàçîí, à reference — àäðåñ â âèäå R1C1.
 ñòðîêàõ ñ 19 ïî 23 ñîáèðàåòñÿ ñîîòâåòñòâóþùèì îáðàçîì îòôîðìàòèðîâàí-
íàÿ ñòðîêà, çàäàþùàÿ íîâûé äèàïàçîí «áàçû äàííûõ». Â ñòðîêå 19, ÷òîáû ïî-
ëó÷èòü èìÿ ëèñòà, ñîäåðæàùåãî äàííûé îáúåêò Range, ê àäðåñó äèàïàçîíà
ñ ïîìîùüþ ñâîéñòâà Parent îáúåêòà Range äîáàâëÿåòñÿ èìÿ ëèñòà. Äàëåå
(â ñòðîêå 20) ñ ïîìîùüþ ñâîéñòâà Address îáúåêòà Cells, âîçâðàùàþùåãî
ñòðîêó ñ àäðåñîì ÿ÷åéêè, íà êîòîðóþ ñäåëàíà ññûëêà, äîáàâëÿþòñÿ êîîðäèíà-
òû âåðõíåãî ëåâîãî óãëà íîâîãî äèàïàçîíà ÿ÷ååê (â äàííîì ñëó÷àå ýòî òå æå ñà-
ìûå ñòðîêà è ñòîëáåö, íà êîòîðûå óêàçûâàåò òåêóùàÿ ññûëêà äèàïàçîíà
Áàçà_äàííûõ). Â ñòðîêàõ 21–22 âíîâü ñ èñïîëüçîâàíèåì ñâîéñòâà Address (íà
ýòîò ðàç — äëÿ ÿ÷åéêè, êîòîðàÿ íàõîäèòñÿ íà ïåðåñå÷åíèè íîâîé ñòðîêè
è ïðåæíåãî ÷èñëà ñòîëáöîâ â äèàïàçîíå ÿ÷ååê «áàçû äàííûõ») äîáàâëÿþòñÿ êî-
îðäèíàòû íèæíåãî ïðàâîãî óãëà íîâîãî äèàïàçîíà ÿ÷ååê. Íàêîíåö, (â ñòðî-
êå 23) ñâîéñòâó RefersTo ïðèñâàèâàåòñÿ íîâîå çíà÷åíèå äèàïàçîíà Áàçà_äàí-
íûõ, íà êîòîðûé ññûëàþòñÿ ïîñðåäñòâîì êîëëåêöèè Names.

Èñïîëüçîâàíèå ìåòîäà Offset


Ïðè îïðåäåëåíèè îáúåêòîâ Range êîíêðåòíûé äèàïàçîí àäðåñîâ, êîòîðûé
íåîáõîäèìî èñïîëüçîâàòü, ÷àñòî áûâàåò íåèçâåñòåí. Íàïðèìåð, ó âàñ ìîæåò
âîçíèêíóòü íåîáõîäèìîñòü ñîñëàòüñÿ íà ÿ÷åéêó, êîòîðàÿ ðàñïîëîæåíà íà äâå
ñòðîêè íèæå è îäèí ñòîëáåö ïðàâåå îò àêòèâíîé ÿ÷åéêè. Õîòÿ âû, â îáùåì-òî,
ìîæåòå îïðåäåëèòü àäðåñ àêòèâíîé ÿ÷åéêè è âû÷èñëèòü àäðåñ ÿ÷åéêè, êîòîðàÿ
âàì íåîáõîäèìà, â Excel VBA ïðåäóñìîòðåí áîëåå ëåãêèé è áîëåå ãèáêèé
ïóòü — èñïîëüçîâàíèå ìåòîäà Offset. Ìåòîä Offset âîçâðàùàåò îáúåêò òèïà
Range, êîòîðûé ñìåùåí îòíîñèòåëüíî çàäàííîãî äèàïàçîíà ÿ÷ååê íà çàäàííîå
êîëè÷åñòâî ñòðîê è ñòîëáöîâ.
Ñèíòàêñèñ
Object.Offset([RowOffset] [,ColumnOffset])
Object ÿâëÿåòñÿ ññûëêîé íà èñõîäíûé îáúåêò Range. RowOffset — ÷èñëî ñòðîê, íà
êîòîðîå ñìåùàåòñÿ Object. Âû ìîæåòå èñïîëüçîâàòü ïîëîæèòåëüíîå ÷èñëî (äëÿ ñìå-
ùåíèÿ âíèç), îòðèöàòåëüíîå ÷èñëî (äëÿ ñìåùåíèÿ ââåðõ) èëè 0 (äëÿ èñïîëüçîâàíèÿ
406 Ãëàâà 10

òîé æå ñòðîêè). Åñëè âû îïóñòèòå RowOffset, áóäåò èñïîëüçîâàíî çíà÷åíèå ïî óìîë-


÷àíèþ — 0.

Ëèñòèíã 10.14 äåìîíñòðèðóåò ïðîöåäóðó, èñïîëüçóþùóþ ìåòîä Offset.

Ëèñòèíã 10.14. Èñïîëüçîâàíèå ìåòîäà Offset äëÿ ññûëêè íà äèàïàçîí ÿ÷ååê


1: Sub SelectData()
2: 'Âûäåëÿåòñÿ îáëàñòü äàííûõ äèàïàçîíà áàçû äàííûõ
3:
4: Dim DBRows As Integer
5:
6: Worksheets("Sheet1").Select
7: With Range("Áàçà_äàííûõ")
8: DBRows = .Rows.Count
9: .Offset(1, 0).Resize(DBRows - 1, .Columns.Count).Select
10: End With
11: End Sub

Äàííàÿ ïðîöåäóðà âûäåëÿåò îáëàñòü äàííûõ äèàïàçîíà ÿ÷ååê ñ èìåíåì


Áàçà_äàííûõ, òî åñòü äèàïàçîí, â êîòîðûé ïðåäïîëàãàåòñÿ âêëþ÷àòü òîëüêî
äàííûå (áåç çàãîëîâêîâ ñòîëáöîâ), îïóñêàÿ äëÿ ýòîãî èç òåêóùåãî âûáîðà ïåð-
âóþ ñòðîêó èìåíîâàííîãî äèàïàçîíà. Âûïîëíåíèå äàííîé ïðîöåäóðû ïîëåçíî,
åñëè íåîáõîäèìî âûïîëíèòü íàä äàííûìè â òàáëèöå ãëîáàëüíûå îïåðàöèè, òà-
êèå êàê ñîðòèðîâêà èëè ôîðìàòèðîâàíèå.
 ñòðîêå 6 âûáèðàåòñÿ ëèñò ñ èìåíåì Sheet1, à îïåðàòîð With â ñòðîêå 7 çà-
äàåò äëÿ ýòîãî ëèñòà îáúåêò Range ñ èìåíåì Áàçà_äàííûõ. Â ñòðîêå 8 ñ ïîìî-
ùüþ ñâîéñòâà Rows.Count îáúåêò Range ïîëó÷àåò ÷èñëî ñòðîê äèàïàçîíà ÿ÷å-
åê, êîòîðîå ñîõðàíÿåòñÿ â ïåðåìåííîé DBRows.
 ñòðîêå 9 ìåòîä Offset (ñ àðãóìåíòàìè 1 è 0) âîçâðàùàåò äèàïàçîí, êîòî-
ðûé ÿâëÿåòñÿ ñìåùåíèåì äèàïàçîíà Áàçà_äàííûõ íà îäíó ñòðîêó âíèç. Ïî-
ñêîëüêó ýòîò äèàïàçîí âêëþ÷àåò (ïðåäïîëîæèòåëüíî) ïóñòóþ ñòðîêó, íàõîäÿ-
ùóþñÿ çà äèàïàçîíîì Áàçà_äàííûõ, âû äîëæíû ýòó äîïîëíèòåëüíóþ ñòðîêó
óäàëèòü. ×òîáû âûïîëíèòü äàííóþ îïåðàöèþ, ìîæåòå âîñïîëüçîâàòüñÿ ñâîéñò-
âîì Resize, èçìåíÿþùèì ðàçìåð äèàïàçîíà:
Ñèíòàêñèñ
Object.Resize([RowSize] [,ColumnSize])
Object — îáúåêòíàÿ ññûëêà íà äèàïàçîí, ðàçìåð êîòîðîãî èçìåíÿåòñÿ. RowSize —
÷èñëî ñòðîê â âîçâðàùàåìîì äèàïàçîíå. ColumnSize — ÷èñëî ñòîëáöîâ â âîçâðà-
ùàåìîì äèàïàçîíå.

 ñòðîêå 9 ïðè ïîìîùè âûðàæåíèÿ Resize(DBRows–1, .Columns.Count) óäà-


ëÿåòñÿ íåíóæíàÿ íèæíÿÿ ñòðîêà ñìåùåííîãî äèàïàçîíà.
Ìåòîä Select (â ñòðîêå 9) âûäåëÿåò íîâûé äèàïàçîí ÿ÷ååê.

Äðóãèå ìåòîäû è ñâîéñòâà, âîçâðàùàþùèå äèàïàçîíû ÿ÷ååê


Ìåòîäû Range, Cells è Offset ÿâëÿþòñÿ íàèáîëåå ÷àñòî èñïîëüçóåìûìè
ìåòîäàìè äëÿ âîçâðàùåíèÿ îáúåêòîâ Range, íî îíè äàëåêî íå åäèíñòâåííûå.
Íà ïðèìåðå êîäà ëèñòèíãà 10.14 âû ïîçíàêîìèëèñü ñ òåì, êàê ñ ïîìîùüþ ìå-
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 407

òîäà 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. Òåêóùàÿ îáëàñòü îïðåäåëÿåòñÿ êàê îáëàñòü, îêðóæàþ-
ùàÿ òåêóùóþ ÿ÷åéêó èëè äèàïàçîí ÿ÷ååê, îãðàíè÷åííûé ïóñòûìè ñòðî-
êàìè ñâåðõó è ñíèçó è ïóñòûìè ñòîëáöàìè ñëåâà è ñïðàâà.

Ðàáîòà ñ Cells è Ranges


Òåïåðü, êîãäà âû çíàåòå, êàê âîçâðàùàòü îáúåêò Range, âû ìîæåòå èñïîëü-
çîâàòü âñå ïðåèìóùåñòâà ïðèìåíåíèÿ ìíîãî÷èñëåííûõ ñâîéñòâ è ìåòîäîâ
Range. Â ñëåäóþùåì ðàçäåëå ðàññìàòðèâàþòñÿ íåêîòîðûå èç ýòèõ ñâîéñòâ
è ìåòîäîâ. Äëÿ òîãî ÷òîáû óâèäåòü âñå ìåòîäû è ñâîéñòâà îáúåêòà Range, ïîëü-
çóéòåñü èíñòðóìåíòîì Object Browser è ñîîòâåòñòâóþùèì äàííîìó îáúåêòó
ðàçäåëîì ñïðàâî÷íîé ñèñòåìû.

Âûäåëåíèå ÿ÷åéêè èëè äèàïàçîíà ÿ÷ååê


Äëÿ âûäåëåíèÿ ÿ÷åéêè èëè äèàïàçîíà ÿ÷ååê èñïîëüçóéòå ìåòîä Select:
Ñèíòàêñèñ
Object.Select
Object — ññûëêà íà îáúåêò òèïà Range, êîòîðûé âûäåëÿåòñÿ.

Ëèñòèíã 10.15 äåìîíñòðèðóåò ïðèìåð èñïîëüçîâàíèÿ äàííîãî ìåòîäà.

Ëèñòèíã 10.15. Èñïîëüçîâàíèå ìåòîäà Select äëÿ âûäåëåíèÿ äèàïàçîíà ÿ÷ååê


1: Sub CreateChart()
2: 'Ñîçäàåòñÿ äèàãðàììà íà îñíîâå äàííûõ äèàïàçîíà Ïðîäàæà
408 Ãëàâà 10

3:
4: With Workbooks("Îò÷åòû.xlsx").Worksheets("Ëèñò2")
5: .Activate
6: .Range("Ïðîäàæà").Select
7: End With
8:
9: Charts.Add
10: End Sub

Äàííàÿ ïðîöåäóðà ñîçäàåò èç âûáðàííîãî äèàïàçîíà ÿ÷ååê íîâóþ äèàãðàì-


ìó.  ñòðîêå 5 àêòèâèçèðóåòñÿ ëèñò Workbooks("Îò÷åòû.XLS ").Workshe-
ets(Ëèñò2).  ñòðîêå 6 íà ëèñòå âûäåëÿåòñÿ äèàïàçîí ÿ÷ååê ñ èìåíåì Ïðîäàæà.
 ñòðîêå 9 äëÿ ñîçäàíèÿ äèàãðàììû âûïîëíÿåòñÿ ìåòîä Add îáúåêòà Charts.

Ñâîéñòâà Value è Formula


Åñëè âàì íåîáõîäèìî ïîëó÷èòü ñîäåðæèìîå ÿ÷åéêè èëè ââåñòè äàííûå
â äèàïàçîí ÿ÷ååê, VBA ïðåäëàãàåò äâà ñâîéñòâà îáúåêòà Range: Value
è Formula. Ñèíòàêñèñ äëÿ èñïîëüçîâàíèÿ ýòèõ ñâîéñòâ ñëåäóþùèé:
Ñèíòàêñèñ
Object.Value
Object.Formula
Object — îáúåêòíàÿ ññûëêà íà îáúåêò òèïà Range, ñ êîòîðûì íåîáõîäèìî ðàáîòàòü.
Äëÿ òîãî ÷òîáû ïîëó÷èòü ñîäåðæèìîå ÿ÷åéêè, ðóêîâîäñòâóéòåñü ñëåäóþùèìè ïðà-
âèëàìè:
w Åñëè âàì íåîáõîäèìî çíà÷åíèå, ñîäåðæàùååñÿ â ÿ÷åéêå, èñïîëüçóéòå ñâîéñòâî
Value. Íàïðèìåð, åñëè ÿ÷åéêà A1 ñîäåðæèò ôîðìóëó =2*2, òî âûðàæåíèå
Range("A1").Value âîçâðàùàåò çíà÷åíèå 4.
w Åñëè âàì íåîáõîäèìà ôîðìóëà, ñîäåðæàùàÿñÿ â ÿ÷åéêå, èñïîëüçóéòå ñâîéñòâî
Formula. Íàïðèìåð, åñëè ÿ÷åéêà A1 ñîäåðæèò ôîðìóëó =2*2, òî âûðàæåíèå
Range("A1").Formula âîçâðàùàåò òåêñòîâóþ ñòðîêó "=2*2".

Äëÿ òîãî ÷òîáû ââåñòè äàííûå â ÿ÷åéêó èëè äèàïàçîí ÿ÷ååê, âû ìîæåòå
ïðèìåíÿòü êàê Value, òàê è Formula. Ëèñòèíã 10.16 äåìîíñòðèðóåò íåñêîëü-
êî ïðèìåðîâ òàêîãî èñïîëüçîâàíèÿ.

Ëèñòèíã 10.16. Èñïîëüçîâàíèå ìåòîäîâ Value è Formula äëÿ ââîäà äàííûõ


1: Sub CreateCalculator()
2: 'Âûïëàòû ïî ññóäå â ëèñòå ñ èìåíåì Ëèñò3
3:
4: Worksheets("Ëèñò3").Select
5:
6: With Range("A1")
7: 'ââåäåíèå çàãîëîâêîâ:
8: .Value = "Ðàñ÷åò âûïëàò ïî ññóäå"
9: .Font.Bold = True
10: .Font.Italic = True
11: .Font.Size = 16
12: .Offset(1).Value = "Òàðèô"
13: .Offset(2).Value = "Ïåðèîä"
14: .Offset(3).Value = "Êîëè÷åñòâî"
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 409

15: .Offset(5).Value = "Ïëàòåæ"


16:
17: 'ââîä ôîðìàòà ÷èñåë è ôîðìóëû:
18: .Offset(1, 1).NumberFormat = "0.00%"
19: .Offset(3, 1).NumberFormat = "#,##0_);($#,##0)"
20: .Offset(5, 1).NumberFormat = "$#,##0.00_);[Red]($#,##0.00)"
21: .Offset(5, 1).Formula = "=PMT($B$2/12, $B$3*12, $B$4)"

22: End With


23:
24: End Sub

Äàííàÿ ïðîöåäóðà ïîìåùàåò íà Ëèñò3 àêòèâíîé êíèãè ïðîñòîé êàëüêóëÿ-


òîð äëÿ ðàñ÷åòà âûïëàò ïî ññóäå. Îïåðàòîð With èñïîëüçóåò ÿ÷åéêó A1 êàê íà-
÷àëüíóþ. Ñâîéñòâî Value ýòîé ÿ÷åéêè óñòàíàâëèâàåòñÿ ñîäåðæàùèì òåêñò
"Ðàñ÷åò âûïëàò ïî ññóäå" (ñòðîêà 8); êðîìå òîãî, óñòàíàâëèâàþòñÿ íåêîòîðûå
ïàðàìåòðû øðèôòà (ñòðîêè 9–11).  ñëåäóþùèõ ÷åòûðåõ ñòðîêàõ (12–15) èñ-
ïîëüçóåòñÿ ñâîéñòâî Value ÿ÷ååê A2, A3, A4 è A6 äëÿ ââîäà çàãîëîâêîâ. Îáðà-
òèòå âíèìàíèå íà èñïîëüçîâàíèå ìåòîäà Offset. Êîä ñòðîê 18–20 çàäàåò ôîð-
ìàò ÿ÷ååê B2, B4 è B6. Âûïîëíÿåòñÿ äàííàÿ îïåðàöèÿ ïðè ïîìîùè ñâîéñòâà
NumberFormat äëÿ äèàïàçîíà ÿ÷ååê, íà êîòîðûé ñóùåñòâóåò ññûëêà:
Object.NumberFormat = FormatString
Object — ÿâëÿåòñÿ îáúåêòíîé ññûëêîé íà ÿ÷åéêó èëè äèàïàçîí, êîòîðûå
íåîáõîäèìî îòôîðìàòèðîâàòü, FormatString — òåêñòîâàÿ ñòðîêà,
îïðåäåëÿþùàÿ ôîðìàòèðîâàíèå.
Íàêîíåö, êîä ñòðîêè 21 èñïîëüçóåò ñâîéñòâî Formula äëÿ ââåäåíèÿ â ÿ÷åé-
êó B6 ôîðìóëû ïëàòåæà.

Îïðåäåëåíèå èìåíè äèàïàçîíà ÿ÷ååê


Èìåíà äèàïàçîíîâ ÿ÷ååê â VBA ÿâëÿþòñÿ Name-îáúåêòàìè. Äëÿ òîãî ÷òîáû
èõ çàäàòü, íåîáõîäèìî èñïîëüçîâàòü ìåòîä Add êîëëåêöèè Names, êîòîðàÿ
îáû÷íî ÿâëÿåòñÿ êîëëåêöèåé èìåí, îïðåäåëåííûõ â êíèãå. Íèæå ïðåäñòàâëå-
íà ñîêðàùåííàÿ ñèíòàêñè÷åñêàÿ êîíñòðóêöèÿ èñïîëüçîâàíèÿ ìåòîäà Add êîë-
ëåêöèè Names. Âñåãî äàííûé ìåòîä èìååò îäèííàäöàòü àðãóìåíòîâ — âñå íå-
îáÿçàòåëüíûå. Ïîëíûé ñèíòàêñèñ ìåòîäà ñëåäóåò ñìîòðåòü â ñïðàâî÷íîé ñèñòå-
ìå, à ëåã÷å âñåãî ïîëó÷èòü äîñòóï ê íóæíîìó ðàçäåëó ñïðàâî÷íîé ñèñòåìû ïðè
ïîìîùè Object Browser.
Ñèíòàêñèñ
Names.Add([Name][, RefersTo][, RefersToR1C1])
Àðãóìåíò Name — ëþáîå ñòðîêîâîå âûðàæåíèå, çàäàþùåå èìÿ, êîòîðîå âû õîòèòå
èñïîëüçîâàòü äëÿ íîâîãî èìåíîâàííîãî äèàïàçîíà. RefersTo è RefersToR1C1 — àð-
ãóìåíòû, îïèñûâàþùèå äèàïàçîí, íà êîòîðûé ññûëàåòñÿ èìÿ. Àðãóìåíòû èñïîëü-
çóþòñÿ ñëåäóþùèì îáðàçîì:
w RefersTo: Èñïîëüçóéòå äàííûé àðãóìåíò äëÿ ââîäà äèàïàçîíà ÿ÷ååê, îïèñû-
âàåìîãî â A1-ñòèëå, íàïðèìåð: "=Sales!$A$1:$C$6".
w RefersToR1C1: Èñïîëüçóéòå äàííûé àðãóìåíò, êîãäà äèàïàçîí ÿ÷ååê îïèñûâà-
åòñÿ èëè â ñòèëå R1C1, íàïðèìåð, "=Sales!R1C1:R6C3", èëè êîãäà îïèñàíèå
äèàïàçîíà ÿâëÿåòñÿ ìåòîäîì èëè ñâîéñòâîì, âîçâðàùàþùèì äèàïàçîí, íàïðè-
ìåð, Range("A1:C6") èëè Selection.
410 Ãëàâà 10

Ëèñòèíã 10.17 äåìîíñòðèðóåò ïðèìåíåíèå ìåòîäà Add êîëëåêöèè Names.

Ëèñòèíã 10.17. Çàäàíèå èìåíè äèàïàçîíà


ïðè ïîìîùè ìåòîäà Add êîëëåêöèè Names
1: Sub CreateNameRange()
2: 'ñîçäàåò èìåíîâàííûé äèàïàçîí ÿ÷ååê ïî êîîðäèíàòàì,
3: 'ââîäèìûì ïîëüçîâàòåëåì
4:
5: Const strTaskName = "Èìÿ äèàïàçîíà"
6:
7: Dim strTopLeft As String
8: Dim strBottomRight As String
9: Dim RngName As String
10: Dim strRefersToR1C1 As String
11:
12: Worksheets("Ëèñò1").Select
13:
14: 'ââåñòè äèàïàçîí è èìÿ:
15: strTopLeft = InputBox(prompt:="Âåðõíèé ëåâûé óãîë " & _
16: "â ôîðìàòå R1C1:", _
17: Title:=strTaskName)
18: strBottomRight = InputBox(prompt:="Íèæíèé ïðàâûé óãîë " & _
19: "â ôîðìàòå R1C1:", _
20: Title:=strTaskName)
21: RngName = InputBox(prompt:="Èìÿ íîâîãî äèàïàçîíà:", _
22: Title:=strTaskName)
23:
24: 'ñîçäàòü èìÿ äèàïàçîíà ÿ÷ååê:
25: strRefersToR1C1 = "=Ëèñò!" & strTopLeft & ":" & strBottomRight
26: Names.Add Name:=RngName, RefersToR1C1:=strRefersToR1C1
27:
28: 'âûäåëèòü íîâûé äèàïàçîí:
29: Range(RngName).Select
30:
31: End Sub

Äàííàÿ ïðîöåäóðà íå î÷åíü ñëîæíà — îíà ñîäåðæèò âñåãî ëèøü íåñêîëüêî


îïåðàòîðîâ InputBox äëÿ òîãî, ÷òîáû ïîëó÷èòü êîîðäèíàòû äèàïàçîíà ÿ÷ååê
(âåðõíèé ëåâûé óãîë è íèæíèé ïðàâûé) è åãî èìÿ. Çàòåì, èñïîëüçóÿ ïðåäëî-
æåííûå êîîðäèíàòû è èìÿ, ïðîöåäóðà ñîçäàåò èìåíîâàííûé äèàïàçîí ÿ÷ååê.

Êàê âûðåçàòü, ñêîïèðîâàòü è î÷èñòèòü äàííûå


Åñëè âàøà ïðîöåäóðà äîëæíà âûïîëíÿòü íåêîòîðûå îñíîâíûå, íàèáîëåå
÷àñòî èñïîëüçóåìûå îïåðàöèè ðåäàêòèðîâàíèÿ ëèñòà, òî ýòî ìîæíî äåëàòü ìå-
òîäàìè Cut, Copy è Clear. Ñèíòàêñèñ ïåðâûõ äâóõ èç íèõ ñëåäóþùèé:
Ñèíòàêñèñ
Object.Cut([Destination])
Object.Copy([Destination])
Object — îáúåêòíàÿ ññûëêà íà îáúåêò òèïà Range, êîòîðûé íåîáõîäèìî âûðåçàòü
èëè ñêîïèðîâàòü. Destination — ÿ÷åéêà èëè äèàïàçîí, â êîòîðûé íóæíî ïîìåñòèòü
ñîäåðæèìîå âûðåçàííîãî èëè ñêîïèðîâàííîãî äèàïàçîíà. Åñëè âû îïóñòèòå àðãó-
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 411

ìåíò Destination, äàííûå áóäóò âûðåçàòüñÿ èëè êîïèðîâàòüñÿ â áóôåð îáìåíà


Windows.

Äëÿ î÷èñòêè äèàïàçîíà ÿ÷ååê âû ìîæåòå èñïîëüçîâàòü ìåòîä Cut ñ àðãóìåí-


òîì íàçíà÷åíèÿ èëè áåç íåãî èëè âîñïîëüçîâàòüñÿ ëþáûì èç ñëåäóþùèõ ìåòîäîâ:
Ñèíòàêñèñ
Object.Clear
Object.ClearContents
Object.ClearFormats
Object.ClearNotes
 êàæäîì ñëó÷àå Object ÿâëÿåòñÿ îáúåêòíîé ññûëêîé íà äèàïàçîí ÿ÷ååê, êîòîðûé
ñëåäóåò î÷èñòèòü. Ìåòîä Clear î÷èùàåò âñå — ñîäåðæèìîå, ôîðìàòèðîâàíèå
è ïðèìå÷àíèÿ. ClearContents î÷èùàåò ñîäåðæèìîå Object, ClearFormats —
ôîðìàòèðîâàíèå Object, ClearNotes óäàëÿåò èç Object ïðèìå÷àíèÿ.

Ëèñòèíã 10.18 äåìîíñòðèðóåò ïðèìåð ïðèìåíåíèÿ ìåòîäîâ Cut, Copy


è Clear.

Ëèñòèíã 10.18. Èñïîëüçîâàíèå ìåòîäîâ Cut, Copy è Clear


1: Sub CopyToTemp()
2: 'Êîïèðóåò äàííûå âî âðåìåííûé ëèñò
3:
4: Dim LastCell As Range
5: Dim oldSheet As String
6:
7: Application.ScreenUpdating = False
8:
9: oldSheet = ActiveSheet.Name 'èìÿ òåêóùåãî ëèñòà
10: Worksheets.Add 'ñîçäàåòñÿ âðåìåííûé ëèñò
11: ActiveSheet.Name = "Âðåìåííûé"
12: Worksheets("Ëèñò1").Select 'âûáèðàåòñÿ Ëèñò1
13:
14: Set LastCell = Range("A1").SpecialCells(xlLastCell)
15: With Worksheets("Âðåìåííûé")
16: .Cells.Clear
17: Range("A1", LastCell).Copy Destination:=.Range("A1")
18: End With
19:
20: Sheets(oldSheet).Select 'âîññòàíàâëèâàåòñÿ èñõîäíûé ëèñò
21: Application.ScreenUpdating = True
22:
23: End Sub
24:
25:
26: Sub RestoreFromTemp()
27: 'Âîññòàíàâëèâàþòñÿ äàííûå èç âðåìåííîãî ëèñòà
28:
29: Dim LastCell As Range
30: Dim oldSheet As String
31:
32: Application.ScreenUpdating = False
33: oldSheet = ActiveSheet.Name
34:
35: Worksheets("Ëèñò1").Select
36: With Worksheets("Âðåìåííûé")
37: Set LastCell = .Range("A1").SpecialCells(xlLastCell)
412 Ãëàâà 10

38: .Range("A1", LastCell).Cut Destination:=Range("A1")


39: End With
40:
41: Sheets(oldSheet).Select
42: Application.ScreenUpdating = True
43:
44: End Sub

Êîä ñîñòîèò èç äâóõ ïðîöåäóð: CopyToTemp (ñòðîêè 1–23) è RestoreFrom-


Temp (ñòðîêè 26–44). Ïðîöåäóðà CopyToTemp äîáàâëÿåò ëèñò ñ èìåíåì Âðåìåí-
íûé è âûáèðàåò ëèñò ñ èìåíåì Ëèñò1. Äàëåå îíà êîïèðóåò âñå äàííûå èç àêòèâ-
íîãî ëèñòà è ñîõðàíÿåò èõ â ëèñòå Âðåìåííûé. Äëÿ âîçâðàòà ïîñëåäíåé ÿ÷åéêè
àêòèâíîãî ëèñòà è ñîõðàíåíèÿ îáúåêòíîé ññûëêè ðåçóëüòèðóþùåãî îáúåêòà
Range â ïåðåìåííîé LastCell äàííàÿ ïðîöåäóðà èñïîëüçóåò ìåòîä
SpecialCells ñ àðãóìåíòîì xlLastCell (ñòðîêà 14). Çàòåì ñ èñïîëüçîâàíèåì
îïåðàòîðà With íàä ëèñòîì Âðåìåííûé âûïîëíÿþòñÿ äâà äåéñòâèÿ: êîä ñòðîêè
16 èñïîëüçóåò ìåòîä Clear äëÿ î÷èñòêè âñåãî ëèñòà (ìåòîä Cells áåç àðãóìåí-
òîâ âîçâðàùàåò âñå ÿ÷åéêè ëèñòà), êîä ñòðîêè 17 èñïîëüçóåò ìåòîä Copy äëÿ êî-
ïèðîâàíèÿ äèàïàçîíà, çàäàííîãî ñ ïîìîùüþ A1 (âåðõíèé ëåâûé óãîë) è LastCell
(íèæíèé ïðàâûé óãîë); «ïîëó÷àòåëåì» ÿâëÿåòñÿ ÿ÷åéêà A1 ëèñòà Âðåìåííûé.
Âòîðàÿ ïðîöåäóðà, RestoreFromTemp, âûïîëíÿåò îáðàòíûå äåéñòâèÿ. Íà
ýòîò ðàç LastCell óñòàíàâëèâàåòñÿ íà ïîñëåäíþþ ÿ÷åéêó ëèñòà Âðåìåííûé
(ñòðîêà 37). Äèàïàçîí îò A1 äî LastCell âûðåçàåòñÿ è ïîìåùàåòñÿ â ÿ÷åéêó A1
àêòèâíîãî ëèñòà (ñòðîêà 38). Àêòèâíûì ÿâëÿåòñÿ ëèñò Ëèñò1, âûáðàííûé
â ñòðîêå 35.
Äëÿ âñòàâêè äàííûõ èç áóôåðà îáìåíà â ëèñò èñïîëüçóéòå ñ îáúåêòàìè
Worksheet èëè Range ìåòîäû Paste èëè PasteSpecial. Ñèíòàêñèñ ìåòîäà
Paste ñëåäóþùèé:
Ñèíòàêñèñ
Object.Paste ([Destination], [Link])
Object — ëþáàÿ äîïóñòèìàÿ îáúåêòíàÿ ññûëêà íà ëèñò. Íåîáÿçàòåëüíûé àðãóìåíò
Destination — ëþáîé îáúåêò äèàïàçîíà ÿ÷ååê. Äàííûå âñòàâëÿþòñÿ, íà÷èíàÿ ñ âåðõ-
íåãî ëåâîãî óãëà äèàïàçîíà. Åñëè âû îïóñòèòå àðãóìåíò Destination, äàííûå âñòàâ-
ëÿþòñÿ, íà÷èíàÿ ñ âûáðàííîé â äàííûé ìîìåíò ÿ÷åéêè. Èñïîëüçîâàíèå àðãóìåíòà
Destination àíàëîãè÷íî èñïîëüçîâàíèþ êîìàíäû Ïðàâêà | Âñòàâèòü (Edit | Paste).
Åñëè íåîáÿçàòåëüíûé àðãóìåíò Link ðàâåí çíà÷åíèþ True, òî äîëæíà áûòü çàäàíà
ññûëêà íà èñòî÷íèê äàííûõ. Èñïîëüçîâàíèå àðãóìåíòà Link àíàëîãè÷íî èñïîëüçîâà-
íèþ êîìàíäû Ïðàâêà | Ñïåöèàëüíàÿ âñòàâêà (Edit | Paste Special) ñ óñòàíîâëåííûì
ôëàæêîì Ñâÿçàòü (Link). Îäíîâðåìåííîå èñïîëüçîâàíèå àðãóìåíòîâ Destination
è Link â îäíîì îïåðàòîðå íåäîïóñòèìî.

Ðàáîòà ñ îáúåêòàìè Word


Äî ñèõ ïîð â äàííîé ãëàâå îáñóæäàëàñü ðàáîòà òîëüêî ñ îáúåêòàìè, äîñòóï-
íûìè â Excel VBA. Word òàêæå ñîçäàåò ìíîãî÷èñëåííûå îáúåêòû, äîñòóïíûå
VBA.  ýòîé ÷àñòè ãëàâû âû óçíàåòå, êàê óïðàâëÿòü áîëüøèíñòâîì íàèáîëåå
âàæíûõ è ðàñïðîñòðàíåííûõ îáúåêòîâ Word. Âî-ïåðâûõ, âû óçíàåòå îá îáúåê-
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 413

òàõ Document è Template, à çàòåì î òîì, êàê óïðàâëÿòü èíôîðìàöèåé, ñîäåð-


æàùåéñÿ â îáúåêòå Document.

Ðàáîòà ñ îáúåêòàìè Document


 Word èñïîëüçóåòñÿ ôîðìàò äîêóìåíòà, â êîòîðîì îáúåêòû è ñîáûòèÿ ïîë-
íîñòüþ äîñòóïíû VBA, ÷òî äàåò âîçìîæíîñòü óïðàâëÿòü äîêóìåíòîì è åãî îáú-
åêòàìè ïðè ïîìîùè VBA-êîäà. Òàêîé ôîðìàò äîêóìåíòà Word ïîçâîëÿåò âû-
ïîëíÿòü íàèáîëåå ðàñïðîñòðàíåííûå çàäà÷è îáðàáîòêè òåêñòà áûñòðåå è ëåã÷å.
 ñëåäóþùèõ íåñêîëüêèõ ðàçäåëàõ ðàññìîòðåíû íàèáîëåå ÷àñòî èñïîëüçóåìûå
îáúåêòû, ìåòîäû è ñâîéñòâà Word.

Äîñòóï ê îáúåêòó Document


 Word êàæäûé äîêóìåíò ÿâëÿåòñÿ îáúåêòîì òèïà Document, à âñå îòêðû-
òûå äîêóìåíòû òåêóùåé ñåññèè Word îáðàçóþò êîëëåêöèþ Documents. Äëÿ
ññûëîê íà êîíêðåòíûé äîêóìåíò ñëåäóåò èñïîëüçîâàòü êîëëåêöèþ Documents
îáúåêòà Application.
Ñèíòàêñèñ
Documents(Index)
Index ìîæåò áûòü:
w ×èñëåííûì âûðàæåíèåì, ïðåäñòàâëÿþùèì äîêóìåíò, êîòîðûé íåîáõîäèìî
èñïîëüçîâàòü. ×èñëî 1 îçíà÷àåò ïåðâûé äîêóìåíò, îòêðûòûé â õîäå òåêóùåé
ðàáî÷åé ñåññèè, 2 — âòîðîé îòêðûòûé äîêóìåíò è òàê äàëåå.
w Ñòðîêîâûì âûðàæåíèåì, ïðåäñòàâëÿþùèì èìÿ îòêðûòîãî äîêóìåíòà, êîòî-
ðûé íóæíî èñïîëüçîâàòü.
Íàèáîëåå ðàñïðîñòðàíåííûì è â áîëüøèíñòâå ñëó÷àåâ íàèáîëåå óäîáíûì ñïîñîáîì
èñïîëüçîâàíèÿ Index ÿâëÿåòñÿ òåêñòîâàÿ ñòðîêà.

Ëèñòèíã 10.19 äåìîíñòðèðóåò ïðèìåð èñïîëüçîâàíèÿ êîëëåêöèè


Documents.

Ëèñòèíã 10.19. Èñïîëüçîâàíèå êîëëåêöèè Documents äëÿ âîçâðàùåíèÿ äîêóìåíòà


1 Sub SetDocumentActivate()
2 'Äåëàåò (îòêðûòûé) äîêóìåíò àêòèâíûì
3
4 Documents("H:\Äîêóìåíò10_1.docm").Activate
5 MsgBox "H:\Äîêóìåíò10_1.docm ñòàíîâèòñÿ àêòèâíûì!"
6
7 End Sub

Âûðàæåíèå â ñòðîêå 4, Documents("Ñ:\F.DOC"), âîçâðàùàåò îáúåêòíóþ


ññûëêó íà äîêóìåíò Ñ:\F.DOC. Ìåòîä Activate äåëàåò óêàçàííûé äîêóìåíò
àêòèâíûì. Îïåðàòîð MsgBox â ñòðîêå 5 âûâîäèò îá ýòîì ñîîáùåíèå. (Äîêóìåíò
Ñ:\F.DOC â ìîìåíò âûïîëíåíèÿ ïðîöåäóðû äîëæåí áûòü îòêðûò, â ïðîòèâíîì
ñëó÷àå âû ïîëó÷èòå ñîîáùåíèå î runtime-îøèáêå.)
Äëÿ ññûëîê íà àêòèâíûé äîêóìåíò íóæíî ïðèìåíÿòü Application-ñâîéñòâî
ActiveDocument. Ñâîéñòâî ThisDocument ñëåäóåò èñïîëüçîâàòü äëÿ ññûëîê íà
414 Ãëàâà 10

äîêóìåíò, ñîäåðæàùèé âûïîëíÿåìóþ â äàííûé ìîìåíò ïðîöåäóðó, îñîáåííî åñëè


âû íàìåðåâàåòåñü ïðåîáðàçîâàòü ñâîþ ïðîãðàììó â Word-íàäñòðîéêó (add-in)1.

Êàê îòêðûòü äîêóìåíò


Åñëè íåîáõîäèìûé âàì äîêóìåíò íå îòêðûò, äëÿ çàãðóçêè åãî â ïàìÿòü èñ-
ïîëüçóéòå ìåòîä Open:
Ñèíòàêñèñ
Documents.Open(Filename)
Àðãóìåíò Filename ÿâëÿåòñÿ òåêñòîâîé ñòðîêîé, ïðåäñòàâëÿþùåé ïîëíûé ïóòü
ê äîêóìåíòó: ëîãè÷åñêèé äèñê, ïàïêà è èìÿ ôàéëà. Åñëè âû íå çàäàëè äèñê èëè
èìÿ ïàïêè, Word áóäåò èñêàòü äîêóìåíò íà òåêóùåì äèñêå èëè â òåêóùåé ïàïêå.

Ëèñòèíã 10.20 äåìîíñòðèðóåò äåéñòâèå ìåòîäà Open.

Ëèñòèíã 10.20. Èñïîëüçîâàíèå ìåòîäà Open äëÿ îòêðûòèÿ äîêóìåíòà


1: Sub OpenTest()
2: 'Ïðåäëàãàåò îòêðûòü äîêóìåíò è çàòåì åãî îòêðûâàåò
3:
4: Dim DocumentName As String
5:
6: DocumentName = _
7: InputBox("Ââåäèòå ïîëíûé ïóòü ê äîêóìåíòó")
8: If DocumentName <> "" Then
9: Documents.Open FileName:=DocumentName
10: End If
11:
12: End Sub

 äàííîé ïðîöåäóðå ïåðåìåííàÿ DocumentName îáúÿâëÿåòñÿ êàê String


(ñòðîêà 4), à ôóíêöèÿ InputBox ïðåäëàãàåò ïîëüçîâàòåëþ ââåñòè èìÿ äîêóìåí-
òà (ñòðîêè 6 è 7). Îïåðàòîð If...Then (â ñòðîêå 8) ïðîâåðÿåò, íå îòìåíèë ëè
ïîëüçîâàòåëü äèàëîã ââîäà. Åñëè — íåò (äðóãèìè ñëîâàìè, åñëè ïåðåìåííàÿ
DocumentName íå ïóñòà), ìåòîä Open èñïîëüçóåò åå äëÿ òîãî, ÷òîáû îòêðûòü
çàäàííûé äîêóìåíò (ñòðîêà 9).
×òîáû èçáåæàòü îøèáîê ïðè îòêðûòèè ñóùåñòâóþùåãî íà äèñêå ôàéëà
(ïîëüçîâàòåëü âðÿä ëè ââåäåò â äèàëîãîâîì îêíå ôóíêöèè InputBox ïðàâèëü-
íîå èìÿ ôàéëà), ñëåäóåò èñïîëüçîâàòü âñòðîåííîå â Word äèàëîãîâîå îêíî
Open. Âû ìîæåòå èñïîëüçîâàòü âñòðîåííîå â Word äèàëîãîâîå îêíî Open ïðè
ïîìîùè êîëëåêöèè Dialogs, êàê ïîêàçàíî íèæå (Dialogs ñîäåðæèò âñå äèà-
ëîãîâûå îêíà, âñòðîåííûå â Word):
Application.Dialogs(wdDialogFileOpen).Show

Êàê ñîçäàòü íîâûé äîêóìåíò


Åñëè âàøåé ïðîöåäóðå íåîáõîäèìî ñîçäàòü íîâûé äîêóìåíò, èñïîëüçóéòå
ìåòîä Add êîëëåêöèè Documents, èìåþùèé ñëåäóþùèé ñèíòàêñèñ:

1 Äî ïîÿâëåíèÿ ëîêàëèçîâàííîé âåðñèè Office 97 èñïîëüçîâàëñÿ òåðìèí «íàäñòðîéêà»,


â Office 97 ïîÿâèëñÿ òåðìèí «äîïîëíåíèå», òåì íå ìåíåå Microsoft Press ïîëüçóåòñÿ
ïðèâû÷íûì ðóññêèì ïîëüçîâàòåëÿì òåðìèíîì «íàäñòðîéêà».
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 415

Ñèíòàêñèñ
Documents.Add([Template], [NewTemplate])
Îáà àðãóìåíòà ìåòîäà Documents.Add íå ÿâëÿþòñÿ îáÿçàòåëüíûìè. Template ïðåä-
ñòàâëÿåò ñòðîêîâîå âûðàæåíèå, çàäàþùåå èìÿ øàáëîíà äîêóìåíòà, íà êîòîðîì
äîëæåí îñíîâûâàòüñÿ íîâûé äîêóìåíò. Àðãóìåíò Template íàðÿäó ñ èìåíåì ôàéëà
ìîæåò âêëþ÷àòü èìÿ äèñêà è ïóòü ê ïàïêå. Âêëþ÷àòü ïîëíûé ïóòü íåîáõîäèìî,
åñëè øàáëîí äîêóìåíòà ðàñïîëîæåí â ïàïêå, îòëè÷íîé îò òîé, â êîòîðîé ïî óìîë-
÷àíèþ õðàíÿòñÿ øàáëîíû Word. Åñëè âû îïóñòèòå àðãóìåíò Template, Word ñîç-
äàñò íîâûé äîêóìåíò, îñíîâûâàÿñü íà øàáëîíå Normal.dot.
Àðãóìåíò NewTemplate ìîæåò áûòü ëþáûì âûðàæåíèåì òèïà Boolean. Åñëè îí ðà-
âåí çíà÷åíèþ True, Word ñîçäàåò íîâûé äîêóìåíò â âèäå øàáëîíà. Ïî óìîë÷àíèþ
çíà÷åíèå ýòîãî àðãóìåíòà ðàâíî çíà÷åíèþ False.

Ëèñòèíã 10.21 äåìîíñòðèðóåò ïðèìåð ïðîöåäóðû, ñîçäàþùåé íîâûé äîêó-


ìåíò.

Ëèñòèíã 10.21. Èñïîëüçîâàíèå ìåòîäà Add äëÿ ñîçäàíèÿ íîâîãî äîêóìåíòà


1: Sub CreateNewLetter()
2: 'Ñîçäàåò äîêóìåíò íà áàçå øàáëîíà Professional Letter
3:
4: Dim dPath As String
5:
6: dPath = "G:\Program Files\Microsoft Office\Templates\1049\"
7: Documents.Add Template:=dPath & "OriginLetter"
8: With ActiveDocument
9: .BuiltInDocumentProperties("Title") = _
10: "Ïèñüìî èç Ðîññèè"
11: .BuiltInDocumentProperties("Subject") = _
12: Str(Date)
13: .BuiltInDocumentProperties("Author") = _
14: Application.UserName
15: End With
16:
17: End Sub

Êîä ëèñòèíãà 10.21 ñîçäàåò íîâûé äîêóìåíò íà îñíîâàíèè øàáëîíà


OriginLetter, ïîñòàâëÿåìîãî âìåñòå ñ Word è Microsoft Office. Ëþáîé íîâûé
äîêóìåíò àâòîìàòè÷åñêè ñòàíîâèòñÿ àêòèâíûì.  ñòðîêàõ ñ 8 ïî 15 èñïîëüçó-
åòñÿ îáúåêò ActiveDocument äëÿ äîáàâëåíèÿ íåêîòîðîé îáùåé èíôîðìàöèè,
îòíîñÿùåéñÿ ê íîâîìó äîêóìåíòó. Ñâîéñòâà äîêóìåíòà Title, Subject
è Author õðàíÿòñÿ â êîëëåêöèè BuiltInDocumentProperties îáúåêòà
Document. Â ðåçóëüòàòå íà ýêðàíå ïîÿâëÿåòñÿ çàãîòîâêà ïèñüìà (ðèñ. 10.6).
Ñâîéñòâà àêòèâíîãî äîêóìåíòà, óñòàíàâëèâàåìûå â ñòðîêàõ êîäà 8–15, ìîæíî
óâèäåòü â äèàëîãîâîì îêíå Ñâîéñòâà.

Êàê ñäåëàòü äîêóìåíò àêòèâíûì


Åñëè âàøà VBA-ïðîãðàììà õðàíèò íåñêîëüêî äîêóìåíòîâ, îòêðûòûõ îäíî-
âðåìåííî, âàì ìîæåò ïîíàäîáèòüñÿ ïåðåêëþ÷àòüñÿ ñ îäíîãî äîêóìåíòà íà äðó-
ãîé. Äëÿ òîãî ÷òîáû ñäåëàòü êàêîé-ëèáî èç îòêðûòûõ äîêóìåíòîâ àêòèâíûì,
èñïîëüçóéòå ìåòîä Activate:
Ñèíòàêñèñ
416 Ãëàâà 10

Object.Activate
Object ïðåäñòàâëÿåò ñîáîé ññûëêó íà äîêóìåíò, êîòîðûé ñëåäóåò ñäåëàòü àêòèâíûì.

Ðèñ. 10.6
 ðåçóëüòàòå ðàáîòû
êîäà ïðîöåäóðû
CreateNewLetter íà
ýêðàíå ïîÿâëÿåòñÿ
çàãîòîâêà ïèñüìà

Ëèñòèíã 10.22 ïðåäñòàâëÿåò ïðèìåð ïðîöåäóðû, èñïîëüçóþùåé ìåòîä


Activate.

Ëèñòèíã 10.22. Èñïîëüçîâàíèå ìåòîäà Activate äëÿ ïåðåêëþ÷åíèÿ ê äîêóìåíòó


1: Sub ActivateTest()
2: 'Àêòèâèçèðóåò äâà äîêóìåíòà áåç èçìåíåíèÿ âûâîäà íà ýêðàí
3:
4: Dim SaveDoc As String
5:
6: SaveDoc = ActiveDocument.Name
7:
8: Application.ScreenUpdating = False 'íå îáíîâëÿòü ýêðàí
9: Documents("TestData.XML").Activate
10:
11: 'äåéñòâèå, âûïîëíåííîå íàä TestData.docm
12: With Selection
13: .TypeText Text:="Äîêóìåíò äàííûõ óñòàíîâëåí àêòèâíûì"
14: .TypeParagraph
15: End With
16:
17: Documents(SaveDoc).Activate
18: Application.ScreenUpdating = True 'îáíîâëÿòü ýêðàí
19:
20: End Sub

Ïðîöåäóðà ëèñòèíãà 10.22 äåìîíñòðèðóåò äâà ïðèíöèïà õîðîøåãî ñòèëÿ


ïðîãðàììèðîâàíèÿ: ñêðûâàòü îò ïîëüçîâàòåëÿ ïðîìåæóòî÷íûå îïåðàöèè
è âñåãäà «âîçâðàùàòü ïîëüçîâàòåëÿ» â òî ìåñòî, èç êîòîðîãî îí çàïóñòèë ïðî-
ãðàììó. Íàçíà÷åíèå ïðîöåäóðû ëèñòèíãà 10.22 — ïåðåêëþ÷èòüñÿ èç òåêóùåãî
äîêóìåíòà â äðóãîé äîêóìåíò (TestData.xml), ïðîèçâåñòè â íåì (ïðîãðàììíî)
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 417

îïðåäåëåííûå èçìåíåíèÿ è çàòåì âåðíóòüñÿ ê èñõîäíîìó äîêóìåíòó. Â ïåðâóþ


î÷åðåäü, èìÿ òåêóùåãî àêòèâíîãî äîêóìåíòà ñîõðàíÿåòñÿ â ñòðîêîâîé ïåðåìåí-
íîé SaveDoc (â ñòðîêå 6). Äàëåå, ÷òîáû èçáàâèòü ïîëüçîâàòåëÿ îò íàáëþäåíèÿ
çà ïîäðîáíîñòÿìè âûïîëíåíèÿ ïðîöåäóðû, â ñòðîêå 8 ñâîéñòâî ScreenUpda-
ting óñòàíàâëèâàåòñÿ â çíà÷åíèå False.  ñòðîêå 9 àêòèâèçèðóåòñÿ äîêóìåíò
TestData.doc. Ñòðîêè ñ 12 ïî 15 ïðåäñòàâëÿþò äåéñòâèÿ, âûïîëíÿåìûå íàä äî-
êóìåíòîì TestData.docm. Äàííûé ôðàãìåíò ïðîãðàììû ïðîñòî äîáàâëÿåò â äî-
êóìåíò íåêîòîðûé òåêñò. ×òîáû «âåðíóòü ïîëüçîâàòåëÿ» îáðàòíî â èñõîäíûé
äîêóìåíò, â ñòðîêå 17 äîêóìåíò âíîâü óñòàíàâëèâàåòñÿ àêòèâíûì. À â ñòðîêå
18 ñâîéñòâî ScreenUpdating âíîâü ïîëó÷àåò çíà÷åíèå True.
Íå ñëåäóåò áåç îñîáîé íåîáõîäèìîñòè àêòèâèçèðîâàòü äîêóìåíò. Êàê ïðàâè-
ëî, âû ìîæåòå âûïîëíèòü èçìåíåíèÿ èëè ïîëó÷èòü èíôîðìàöèþ î äîêóìåíòå,
ïðîñòî ññûëàÿñü íà ñîîòâåòñòâóþùèé îáúåêò Document. Íàïðèìåð, ÷òîáû âû-
ÿñíèòü, êàêîé øàáëîí ïðèñîåäèíåí (åñëè âîîáùå êàêîé-íèáóäü ïðèñîåäèíåí)
ê TestData.XML, âû ìîæåòå èñïîëüçîâàòü ñëåäóþùèé îïåðàòîð (íå äåëàÿ äî-
êóìåíò àêòèâíûì):
DocTemplate = Document("TestData.XML").AttachedTemplate

Êàê ñîõðàíèòü äîêóìåíò


Åñëè âàø VBA-êîä èçìåíÿåò ñîäåðæèìîå äîêóìåíòà, âû äîëæíû áûòü óâå-
ðåíû, ÷òî äàäèòå ïîëüçîâàòåëþ âîçìîæíîñòü ñîõðàíèòü ýòè èçìåíåíèÿ, èëè
îáåñïå÷èòü èõ ñîõðàíåíèå ñ ïîìîùüþ âàøåé ïðîãðàììû. Õîòÿ âû ìîæåòå
âêëþ÷èòü âñòðîåííóþ â Word êîìàíäó Save â ìåíþ è ïàíåëè èíñòðóìåíòîâ,
âû, âîçìîæíî, çàõîòèòå ñîõðàíÿòü äîêóìåíò ïîä óïðàâëåíèåì ïðîöåäóðû, îñî-
áåííî åñëè íóæíî íå äàòü ïîëüçîâàòåëþ âîçìîæíîñòü îòêàçàòüñÿ îò èçìåíå-
íèé, ïðîèçâåäåííûõ âàøèì VBA-êîäîì.
Äëÿ ñîõðàíåíèÿ äîêóìåíòà èñïîëüçóéòå ìåòîä Save îáúåêòà Document:
Ñèíòàêñèñ
Object.Save
Object ïðåäñòàâëÿåò ññûëêó íà îòêðûòûé îáúåêò òèïà Document, êîòîðûé íåîáõî-
äèìî ñîõðàíèòü.

Ìîæíî âîñïîëüçîâàòüñÿ è ðîäñòâåííûì ìåòîäîì SaveAs. Äàííûé ìåòîä ñî-


õðàíÿåò äîêóìåíò ïîä íîâûì èìåíåì è èçìåíÿåò èìÿ äîêóìåíòà. (Ìåòîä èìååò
øåñòíàäöàòü íåîáÿçàòåëüíûõ àðãóìåíòîâ, çäåñü äëÿ ïðîñòîòû óêàçàíû òîëüêî äâà
èç íèõ.  ñïðàâî÷íîé ñèñòåìå âû ìîæåòå íàéòè ïîëíûé ñèíòàêñèñ ýòîãî ìåòîäà.)
Ñèíòàêñèñ
Object.SaveAs([FileName], [FileFormat])
Object — ëþáàÿ äîïóñòèìàÿ ññûëêà íà îòêðûòûé äîêóìåíò òèïà Document. Íåîáÿ-
çàòåëüíûé àðãóìåíò FileName — ñòðîêîâîå âûðàæåíèå, óêàçûâàþùåå íîâîå èìÿ,
ïîä êîòîðûì äîëæåí áûòü ñîõðàíåí äîêóìåíò. FileName ìîæåò âêëþ÷àòü ïîëíûé
ïóòü (âêëþ÷àÿ äèñê è ïàïêó). Åñëè îïóñòèòü ïîëíûé ïóòü, äîêóìåíò ñîõðàíÿåòñÿ
â òåêóùåé ïàïêå íà òåêóùåì äèñêå. Åñëè âû ïîëíîñòüþ îïóñòèòå àðãóìåíò
FileName, äîêóìåíò ñîõðàíèòñÿ ïîä òåêóùèì èìåíåì, åñëè äîêóìåíò ñ ïîäîáíûì
èìåíåì óæå ñóùåñòâóåò, îí áóäåò ïåðåïèñàí áåç ïðåäóïðåæäåíèÿ.
Íåîáÿçàòåëüíûé àðãóìåíò FileFormat îïðåäåëÿåò ôîðìàò, â êîòîðîì áóäåò ñîõðà-
íåí äîêóìåíò. Àðãóìåíò FileFormat ìîæåò áûòü ëþáîé èç âñòðîåííûõ êîíñòàíò
(îïðåäåëåííûõ â êëàññå WdSaveFormat):
418 Ãëàâà 10

Äîêóìåíò ñîõðàíÿåòñÿ êàê «îáû÷íûé Microsoft


wdFormatDocument
Word-äîêóìåíò» (èñïîëüçóåòñÿ ïî óìîë÷àíèþ).
Äîêóìåíò ñîõðàíÿåòñÿ êàê íåôîðìàòèðîâàííûé òåêñò.
Ïðåîáðàçóåò ñèìâîëû (ìàðêåðû) îêîí÷àíèÿ ðàçäåëà,
wdFormatDOSText
ñòðàíèöû è íîâîé ñòðîêè â ìàðêåðû àáçàöà.
Èñïîëüçóåòñÿ ANSI-íàáîð ñèìâîëîâ.
Äîêóìåíò ñîõðàíÿåòñÿ êàê íåôîðìàòèðîâàííûé òåêñò.
Ïðåîáðàçóåò ñèìâîëû (ìàðêåðû) îêîí÷àíèÿ ðàçäåëà,
wdFormatDOSTextLineBre
ñòðàíèöû è íîâîé ñòðîêè â ìàðêåðû àáçàöà. Îáû÷íî
aks
èñïîëüçóåòñÿ äëÿ ïðåîáðàçîâàíèÿ òåêñòà ñ öåëüþ îòïðàâêè
ýëåêòðîííîé ïî÷òîé.
Äîêóìåíò ñîõðàíÿåòñÿ êàê êîäèðîâàííûé òåêñòîâûé
wdFormatEncodedText ôàéë (äëÿ óêàçàíèÿ êîäîâîé ñòðàíèöû èñïîëüçóåòñÿ
àðãóìåíò Encoding).
Òåêñò äîêóìåíòà ñîõðàíÿåòñÿ ïîñðåäñòâîì HTML-òåãîâ
ñ ìèíèìàëüíûì ôîðìàòèðîâàíèåì ñ èñïîëüçîâàíèåì
wdFormatFilteredHTML
êàñêàäíûõ òàáëèö ñòèëåé. Ðåçóëüòèðóþùèé äîêóìåíò
ìîæåò áûòü ïðîñìîòðåí Web-áðàóçåðîì.
Òåñêò è ôîðìàòèðîâàíèå ñîõðàíÿåòñÿ ïîñðåäñòâîì
wdFormatHTML HTML-òåãîâ, ÷òîáû äîêóìåíò ìîæíî áûëî ïðîñìîòðåòü
Web-áðàóçåðîì.
wdFormatRTF Âñå ôîðìàòèðîâàíèå ñîõðàíÿåòñÿ.
wdFormatTemplate Äîêóìåíò ñîõðàíÿåòñÿ êàê Word-øàáëîí.
Òåêñò ñîõðàíÿåòñÿ, ôîðìàòèðîâàíèå — íåò.
Ïðåîáðàçóåò ñèìâîëû îêîí÷àíèÿ ðàçäåëà, ñòðàíèöû
è íîâîé ñòðîêè â ìàðêåðû àáçàöà. Èñïîëüçóåòñÿ
wdFormatText
ANSI-íàáîð ñèìâîëîâ. Îáû÷íî èñïîëüçóåòñÿ, åñëè
öåëåâàÿ ïðîãðàììà íå ìîæåò ïðî÷èòàòü íèêàêîé
äðóãîé ôîðìàò.
Òåêñò ñîõðàíÿåòñÿ, ôîðìàòèðîâàíèå — íåò. Ïðåîáðàçóåò
ñèìâîëû îêîí÷àíèÿ ðàçäåëà, ñòðàíèöû è íîâîé ñòðîêè
wdFormatTextLineBreaks
â ìàðêåðû àáçàöà. Îáû÷íî èñïîëüçóåòñÿ äëÿ
ïðåîáðàçîâàíèÿ òåêñòà ñ öåëüþ îòïðàâêè ýëåêòðîííîé
ïî÷òîé.
wdFormatUnicodeText Äîêóìåíò ñîõðàíÿåòñÿ êàê Unicode-òåêñòîâûé ôàéë.
Òåêñò, ðèñóíêè è ôîðìàòèðîâàíèå ñîõðàíÿþòñÿ êàê
wdFormatWebArchive
îäíîôàéëîâàÿ Web-ñòðàíèöà.
Òåêñò è ôîðìàòèðîâàíèå ñîõðàíÿþòñÿ
WdFormatXML ñ èñïîëüçîâàíèåì Extensible Markup Language (XML)
Word XML-ñõåìû.

Ëèñòèíã 10.23 äåìîíñòðèðóåò ïðèìåð ïðîöåäóðû, èñïîëüçóþùåé êàê Save,


òàê è SaveAs.

Ëèñòèíã 10.23. Ïðèìåíåíèå ìåòîäîâ Save è SaveAs


Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 419

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

Ïðîöåäóðà ýòîãî ëèñòèíãà ñîõðàíÿåò àêòèâíûé äîêóìåíò, à çàòåì ñîõðàíÿ-


åò êîïèþ àêòèâíîãî äîêóìåíòà êàê øàáëîí. Íà÷èíàåòñÿ êîä ñ îáúÿâëåíèÿ ïå-
ðåìåííîé, ïðåäíàçíà÷åííîé äëÿ ñîõðàíåíèÿ èìåíè ôàéëà íîâîãî øàáëîíà.
Îïåðàòîð With â ñòðîêàõ ñ 6 ïî 10 ñîäåðæèò îïåðàòîðû, ñâÿçàííûå ñ îáúåêòîì
ActiveDocument.
Îïåðàòîð If...Then (ñòðîêà 7) ïðîâåðÿåò ñâîéñòâî Saved äîêóìåíòà. Åñëè
îíî ðàâíî çíà÷åíèþ False, äîêóìåíò ñîäåðæèò èçìåíåíèÿ, êîòîðûå åùå íå
áûëè ñîõðàíåíû, ïîýòîìó ïðîöåäóðà âûçûâàåò ìåòîä Save.
Èìÿ ôàéëà øàáëîíà ñîçäàåòñÿ â ñòðîêå 8 êîíêàòåíàöèåé ïîëíîãî èìåíè äî-
êóìåíòà, çà èñêëþ÷åíèåì ïîñëåäíèõ òðåõ ñèìâîëîâ, ñî ñòàíäàðòíûì ðàñøèðå-
íèåì äëÿ èìåíè ôàéëà øàáëîíà "dot". (Èìÿ äîêóìåíòà ïîëó÷àåòñÿ èç åãî ñâîé-
ñòâà Name.) Ðåçóëüòàò èñïîëüçóåòñÿ â êà÷åñòâå àðãóìåíòà äëÿ ìåòîäà SaveAs
(ñòðîêà 9), êîòîðûé ñîõðàíÿåò êîïèþ äîêóìåíòà â âèäå ôàéëà øàáëîíà. Îáðà-
òèòå âíèìàíèå íà èñïîëüçîâàíèå àðãóìåíòà FileFormat, èìåþùåãî çíà÷åíèå
wdFormatTemplate — äàííîå çíà÷åíèå àðãóìåíòà ñîîáùàåò Word î òîì, ÷òî
íåîáõîäèìî ñîõðàíèòü äîêóìåíò êàê øàáëîí.
Äëÿ ïðîâåðêè òîãî, áûë ëè äîêóìåíò êîãäà-ëèáî ñîõðàíåí, ñëåäóåò èñïîëü-
çîâàòü ñâîéñòâî Path îáúåêòà Document. Åñëè Path âîçâðàùàåò ïóñòóþ ñòðîêó
(""), òî äîêóìåíò íèêîãäà ïðåæäå íå ñîõðàíÿëñÿ.

Êàê çàêðûòü äîêóìåíò


Çàâåðøèâ ðàáîòó ñ äîêóìåíòîì, âû äîëæíû çàêðûòü åãî äëÿ îñâîáîæäåíèÿ
ïàìÿòè è äðóãèõ ñèñòåìíûõ ðåñóðñîâ. Çàêðûòü äîêóìåíò ìîæíî, èñïîëüçóÿ
îäíó èç ñëåäóþùèõ ôîðì ìåòîäà Close:
Ñèíòàêñèñ
Documents.Close
Object.Close([SaveChanges][, OriginalFormat ] [, RouteDocument ])
Ïåðâàÿ ñèíòàêñè÷åñêàÿ ôîðìà ïðîñòî çàêðûâàåò âñå îòêðûòûå äîêóìåíòû. Word
ïðåäëàãàåò ïåðåä çàêðûòèåì äîêóìåíòà (åñëè ýòî íåîáõîäèìî) ñîõðàíèòü ñäåëàí-
íûå â íåì èçìåíåíèÿ.
Âòîðàÿ ñèíòàêñè÷åñêàÿ ôîðìà çàêðûâàåò êîíêðåòíûé äîêóìåíò, íà êîòîðûé óêàçû-
âàåò Object. Àðãóìåíò SaveChanges ìîæåò áûòü ðàâåí îäíîé èç ïåðå÷èñëåííûõ íèæå
âñòðîåííûõ êîíñòàíò (îïðåäåëåííûõ â êëàññå WdSaveOptions): wdDo-
NotSaveChanges (äîêóìåíò çàêðûâàåòñÿ áåç ñîõðàíåíèÿ èçìåíåíèé),
wdPromptToSaveChanges (Word çàïðàøèâàåò, íóæíî ëè ñîõðàíÿòü èçìåíåíèÿ),
wdSaveChanges (èçìåíåíèÿ ñîõðàíÿþòñÿ). Àðãóìåíò OriginalFormat îïðåäåëÿåò
ôîðìàò ñîõðàíåíèÿ äëÿ äîêóìåíòà è ìîæåò áûòü îäíîé èç ñëåäóþùèõ
WdOriginalFormat-êîíñòàíò: wdOriginalDocumentFormat, wdPromptUser èëè
420 Ãëàâà 10

wdWordDocument. Àðãóìåíò RouteDocument îïðåäåëÿåò íåîáõîäèìîñòü ïåðåäà÷è äî-


êóìåíòà ñëåäóþùåìó ïîëó÷àòåëþ.

 ëèñòèíãå 10.24 ïðèâåäåí êîä ñ èñïîëüçîâàíèåì ìåòîäà Close.

Ëèñòèíã 10.24. Ïðèìåíåíèå ìåòîäà Close


1: Sub CloseAll()
2: 'Çàêðûâàåò âñå äîêóìåíòû è ïðåäëàãàåò ñîõðàíèòü èçìåíåíèÿ
3:
4: Const qButtons = vbYesNo + vbQuestion
5:
6: Dim Doc As Document
7: Dim Ans As Integer
8: Dim MsgPrompt As String
9:
10: For Each Doc In Documents
11: If Not (Doc.Name = ThisDocument.Name) Then
12: If Not Doc.Saved Then
13: MsgPrompt = "Ñîõðàíèòü èçìåíåíèÿ â " & Doc.Name & "?"
14: Ans = MsgBox(prompt:=MsgPrompt, Buttons:=qButtons)
15: If Ans = vbYes Then
16: Doc.Close SaveChanges:=wdSaveChanges
17: Else
18: Doc.Close SaveChanges:=wdDoNotSaveChanges
19: End If
20: Else
21: Doc.Close
22: End If
23: End If
24: Next Doc
25:
26: End Sub

Ïðîöåäóðà ëèñòèíãà 10.24 çàêðûâàåò âñå îòêðûòûå äîêóìåíòû (çà èñêëþ÷åíè-


åì äîêóìåíòà, ñîäåðæàùåãî ñàìó ïðîöåäóðó) è ñïðàøèâàåò ó ïîëüçîâàòåëÿ, íóæ-
íî ëè âûïîëíÿòü ñîõðàíåíèå âíåñåííûõ èçìåíåíèé äëÿ êàæäîãî èç äîêóìåíòîâ,
èìåþùèõ íåñîõðàíåííûå èçìåíåíèÿ. Èñïîëüçóéòå ïîäîáíóþ ïðîöåäóðó âìåñòî
ìåòîäà Documents.Close, åñëè íåîáõîäèìî çàáëîêèðîâàòü âîçìîæíîñòü îòìåíû
îïåðàöèè ïîëüçîâàòåëåì (âñòðîåííûé â Word çàïðîñ Save èìååò êíîïêó Cancel).
Ïîñëå îáúÿâëåíèÿ êîíñòàíòû è íåñêîëüêèõ ïåðåìåííûõ, ïðîöåäóðà çàïóñ-
êàåò öèêë For Each äëÿ îáðàáîòêè âñåõ äîêóìåíòîâ êîëëåêöèè Documents.
Ïîñêîëüêó çàêðûòèå äîêóìåíòà, ñîäåðæàùåãî âûïîëíÿåìóþ â äàííûé ìî-
ìåíò ïðîöåäóðó, ïðèâåäåò ê çàâåðøåíèþ åå âûïîëíåíèÿ, â ñòðîêå 11 íàõîäèò-
ñÿ îïåðàòîð If...Then, ïðîâåðÿþùèé, íå ñîâïàäàåò ëè èìÿ îáðàáàòûâàåìîãî
â äàííûé ìîìåíò äîêóìåíòà ñ èìåíåì äîêóìåíòà, ñîäåðæàùåãî ïðîöåäóðó
CloseAll. Åñëè îíè ñîâïàäàþò, ÷àñòü ïðîãðàììû, çàêðûâàþùàÿ äîêóìåíò,
ïðîïóñêàåòñÿ; ñòðîêè ñ 12 ïî 22 âûïîëíÿþòñÿ òîëüêî â òîì ñëó÷àå, åñëè äîêó-
ìåíò íå ñîäåðæèò ïðîöåäóðû CloseAll (ñâîéñòâî ThisDocument âîçâðàùàåò
ññûëêó íà äîêóìåíò, ñîäåðæàùèé âûïîëíÿåìóþ â äàííûé ìîìåíò ïðîãðàììó).
Åñëè äîêóìåíò ñîäåðæèò èçìåíåíèÿ, êîòîðûå íå áûëè ñîõðàíåíû (ñòðîêà
12), ôóíêöèÿ MsgBox «ñïðàøèâàåò», íóæíî ëè ñîõðàíÿòü èçìåíåíèÿ. Åñëè
ïîëüçîâàòåëü âûáèðàåò êíîïêó Yes (òî åñòü â ïåðåìåííóþ Ans âîçâðàùàåòñÿ
çíà÷åíèå êîíñòàíòû vbYes), ïðîöåäóðà çàïóñêàåò ìåòîä Close ñ àðãóìåíòîì
SaveChanges, ðàâíûì çíà÷åíèþ êîíñòàíòû wdSaveChanges (ñòðîêè 15 è 16).
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 421

 ïðîòèâíîì ñëó÷àå ïðîöåäóðà çàêðûâàåò äîêóìåíò ñ àðãóìåíòîì Save-


Changes, ðàâíûì çíà÷åíèþ êîíñòàíòû wdDoNotSaveChanges (ñòðîêà 16). Åñëè
äîêóìåíò íå ñîäåðæèò íåñîõðàíåííûõ èçìåíåíèé, ïðîöåäóðà âûïîëíÿåò ìåòîä
Close áåç àðãóìåíòîâ (ñòðîêà 21).

Ðàáîòà ñ îáúåêòàìè Template


 Word êàæäûé øàáëîí äîêóìåíòà ÿâëÿåòñÿ îáúåêòîì òèïà Template,
à Templates — êîëëåêöèåé âñåõ îòêðûòûõ øàáëîíîâ. Äàëåå ðàññìàòðèâàåòñÿ,
êàê âûïîëíÿòü îñíîâíûå îïåðàöèè ñ îáúåêòàìè Template.

Êàê ñîçäàòü øàáëîí


Êîëëåêöèÿ Templates íå èìååò ìåòîäà Add. Ïîýòîìó äëÿ äîáàâëåíèÿ ê íåé
íîâîãî øàáëîíà íóæíî ñîçäàòü ýòîò øàáëîí, ñíà÷àëà ñîçäàâ îáúåêò Document.
Âû ìîæåòå ñîçäàòü íîâûé øàáëîí äîêóìåíòà îäíèì èç ñëåäóþùèõ ñïîñîáîâ:
¨ Èñïîëüçîâàòü ìåòîä Documents.Add ñ àðãóìåíòîì NewTemplate, ðàâíûì
True, äëÿ îäíîâðåìåííîãî ñîçäàíèÿ íîâîãî äîêóìåíòà è ïðåîáðàçîâàíèÿ
åãî â îáúåêò Template.
¨ Èñïîëüçîâàòü ìåòîä SaveAs îáúåêòà Document ñ àðãóìåíòîì FileFormat,
çàäàííûì êàê wdFormatTemplate, äëÿ ñîõðàíåíèÿ äîêóìåíòà â âèäå
øàáëîíà (â ëèñòèíãå 10.23 ýòî óæå èñïîëüçîâàëîñü).

Êàê çàãðóæàòü è âûãðóæàòü îáùèå øàáëîíû


Êàê âû óæå ìîæåòå çíàòü, åäèíñòâåííûé ñïîñîá ñäåëàòü êîä â ïðîåêòå VBA
Word äîñòóïíûì âñåì îòêðûòûì äîêóìåíòàì — ýòî ñîõðàíèòü åãî â øàáëîíå
äîêóìåíòà, çàãðóæåííîì êàê îáùèé. Ïî ýòîé ïðè÷èíå âàì, âîçìîæíî, çàõî÷åò-
ñÿ ïîìåñòèòü ïðîöåäóðó òåêóùåãî äîêóìåíòà â øàáëîí, çàãðóæåííûé êàê îá-
ùèé, äåëàÿ òàêèì îáðàçîì ïðîöåäóðû è äðóãèå ðåñóðñû äàííîãî øàáëîíà äîñ-
òóïíûìè âñåì îòêðûòûì äîêóìåíòàì.
Êîëëåêöèÿ Templates íå èìååò ìåòîäà Open. Âìåñòî ýòîãî ñëåäóåò çàãðó-
æàòü øàáëîí äîêóìåíòà êàê îáùèé ïîñðåäñòâîì êîëëåêöèè AddIns îáúåêòà
Applications Word. (AddIns — êîëëåêöèÿ âñåõ äîñòóïíûõ â Word íàäñòðî-
åê, íåçàâèñèìî îò òîãî, áûëè îíè óñòàíîâëåíû èëè íåò.) Ïîñêîëüêó îíè ÿâëÿ-
þòñÿ îáùèìè ðåñóðñàìè äëÿ ïðîãðàìì, ïàíåëåé êîìàíä, ñòèëåé è äðóãèõ ýëå-
ìåíòîâ, Word ðàññìàòðèâàåò îáùèå øàáëîíû êàê ðàçíîâèäíîñòü íàäñòðîéêè.
Åñëè âû çíàåòå, ÷òî âàøà ïðîãðàììà áîëüøå íå íóæäàåòñÿ â ðåñóðñàõ êîí-
êðåòíîãî øàáëîíà, òî ìîæåòå âûãðóçèòü îáùèé øàáëîí äëÿ îñâîáîæäåíèÿ ñèñ-
òåìíûõ ðåñóðñîâ êîìïüþòåðà.
×òîáû çàãðóçèòü øàáëîí êàê îáùèé, èñïîëüçóéòå ìåòîä Add êîëëåêöèè
AddIns â ñëåäóþùåé ñèíòàêñè÷åñêîé ôîðìå:
Ñèíòàêñèñ
Object.Add(FileName [, Install])
Object ïðåäñòàâëÿåò ññûëêó íà îáúåêò AddIns. Àðãóìåíò FileName ÿâëÿåòñÿ îáÿçà-
òåëüíûì. Ýòî ñòðîêîâîå âûðàæåíèå, ñîäåðæàùåå èìÿ ôàéëà øàáëîíà, âêëþ÷àÿ
ïîëíûé ïóòü.
Àðãóìåíò Install (íåîáÿçàòåëüíûé) óïðàâëÿåò óñòàíîâêîé íàäñòðîéêè: ïðè ðàâåí-
ñòâå çíà÷åíèþ True (çíà÷åíèå ïî óìîë÷àíèþ) íàäñòðîéêà óñòàíàâëèâàåòñÿ, ïðè
False — äîáàâëÿåòñÿ â ñïèñîê íàäñòðîåê, íî íå óñòàíàâëèâàåòñÿ.
422 Ãëàâà 10

Äëÿ òîãî ÷òîáû âûãðóçèòü îáùèé øàáëîí, èñïîëüçóéòå ìåòîä Delete êîë-
ëåêöèè AddIns â ñëåäóþùåé ñèíòàêñè÷åñêîé ôîðìå:
Ñèíòàêñèñ
AddIns(Name).Delete
Name — ñòðîêîâîå âûðàæåíèå, çàäàþùåå èìÿ øàáëîíà, êîòîðûé íóæíî âûãðó-
çèòü, èëè ÷èñëåííîå âûðàæåíèå, óêàçûâàþùåå íîìåð èíäåêñà øàáëîíà â êîëëåê-
öèè. Êàê è äëÿ áîëüøèíñòâà äðóãèõ êîëëåêöèé, ñëåäóåò ïîëüçîâàòüñÿ èìåíàìè
øàáëîíîâ, ÷òîáû ñîçäàâàòü óäîáî÷èòàåìûå è íàäåæíûå ïðîãðàììû.

Ëèñòèíã 10.25 ñîäåðæèò äâå äåìîíñòðàöèîííûå ïðîöåäóðû: îäíà — çàãðó-


æàåò øàáëîí êàê îáùèé, à äðóãàÿ — âûãðóæàåò îáùèé øàáëîí.

Ëèñòèíã 10.25. Çàãðóçêà è âûãðóçêà îáùåãî øàáëîíà


1: Sub LoadGlobalTemplate()
2: 'Çàãðóæàåò è îïðåäåëÿåò îáùèé øàáëîí
3:
4: Dim strName As String
5:
6: strName = InputBox(prompt:="Ââåäèòå èìÿ øàáëîíà:" & _
7: vbCr & "(âêëþ÷àÿ ïîëíûé ïóòü)", _
8: Title:="Çàãðóæàåòñÿ îáùèé øàáëîí")
9:
10: If Trim(strName) = "" Then Exit Sub
11: AddIns.Add FileName:=strName
12:
13: End Sub
14:
15:
16: Sub UnloadGlobalTeplate()
17: 'Âûãðóæàåò øàáëîí, çàäàííûé êàê îáùèé
18:
19: Dim strName As String
20:
21: strName = InputBox(prompt:="Ââåäèòå èìÿ øàáëîíà:", _
22: Title:="Âûãðóçêà îáùåãî øàáëîíà")
23:
24: If Trim(strName) = "" Then Exit Sub
25: AddIns(strName).Delete
26:
27: End Sub

Êàê ïðèñîåäèíèòü øàáëîí


Åñëè âàì íåîáõîäèìî çàäàòü ïðèñîåäèíåííûé ê äîêóìåíòó øàáëîí, èñïîëü-
çóéòå ñâîéñòâî AttachedTemplate îáúåêòà Document â ñëåäóþùåé ñèíòàêñè-
÷åñêîé ôîðìå:
Ñèíòàêñèñ
Object.AttachedTemplate = Template
Çäåñü Object — ëþáàÿ äîïóñòèìàÿ ññûëêà íà îáúåêò òèïà Document. Template ìî-
æåò áûòü êàê îáúåêòíîé ññûëêîé íà óæå îòêðûòûé Template-îáúåêò, òàê è ñòðî-
êîâûì âûðàæåíèåì, çàäàþùèì èìÿ ôàéëà øàáëîíà, êîòîðûé íåîáõîäèìî ïðèñîå-
äèíèòü.
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 423

Ñâîéñòâî AttachedTemplate âñåãäà âîçâðàùàåò îáúåêòíóþ ññûëêó íà îáúåêò òèïà


Template. Åñëè äîêóìåíò íå ñîäåðæèò ïðèñîåäèíåííîãî øàáëîíà, ñâîéñòâî
AttachedTemplate âîçâðàùàåò ññûëêó íà Normal.dot.

Ñëåäóþùèé ôðàãìåíò ïðîãðàììû ïðèñîåäèíÿåò øàáëîí ê àêòèâíîìó äîêó-


ìåíòó (ïðåäïîëàãàåòñÿ, ÷òî ïåðåìåííàÿ TestTemplate ñîäåðæèò ñòðîêó, âêëþ-
÷àþùóþ ïîëíûé ïóòü ê ôàéëó øàáëîíà):
ActiveDocument.AttachedTemplate = TestMyTemplate
Äëÿ îòêëþ÷åíèÿ îò àêòèâíîãî äîêóìåíòà âñåõ øàáëîíîâ äîñòàòî÷íî èñïîëü-
çîâàòü ñëåäóþùèé êîä:
ActiveDocument.AttachedTemplate = ""

Êîìïîíåíòû îáúåêòà Document


Äîêóìåíò â Word ïðåäñòàâëÿåò ñîáîé êîíñòðóêöèþ äîâîëüíî ñâîáîäíîé
ôîðìû: îí ñîñòîèò èç ñèìâîëîâ, ñëîâ, ïðåäëîæåíèé è àáçàöåâ. Äîêóìåíò ìî-
æåò ñîäåðæàòü êîëîíòèòóëû, ñíîñêè è ïðî÷èå ýëåìåíòû. Êàê ñëåäñòâèå, ÷èñëî
è òèï îáúåêòîâ, èñïîëüçóåìûõ äëÿ óïðàâëåíèÿ ñîäåðæèìûì äîêóìåíòà, ìî-
æåò ñíà÷àëà âûçâàòü çàìåøàòåëüñòâî.
Êàæäûé äîêóìåíò ñîñòîèò èç íåñêîëüêèõ îáëàñòåé (stories). Êàæäàÿ îá-
ëàñòü äîêóìåíòà ñîîòâåòñòâóåò êîíêðåòíîìó ðàçäåëó äîêóìåíòà, òàêîìó êàê
êîëîíòèòóë, ñíîñêà îñíîâíîé òåêñò äîêóìåíòà, ïðèìå÷àíèÿ è òàê äàëåå. Ìíî-
ãèå ìåòîäû îáúåêòà Document ïîçâîëÿþò âûáðàòü êîíêðåòíóþ îáëàñòü. Ìíî-
ãèå îáúåêòû òàêæå îáëàäàþò ñâîéñòâàìè, èç êîòîðûõ ìîæíî èçâëå÷ü çíà÷åíèå,
óêàçûâàþùåå, êàêàÿ îáëàñòü îáúåêòà äîêóìåíòà â íåì ñîäåðæèòñÿ. VBA Word
ïðåäîñòàâëÿåò íåñêîëüêî âíóòðåííèõ êîíñòàíò (îïðåäåëåííûõ â êëàññå
WdStoryType), êîòîðûå âû ìîæåòå èñïîëüçîâàòü äëÿ çàäàíèÿ êîíêðåòíîé îá-
ëàñòè äîêóìåíòà: wdMainTextStory, wdPrimaryFooterStory, wdPrimary-
HeaderStory è äðóãèå.
Òåêñò âíóòðè îáëàñòè äîêóìåíòà ìîæåò ðàññìàòðèâàòüñÿ êàê êîëëåêöèÿ
ñèìâîëîâ, ñëîâ, ïðåäëîæåíèé è àáçàöåâ. Word ïðåäîñòàâëÿåò êîëëåêöèþ îáú-
åêòîâ äëÿ êàæäîãî èç ýòèõ ïðåäñòàâëåíèé: Characters, Words, Sentences
è Paragraphs. Íèæå äàíà êðàòêàÿ õàðàêòåðèñòèêà ýòèõ êîëëåêöèé:
¨ Characters. Êîëëåêöèÿ ñèìâîëîâ. Â çàâèñèìîñòè îò òîãî, èç êàêîãî îáú-
åêòà âû ïîëó÷èëè äîñòóï ê êîëëåêöèè, îíà ìîæåò ñîäåðæàòü íåêîòîðûå
èëè âñå ñèìâîëû îáëàñòè äîêóìåíòà. Îáúåêò äëÿ îäíîãî ñèìâîëà îòñóòñò-
âóåò. Êàæäûé ýëåìåíò êîëëåêöèè Characters ÿâëÿåòñÿ îáúåêòîì òèïà
Range, âêëþ÷àþùèì òîëüêî îäèí ñèìâîë. (Îáúåêòû Range Word áóäóò
ðàññìîòðåíû äàëåå â ýòîì ðàçäåëå.)
¨ Words. Êîëëåêöèÿ ñëîâ. Â çàâèñèìîñòè îò òîãî, èç êàêîãî îáúåêòà âû ïî-
ëó÷èëè äîñòóï ê êîëëåêöèè Words, îíà ìîæåò ñîäåðæàòü íåêîòîðûå èëè
âñå ñëîâà îáëàñòè äîêóìåíòà. Â Word îòñóòñòâóåò îáúåêò «ñëîâî». Êàæ-
äûé ýëåìåíò êîëëåêöèè Words ÿâëÿåòñÿ îáúåêòîì òèïà Range, âêëþ÷àþ-
ùèì òîëüêî îäíî ñëîâî. (Ñëîâî — ýòî ãðóïïà ñèìâîëîâ, îòäåëåííàÿ ïðîáå-
ëàìè èëè çíàêàìè ïóíêòóàöèè.)
¨ Sentences. Êîëëåêöèÿ ïðåäëîæåíèé. Â çàâèñèìîñòè îò òîãî, èç êàêîãî
îáúåêòà âû ïîëó÷èëè äîñòóï ê êîëëåêöèè Sentences, îíà ìîæåò ñîäåð-
æàòü íåêîòîðûå èëè âñå ïðåäëîæåíèÿ îáëàñòè äîêóìåíòà. Ïîäîáíî êîë-
424 Ãëàâà 10

ëåêöèÿì Characters è Words îáúåêò «îäíî ïðåäëîæåíèå îòñóòñòâóåò».


Êàæäûé ýëåìåíò êîëëåêöèè Sentences ÿâëÿåòñÿ îáúåêòîì òèïà Range
(êîòîðûé áóäåò îïèñàí äàëåå â ýòîé ãëàâå), âêëþ÷àþùèì åäèíñòâåííîå
ïðåäëîæåíèå.
¨ Paragraphs. Êîëëåêöèÿ àáçàöåâ. Â çàâèñèìîñòè îò òîãî, Paragraphs-
êîëëåêöèÿ êàêîãî èìåííî îáúåêòà èñïîëüçóåòñÿ, ìîæåò ñîäåðæàòü íåêî-
òîðûå èëè âñå àáçàöû îáëàñòè äîêóìåíòà. Êàæäûé ýëåìåíò êîëëåêöèè
Paragraphs ÿâëÿåòñÿ îáúåêòîì òèïà Paragraph. Âû ìîæåòå èñïîëüçî-
âàòü ñâîéñòâà è ìåòîäû îáúåêòà Paragraph äëÿ èçìåíåíèÿ ñòèëÿ, óâåëè-
÷åíèÿ èëè óìåíüøåíèÿ èíòåðëèíüÿæà è äðóãèõ, ñâÿçàííûõ ñ àáçàöåì çà-
äà÷. Êàæäûé îáúåêò òèïà Paragraph, â ñâîþ î÷åðåäü, ñîäåðæèò îáúåêò
òèïà Range, êîòîðûé ñîäåðæèò òåêñò ïàðàãðàôà.
Ïðåäñòàâëåííûé îáçîð êîëëåêöèé ïîêàçûâàåò, ÷òî äîñòóï ê òåêñòó äëÿ êà-
æäîé èç ýòèõ êîëëåêöèé, â êîíå÷íîì ñ÷åòå, îñóùåñòâëÿåòñÿ ñ ïîìîùüþ îáúåê-
òà Range. Îáúåêò Range ÿâëÿåòñÿ îäíèì èç îñíîâíûõ îáúåêòîâ Word è ïîÿâëÿ-
åòñÿ â âèäå ñâîéñòâà âî ìíîãèõ äðóãèõ îáúåêòàõ Word.
Êàæäûé îáúåêò Range ïðåäñòàâëÿåò íåïðåðûâíóþ ÷àñòü îáëàñòè äîêóìåí-
òà, îïðåäåëÿåìóþ ïîëîæåíèÿìè íà÷àëüíîãî è êîíå÷íîãî ñèìâîëîâ. Îáúåêò
Range ìîæåò íå ñîäåðæàòü íè îäíîãî, ñîäåðæàòü îäèí èëè ìíîãî ñèìâîëîâ
è ìîæåò ïðåäñòàâëÿòü âåñü äîêóìåíò èëè ëþáóþ åãî ÷àñòü. Èñïîëüçóÿ ìåòîäû
è ñâîéñòâà îáúåêòà Range, ìîæíî äîáàâëÿòü òåêñò, ôîðìàòèðîâàòü åãî, äîáàâ-
ëÿòü ïîëÿ èëè âûïîëíÿòü ëþáûå äðóãèå äåéñòâèÿ. Îáúåêò Range òàêæå ïðå-
äîñòàâëÿåò ìåòîäû, ïîçâîëÿþùèå çàäàâàòü èëè èçìåíÿòü äèàïàçîí ñèìâîëîâ,
íà êîòîðûé ññûëàåòñÿ êîíêðåòíûé îáúåêò Range, è îïðåäåëÿòü, â êàêîì òåê-
ñòîâîì áëîêå äîêóìåíòà íàõîäèòñÿ äèàïàçîí.
Äðóãèì îñíîâíûì îáúåêòîì Word ÿâëÿåòñÿ îáúåêò Selection. Îáúåêò
Selection ïðåäñòàâëÿåò êóðñîð âñòàâêè â îêíå, îòîáðàæàþùåì îïðåäåëåííóþ
÷àñòü äîêóìåíòà.  êàæäîì îêíå äîêóìåíòà ìîæåò íàõîäèòüñÿ òîëüêî îäèí îáú-
åêò Selection, è òîëüêî îäèí îáúåêò Selection ìîæåò áûòü àêòèâíûì â ëþ-
áîé êîíêðåòíûé ìîìåíò âðåìåíè. Îáúåêò Selection èñïîëüçóåòñÿ äëÿ òîãî,
÷òîáû äîáàâëÿòü òåêñò â òî ìåñòî, íà êîòîðîå óêàçûâàåò êóðñîð âñòàâêè, ïðèìå-
íÿòü ôîðìàòèðîâàíèå, âûäåëÿòü òåêñò äëÿ êîïèðîâàíèÿ èëè âûðåçàíèÿ èëè ëþ-
áîé äðóãîé çàäà÷è, êîòîðóþ ìîæíî âûïîëíèòü èíòåðàêòèâíî ñ ïîìîùüþ êóðñî-
ðà âñòàâêè, ââîäÿ òåêñò, ùåëêàÿ, èëè ïåðåòàñêèâàÿ åãî. Îáúåêò Selection ìî-
æåò áûòü êàê íåïðåðûâíîé îáëàñòüþ äîêóìåíòà, òàê è ñæàòûì äî êóðñîðà
âñòàâêè. Â ñëåäóþùåì ðàçäåëå îáñóæäàåòñÿ, êàê ñ ïîìîùüþ ñâîéñòâ è ìåòîäîâ
îáúåêòà Selection âûïîëíÿòü îñíîâíûå îïåðàöèè ñ äîêóìåíòîì.
 äîïîëíåíèå ê òîëüêî ÷òî îïèñàííûì îñíîâíûì êîìïîíåíòàì äîêóìåíòà
êàæäûé îáúåêò Document òàêæå ñîäåðæèò íåñêîëüêî äðóãèõ êîëëåêöèé, òà-
êèõ êàê Fields (êîëëåêöèÿ ïîëåé, âêëþ÷àÿ ïîëÿ äëÿ ïðîñòàíîâêè ïî÷òîâûõ
ðåêâèçèòîâ â äîêóìåíòå), TablesOfContents è äðóãèå.

Êàê çàäàòü äèàïàçîí


Ïðåæäå ÷åì âû ñìîæåòå ðàáîòàòü ñ îáúåêòîì Range, ñëåäóåò çàäàòü â äîêó-
ìåíòå äèàïàçîí òåêñòà, ñ êîòîðûì íåîáõîäèìî ðàáîòàòü. Îáúåêò Range ìîæåò
ÿâëÿòüñÿ êóðñîðîì âñòàâêè, íå ñîäåðæàùèì íè îäíîãî ñèìâîëà, èëè áûòü íå-
ïðåðûâíîé îáëàñòüþ äîêóìåíòà. Âû ìîæåòå ñîçäàòü â äîêóìåíòå áîëåå îäíîãî
îáúåêòà Range.
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 425

Êàê ïîëó÷èòü ññûëêó íà îáúåêò


Ñóùåñòâóåò íåñêîëüêî ðàçëè÷íûõ ñïîñîáîâ ñîñëàòüñÿ íà êîíêðåòíûé äèàïà-
çîí äîêóìåíòà. Ìîæíî çàäàòü äèàïàçîí íåïîñðåäñòâåííî èëè ïîëó÷èòü åãî ïðè
ïîìîùè îäíîé èç êîëëåêöèé äîêóìåíòà: Paragraphs, Sentences èëè Words.
Äëÿ òîãî ÷òîáû çàäàòü äèàïàçîí â îáëàñòè îñíîâíîãî òåêñòà äîêóìåíòà íåïî-
ñðåäñòâåííî, âîñïîëüçóéòåñü ìåòîäîì Range, ïðèìåíèâ ñëåäóþùóþ ñèíòàêñè-
÷åñêóþ êîíñòðóêöèþ:
Ñèíòàêñèñ
Object.Range(Start, End)
Çäåñü Object — ëþáàÿ äîïóñòèìàÿ ññûëêà íà îáúåêò Document. Start è End — öå-
ëûå çíà÷åíèÿ òèïà Long, çàäàþùèå ïîëîæåíèå íà÷àëüíîãî è êîíå÷íîãî ñèìâîëîâ
äèàïàçîíà, ñîîòâåòñòâåííî. Ìåòîä Range âîçâðàùàåò îáúåêò Range.

 ñëåäóþùåì ôðàãìåíòå ïðîãðàììû ìåòîä Range èñïîëüçóåòñÿ äëÿ ïîëó÷å-


íèÿ äèàïàçîíà, íà÷èíàþùåãîñÿ ïåðåä ïåðâûì ñèìâîëîì è çàêàí÷èâàþùåãîñÿ ïî-
ñëå äâàäöàòîãî ñèìâîëà àêòèâíîãî äîêóìåíòà (AnyRange — îáúåêòíàÿ ïåðåìåí-
íàÿ):
Set AnyRange = ActiveDocument.Range(Start:=0, End:=20)
Ññûëêó íà äèàïàçîí ìîæíî ïîëó÷èòü è ñ ïîìîùüþ ñâîéñòâà Range ëþáîé èç
êîëëåêöèé äèàïàçîíà, óïîìèíàâøèõñÿ ðàíåå: Paragraphs, Sentences èëè
Words. Ïðåäñòàâëåííûå íèæå ïðèìåðû âûðàæåíèé äåìîíñòðèðóþò, êàê ýòî
ñäåëàòü:
ActiveDocument.Sentences(3)
ActiveDocument.Paragraphs(2)
ActiveDocument.Words(10)
Ïåðâîå âûðàæåíèå âîçâðàùàåò îáúåêò Range, ññûëàþùèéñÿ íà òðåòüå ïðåä-
ëîæåíèå àêòèâíîãî äîêóìåíòà. Âòîðîå — âîçâðàùàåò îáúåêò Range, ññûëàþ-
ùèéñÿ íà âòîðîé àáçàö àêòèâíîãî äîêóìåíòà, à òðåòüå âûðàæåíèå âîçâðàùàåò
îáúåêò Range, ññûëàþùèéñÿ íà äåñÿòîå ñëîâî àêòèâíîãî äîêóìåíòà.
Ñëåäóþùèå äâà ïðèìåðà âûðàæåíèé íåìíîãî ñëîæíåå. Ïåðâîå èç ïîìåùåí-
íûõ íèæå âûðàæåíèé âîçâðàùàåò îáúåêò Range, ññûëàþùèéñÿ íà ïåðâîå ñëî-
âî âòîðîãî àáçàöà àêòèâíîãî äîêóìåíòà. Êîëëåêöèÿ Paragraphs èñïîëüçóåòñÿ
äëÿ âîçâðàùåíèÿ ññûëêè íà âòîðîé àáçàö äîêóìåíòà, à êîëëåêöèÿ Word, ñâÿ-
çàííàÿ ñ äèàïàçîíîì îáúåêòà Paragraph, — äëÿ âîçâðàùåíèÿ ññûëêè íà ïåð-
âîå ñëîâî àáçàöà. Âòîðîå âûðàæåíèå âîçâðàùàåò îáúåêò òèïà Range, ññûëàþ-
ùèéñÿ íà ïåðâîå ñëîâî ïåðâîãî ïðåäëîæåíèÿ àêòèâíîãî äîêóìåíòà. Êîëëåêöèÿ
Sentences èñïîëüçóåòñÿ äëÿ âîçâðàùåíèÿ ññûëêè íà ïåðâîå ïðåäëîæåíèå äî-
êóìåíòà, à êîëëåêöèÿ Words äàííîãî ïðåäëîæåíèÿ — äëÿ âîçâðàùåíèÿ îáúåê-
òà Range, ññûëàþùåãîñÿ íà ïåðâîå ñëîâî â ïðåäëîæåíèè.
ActiveDocument.Paragraphs(2).Range.Words(1)
ActiveDocument. Sentences(1).Words(1)
Êîä ëèñòèíãà 10.26 äåìîíñòðèðóåò ïðèìåð ïðîöåäóðû, èñïîëüçóþùåé ðàç-
ëè÷íûå äèàïàçîíû.

Ëèñòèíã 10.26. Èñïîëüçîâàíèå îáúåêòîâ Range


1: Sub TestRange()
2: 'Â àêòèâíîì äîêóìåíòå ïåðâîå ñëîâî êàæäîãî
426 Ãëàâà 10

3: 'àáçàöà, èìåþùåãî ñòèëü “Îñíîâíîé” è äëèíó íå ìåíåå


4: 'òðåõ ñëîâ, âûäåëÿåòñÿ êóðñèâîì
5:
6: Dim mParagraph As Paragraph
7:
8: For Each mParagraph In ActiveDocument.Paragraphs
9: With mParagraph
10: If .Style = "Îñíîâíîé" Then
11: If .Range.Words.Count >= 3 Then
12: .Range.Words(1).Italic = True
13: End If
14: End If
15: End With
16: Next mParagraph
17:
18: End Sub

Ïðîöåäóðà TestRange âûäåëÿåò êóðñèâîì ïåðâîå ñëîâî êàæäîãî àáçàöà


â ãëàâíîé îáëàñòè äîêóìåíòà, åñëè îí ñîäåðæèò òðè èëè áîëåå ñëîâ è åñëè
ñòèëü äàííîãî àáçàöà — Îñíîâíîé.
 ñòðîêå 8 íà÷èíàåòñÿ öèêë For Each, êîòîðûé ïåðåáèðàåò âñå àáçàöû êîë-
ëåêöèè Paragraphs äîêóìåíòà. Ñòðîêà 9 íà÷èíàåòñÿ ñ îïåðàòîðà With, âêëþ-
÷àþùåãî íåñêîëüêî îïåðàòîðîâ, ññûëàþùèõñÿ íà ñâîéñòâà è ìåòîäû òåêóùåãî
îáúåêòà Paragraph. Â ñòðîêå 10 èñïîëüçóåòñÿ îïåðàòîð If äëÿ îïðåäåëåíèÿ
òîãî, äåéñòâèòåëüíî ëè àáçàö èìååò ñòèëü Îñíîâíîé òåêñò. Òåêóùèé ñòèëü àá-
çàöà îïðåäåëÿåòñÿ ïðè ïîìîùè ñâîéñòâà Style.
 ñòðîêå 11 èñïîëüçóåòñÿ îïåðàòîð If äëÿ îïðåäåëåíèÿ òîãî, ñîäåðæèò ëè
àáçàö áîëåå äâóõ ñëîâ. Ïîñêîëüêó ñèìâîë êîíöà àáçàöà ñ÷èòàåòñÿ ñëîâîì, äëÿ
ëþáîãî àáçàöà, ñîäåðæàùåãî êàê ìèíèìóì äâà ñëîâà, íå ñ÷èòàÿ ñèìâîëà êîíöà
àáçàöà, âûðàæåíèå â ñòðîêå 11 áóäåò ðàâíî çíà÷åíèþ True.
 ñòðîêå 12 ïåðâîå ñëîâî àáçàöà âûäåëÿåòñÿ êóðñèâîì (ðèñ. 10.7). Ñíà÷àëà
ïðè ïîìîùè ñâîéñòâà Range îáúåêòà Paragraph âîçâðàùàåòñÿ äèàïàçîí, íà
êîòîðûé ññûëàåòñÿ äàííûé àáçàö.  ñâîþ î÷åðåäü, êîëëåêöèÿ Words èñïîëüçó-
åòñÿ äëÿ òîãî, ÷òîáû âîçâðàòèòü îáúåêò òèïà Range, ññûëàþùèéñÿ íà ïåðâîå
ñëîâî â äèàïàçîíå àáçàöà. ×òîáû âûäåëèòü ñëîâî êóðñèâîì, ñâîéñòâó Italic
îáúåêòà Range ïðèñâàèâàåòñÿ çíà÷åíèå True.

Êàê âûïîëíèòü ññûëêó íà äèàïàçîí


Ðàçìåð îáëàñòè, íà êîòîðóþ ññûëàåòñÿ êîíêðåòíûé îáúåêò Range, ìîæíî
èçìåíÿòü. Íàïðèìåð, âû ìîæåòå ñíà÷àëà ïîëó÷èòü äèàïàçîí, êîòîðûé ññûëà-
åòñÿ íà îäèí àáçàö, à çàòåì èçìåíèòü îáëàñòü äàííîãî äèàïàçîíà, âêëþ÷èâ
â íåãî äâà ñëåäóþùèõ àáçàöà. Îáëàñòü äîêóìåíòà, íà êîòîðóþ ññûëàåòñÿ îáú-
åêò Range, ìîæíî ðàñøèðèòü èëè óìåíüøèòü, è äàæå ñæàòü äèàïàçîí äî êóð-
ñîðà âñòàâêè.
×òîáû èçìåíèòü îáëàñòü, íà êîòîðóþ ññûëàåòñÿ äèàïàçîí, èñïîëüçóéòå ñëå-
äóþùóþ ñèíòàêñè÷åñêóþ êîíñòðóêöèþ äëÿ ìåòîäà SetRange:
Ñèíòàêñèñ
Object.SetRange(Start, End)
Çäåñü Object — ëþáàÿ äîïóñòèìàÿ ññûëêà íà îáúåêò Range èëè Selection. Îáà àð-
ãóìåíòà Start è End ÿâëÿþòñÿ îáÿçàòåëüíûìè, êàæäûé èç íèõ ÿâëÿåòñÿ öåëûì
÷èñëîì òèïà Long, ïðåäñòàâëÿþùèì íîâûå ïîçèöèè íà÷àëüíîãî è êîíå÷íîãî ñèì-
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 427

âîëîâ äèàïàçîíà, ñîîòâåòñòâåííî. Ñëåäóþùèé ôðàãìåíò ïðîãðàììû äåìîíñòðèðó-


åò, êàê îáúåêòíàÿ ïåðåìåííàÿ MyRange ñíà÷àëà óñòàíàâëèâàåòñÿ äëÿ ññûëêè íà
ïåðâîå ñëîâî àêòèâíîãî äîêóìåíòà, à çàòåì ïåðåîïðåäåëÿåòñÿ è âêëþ÷àåò óæå ïåð-
âûå äâà ñëîâà:
Set MyRange = ActiveDocument.Words(1)
AnyRange.SetRange Start:=AnyRangeStart, _
End:= ActiveDocument.Words(2).End
Âìåñòî ïåðåîïðåäåëåíèÿ äèàïàçîíà íàïðÿìóþ âû ìîæåòå ðàñøèðèòü èëè óìåíü-
øèòü äèàïàçîí äî çàäàííîãî ðàçìåðà èëè «ñâåðíóòü» åãî ïîëíîñòüþ.

Ðèñ. 10.7.
 ðåçóëüòàòå
ðàáîòû êîäà
ïðîöåäóðû
TestRange
â àêòèâíîì
äîêóìåíòå ïåðâîå
ñëîâî êàæäîãî
àáçàöà,
èìåþùåãî ñòèëü
«Îñíîâíîé
òåêñò» è äëèíó
íå ìåíåå òðåõ
ñëîâ, âûäåëÿåòñÿ
êóðñèâîì

Ìåòîä MoveStart èçìåíÿåò ïîëîæåíèå íà÷àëüíîãî ñèìâîëà äèàïàçîíà, â òî


âðåìÿ êàê ìåòîä MoveEnd èçìåíÿåò ïîëîæåíèå êîíå÷íîãî ñèìâîëà äèàïàçîíà.
Äëÿ óâåëè÷åíèÿ èëè óìåíüøåíèÿ îáëàñòè, íà êîòîðóþ ññûëàåòñÿ äèàïàçîí, âû
ìîæåòå ïåðåìåùàòü êîíå÷íóþ òî÷êó äèàïàçîíà, èñïîëüçóÿ ìåòîäû MoveEnd
èëè MoveStart ïðè ïîìîùè ñëåäóþùèõ ñèíòàêñè÷åñêèõ ôîðì:
Ñèíòàêñèñ
Object.MoveEnd([Unit], [Count])
Object.MoveStart([Unit], [Count])
 äàííîì ñèíòàêñè÷åñêîì âûðàæåíèè Object — ëþáàÿ äîïóñòèìàÿ ññûëêà íà îáú-
åêò Range. Êàê äëÿ ìåòîäà MoveEnd, òàê è äëÿ ìåòîäà MoveStart àðãóìåíòû Unit
è Count ÿâëÿþòñÿ íåîáÿçàòåëüíûìè. Àðãóìåíò Unit çàäàåò ýëåìåíò, äëÿ êîòîðîãî
áóäåò èçìåíÿòüñÿ íà÷àëî èëè êîíåö äèàïàçîíà. Unit ìîæåò áûòü îäíîé èç êîíñòàíò
WdUnits, ïåðå÷èñëåííûõ â òàáëèöå 10.1. Åñëè âû îïóñòèòå àðãóìåíò Unit, ìåòîäû
MoveStart è MoveEnd ïî óìîë÷àíèþ áóäóò èñïîëüçîâàòü wdCharacter.
Àðãóìåíò Count — ÷èñëî ýëåìåíòîâ (units), íà êîòîðîå äîëæíà áûòü ñäâèíóòà êîíå÷-
íàÿ òî÷êà. Åñëè âû èñïîëüçóåòå äëÿ àðãóìåíòà Count ïîëîæèòåëüíîå ÷èñëî, êîíå÷-
íàÿ òî÷êà ïåðåìåùàåòñÿ â äîêóìåíòå âïåðåä, åñëè âû èñïîëüçóåòå äëÿ àðãóìåíòà
Count îòðèöàòåëüíîå ÷èñëî, êîíå÷íàÿ òî÷êà ïåðåìåùàåòñÿ íàçàä.
428 Ãëàâà 10

Íèæå ïðèâåäåíû îïåðàòîðû, äåìîíñòðèðóþùèå ïðèìåíåíèå ìåòîäîâ


MoveStart è MoveEnd (AnyRange ÿâëÿåòñÿ îáúåêòíîé ïåðåìåííîé, ñîäåðæà-
ùåé ññûëêó íà îáúåêò Range):
AnyRange.MoveStart Unit:=wdParagraph, Count:= -1
AnyRange.MoveEnd Unit:=wdWord, Count:=-2
AnyRange.MoveEnd Count:=6
AnyRange.MoveStart Count:=8

Òàáëèöà 10.1 Âñòðîåííûå êîíñòàíòû WdUnits

Êîíñòàíòà Îïèñàíèå
wdCell ß÷åéêà òàáëèöû.
wdCharacter Ñèìâîë, âêëþ÷àÿ ñêðûòûå è íåïå÷àòàåìûå ñèìâîëû.
wdColumn Ñòîëáåö òàáëèöû.
Ñòðîêà òåêñòà. Âû ìîæåòå èñïîëüçîâàòü äàííóþ êîíñòàíòó òîëüêî
wdLine äëÿ àðãóìåíòà Unit, åñëè èñïîëüçóåìûé ìåòîä ïðèìåíÿåòñÿ
ê îáúåêòó Selection.
Àáçàö. Àáçàö îãðàíè÷èâàåòñÿ ñèìâîëîì êîíåö àáçàöà (¶). Ñèìâîë
êîíöà àáçàöà íå îòîáðàæàåòñÿ íà ýêðàíå ïîêà âû íå ùåëêíèòå
wdParagraph
êíîïêó Ïîêàçàòü âñå ñèìâîëû (Show All) ïàíåëè èíñòðóìåíòîâ
Word.
wdRow Ñòðîêà òàáëèöû.
wdSection Ðàçäåë äîêóìåíòà.
Ïðåäëîæåíèå. Ïðåäëîæåíèå îãðàíè÷èâàåòñÿ çíàêàìè ïóíêòóàöèè,
wdSentence
òàêèìè êàê òî÷êà (.), çíàê âîïðîñà (?) è âîñêëèöàòåëüíûé çíàê (!).
wdStory Îáëàñòü äîêóìåíòà.
wdTable Òàáëèöà.
wdWord Ñëîâî. Ñëîâî îãðàíè÷åíî ïðîáåëàìè è ñèìâîëàìè ïóíêòóàöèè.

Èíîãäà âàì ìîæåò ïîíàäîáèòüñÿ ðàñøèðèòü äèàïàçîí îò åãî òåêóùåãî çíà-


÷åíèÿ äî ðàçìåðîâ, âêëþ÷àþùèõ ñëåäóþùèé, áîëüøèé ïî âåëè÷èíå êîìïî-
íåíò äîêóìåíòà, íàïðèìåð, ðàñøèðèòü äèàïàçîí êóðñîðà âñòàâêè, ÷òîáû îí
âêëþ÷àë ñëîâî, â êîòîðîì íàõîäèòñÿ êóðñîð âñòàâêè.
×òîáû ðàñøèðèòü äèàïàçîí, ïðèìåíÿéòå ìåòîä Expand â ñëåäóþùåé ñèí-
òàêñè÷åñêîé ôîðìå:
Ñèíòàêñèñ
Object.Expand([Unit])
Çäåñü Object — ïðåäñòàâëÿåò ëþáóþ äîïóñòèìóþ ññûëêó íà îáúåêò Range èëè
Selection. Íåîáÿçàòåëüíûé àðãóìåíò Unit îïðåäåëÿåò ýëåìåíò, äî êîòîðîãî ðàñ-
øèðÿåòñÿ äèàïàçîí, è ìîæåò áûòü ðàâåí îäíîé èç êîíñòàíò WdUnits, ïåðå÷èñëåí-
íûõ â òàáëèöå 10.1. Åñëè âû îïóñòèòå àðãóìåíò Unit, ìåòîä Expand èñïîëüçóåò ïî
óìîë÷àíèþ çíà÷åíèå êîíñòàíòû wdWord.
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 429

Íèæå ïðåäñòàâëåí ôðàãìåíò êîäà, âûäåëÿþùèé äåñÿòîå ïðåäëîæåíèå äîêó-


ìåíòà è çàòåì ðàñøèðÿþùèé äèàïàçîí äëÿ âêëþ÷åíèÿ â íåãî âñåãî àáçàöà, â êî-
òîðîì íàõîäèòñÿ äåñÿòîå ïðåäëîæåíèå (MyRange — îáúåêòíàÿ ïåðåìåííàÿ):
Set MyRange = ActiveDocument.Sentences(10)
MyRange.Expand Unit:=wdParagraph

Ðàáîòà ñ îáúåêòîì Selection


Äëÿ áîëüøèíñòâà äåéñòâèé, ñâÿçàííûõ ñ óïðàâëåíèåì òåêñòîì äîêóìåíòà,
âû, âåðîÿòíî, îñòàíîâèòåñü íà îáúåêòå Selection. Èñïîëüçóÿ îáúåêò
Selection ìîæíî ñîçäàòü VBA-ïðîãðàììó, âûïîëíÿþùóþ ñ êóðñîðîì âñòàâ-
êè ëþáûå îïåðàöèè, êîòîðûå ìîæíî âûïîëíèòü â Word èíòåðàêòèâíî: äîáà-
âèòü òåêñò, ïåðåìåñòèòü êóðñîð âñòàâêè, âûäåëèòü òåêñò è äðóãèå.
Âûïîëíèòü ññûëêó íà îáúåêò Selection î÷åíü ïðîñòî: íåîáõîäèìî òîëüêî
èñïîëüçîâàòü ñâîéñòâî Selection îáúåêòîâ Application, Pane èëè Window.
 áîëüøèíñòâå ñëó÷àåâ èñïîëüçóåòñÿ ñâîéñòâî Application.Selection, ÷òî-
áû ïîëó÷èòü ññûëêó íà âûäåëåííûé â äàííûé ìîìåíò ôðàãìåíò â àêòèâíîì äî-
êóìåíòå.
Êàê óæå óïîìèíàëîñü â ýòîé ãëàâå, â ëþáîé ìîìåíò âðåìåíè ìîæåò áûòü àê-
òèâíûì òîëüêî îäèí îáúåêò Selection è â ëþáîì îêíå, îòîáðàæàþùåì äîêó-
ìåíò, ìîæåò íàõîäèòüñÿ òîëüêî îäèí îáúåêò Selection. Ýòî âïîëíå î÷åâèäíî,
ïîñêîëüêó îáúåêò Selection, ïî ñóùåñòâó, ÿâëÿåòñÿ êóðñîðîì âñòàâêè, êîòî-
ðûé îòîáðàæàåòñÿ íà ýêðàíå ïðè èíòåðàêòèâíîé ðàáîòå â Word.
Âû ìîæåòå ñâÿçàòü îáúåêò Selection ñ ëþáûì äèàïàçîíîì, èñïîëüçóÿ ìå-
òîä Select îáúåêòà Range:
MyRange.Select
Äàííûé îïåðàòîð âûäåëÿåò îáëàñòü äîêóìåíòà, íà êîòîðóþ ññûëàåòñÿ îáú-
åêòíàÿ ïåðåìåííàÿ MyRange. Îáúåêò Selection òåïåðü òàêæå ñîâïàäàåò ñ äèà-
ïàçîíîì, íà êîòîðûé ññûëàåòñÿ MyRange.

Êàê ïåðåìåñòèòü èëè «ñâåðíóòü» îáúåêòû Selection è Range


Âû óæå çíàåòå, êàê îïðåäåëèòü èëè ïåðåîïðåäåëèòü äèàïàçîíû è êàê ñâÿ-
çàòü òåêóùèé âûäåëåííûé ôðàãìåíò ñ êîíêðåòíûì äèàïàçîíîì. Îáúåêòû
Range è Selection èìåþò íåñêîëüêî ìåòîäîâ, ïîçâîëÿþùèõ ïåðåìåùàòü äèà-
ïàçîí èëè âûäåëåííûé ôðàãìåíò. ×àùå âñåãî ýòè ìåòîäû èñïîëüçóþòñÿ äëÿ
ïåðåìåùåíèÿ îáúåêòà Selection ïåðåä äîáàâëåíèåì è âûäåëåíèåì òåêñòà.
 äåéñòâèòåëüíîñòè, ñóùåñòâóåò ïàðà ìåòîäîâ, êîòîðûå äîñòóïíû èñêëþ÷è-
òåëüíî â îáúåêòå Selection, îíè íå èìåþò àíàëîãîâ â îáúåêòå Range.
×òîáû ïîìåñòèòü îáúåêò Selection â íà÷àëå èëè â êîíöå òåêóùåé ñòðîêè
òåêñòà, ñòîëáöà òàáëèöû, ñòðîêè òàáëèöû èëè îáëàñòè äîêóìåíòà è ïðè æåëà-
íèè âûäåëèòü äàííóþ ñòðîêó òåêñòà, ñòîëáåö èëè ñòðîêó òàáëèöû èëè æå îá-
ëàñòü, ìîæíî èñïîëüçîâàòü ìåòîäû HomeKey èëè EndKey â ñëåäóþùåé ñèíòàê-
ñè÷åñêîé ôîðìå:
Ñèíòàêñèñ
Object.HomeKey([Unit], [Extend])
Object.EndKey([Unit], [Extend])
430 Ãëàâà 10

 îáîèõ ñëó÷àÿõ Object ïðåäñòàâëÿåò ñîáîé äîïóñòèìóþ ññûëêó íà îáúåêò


Selection.  çàâèñèìîñòè îò êîíêðåòíîãî çíà÷åíèÿ èñïîëüçóåìîãî àðãóìåíòà ìå-
òîä HomeKey îêàçûâàåò íà âûäåëåííûé ôðàãìåíò òàêîå æå äåéñòâèå, êàê è íàæà-
òèå êëàâèø Home, Shift+Home, Ctrl+Home èëè Ctrl+Shift+Home. Àíàëîãè÷íî ìå-
òîä EndKey îêàçûâàåò íà âûäåëåííûé ôðàãìåíò òàêîå æå äåéñòâèå, ÷òî è íàæàòèå
â ðàçëè÷íûõ êîìáèíàöèÿõ êëàâèøè End.
Íåîáÿçàòåëüíûé àðãóìåíò Unit çàäàåò ýëåìåíò, â êîíöå êîòîðîãî äîëæåí ïîìå-
ùàòüñÿ âûäåëåííûé ôðàãìåíò (â êîíöå ñòðîêè, ñòîëáöà è ò.ä.). Unit ìîæåò áûòü
çíà÷åíèåì îäíîé èç ñëåäóþùèõ êîíñòàíò WdUnits: wdStory, wdLine, wdColumn
èëè wdRow. Åñëè àðãóìåíò Unit îïóñòèòü, òî êàê HomeKey, òàê è EndKey èñïîëüçó-
þò ïî óìîë÷àíèþ çíà÷åíèå êîíñòàíòû wdLine (â êîíöå ñòðîêè).
Íåîáÿçàòåëüíûé àðãóìåíò Extend îïðåäåëÿåò, äîëæåí ëè âûäåëåííûé ôðàãìåíò
áûòü ðàñøèðåí èëè äîëæåí ëè êóðñîð âñòàâêè áûòü ïåðåìåùåí.  êà÷åñòâå Extend
ìîæíî èñïîëüçîâàòü çíà÷åíèå îäíîé èç âñòðîåííûõ êîíñòàíò WdMovementType:
wdMove èëè wdExtend. Èñïîëüçîâàíèå wdMove ïðèâåäåò ê «ñâîðà÷èâàíèþ» âûäå-
ëåííîãî ôðàãìåíòà äî êóðñîðà âñòàâêè, ïîñëå ÷åãî êóðñîð âñòàâêè ïåðåìåñòèòñÿ íà
íà÷àëî èëè êîíåö çàäàííîãî ýëåìåíòà äîêóìåíòà, îïðåäåëÿåìîãî àðãóìåíòîì Unit.
Èñïîëüçîâàíèå wdExtend îêàçûâàåò òàêîå æå äåéñòâèå, êàê íàæàòèå íà êëàâèøè
Home èëè End ïðè óäåðæèâàåìîé íàæàòîé êëàâèøå Shift. Èñïîëüçîâàíèå
wdExtend ïðèâåäåò ê òîìó, ÷òî âûäåëåííûé ôðàãìåíò áóäåò ðàñøèðåí äî êîíöà çà-
äàííîãî ýëåìåíòà. Åñëè âû îïóñòèòå àðãóìåíò Extend, â êà÷åñòâå çíà÷åíèÿ ïî
óìîë÷àíèþ áóäåò èñïîëüçîâàíà êîíñòàíòà wdMove.

 ïðåäñòàâëåííîì íèæå ïðèìåðå êàæäûé èç äâóõ îïåðàòîðîâ èñïîëüçóåò


îäèí èç òîëüêî ÷òî îïèñàííûõ ìåòîäîâ. Âûïîëíåíèå ïåðâîãî îïåðàòîðà «ñâîðà-
÷èâàåò» âûäåëåííûé ôðàãìåíò äî êóðñîðà âñòàâêè è çàòåì ïåðåìåùàåò êóðñîð
âñòàâêè â íà÷àëî òåêóùåé ñòðîêè. Âûïîëíåíèå âòîðîãî îïåðàòîðà ðàñøèðÿåò
âûäåëåííûé ôðàãìåíò äî êîíöà òåêóùåé ñòðîêè.
Selection.HomeKey
Selection.EndKey Extend:=wbExtend
Õîòÿ îáúåêòû Range è Selection èìåþò ìíîãî ðàçëè÷íûõ ìåòîäîâ äëÿ âû-
ïîëíåíèÿ ïåðåìåùåíèé, âîçìîæíî, íàèáîëåå ìîùíûì èç íèõ ÿâëÿåòñÿ ìåòîä
GoTo. Ìåòîä GoTo ïîçâîëÿåò ïîìåùàòü îáúåêòû Range è Selection â ëþáîå
ìåñòî â ïðåäåëàõ òåêóùåé îáëàñòè è ïåðåìåùàòü Selection èëè Range ïî äî-
êóìåíòó âïåðåä èëè íàçàä íà çàäàííîå êîëè÷åñòâî ñèìâîëîâ, ñëîâ èëè àáçàöåâ.
Äëÿ ïåðåìåùåíèÿ îáúåêòîâ Selection èëè Range èñïîëüçóéòå ìåòîä GoTo
â ñëåäóþùåé ñèíòàêñè÷åñêîé ôîðìå:
Ñèíòàêñèñ
Object.GoTo([What], [Which], [Count], [Name])
Çäåñü Object — ëþáàÿ äîïóñòèìàÿ ññûëêà íà îáúåêòû Selection, Range èëè
Document. Åñëè Object ññûëàåòñÿ íà Selection, òî ìåòîä GoTo âîçâðàùàåò îáúåêò
Range, ïðåäñòàâëÿþùèé íîâîå ïîëîæåíèå âûäåëåííîãî ôðàãìåíòà ïîñëå åãî «ñâî-
ðà÷èâàíèÿ» äî êóðñîðà âñòàâêè è ïåðåìåùåíèÿ â ïîçèöèþ ñèìâîëà, ðàñïîëîæåííî-
ãî íåïîñðåäñòâåííî ïåðåä çàäàííûì ïîëîæåíèåì. Åñëè Object ññûëàåòñÿ íà Range
èëè Document, ìåòîä GoTo ïðîñòî âîçâðàùàåò îáúåêò Range, ïðåäñòàâëÿþùèé íà-
÷àëüíîå ïîëîæåíèå äëÿ çàäàííîé îáëàñòè.
Âñå àðãóìåíòû ìåòîäà GoTo ÿâëÿþòñÿ íåîáÿçàòåëüíûìè. Àðãóìåíò What çàäàåò òèï
ýëåìåíòà, â êîòîðûé äîëæåí áûòü ïåðåìåùåí âûäåëåííûé ôðàãìåíò, è ìîæåò áûòü
ëþáîé èç âñòðîåííûõ êîíñòàíò WdGoToItem.  òàáëèöå 10.2 ïåðå÷èñëåíû íåêîòîðûå
èç êîíñòàíò WdGoToItem. Äëÿ òîãî ÷òîáû ïðîñìîòðåòü ïîëíûé ñïèñîê êîíñòàíò, äîñ-
òóïíûõ â êëàññå WdGoToItem, èñïîëüçóéòå Object Browser.
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 431

Àðãóìåíò Which óêàçûâàåò, â êàêîé ýëåìåíò äîëæåí áûòü ïåðåìåùåí âûäåëåííûé


ôðàãìåíò. Which ìîæåò áûòü ðàâåí ëþáîé èç âñòðîåííûõ êîíñòàíò êëàññà
WdGoToDirection: wdGoToAbsolute, wdGoToFirst, wdGoToLast, wdGoToNext,
wdGoToPrevious, wdGoToRelative.
Àðãóìåíò Count çàäàåò ÷èñëî ýëåìåíòîâ äîêóìåíòà, íà êîòîðîå äîëæåí áûòü ïåðå-
ìåùåí âûäåëåííûé ôðàãìåíò. Ïî óìîë÷àíèþ çíà÷åíèå àðãóìåíòà Count ðàâíî 1.
Èñïîëüçîâàíèå àðãóìåíòà Count ïîäðàçóìåâàåò èñïîëüçîâàíèå àðãóìåíòà What,
óêàçûâàþùåãî, êóäà íåîáõîäèìî âûïîëíèòü ïåðåìåùåíèå, è àðãóìåíòà Which, çà-
äàþùåãî, êàêîé òèï ïåðåìåùåíèÿ íåîáõîäèìî âûïîëíèòü.
Ïîñëåäíèé àðãóìåíò Name îïðåäåëÿåò èìÿ îáëàñòè, â êîòîðóþ äîëæåí áûòü ïåðå-
ìåùåí âûäåëåííûé ôðàãìåíò. Âû ìîæåòå èñïîëüçîâàòü àðãóìåíò Name òîëüêî
â òîì ñëó÷àå, åñëè àðãóìåíò What òàêæå èñïîëüçóåòñÿ è ðàâåí ïðè ýòîì çíà÷åíèþ
îäíîé èç ñëåäóþùèõ êîíñòàíò: wdGoToBookmark, wdGoToComment, wdGoToField
èëè wdGoToObject.

 ðåçóëüòàòå âûïîëíåíèÿ ïðèâåäåííîãî íèæå îïåðàòîðà âûäåëåííûé ôðàã-


ìåíò ïåðåìåùàåòñÿ íà ñëåäóþùóþ ñòðàíèöó:
Selection.GoTo What:=wgGoToPage
Ðåçóëüòàòîì âûïîëíåíèÿ ñëåäóþùåãî îïåðàòîðà áóäåò ïåðåìåùåíèå âûäå-
ëåííîãî ôðàãìåíòà íà ïîñëåäíþþ ñòðàíèöó äîêóìåíòà:
Selection.GoTo What:=wgGoToPage, Which:=wdGoToLast
 ðåçóëüòàòå âûïîëíåíèÿ ïðèâåäåííîãî íèæå îïåðàòîðà âûäåëåííûé ôðàã-
ìåíò ïåðåìåùàåòñÿ íà äâå ñòðîêè âíèç îòíîñèòåëüíî òåêóùåãî ìåñòîïîëîæåíèÿ:
Selection.GoTo What:=wgGoToLine, Which:=wdGoToNext, Count:=2

Òàáëèöà 10.2 Âñòðîåííûå êîíñòàíòû WdGoToItem

Êîíñòàíòà Îïèñàíèå
wdGoToBookmar
Çàêëàäêà.
k
wdGoToField Ïîëå, íàïðèìåð ïîëå äàòû èëè íîìåðà ñòðàíèöû.
Çàãîëîâîê, òî åñòü òåêñò, îòôîðìàòèðîâàííûé ñ ïîìîùüþ îäíîãî
wdGoToHeading
èç ñòèëåé çàãîëîâêà: Çàãîëîâîê1, Çàãîëîâîê2 è òàê äàëåå.
wdGoToLine Ñòðîêà äîêóìåíòà.
wdGoToPage Ñòðàíèöà äîêóìåíòà.
Ìåñòîïîëîæåíèå â äîêóìåíòå, âûðàæåííîå â ïðîöåíòàõ îò äëèíû
wdGoToPercent
äîêóìåíòà.

 äîïîëíåíèå ê èçìåíåíèþ ïîëîæåíèÿ âûäåëåííîãî ôðàãìåíòà âû ìîæåòå


«ñâåðíóòü» âûäåëåííûé ôðàãìåíò (èëè äèàïàçîí) äî êóðñîðà âñòàâêè. Äëÿ ýòî-
ãî èñïîëüçóéòå ìåòîä Collapse â ñëåäóþùåé ñèíòàêñè÷åñêîé ôîðìå:
Ñèíòàêñèñ
Object.Collapse([Direction])
Çäåñü Object — ëþáàÿ äîïóñòèìàÿ ññûëêà íà îáúåêòû Selection èëè Range. Íåîáÿçà-
òåëüíûé àðãóìåíò Direction çàäàåò íàïðàâëåíèå, â êîòîðîì äèàïàçîí èëè âûäåëåííûé
ôðàãìåíò äîëæíû áûòü «ñâåðíóòû». Îí ìîæåò áûòü ðàâåí îäíîé èç êîíñòàíò êëàññà
432 Ãëàâà 10

WdCollapseDirection: wdCollapseEnd èëè wdCollapseStart. Ïî óìîë÷àíèþ èñ-


ïîëüçóåòñÿ çíà÷åíèå êîíñòàíòû wdCollapseStart.

Ñëåäóþùèå îïåðàòîðû äåìîíñòðèðóþò ïðèìåíåíèå ìåòîäà Collapse:


ActiveDocument.Paragraphs(3).Range.Select
Selection.Collapse Direction:=wdCollapseEnd
Ïåðâûé îïåðàòîð âûäåëÿåò òðåòèé àáçàö àêòèâíîãî äîêóìåíòà. Âòîðîé îïå-
ðàòîð «ñâîðà÷èâàåò» âûäåëåííûé ôðàãìåíò äî êóðñîðà âñòàâêè, ïîìåùåííîãî
â êîíåö ïðåäûäóùåãî âûäåëåííîãî ôðàãìåíòà.

Äîáàâëåíèå òåêñòà
Îñíîâíûì íàçíà÷åíèåì ïðîãðàìì ïîäãîòîâêè òåêñòà ÿâëÿåòñÿ õðàíåíèå
è îáðàáîòêà òåêñòà. Îäíîé èç îñíîâíûõ çàäà÷, âûïîëíÿåìûõ ïðè èíòåðàêòèâ-
íîé ðàáîòå ñ Word, ÿâëÿåòñÿ ââîä òåêñòà â äîêóìåíò. Òî÷íî òàêæå, îäíà èç
íàèáîëåå ðàñïðîñòðàíåííûõ çàäà÷, êîòîðóþ âàì ïðèäåòñÿ âûïîëíÿòü ïîä
óïðàâëåíèåì VBA-êîäà, áóäåò çàêëþ÷àòüñÿ â òîì, ÷òîáû äîáàâëÿòü òåêñò. Îáú-
åêòû Selection è Range èìåþò íåñêîëüêî ìåòîäîâ, ïðåäîñòàâëÿþùèõ âîç-
ìîæíîñòü äîáàâëÿòü òåêñò.  ïåðâóþ î÷åðåäü ðàññìîòðèì ìåòîäû äîáàâëåíèÿ
òåêñòà îáúåêòà Selection, ïîñêîëüêó âàì ÷àùå âñåãî ïðèäåòñÿ èìåòü äåëî
èìåííî ñ ýòèì îáúåêòîì.
Ïðîñòåéøèé ñïîñîá äîáàâèòü òåêñò â äîêóìåíò ñîñòîèò â èñïîëüçîâàíèè ìå-
òîäà TypeText îáúåêòà Selection, ñäåëàòü ýòî ìîæíî ïðè ïîìîùè ñëåäóþùåé
ñèíòàêñè÷åñêîé êîíñòðóêöèè:
Ñèíòàêñèñ
Object.TypeText([Text])
Object — ëþáàÿ ññûëêà íà îáúåêò Selection. Àðãóìåíò Text ÿâëÿåòñÿ îáÿçàòåëü-
íûì, îí ìîæåò áûòü ëþáûì ñòðîêîâûì âûðàæåíèåì, è ýòî èìåííî òîò òåêñò, êîòî-
ðûé äîáàâëÿåòñÿ â äîêóìåíò. Ìåòîä TypeText ïîìåùàåò òåêñò â òî ìåñòî, ãäå ðàñ-
ïîëîæåí êóðñîð âñòàâêè, êàê åñëè áû âû ââåëè åãî ñ êëàâèàòóðû. Åñëè Selection
ñîäåðæèò äèàïàçîí è ñâîéñòâî ReplaceSelection ðàâíî çíà÷åíèþ True, òî äîáàâ-
ëÿåìûé òåêñò çàìåíÿåò âûäåëåííûé ôðàãìåíò.  ïðîòèâíîì ñëó÷àå òåêñò ïîìåùà-
åòñÿ ïåðåä êóðñîðîì âñòàâêè îáúåêòà Selection. Ïðè óñòàíîâêå Word ñâîéñòâî
ReplaceSelection ïî óìîë÷àíèþ ïðèíèìàåò çíà÷åíèå True.

Ñâîéñòâî ReplaceSelection ñîîòâåòñòâóåò ôëàæêó çàìåíÿòü âûäåëåííûé


ôðàãìåíò (Typing Replace Selection) íà âêëàäêå Ïðàâêà äèàëîãîâîãî Word-îêíà
Ïàðàìåòðû, êîòîðîå ìîæíî îòêðûòü ïðè ïîìîùè êîìàíäû Ñåðâèñ | Ïàðàìåòðû.
Ìîæíî òàêæå çàäàòü ýòî ñâîéñòâî ïðè ïîìîùè îáúåêòà Options.
Åñëè ìåòîä TypeText äîáàâëÿåò òåêñò òàê, êàê áóäòî âû ââåëè åãî ñ êëàâèà-
òóðû, òî, î÷åâèäíî, ÷òî îáúåêòó Selection íåîáõîäèì ìåòîä, ýêâèâàëåíòíûé
íàæàòèþ êëàâèøè Enter, äëÿ òîãî, ÷òîáû ìîæíî áûëî äîáàâëÿòü íîâûé àáçàö.
Ýòîò ìåòîä òàê è íàçûâàåòñÿ TypeParagraph. Ñèíòàêñè÷åñêàÿ êîíñòðóêöèÿ
ýòîãî ìåòîäà âûãëÿäèò ñëåäóþùèì îáðàçîì:
Ñèíòàêñèñ
Object.TypeParagraph
Object — ññûëêà íà îáúåêò Selection. Ìåòîä TypeParagraph ïîìåùàåò â äîêó-
ìåíò íîâûé àáçàö àíàëîãè÷íî òîìó, êàê ýòî ïðîèñõîäèò ïðè íàæàòèè íà êëàâèøó
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 433

Enter. Åñëè îáúåêò Selection — äèàïàçîí, ñîäåðæèìîå äèàïàçîíà çàìåíÿåòñÿ íî-


âûì àáçàöåì. Åñëè Selection — êóðñîð âñòàâêè, äîáàâëÿåòñÿ íîâûé àáçàö, à êóð-
ñîð âñòàâêè ïåðåìåùàåòñÿ â äîêóìåíòå âïåðåä.

×òîáû ñëó÷àéíî íå çàìåíèòü âûäåëåííûé ôðàãìåíò, èñïîëüçóéòå ìåòîä


Collapse äëÿ «ñâîðà÷èâàíèÿ» âûäåëåííîãî ôðàãìåíòà â êóðñîð âñòàâêè.
Âîçìîæíî, âàì ïîíàäîáèòñÿ äîáàâëÿòü òåêñò â äèàïàçîí, êîòîðûé íå ÿâëÿ-
åòñÿ âûäåëåííûì.  ýòîì ñëó÷àå ñëåäóåò èñïîëüçîâàòü ìåòîäû InsertAfter,
InsertBefore, InsertParagraphAfter è InsertParagraphBefore. Âñå ýòè
ìåòîäû ïðèìåíèìû êàê ê îáúåêòàì Selection, òàê è ê îáúåêòàì Range.
Äëÿ äîáàâëåíèÿ òåêñòà â íà÷àëî èëè êîíåö äèàïàçîíà èñïîëüçóéòå ìåòîäû
InsertBefore èëè InsertAfter ñî ñëåäóþùèì ñèíòàêñèñîì:
Ñèíòàêñèñ
Object.InsertBefore(Text)
Object.InsertAfter(Text)
Çäåñü Object — ññûëêà íà îáúåêò Selection èëè Range. Text — ñòðîêîâîå âûðàæå-
íèå äëÿ òåêñòà, êîòîðûé íåîáõîäèìî äîáàâèòü. Àðãóìåíò Text îáÿçàòåëåí äëÿ êàæ-
äîãî èç ìåòîäîâ. Çàäàííûé òåêñò ïîìåùàåòñÿ â äèàïàçîí, è äèàïàçîí ðàñøèðÿåòñÿ,
âêëþ÷àÿ â ñåáÿ äîáàâëåííûé òåêñò. Îïðàâäûâàÿ ñâîå èìÿ, ìåòîä InsertBefore ïî-
ìåùàåò òåêñò â íà÷àëî äèàïàçîíà èëè âûäåëåííîãî ôðàãìåíòà, à InsertAfter ïî-
ìåùàåò òåêñò ñîîòâåòñòâåííî â êîíåö äèàïàçîíà èëè âûäåëåííîãî ôðàãìåíòà.
Ïðèìåíåíèå ìåòîäà InsertAfter èìååò íåêîòîðûå îñîáåííîñòè, òðåáóþùèå äî-
ïîëíèòåëüíûõ ïîÿñíåíèé. Åñëè âûäåëåííûé ôðàãìåíò èëè äèàïàçîí âêëþ÷àåò öå-
ëûé àáçàö, ìåòîä InsertAfter âñòàâëÿåò òåêñò êàê íîâûé àáçàö. Òàê ïðîèñõîäèò
ïîòîìó, ÷òî âûäåëåííûé ôðàãìåíò, âêëþ÷àþùèé öåëûé àáçàö, òàêæå âêëþ÷àåò
è ñèìâîë êîíöà àáçàöà. ×òîáû âñòàâèòü òåêñò â êîíåö àáçàöà, íåîáõîäèìî èëè
«ñâåðíóòü» äèàïàçîí äî êóðñîðà âñòàâêè â ïîçèöèè ïåðåä ñèìâîëîì êîíöà àáçàöà,
èëè òàêèì îáðàçîì èçìåíèòü êîíå÷íóþ òî÷êó äèàïàçîíà, ÷òîáû îí ñîäåðæàë íà
îäèí ñèìâîë ìåíüøå.
Çàìå÷àíèå
Äëÿ âñåõ ìåòîäîâ, äîáàâëÿþùèõ òåêñò — TypeText, InsertAfter è InsertBefore, — ìîæ-
íî èñïîëüçîâàòü ôóíêöèþ Chr è âñòðîåííûå êîíñòàíòû VBA (vbCr, vbLf, vbCrLf, vbTab)
êàê ÷àñòü ñòðîêè àðãóìåíòà Text äëÿ äîáàâëåíèÿ ñèìâîëîâ, êîòîðûå íåëüçÿ íàáðàòü íà êëà-
âèàòóðå, èëè ñèìâîëîâ, êîòîðûå èìåþò â VBA ñïåöèàëüíîå çíà÷åíèå (íàïðèìåð, êàâû÷êè).

Òàê æå, êàê ìåòîä TypeText èìååò ñîïóòñòâóþùèé åìó ìåòîä TypePara-
graph, êîòîðûé ìîæíî èñïîëüçîâàòü äëÿ äîáàâëåíèÿ íîâîãî àáçàöà, ìåòîäû
InsertBefore è InsertAfter èìåþò ñîïóòñòâóþùèå ìåòîäû äëÿ äîáàâëåíèÿ
íîâîãî àáçàöà ïåðåä îáëàñòüþ èëè ïîñëå îáëàñòè, íà êîòîðóþ ññûëàåòñÿ îïðå-
äåëåííûé äèàïàçîí:
Ñèíòàêñèñ
Object.InsertParagraphBefore
Object.InsertParagraphAfter
 êàæäîé ñèíòàêñè÷åñêîé êîíñòðóêöèè Object — ññûëêà íà îáúåêò Selection èëè
íà îáúåêò Range. Ìåòîä InsertParagraphBefore äîáàâëÿåò ñèìâîë êîíöà àáçàöà
ïåðåä äèàïàçîíîì èëè âûäåëåííûì ôðàãìåíòîì, â òî âðåìÿ êàê ìåòîä
InsertParagraphAfter äîáàâëÿåò ñèìâîë êîíöà àáçàöà â êîíåö äèàïàçîíà èëè
âûäåëåííîãî ôðàãìåíòà. Íè òîò, íè äðóãîé ìåòîä íå èìååò àðãóìåíòîâ. Êàê è â ñëó-
÷àå ñ äðóãèìè ìåòîäàìè Insert…, äèàïàçîí èëè âûäåëåííûé ôðàãìåíò ðàñøèðÿ-
åòñÿ äëÿ âêëþ÷åíèÿ äîáàâëåííîãî ñèìâîëà êîíöà àáçàöà.
434 Ãëàâà 10

Ëèñòèíã 10.27 äåìîíñòðèðóåò èñïîëüçîâàíèå ìåòîäîâ InsertBefore, In-


sertAfter è InsertParagraphAfter.

Ëèñòèíã 10.27. Ïðèìåíåíèå ìåòîäîâ InsertAfter,


InsertBefore, InsertParagraphAfter

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 ïîìåùàåò â íà÷àëî òåêóùåãî äîêóìåíòà äâà
àáçàöà: ïåðâûé àáçàö ñîäåðæèò èìÿ ôàéëà, â êîòîðîì õðàíèòñÿ äîêóìåíò, âòîðîé àáçàö
ñîäåðæèò èìÿ ôàéëà-øàáëîíà äîêóìåíòà

Êàê âûðåçàòü, ñêîïèðîâàòü, âñòàâèòü è óäàëèòü òåêñò


Âàì îáÿçàòåëüíî ïîíàäîáèòñÿ íå òîëüêî ââîäèòü, íî è âûðåçàòü, êîïèðîâàòü,
âñòàâëÿòü èëè óäàëÿòü òåêñò â äîêóìåíòå. Äëÿ âûïîëíåíèÿ ýòèõ çàäà÷, êàê îáú-
åêòû Selection, òàê è îáúåêòû Range èìåþò ñîîòâåòñòâóþùèå ìåòîäû.
Óïðàâëåíèå host-ïðèëîæåíèÿìè VBA 435

×òîáû âûðåçàòü, ñêîïèðîâàòü èëè âñòàâèòü âûäåëåííûé ôðàãìåíò â èëè èç


áóôåðà îáìåíà Windows, ìîæíî èñïîëüçîâàòü îäèí èç ñëåäóþùèõ ìåòîäîâ:
Ñèíòàêñèñ
Object.Cut
Object.Copy
Object.Paste
Äëÿ êàæäîãî èç ýòèõ ìåòîäîâ Object — ëþáàÿ ññûëêà íà îáúåêò Selection èëè
Range. Ïðè èñïîëüçîâàíèè âàìè ìåòîäà Cut ñîäåðæèìîå äèàïàçîíà èëè âûäåëåí-
íîãî ôðàãìåíòà âûðåçàåòñÿ èç äîêóìåíòà è ïîìåùàåòñÿ â áóôåð îáìåíà Windows.
Îáúåêòû Selection èëè Range îñòàþòñÿ â äîêóìåíòå, «ñâîðà÷èâàÿñü» äî êóðñîðà
âñòàâêè. Ìåòîä Copy êîïèðóåò ñîäåðæèìîå äèàïàçîíà èëè âûäåëåííîãî ôðàãìåíòà
â áóôåð îáìåíà Windows. Îáúåêòû Selection èëè Range ïðè ýòîì íå èçìåíÿþòñÿ.
Ìåòîä Paste âñòàâëÿåò ñîäåðæèìîå áóôåðà îáìåíà Windows â çàäàííûé äèàïàçîí
èëè âûäåëåííûé ôðàãìåíò. Åñëè äèàïàçîí èëè âûäåëåííûé ôðàãìåíò íå ÿâëÿåòñÿ
êóðñîðîì âñòàâêè, òî òåêñò, âñòàâëÿåìûé èç áóôåðà îáìåíà, çàìåíÿåò ñîäåðæèìîå
çàäàííîãî äèàïàçîíà èëè âûäåëåííîãî ôðàãìåíòà. Êîãäà âû èñïîëüçóåòå ìåòîä
Paste ñ îáúåêòîì Range, äèàïàçîí ðàñøèðÿåòñÿ, âêëþ÷àÿ â ñåáÿ ñîäåðæèìîå âñòàâ-
ëåííîãî èç áóôåðà îáìåíà òåêñòà. Ïðè èñïîëüçîâàíèè æå âàìè ìåòîäà Paste ñ îáú-
åêòîì Selection âûäåëåííûé ôðàãìåíò ðàñïîëàãàåòñÿ ïîñëå âñòàâëåííîãî èç áóôå-
ðà îáìåíà òåêñòà; âûäåëåííûé ôðàãìåíò íå ðàñøèðÿåòñÿ.

Ëèñòèíã 10.28 ñîäåðæèò ïðîöåäóðó, êîòîðàÿ ïðè ïîìîùè ìåòîäîâ Cut


è Paste îáúåêòà Selection ìåíÿåò ìåñòàìè äâà àáçàöà äîêóìåíòà. Êîä ëèñ-
òèíãà 10.29 ïðè ïîìîùè ìåòîäîâ Cut è Paste îáúåêòà Range ìåíÿåò ìåñòàìè
äâà ñëîâà â äîêóìåíòå.

Ëèñòèíã 10.28. Èñïîëüçîâàíèå ìåòîäîâ Cut è Paste


ñîâìåñòíî ñ îáúåêòîì Selection
1: Sub TransposeParagrahs()
2: 'Ìåíÿåò ìåñòàìè òåêóùèé àáçàö è àáçàö, ñëåäóþùèé çà íèì.
3: 'Èñïîëüçóåòñÿ îáúåêò Selection.
4:
5: With Selection
6: .Expand Unit:=wdParagraph
7: .Cut
8: .Move Unit:=wdParagraph
9: .Paste
10: End With
11:
12: End Sub

Ëèñòèíã 10.29. Èñïîëüçîâàíèå Cut è Paste


ñîâìåñòíî ñ îáúåêòîì Range
1: Sub TransposeWords()
2: 'Ìåíÿåò ìåñòàìè ñëîâî, íà êîòîðîå ïîìåùåí êóðñîð âñòàâêè,
3: 'è ñëîâî, ñëåäóþùåå çà íèì
4:
5: Dim MyRange As Range
6:
7: If Selection.Type <> wdSelectionIP Then Exit Sub
8:
9: Set MyRange = Selection.Range
436 Ãëàâà 10

10: With MyRange


11: .Expand Unit:=wdWord
12: .Cut
13: .Move Unit:=wdWord
14: .Paste
15: End With
16: End Sub

Äëÿ óäàëåíèÿ èç äîêóìåíòà òåêñòà èñïîëüçóéòå ìåòîä Delete. Ñèíòàêñè÷å-


ñêàÿ êîíñòðóêöèÿ äëÿ åãî èñïîëüçîâàíèÿ ñëåäóþùàÿ:
Ñèíòàêñèñ
Object.Delete([Unit], [Count])
Object — ëþáàÿ ññûëêà íà îáúåêòû Selection èëè Range. Îáà àðãóìåíòà Unit
è Count ÿâëÿþòñÿ íåîáÿçàòåëüíûìè. Àðãóìåíò Unit ìîæåò áûòü ðàâåí çíà÷åíèþ
wdCharacter èëè wdWord. Ïî óìîë÷àíèþ çíà÷åíèå Unit ðàâíî wdCharacter. Àð-
ãóìåíò Count çàäàåò êîëè÷åñòâî ñèìâîëîâ èëè ñëîâ (â çàâèñèìîñòè îò çíà÷åíèÿ àð-
ãóìåíòà Unit), êîòîðûå äîëæíû áûòü óäàëåíû. Åñëè îáúåêòû Range èëè
Selection ññûëàþòñÿ íà äèàïàçîí òåêñòà, ìåòîä Delete óäàëÿåò ñîäåðæèìîå äàí-
íîãî äèàïàçîíà.

Åñëè âû èñïîëüçóåòå ìåòîä Delete êàê ôóíêöèþ, îíà âîçâðàùàåò çíà÷åíèå,


óêàçûâàþùåå ÷èñëî óäàëåííûõ ýëåìåíòîâ òåêñòà, èëè — 0, åñëè îïåðàöèÿ óäà-
ëåíèÿ íå óäàëàñü.
Äëÿ óäàëåíèÿ çàäàííîãî ÷èñëà ñèìâîëîâ èëè ñëîâ äî èëè ïîñëå äèàïàçîíà
èëè âûäåëåííîãî ôðàãìåíòà ñíà÷àëà åãî íåîáõîäèìî «ñâåðíóòü» äî êóðñîðà
âñòàâêè. Äëÿ òîãî ÷òîáû óäàëèòü ýëåìåíòû òåêñòà ïîñëå êóðñîðà âñòàâêè, ñëå-
äóåò èñïîëüçîâàòü â êà÷åñòâå àðãóìåíòà Count ïîëîæèòåëüíîå ÷èñëî, à ÷òîáû
óäàëèòü ýëåìåíòû òåêñòà äî êóðñîðà âñòàâêè — îòðèöàòåëüíîå. Íà ðèñ. 10.9
ïðèâåäåíà ÷àñòü äîêóìåíòà äî ïðèìåíåíèÿ ïðîöåäóðû TransposeParagrahs,
à íà ðèñ. 10.10 — ïîñëå åå ïðèìåíåíèÿ.

Ðèñ. 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
ñîîáùàåò
îá îøèáêàõ
ñèíòàêñèñ

Îøèáêè êîìïèëÿöèè âîçíèêàþò ïðè ïîïûòêå çàïóñòèòü ïîäïðîãðàììó, ñî-


äåðæàùóþ îïåðàòîð, êîòîðûé VBA íå â ñîñòîÿíèè ïðàâèëüíî îòêîìïèëèðî-
âàòü. Åñëè ó VBA âîçíèêàþò êàêèå-ëèáî òðóäíîñòè â ïðîöåññå êîìïèëÿöèè íà-
ïèñàííîãî âàìè êîäà, òî îí âûäàåò ñîîáùåíèå îá îøèáêå è íå ñîçäàåò îòòðàíñ-
ëèðîâàííîãî êîäà. Íàïðèìåð, åñëè â âàøåì ìîäóëå ñîäåðæèòñÿ îïåðàòîð
Option Explicit è èñïîëüçóåòñÿ ïåðåìåííàÿ áåç åå ïðåäâàðèòåëüíîãî îáúÿâ-
ëåíèÿ (ñ ïîìîùüþ îïåðàòîðà Dim), VBA ïåðåìåùàåò êóðñîð âñòàâêè â òî÷êó,
ãäå îáíàðóæåíà ïåðåìåííàÿ, êîòîðóþ çàáûëè îáúÿâèòü, è âûäàåò ñîîáùåíèå îá
îøèáêå êîìïèëÿöèè (ðèñ. 11.2). Çàìåòüòå, ÷òî â îòëè÷èå îò ñèíòàêñè÷åñêîé
îøèáêè ýòà îøèáêà îáíàðóæèâàåòñÿ ïðè ïîïûòêå âûïîëíèòü êîä ïðîöåäóðû.

Ðèñ. 11.2
Ýòà îøèáêà áûëà
îáíàðóæåíà
ïðè ïîïûòêå
âûïîëíèòü êîä
ïðîöåäóðû
Îòëàäêà VB-êîäà. Ïîèñê è óñòðàíåíèå îøèáîê 441

Îøèáêè âðåìåíè èñïîëíåíèÿ èëè runtime-îøèáêè âîçíèêàþò, êîãäà VBA


âñòðå÷àåò âûðàæåíèÿ èëè îïåðàòîðû, êîòîðûå íå óäàåòñÿ âû÷èñëèòü èëè
âûïîëíèòü, íàïðèìåð, ñîäåðæàùèå íåäîïóñòèìûå êîìàíäû, íåäîïóñòèìûå
àðãóìåíòû â ïðîöåäóðàõ è ôóíêöèÿõ, èëè íåäîïóñòèìûå ìàòåìàòè÷åñêèå
îïåðàöèè. Ýòè îøèáêè ïðîÿâëÿþòñÿ â ïðîöåññå âûïîëíåíèÿ ïðîãðàììíîãî
êîäà. Âîò òèïè÷íûå ïðèìåðû, ïðèâîäÿùèå ê ïîÿâëåíèþ runtime-îøèáîê:
¨ âûðàæåíèÿ, â ðåçóëüòàòå êîòîðûõ ïðîèñõîäèò ìàòåìàòè÷åñêîå ïåðåïîë-
íåíèå;
¨ íåñîîòâåòñòâèå òèïîâ ïåðåìåííûõ â âûðàæåíèÿõ ïðèñâàèâàíèÿ èëè â àð-
ãóìåíòàõ ïîäïðîãðàììû;
¨ ïîïûòêà îòêðûòü íåñóùåñòâóþùèå ôàéëû;
¨ ïîïûòêà âûïîëíèòü äåëåíèå íà íîëü.
Íà ðèñ. 11.3 â ñòðîêå êîäà äëÿ âûçîâà ïðîöåäóðû çàïèñè ìàññèâîâ nFirst-
Name, nLastName è nID â ôàéë ñ ïðîèçâîëüíûì äîñòóïîì
Call TestPut(nFirstName, nLastName, , nID)
îêàçàëàñü ëèøíÿÿ çàïÿòàÿ. VBA, êàê «ìîã», ïðîàíàëèçèðîâàë ñòðîêó è «ðå-
øèë», ÷òî ìû õîòåëè âûçâàòü ïðîöåäóðó ñ ïðîïóùåííûì àðãóìåíòîì. Íà ñà-
ìîì äåëå, ðåäàêòîð VBA íå ìîæåò àáñîëþòíî òî÷íî óêàçàòü ïðè÷èíó îøèáêè,
ïîýòîìó íå âñåãäà ìîæíî ïîíÿòü èç äèàãíîñòèêè, êàêàÿ æå îøèáêà ïðîèçîøëà
â äåéñòâèòåëüíîñòè.

Ðèñ. 11.3
Îøèáêà â âûçîâå
ïðîöåäóðû

Êîíå÷íî æå, «êëàññè÷åñêèì» ïðèìåðîì îøèáêè âðåìåíè èñïîëíåíèÿ ÿâëÿ-


åòñÿ ïîïûòêà äåëåíèÿ íà íîëü, ïðè âîçíèêíîâåíèè êîòîðîé âûäàåòñÿ äèàëîãî-
âîå îêíî, ïðåäñòàâëåííîå íà ðèñ. 11.4. Ñëåäóåò îòìåòèòü, ÷òî ïîïûòêà ðàçäå-
ëèòü íà íîëü íåîáÿçàòåëüíî ñâÿçàíà ñ íåâíèìàòåëüíûì äåëåíèåì ÷åãî-ëèáî íà
÷èñëî íîëü. Ýòî ìîæåò ïðîèçîéòè (è ÷àùå âñåãî òàê è áûâàåò) â ðåçóëüòàòå
òîãî, ÷òî íåêîòîðàÿ ïåðåìåííàÿ (èëè âûðàæåíèå), ÿâëÿþùàÿñÿ äåëèòåëåì, íå-
ïîñðåäñòâåííî ïåðåä äåëåíèåì áóäåò îöåíåíà êàê íóëåâîå çíà÷åíèå.
Åñëè âû îïèñàëè ïåðåìåííóþ êàê ÷èñëî è çàáûëè ïðèñâîèòü åå çíà÷åíèå
(êîíå÷íî, îòëè÷íîå îò íóëÿ), âû ìîæåòå îæèäàòü, ÷òî ïðè äåëåíèè
êàêîãî-ëèáî âûðàæåíèÿ íà ýòó ïåðåìåííóþ ìîæåò ïðîèçîéòè îøèáêà îò
äåëåíèÿ íà íîëü. Âû òàêæå ìîãëè è íå çàáûòü ïðèñâîèòü äåëèòåëþ îòëè÷íîå îò
442 Ãëàâà 11

íóëÿ çíà÷åíèå, íî ïðè íàëè÷èè â êîäå ðàçëè÷íûõ âåòâåé âåòâü, ñîäåðæàùàÿ


èíèöèàëèçöèþ íåíóëåâîãî äåëèòåëÿ, ìîãëà íå âûïîëíèòüñÿ.

Ðèñ. 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, ÷òîáû ïðåðâàòü âûïîëíåíèå ïðîãðàììû.

Ïåðåõîä â ðåæèì îñòàíîâà èç îêíà ñîîáùåíèÿ îá îøèáêå


Âñÿêèé ðàç, êîãäà â ïðîöåññå âûïîëíåíèÿ îäíîé èç âàøèõ VBA ïðîöåäóð
èëè ôóíêöèé ïðîèñõîäèò runtime-îøèáêà, ïîÿâëÿåòñÿ äèàëîãîâîå îêíî îøèá-
êè, ïîäîáíîå òîìó, ÷òî ïîêàçàíî íà ðèñ. 11.4 (êîíêðåòíîå ñîîáùåíèå îá îøèá-
êå ìîæåò áûòü äðóãèì, â çàâèñèìîñòè îò òîãî, êàêàÿ èìåííî îøèáêà ïðîèçîø-
ëà). Â äèàëîãîâîì îêíå âûâîäèòñÿ íîìåð îøèáêè è äàåòñÿ êðàòêîå ïîÿñíåíèå
õàðàêòåðà îøèáêè. Êðîìå òîãî, ýòî îêíî èìååò íåñêîëüêî êíîïîê.
 äèàëîãîâîì îêíå, ïîÿâëÿþùåìñÿ ïðè âîçíèêíîâåíèè runtime-îøèáêè,
èìåþòñÿ ñëåäóþùèå êíîïêè:
¨ Continue (Ïðîäîëæèòü) — ïðîäîëæèòü âûïîëíåíèå ïðåðâàííîãî VBA-êî-
äà.  ñëó÷àå âîçíèêíîâåíèÿ runtime-îøèáêè óïðàâëÿþùàÿ êíîïêà
Continue, êàê ïðàâèëî, îòêëþ÷åíà (ñì. ðèñ. 11.4).
Îòëàäêà VB-êîäà. Ïîèñê è óñòðàíåíèå îøèáîê 445

¨ End (Çàâåðøèòü) — çàâåðøèòü âûïîëíåíèå VBA-êîäà è âûéòè èç ðåæèìà


îñòàíîâà.
¨ Debug (Îòëàäêà) — âûâåñòè îïåðàòîð VBA, êîòîðûé ïðèâåë ê âîçíèêíî-
âåíèþ runtime-îøèáêè; â ñëó÷àå íåîáõîäèìîñòè îòêðûâàþòñÿ ñîîòâåòñò-
âóþùèå ïðîåêò è ìîäóëü. VBA îñòàåòñÿ â ðåæèìå îñòàíîâà, ïîçâîëÿÿ ðàç-
ðàáîò÷èêó VBA-ïðèëîæåíèÿ ïðîâåðèòü çíà÷åíèÿ ïåðåìåííûõ, ïðîñëå-
äèòü öåïî÷êó ïîäïðîãðàìì, ïðèâåäøóþ ê ïîäïðîãðàììå, èñïîëíÿåìîé
â äàííûé ìîìåíò, è ðÿä äðóãèõ ïàðàìåòðîâ ñâÿçàííûõ ñ îòëàäêîé. Èñ-
ïîëüçóéòå êíîïêó Debug äëÿ áûñòðîãî ïåðåõîäà ê îïåðàòîðó, âûïîëíåíèå
êîòîðîãî ïðèâåëî ê ïîÿâëåíèþ îøèáêè.
¨ Help (Ñïðàâêà) — âûâåñòè äèàëîãîâîå îêíî ñî ñïðàâî÷íîé èíôîðìàöèåé,
îòíîñÿùåéñÿ ê âîçíèêøåé runtime-îøèáêå.
¨ Äëÿ òîãî ÷òîáû ïåðåéòè â ðåæèì îñòàíîâà èç äèàëîãîâîãî îêíà ñîîáùå-
íèÿ î runtime-îøèáêå, ïðîñòî íàæìèòå íà êíîïêó Debug. Ðåäàêòîð VB îò-
êðîåò Code Window (îêíî êîäà), â êîòîðîì ïîÿâèòñÿ âûäåëåííûé æåëòûì
öâåòîì îïåðàòîð, ïðèâåäøèé ê ïîÿâëåíèþ runtime-îøèáêè.

Òî÷êè îñòàíîâà
Äëÿ òîãî ÷òîáû îáíàðóæèòü ïðè÷èíó ïîÿâëåíèÿ runtime- è ëîãè÷åñêèõ
îøèáîê, â áîëüøèíñòâå ñëó÷àåâ ïðèõîäèòñÿ ïðèáåãàòü ê ïîøàãîâîìó âûïîëíå-
íèþ îïåðàòîðîâ ðàçðàáàòûâàåìîé ïðîãðàììû. Ïîøàãîâûé ïðîõîä ïðîãðàììû,
ïîçâîëÿåò ëèáî òî÷íî óçíàòü, êàêîé îïåðàòîð âûïîëíÿëñÿ â ìîìåíò âîçíèêíî-
âåíèÿ runtime-îøèáêè, ëèáî äàåò âîçìîæíîñòü ïðîêîíòðîëèðîâàòü âûïîëíå-
íèå ãðóïïû îïåðàòîðîâ, â êîððåêòíîñòè èñïîëíåíèÿ êîòîðûõ ðàçðàáîò÷èê ñî-
ìíåâàåòñÿ.
Ïîøàãîâûé ïðîõîä âñåõ îïåðàòîðîâ ïîäïðîãðàììû, à òåì áîëåå ïðîãðàììû
â öåëîì, ìîæåò îêàçàòüñÿ çàíÿòèåì äîâîëüíî óòîìèòåëüíûì è òðåáóþùèì
áîëüøèõ çàòðàò âðåìåíè. Æåëàíèå èëè âîçìîæíîñòü âûïîëíèòü ïîøàãîâûé
ïðîõîä âñåõ îïåðàòîðîâ ïðîãðàììû âîçíèêàåò íå÷àñòî. Ðåäàêòîð VB ïîçâîëÿåò
âûïîëíèòü áîëüøóþ ÷àñòü êîäà ñ ìàêñèìàëüíîé ñêîðîñòüþ, ïåðåõîäÿ â ðåæèì
îñòàíîâà òîëüêî òîãäà, êîãäà ýòî íåîáõîäèìî äëÿ âûïîëíåíèÿ îòäåëüíûõ
îïåðàòîðîâ êîäà. (Ïîìíèòå, ÷òîáû âûïîëíèòü ïîøàãîâûé ïðîõîä êîäà,
íåîáõîäèìî íàõîäèòüñÿ â ðåæèìå îñòàíîâà.)
Òî÷êà îñòàíîâà (breakpoint) — ýòî ñïåöèàëüíî ïîìå÷åííàÿ ñòðîêà ïðîãðàì-
ìû. Êîãäà VBA äîõîäèò äî òî÷êè îñòàíîâà, ïðîèñõîäèò åãî ïåðåêëþ÷åíèå èç
ðåæèìà îáû÷íîãî âûïîëíåíèÿ ïðîãðàììû â ðåæèì îñòàíîâà. Èñïîëüçîâàíèå
òî÷åê îñòàíîâà ïîçâîëÿåò âûïîëíèòü áîëüøóþ ÷àñòü ïðîãðàììû ñ ïîëíîé ñêî-
ðîñòüþ ñ ïåðåõîäîì â ðåæèì îñòàíîâà, òîëüêî êîãäà VBA äîñòèãàåò îïðåäåëåí-
íûõ îïåðàòîðîâ, âûïîëíåíèå êîòîðûõ âû õîòèòå ïðîâåðèòü áîëåå òùàòåëüíî.
Òî÷êà îñòàíîâà «äåéñòâóåò» äî òåõ ïîð, ïîêà âû åå íå óäàëèòå èëè íå çàêðîåòå
ïðîåêò, ñîäåðæàùèé ìîäóëü, â êîòîðîì îíà óñòàíîâëåíà.
Òî÷êó îñòàíîâà ìîæíî ïîìåñòèòü â ëþáîé ñòðîêå èñõîäíîãî êîäà, ñîäåðæà-
ùåé èñïîëíÿåìûé îïåðàòîð. Îáû÷íî òî÷êà îñòàíîâà çàäàåòñÿ ïåðåä îïåðàòî-
ðîì, êîòîðûé, êàê âû çíàåòå (èëè ïðåäïîëàãàåòå), ÿâëÿåòñÿ ïðè÷èíîé âîçíèê-
íîâåíèÿ ïðîáëåì. Äëÿ òîãî ÷òîáû çàäàòü òî÷êó îñòàíîâà, íåîáõîäèìî âûïîë-
íèòü ñëåäóþùèå øàãè:
446 Ãëàâà 11

1. Âûâåäèòå íà ýêðàí VBA ìîäóëü è ïîäïðîãðàììó, ñîäåðæàùèå îïåðàòî-


ðû, äëÿ êîòîðûõ âû õîòèòå çàäàòü ïîøàãîâîå âûïîëíåíèå.
2. Â Code Window (îêíå ïðîãðàììû), ïîìåñòèòå êóðñîð âñòàâêè íà ñòðîêå,
íà÷èíàÿ ñ êîòîðîé íóæíî, ÷òîáû VBA ïåðåêëþ÷èëñÿ èç îáû÷íîãî âûïîë-
íåíèÿ ïðîãðàììû â ðåæèì îñòàíîâà. Ýòà ñòðîêà ñòàíåò íîâîé òî÷êîé îñ-
òàíîâà è äîëæíà ñîäåðæàòü âûïîëíÿåìûé îïåðàòîð VBA.
3. Âûáåðèòå êîìàíäó Debug | Toggle Breakpoint (Îòëàäêà | Òî÷êà îñòàíîâà), ÷òî-
áû âñòàâèòü òî÷êó îñòàíîâà. [Âû òàêæå ìîæåòå íàæàòü êëàâèøó F9 èëè
âîñïîëüçîâàòüñÿ êíîïêîé Toggle Breakpoint (Òî÷êà îñòàíîâà) íà ïàíåëè èí-
ñòðóìåíòîâ Debug (Îòëàäêà) ðåäàêòîðà VB.] VBA âûäåëÿåò âûáðàííóþ
â êà÷åñòâå òî÷êè îñòàíîâà ñòðîêó (òåìíî êðàñíûì öâåòîì), êàê ïîêàçàíî
íà ðèñ. 11.6; à ðÿäîì ñî ñòðîêîé ó ëåâîé ãðàíèöû Code Window ïîÿâëÿåòñÿ
(òåìíî-êðàñíàÿ) òî÷êà.
Ðèñ. 11.6
VBA âûäåëÿåò
âûáðàííóþ
â êà÷åñòâå òî÷êè
îñòàíîâà ñòðîêó,
à ðÿäîì ñî
ñòðîêîé ó ëåâîé
ãðàíèöû îêíà
Code Window
ïîÿâëÿåòñÿ òî÷êà

×òîáû óäàëèòü òî÷êó îñòàíîâà, íåîáõîäèìî ïðîäåëàòü òå æå ñàìûå äåéñò-


âèÿ, ÷òî è äëÿ åå âñòàâêè. Åñëè ïðèìåíèòü êîìàíäó Toggle Breakpoint ê ñòðîêå,
ñîäåðæàùåé òî÷êó îñòàíîâà, VBA óäàëèò ýòó òî÷êó. Äëÿ òîãî ÷òîáû óäàëèòü
âñå òî÷êè îñòàíîâà â ìîäóëå, íåîáõîäèìî âûáðàòü êîìàíäó Debug | Clear All
Breakpoints (Îòëàäêà | Ñíÿòü âñå òî÷êè îñòàíîâà) èëè íàæàòü êëàâèøè
Ctrl+Shift+F9.

Èñïîëüçîâàíèå îïåðàòîðà Stop


Òî÷êè îñòàíîâà, çàäàííûå ïðè ïîìîùè êîìàíäû Toggle Breakpoint, «äåéñòâó-
þò» òîëüêî â òå÷åíèå òåêóùåãî ðàáî÷åãî ñåàíñà. Èíîãäà, îñîáåííî â ñëó÷àå
ñëîæíûõ ïðîãðàìì, îòëàäêà ìîæåò ïîòðåáîâàòü íåñêîëüêèõ ðàáî÷èõ ñåàíñîâ.
Ïîýòîìó âû, âîçìîæíî, çàõîòèòå óñòàíîâèòü «ìíîãîðàçîâûå» òî÷êè îñòàíîâà.
Èìåííî äëÿ ýòîé öåëè öåëåñîîáðàçíî èñïîëüçîâàòü êëþ÷åâîå ñëîâî Stop.
Êîãäà VBA âñòðå÷àåò îïåðàòîð Stop, âûïîëíåíèå ïðîãðàììû ïðèîñòàíàâ-
ëèâàåòñÿ, îòîáðàæàþòñÿ ìîäóëü è ïðîöåäóðà, ñîäåðæàùèå âûïîëíÿåìûé
â äàííûé ìîìåíò îïåðàòîð, è ïðîèñõîäèò ïåðåêëþ÷åíèå â ðåæèì îñòàíîâà.
Ïðè èñïîëüçîâàíèè îïåðàòîðà Stop ñîçäàåòñÿ ïîñòîÿííàÿ òî÷êà îñòàíîâà, òî
åñòü îíà, ôàêòè÷åñêè, ñòàíîâèòñÿ ÷àñòüþ VBA-êîäà. Åäèíñòâåííûé ñïîñîá óäà-
ëèòü òî÷êó îñòàíîâà, ñîçäàííóþ ïðè ïîìîùè îïåðàòîðà Stop, — ýòî óäàëèòü
ñàì îïåðàòîð Stop èç èñõîäíîãî êîäà.
Îòëàäêà VB-êîäà. Ïîèñê è óñòðàíåíèå îøèáîê 447

Êàê ïðàâèëî, îïåðàòîð Stop âñòàâëÿþò â òåêñò ïðîãðàììû â ñëó÷àÿõ, êîãäà


íóæíà ïîñòîÿííàÿ òî÷êà îñòàíîâà. Ïîñëå çàâåðøåíèÿ îòëàäêè ïðîãðàììû íå-
îáõîäèìî îòðåäàêòèðîâàòü òåêñò ïðîãðàììû, óäàëèâ èç íåãî îïåðàòîðû Stop.

Ïåðåõîä â ðåæèì îñòàíîâà ñ ïîìîùüþ êîìàíäû Step Into


Âû óæå çíàåòå, ÷òî ìîæåòå çàïóñòèòü âûïîëíåíèå ïðîöåäóðû
íåïîñðåäñòâåííî èç èñõîäíîãî êîäà, èñïîëüçóÿ êîìàíäó Run | Run Sub/UserForm
èëè ùåëêíóâ (ñ ïîìîùüþ ìûøè) êíîïêó Run Sub/UserForm íà ïàíåëè
èíñòðóìåíòîâ Debug. Ïîäîáíûì æå îáðàçîì ìîæíî çàïóñòèòü íà âûïîëíåíèå
ëþáóþ ïðîöåäóðó â ðåæèìå îñòàíîâà. Ïðîñòî ïîìåñòèòå êóðñîð âñòàâêè âíóòðü
ïðîöåäóðû, êîòîðóþ õîòèòå âûïîëíèòü â ðåæèìå îñòàíîâà, è âûáåðèòå
êîìàíäó Debug | Step Into (Îòëàäêà | Øàã ñ çàõîäîì). (Âû òàêæå ìîæåòå íàæàòü
F8 èëè ùåëêíóòü ìûøüþ ïî ðàñïîëîæåííîé íà ïàíåëè èíñòðóìåíòîâ Debug
êíîïêå êîìàíäû Step Into.) VBA ïåðåéäåò â ðåæèì îñòàíîâà è ïîêàæåò òåêóùèé
èñïîëíÿåìûé îïåðàòîð ïîäïðîãðàììû. Êàê óïîìèíàëîñü âûøå, â ðåæèìå
îñòàíîâà òåêóùèé èñïîëíÿåìûé îïåðàòîð âûäåëÿåòñÿ â Code Window æåëòûì
öâåòîì è ñòðåëêîé ó ëåâîé ãðàíèöû òåêñòà êîäà (êàê ïîêàçàíî íà ðèñ. 11.7).

Ðèñ. 11.7
 ðåæèìå
îñòàíîâà òåêóùèé
èñïîëíÿåìûé
îïåðàòîð
âûäåëÿåòñÿ â Code
Window æåëòûì
öâåòîì è ñòðåëêîé
ó ëåâîé ãðàíèöû
òåêñòà êîäà

Ïåðåõîä â ðåæèì îñòàíîâà ïðåðûâàíèåì èñïîëíåíèÿ êîäà


Êàê âû óæå çíàåòå, VBA ïðåðûâàåò âûïîëíåíèå êîäà, êîãäà ïîëüçîâàòåëü
íàæèìàåò êëàâèøó Esc (èëè êîìáèíàöèþ Ctrl+Break). Êîãäà âû ïðåðûâàåòå
èñïîëíåíèå êîäà, VBA âûäàåò äèàëîãîâîå îêíî îøèáêè ñ ñîîáùåíèåì, ÷òî
âûïîëíåíèå êîäà áûëî ïðåðâàíî, è ïðåäëàãàåò òå æå ñàìûå âîçìîæíîñòè
âûáîðà, ÷òî è äèàëîãîâîå îêíî, ïîÿâëÿþùååñÿ ïðè âîçíèêíîâåíèè
runtime-îøèáêè: Continue, End, Debug è Help. ×òîáû ïåðåéòè ê âûïîëíåíèþ
ïðîãðàììû â ðåæèìå îñòàíîâà, ùåëêíèòå íà êíîïêå Debug. VBA ïåðåéäåò
â ðåæèì îñòàíîâà è óêàæåò îïåðàòîð, âûïîëíÿâøèéñÿ â òîò ìîìåíò, êîãäà âû
ïðåðâàëè ïðîöåäóðó.

Âûõîä èç ðåæèìà îñòàíîâà


×àñòî âîçíèêàåò íåîáõîäèìîñòü «ïðîéòè» ÷àñòü ïðîãðàììû â ïîøàãîâîì ðå-
æèìå, ïîñëå ÷åãî çàâåðøèòü âûïîëíåíèå îñòàâøåéñÿ ÷àñòè â îáû÷íîì ðåæèìå.
448 Ãëàâà 11

Âîçìîæíî, â íåêîòîðûõ ñëó÷àÿõ âû òàêæå çàõîòèòå êàê âûéòè èç ðåæèìà îñ-


òàíîâà, òàê è çàâåðøèòü âûïîëíåíèå ïðîãðàììû, ÷òîáû ïîëó÷èòü âîçìîæ-
íîñòü, âíåñòè èñïðàâëåíèÿ â òåêñò ïðîãðàììû äëÿ óñòðàíåíèÿ âûÿâëåííûõ
â ðåæèìå îñòàíîâà îøèáîê.
Äëÿ òîãî ÷òîáû âûéòè èç ðåæèìà îñòàíîâà è ïðîäîëæèòü âûïîëíåíèå ïðî-
ãðàììû â îáû÷íîì ðåæèìå, âîñïîëüçóéòåñü êîìàíäîé Run | Continue (Çàïóñê |
Ïðîäîëæèòü). VBA âûéäåò èç ðåæèìà îñòàíîâà è ïðîäîëæèò âûïîëíåíèå ïðî-
ãðàììû äî òåõ ïîð, ïîêà íå ïðîèçîéäåò åå íîðìàëüíîå çàâåðøåíèå. Åñëè VBA
âñòðåòèòñÿ ñ òî÷êîé îñòàíîâà èëè îïåðàòîðîì Stop, ïðåæäå ÷åì äîñòèãíåò êîí-
öà ïðîãðàììû, òî ïðîèçîéäåò ïåðåõîä â ðåæèì îñòàíîâà. (Âûéòè èç ðåæèìà îñ-
òàíîâà è ïðîäîëæèòü âûïîëíåíèå ïðîãðàììû, ìîæíî òàêæå íàæàòèåì F5 èëè
ùåë÷êîì ìûøè ïî êíîïêå Continue íà ïàíåëè èíñòðóìåíòîâ Debug.)
Äëÿ òîãî ÷òîáû âûéòè èç ðåæèìà îñòàíîâà è îäíîâðåìåííî çàâåðøèòü âû-
ïîëíåíèå âñåõ ïðîãðàìì, âûáåðèòå êîìàíäó Run | Reset (Çàïóñê | Ñáðîñ). VBA
âûéäåò èç ðåæèìà îñòàíîâà è ïðåðâåò äàëüíåéøåå âûïîëíåíèå ïðîãðàììû, âñå
ïåðåìåííûå ïîòåðÿþò ñâîè çíà÷åíèÿ, à âñå ïðîöåäóðû áóäóò óäàëåíû èç ïàìÿ-
òè. (Âû ìîæåòå òàêæå âûéòè èç ðåæèìà îñòàíîâà è çàâåðøèòü âûïîëíåíèå
ïðîãðàììû, ùåëêíóâ ìûøüþ ïî êíîïêå Reset íà ïàíåëè Debug.)

Èñïîëüçîâàíèå êîìàíäû Step Into


Òåïåðü, âû çíàåòå, êàê ïåðåéòè â ðåæèì îñòàíîâà è êàê èç íåãî âûéòè,
ïîýòîìó ìîæíî ïðèñòóïèòü ê èçó÷åíèþ èñïîëüçîâàíèÿ êîìàíäû Step Into (øàã
ñ çàõîäîì) äëÿ ïîøàãîâîãî âûïîëíåíèÿ ïðîãðàììû â ðåæèìå îñòàíîâà.
Ïîøàãîâîå âûïîëíåíèå îïåðàòîðîâ ïîçâîëÿåò â ïðîöåññå îòëàäêè ïðîñëåäèòü
çà èñïîëíåíèåì îòäåëüíûõ ïðîöåäóð, ôóíêöèé èëè ïðîãðàììû â öåëîì. Ïðè
ïîøàãîâîì ïðîõîäå èñõîäíîãî êîäà ñ èñïîëüçîâàíèåì êîìàíäû Step Into VBA
âõîäèò â òåëî êàæäîé âûçûâàåìîé ïðîöåäóðû èëè ôóíêöèè, äàâàÿ
âîçìîæíîñòü âûïîëíèòü â ïîøàãîâîì ðåæèìå è èõ îïåðàòîðû òîæå.
Ïîøàãîâîå âûïîëíåíèå ïðîãðàììû ñ èñïîëüçîâàíèåì êîìàíäû Step Into
ïîçâîëÿåò ïðîñëåäèòü çà âûïîëíåíèåì âñåõ îïåðàòîðîâ ãëàâíîé ïðîöåäóðû
è âñåõ îïåðàòîðîâ êàæäîé ôóíêöèè èëè ïðîöåäóðû, âûçûâàåìûõ èç îñíîâíîé
ïðîãðàììû.
 Code Window îïåðàòîðû, êîòîðûå áóäóò âûïîëíÿòüñÿ ñëåäóþùèìè, âûäå-
ëåíû æåëòûì öâåòîì. Åñëè êîä íå òàêîé ïðîñòîé, êàê â ïðîöåäóðå
TestTestPut, è èìååò óñëîâíûå îïåðàòîðû èëè îïåðàòîðû öèêëîâ, òî ïîøàãî-
âûé ïðîõîä ïðîãðàììû, âûïîëíÿåìûé òàêèì îáðàçîì, ìîæåò â íåêîòîðûõ ñëó-
÷àÿõ ïîìî÷ü ïîíÿòü, êàê ðàáîòàþò èñïîëüçóåìûå ðàçðàáîò÷èêîì ïðèëîæåíèÿ
ïðîãðàììíûå ñòðóêòóðû. Ïåðåä âûïîëíåíèåì ñëåäóþùåé êîìàíäû ìîæíî, ïî-
ìåùàÿ êóðñîð âñòàâêè íà ïåðåìåííûå èëè âûðàæåíèÿ, â îêíå ToolTip ïðîñìîò-
ðåòü çíà÷åíèå ïåðåìåííîé èëè âûðàæåíèÿ.
Ðåæèì ïîäñêàçêè çíà÷åíèé äàííûõ (ïîçâîëÿþùèé ïðîñìàòðèâàòü çíà÷å-
íèÿ âûðàæåíèé â îêíå òèïà ToolTip) ïî óìîë÷àíèþ âêëþ÷åí. Åñëè ïî êàêèì-òî
ïðè÷èíàì íà âàøåì êîìïüþòåðå ïîäñêàçêè íå ðàáîòàþò, âûáåðèòå êîìàíäó
Tools | Options è íà âêëàäêå Editor îêíà Options âûáåðèòå ôëàæîê Auto Data Tips.
Îòëàäêà VB-êîäà. Ïîèñê è óñòðàíåíèå îøèáîê 449

Íàáëþäåíèå çà çíà÷åíèÿìè âûðàæåíèé


Åñëè â ïðîöåññå ïîøàãîâîãî âûïîëíåíèÿ îïåðàòîðîâ êîäà âàñ èíòåðåñóåò íå
òîëüêî ïîñëåäîâàòåëüíîñòü âûïîëíåíèÿ îïåðàòîðîâ, íî è èçìåíåíèå çíà÷åíèé
ïåðåìåííûõ, òî âàñ âðÿä ëè óäîâëåòâîðèò âîçìîæíîñòü ïðîñìàòðèâàòü çíà÷å-
íèÿ ïåðåìåííûõ (è äàæå âûðàæåíèé) â îêíå ToolTip. Ðåäàêòîð VB èìååò îêíî
Watches, â êîòîðîì ìîæíî ïðîñìàòðèâàòü çíà÷åíèÿ âûðàæåíèé ïî ìåðå ïîøà-
ãîâîãî âûïîëíåíèÿ êîäà. Íàïðèìåð, íà ðèñ. 11.8 ïðèâåäåíî îêíî Watches, â êî-
òîðîì îòîáðàæàåòñÿ çíà÷åíèå ïåðåìåííîé nFirstName(0) ïðîöåäóðû TestTest-
Put ìîäóëÿ Module1.
Ðèñ. 11.8
 ðåæèìå ïîøàãîâîãî
âûïîëíåíèÿ êîäà
â Watch Window ìîæíî
íàáëþäàòü çà

Äëÿ ïðîñìîòðà çíà÷åíèé âûðàæåíèé (ïåðåìåííûõ) ïðîöåäóðû íåîáõîäèìî


çàíåñòè (äîáàâèòü) ýòè âûðàæåíèÿ â îêíî Watches. Ýòî ìîæíî âûïîëíèòü äâóìÿ
ñïîñîáàìè, ïðåäâàðèòåëüíî âûäåëèâ âûðàæåíèå (äëÿ ïåðåìåííîé ìîæíî ïðî-
ñòî ïîìåñòèòü íà íåé êóðñîð âñòàâêè):
¨ Èç êîíòåêñòíîãî ìåíþ (ïðàâîé êíîïêè ìûøè) âûáðàòü îïöèþ Add Watch.
¨ Èç ìåíþ Debug âûáðàòü îïöèþ Add Watch.
 ëþáîì ñëó÷àå íà ýêðàíå ïîÿâëÿåòñÿ äèàëîãîâîå îêíî (ðèñ. 11.9) Add Watch,
â êîòîðîì â ñàìîì ïðîñòîì ñëó÷àå ìîæíî ïðîñòî ùåëêíóòü íà êíîïêå OK, ïîñëå
÷åãî â îêíå Watches (åñëè ðàíåå åãî íå áûëî íà ýêðàíå, òî îíî âûâîäèòñÿ) ïîÿâëÿ-
åòñÿ ñòðîêà, ñîäåðæèìîå êîòîðîé ñîîòâåòñòâóåò ñîäåðæèìîìó îêíà Add Watch
(ðèñ. 11.10): ñîâïàäàþò ïîëÿ Expression è Context. Â ïîëå Value îêíà Watches ëèáî
îòîáðàæàåòñÿ çíà÷åíèå âûðàæåíèÿ, ëèáî óêàçûâàåòñÿ, ÷òî âûðàæåíèå íàõîäèò-
ñÿ «âíå êîíòåêñòà» (<Out of context>), ëèáî (äëÿ ìàññèâîâ) âûâîäèòñÿ ñîîáùå-
íèå î òîì, ÷òî «èíäåêñ âûõîäèò çà ïðåäåëû äîïóñòèìîãî äèàïàçîíà» (<subscript
out of range>).

Ðèñ. 11.9
Äèàëîãîâîå îêíî Add Watch, â êîòîðîì
â ñàìîì ïðîñòîì ñëó÷àå ìîæíî ïðîñòî
ùåëêíóòü íà êíîïêå OK

Âåðíåìñÿ ê îêíó Add Watch. Êàê óæå ìîæíî ïîíÿòü, â ñåêöèè Expression óêà-
çûâàåòñÿ âûðàæåíèå (ïåðåìåííàÿ), â ñåêöèè Context — íàèìåíîâàíèå ïðîöåäó-
ðû è ìîäóëÿ, ãäå íàõîäèòñÿ âûðàæåíèå. Åñëè ïåðåä âûçîâîì îêíà Add Watch äî-
450 Ãëàâà 11

áàâëÿåìîå âûðàæåíèå óæå óêàçàíî (âûäåëåíî), òî â ñåêöèè Context íè÷åãî èç-


ìåíÿòü íå íóæíî. Åñëè â ìîìåíò âûâîäà äèàëîãîâîãî îêíà Add Watch êóðñîð
âñòàâêè íå óêàçûâàë íè íà êàêóþ ïåðåìåííóþ, òî â òåêñòîâîì îêíå Expression
íåîáõîäèìî áóäåò ââåñòè âûðàæåíèå (ïåðåìåííóþ).  ëþáîì ñëó÷àå îêíà êîì-
áèíèðîâàííûõ ñïèñêîâ Procedure è Module â ñåêöèè Context áóäóò ñîäåðæàòü
èìåíà òåêóùèõ ïðîöåäóðû è ìîäóëÿ, íà êîäå êîòîðûõ íàõîäèòñÿ êóðñîð âñòàâ-
êè. Êîíå÷íî, ìîæíî âîñïîëüçîâàòüñÿ ýòèìè ñïèñêàìè äëÿ âûáîðà äðóãèõ äîñ-
òóïíûõ ìîäóëåé è ïðîöåäóð.

Ðèñ. 11.10
 ðåæèìå ïîøàãîâîãî
âûïîëíåíèÿ êîäà
â îêíå Watch
ìîæíî íàáëþäàòü
çà èçìåíåíèåì çíà÷åíèé
âûðàæåíèé (ïåðåìåííûõ)

Ñåêöèÿ Watch Type îêíà Add Watch ïðåäîñòàâëÿåò äîïîëíèòåëüíûå âîçìîæíî-


ñòè äëÿ îòëàäêè. Ïðè ïîìîùè ïåðåêëþ÷àòåëÿ Break When Value Is True (îñòàíîâ,
åñëè çíà÷åíèå âûðàæåíèÿ èñòèííî) ýòîé ñåêöèè ìîæíî èñïîëüçîâàòü îêíî Add
Watch íå â ïîøàãîâîì ðåæèìå âûïîëíåíèÿ êîäà, à â îáû÷íîì. Äëÿ ïîäîáíîé æå
öåëè ìîæíî èñïîëüçîâàòü è ïåðåêëþ÷àòåëü Break When Value Changes (îñòàíîâ
ïðè èçìåíåíèè çíà÷åíèÿ âûðàæåíèÿ). Êàê óæå äîëæíî áûòü ïîíÿòíî, ðåæè-
ìîì âûïîëíåíèÿ êîäà â ýòèõ ñëó÷àÿõ ìîæåò áûòü îáû÷íûé ðåæèì. Ïðè ñîîò-
âåòñòâóþùèõ èçìåíåíèÿõ óêàçàííûõ âûðàæåíèé ïðîèçîéäåò ïåðåõîä â ðåæèì
îñòàíîâà.
Òàêèì îáðàçîì, åñëè çàäàòü â îêíå èíòåðåñóþùèå ðàçðàáîò÷èêà âûðàæå-
íèÿ, ìîæíî ïîïåðåìåííî çàäàâàÿ òî ïîøàãîâûé, òî îáû÷íûé ðåæèì âûïîëíå-
íèÿ ïðèëîæåíèÿ, ïðîñìàòðèâàòü èçìåíåíèÿ çíà÷åíèé âûðàæåíèé.
Íà ðèñ. 11.11 ïîêàçàíû Code Window è îêíî Watches ïðè ïîøàãîâîì âûïîëíå-
íèè êîäà ïðèâåäåííîãî íèæå ëèñòèíãà. Íàáëþäàåìûìè ïåðåìåííûìè ÿâëÿþò-
ñÿ äâà ìàññèâà: nFirstName è nID. Îáà ìàññèâà óæå ïîëó÷èëè çíà÷åíèÿ äëÿ
ïåðâûõ ýëåìåíòîâ, íî nFirstName ïîëó÷èë òàêæå çíà÷åíèå äëÿ âòîðîãî ýëå-
ìåíòà, à nID — íåò.

Ëèñòèíã 11.1. Êîä äëÿ èçó÷åíèÿ ðàáîòû ñ îêíîì Watches


1: Option Explicit
2: Type Record ' Îïðåäåëåííûé ïîëüçîâàòåëåì òèï
3: ID As Integer
4: FirstName As String * 20
5: LastName As String * 20
6: End Type
7:
8: Sub TestPut(mFirstName, mLastName, mID)
9: 'Òåñòèðîâàíèå Put
10: Dim MyRecord As Record, RecordNumber, i
11: Kill "TESTFILE"
12: Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
13: RecordNumber = UBound(mFirstName)
14: For i = 0 To RecordNumber - 1
15: MyRecord.FirstName = mFirstName(i)
16: MyRecord.LastName = mLastName(i)
17: MyRecord.ID = mID(i)
Îòëàäêà VB-êîäà. Ïîèñê è óñòðàíåíèå îøèáîê 451

18: Put #1, i + 1, MyRecord


19: Next
20: Close #1
21: End Sub
22: Sub TestTestPut()
23: Dim nFirstName(2), nLastName(2), nID(2)
24: nFirstName(0) = "Ïåòð"
25: nLastName(0) = "Ïåòðîâ"
26: nID(0) = 333
27: nFirstName(1) = "Ñèäîð"
28: nLastName(1) = "Ñèäîðîâ"
29: nID(1) = 222
30: Call TestPut(nFirstName, nLastName, nID)
31: End Sub

Ðèñ. 11.11
Îêíî Code è Watches
ïðè ïîøàãîâîì
âûïîëíåíèè êîäà
ïðèâåäåííîãî íèæå
ëèñòèíãà

Ðåäàêòèðîâàíèå íàáëþäàåìîãî âûðàæåíèÿ


Íàáëþäàåìûå â îêíå Watches âûðàæåíèÿ ìîæíî ðåäàêòèðîâàòü ïîñëå òîãî,
êàê îíè óæå äîáàâëåíû â ýòî îêíî. ×òîáû îòðåäàêòèðîâàòü êîíòðîëüíîå âûðà-
æåíèå, ìîæíî âûïîëíèòü ñëåäóþùåå:
1. Â îêíå Watches âûäåëèòå âûðàæåíèå, êîòîðîå õîòèòå îòðåäàêòèðîâàòü.
2. Âûáåðèòå êîìàíäó Debug | Edit Watch (Îòëàäêà | Èçìåíèòü êîíòðîëüíîå çíà-
÷åíèå). Ýòà êîìàíäà àêòèâèçèðóåò äèàëîãîâîå îêíî Edit Watch, êîòîðîå îò-
ëè÷àåòñÿ îò îêíà Add Watch òîëüêî çàãîëîâêîì è äîïîëíèòåëüíîé êíîï-
êîé Delete (Óäàëèòü).
3. Âûïîëíèòå íåîáõîäèìûå èñïðàâëåíèÿ â âûðàæåíèè, à òàêæå, åñëè
íåîáõîäèìî, âíåñèòå èçìåíåíèÿ â ðàçäåëû Context è Watch Type. Çàìåòüòå,
÷òî âûðàæåíèå äëÿ êîíòðîëÿ ìîæåò âîîáùå íå âñòðå÷àòüñÿ
â îòëàæèâàåìîì êîäå. Âàæíî òîëüêî, ÷òîáû îíî ñîäåðæàëî âûðàæåíèÿ,
âõîäÿùèå â êîä. Íàïðèìåð, âû ìîæåòå îñòàíîâèòü âûïîëíåíèå öèêëà çà
íåñêîëüêî èòåðàöèé äî óêàçàííîé â êà÷åñòâå ïîñëåäíåé èëè íàáëþäàòü
èçìåíåíèå íå ñàìîé ïåðåìåííîé íåêîòîðîé ïðîãðàììû, à ðåçóëüòàò,
íàïðìåð, åå äåëåíèÿ ïî ìîäóëþ íà êàêîå-ëèáî ÷èñëî.
452 Ãëàâà 11

4. Ùåëêíóâ êíîïêó OK, çàêðîéòå äèàëîãîâîå îêíî Edit Watch. VBA âíåñåò
â îêíî Watches ñîîòâåòñòâóþùèå èñïðàâëåíèÿ.

Ðèñ. 11.12
Îêíî Edit Watch îòëè÷àåòñÿ îò îêíà Add
Watch òîëüêî çàãîëîâêîì
è äîïîëíèòåëüíîé êíîïêîé Delete

Óäàëåíèå íàáëþäàåìîãî âûðàæåíèÿ


Ïî ìåðå ðàáîòû ñ íàáëþäàåìûìè ïåðåìåííûìè è âûðàæåíèÿìè âû ìîæåòå
îáíàðóæèòü, ÷òî ñïèñîê â îêíå Watches èìååò òåíäåíöèþ ðàçðàñòàòüñÿ, è â êà-
êîé-òî ìîìåíò ïîéìåòå, ÷òî çíà÷åíèÿ äàëåêî íå âñåõ íàõîäÿùèõñÿ â íåì âûðà-
æåíèé, äåéñòâèòåëüíî, íåîáõîäèìî êîíòðîëèðîâàòü. Ïîýòîìó âàì ìîæåò ïîíà-
äîáèòüñÿ óäàëèòü èõ èç îêíà Watches. Óäàëèòü êîíòðîëüíîå âûðàæåíèå ìîæíî
îäíèì èç äâóõ ñïîñîáîâ:
1. Âûäåëèòå âûðàæåíèå, êîòîðîå õîòèòå óäàëèòü èç îêíà Watches, è íàæìè-
òå êëàâèøó Del. VBA óäàëèò âûäåëåííîå âûðàæåíèå èç îêíà áåç ïðåäó-
ïðåæäåíèÿ.
2. Âûäåëèòå âûðàæåíèå, êîòîðîå õîòèòå óäàëèòü, çàòåì âûáåðèòå êîìàíäó
Debug | Edit Watch. Â ïîÿâèâøåìñÿ îêíå Edit Watch ùåëêíèòå êíîïêó Delete.
VBA óäàëèò âûäåëåííîå âûðàæåíèå èç îêíà Watches.

Èñïîëüçîâàíèå êîìàíäû Step Over


Åñëè êîä âàøåãî ïðèëîæåíèÿ ñîñòîèò èç áîëüøîãî êîëè÷åñòâà ïðîöåäóð,
à ïðåäïîëàãàåìûé õàðàêòåð îøèáêè — íåïðàâèëüíûé àëãîðèòì âûçîâà ýòèõ
ïðîöåäóð, òî ïîøàãîâîå âûïîëíåíèå êàæäîé âûçûâàåìîé ïðîöåäóðû ìîæåò
îêàçàòüñÿ äîñòàòî÷íî óòîìèòåëüíûì. Âî âñÿêîì ñëó÷àå, íåò íåîáõîäèìîñòè
âûïîëíÿòü ïî øàãàì êîä ïðîöåäóðû, â êîòîðîé âû àáñîëþòíî óâåðåíû (õîòÿ,
êîíå÷íî, ïðîãðàììèñò äîëæåí áûòü àáñîëþòíî óâåðåí òîëüêî â òîì, ÷òî â ëþ-
áîé ïðîöåäóðå â ëþáîé ìîìåíò âðåìåíè ñîäåðæèòñÿ, ïî êðàéíåé ìåðå, îäíà
îøèáêà). Íî äàæå, åñëè âû «ïðàâèëüíî» íå óâåðåíû âî âñåõ ïðîöåäóðàõ, íà êà-
êîì-òî ýòàïå ðàçðàáîòêè ïðèëîæåíèÿ ìíîãèå ïðîöåäóðû âûïîëíÿþò òî, ÷òî îò
íèõ òðåáóåòñÿ, è èõ ïîøàãîâîå âûïîëíåíèå èìååò ìàëî ñìûñëà.
Îòëàä÷èê VBA ïðåäîñòàâëÿåò â äîïîëíåíèå ê êîìàíäå Step Into (øàã ñ çàõî-
äîì) êîìàíäó Step Over (øàã ñ îáõîäîì). Ïðè èñïîëüçîâàíèè êîìàíäû îòëàäêè
Step Over, åñëè âñòðå÷àåòñÿ îïåðàòîð, âûçûâàþùèé ïðîöåäóðó èëè îïðåäåëåí-
Îòëàäêà VB-êîäà. Ïîèñê è óñòðàíåíèå îøèáîê 453

íóþ ïîëüçîâàòåëåì ôóíêöèþ, VBA íå ïåðåõîäèò ê ïîøàãîâîìó âûïîëíåíèþ


êîäà âûçâàííîé ïîäïðîãðàììû. Âìåñòî ýòîãî îí âûïîëíÿåò êîä âûçâàííîé
ïîäïðîãðàììû ñ îáû÷íîé ñêîðîñòüþ è ïðîäîëæàåò ïîøàãîâîå âûïîëíåíèå
ñ ïåðâîãî îïåðàòîðà, ñëåäóþùåãî çà âûçîâîì ïîäïðîãðàììû.
Åñëè âû óâåðåíû â íîðìàëüíîé ðàáîòå ïðîöåäóð, âûçûâàåìûõ èç íåêîòîðîé
óïðàâëÿþùåé ïðîöåäóðû, âîçìîæíîñòü èçáåæàòü ïîøàãîâîãî âûïîëíåíèÿ
ïîäïðîãðàìì ïîìîãàåò ñîñðåäîòî÷èòüñÿ íà îòëàäêå îïåðàòîðîâ òåêóùåé ïðîöå-
äóðû. Êðîìå òîãî, çà ñ÷åò îòêàçà îò ïîøàãîâîãî âûïîëíåíèÿ òàì, ãäå â ýòîì íåò
íåîáõîäèìîñòè, ìîæíî ñýêîíîìèòü çàòðà÷èâàåìîå íà îòëàäêó âðåìÿ.

Èñïîëüçîâàíèå îêíà Locals


Îêíî Locals (ëîêàëüíûå ïåðåìåííûå), õîòÿ è íå ñâÿçàíî ñ îêíîì Watches, íî
âûïîëíÿåò ïîõîæóþ ôóíêöèþ (ïî óìîë÷àíèþ íå ïîÿâëÿåòñÿ íà ýêðàíå è âû-
çûâàåòñÿ êîìàíäîé View | Locals Window). Îíî âûâîäèò âñå ëîêàëüíûå (èëè íàõî-
äÿùèåñÿ â àêòèâíîé îáëàñòè âèäèìîñòè) ïåðåìåííûå âûïîëíÿåìîé â äàííûé
ìîìåíò ïðîöåäóðû èëè ôóíêöèè. Íà ðèñ. 11.14, íàïðèìåð, ïîêàçàíû çíà÷åíèÿ
ëîêàëüíûõ ïåðåìåííûõ ïðîöåäóðû TestTestPut ïðèâåäåííîãî ðàíåå ëèñòèíãà.
Îêíî Locals ñîäåðæèò òðè êîëîíêè: Expression (Âûðàæåíèå) (èìÿ ïåðåìåííîé
èëè îáúåêòà), Value (Çíà÷åíèå) (òåêóùåå çíà÷åíèå ïåðåìåííîé èëè ñâîéñòâî
îáúåêòà) è Type (Òèï) (òèï äàííûõ èëè îáúåêòà). Îáðàòèòå âíèìàíèå íà ïðÿìî-
óãîëüíèêè ñëåâà îò ýëåìåíòîâ mFirstName, mLastName è mID â îêíå Locals íà
ðèñ. 11.13. Îíè àíàëîãè÷íû ïðÿìîóãîëüíèêàì â äðóãèõ ðàñêðûâàþùèõñÿ äðå-
âîâèäíûõ ñïèñêàõ îïåðàöèîííîé ñèñòåìû Windows. Åñëè â ïðÿìîóãîëüíèêå
ñîäåðæèòñÿ çíàê «ïëþñ», ýòî îçíà÷àåò, ÷òî, ùåëêíóâ ïî íåìó ìûøüþ, ìîæíî
îòêðûòü äðåâîâèäíóþ äèàãðàììó ñî ñâîéñòâàìè è çíà÷åíèÿìè îáúåêòà. Çíà-
÷îê «ìèíóñ» ïîêàçûâàåò, ÷òî äèàãðàììà óæå ðàñêðûòà è, ùåëêíóâ ïî íåìó,
âû ìîæåòå åå ñâåðíóòü. Åñëè ùåëêíóòü ïî çíà÷êó «ïëþñ» ñëåâà îò ýëåìåíòà
mFirstName, ïîÿâèòñÿ ñïèñîê âñåõ ýëåìåíòîâ ìàññèâà è çíà÷åíèÿ, êîòîðûå êà-
æäûé èç íèõ èìååò â íàñòîÿùèé ìîìåíò. Îêíî Locals óäîáíî èñïîëüçîâàòü äëÿ
íàáëþäåíèÿ çà òåêóùèìè çíà÷åíèÿìè è ñòðóêòóðîé ïåðåìåííûõ è îáúåêòîâ
âûïîëíÿåìîé â äàííûé ìîìåíò ïðîöåäóðû, ôóíêöèè èëè ìîäóëÿ.

Òðàññèðîâêà âûçîâîâ ïðîöåäóð


Ïðè îòëàäêå ïðîãðàìì äîâîëüíî ÷àñòî âîçíèêàåò íåîáõîäèìîñòü îïðåäåëèòü
òî÷íóþ öåïî÷êó èëè ïîñëåäîâàòåëüíîñòü ïðîöåäóð, ïðèâåäøóþ ê âûïîëíåíèþ
êîíêðåòíîãî îïåðàòîðà, êîòîðûé ïîðîæäàåò îøèáêè. Çíàíèå öåïî÷êè âûçîâîâ
ïðîöåäóð ìîæåò îêàçàòüñÿ ïîëåçíûì, ïîñêîëüêó ÷àñòî èãðàåò âàæíóþ ðîëü â îï-
ðåäåëåíèè ïðè÷èíû îøèáêè. Íàïðèìåð, âû ìîæåòå îáíàðóæèòü îïåðàòîð, ïðèâî-
äÿùèé ê îøèáêå äåëåíèÿ íà íîëü, íî íå çíàåòå, ïî÷åìó îäíà èç ïåðåìåííûõ
â îïåðàòîðå ñîäåðæèò íîëü. Çíàíèå òî÷íîé öåïî÷êè âûçîâîâ ïðîöåäóð ïîìîæåò
âàì îïðåäåëèòü, ÷òî ïðîöåäóðà áûëà âûçâàíà, íàïðèìåð, ñ ïðîïóùåííûì íåîáÿ-
çàòåëüíûì ïàðàìåòðîì èëè ïðîñòî ñ íåâåðíûì çíà÷åíèåì òðåáóåìîãî àðãóìåíòà.
VBA ïîçâîëÿåò ïðîñìàòðèâàòü öåïî÷êó âûçîâîâ ïðîöåäóð ïîñðåäñòâîì äèà-
ëîãîâîãî îêíà Call Stack (Ñòåê âûçîâà). ×òîáû âûâåñòè îêíî Call Stack íà ýêðàí
454 Ãëàâà 11

(â ðåæèìå îñòàíîâà), ëèáî âûáåðèòå êîìàíäó 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, ìîæíî
ïðîéòè â îáðàòíîì íàïðàâëåíèè âäîëü âñåé öåïî÷êè âûçîâîâ ïîäïðîãðàìì.

Èñïîëüçîâàíèå îêíà Immediate


Èíîãäà äàæå ñî÷åòàíèÿ ïîøàãîâîãî âûïîëíåíèÿ ïðîãðàììû
ñ èñïîëüçîâàíèåì íàáëþäàåìûõ ïåðåìåííûõ è òðàññèðîâêè âûçîâîâ
ïîäïðîãðàìì áûâàåò íåäîñòàòî÷íî, ÷òîáû íàéòè ñîäåðæàùóþñÿ â ïðîãðàììå
îøèáêó. Â ðåäàêòîðå VB ïðåäóñìîòðåíî åùå îäíî ñðåäñòâî äëÿ íàõîæäåíèÿ
îøèáîê â âàøåé ïðîãðàììå — îêíî Immediate (Ïðîâåðêà) ðåäàêòîðà VB
ÿâëÿåòñÿ ðåäàêòîðîì ñâîáîäíîãî ôîðìàòà, ïîçâîëÿþùèì êîíòðîëèðîâàòü
Îòëàäêà VB-êîäà. Ïîèñê è óñòðàíåíèå îøèáîê 455

çíà÷åíèÿ ïåðåìåííûõ è âûðàæåíèé, ïðîèçâîäèòü âû÷èñëåíèÿ, èçìåíÿòü


çíà÷åíèÿ ïåðåìåííûõ è ïðîâåðÿòü ðåçóëüòàòû âûïîëíåíèÿ ôóíêöèé. Âñå ýòè
ôóíêöèè ïîääåðæèâàþòñÿ, êîãäà ïðîãðàììà íàõîäèòñÿ â ðåæèìå îñòàíîâà.
Äëÿ òîãî ÷òîáû âîñïîëüçîâàòüñÿ îêíîì Immediate, âûáåðèòå View | Immediate Win-
dow èëè ââåäèòå ñ êëàâèàòóðû êîìáèíàöèþ Ctrl+G, èëè ùåëêíèòå íà êíîïêå
Immediate Window íà ïàíåëè èíñòðóìåíòîâ Debug. VBA âûâåäåò äèàëîãîâîå îêíî
Immediate.

Ðèñ. 11.14
Îêíî Call Stack è êîä,
ïîñðåäñòâîì êîòîðîãî
ìîæíî ïîëó÷èòü òàêîå îêíî

×òîáû âûâåñòè â îêíå Immediate èíòåðåñóþùóþ âàñ èíôîðìàöèþ, èñïîëü-


çóéòå îïåðàòîð Print (èëè ?). Îïåðàòîð Print ââîäèòñÿ â îêíå Immediate âìå-
ñòå ñî ñïèñêîì ïåðåìåííûõ èëè âûðàæåíèé. Äîñòàòî÷íî íàáðàòü êîìàíäó
Print, ïåðå÷èñëèòü èíòåðåñóþùèå âàñ ïåðåìåííûå è âûðàæåíèÿ, à çàòåì íà-
æàòü êëàâèøó Enter. VBA âû÷èñëèò çíà÷åíèÿ ïåðåìåííûõ, ïåðå÷èñëåííûõ ïî-
ñëå êîìàíäû Print, è âûâåäåò ðåçóëüòàòû â ñòðîêå ñëåäóþùåé çà êîìàíäîé
Print. Íà ðèñ. 11.15 ïîêàçàí ïðèìåð ðàáîòû â îêíå Immediate.

Îïåðàòîð Debug.Print
Îáúåêò VBA Debug èìååò ìåòîä Print, ïîçâîëÿþùèé âûâåñòè èíôîðìàöèþ
â îêíî Immediate â ïðîöåññå âûïîëíåíèÿ ïðîãðàììû. Äëÿ ýòîãî íåîáõîäèìî äî-
áàâèòü â ïðîãðàììó VBA îïåðàòîðû, âûçûâàþùèå ìåòîä Debug.Print.
Ìåòîä Debug.Print èñïîëüçóåòñÿ, êàê ïðàâèëî, â ñî÷åòàíèè ñ óæå èçó÷åí-
íûì â ýòîé ãëàâå îïåðàòîðîì Stop. Ñî÷åòàíèå ýòèõ äâóõ ýëåìåíòîâ ïîçâîëÿåò
âûïîëíÿòü ïðîãðàììû â îáû÷íîì (íåîòëàäî÷íîì) ðåæèìå, ïîëó÷àÿ ïðè ýòîì
îòëàäî÷íóþ èíôîðìàöèþ àíàëîãè÷íóþ òîé, êîòîðóþ äàåò èñïîëüçîâàíèå íà-
456 Ãëàâà 11

áëþäàåìûõ ïåðåìåííûõ èëè âûðàæåíèé. Êàê ïðàâèëî, áûâàåò íåîáõîäèìî


äîáàâèòü îäèí èëè íåñêîëüêî îïåðàòîðîâ, âûçûâàþùèõ ìåòîä Debug.Print,
âûâîäÿùèõ çíà÷åíèÿ îïðåäåëåííûõ ïåðåìåííûõ èëè âûðàæåíèé â îêíî
Immediate. Õîòÿ, ïðè âûïîëíåíèè ïðîãðàììû â íîðìàëüíîì ðåæèìå îêíî
Immediate íåâèäèìî, êàê òîëüêî VBA âñòðåòèò îïåðàòîð Stop è ïåðåêëþ÷èòñÿ
â ðåæèì îñòàíîâà, îíî ñðàçó ñòàíåò äîñòóïíûì è ïîçâîëèò âàì ïðîñìîòðåòü
âñþ èíôîðìàöèþ, âûâåäåííóþ âêëþ÷åííûìè â ïðîãðàììó îïåðàòîðàìè
Debug.Print. Èñïîëüçóÿ ýòîò òåõíè÷åñêèé ïðèåì, ìîæíî ñýêîíîìèòü ìàññó
îòëàäî÷íîãî âðåìåíè çà ñ÷åò îòêàçà îò ïîøàãîâîãî âûïîëíåíèÿ êîäà. Ïðîñìîò-
ðåâ èíôîðìàöèþ, ñîäåðæàùóþñÿ â îêíå Immediate, âû ìîæåòå âîçîáíîâèòü âû-
ïîëíåíèå ïðîãðàììû â îáû÷íîì ðåæèìå.
Ðèñ. 11.15
Ïðîñìîòð äàííûõ â îêíå
Immediate

Îïåðàòîð Debug.Assert
Îáúåêò VBA Debug èìååò ìåòîä Assert, ïðèîñòàíàâëèâàþùèé âûïîëíåíèå
êîäà íà ñòðîêå, ñîäåðæàùåé ýòîò ìåòîä, ïðè âûïîëíåíèè íåêîòîðîãî óñëîâèÿ.
Ñèíòàêñèñ ìåòîäà ñëåäóþùèé:
Ñèíòàêñèñ
Debug.Assert Booleanexpression
Àðãóìåíò Booleanexpression — ëîãè÷åñêîå âûðàæåíèå, èìåþùåå ðåçóëüòàòîì çíà-
÷åíèå True èëè False.

Ýòîò ìåòîä, ïðàêòè÷åñêè, ðàáîòàåò êàê îïåðàòîð Stop, íî âûïîëíÿåòñÿ, êî-


ãäà åãî àðãóìåíò ïðèíèìàåò çíà÷åíèå False.
Îòëàäêà VB-êîäà. Ïîèñê è óñòðàíåíèå îøèáîê 457

Îáðàáîò÷èê îøèáîê
Îáðàáîò÷èê îøèáîê — ýòî êîä äëÿ ïåðåõâàòà è îáðàáîòêè îøèáîê â âàøåì
ïðèëîæåíèè. Èñïîëüçîâàíèå âàøèõ ñîáñòâåííûõ îáðàáîò÷èêîâ îøèáîê
ãîâîðèò î òîì, ÷òî âû çàìåòíî ïðîäâèíóëèñü ïî ïóòè èçó÷åíèÿ ïðîãðàì-
ìèðîâàíèÿ â ñèñòåìå 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 — ìåòêà (îòìå÷àåìàÿ â êîäå äâîåòî÷èåì çà íåé), çà êîòîðîé íà÷èíàåòñÿ
îáðàáîò÷èê.

Èòàê, ïåðâûì îïåðàòîðîì áëîêà êîäà îáðàáîòêè ïðåðûâàíèÿ ïî îøèáêå ÿâ-


ëÿåòñÿ ìåòêà ñ äâîåòî÷èåì çà íåé. Äàëåå áåç âñÿêèõ îãðàíè÷èâàþùèõ áëîêè
îïåðàòîðîâ ñëåäóåò ïèñàòü êîä, êîòîðûé, êñòàòè, íåîáÿçàòåëüíî äîëæåí îáðà-
áàòûâàòü îøèáêè: âû ìîæåòå ïðîñòî êîíñòàòèðîâàòü ôàêò íàëè÷èÿ îøèáêè.
Âî-ïåðâûõ, íå âñåãäà ìîæíî èäåíòèôèöèðîâàòü îøèáêó, à âî-âòîðûõ, íå âñÿ-
êóþ îøèáêó ìîæíî èñïðàâèòü. Âû ìîæåòå, íàïðèìåð, òîëüêî ïðåäïîëîæèòü,
÷òî ïðîèçîøëî, è ïîïûòàòüñÿ äàòü ðåêîìåíäàöèè ïîëüçîâàòåëþ, êàê èçáåæàòü
ïîâòîðåíèÿ êàêîé-ëèáî îøèáêè. Äëÿ êîäîâ-ïðèìåðîâ ìû, êîíå÷íî, áóäåì òî÷-
íî çíàòü òèïû îøèáîê, ïîòîìó ÷òî ñàìè áóäåì èõ èíèöèèðîâàòü.
Ïåðåä ìåòêîé, çàäàþùåé íà÷àëî îáðàáîò÷èêà, äîëæåí íàõîäèòüñÿ îïåðàòîð
âûõîäà èç ïðîöåäóðû (ôóíêöèè). Èíà÷å äàæå ïðè îòñóòñòâèè îøèáêè êîä îá-
ðàáîò÷èêà áóäåò âûïîëíÿòüñÿ.  ëèñòèíãå 11.2 ïðèâåäåí ïðèìåð îáðàáîò÷èêà,
êîòîðûé âûïîëíÿåòñÿ â òîì ñëó÷àå, åñëè ïîëüçîâàòåëü ââåäåò â òåêñòîâîì îêíå
íå ÷èñëî, à ÷òî-ëèáî îòëè÷íîå îò ÷èñëà.
458 Ãëàâà 11

Ëèñòèíã 11.2. Ïðèìåð îáðàáîò÷èêà îøèáîê


1: Private Sub Command1_Click()
2: Dim z, y As Integer
3: On Error GoTo err
4: y = InputBox("Ââåäèòå ÷èñëî")
5: z = y + 10
6:
7: MsgBox z
8: MsgBox "Ñïàñèáî!"
9: Exit Sub
10:
11: err:
12: MsgBox ("Ïðîñèëè æå Âàñ ââåñòè ÷èñëî!")
13: End Sub

Êàê âèäíî èç ýòîãî ïðèìåðà, çäåñü íèêòî íå ñîáèðàëñÿ èäåíòèôèöèðîâàòü


îøèáêó: â òàêîì ïðîñòîì êîäå ìîæíî áûëî òîëüêî ïðåäïîëîæèòü, ÷òî âñåìó
âèíîé áóäåò ïîëüçîâàòåëü, êîòîðûé íå ìîæåò ïîëüçîâàòüñÿ îêíîì ââîäà öåëîãî
÷èñëà. Òåì íå ìåíåå, â Visual Basic åñòü âîçìîæíîñòü óçíàòü òèï îøèáêè (êàê
åå «äëÿ ñåáÿ» îïðåäåëÿåò Visual Basic) ïîñðåäñòâîì îáúåêòà Err ñ íåñêîëüêèìè
ñâîéñòâàìè, èç êîòîðûõ äëÿ íàñ íàèáîëåå ïîëåçíû Number — íîìåð îøèáêè,
è Description — îïèñàíèå îøèáêè. Ïðè ýòîì â äîêóìåíòàöèè MSDN åñòü çà-
ìå÷àíèå ñ ðåêîìåíäàöèåé íå î÷åíü äîâåðÿòü ñâîéñòâó Description, à èñïîëü-
çîâàòü òîëüêî ñâîéñòâî Number. Íàïðèìåð, êîä ëèñòèíãà 11.2 ìîæíî äîïîë-
íèòü àíàëèçîì ïðîèçîøåäøåé îøèáêè (ñì. ëèñòèíã 11.3).

Ëèñòèíã 11.3. Àíàëèç îøèáêè â îáðàáîò÷èêå


1: Private Sub Command1_Click()
2: Dim z, y As Integer
3: On Error GoTo err
4: y = InputBox("Ââåäèòå ÷èñëî")
5: z = y + 10
6:
7: MsgBox z
8: MsgBox "Ñïàñèáî!"
9: Exit Sub
10:
11: err:
12: If err.Number = 13 Then
13: MsgBox ("Ïðîñèëè æå Âàñ ââåñòè ÷èñëî!")
14: End If
15: End Sub

Åñëè âû ïðåäïîëàãàåòå, ÷òî â òå÷åíèå ðàáîòû ñ ïðîöåäóðîé ìîãóò ïðîèçîéòè


ñàìûå ðàçíûå îøèáêè, ìîæíî â êîäå îáðàáîò÷èêà èñïîëüçîâàòü îïåðàòîð
Select Case äëÿ âîçìîæíûõ äåéñòâèé, èñïðàâëÿþùèõ ñèòóàöèþ.
Êàê âû ìîãëè óæå çàìåòèòü, â ëèñòèíãàõ 11.2–11.3 ñðàçó ïîñëå âûïîëíåíèÿ
êîäà îáðàáîò÷èêà âñÿ ïðîöåäóðà çàâåðøàåòñÿ. Òàêîé îáðàáîò÷èê õîðîø òîëüêî
â êà÷åñòâå ïðèìåðà òîãî, êàê íå íóæíî ïîñòóïàòü. Åñëè ìû ïî âñÿêèì ïóñòÿêàì
áóäåì çàâåðøàòü ïðîöåäóðû, òî ñ òàêèì ïðèëîæåíèåì áóäåò òðóäíî ðàáîòàòü.
Èòàê, íàì íóæåí ñïîñîá îáðàáîòàòü îøèáêó èëè, â êðàéíåì ñëó÷àå, ñîîá-
ùèòü î íåé, íî îáÿçàòåëüíî êàê-òî ïðîäîëæèòü âûïîëíåíèå ïðîöåäóðû.
Îòëàäêà VB-êîäà. Ïîèñê è óñòðàíåíèå îøèáîê 459

Âûõîä èç áëîêà îáðàáîòêè ïðåðûâàíèÿ ïî îøèáêå


Äëÿ âûõîäà èç áëîêà îáðàáîòêè îøèáêè ìîæíî íè÷åãî íå ïðåäïðèíèìàòü,
è ðàáîòà ôóíêöèè áóäåò çàâåðøåíà. Íî ïîñêîëüêó ñ òàêèì îáðàçîì çàâåðøèâ-
øåé ñâîþ ðàáîòó ïðîöåäóðîé (èëè ôóíêöèåé) ìîãóò áûòü ñâÿçàíû äðóãèå ÷àñòè
êîäà, âèäèìî, íå âñåãäà áóäåò ïðàâèëüíî ïðîñòî îòêàçàòüñÿ îò äàëüíåéøåãî
âûïîëíåíèÿ ïðîöåäóðû. Ïî êðàéíåé ìåðå, íàäî êàê-òî ñîîáùèòü î òîì, ÷òî
ïðîöåäóðà çàâåðøèëàñü èç-çà îøèáêè. Íàïðèìåð, åñëè ôóíêöèÿ äîëæíà áûëà
âîçâðàòèòü ðåçóëüòàò (íåêîòîðûõ âû÷èñëåíèé), èñïîëüçóåìûé â äàëüíåéøèõ
ðàñ÷åòàõ, òî àâàðèéíûé âûõîä ïî îøèáêå äàåò ìàëî ïîëüçû. Îøèáêà ìîæåò
ïðîèçîéòè è ïðè îòêðûòèè ôàéëà. Åñëè íå ñîîáùèòü îá ýòîì ïðè âûõîäå èç
áëîêà îáðàáîòêè îøèáêè, òî íàéäåòñÿ òàêàÿ ôóíêöèÿ, êîòîðàÿ ïîïûòàåòñÿ
ñ÷èòàòü äàííûå èç íåîòêðûòîãî ôàéëà. È òàê äàëåå.
Äëÿ âûõîäà èç áëîêà îáðàáîòêè îøèáîê ïðåäíàçíà÷åí îïåðàòîð Resume,
ôóíêöèè êîòîðîãî ïðèâåäåíû â ñëåäóþùåé òàáëèöå.

Îïåðàòîð Îïèñàíèå
Âûïîëíåíèå êîäà âîçîáíîâëÿåòñÿ ñ òîãî îïåðàòîðà, êîòîðûé
Resume [0] âûçâàë îøèáêó. Èñïîëüçóéòå ýòîò îïåðàòîð äëÿ ïîâòîðåíèÿ êîäà
ïîñëå èñïðàâëåíèÿ îøèáêè.
Âîçîáíîâëÿåò âûïîëíåíèå êîäà ñ îïåðàòîðà, ñëåäóþùåãî
íåïîñðåäñòâåííî çà îïåðàòîðîì, âûçâàâøèì îøèáêó. Åñëè
îøèáêà ïðîèçîøëà âíå ïðîöåäóðû, ñîäåðæàùåé áëîê îáðàáîòêè
Resume Next
îøèáîê, âûïîëíåíèå êîäà âîçîáíîâëÿåòñÿ ñ îïåðàòîðà,
íàõîäÿùåãîñÿ çà âûçîâîì ïðîöåäóðû, âûçâàâøåé îøèáêó, åñëè
â ýòîé ïðîöåäóðå íåò ñâîåãî îáðàáîò÷èêà.
Âîçîáíîâëÿåò âûïîëíåíèå êîäà ñ óêàçàííîé ìåòêè line. Ìåòêà
Resume line äîëæíà íàõîäèòüñÿ â ïðîöåäóðå, ñîäåðæàùåé îáðàáîò÷èê
îøèáîê.
Ýìóëèðóåò îøèáêó âðåìåíè èñïîëíåíèÿ. Êîãäà ýòîò îïåðàòîð
Err.Raise
âûïîëíÿåòñÿ âíóòðè áëîêà îáðàáîòêè îøèáîê, Visual Basic
Number:=
îáðàùàåòñÿ ê ñïèñêó âûçîâîâ (ïîñëåäîâàòåëüíîñòü âûçîâà
number
ïðîöåäóð) äëÿ ïîèñêà äðóãîãî îáðàáîò÷èêà.

Ïðèìåð èñïîëüçîâàíèÿ îïåðàòîðà Resume ïðèâåäåí â ëèñòèíãå 11.4. Ýòî ñà-


ìàÿ ïðîñòàÿ ôîðìà îïåðàòîðà, ïðè êîòîðîé ïðîèñõîäèò âîçâðàò ê ñòðîêå êîäà,
ãäå ïðîèçîøëà îøèáêà. Ïî êðàéíåé ìåðå, â äàííîì ñëó÷àå ýòîãî âïîëíå äîñòà-
òî÷íî, ïîñêîëüêó ïîñëå ïðàâèëüíîãî ââîäà ÷èñëà ïðîãðàììà áóäåò ðàáîòàòü
íîðìàëüíî.

Ëèñòèíã 11.4. Èñïîëüçîâàíèå â îáðàáîò÷èêå îïåðàòîðà Resume


1: Private Sub Command1_Click()
2: Dim z, y As Integer
3: On Error GoTo err
4: y = InputBox("Ââåäèòå ÷èñëî")
5: z = y + 10
6:
7: MsgBox z
8: MsgBox "Ñïàñèáî!"
9: Exit Sub
460 Ãëàâà 11

10:
11: err:
12: If err.Number = 13 Then
13: MsgBox ("Ïðîñèëè æå Âàñ ââåñòè ÷èñëî!")
14: Resume
15: End If
16: End Sub

 ëèñòèíãàõ 11.5 è 11.6 ïðèâåäåíû ïðèìåðû èñïîëüçîâàíèÿ îïåðàòîðà


Resume Next. Ïðè÷åì â ïåðâîì èç íèõ âûïîëíèòñÿ ïðèñâîåíèå ïåðåìåííîé
÷èñëà 9999, åñëè ïîëüçîâàòåëü «çàáûë», êàê ââîäÿòñÿ ÷èñëà. Çàòåì êîä ïðî-
äîëæàåòñÿ ñî ñëåäóþùåé ñòðîêè (çà îïåðàòîðîì InputBox).
 ëèñòèíãå 11.6 îáðàáîò÷èê áîëåå «ëîÿëåí» ê ïîëüçîâàòåëþ, äàâàÿ åìó òðè
ïîïûòêè äëÿ ââîäà ÷èñëà. Ïîýòîìó çäåñü èñïîëüçóåòñÿ è îïåðàòîð Resume,
è Resume Next. Äëÿ ýòîãî â êîä ââåäåí ñ÷åò÷èê co, êîòîðûé ïðè çàãðóçêå ôîð-
ìû (ïðîöåäóðà Form_Load) èíèöèàëèçèðóåòñÿ çíà÷åíèåì 1.  áëîêå îáðàáîòêè
îøèáîê çíà÷åíèå ñ÷åò÷èêà óâåëè÷èâàåòñÿ íà åäèíèöó. Êàê òîëüêî ïîëüçîâà-
òåëü èñïîëüçóåò òðè ïîïûòêè ââîäà ÷èñëà, íî íå ââåäåò ÷èñëî, îïåðàòîð
Resume Next ïðåêðàòèò ïîëüçîâàòåëüñêèå «ìó÷åíèÿ», êàê ýòî äåëàåòñÿ (òîëü-
êî ãîðàçäî ðàíüøå) â ïðåäûäóùåì ëèñòèíãå.

Ëèñòèíã 11.5. Èñïîëüçîâàíèå â îáðàáîò÷èêå îïåðàòîðà Resume Next


1: Private Sub Command1_Click()
2: Dim z, y As Integer
3: On Error GoTo err
4: y = InputBox("Ââåäèòå ÷èñëî")
5: z = y + 10
6:
7: MsgBox z
8: MsgBox "Ñïàñèáî!"
9: Exit Sub
10:
11: err:
12: If err.Number = 13 Then
13: MsgBox ("Ñ Âàøåãî ðàçðåøåíèÿ ââåäåì 9999")
14: y = 9999
15: Resume Next
16: End If
17: End Sub

Ëèñòèíã 11.6. Èñïîëüçîâàíèå â îáðàáîò÷èêå îïåðàòîðà Resume Next


1: Public co As Integer
2: Private Sub Command1_Click()
3: Dim z, y As Integer
4: On Error GoTo err
5: y = InputBox("Ââåäèòå ÷èñëî")
6: z = y + 10
7:
8: MsgBox z
9: MsgBox "Ñïàñèáî!"
10: Exit Sub
11:
12: err:
13: If err.Number = 13 Then
Îòëàäêà VB-êîäà. Ïîèñê è óñòðàíåíèå îøèáîê 461

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

Î÷åíü ïðîñòîé ïðèìåð èñïîëüçîâàíèÿ îïåðàòîðà Resume line ïðèâåäåí


â ñëåäóþùåì ëèñòèíãå.

Ëèñòèíã 11.7. Èñïîëüçîâàíèå â îáðàáîò÷èêå îïåðàòîðà Resume line


1: Public co As Integer
2: Private Sub Command1_Click()
3: Dim z, y As Integer
4: On Error GoTo err
5: y = InputBox("Ââåäèòå ÷èñëî")
6: z = y + 10
7:
8: MsgBox z
9: MsgBox "Ñïàñèáî!"
10: Exit Sub
11:
12: err_exit:
13: MsgBox ("×òî-òî ó Âàñ íå ïîëó÷àåòñÿ")
14: Exit Sub
15:
16: err:
17: If err.Number = 13 Then
18: If co = 2 Then
19: Resume err_exit
20: Else
21: co = co + 1
22: MsgBox ("Ó Âàñ îñòàëîñü " & _
23: (3 - co) & " ïîïûòêè")
24: Resume
25: End If
26: End If
27: End Sub
28:
29: Private Sub Form_Load()
30: co = 0
31: End Sub

 ëèñòèíãå 11.8 áëîê êîäà îáðàáîòêè îøèáîê íàõîäèòñÿ íå â òîé ïðîöåäóðå,


ãäå ïðîèñõîäèò îøèáêà ïðè äåëåíèè ÷èñëà íà íîëü. Visual Basic ïðè ïîìîùè
ñïèñêà âûçîâîâ âîçâðàùàåòñÿ â ïðîöåäóðó A, ïîñêîëüêó èìåííî òàì áûë àêòè-
âèçèðîâàí îáðàáîò÷èê îøèáîê. Îïåðàòîð Resume Next èíèöèèðîâàë ïåðåõîä
ê ñòðîêå êîäà, êîòîðàÿ íàõîäèòñÿ çà îïåðàòîðîì âûçîâà ïðîöåäóðû B.
462 Ãëàâà 11

Ëèñòèíã 11.8. Îáðàáîò÷èê îøèáîê â îäíîé èç ïðîöåäóð


1: Private Sub Command1_Click()
2: Call A
3: End Sub
4:
5: Sub A()
6: On Error GoTo err
7: Call B
8: MsgBox (" ëþáîì ñëó÷àå ïðîöåäóðà a çàâåðøàåòñÿ")
9: Exit Sub
10: err:
11: MsgBox ("Ãäå-òî ïðîèçîøëà îøèáêà!")
12: Resume Next
13: End Sub
14:
15: Sub B()
16: Call C
17: End Sub
18:
19: Sub C()
20: Dim d As Integer
21: d = 1 / 0
22: End Sub

Ïðîãðàììíàÿ îáðàáîòêà îøèáîê


ïðè ïîìîùè îïåðàòîðà On Error
Îïåðàòîð On Error ïîçâîëÿåò îáðàáàòûâàòü îøèáêè, âîçíèêàþùèå âî âðåìÿ
âûïîëíåíèÿ êîäà, ïðîãðàììíî. Ñèíòàêñèñ îïåðàòîðà On Error ñëåäóþùèé:
Ñèíòàêñèñ
On Error GoTo line
On Error Resume Next
On Error GoTo 0
Ñèíòàêñèñ îïåðàòîðà On Error èìååò ñëåäóþùèå ôîðìû:

Äåëàåò äîñòóïíûì îáðàáîò÷èê îøèáîê, êîòîðûé íà÷èíàåòñÿ ñî


ñòðîêè, îïðåäåëåííîé àðãóìåíòîì line. Àðãóìåíò line ìîæåò
áûòü ìåòêîé èëè ÷èñëîì. Ïðè âîçíèêíîâåíèè îøèáêè
On Error GoTo
óïðàâëåíèå âûïîëíåíèåì ïðîãðàììû ïåðåäàåòñÿ íà ñòðîêó êîäà
line
ñ ìåòêîé line.Òàêèì îáðàçîì ïðîèñõîäèò àêòèâèçàöèÿ
îáðàáîò÷èêà îøèáîê. Ìåòêà line äîëæíà íàõîäèòüñÿ â òîé æå
ïðîöåäóðå, ÷òî è îïåðàòîð On Error.
Óêàçûâàåò íà òî, ÷òî ïðè âîçíèêíîâåíèè îøèáêè óïðàâëåíèå
âûïîëíåíèåì ïðîãðàììû ïåðåäàåòñÿ íà îïåðàòîð, ñëåäóþùèé
íåïîñðåäñòâåííî çà òåì, â êîòîðîì ïðîèçîøëà îøèáêà. Ýòîò
On Error Resume
îïåðàòîð ïîçâîëÿåò ïðîäîëæèòü âûïîëíåíèå ïðîãðàììû,
Next
íåñìîòðÿ íà âîçíèêíîâåíèå runtime-îøèáêè. Îïåðàòîð On Error
Resume Next ñòàíîâèòñÿ íåàêòèâíûì ïðè âûçîâå äðóãîé
ïðîöåäóðû.
Îòëàäêà VB-êîäà. Ïîèñê è óñòðàíåíèå îøèáîê 463

Îòêëþ÷àåò ïîëüçîâàòåëüñêèé îáðàáîò÷èê îøèáîê â äàííîé


ïðîöåäóðå. Ýòîò îïåðàòîð íå óêàçûâàåò ìåòêó 0 â êà÷åñòâå
íà÷àëà îáðàáîò÷èêà îøèáêè, äàæå åñëè â ïðîöåäóðå
On Error GoTo 0
äåéñòâèòåëüíî èìååòñÿ òàêàÿ ìåòêà. Áåç ýòîãî îïåðàòîðà
îáðàáîò÷èê îøèáîê «îòêëþ÷àåòñÿ» àâòîìàòè÷åñêè ïîñëå
îêîí÷àíèÿ ðàáîòû ïðîöåäóðû.

Ïîëüçîâàòåëüñêèå îáðàáîò÷èêè îøèáîê ÿâëÿþòñÿ ñîñòàâíîé ÷àñòüþ «äðó-


æåñòâåííîãî» èíòåðôåéñà. Åñëè âî âðåìÿ ðàáîòû ïîëüçîâàòåëÿ ñ âàøèì ïðèëî-
æåíèåì âîçíèêàåò íå ïðåäóñìîòðåííàÿ âàìè ñèòóàöèÿ, òî â ëþáîì ñëó÷àå íå
ñòîèò îñòàâëÿòü ïîëüçîâàòåëÿ «íàåäèíå» ñ ñèñòåìîé VBA, íå íàñòîëüêî äðóæå-
ñòâåííîé, êàê õîðîøèé ðàçðàáîò÷èê ïðèëîæåíèé. VBA «çíàåò» î÷åíü ìàëî
î òîì, â êàêèõ ìåñòàõ âàøåãî ïðîãðàììíîãî êîäà è êàêèå ìîãóò âîçíèêàòü
îøèáêè. Ðàçðàáîò÷èê æå ïðèëîæåíèÿ äîëæåí çíàòü âñå «òîíêèå» ìåñòà â êîäå
è îæèäàòü òå èëè èíûå îøèáêè. Äàæå åñëè ïðèëîæåíèå ïðîñòî ïûòàåòñÿ îò-
êðûòü ôàéë, êîòîðûé íå÷àÿííî «óáèëè», VBA-ñîîáùåíèå îá îòñóòñòâèè ôàéëà
íå òàê èíôîðìàòèâíî, êàê ìîãëî áû áûòü ñîîáùåíèå ðàçðàáîò÷èêà, êîòîðîå íå
òîëüêî äîëæíî ñîîáùèòü îá îòñóòñòâèè ôàéëà, íî è ïðåäëîæèòü âîçìîæíûå
ïóòè åãî âîññòàíîâëåíèÿ èëè çàìåíû ñòàðîé êîïèåé.
Ñëåäóåò ðàçëè÷àòü ñîñòîÿíèÿ «äîñòóïíîñòü» (enabled) è «àêòèâíîñòü» (active)
îáðàáîò÷èêà îøèáîê. Îáðàáîò÷èê äîñòóïåí, åñëè îïåðàòîð On Error âûïîëíåí,
íî îøèáêà åùå íå âîçíèêëà. Îáðàáîò÷èê àêòèâåí, êîãäà èì âûïîëíÿåòñÿ îáðà-
áîòêà íåêîòîðîé âîçíèêøåé îøèáêè. Åñëè îøèáêà âîçíèêàåò, êîãäà îáðàáîò÷èê
àêòèâåí (îáðàáàòûâàåò ðàíåå âîçíèêøóþ îøèáêó), ýòà îøèáêà íå îáðàáàòûâàåò-
ñÿ è óïðàâëåíèå ïåðåäàåòñÿ â âûçûâàþùóþ ïðîöåäóðó. Åñëè âûçûâàþùàÿ ïðî-
öåäóðà èìååò îáðàáîò÷èê îøèáîê, íàõîäÿùèéñÿ â ñîñòîÿíèè «enabled», îáðàáîò-
÷èê ïåðåõîäèò â ñîñòîÿíèå «active» (ò.å. îáðàáîòêè îøèáêè). Åñëè îáðàáîò÷èê
âûçûâàþùåé ïðîöåäóðû íàõîäèòñÿ â ñîñòîÿíèè «active», òî óïðàâëåíèå ïåðåäà-
åòñÿ ïðåäûäóùåé âûçûâàþùåé ïðîöåäóðå ñ îáðàáîò÷èêîì â ñîñòîÿíèè
«enabled», íî íå «active». Ò.å. â öåïî÷êå âûçûâàþùèõ ïðîöåäóð èùåòñÿ îáðà-
áîò÷èê îøèáîê â ñîñòîÿíèè «enabled», ãîòîâûé îáðàáîòàòü îøèáêó.
Îáû÷íî â ïðîöåäóðàõ îáðàáîòêè îøèáîê äëÿ îïðåäåëåíèÿ ïðè÷èíû îøèáêè
èñïîëüçóåòñÿ ñâîéñòâî Number îáúåêòà Err. Ñîîáùåíèå îá îøèáêå (äîâîëüíî
«ñêóïîå»), ñâÿçàííîå ñ Err.Number, ñîäåðæèòñÿ â Err.Description. Ïîýòîìó
îáû÷íî íà ñòàäèè îòëàäêè ïîñëå ìåòêè, íà êîòîðóþ ïåðåäàåòñÿ óïðàâëåíèå
âûïîëíåíèåì ïðîãðàììû â ñëó÷àå âîçíèêíîâåíèÿ (îæèäàåìîé) îøèáêè,
ïîìåùàåòñÿ ñëåäóþùèé îïåðàòîð:
MsgBox "Error " & Err & ": " & Err.Description
 ïðîöåäóðå ëèñòèíãà 11.9 èñïîëüçóåòñÿ On Error Resume Next äëÿ òîãî,
÷òîáû ïðè îáíàðóæåíèè îòñóòñòâèÿ â ñèñòåìå ýêçåìïëÿðà ïðèëîæåíèÿ Excel
ïðîãðàììà íå çàâåðøàëàñü ñ îøèáêîé.

Ëèñòèíã 11.9. Îáðàáîò÷èê îøèáîê


äëÿ çàùèòû ïðîãðàììû îò ïðåðûâàíèÿ

1: Sub TestError()
2: Dim xlApp As Object
3: Dim xlSheet As Object
4: On Error Resume Next
464 Ãëàâà 11

5: Set xlApp = Nothing


6: Set xlApp = GetObject(, "Excel.Application")
7: If Err.Number <> 0 Then
8: Set xlApp = CreateObject("Excel.Application")
9: End If
10: Err.Clear
11:
12: Set xlBook = xlApp.Workbooks.Add
13: Set xlSheet = xlBook.WorkSheets(1)
14: xlSheet.Application.Visible = True
15: End Sub
465
1

Potrebbero piacerti anche