06.01.2015 Views

Введение в программирование на VBA - eDrive

Введение в программирование на VBA - eDrive

Введение в программирование на VBA - eDrive

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

В. М. Водо<strong>в</strong>озо<strong>в</strong><br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> программиро<strong>в</strong>ание<br />

<strong>на</strong> <strong>VBA</strong><br />

Санкт-Петербург<br />

2003


УДК 681.3.016<br />

В.М.Водо<strong>в</strong>озо<strong>в</strong>. <strong>В<strong>в</strong>едение</strong> <strong>в</strong> программиро<strong>в</strong>ание <strong>на</strong> <strong>VBA</strong>. 64 c.<br />

Даны осно<strong>в</strong>ные с<strong>в</strong>едения о языке Visual Basic for Applications и<br />

пра<strong>в</strong>ила работы <strong>в</strong> редакторе Visual Basic. Для <strong>в</strong>сех, кто <strong>в</strong>ладеет осно<strong>в</strong>ами<br />

Microsoft Office.<br />

© В.М.Водо<strong>в</strong>озо<strong>в</strong>, 2003.


Огла<strong>в</strong>ление<br />

ИНФОРМАЦИОННАЯ СИСТЕМА..............................................................................4<br />

Базо<strong>в</strong>ые понятия информатики ....................................................................4<br />

Организация Windows......................................................................................6<br />

Функциониро<strong>в</strong>ание Windows ...........................................................................9<br />

УПРАВЛЕНИЕ ОБЪЕКТАМИ WINDOWS .................................................................11<br />

Элементы упра<strong>в</strong>ления ...................................................................................11<br />

С<strong>в</strong>ойст<strong>в</strong>а объекто<strong>в</strong> .......................................................................................12<br />

Макросы .........................................................................................................14<br />

ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ.....................................................................20<br />

От алгоритма к программе .........................................................................20<br />

Процедуры ......................................................................................................22<br />

Редактор Visual Basic ...................................................................................23<br />

Выражения.....................................................................................................25<br />

ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ .................................................................30<br />

Подпрограммы...............................................................................................30<br />

Переменные и константы............................................................................32<br />

Функции ..........................................................................................................35<br />

Файлы .............................................................................................................36<br />

СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ..................................................................38<br />

Структуры и модули ....................................................................................38<br />

Соста<strong>в</strong>ные операторы .................................................................................40<br />

Простые типы данных.................................................................................46<br />

Соста<strong>в</strong>ные типы данных..............................................................................49<br />

ВИЗУАЛЬНОЕ ПРОГРАММИРОВАНИЕ....................................................................54<br />

Формы.............................................................................................................54<br />

Элементы упра<strong>в</strong>ления ...................................................................................55<br />

Элементы оформления .................................................................................64


4<br />

Информацион<strong>на</strong>я система<br />

Базо<strong>в</strong>ые понятия информатики<br />

С<strong>в</strong>едения об окружающем <strong>на</strong>с мире обычно <strong>на</strong>зы<strong>в</strong>ают информацией.<br />

Информация обособляет сообщест<strong>в</strong>о людей, <strong>в</strong>ыделяя его из жи<strong>в</strong>отной и<br />

растительной среды и объединяя между собой. З<strong>на</strong>ки как минимальные<br />

носители информации моделируют реальные я<strong>в</strong>ления и процессы, <strong>в</strong>ыражая<br />

отношение к ним и уста<strong>на</strong><strong>в</strong>ли<strong>в</strong>ая с<strong>в</strong>язь между людьми через эти отношения.<br />

З<strong>на</strong>ко<strong>в</strong>ая система, предста<strong>в</strong>ляющая и организующая информацию,<br />

регламентирующая нормы и характер <strong>в</strong>заимодейст<strong>в</strong>ия з<strong>на</strong>ко<strong>в</strong>ых потоко<strong>в</strong>,<br />

<strong>на</strong>зы<strong>в</strong>ается языком.<br />

Среди миллионо<strong>в</strong> з<strong>на</strong>ко<strong>в</strong>, которыми обмени<strong>в</strong>аются люди — з<strong>в</strong>уко<strong>в</strong> и<br />

жесто<strong>в</strong>, с<strong>в</strong>ето<strong>в</strong>ых и электромагнитных сиг<strong>на</strong>ло<strong>в</strong>, — <strong>в</strong>ыделяется особая<br />

группа. Это сим<strong>в</strong>олы, способные переда<strong>в</strong>ать информацию ск<strong>в</strong>озь <strong>в</strong>ремя.<br />

Сим<strong>в</strong>ольные изображения характернее, чем любая другая информация,<br />

<strong>в</strong>ыделяют чело<strong>в</strong>ека <strong>в</strong> мире природы, поз<strong>в</strong>оляя соединять между собой<br />

поколения. Личность приходит и уходит, а оста<strong>в</strong>ленные ею сим<strong>в</strong>олы<br />

остаются, чтобы быть прочитанными и понятыми со<strong>в</strong>ременниками и<br />

потомками. Каждый сим<strong>в</strong>ол предста<strong>в</strong>ляет организо<strong>в</strong>анное множест<strong>в</strong>о<br />

пространст<strong>в</strong>енных точек и линий, формируемых разнообразными<br />

инструментами. Чем больше таких изобразительных элементо<strong>в</strong> и богаче их<br />

организация, тем шире <strong>в</strong>озможность отразить <strong>в</strong> сим<strong>в</strong>оле реальность <strong>в</strong>о <strong>в</strong>сем<br />

богатст<strong>в</strong>е ее проя<strong>в</strong>лений. Из-под резца мастера и кисти художника, из<br />

студии скульптора и лаборатории фотографа <strong>в</strong>ыходят бессмертные образы<br />

мира, которому он при<strong>на</strong>длежит.<br />

Изобразительные средст<strong>в</strong>а <strong>в</strong>сегда ограничены <strong>в</strong>о <strong>в</strong>ремени и<br />

пространст<strong>в</strong>е <strong>в</strong>озможностями инструмента, с<strong>в</strong>ойст<strong>в</strong>ами материала,<br />

способностями т<strong>в</strong>орца. Чем <strong>в</strong>ыше потребность <strong>в</strong> передаче с<strong>в</strong>едений и больше<br />

ограничений <strong>на</strong> ее реализацию, тем лаконичнее сим<strong>в</strong>ол и з<strong>на</strong>чимее каждая<br />

его точка и линия. А з<strong>на</strong>чит, между а<strong>в</strong>тором и получателем информации<br />

<strong>в</strong>озникают но<strong>в</strong>ые отношения, с<strong>в</strong>язанные с пониманием (расшифро<strong>в</strong>кой,<br />

интерпретацией) поступающих сим<strong>в</strong>оло<strong>в</strong>. И требуется <strong>в</strong>ремя, <strong>в</strong> течение<br />

которого их <strong>на</strong>до хранить и преобразо<strong>в</strong>ы<strong>в</strong>ать. Жить <strong>в</strong> мире информации —<br />

з<strong>на</strong>чит участ<strong>в</strong>о<strong>в</strong>ать <strong>в</strong> четырех категориях информационных процессо<strong>в</strong>,<br />

с<strong>в</strong>язанных с непреры<strong>в</strong>ным <strong>в</strong>осприятием, хранением, переработкой и<br />

передачей с<strong>в</strong>едений. Каждый отдельный поток <strong>в</strong>оспринятой, сохраненной,<br />

обработанной и переданной информации образует сообщение. Сообщение —<br />

это факт и усло<strong>в</strong>ие общения, <strong>в</strong>ыражающее отношение между источником и<br />

приемником информации. Сим<strong>в</strong>ольные сообщения <strong>на</strong>зы<strong>в</strong>ают документами.


5<br />

Единение з<strong>на</strong>ка и з<strong>на</strong>чения, сим<strong>в</strong>ола и я<strong>в</strong>ления раскры<strong>в</strong>ается через<br />

образо<strong>в</strong>ание. Любая образо<strong>в</strong>атель<strong>на</strong>я система <strong>на</strong>целе<strong>на</strong> <strong>на</strong> обучение<br />

пониманию, созданию и использо<strong>в</strong>анию максимально широкой гаммы таких<br />

с<strong>в</strong>язей. Большая часть образо<strong>в</strong>ательной деятельности пос<strong>в</strong>яще<strong>на</strong> языкам и<br />

ос<strong>в</strong>оению погруженных <strong>в</strong> них информационных процессо<strong>в</strong>. Собст<strong>в</strong>енно<br />

линг<strong>в</strong>истика как <strong>на</strong>ука о языках рассматри<strong>в</strong>ает <strong>в</strong> качест<strong>в</strong>е элементарных<br />

информационных единиц не любые, а лишь зарегистриро<strong>в</strong>анные <strong>в</strong><br />

конкретной языко<strong>в</strong>ой системе осно<strong>в</strong>ные (терми<strong>на</strong>льные) и <strong>в</strong>спомогательные<br />

(нетерми<strong>на</strong>льные) сим<strong>в</strong>олы. Терми<strong>на</strong>льные сим<strong>в</strong>олы объединяются <strong>в</strong><br />

алфа<strong>в</strong>иты (азбуки), а сим<strong>в</strong>ольные последо<strong>в</strong>ательности, при<strong>на</strong>длежащие<br />

одному алфа<strong>в</strong>иту, <strong>на</strong>зы<strong>в</strong>ают цепочками, лексемами или сло<strong>в</strong>ами данного<br />

алфа<strong>в</strong>ита. В соста<strong>в</strong>е языка присутст<strong>в</strong>ует множест<strong>в</strong>о цепочек алфа<strong>в</strong>ита. Из<br />

терми<strong>на</strong>ло<strong>в</strong> и сло<strong>в</strong> строится сло<strong>в</strong>арь — структура данных, обеспечи<strong>в</strong>ающая<br />

доступ к информации по име<strong>на</strong>м.<br />

В естест<strong>в</strong>енных языках цепочки терми<strong>на</strong>льных сим<strong>в</strong>оло<strong>в</strong> имеют<br />

фонетические эк<strong>в</strong>и<strong>в</strong>аленты. Искусст<strong>в</strong>енные языки обычно не несут<br />

фонетической окраски. Каждый такой язык созда<strong>в</strong>ался как модель<br />

некоторого естест<strong>в</strong>енного языка, удоб<strong>на</strong>я для реализации <strong>в</strong> определенной<br />

техногенной среде. Эта «модель модели» имеет еще более абстрактную<br />

природу и еще более далека от реальных прототипо<strong>в</strong>, чем обычный язык<br />

сим<strong>в</strong>оло<strong>в</strong>. Вероятно, по этой причине искусст<strong>в</strong>енный язык было бы еще<br />

сложнее понять, если бы не «инженер<strong>на</strong>я» природа его поя<strong>в</strong>ления. Язык,<br />

созданный для техники, интерпретируется самой техникой, и чем <strong>в</strong>ыше<br />

«интеллектуальный» уро<strong>в</strong>ень машины, тем ниже требо<strong>в</strong>ания к интеллекту ее<br />

пользо<strong>в</strong>ателя.<br />

Наиболее со<strong>в</strong>ершенные технические средст<strong>в</strong>а строятся <strong>на</strong> базе<br />

компьютеро<strong>в</strong>. Компьютерные информационные ресурсы <strong>в</strong>ключают <strong>в</strong> с<strong>в</strong>ой<br />

соста<strong>в</strong> аппаратное, математическое и технологическое обеспечение для<br />

физической, логической и организационной реализации информационных<br />

процессо<strong>в</strong>. Информатика — это <strong>на</strong>ука о компьютерном сопро<strong>в</strong>ождении<br />

информационных процессо<strong>в</strong>. Компьютер<strong>на</strong>я модель информации<br />

предста<strong>в</strong>ляется данными. Как и любая модель, данные не полностью<br />

отражают реальный мир, но сохраняют гла<strong>в</strong>ное — с<strong>в</strong>едения о тех его<br />

я<strong>в</strong>лениях и процессах, которые сущест<strong>в</strong>енны с позиции решения конкретной<br />

проблемы, ради которой создается информацион<strong>на</strong>я система.<br />

З<strong>на</strong>ко<strong>в</strong>ая система, отображающая и организующая информацию и<br />

регламентирующая нормы и характер <strong>в</strong>заимодейст<strong>в</strong>ия данных, именуется<br />

языком программиро<strong>в</strong>ания.<br />

Под программой пользо<strong>в</strong>атель обычно понимает компьютерную<br />

модель прикладной области, тогда как программист <strong>в</strong>идит <strong>в</strong> ней систему<br />

документо<strong>в</strong>, созданную средст<strong>в</strong>ами языка программиро<strong>в</strong>ания, и данные для<br />

него — это факты, из<strong>в</strong>естные программе. Как и <strong>в</strong> любой модели, <strong>в</strong><br />

программе через данные можно передать далеко не <strong>в</strong>се, что с<strong>в</strong>язано с


6<br />

моделируемым миром, но гла<strong>в</strong>ное <strong>в</strong> ней, то есть с<strong>в</strong>едения, необходимые для<br />

адек<strong>в</strong>атного отображения предметной области.<br />

Информацион<strong>на</strong>я система обрабаты<strong>в</strong>ает электронные документы,<br />

предста<strong>в</strong>ляющие программные модели документо<strong>в</strong> реальных. Несмотря <strong>на</strong><br />

принципиально иную <strong>в</strong>нутреннюю природу языка программы, «<strong>в</strong>нешний»<br />

язык электронного документа часто не отличается от прототипа. Если же<br />

такие отличия есть, то, как пра<strong>в</strong>ило, они <strong>на</strong>пра<strong>в</strong>лены <strong>на</strong> по<strong>в</strong>ышение<br />

произ<strong>в</strong>одительности обработки информации и улучшение усло<strong>в</strong>ий труда<br />

пользо<strong>в</strong>ателя. А <strong>в</strong> качест<strong>в</strong>е инструмента для работы с электронными<br />

документами <strong>в</strong>ыступают инструментальные программы, или приложения.<br />

С помощью данных приклад<strong>на</strong>я область <strong>в</strong> программе предста<strong>в</strong>ляется<br />

объектами. Объект — это компьютер<strong>на</strong>я модель конкретного предмета,<br />

процесса, я<strong>в</strong>ления. Каждый объект <strong>в</strong>ыступает <strong>в</strong> роли предста<strong>в</strong>ителя с<strong>в</strong>оего<br />

класса. Класс — это категория <strong>в</strong>сеобщности и подобия объекто<strong>в</strong>, шаблон,<br />

который, по сло<strong>в</strong>ам осно<strong>в</strong>ателя объектно-ориентиро<strong>в</strong>анного<br />

программиро<strong>в</strong>ания Г.Буча, «определяет абстракцию сущест<strong>в</strong>енного <strong>в</strong><br />

объекте». Объекты одного класса объединяются <strong>в</strong> коллекции, или семейст<strong>в</strong>а.<br />

Объекты характеризуются идентичностью, состоянием и по<strong>в</strong>едением.<br />

Идентичность объекта программы проя<strong>в</strong>ляется <strong>в</strong> его имени.<br />

«Сим<strong>в</strong>олом мы <strong>в</strong>идим реальность, а именем слышим ее», го<strong>в</strong>орил<br />

П.А.Флоренский. «Го<strong>в</strong>орящие» име<strong>на</strong> делают программы понятными а<strong>в</strong>тору<br />

и читателю, соот<strong>в</strong>етст<strong>в</strong>уют контексту и несут описательную <strong>на</strong>грузку.<br />

«Именуйте <strong>в</strong>ещи согласно <strong>в</strong>ашим з<strong>на</strong>ниям об их природе, получаемым через<br />

поз<strong>на</strong>ние их с<strong>в</strong>ойст<strong>в</strong> и дейст<strong>в</strong>ий», писал <strong>в</strong> дре<strong>в</strong>ности Ф.Ак<strong>в</strong>инский.<br />

Состояние программного объекта определяется данными. Данные, з<strong>на</strong>чения<br />

которых меняются <strong>в</strong> ходе <strong>в</strong>ыполнения программы, <strong>в</strong>ыражаются<br />

переменными, а данные, не изменяемые программой, именуются<br />

константами. По<strong>в</strong>едение программного объекта — это <strong>на</strong>блюдаемая и<br />

про<strong>в</strong>еряемая деятельность, <strong>на</strong>пра<strong>в</strong>лен<strong>на</strong>я <strong>на</strong> изменение его состояния.<br />

Организация Windows<br />

Ресурсами компьютера (процессором, памятью, периферийными<br />

устройст<strong>в</strong>ами) и процессами, использующими эти ресурсы, упра<strong>в</strong>ляет<br />

операцион<strong>на</strong>я система. Осно<strong>в</strong>ную долю рынка операционных систем для<br />

персо<strong>на</strong>льных компьютеро<strong>в</strong> соста<strong>в</strong>ляют различные <strong>в</strong>ерсии Microsoft<br />

Windows.<br />

Важными чертами Windows я<strong>в</strong>ляются:<br />

• неза<strong>в</strong>исимость программного обеспечения приложений от<br />

аппаратуры, т.к. Windows полностью берет <strong>на</strong> себя общение<br />

приложений с дисплеями, принтерами, портами, мышью,


7<br />

кла<strong>в</strong>иатурой и пр., а пользо<strong>в</strong>ателям и программистам предоста<strong>в</strong>ляет<br />

уни<strong>в</strong>ерсальные средст<strong>в</strong>а обращения к аппаратуре;<br />

• стандартный, единый для <strong>в</strong>сех приложений графический интерфейс<br />

пользо<strong>в</strong>ателя;<br />

• многозадачность и многопоточность, обеспечи<strong>в</strong>ающие <strong>в</strong>озможность<br />

одно<strong>в</strong>ременного запуска нескольких приложений и их частей и<br />

переключения между ними;<br />

• <strong>в</strong>иртуальный режим распределения памяти, <strong>в</strong> котором каждому<br />

приложению <strong>в</strong>ыделяется как бы с<strong>в</strong>ой собст<strong>в</strong>енный компьютер —<br />

<strong>в</strong>иртуаль<strong>на</strong>я маши<strong>на</strong> со <strong>в</strong>семи ресурсами;<br />

• программ<strong>на</strong>я со<strong>в</strong>местимость при обмене данными между<br />

приложениями.<br />

Ведущую роль <strong>в</strong> организации Windows играют ок<strong>на</strong>. С точки зрения<br />

пользо<strong>в</strong>ателя, окно — это прямоуголь<strong>на</strong>я область экра<strong>на</strong>, которая<br />

отображает ту информацию, которую приложение Windows или его часть<br />

адресует пользо<strong>в</strong>ателю. С точки зрения программиста, каждое окно — это<br />

самостоятельно сущест<strong>в</strong>ующий объект, характеристики и по<strong>в</strong>едение<br />

которого описаны <strong>в</strong> классе ок<strong>на</strong>. Любое приложение обязательно имеет<br />

гла<strong>в</strong>ное окно, играющее роль точки <strong>в</strong>хода и центра упра<strong>в</strong>ления программы.<br />

При создании ок<strong>на</strong> приложением <strong>в</strong>ыполняются специальные дейст<strong>в</strong>ия<br />

по подгото<strong>в</strong>ке к запуску <strong>в</strong> Windows. Общение приложения с пользо<strong>в</strong>ателем<br />

осущест<strong>в</strong>ляется, как пра<strong>в</strong>ило, только через ок<strong>на</strong>.<br />

Сущест<strong>в</strong>ует три осно<strong>в</strong>ных типа окон:<br />

• гла<strong>в</strong>ные родительские перекры<strong>в</strong>ающиеся ок<strong>на</strong>;<br />

• <strong>в</strong>спомогательные <strong>в</strong>сплы<strong>в</strong>ающие ок<strong>на</strong> диалога;<br />

• дочерние ок<strong>на</strong>, подчиненные гла<strong>в</strong>ным, <strong>в</strong> которых обычно<br />

располагаются <strong>в</strong>се элементы упра<strong>в</strong>ления.<br />

После создания необходимых окон, приложение передает упра<strong>в</strong>ление<br />

операционной системе Windows и <strong>в</strong> дальнейшем, <strong>в</strong>плоть до за<strong>в</strong>ершения<br />

работы, Windows <strong>в</strong>оз<strong>в</strong>ращает ему упра<strong>в</strong>ление только по специальным<br />

запросам.<br />

Ключе<strong>в</strong>ая идея организации Windows заключается <strong>в</strong> пер<strong>в</strong>ичности<br />

данных. Данные, несущие информацию об объектах, упра<strong>в</strong>ляют программой,<br />

описы<strong>в</strong>ающей по<strong>в</strong>едение этих объекто<strong>в</strong>. Модель данных реализуется <strong>в</strong><br />

Windows при помощи особого механизма сообщений. Сообщения я<strong>в</strong>ляются<br />

единст<strong>в</strong>енным средст<strong>в</strong>ом с<strong>в</strong>язи приложения и его ок<strong>на</strong> с операционной<br />

системой. Все <strong>в</strong>нешние по отношению к приложению дейст<strong>в</strong>ия таймеро<strong>в</strong>,<br />

мыши, кла<strong>в</strong>иатуры, порто<strong>в</strong> кодируются <strong>в</strong> <strong>в</strong>иде сообщений и распределяются<br />

по приложениям. Источниками сообщений служат преры<strong>в</strong>ания.


8<br />

Преры<strong>в</strong>анием <strong>на</strong>зы<strong>в</strong>ается ситуация <strong>в</strong>ременного прекращения<br />

<strong>в</strong>ыполнения операции с передачей упра<strong>в</strong>ления другой операции по<br />

<strong>в</strong>нешнему сиг<strong>на</strong>лу. Устройст<strong>в</strong>а, работающие <strong>в</strong> режиме обме<strong>на</strong> по<br />

преры<strong>в</strong>аниям (таймеры, распределители импульсо<strong>в</strong>, синхронизаторы и т.п.),<br />

<strong>в</strong>ыста<strong>в</strong>ляют требо<strong>в</strong>ания преры<strong>в</strong>ания <strong>в</strong> произ<strong>в</strong>ольные моменты <strong>в</strong>ремени,<br />

асинхронно по отношению к дейст<strong>в</strong>иям процессора. В от<strong>в</strong>ет <strong>на</strong> требо<strong>в</strong>ание<br />

преры<strong>в</strong>ания <strong>в</strong>ыполняется:<br />

• идентификация источника преры<strong>в</strong>ания;<br />

• запоми<strong>на</strong>ние текущего состояния прер<strong>в</strong>анного процесса;<br />

• маскиро<strong>в</strong>ание (запрет) по<strong>в</strong>торных преры<strong>в</strong>аний;<br />

• <strong>в</strong>ыполнение обработки преры<strong>в</strong>ания;<br />

• <strong>в</strong>осстано<strong>в</strong>ление и продолжение прер<strong>в</strong>анного процесса.<br />

По преры<strong>в</strong>аниям операцион<strong>на</strong>я система формирует соот<strong>в</strong>етст<strong>в</strong>ующие<br />

сообщения. Сообщения от таких разделяемых ресурсо<strong>в</strong> как таймер,<br />

кла<strong>в</strong>иатура или мышь, помещаются <strong>в</strong>о <strong>в</strong>ходные очереди частей приложений,<br />

имеющих или получающих фокус. Для каждого потока данных Windows<br />

организует отдельную очередь. Обслужи<strong>в</strong>аются очереди самими<br />

приложениями. При этом каждое приложение, получающее сообщения,<br />

«решает», следует ли <strong>на</strong> него реагиро<strong>в</strong>ать. Такое по<strong>в</strong>едение<br />

информационных объекто<strong>в</strong> <strong>на</strong>зы<strong>в</strong>ают событийно-упра<strong>в</strong>ляемым, или<br />

ориентиро<strong>в</strong>анным <strong>на</strong> события.<br />

Сообщения Windows <strong>в</strong>есьма разнообразны. Сущест<strong>в</strong>ует более 200<br />

<strong>в</strong>строенных идентификаторо<strong>в</strong> сообщений Windows. Обычно <strong>в</strong>ыделяют<br />

системные сообщения, сообщения упра<strong>в</strong>ления ок<strong>на</strong>ми, сообщения мыши,<br />

кла<strong>в</strong>иатуры и др. Они нера<strong>в</strong>нопра<strong>в</strong>ны и образуют сложную иерархию,<br />

причем старшие сообщения могут порождать младшие.<br />

Обрабаты<strong>в</strong>ая сообщения, Windows поддержи<strong>в</strong>ает д<strong>в</strong>а типа<br />

многозадачности: процессную и потоко<strong>в</strong>ую. Процессом <strong>на</strong>зы<strong>в</strong>ают<br />

приложение, <strong>на</strong>ходящееся <strong>в</strong> фазе <strong>в</strong>ыполнения. Процесс<strong>на</strong>я многозадачность<br />

<strong>в</strong>ыражается <strong>в</strong> том, что Windows поз<strong>в</strong>оляет одно<strong>в</strong>ременно запускать<br />

несколько приложений, разделяя между ними ресурсы компьютера, <strong>в</strong><br />

пер<strong>в</strong>ую очередь память и дисплей. Поток — это самостоятельно<br />

<strong>в</strong>ыполняемая и упра<strong>в</strong>ляемая часть приложения. Любой процесс имеет как<br />

минимум один поток и поэтому, работая <strong>в</strong> Windows, можно по отдельности<br />

<strong>в</strong>ыполнять несколько частей одной программы.<br />

Система Windows функционирует <strong>в</strong> режиме разделения <strong>в</strong>ремени. О<strong>на</strong><br />

использует схему переключения задач с а<strong>в</strong>то<strong>в</strong>ыгрузкой — <strong>в</strong>ытесняющую<br />

многозадачность, базирующуюся <strong>на</strong> <strong>в</strong>ременных к<strong>в</strong>антах. Отработа<strong>в</strong><br />

устано<strong>в</strong>ленный к<strong>в</strong>ант <strong>в</strong>ремени, задача а<strong>в</strong>томатически <strong>в</strong>ыгружается системой,<br />

и упра<strong>в</strong>ление передается следующей задаче (если тако<strong>в</strong>ая имеется). Всякий<br />

раз перед переключением с одной задачи <strong>на</strong> другую процессор сохраняет


9<br />

необходимый минимум с<strong>в</strong>едений о задаче с тем, чтобы позднее можно было<br />

<strong>в</strong>озобно<strong>в</strong>ить работу с точки преры<strong>в</strong>ания. Такая схема переключения<br />

поз<strong>в</strong>оляет операционной системе полностью контролиро<strong>в</strong>ать <strong>в</strong>се задачи и<br />

предохраняет ее от блокиро<strong>в</strong>ания какой-нибудь одной задачей, пытающейся<br />

зах<strong>в</strong>атить ресурсы.<br />

Windows упра<strong>в</strong>ляет памятью таким образом, чтобы предоста<strong>в</strong>ить<br />

ресурсам максимально большое с<strong>в</strong>ободное непреры<strong>в</strong>ное пространст<strong>в</strong>о. Для<br />

этого система регулярно уплотняет коды программ, перемещая их <strong>на</strong><br />

ос<strong>в</strong>обождающиеся места. Каждому приложению о<strong>на</strong> старается предоста<strong>в</strong>ить<br />

столько <strong>в</strong>иртуальной памяти, сколько ему требуется для нормальной работы.<br />

Если после уплотнения с<strong>в</strong>ободного пространст<strong>в</strong>а <strong>в</strong>се же не х<strong>в</strong>атает, Windows<br />

ос<strong>в</strong>обождает дополнительные ресурсы. При этом <strong>на</strong> диск <strong>в</strong>ременно<br />

<strong>в</strong>ыгружаются из памяти коды неакти<strong>в</strong>ных приложений <strong>в</strong> режиме с<strong>в</strong>опинга.<br />

Функциониро<strong>в</strong>ание Windows<br />

При <strong>в</strong>ключении компьютера операцион<strong>на</strong>я система загружается <strong>в</strong><br />

операти<strong>в</strong>ную память и формирует список необходимых для загрузки<br />

устройст<strong>в</strong> с их уникальными номерами. Затем специальный драй<strong>в</strong>ер<br />

Windows — менеджер конфигурации — запраши<strong>в</strong>ает подчиненные ему<br />

драй<strong>в</strong>еры шин о <strong>в</strong>сех об<strong>на</strong>руженных ими устройст<strong>в</strong>ах, которые требуют<br />

системных ресурсо<strong>в</strong>. Операцион<strong>на</strong>я система реализует конфигуриро<strong>в</strong>ание<br />

периферии <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ии с технологией Plug & Play. Если периферийное<br />

оборудо<strong>в</strong>ание удо<strong>в</strong>лет<strong>в</strong>оряет стандарту системной шины, порто<strong>в</strong> и устройст<strong>в</strong><br />

<strong>в</strong><strong>в</strong>ода и <strong>в</strong>ы<strong>в</strong>ода, оно заносится <strong>в</strong> специальную запись — дере<strong>в</strong>о аппаратной<br />

конфигурации, — сохраняемую <strong>в</strong> памяти. При об<strong>на</strong>ружении <strong>в</strong> соста<strong>в</strong>е<br />

компьютера устройст<strong>в</strong>, не поддержи<strong>в</strong>ающих технологию Plug & Play,<br />

Windows обращается <strong>в</strong> созданную заранее базу данных драй<strong>в</strong>еро<strong>в</strong> таких<br />

устройст<strong>в</strong>. После регистрации еще один драй<strong>в</strong>ер — арбитр ресурсо<strong>в</strong> — <strong>на</strong><br />

осно<strong>в</strong>ании дере<strong>в</strong>а аппаратной конфигурации планирует прис<strong>в</strong>оение<br />

ресурсо<strong>в</strong>. Драй<strong>в</strong>еры шин сообщают устройст<strong>в</strong>ам о доступных им ресурсах и<br />

заносят эту информацию <strong>в</strong> регистры устройст<strong>в</strong>.<br />

В дальнейшем Windows предоста<strong>в</strong>ляет подключенные ресурсы<br />

программам, требующим их использо<strong>в</strong>ания: принтеры — программам<br />

печати, CD-ROM — аудиопрограммам, модемы — почто<strong>в</strong>ым системам и т.д.<br />

Если <strong>в</strong> ходе последующей эксплуатации произойдет отказ того или иного<br />

ресурса или заме<strong>на</strong> его, операцион<strong>на</strong>я система об<strong>на</strong>ружи<strong>в</strong>ает <strong>в</strong>озникшее<br />

несоот<strong>в</strong>етст<strong>в</strong>ие и пытается его разрешить путем <strong>в</strong>осстано<strong>в</strong>ления <strong>на</strong>рушенной<br />

с<strong>в</strong>язи или подключения другого драй<strong>в</strong>ера. При любом исходе подобной<br />

операции — успешном или безуспешном — Windows информирует об этом<br />

пользо<strong>в</strong>ателя.<br />

За<strong>в</strong>ерши<strong>в</strong> подключение ресурсо<strong>в</strong>, система откры<strong>в</strong>ает программы,<br />

предписанные загрузочной процедурой, <strong>в</strong> частности — драй<strong>в</strong>еры, утилиты,


10<br />

диспетчеры и т.п. Специаль<strong>на</strong>я часть Windows — планиро<strong>в</strong>щик — для<br />

каждой открытой программы формирует очередь задач и распределяет эти<br />

очереди таким образом, чтобы <strong>в</strong>се задачи могли участ<strong>в</strong>о<strong>в</strong>ать <strong>в</strong> едином<br />

информационном процессе. Каждая самостоятель<strong>на</strong>я часть <strong>в</strong>ыполняемой<br />

программы <strong>в</strong> многозадачной операционной системе Windows ассоциируется<br />

с отдельной задачей и проектируется таким образом, что обладает<br />

способностью генериро<strong>в</strong>ать сообщения о событиях. В сообщении<br />

указы<strong>в</strong>ается источник события и его характер (щелчок, <strong>в</strong>ключение, <strong>на</strong>жатие<br />

кла<strong>в</strong>иши и т.п.).<br />

Любая задача может <strong>на</strong>ходиться <strong>в</strong> состоянии <strong>в</strong>ыполнения, если ее<br />

обслужи<strong>в</strong>ает процессор; состоянии гото<strong>в</strong>ности, когда о<strong>на</strong> ждет<br />

обслужи<strong>в</strong>ания; состоянии блокиро<strong>в</strong>ки <strong>в</strong> ожидании <strong>на</strong>ступления событий. В<br />

соот<strong>в</strong>етст<strong>в</strong>ии с очередностью, операцион<strong>на</strong>я система подключает задачам<br />

ресурсы и <strong>в</strong>ыделяет защищенное <strong>в</strong>иртуальное адресное пространст<strong>в</strong>о <strong>в</strong><br />

операти<strong>в</strong>ной памяти и <strong>на</strong> с<strong>в</strong>ободных местах магнитных <strong>на</strong>копителей. В этом<br />

пространст<strong>в</strong>е каждая задача функционирует <strong>в</strong> течение разрешенного отрезка<br />

<strong>в</strong>ремени, а по за<strong>в</strong>ершении его а<strong>в</strong>томатически <strong>в</strong>ыгружается системой из<br />

памяти, ос<strong>в</strong>обождая ресурсы следующей задаче. При этом задачи могут<br />

за<strong>в</strong>исеть друг от друга: од<strong>на</strong> из них занимается подгото<strong>в</strong>кой данных, другая<br />

их сортирует, а третья <strong>в</strong>ы<strong>в</strong>одит результаты <strong>в</strong> файл. Пока решается од<strong>на</strong><br />

задача, следующая гото<strong>в</strong>ится к <strong>в</strong>ыполнению, не занимая ресурсо<strong>в</strong>.<br />

Последо<strong>в</strong>ательность решения может быть самой разной <strong>в</strong> за<strong>в</strong>исимости от<br />

приоритета и числа задач <strong>в</strong> очереди. Очереди отдельных программ не<br />

теряются и не перепуты<strong>в</strong>аются, а планиро<strong>в</strong>щик распределяет <strong>в</strong>ремя<br />

центрального процессора так, чтобы обеспечить его оптимальную загрузку.<br />

В ходе <strong>в</strong>ыполнения одной группы задач, Windows может об<strong>на</strong>ружить<br />

но<strong>в</strong>ую программу, требующую <strong>в</strong>ыделения ресурсо<strong>в</strong>. Для такой программы<br />

операцион<strong>на</strong>я система формирует но<strong>в</strong>ую очередь и обрабаты<strong>в</strong>ает ее <strong>на</strong>ряду с<br />

другими <strong>в</strong>о <strong>в</strong>но<strong>в</strong>ь <strong>в</strong>ыделенном адресном пространст<strong>в</strong>е. Выделяя отдельное<br />

пространст<strong>в</strong>о каждой задаче, система исключает их конфликты. Но<br />

сущест<strong>в</strong>уют программы, которые из<strong>на</strong>чально не спроектиро<strong>в</strong>аны для<br />

многозадачной среды и пытаются монополизиро<strong>в</strong>ать память и ресурсы. К<br />

ним относятся, <strong>в</strong> частности, программы операционной среды MS DOS. Все<br />

задачи подобного типа Windows ста<strong>в</strong>ит <strong>в</strong> одну общую очередь и,<br />

отождест<strong>в</strong>ляя их с одной задачей, <strong>в</strong>ыделяет одно адресное пространст<strong>в</strong>о. В<br />

случае а<strong>в</strong>арийного за<strong>в</strong>ершения любой из них, <strong>в</strong>се остальные однозадачные<br />

программы приходится за<strong>в</strong>ершать <strong>в</strong>месте с а<strong>в</strong>арийной и принудительно<br />

<strong>в</strong>ыгружать из памяти.<br />

Для интеграции программ и документо<strong>в</strong> с ранее созданными<br />

программными объектами <strong>в</strong> Windows используются буфер обме<strong>на</strong>,<br />

объектное с<strong>в</strong>язы<strong>в</strong>ание и <strong>в</strong>страи<strong>в</strong>ание (OLE) и ди<strong>на</strong>мический обмен данными<br />

(DDE). Через буфер обме<strong>на</strong> <strong>в</strong>ыполняется статическое с<strong>в</strong>язы<strong>в</strong>ание данных.<br />

Технологии OLE и DDE реализуют ди<strong>на</strong>мическое <strong>в</strong>недрение и с<strong>в</strong>язы<strong>в</strong>ание,


11<br />

регламентируя пра<strong>в</strong>ила создания документо<strong>в</strong>, <strong>в</strong>ключающих <strong>в</strong> с<strong>в</strong>ой соста<strong>в</strong><br />

объекты из различных приложений. Любые данные, которые переносятся из<br />

документа, созданного с помощью одной программы (сер<strong>в</strong>ера), <strong>в</strong> документ<br />

другой программы (клиента), по терминологии OLE <strong>на</strong>зы<strong>в</strong>аются объектом.<br />

Источник такого объекта предста<strong>в</strong>ляется обычно областью экра<strong>на</strong>, которую<br />

можно <strong>в</strong>ыделить щелчком мыши, чтобы изменить ее масштаб или перенести<br />

<strong>на</strong> но<strong>в</strong>ое место. Этот же объект редактируется прямо <strong>в</strong> исходном файле<br />

после его акти<strong>в</strong>изации д<strong>в</strong>ойным щелчком. Поэтому, если <strong>в</strong>ста<strong>в</strong>ляемая<br />

информация используется <strong>в</strong> нескольких документах и <strong>в</strong>о <strong>в</strong>сех долж<strong>на</strong><br />

<strong>в</strong>ыглядеть оди<strong>на</strong>ко<strong>в</strong>о, ди<strong>на</strong>мическому <strong>в</strong>недрению и с<strong>в</strong>язы<strong>в</strong>анию<br />

целесообразно отда<strong>в</strong>ать предпочтение перед статическим. Пра<strong>в</strong>да, подоб<strong>на</strong>я<br />

с<strong>в</strong>язь может обор<strong>в</strong>аться при переносе клиента или сер<strong>в</strong>ера <strong>на</strong> но<strong>в</strong>ое место.<br />

Код каждого объекта содержит д<strong>в</strong>а особых компонента. Пер<strong>в</strong>ый из них<br />

от<strong>в</strong>ечает за отображение, а <strong>в</strong>торой — за <strong>в</strong>озможность редактиро<strong>в</strong>ания.<br />

Благодаря такой организации, пользо<strong>в</strong>атель может либо с<strong>в</strong>язы<strong>в</strong>аться с<br />

объектом из с<strong>в</strong>оего документа (link), либо <strong>в</strong>недрять его <strong>в</strong> документ (embed).<br />

При использо<strong>в</strong>ании с<strong>в</strong>язи объект хранится отдельно от документа, но после<br />

редактиро<strong>в</strong>ания <strong>в</strong> документе поя<strong>в</strong>ляется его обно<strong>в</strong>ленное изображение. Если<br />

же объект <strong>в</strong>недряется, <strong>в</strong> документе отображается его копия. Осно<strong>в</strong>ными<br />

достоинст<strong>в</strong>ами OLE я<strong>в</strong>ляются:<br />

• <strong>в</strong>озможность редактиро<strong>в</strong>ания объекта прямо <strong>в</strong> приложении;<br />

• поддержка <strong>в</strong>строенных объекто<strong>в</strong>;<br />

• <strong>в</strong>озможность уста<strong>на</strong><strong>в</strong>ли<strong>в</strong>ать с<strong>в</strong>язи между объектами, <strong>в</strong>строенными <strong>в</strong><br />

документы;<br />

• «з<strong>на</strong>ние» объектом приложения, которым он создан, и поддержка<br />

его инструментария;<br />

• <strong>в</strong>озможность редактиро<strong>в</strong>ания объекто<strong>в</strong>, подгото<strong>в</strong>ленных <strong>на</strong> разных<br />

языках, и сложных объекто<strong>в</strong>, сделанных другими разработчиками.<br />

Созда<strong>в</strong>ать <strong>в</strong>заимос<strong>в</strong>язанные приложения поз<strong>в</strong>оляет и механизм DDE.<br />

Его осно<strong>в</strong>ой я<strong>в</strong>ляется протокол, описы<strong>в</strong>ающий обмен данными между<br />

акти<strong>в</strong>ными приложениями, удобный для создания программ одно<strong>в</strong>ременной<br />

обработки одного объекта из разных приложений.<br />

Упра<strong>в</strong>ление объектами Windows<br />

Элементы упра<strong>в</strong>ления<br />

Все электронные документы и инструментальные программы Windows<br />

размещаются <strong>в</strong> файлах — имено<strong>в</strong>анных областях <strong>на</strong>копителей. Каждый файл<br />

характеризуется размером, датой создания и обно<strong>в</strong>ления, з<strong>на</strong>чком и рядом<br />

других атрибуто<strong>в</strong>. Разработчики программ и пользо<strong>в</strong>атели группируют


12<br />

файлы по тематическому или иному принципу <strong>в</strong> отдельные папки. Каждая<br />

папка — это файл, <strong>в</strong> котором зарегистриро<strong>в</strong>аны сгруппиро<strong>в</strong>анные <strong>в</strong>месте<br />

файлы. В с<strong>в</strong>ою очередь, несколько папок и файло<strong>в</strong> могут объединяться <strong>в</strong><br />

но<strong>в</strong>ые папки и т.д. На экране каждая папка и инструменталь<strong>на</strong>я программа<br />

<strong>в</strong>месте с обрабаты<strong>в</strong>аемыми документами предста<strong>в</strong>ляется <strong>в</strong> с<strong>в</strong>оем окне.<br />

Наиболее объем<strong>на</strong>я папка, <strong>в</strong> которой зарегистриро<strong>в</strong>аны <strong>в</strong>се остальные папки,<br />

электронные документы и инструментальные программы, доступные<br />

пользо<strong>в</strong>ателю, получила <strong>на</strong>з<strong>в</strong>ание Рабочего стола. В ней располагаются<br />

информационные объекты Windows - з<strong>на</strong>чки, кнопки, панели и меню. В ок<strong>на</strong>х<br />

могут <strong>на</strong>ходиться <strong>на</strong>ходится строки состояния, <strong>в</strong>кладки, поля и <strong>на</strong>дписи,<br />

переключатели и флажки, счетчики, ползунки, индикаторы и полосы<br />

прокрутки.<br />

Упра<strong>в</strong>ление информационными объектами осущест<strong>в</strong>ляется по<br />

принципу «укажи и <strong>в</strong>оздейст<strong>в</strong>уй». Кнопки дейст<strong>в</strong>уют по щелчку, а з<strong>на</strong>чки<br />

откры<strong>в</strong>аются и инициализируются кла<strong>в</strong>ишей , щелчком или<br />

д<strong>в</strong>ойным щелчком <strong>в</strong> за<strong>в</strong>исимости от <strong>на</strong>стройки интерфейса. Меню<br />

предста<strong>в</strong>ляет список доступных пользо<strong>в</strong>ателю операций. Почти каждый<br />

информационный объект Windows имеет меню. Оно может быть постоянной<br />

частью объекта с раскры<strong>в</strong>ающимися при <strong>в</strong>ыделении пунктами, либо<br />

поя<strong>в</strong>ляться <strong>в</strong> определенных ситуациях. Пер<strong>в</strong>ое обычно <strong>на</strong>зы<strong>в</strong>ают гла<strong>в</strong>ным<br />

меню, так как оно отражает <strong>в</strong>се <strong>в</strong>озможные операции <strong>на</strong>д объектом. Второе<br />

именуют контекстным меню. Оно поя<strong>в</strong>ляется <strong>в</strong> от<strong>в</strong>ет <strong>на</strong> пра<strong>в</strong>ый щелчок или<br />

кла<strong>в</strong>иатурную комби<strong>на</strong>цию , и его содержание за<strong>в</strong>исит от<br />

текущего состояния информационного объекта. Если имя <strong>в</strong>ыделенного<br />

пункта заканчи<strong>в</strong>ается многоточием, то при <strong>в</strong>ыборе меню поя<strong>в</strong>ляются<br />

уточняющие <strong>в</strong>опросы или предложения. Если имя пункта за<strong>в</strong>ершается<br />

стрелкой, то указание <strong>на</strong> него при<strong>в</strong>одит к поя<strong>в</strong>лению меню следующего<br />

уро<strong>в</strong>ня. В остальных случаях меню откры<strong>в</strong>ает <strong>в</strong>ыбранный информационный<br />

объект.<br />

Упра<strong>в</strong>ление элементами <strong>в</strong>ыполняется по событиям,<br />

трансформируемым из сообщений Windows. Событие описы<strong>в</strong>ается ссылкой<br />

<strong>на</strong> процедуру-обработчика сообщения Windows или исключительной<br />

ситуации.<br />

К осно<strong>в</strong>ным событиям Windows относятся открытие и загрузка <strong>в</strong><br />

память; изменение размеро<strong>в</strong> и акти<strong>в</strong>изация элемента упра<strong>в</strong>ления; его<br />

<strong>в</strong>ыгрузка из памяти и закрытие; щелчок, д<strong>в</strong>ойной щелчок и пра<strong>в</strong>ый щелчок<br />

мышью; <strong>на</strong>жатия кла<strong>в</strong>иш; получение и потеря фокуса объектами.<br />

С<strong>в</strong>ойст<strong>в</strong>а объекто<strong>в</strong><br />

Каждый элемент упра<strong>в</strong>ления, каждое окно и каждый файл<br />

характеризуется <strong>на</strong>бором характеристик — с<strong>в</strong>ойст<strong>в</strong>ами. Кратчайший путь к<br />

с<strong>в</strong>ойст<strong>в</strong>ам конкретного объекта лежит через контекстное меню, откры<strong>в</strong>аемое


13<br />

пра<strong>в</strong>ым щелчком по его з<strong>на</strong>чку. В меню Вид многих окон также есть пункт<br />

С<strong>в</strong>ойст<strong>в</strong>а папки, поз<strong>в</strong>оляющий пользо<strong>в</strong>ателю делать <strong>в</strong>ыбор между<br />

различными интерфейсами. Чтобы применить <strong>в</strong>ыбранную <strong>на</strong>стройку ко <strong>в</strong>сем<br />

папкам ок<strong>на</strong>, <strong>в</strong> меню Вид .С<strong>в</strong>ойст<strong>в</strong>а папки <strong>на</strong> <strong>в</strong>кладке Вид <strong>на</strong>жимается<br />

кнопка Как у текущей папки. А комплексную про<strong>в</strong>ерку и корректиро<strong>в</strong>ку<br />

с<strong>в</strong>ойст<strong>в</strong> <strong>в</strong>сей номенклатуры информационных объекто<strong>в</strong> Windows можно<br />

про<strong>в</strong>ести из меню Пуск .Настройка.<br />

Наиболее <strong>в</strong>ажные характеристики аппаратного и программного<br />

обеспечения описаны <strong>в</strong> с<strong>в</strong>ойст<strong>в</strong>ах пер<strong>в</strong>ого объекта Рабочего стола — Мой<br />

компьютер, доступных как через его контекстное меню С<strong>в</strong>ойст<strong>в</strong>а, так и<br />

через меню Пуск .Настройка .Панель упра<strong>в</strong>ления. Здесь указаны:<br />

• общие с<strong>в</strong>ойст<strong>в</strong>а компьютера — тип операционной системы,<br />

с<strong>в</strong>едения о пользо<strong>в</strong>ателе, модель процессора, размер операти<strong>в</strong>ной<br />

памяти;<br />

• информация об устройст<strong>в</strong>ах — контроллерах, адаптерах,<br />

<strong>на</strong>копителях, кла<strong>в</strong>иатуре, диско<strong>в</strong>одах, дисплее, мыши, портах,<br />

сете<strong>в</strong>ом оборудо<strong>в</strong>ании, системной аппаратуре;<br />

• с<strong>в</strong>едения о конфигурации и быстродейст<strong>в</strong>ии системы.<br />

Контекстное меню Рабочего стола откры<strong>в</strong>ает с<strong>в</strong>ое окно С<strong>в</strong>ойст<strong>в</strong>а<br />

.Экран, доступное также из меню Пуск .Настройка .Панель упра<strong>в</strong>ления.<br />

В нем можно оценить и <strong>в</strong>ыбрать фон экра<strong>на</strong>; заста<strong>в</strong>ку, обеспечи<strong>в</strong>ающую<br />

энергосберегающие функции дисплея; оформление и эффекты окон (ц<strong>в</strong>ет,<br />

размер, шрифт, з<strong>на</strong>чки); предста<strong>в</strong>ление <strong>в</strong> Интернете (стиль Web); параметры<br />

(ц<strong>в</strong>ето<strong>в</strong>ую палитру и разрешающую способность).<br />

В ходе комплексной про<strong>в</strong>ерки и корректиро<strong>в</strong>ки с<strong>в</strong>ойст<strong>в</strong><br />

информационных объекто<strong>в</strong> (меню Пуск .Настройка .Панель упра<strong>в</strong>ления)<br />

уточняются дата и <strong>в</strong>ремя; язык и стандарты <strong>на</strong> числа и денежные единицы;<br />

параметры кла<strong>в</strong>иатуры; конфигурация драй<strong>в</strong>ера мыши и скорость указателя;<br />

состояние источника питания; специальные <strong>в</strong>озможности кла<strong>в</strong>иатуры,<br />

з<strong>в</strong>уко<strong>в</strong>ого сопро<strong>в</strong>ождения, экра<strong>на</strong>, мыши. В с<strong>в</strong>едениях о <strong>на</strong>копителях<br />

присутст<strong>в</strong>уют их емкость и степень заполнения, даты про<strong>в</strong>ерки и<br />

дефрагментации, рекомендации по улучшению характеристик. Инструменты<br />

форматиро<strong>в</strong>ания <strong>на</strong>копителей присутст<strong>в</strong>уют <strong>в</strong> их контекстных меню.<br />

Для задания с<strong>в</strong>ойст<strong>в</strong> <strong>в</strong>но<strong>в</strong>ь подключаемых информационных ресурсо<strong>в</strong><br />

используются мастера. С помощью их окон диалога уста<strong>на</strong><strong>в</strong>ли<strong>в</strong>аются<br />

модемы и средст<strong>в</strong>а мультимедиа, формируются рабочие группы и<br />

организуется их <strong>в</strong>заимодейст<strong>в</strong>ие. Через ок<strong>на</strong> диалога <strong>в</strong>ыполняется<br />

конфигуриро<strong>в</strong>ание сети и упра<strong>в</strong>ление доступом к ее клиентам,<br />

уста<strong>на</strong><strong>в</strong>ли<strong>в</strong>аются драй<strong>в</strong>еры но<strong>в</strong>ого оборудо<strong>в</strong>ания. Системой осущест<strong>в</strong>ляется<br />

поддержка более 800 моделей матричных, лазерных и струйных принтеро<strong>в</strong>,<br />

реализуется очередь заданий, отложен<strong>на</strong>я печать и фоно<strong>в</strong>ое упра<strong>в</strong>ление


14<br />

печатью. Мастер устано<strong>в</strong>ки и удаления программ помогает произ<strong>в</strong>ести <strong>в</strong>се<br />

необходимые операции по раз<strong>в</strong>ерты<strong>в</strong>анию и регистрации но<strong>в</strong>ых<br />

программных продукто<strong>в</strong>, а также по удалению некоторых из них. В<br />

частности, системой реализуется обно<strong>в</strong>ление компоненто<strong>в</strong> самой Windows и<br />

ее осно<strong>в</strong>ного приложения Microsoft Office. Специаль<strong>на</strong>я программа<br />

занимается просмотром и устано<strong>в</strong>кой шрифто<strong>в</strong>.<br />

Отдельный пункт меню Пуск .Настройка пос<strong>в</strong>ящен панели задач и<br />

меню Пуск. Под упра<strong>в</strong>лением мастера организации меню Пуск <strong>в</strong>ыполняется<br />

его корректиро<strong>в</strong>ка, доба<strong>в</strong>ление но<strong>в</strong>ых и удаление лишних пункто<strong>в</strong>,<br />

просматри<strong>в</strong>ается <strong>в</strong>се дере<strong>в</strong>о меню, перемещаются его уро<strong>в</strong>ни. Из этого же<br />

пункта очищается меню Пуск .Документы. При соот<strong>в</strong>етст<strong>в</strong>ующей<br />

<strong>на</strong>стройке Windows многие пункты меню Пуск могут быть перенесены или<br />

удалены из него через контекстные меню нижних уро<strong>в</strong>ней или простым<br />

перетаски<strong>в</strong>анием, <strong>в</strong> том числе — за пределы меню<br />

Макросы<br />

Многие приложения ос<strong>на</strong>щены программными средст<strong>в</strong>ами,<br />

поз<strong>в</strong>оляющими а<strong>в</strong>томатизиро<strong>в</strong>ать деятельность пользо<strong>в</strong>ателя посредст<strong>в</strong>ом<br />

записи макросо<strong>в</strong> — небольших программ, <strong>в</strong>оспроиз<strong>в</strong>одящих определенную<br />

последо<strong>в</strong>ательность дейст<strong>в</strong>ий пользо<strong>в</strong>ателя. Такими средст<strong>в</strong>ами ос<strong>на</strong>щены, <strong>в</strong><br />

частности, программные продукты Microsoft Office.<br />

Пер<strong>в</strong>ым шагом <strong>на</strong> пути создания макроса я<strong>в</strong>ляется мысленное<br />

построение такой последо<strong>в</strong>ательности, разработка и оптимизация<br />

<strong>в</strong>ыполняемых шаго<strong>в</strong>. На <strong>в</strong>тором шаге про<strong>в</strong>одится трениро<strong>в</strong>очное<br />

<strong>в</strong>ыполнение задуманных дейст<strong>в</strong>ий с помощью мыши и кла<strong>в</strong>иатуры. Затем<br />

можно приступать к записи.<br />

В Word из меню Сер<strong>в</strong>ис .Макрос .Начать запись или д<strong>в</strong>ойным<br />

щелчком по индикатору ЗАП <strong>в</strong> строке состояния откры<strong>в</strong>ается окно диалога<br />

Запись макроса, <strong>в</strong> котором <strong>на</strong>чи<strong>на</strong>ется процесс записи дейст<strong>в</strong>ий<br />

пользо<strong>в</strong>ателя. Каждое <strong>на</strong>жатие кла<strong>в</strong>иши и многие события, <strong>в</strong>ызы<strong>в</strong>аемые<br />

мышью, заносятся компьютером <strong>в</strong> память. В процессе записи можно<br />

«<strong>на</strong>учить» программу каким-либо дейст<strong>в</strong>иям, <strong>на</strong>пример, заполнению<br />

документа текстом или переносу данных <strong>на</strong> соседнюю страницу. Имеется<br />

<strong>в</strong>озможность приостано<strong>в</strong>ить запись, для чего <strong>на</strong> панели инструменто<strong>в</strong><br />

Остано<strong>в</strong>ка записи присутст<strong>в</strong>ует кнопка Пауза. Ошибочные дейст<strong>в</strong>ия<br />

отменяются кнопкой Отменить или кла<strong>в</strong>ишей . Для за<strong>в</strong>ершения<br />

записи следует <strong>на</strong>жать кнопку Остано<strong>в</strong>ить запись <strong>на</strong> панели Остано<strong>в</strong>ка<br />

записи, д<strong>в</strong>ажды щелкнуть индикатор ЗАП или <strong>в</strong>ыбрать меню Сер<strong>в</strong>ис<br />

.Макрос .Остано<strong>в</strong>ить запись. Чтобы испытать полученную программу,<br />

<strong>на</strong>до обратиться <strong>в</strong> меню Сер<strong>в</strong>ис .Макрос .Макросы, указать макрос <strong>в</strong><br />

откры<strong>в</strong>шемся окне диалога и <strong>на</strong>жать кнопку Выполнить. Неудачный или<br />

неработоспособный макрос может быть удален из документа кнопкой


15<br />

Удалить ок<strong>на</strong> диалога Макрос. Макросы можно перемещать и копиро<strong>в</strong>ать<br />

между документами и шабло<strong>на</strong>ми через окно Организатор.<br />

Другой способ записи макросо<strong>в</strong> <strong>в</strong> Word с<strong>в</strong>язан с панелями<br />

инструменто<strong>в</strong> Формы и Web-компоненты. Тексто<strong>в</strong>ое поле, Флажок, Поле<br />

со списком и другие объекты, созда<strong>в</strong>аемые с помощью этих панелей, <strong>в</strong><br />

С<strong>в</strong>ойст<strong>в</strong>ах содержат <strong>в</strong>озможность <strong>в</strong>ызо<strong>в</strong>а макросо<strong>в</strong> при <strong>в</strong>ходе и <strong>в</strong>ыходе.<br />

Подгото<strong>в</strong>ленный макрос может быть испытан не только через меню Сер<strong>в</strong>ис<br />

.Макрос .Макросы, но и щелчком по <strong>в</strong>ызы<strong>в</strong>ающему его объекту формы.<br />

Макросы удобно <strong>на</strong>з<strong>на</strong>чать кла<strong>в</strong>иатурным комби<strong>на</strong>циям. С этой целью<br />

<strong>в</strong> поле Но<strong>в</strong>ое сочетание кла<strong>в</strong>иш, откры<strong>в</strong>аемое из ок<strong>на</strong> Запись макроса,<br />

<strong>в</strong><strong>в</strong>одятся требуемые кла<strong>в</strong>иши. Многие кла<strong>в</strong>иатурные комби<strong>на</strong>ции<br />

зарезер<strong>в</strong>иро<strong>в</strong>аны <strong>в</strong> Microsoft Office. Чтобы уз<strong>на</strong>ть их, <strong>в</strong> меню Сер<strong>в</strong>ис<br />

.Макрос .Макросы <strong>в</strong>ыбирается пункт Команд Word <strong>в</strong> списке Макросы из:<br />

и <strong>на</strong>жимается кнопка Выполнить. А для подключения макроса к кнопке<br />

панели инструменто<strong>в</strong> или к пункту меню используется окно диалога<br />

Настройка. На <strong>в</strong>кладке Команды данного ок<strong>на</strong> следует <strong>в</strong>ыбрать категорию<br />

Макросы и перетащить з<strong>на</strong>чок ранее созданного макроса <strong>на</strong> одну из панелей<br />

инструменто<strong>в</strong>. Затем, не закры<strong>в</strong>ая ок<strong>на</strong> Настройка, из контекстного меню<br />

но<strong>в</strong>ой кнопки или из-под кнопки Изменить <strong>в</strong>ыделенный объект меняют<br />

з<strong>на</strong>чок или <strong>в</strong>ид кнопки или пункта меню. Лишние кнопки удаляют<br />

перетаски<strong>в</strong>анием их за пределы панели инструменто<strong>в</strong> при <strong>на</strong>жатой кла<strong>в</strong>ише<br />

или при открытом окне Настройка. С макросом можно с<strong>в</strong>язать, кроме<br />

того, поле MacroButton из меню Вста<strong>в</strong>ка .Поле.<br />

В Excel запись макросо<strong>в</strong> также <strong>на</strong>чи<strong>на</strong>ется из меню Сер<strong>в</strong>ис .Макрос<br />

.Начать запись. В процессе записи можно «<strong>на</strong>учить» программу<br />

заполнению ячеек информацией или переносу данных <strong>на</strong> соседний лист.<br />

Имеется <strong>в</strong>озможность записы<strong>в</strong>ать относительные ссылки <strong>на</strong> ячейки, для чего<br />

<strong>на</strong> панели инструменто<strong>в</strong> Остано<strong>в</strong>ка записи присутст<strong>в</strong>ует кнопка<br />

Относитель<strong>на</strong>я ссылка. За<strong>в</strong>ершение записи осущест<strong>в</strong>ляется <strong>на</strong>жатием<br />

кнопки Остано<strong>в</strong>ить запись <strong>на</strong> панели Остано<strong>в</strong>ка записи или <strong>в</strong>ыбором<br />

меню Сер<strong>в</strong>ис .Макрос .Остано<strong>в</strong>ить запись. Испытание полученной<br />

программы произ<strong>в</strong>одится из меню Сер<strong>в</strong>ис .Макрос .Макросы.<br />

Иной способ записи макросо<strong>в</strong> Excel с<strong>в</strong>язан с панелью инструменто<strong>в</strong><br />

Рисо<strong>в</strong>ание, откры<strong>в</strong>аемую через меню Вид .Панели инструменто<strong>в</strong><br />

.Рисо<strong>в</strong>ание. Любая а<strong>в</strong>тофигура, создан<strong>на</strong>я с помощью этой панели, <strong>в</strong> с<strong>в</strong>оем<br />

контекстном меню содержит пункт Наз<strong>на</strong>чить макрос, откры<strong>в</strong>ающий окно<br />

диалога Наз<strong>на</strong>чить макрос объекту. Кнопка Записать этого ок<strong>на</strong> <strong>в</strong>едет <strong>в</strong><br />

з<strong>на</strong>комое окружение Запись макроса. Подгото<strong>в</strong>ленный макрос может быть<br />

испытан как через меню Сер<strong>в</strong>ис .Макрос .Макросы, так и щелчком по<br />

<strong>в</strong>ызы<strong>в</strong>ающему его объекту.<br />

Макросы Excel можно <strong>на</strong>з<strong>на</strong>чать кла<strong>в</strong>иатурным комби<strong>на</strong>циям и<br />

пере<strong>на</strong>з<strong>на</strong>чать для <strong>в</strong>ызо<strong>в</strong>а их другими объектами и кла<strong>в</strong>ишами. Макрос<br />

можно <strong>на</strong>з<strong>на</strong>чить кнопке <strong>на</strong> панели инструменто<strong>в</strong> или меню через окно


16<br />

диалога Настройка. На <strong>в</strong>кладке Команды данного ок<strong>на</strong> <strong>в</strong> категории<br />

Макросы перетаски<strong>в</strong>ают объект Настраи<strong>в</strong>аемая кнопка <strong>на</strong> одну из<br />

панелей инструменто<strong>в</strong>. Затем <strong>в</strong> контекстном меню но<strong>в</strong>ой кнопки <strong>в</strong>ыбирают<br />

пункт Наз<strong>на</strong>чить макрос, указы<strong>в</strong>ают один из макросо<strong>в</strong> и <strong>на</strong>жимают кнопку<br />

ОК. Вместо контекстного меню можно использо<strong>в</strong>ать кнопку Изменить<br />

<strong>в</strong>ыделенный объект того же ок<strong>на</strong> Настройка. А для <strong>на</strong>з<strong>на</strong>чения макроса<br />

пункту меню, <strong>на</strong> <strong>в</strong>кладке Команды <strong>в</strong>ыбирается категория Но<strong>в</strong>ое меню, и <strong>в</strong><br />

строку меню перетаски<strong>в</strong>ается объект Но<strong>в</strong>ое меню.<br />

В Access макрос указы<strong>в</strong>ает <strong>на</strong> языке макрокоманд, какие дейст<strong>в</strong>ия<br />

следует <strong>в</strong>ыполнить <strong>в</strong> от<strong>в</strong>ет <strong>на</strong> то или иное событие.<br />

При <strong>на</strong>личии открытой базы данных Access любая группа ее макросо<strong>в</strong><br />

откры<strong>в</strong>ается с <strong>в</strong>кладки Макросы, доступной через меню Вид .Объекты<br />

базы данных .Макросы. Для открытия ок<strong>на</strong> макроса <strong>в</strong>ыделяют имя группы<br />

и <strong>на</strong>жимают кнопку Конструктор. Окно разделено <strong>на</strong> четыре столбца —<br />

Имя макроса, Усло<strong>в</strong>ие, Макрокоманда и Примечание, причем пер<strong>в</strong>ые д<strong>в</strong>а<br />

из них могут оказаться скрытыми <strong>в</strong> меню Вид .Име<strong>на</strong> макросо<strong>в</strong> и Вид<br />

.Усло<strong>в</strong>ия или под одноименными кнопками панели инструменто<strong>в</strong>.<br />

Использо<strong>в</strong>ание столбца Имя макроса необязательно, если <strong>в</strong> окне <strong>на</strong>ходится<br />

<strong>в</strong>сего один макрос. В этом случае имя ок<strong>на</strong> со<strong>в</strong>падает с именем макроса. Если<br />

же окно содержит несколько макросо<strong>в</strong>, то каждый макрос <strong>в</strong> нем обладает<br />

уникальным именем, определяемым программистом. Как пра<strong>в</strong>ило, каждая<br />

такая группа описы<strong>в</strong>ает процесс обработки событий одного объекта базы<br />

данных: формы или отчета. Ее <strong>на</strong>з<strong>на</strong>чение комментируется <strong>в</strong> столбце<br />

Примечание, который Access игнорирует при <strong>в</strong>ыполнении.<br />

Каждый макрос ассоциируется с группой макрокоманд,<br />

обрабаты<strong>в</strong>аемых од<strong>на</strong> за другой, пока Access не об<strong>на</strong>ружит строку с но<strong>в</strong>ым<br />

именем или не достигнет последней строки ок<strong>на</strong> макроса. Пустые строки<br />

игнорируются, поэтому такими строками принято разделять макросы <strong>в</strong><br />

группе для удобст<strong>в</strong>а их чтения и пра<strong>в</strong>ки. Все макрокоманды макроса<br />

перечислены <strong>в</strong> столбце Макрокоманда. После <strong>в</strong>ыделения любой из них <strong>в</strong><br />

нижней части ок<strong>на</strong> раскры<strong>в</strong>ается список аргументо<strong>в</strong>, уточняющих область<br />

з<strong>на</strong>чений и особенности <strong>в</strong>ыполнения.<br />

В столбец Усло<strong>в</strong>ие может быть занесено усло<strong>в</strong>ное <strong>в</strong>ыражение,<br />

определяющее необходимость <strong>в</strong>ыполнения макрокоманды соот<strong>в</strong>етст<strong>в</strong>ующей<br />

строки. Макрокоманда запускается только <strong>в</strong> случае <strong>в</strong>ыполнения усло<strong>в</strong>ия. В<br />

проти<strong>в</strong>ном случае Access ее пропускает. Если одним усло<strong>в</strong>ием <strong>на</strong>до<br />

запустить несколько макрокоманд, <strong>в</strong> последующих строках столбца Усло<strong>в</strong>ие<br />

располагают многоточие (…). Если запуск макрокоманды нужно произ<strong>в</strong>ести<br />

только тогда, когда усло<strong>в</strong>ие не <strong>в</strong>ыполняется, используется макрокоманда<br />

Остано<strong>в</strong>итьМакрос. Всякий раз, когда усло<strong>в</strong>ие не <strong>в</strong>ыполняется, Access<br />

переходит к <strong>в</strong>ыполнению пер<strong>в</strong>ой из макрокоманд, проти<strong>в</strong> которой нет<br />

многоточия. Макрокоманда ЗапускМакроса используется для организации<br />

цикло<strong>в</strong>. Ее аргументы указы<strong>в</strong>ают число по<strong>в</strong>торений или их усло<strong>в</strong>ия.


17<br />

Для документиро<strong>в</strong>ания макросо<strong>в</strong> создается отчет из меню Сер<strong>в</strong>ис<br />

.А<strong>на</strong>лиз .Архи<strong>в</strong>ариус.<br />

Перед программиро<strong>в</strong>анием макроса <strong>на</strong>з<strong>на</strong>чается событие, реакцию <strong>на</strong><br />

которое он должен описы<strong>в</strong>ать:<br />

Событие Имя Комментарий<br />

События мыши и кла<strong>в</strong>иатуры<br />

Д<strong>в</strong>ойной щелчок DblClick<br />

При д<strong>в</strong>ойном щелчке мышью, <strong>в</strong><br />

обрамлении событий Click<br />

Нажатие кнопки Click При щелчке ле<strong>в</strong>ой кнопкой мыши<br />

Кнопка <strong>в</strong>низ<br />

MouseDown При <strong>на</strong>жатии любой кнопки мыши<br />

Кнопка <strong>в</strong><strong>в</strong>ерх MouseUp При отпускании любой кнопки<br />

Перемещение указателя MouseMove При перед<strong>в</strong>ижении мыши<br />

Кла<strong>в</strong>иша <strong>в</strong>низ KeyDown При <strong>на</strong>жатии кла<strong>в</strong>иши кла<strong>в</strong>иатуры<br />

Кла<strong>в</strong>иша <strong>в</strong><strong>в</strong>ерх KeyUp При отпускании кла<strong>в</strong>иши<br />

Нажатие кла<strong>в</strong>иши KeyPress При <strong>на</strong>жатии сим<strong>в</strong>ольной кла<strong>в</strong>иши<br />

События ок<strong>на</strong><br />

Открытие Open До отображения данных<br />

Загрузка Load После открытия и <strong>в</strong>ы<strong>в</strong>ода данных<br />

Выгрузка<br />

UnLoad<br />

Закрытие<br />

Close<br />

Изменение размера Resize В т.ч. при пер<strong>в</strong>ом открытии формы<br />

События данных<br />

Вход Enter Перед принятием элементом фокуса<br />

Получение фокуса GotFocus После принятия элементом фокуса<br />

Выход Exit При <strong>в</strong>ыходе, но до потери фокуса<br />

Применение фильтра ApplyFilter<br />

Включение Activate Перед получением формой фокуса<br />

Отключение<br />

Deactivate<br />

Текущая запись Current Перед получением фокуса записью<br />

До <strong>в</strong>ста<strong>в</strong>ки BeforeInsert Перед обно<strong>в</strong>лением записи<br />

После <strong>в</strong>ста<strong>в</strong>ки AfterInsert После обно<strong>в</strong>ления записи<br />

Удаление<br />

Delete<br />

До подт<strong>в</strong>ерждения Del<br />

BeforeDel- Перед открытием окно диалога,<br />

Confirm подт<strong>в</strong>ерждающего удаление<br />

После подт<strong>в</strong>ерждения<br />

Del<br />

AfterDel-<br />

Confirm<br />

После закрытия ок<strong>на</strong> диалога,<br />

подт<strong>в</strong>ерждающего удаление<br />

До обно<strong>в</strong>ления<br />

Before- При <strong>в</strong>ыходе с изменением элемента,<br />

Update перед заполнением буфера записи<br />

После обно<strong>в</strong>ления AfterUpdate<br />

При <strong>в</strong>ыходе с изменением элемента,<br />

после заполнения буфера записи<br />

Изменение Change При изменении текста


18<br />

Событие Имя Комментарий<br />

При обно<strong>в</strong>лении Updated<br />

Отсутст<strong>в</strong>ие <strong>в</strong> списке NotInList<br />

При <strong>в</strong>ыходе из измененного поля со<br />

списком, перед его обно<strong>в</strong>лением<br />

Фильтрация<br />

Filter<br />

Потеря фокуса LostFocus Потеря фокуса, после события Exit<br />

Форматиро<strong>в</strong>ание Format<br />

Печать<br />

Print<br />

Воз<strong>в</strong>рат<br />

Retreat<br />

Нет данных<br />

NoDate<br />

Страница<br />

Page<br />

Таймер<br />

Timer<br />

Каждое из при<strong>в</strong>еденных <strong>в</strong> таблице событий характеризует изменение<br />

состояния объекта, сопро<strong>в</strong>ождаемое откликом Windows. В частности,<br />

события кла<strong>в</strong>иатуры и мыши сопро<strong>в</strong>ождаются преры<strong>в</strong>аниями процессо<strong>в</strong>.<br />

События ок<strong>на</strong> с<strong>в</strong>язаны с открытием и закрытием форм и отчето<strong>в</strong>. События<br />

фокуса определяют акти<strong>в</strong>ность или пасси<strong>в</strong>ность информационного объекта.<br />

События данных происходят при их изменении, а события фильтра — при<br />

отборе. События печати характеризуют режимы печати и просмотра отчето<strong>в</strong>.<br />

События ошибок и таймера передаются <strong>в</strong> формы и отчеты.<br />

Для создания макроса <strong>в</strong> открытом окне базы данных <strong>на</strong> <strong>в</strong>кладке<br />

Макрос <strong>на</strong>жимается кнопка Создать либо используется меню Вста<strong>в</strong>ка<br />

.Макрос. Проще же применить Построитель макросо<strong>в</strong> <strong>в</strong> окне<br />

Конструктора форм или Конструктора отчето<strong>в</strong>. Для этого <strong>в</strong>ыделяется<br />

нужный элемент упра<strong>в</strong>ления, <strong>в</strong>ыбирается меню Вид. С<strong>в</strong>ойст<strong>в</strong>а или<br />

<strong>на</strong>жимается кнопка С<strong>в</strong>ойст<strong>в</strong>а и <strong>в</strong> откры<strong>в</strong>шемся окне диалога <strong>в</strong>ыбирается<br />

<strong>в</strong>кладка События. На ней <strong>в</strong>ыполняется щелчок <strong>на</strong> нужном событии и<br />

кнопкой Построитель откры<strong>в</strong>ается Построитель макросо<strong>в</strong>. Можно также<br />

создать но<strong>в</strong>ое окно макроса через меню Файл .Сохранить как или кла<strong>в</strong>ишей<br />

. Для дополнения но<strong>в</strong>ым макросом сущест<strong>в</strong>ующей группы, ее<br />

откры<strong>в</strong>ают и, отступи<strong>в</strong> строку от предыдущего макроса, <strong>в</strong><strong>в</strong>одят имя но<strong>в</strong>ого.<br />

Затем со следующей строки <strong>в</strong><strong>в</strong>одятся макрокоманды, их аргументы, усло<strong>в</strong>ия<br />

и примечания. Из меню Файл .Сохранить или одноименной кнопкой панели<br />

инструменто<strong>в</strong> <strong>в</strong>ыполняется сохранение группы, после чего макрос<br />

испыты<strong>в</strong>ается.<br />

Макрокоманды, из которых формируются макросы, перечислены <strong>в</strong><br />

таблице:<br />

Макрокоманда Имя Макрокоманда Имя<br />

Копиро<strong>в</strong>атьОбъект CopyObject<br />

Остано<strong>в</strong>итьВсе<br />

Макросы<br />

StopAllMacros


19<br />

Макрокоманда Имя Макрокоманда Имя<br />

Переимено<strong>в</strong>ать Rename Выход Quit<br />

УдалитьОбъект DeleteObject ОтменитьСобытие ConcelEvent<br />

ОткрытьТаблицу OpenTable ПрименитьФильтр ApplyFilter<br />

ОткрытьЗапрос OpenQuery СледующаяЗапись FindNext<br />

ОткрытьФорму OpenForm НайтиЗапись FindRecord<br />

Панель-<br />

КЭлементу<br />

ShowToolBar<br />

Инструменто<strong>в</strong><br />

Упра<strong>в</strong>ления<br />

GoToControl<br />

ОткрытьМодуль OpenModule НаЗапись GoToRecord<br />

Закрыть Close НаСтраницу GoToPage<br />

Сохранить Save Вы<strong>в</strong>естиВФормате OutputAs<br />

Печать Print Отпра<strong>в</strong>итьОбъект SendObject<br />

Устано<strong>в</strong>ить-<br />

Преобразо<strong>в</strong>атьБазу Transfer<br />

SetWarnings<br />

Сообщения<br />

Данных<br />

Database<br />

Обно<strong>в</strong>итьОбъект RepaintObject<br />

Преобразо<strong>в</strong>ать TransfSpread<br />

ЭлТаблицу Sheet<br />

Обно<strong>в</strong>ление Require Преобразо<strong>в</strong>атьТекст TransferText<br />

ПоказатьВсеЗаписи ShowAllRecords Доба<strong>в</strong>итьМеню AddMenu<br />

ЗадатьЗ<strong>на</strong>чение SetValue ЗапускМакроса RunMacro<br />

КомандаМеню DoMenuItem<br />

Сиг<strong>на</strong>л<br />

Beep<br />

ЗапускЗапросаSQL RunSQL<br />

ЗадатьКоманду-<br />

Команды<br />

SetMenuItem<br />

Меню<br />

Кла<strong>в</strong>иатуры<br />

SendKeys<br />

ЗапускПрограммы RunCode ПесочныеЧасы Haurglass<br />

ЗапускПриложения RunApp Вы<strong>в</strong>одНаЭкран Echo<br />

Остано<strong>в</strong>итьМакрос StopMacro ВыделитьОбъект SelectObject<br />

ОткрытьОтчет OpenReport Сообщение MsgBox<br />

Для <strong>в</strong>ыбора доступной макрокоманды откры<strong>в</strong>ается список <strong>в</strong> столбце<br />

Макрокоманда либо <strong>на</strong>жимается или . Если <strong>в</strong> качест<strong>в</strong>е<br />

аргумента макрокоманды необходимо <strong>в</strong><strong>в</strong>ести имя объекта базы данных, его<br />

можно не <strong>в</strong>печаты<strong>в</strong>ать, а <strong>в</strong>ыбрать из раскры<strong>в</strong>ающегося списка. Некоторые<br />

макросы удобно <strong>в</strong><strong>в</strong>одить перетаски<strong>в</strong>анием <strong>в</strong> окно макроса объекта базы<br />

данных: таблицы, запроса, формы, отчета. При этом Access <strong>в</strong>ста<strong>в</strong>ляет строку<br />

<strong>на</strong>д ячейкой, <strong>на</strong> которой опуще<strong>на</strong> кнопка мыши, <strong>в</strong><strong>в</strong>одит макрокоманду<br />

открытия ок<strong>на</strong> объекта и а<strong>в</strong>томатически определяет его параметры. При<br />

перетаски<strong>в</strong>ании <strong>в</strong> столбец другого макроса <strong>в</strong><strong>в</strong>одится команда ЗапускМакроса<br />

с указанием его имени <strong>в</strong> строке аргумента. Если же аргумент описы<strong>в</strong>ается<br />

<strong>в</strong>ыражением, его можно описать построителем <strong>в</strong>ыражений под<br />

соот<strong>в</strong>етст<strong>в</strong>ующей кнопкой.<br />

Для удаления строки макроса <strong>в</strong>ыполняется щелчок <strong>в</strong> столбце<br />

<strong>в</strong>ыделения <strong>в</strong> ле<strong>в</strong>ой части ок<strong>на</strong> макросо<strong>в</strong> и <strong>на</strong>жимается кнопка <strong>на</strong> панели


20<br />

инструменто<strong>в</strong>, удаляющая строку. Чтобы доба<strong>в</strong>ить строку, указатель<br />

располагается <strong>в</strong> следующей строке и <strong>на</strong>жимается кла<strong>в</strong>иша или<br />

соот<strong>в</strong>етст<strong>в</strong>ующая кнопка панели инструменто<strong>в</strong>. Для <strong>в</strong>ста<strong>в</strong>ки строк <strong>в</strong>место<br />

сущест<strong>в</strong>ующих, они пред<strong>в</strong>арительно <strong>в</strong>ыделяются.<br />

Каждая макрокоманда реализует определенную операцию.<br />

Макрокоманда КомандаКла<strong>в</strong>иатуры имитирует <strong>на</strong>жатие кла<strong>в</strong>иш:<br />

{Backspace}, {Bs}, {BkSp}; {CapsLock}; {Clear}; {Delete}, {Del}; {End}; {Enter},<br />

{~}; {Escape}, {Esc}; {Help}; {Home}; {Insert};{Fn} (n = 1,.. 16); {Down}; {Left};<br />

{PgDn}; {PgUp}; {Tab}; {Up}. Вместо <strong>в</strong><strong>в</strong>одится +, <strong>в</strong>место <br />

печатают ^, а <strong>в</strong>место ста<strong>в</strong>ят %. Чтобы послать кла<strong>в</strong>иатурную<br />

комби<strong>на</strong>цию несколько раз, доба<strong>в</strong>ляется число ее по<strong>в</strong>торений, <strong>на</strong>пример<br />

{^Down 3}. Для а<strong>в</strong>томатического обно<strong>в</strong>ления данных с помощью макросо<strong>в</strong><br />

используют макрокоманды Обно<strong>в</strong>итьОбъект, Обно<strong>в</strong>ление или<br />

ПоказатьВсеЗаписи. Макрокоманда ЗадатьЗ<strong>на</strong>чение используется для<br />

инициализации элементо<strong>в</strong> таблиц, упра<strong>в</strong>ляющих объекто<strong>в</strong>, с<strong>в</strong>ойст<strong>в</strong> формы<br />

или отчета.<br />

Макрокоманда ЗапускЗапросаSQL запускает запрос <strong>на</strong> изменение с<br />

помощью соот<strong>в</strong>етст<strong>в</strong>ующего <strong>в</strong>ыражения SQL длиной до 256 сим<strong>в</strong>оло<strong>в</strong>.<br />

Кроме того, эта макрокоманда поз<strong>в</strong>оляет запустить упра<strong>в</strong>ляющий запрос.<br />

Для запуска <strong>в</strong> макросе запроса <strong>на</strong> <strong>в</strong>ыборку или перекрестного запроса<br />

следует с помощью аргумента Режим макрокоманды ОткрытьЗапрос<br />

открыть сущест<strong>в</strong>ующий запрос <strong>на</strong> <strong>в</strong>ыборку или перекрестный запрос <strong>в</strong><br />

режиме таблицы. Эта же макрокоманда поз<strong>в</strong>оляет <strong>в</strong>ыполнить сохраненные<br />

запросы <strong>на</strong> изменение и запросы SQL.<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> программиро<strong>в</strong>ание<br />

От алгоритма к программе<br />

Историю программиро<strong>в</strong>ания традиционно <strong>в</strong>едут от языка Fortran<br />

(FORmula TRANslator), ста<strong>в</strong>шего <strong>в</strong> 1957 г. пер<strong>в</strong>ым языком<br />

программиро<strong>в</strong>ания <strong>в</strong>ысокого уро<strong>в</strong>ня, не име<strong>в</strong>шим жесткой при<strong>в</strong>язки к<br />

физическим адресам <strong>в</strong>нутренних и периферийных устройст<strong>в</strong> компьютера. А<br />

<strong>в</strong> 1963 г. профессорами Дармутского колледжа Д.Кемени и Р.Куртцем были<br />

разработаны пер<strong>в</strong>ые 14 команд языка Basic. Basic (Beginner's All-purpose<br />

Symbolic Instruction Code) пер<strong>в</strong>о<strong>на</strong>чально пред<strong>на</strong>з<strong>на</strong>чался для обучения<br />

программиро<strong>в</strong>анию. В конце 60-х — <strong>на</strong>чале 70-х годо<strong>в</strong> язык получил<br />

мощную поддержку фирм General Electric, HP и DEC, и позднее<br />

практически <strong>в</strong>се мини- и микрокомпьютеры с<strong>на</strong>бжались Basic-системами.<br />

Благодаря президенту Microsoft Б.Гейтсу, Basic стал пер<strong>в</strong>ым языком<br />

программиро<strong>в</strong>ания для персо<strong>на</strong>льных компьютеро<strong>в</strong>. Язык приобрел<br />

огромную популярность <strong>в</strong>о <strong>в</strong>сем мире <strong>в</strong> силу с<strong>в</strong>оей простоты и ориентации<br />

<strong>на</strong> диалого<strong>в</strong>ый режим. Разработан стандарт минимального подмножест<strong>в</strong>а


21<br />

языка Basic, ут<strong>в</strong>ержденный <strong>в</strong> 1976 г. Сегодня <strong>на</strong>ибольшее распространение<br />

получил Visual Basic, и <strong>в</strong> пер<strong>в</strong>ую очередь — Visual Basic for Applications<br />

(<strong>VBA</strong>), обслужи<strong>в</strong>ающий <strong>в</strong>се приложения Microsoft Office.<br />

Как и <strong>в</strong>се языки <strong>в</strong>ысокого уро<strong>в</strong>ня, Basic строится <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ии с<br />

концепцией процедурного программиро<strong>в</strong>ания. Процедурный подход осно<strong>в</strong>ан<br />

<strong>на</strong> алгоритмической декомпозиции решаемой проблемы и реализуется<br />

посредст<strong>в</strong>ом решения оче<strong>в</strong>идных формализуемых задач. Пра<strong>в</strong>ило «разделяй<br />

и <strong>в</strong>ласт<strong>в</strong>уй» ориентирует <strong>на</strong> предста<strong>в</strong>ление проблемы <strong>на</strong>бором<br />

самостоятельных блоко<strong>в</strong> данных — процедур таким образом, чтобы,<br />

<strong>в</strong>ыполни<strong>в</strong> каждую из них, можно было прийти к решению <strong>в</strong>сей проблемы.<br />

«Благодаря процедурам, лучше прослежи<strong>в</strong>ается структура больших и<br />

сложных программ; они обеспечи<strong>в</strong>ают логическую сегментацию <strong>в</strong>сей задачи<br />

и облегчают отладку», ут<strong>в</strong>ерждает а<strong>в</strong>тор «Искусст<strong>в</strong>а программиро<strong>в</strong>ания»<br />

Д.Кнут.<br />

Обычно подобное разделение <strong>в</strong>ыполняется <strong>на</strong> этапе алгоритмизации —<br />

пер<strong>в</strong>ом этапе «нисходящего проектиро<strong>в</strong>ания» (top-down design). Алгоритмом<br />

<strong>в</strong> информатике принято <strong>на</strong>зы<strong>в</strong>ать систему пра<strong>в</strong>ил, предписы<strong>в</strong>ающую<br />

конечную последо<strong>в</strong>ательность дейст<strong>в</strong>ий, шаго<strong>в</strong> решения <strong>в</strong>о <strong>в</strong>ремени. Сло<strong>в</strong>о<br />

«алгоритм» произошло от имени персидского математика Al Khowarizmi,<br />

а<strong>в</strong>тора трактата об осно<strong>в</strong>ах десятичной арифметики, хотя концепция<br />

алгоритмизации родилась гораздо раньше, <strong>в</strong> 300 — 400 гг. до н.э. <strong>в</strong> трудах<br />

Е<strong>в</strong>клида.<br />

Алгоритм характеризуется рядом с<strong>в</strong>ойст<strong>в</strong>:<br />

• понятностью применительно к конкретному исполнителю —<br />

<strong>в</strong>ычислительной системе, чело<strong>в</strong>еку — и доступностью средст<strong>в</strong><br />

реализации;<br />

• массо<strong>в</strong>остью, то есть неза<strong>в</strong>исимостью от <strong>в</strong>ходных данных, что<br />

поз<strong>в</strong>оляет использо<strong>в</strong>ать один и тот же алгоритм для решения<br />

разных однотипных задач;<br />

• конечным множест<strong>в</strong>ом <strong>в</strong>ходных данных, соста<strong>в</strong>ляющих область<br />

определения алгоритма, и конечным <strong>в</strong>ыходным множест<strong>в</strong>ом, то<br />

есть областью з<strong>на</strong>чений;<br />

• конечностью решения, то есть способностью при<strong>в</strong>одить к от<strong>в</strong>ету<br />

после <strong>в</strong>ыполнения конечного числа шаго<strong>в</strong>;<br />

• одноз<strong>на</strong>чностью, то есть при<strong>в</strong>едением к одному и тому же<br />

результату при многократной подаче <strong>на</strong> <strong>в</strong>ход его одних и тех же<br />

данных.<br />

Множест<strong>в</strong>о формируемых <strong>в</strong> ходе алгоритмизации задач соста<strong>в</strong>ляется с<br />

учетом <strong>в</strong>озможной последо<strong>в</strong>ательности их обработки. И<strong>на</strong>че го<strong>в</strong>оря,<br />

проблема долж<strong>на</strong> быть хорошо продума<strong>на</strong>, прежде чем о<strong>на</strong> сможет быть<br />

реше<strong>на</strong>. Не закончи<strong>в</strong> алгоритмизации, нет смысла <strong>на</strong>чи<strong>на</strong>ть кодиро<strong>в</strong>ание,


22<br />

ибо <strong>в</strong> проти<strong>в</strong>ном случае процесс проектиро<strong>в</strong>ания теряет устойчи<strong>в</strong>ость, а<br />

<strong>на</strong>йденные решения <strong>в</strong>ряд ли удо<strong>в</strong>лет<strong>в</strong>орят поста<strong>в</strong>ленным требо<strong>в</strong>аниям.<br />

Процедуры<br />

В процедурах состояние и по<strong>в</strong>едение программных объекто<strong>в</strong><br />

описы<strong>в</strong>ается <strong>на</strong> алгоритмическом языке операциями <strong>на</strong>д данными. Данные <strong>в</strong><br />

операциях предста<strong>в</strong>ляются операндами, которые соединяются з<strong>на</strong>ками<br />

операций — специальными лексемами — операторами,<br />

зарегистриро<strong>в</strong>анными <strong>в</strong> сло<strong>в</strong>аре языка. В пер<strong>в</strong>ую очередь операциями<br />

описы<strong>в</strong>аются процессы инициализации переменных и констант, то есть<br />

прис<strong>в</strong>аи<strong>в</strong>ания им определенных з<strong>на</strong>чений. Операции описы<strong>в</strong>ают, также,<br />

логические, математические и прочие процессы.<br />

Кроме операторо<strong>в</strong>, лексемами я<strong>в</strong>ляются стандартные константы и<br />

име<strong>на</strong> стандартных функций языка программиро<strong>в</strong>ания. Обращение к<br />

стандартной функции <strong>на</strong>зы<strong>в</strong>ают <strong>в</strong>ызо<strong>в</strong>ом. Переда<strong>в</strong>аемые при <strong>в</strong>ызо<strong>в</strong>е данные<br />

для функции именуются з<strong>на</strong>чениями аргументо<strong>в</strong>, а результат их обработки<br />

— <strong>в</strong>оз<strong>в</strong>ращаемым з<strong>на</strong>чением. Стандарт<strong>на</strong>я функция обрабаты<strong>в</strong>ает<br />

переда<strong>в</strong>аемые ей з<strong>на</strong>чения аргументо<strong>в</strong> по заданному алгоритму, <strong>в</strong>оз<strong>в</strong>ращая<br />

результат <strong>в</strong> операцию, из которой о<strong>на</strong> была <strong>в</strong>ыз<strong>в</strong>а<strong>на</strong>.<br />

Операции группируют <strong>в</strong> <strong>в</strong>ыражения — а<strong>на</strong>логи предложений<br />

естест<strong>в</strong>енных языко<strong>в</strong>, строящиеся <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ии с синтаксисом языка<br />

В дополнение к <strong>в</strong>ыражениям, текст программы часто содержит<br />

комментарии, помогающие понять смысл <strong>в</strong>ыражений — их семантику.<br />

Благодаря особому синтаксису, комментарии не <strong>в</strong>лияют <strong>на</strong> ход <strong>в</strong>ыполнения<br />

программы. «Удачно подобранные и хорошо <strong>на</strong>писанные комментарии —<br />

сущест<strong>в</strong>ен<strong>на</strong>я часть программы. Но если что-то можно оформить средст<strong>в</strong>ами<br />

самого языка, следует это делать, а не <strong>в</strong><strong>в</strong>одить комментарии, ибо хорошие<br />

программы удобочитаемы сами по себе», писал а<strong>в</strong>тор языка С++ Б.<br />

Страуструп.<br />

Процедуры с <strong>в</strong>ыражениями и комментариями заключаются <strong>в</strong> файлы<br />

исходных тексто<strong>в</strong>, из которых собираются программы. Группы файло<strong>в</strong><br />

обычно объединяются проектом. Через проект поддержи<strong>в</strong>ается отношение<br />

исходных тексто<strong>в</strong> программы с операционной системой и библиотеками.<br />

Проект <strong>в</strong>ключает <strong>в</strong> себя объекты приложения, <strong>в</strong> котором он разрабаты<strong>в</strong>ается<br />

и <strong>в</strong>ыполняется. В случае Word или Excel это:<br />

• модули ThisDocument или ThisWorksheet шабло<strong>на</strong> Normal и <strong>в</strong>сех<br />

открытых документо<strong>в</strong>;<br />

• дополнительные модули с размещенными <strong>в</strong> них программными<br />

фрагментами;<br />

• модули форм для <strong>в</strong>едения диалога с пользо<strong>в</strong>ателем, описы<strong>в</strong>ающие<br />

их по<strong>в</strong>едение;


23<br />

• модули классо<strong>в</strong>, характеризующие соста<strong>в</strong>, с<strong>в</strong>ойст<strong>в</strong>а и<br />

подпрограммы а<strong>в</strong>торских объекто<strong>в</strong> разработчика.<br />

Проект хранится <strong>в</strong> одном файле с документом. В<br />

многодокументальной среде Microsoft Office можно обрабаты<strong>в</strong>ать сразу<br />

несколько документо<strong>в</strong>, предста<strong>в</strong>ленных с<strong>в</strong>оими шабло<strong>на</strong>ми.<br />

Редактор Visual Basic<br />

Программа <strong>на</strong> языке Visual Basic скрыта от пользо<strong>в</strong>ателя Microsoft<br />

Office. Для з<strong>на</strong>комст<strong>в</strong>а с текстом любого макроса и подгото<strong>в</strong>ки а<strong>в</strong>торских<br />

проекто<strong>в</strong> <strong>на</strong>до перейти со страниц документа <strong>в</strong> редактор Visual Basic.<br />

Для этого <strong>в</strong> окне Макрос <strong>в</strong>ыделяется имя макроса и <strong>на</strong>жимается<br />

кнопка Изменить. Возможен и иной способ: через меню Сер<strong>в</strong>ис .Макрос<br />

.Редактор Visual Basic () откры<strong>в</strong>ается интегриро<strong>в</strong>ан<strong>на</strong>я среда<br />

редактора — конструктор, <strong>в</strong> окне Проект которого акти<strong>в</strong>изируется<br />

требуемая Программа. Здесь же функцио<strong>на</strong>льной кла<strong>в</strong>ишей можно<br />

открыть окно Просмотр объекто<strong>в</strong> и <strong>в</strong>ыбрать модуль <strong>в</strong> его списке<br />

<strong>VBA</strong>Project.<br />

Гла<strong>в</strong>ное меню редактора Visual Basic содержит традиционные для<br />

Microsoft Office пункты Файл, Пра<strong>в</strong>ка, Вид, Вста<strong>в</strong>ка, Формат, Сер<strong>в</strong>ис,<br />

Окно, Спра<strong>в</strong>ка и но<strong>в</strong>ые пункты Отладка, Запуск. Меню Файл упра<strong>в</strong>ляет<br />

проектами, удаляя и перемещая их командами Файл .Удалить, Файл<br />

.Экспорт файла, Файл .Импорт файла. Через Вид откры<strong>в</strong>аются<br />

необходимые ок<strong>на</strong>, дополняющие ранее открытые Проект и Программу. Из<br />

меню Вста<strong>в</strong>ка проект дополняется но<strong>в</strong>ыми модулями, формами и<br />

процедурами. Упра<strong>в</strong>ление ходом <strong>в</strong>ыполнения программы осущест<strong>в</strong>ляется из<br />

меню Запуск. В меню Отладка <strong>в</strong>ходят средст<strong>в</strong>а <strong>на</strong>блюдения за данными, а<br />

Сер<strong>в</strong>ис упра<strong>в</strong>ляет ссылками, макросами, параметрами, защитой.<br />

Исходный текст предста<strong>в</strong>ляется <strong>в</strong> окне Программа. Контекстное меню<br />

ок<strong>на</strong> помогает <strong>на</strong>йти Описание акти<strong>в</strong>ной подпрограммы, а также Вернуться<br />

к последней позиции пра<strong>в</strong>ки. Под строкой заголо<strong>в</strong>ка ок<strong>на</strong> расположены д<strong>в</strong>а<br />

списка ускоренного поиска. В пер<strong>в</strong>ом из них перечисляются <strong>в</strong>се объекты<br />

модуля, а <strong>в</strong>о <strong>в</strong>тором – с<strong>в</strong>язанные с <strong>в</strong>ыбранными объектами процедуры. Сле<strong>в</strong>а<br />

от горизонтальной полосы прокрутки ок<strong>на</strong> <strong>на</strong>ходятся кнопки, упра<strong>в</strong>ляющие<br />

предста<strong>в</strong>лением <strong>в</strong>сего содержимого модуля или его отдельных<br />

соста<strong>в</strong>ляющих.<br />

Все модули имеют единую структуру и содержат раздел описаний и<br />

раздел процедур. В пер<strong>в</strong>ом даны <strong>в</strong>се устано<strong>в</strong>ки параметро<strong>в</strong> и объя<strong>в</strong>ления,<br />

касающиеся <strong>в</strong>сего модуля. Го<strong>в</strong>орят, что здесь хроанится код уро<strong>в</strong>ня модуля.<br />

Во <strong>в</strong>тором разделе описы<strong>в</strong>аются процедуры.<br />

Текст программы может быть размещен <strong>в</strong> одном или <strong>в</strong> нескольких<br />

модулях. Различают стандарные модули и модули классо<strong>в</strong>. Для создания


24<br />

стандартного модуля <strong>в</strong> окне проекта следует обратиться к меню Вста<strong>в</strong>ка<br />

.Модуль или <strong>на</strong>жать кнопку Вста<strong>в</strong>ить .Модуль <strong>на</strong> панели инструменто<strong>в</strong>. В<br />

модуль а<strong>на</strong>логичным образом (Вста<strong>в</strong>ка .Процедура) <strong>в</strong>ста<strong>в</strong>ляются шаблоны<br />

процедур. Модули классо<strong>в</strong> <strong>в</strong>страи<strong>в</strong>аются <strong>в</strong> формы. Для сохранения модулей<br />

используется меню Файл .Сохранить.<br />

Перед <strong>в</strong>ыполнением созданной или измененной программы через<br />

меню Отладка .Компилиро<strong>в</strong>ать <strong>VBA</strong>Project полезно убедиться <strong>в</strong><br />

отсутст<strong>в</strong>ии синтаксических ошибок. В случае ошибки компилятор <strong>в</strong>ы<strong>в</strong>одит<br />

<strong>на</strong> экран сообщение. При <strong>в</strong>озникно<strong>в</strong>ении проблем с устранением ошибки<br />

произ<strong>в</strong>одится отладка программы. Отладка <strong>в</strong>ыполняется <strong>в</strong> режиме<br />

преры<strong>в</strong>ания, <strong>в</strong> который можно перейти одним из следующих способо<strong>в</strong>:<br />

• <strong>на</strong>жатием кнопки Отладка <strong>в</strong> окне Сообщение об ошибке;<br />

• <strong>на</strong>жатием кла<strong>в</strong>иш <strong>в</strong> ходе работы программы;<br />

• размещением <strong>в</strong> тексте программы оператора Stop;<br />

• заданием остано<strong>в</strong>ки через меню Отладка .Точка остано<strong>в</strong>а ()<br />

или щелчком <strong>в</strong> полосе, ограничи<strong>в</strong>ающей сле<strong>в</strong>а окно программы.<br />

В режиме преры<strong>в</strong>ания можно<br />

• уз<strong>на</strong>ть з<strong>на</strong>чение переменной или с<strong>в</strong>ойст<strong>в</strong>а, под<strong>в</strong>едя к ним указатель<br />

мыши (при устано<strong>в</strong>ленном флажке Подсказки з<strong>на</strong>чений<br />

переменных <strong>в</strong> меню Сер<strong>в</strong>ис .Параметры) или через меню<br />

Отладка .Контрольное з<strong>на</strong>чение, Отладка .Доба<strong>в</strong>ить<br />

контрольное з<strong>на</strong>чение;<br />

• <strong>в</strong>ыполнить <strong>в</strong>ыражение из меню Вид .Окно отладки.<br />

Выход из режима преры<strong>в</strong>ания осущест<strong>в</strong>ляется через меню Запуск .Сброс.<br />

Выполнение программы <strong>на</strong>чи<strong>на</strong>ется из меню Запуск .Запуск<br />

программы, либо одноименной кнопкой панели Visual Basic или<br />

функцио<strong>на</strong>льной кла<strong>в</strong>ишей . Для <strong>в</strong>ызо<strong>в</strong>а макросо<strong>в</strong> из документа, их<br />

<strong>на</strong>з<strong>на</strong>чают кнопкам, полям, меню или кла<strong>в</strong>иатурным комби<strong>на</strong>циям.<br />

Некоторые особенности имеет редактор, <strong>в</strong>строенный <strong>в</strong> Access, <strong>в</strong><br />

котором гото<strong>в</strong>ятся коды модулей.<br />

Программиро<strong>в</strong>ание <strong>в</strong> Access <strong>в</strong>едется как с использо<strong>в</strong>анием макросо<strong>в</strong>,<br />

так и <strong>на</strong> базе модулей. Но по за<strong>в</strong>ершении создания приложения <strong>в</strong>се макросы<br />

целесообразно преобразо<strong>в</strong>ать <strong>в</strong> модули. Это можно <strong>в</strong>ыполнить из меню<br />

Сер<strong>в</strong>ис .Макрос .Преобразо<strong>в</strong>ать макросы или Файл. Сохранить как /<br />

экспорт переключателем В <strong>в</strong>иде модуля Visual Basic. Модули способны<br />

<strong>в</strong>ыполнять дейст<strong>в</strong>ия, недоступные макросам, реализо<strong>в</strong>ать объектные с<strong>в</strong>язи,<br />

участ<strong>в</strong>о<strong>в</strong>ать <strong>в</strong> подгото<strong>в</strong>ке печатных документо<strong>в</strong>. Как и <strong>в</strong> других офисных<br />

приложениях, <strong>в</strong> Access различают стандартные, или общие модули, и модули<br />

классо<strong>в</strong>. Язык модулей определен подключаемыми к Access библиотеками,


25<br />

конфигурацию которых при необходимости меняют из меню Сер<strong>в</strong>ис<br />

.Ссылки.<br />

Для создания стандартного модуля, доступного изо <strong>в</strong>сех форм и<br />

отчето<strong>в</strong>, <strong>в</strong> открытом окне базы данных <strong>на</strong> <strong>в</strong>кладке Модуль <strong>на</strong>жимается<br />

кнопка Создать либо <strong>на</strong> панели инструменто<strong>в</strong> под соот<strong>в</strong>етст<strong>в</strong>ующей<br />

кнопкой <strong>в</strong>ыбирается Модуль. В результате откры<strong>в</strong>ается окно конструктора<br />

модуля, <strong>в</strong> котором размещаются тексты программ. Модули классо<strong>в</strong><br />

создаются непосредст<strong>в</strong>енно <strong>в</strong> формах и отчетах и реагируют только <strong>на</strong><br />

события объекто<strong>в</strong>, к которым они относятся: форм, отчето<strong>в</strong>, элементо<strong>в</strong><br />

упра<strong>в</strong>ления. Для их построения используется Построитель кода <strong>в</strong> ок<strong>на</strong>х<br />

с<strong>в</strong>ойст<strong>в</strong> Конструктора форм или Конструктора отчето<strong>в</strong>. Для этого<br />

<strong>в</strong>ыделяется нужный объект, <strong>в</strong>ыбирается меню Вид .С<strong>в</strong>ойст<strong>в</strong>а или<br />

<strong>на</strong>жимается кнопка С<strong>в</strong>ойст<strong>в</strong>а и <strong>в</strong> откры<strong>в</strong>шемся окне <strong>в</strong>ыбирается <strong>в</strong>кладка<br />

События. На ней <strong>в</strong>ыполняется щелчок <strong>на</strong> нужном событии и кнопкой<br />

Построитель ок<strong>на</strong> с<strong>в</strong>ойст<strong>в</strong> откры<strong>в</strong>ается конструктор. Той же цели можно<br />

достичь и с помощью меню Вид .Программа или кнопки Программа<br />

панели инструменто<strong>в</strong>, доступной с <strong>в</strong>кладок Формы и Отчеты ок<strong>на</strong> базы<br />

данных.<br />

Процесс подгото<strong>в</strong>ки и отладки модулей Access не отличается от ранее<br />

описанного.<br />

Выражения<br />

Обычное <strong>в</strong>ыражение языка Visual Basic занимает отдельную строку,<br />

ограничителем которой служит непечатаемый сим<strong>в</strong>ол абзаца. Иногда <strong>в</strong><br />

одной строке объединяют несколько коротких <strong>в</strong>ыражений, соединяя их<br />

д<strong>в</strong>оеточием. Длинные же <strong>в</strong>ыражения разби<strong>в</strong>ают по строкам, используя для<br />

этого сим<strong>в</strong>ол пробела, за которым следует сим<strong>в</strong>ол подчерки<strong>в</strong>ания. Пробел<br />

() я<strong>в</strong>ляется разделителем, причем несколько пробело<strong>в</strong> считаются<br />

эк<strong>в</strong>и<strong>в</strong>алентными одному. Другими разделителями служат непечатаемые<br />

сим<strong>в</strong>олы и .<br />

Лексемы языка предста<strong>в</strong>лены <strong>в</strong> пер<strong>в</strong>ую очередь операторами.<br />

Операторы Visual Basic предста<strong>в</strong>ляют собой <strong>в</strong>ызо<strong>в</strong>ы стандартных процедур<br />

языка, а также з<strong>на</strong>ки операций. Примеры использо<strong>в</strong>ания многих операторо<strong>в</strong><br />

при<strong>в</strong>едены <strong>в</strong> таблице:<br />

Оператор Определение Пример<br />

В<strong>в</strong>од и <strong>в</strong>ы<strong>в</strong>од<br />

Input # В<strong>в</strong>од (последо<strong>в</strong>ательный) Input #1, строка, номер<br />

Line Input # В<strong>в</strong>од строки из файла Line Input #1, т1<br />

SendKeys<br />

В<strong>в</strong>од кла<strong>в</strong>иатурной<br />

комби<strong>на</strong>ции<br />

SendKeys "%{F4}", True<br />

Width Шири<strong>на</strong> поля <strong>в</strong>ы<strong>в</strong>ода Width #1, 5


26<br />

Оператор Определение Пример<br />

Математические<br />

+ Сложение y=3+2 ‘5<br />

- Вычитание, з<strong>на</strong>к y=50-30 ‘20<br />

* Умножение y=7*3 ‘21<br />

/ Деление y=7/3 ‘2.333333<br />

\ Деление <strong>на</strong>цело y=7\3 ‘2<br />

Mod Остаток y=7 Mod 3 ‘1<br />

^ Воз<strong>в</strong>едение <strong>в</strong> степень y=7^3 ‘343<br />

Строко<strong>в</strong>ые<br />

& Слияние y="sc" & "an" ‘scan<br />

! Ссылка <strong>на</strong> объект Персо<strong>на</strong>л.xls!a<br />

. С<strong>в</strong>ойст<strong>в</strong>о, метод Application.Open<br />

Rset Пра<strong>в</strong>ое <strong>в</strong>ыра<strong>в</strong>ни<strong>в</strong>ание Rset мояСтрока<br />

Сра<strong>в</strong>нение и прис<strong>в</strong>аи<strong>в</strong>ание<br />

= Прис<strong>в</strong>аи<strong>в</strong>ание а = 5<br />

:= Прис<strong>в</strong>аи<strong>в</strong>ание аргумента а := 5<br />

< Меньше 123= Больше или ра<strong>в</strong>но "тьма" >= "с<strong>в</strong>ет"<br />

Не ра<strong>в</strong>но "б""b"<br />

Логические<br />

And Логическое И True And True<br />

Or Логическое ИЛИ True Or False<br />

Not Логическое НЕ Not True<br />

Xor Исключающее ИЛИ True Xor False<br />

Eqv Эк<strong>в</strong>и<strong>в</strong>алентность False Eqv False<br />

Imp Импликация False Imp False<br />

Файло<strong>в</strong>ые<br />

Write<br />

Write #1, "при<strong>в</strong>ет"<br />

Print #<br />

Print #1, "тeст"<br />

Запись <strong>в</strong> файл<br />

Put<br />

Put #1, х, мойТест<br />

Seek<br />

Seek #1, запись<br />

ChDir Сме<strong>на</strong> папки ChDir "D:\WIN\S"<br />

ChDrive Сме<strong>на</strong> диско<strong>в</strong>ода ChDrive "D"<br />

Close Закрытие файла Close<br />

Kill Удаление файла Kill "тестФайл"<br />

MkDir Создание папки MkDir "D:\WIN\S"<br />

Name Переимено<strong>в</strong>ание Name x As y


27<br />

Оператор Определение Пример<br />

Open Открытие файла Open "тест" For Input As #1<br />

RmDir Удаление папки RmDir "тест"<br />

Прочие<br />

Beep Сиг<strong>на</strong>л Beep<br />

Call Вызо<strong>в</strong> подпрограммы Call Пример (2, 3)<br />

Const А<strong>в</strong>торская константа Const ТЕСТ<br />

Dim А<strong>в</strong>торская перемен<strong>на</strong>я Dim тест<br />

Function А<strong>в</strong>торская функция Function Тест ()<br />

Let Прис<strong>в</strong>аи<strong>в</strong>ание Let тест = "при<strong>в</strong>ет"<br />

Private Лич<strong>на</strong>я перемен<strong>на</strong>я Private тест<br />

Propety С<strong>в</strong>ойст<strong>в</strong>о Property Let Дли<strong>на</strong> ()<br />

Public Общая перемен<strong>на</strong>я Public тест<br />

Randomize<br />

Инициализация генератора<br />

случайных чисел<br />

Randomize<br />

ReDim Переобъя<strong>в</strong>ление масси<strong>в</strong>а ReDim тест (5)<br />

Rem, ‘ Комментарий Rem замечание<br />

Reset Закрытие <strong>в</strong>сех файло<strong>в</strong> Reset<br />

Resume За<strong>в</strong>ершение подпрограммы Resume<br />

Set Cсылка <strong>на</strong> объект Set тест = объект<br />

Static Статическая перемен<strong>на</strong>я Static тест<br />

Stop Остано<strong>в</strong>ка программы Stop<br />

Sub А<strong>в</strong>торская подпрограмма Sub Тест ()<br />

Type Абстрактный тип Type …End Type<br />

В следующей таблице даны примеры некоторых функций и их<br />

<strong>в</strong>ызо<strong>в</strong>о<strong>в</strong>:<br />

Функция Определение Пример<br />

В<strong>в</strong>од и <strong>в</strong>ы<strong>в</strong>од<br />

Input В<strong>в</strong>од сим<strong>в</strong>ола из файла сим<strong>в</strong>ол = Input (1, #1)<br />

InputBox Окно диалога для <strong>в</strong><strong>в</strong>ода сло<strong>в</strong>о = InputBox (сло<strong>в</strong>о1, т, Def)<br />

MsgBox Вы<strong>в</strong>од сообщения от<strong>в</strong>ет = MsgBox (сло<strong>в</strong>о1, , сло<strong>в</strong>о2)<br />

Дата и <strong>в</strong>ремя<br />

Date Текущая дата дата = Date<br />

Day День месяца день = Day (дата)<br />

Format<br />

Формат даты<br />

Msgbox Format (Now, "d mmmm<br />

yyyy г.")<br />

Hour Час суток часо<strong>в</strong> = Hour (<strong>в</strong>ремя)<br />

Minute Минута часа минут = Minute (<strong>в</strong>ремя)<br />

Month Месяц года месяц = Month (дата)


28<br />

Функция Определение Пример<br />

Now Текущие дата и <strong>в</strong>ремя сегодня = Now<br />

Time Текущее <strong>в</strong>ремя <strong>в</strong>ремя = Time<br />

Timer Число секунд с полуночи конец = Timer<br />

Year Год год = Year (дата)<br />

Математические<br />

Abs Абсолютное з<strong>на</strong>чение число = Abs (-50.3) ' 50.3<br />

Int, Fix Целая часть числа число = Fix (56.5) ' 56<br />

Sgn З<strong>на</strong>к числа з<strong>на</strong>к = Sgn (-5) ' -1<br />

Sqr К<strong>в</strong>адратный корень число = Sqr (4) ' 2<br />

Rnd Случайное число число = 6 * Rnd<br />

Строко<strong>в</strong>ые<br />

Asc Код заданного сим<strong>в</strong>ола число = Asc ("A") ' 65<br />

Chr Сим<strong>в</strong>ол заданного кода з<strong>на</strong>к = Chr (65) ' A<br />

IsNull Пустая строка сколько = IsNull (сло<strong>в</strong>о)<br />

Left Ле<strong>в</strong>ая часть строки сле<strong>в</strong>а = Left (строка, 1)<br />

Len Дли<strong>на</strong> строки дли<strong>на</strong> = Len (что)<br />

Mid Средняя часть строки среди = Mid (строка, 1, 3)<br />

Right Пра<strong>в</strong>ая часть строки спра<strong>в</strong>а = Right (строка, 1)<br />

Space Строка пробело<strong>в</strong> строка = Space (10)<br />

String По<strong>в</strong>торяющийся сим<strong>в</strong>ол строка = String (5, "*") ' *****<br />

StrComp<br />

Сра<strong>в</strong>нение строк<br />

больше = StrComp ("пер<strong>в</strong>ая",<br />

"<strong>в</strong>торая") ‘ 1<br />

Val Число<strong>в</strong>ое з<strong>на</strong>чение строки число = Val (" 2 45 7") ' 2457<br />

RGB Ц<strong>в</strong>ет красный = RGB (255, 0, 0)<br />

Файло<strong>в</strong>ые<br />

CurDir Текущая папка п = CurDir ("D") ' "D:\Word"<br />

Dir Задан<strong>на</strong>я папка папка = Dir ("C:\WIN\*.ini")<br />

EOF Конец файла Do While Not EOF (1)<br />

FileLen Размер файла дли<strong>на</strong> = FileLen ("тест")<br />

LOF Размер файла дли<strong>на</strong> = LOF (1)<br />

Err Номер ошибки номер = Err<br />

Функции <strong>VBA</strong><br />

Choose Вы<strong>в</strong>од з<strong>на</strong>чения из списка x = Choose (a, "0", "1", "2", "3")<br />

IIf<br />

З<strong>на</strong>чение <strong>в</strong> за<strong>в</strong>исимости от<br />

x = IIf (аргумент, "2000", "0")<br />

пер<strong>в</strong>ого аргумента<br />

IsArray Масси<strong>в</strong> x = IsArray (аргумент)<br />

IsDate Поле даты x = IsDate (Forms!Клиенты!День)<br />

IsEmpty Инициализиро<strong>в</strong>ано x = IsEmpty (Forms!Клиенты!День)<br />

IsError Ошибка x = IsError (Forms!Клиенты!День)<br />

IsMissing Пропуск x = IsMissing (аргумент)


29<br />

Функция Определение Пример<br />

IsNumeric Число<strong>в</strong>ое поле<br />

x = IsNumeric<br />

(Forms!Клиенты!День)<br />

IsObject Объект OLE x = IsObject (Forms!Клиенты!День)<br />

Partition Число <strong>в</strong> интер<strong>в</strong>але MsgBox Partition (a, 0, 100, 50)<br />

Switch Пер<strong>в</strong>ое <strong>в</strong>ыражение истины x = Switch (Forms!Год!День=1,"1")<br />

TypeName Имя типа данных Variant x = TypeName (a)<br />

Константы Visual Basic бы<strong>в</strong>ают число<strong>в</strong>ыми, строко<strong>в</strong>ыми, объектными.<br />

Таблица некоторых констант языка:<br />

Константа Код Определение<br />

Константы диалога<br />

vbOKOnly 0 Кнопка OK<br />

vbOKCancel 1 Кнопки OK и Отме<strong>на</strong><br />

vbAbortRetryIgnore 2<br />

Кнопки Удалить, По<strong>в</strong>торить,<br />

Пропустить<br />

vbYesNoCancel 3 Кнопки Да, Нет, Отме<strong>на</strong>.<br />

vbYesNo 4 Кнопки Да и Нет<br />

vbRetryCancel 5 Кнопки По<strong>в</strong>торить и Отме<strong>на</strong><br />

vbCritical 16 Предостережение<br />

vbQuestion 32 Вопрос<br />

vbExclamation 48 Предупреждение<br />

vbInformation 64 Информация<br />

vbDefaultButton1 0 Пер<strong>в</strong>ая кнопка по умолчанию<br />

vbDefaultButton2 256 Вторая кнопка по умолчанию<br />

vbDefaultButton3 512 Третья кнопка по умолчанию<br />

vbSystemModal 4096 Системное окно сообщений<br />

Воз<strong>в</strong>ращаемые з<strong>на</strong>чения<br />

vbOK 1 Кнопка OK<br />

vbCancel 2 Кнопка Отме<strong>на</strong><br />

vbAbort 3 Кнопка Удалить<br />

vbRetry 4 Кнопка По<strong>в</strong>торить<br />

vbIgnore 5 Кнопка Пропустить<br />

vbYes 6 Кнопка Да<br />

vbNo 7 Кнопка Нет<br />

Преобразо<strong>в</strong>ание сим<strong>в</strong>оло<strong>в</strong><br />

vbUpperCase 1 Прописные бук<strong>в</strong>ы<br />

vbLowerCase 2 Строчные бук<strong>в</strong>ы<br />

vbProperCase 3 Прописные пер<strong>в</strong>ые бук<strong>в</strong>ы


30<br />

Константа Код Определение<br />

Константы меню<br />

msoBarLeft 0 Строка меню сле<strong>в</strong>а<br />

msoBarTop 1 Строка меню с<strong>в</strong>ерху<br />

msoBarRight 2 Строка меню спра<strong>в</strong>а<br />

msoBarBottom 3 Строка меню снизу<br />

msoBarFloating 4 Пла<strong>в</strong>ающее меню<br />

msoBarPopup 5 Контекстное меню<br />

Кроме констант Visual Basic, <strong>в</strong> программах используют системные<br />

константы Yes, No, On, Off, True, False, Null.<br />

Процедурное программиро<strong>в</strong>ание<br />

Подпрограммы<br />

С точки зрения синтаксиса Visual Basic, макрос я<strong>в</strong>ляется одной из<br />

разно<strong>в</strong>идностей процедур и <strong>в</strong> тексте программы предста<strong>в</strong>ляется так:<br />

Sub имяПроцедуры( )<br />

[ Выражение<br />

… ]<br />

End Sub<br />

Здесь и далее используется с<strong>в</strong>оеобразный метаязык описания языка<br />

программиро<strong>в</strong>ания, <strong>в</strong> котором <strong>в</strong> прямоугольные скобки ([ ]) принято<br />

заключать необязательные части <strong>в</strong>ыражений, а многоточием (…) отмечается<br />

<strong>в</strong>озможность по<strong>в</strong>торения элементо<strong>в</strong> синтаксической формулы. Допустимые<br />

<strong>в</strong>арианты <strong>в</strong>ыражений будут <strong>в</strong>ыделяться маркерами (●).<br />

Операторы Sub и End Sub ограничи<strong>в</strong>ают тело макроса. Требо<strong>в</strong>анию<br />

идентичности программного объекта от<strong>в</strong>ечает имяПроцедуры: оно<br />

уникально, и ни од<strong>на</strong> процедура <strong>в</strong> проекте не может иметь имени,<br />

прис<strong>в</strong>оенного другой процедуре или лексеме. Имя <strong>на</strong>чи<strong>на</strong>ется с бук<strong>в</strong>ы.<br />

Име<strong>на</strong> процедур не содержат пробело<strong>в</strong>. Од<strong>на</strong>жды описанный макрос<br />

используется <strong>в</strong> ходе <strong>в</strong>ыполнения программы столько раз, сколько будет<br />

про<strong>в</strong>едено его <strong>в</strong>ызо<strong>в</strong>о<strong>в</strong>, т.е. по<strong>в</strong>торено его имя.<br />

Комментарий Visual Basic <strong>на</strong>чи<strong>на</strong>ется апострофом ( ' ) или оператором<br />

Rem и продолжается до конца строки. Поскольку синтаксическим<br />

а<strong>на</strong>лизатором игнорируется текст комментария, <strong>в</strong> нем могут использо<strong>в</strong>аться<br />

любые сим<strong>в</strong>олы.<br />

Обычную процедуру <strong>в</strong> Visual Basic <strong>на</strong>зы<strong>в</strong>ают подпрограммой. Макрос<br />

я<strong>в</strong>ляется частным случаем подпрограммы. Но подпрограмма, <strong>в</strong> отличие от<br />

макроса, может работать при некоторых <strong>на</strong>чальных усло<strong>в</strong>иях, если <strong>в</strong> момент


31<br />

<strong>в</strong>ызо<strong>в</strong>а ей передаются данные <strong>в</strong> <strong>в</strong>иде аргументо<strong>в</strong>. Определение<br />

подпрограммы:<br />

[операторХранения] Sub имяПодпрограммы ( [объя<strong>в</strong>лениеАргументо<strong>в</strong>] )<br />

[Выражение<br />

…]<br />

End Sub<br />

К операторам хранения относятся Const, Dim, Static, Public, Private, а<br />

объя<strong>в</strong>лениеАргументо<strong>в</strong> предста<strong>в</strong>ляет упорядоченную последо<strong>в</strong>ательность<br />

разделенных запятыми имен переменных, з<strong>на</strong>чения которых передаются <strong>в</strong><br />

процедуру. Как и макрос, од<strong>на</strong>жды описан<strong>на</strong>я подпрограмма используется <strong>в</strong><br />

ходе <strong>в</strong>ыполнения программы столько раз, сколько будет про<strong>в</strong>едено ее<br />

<strong>в</strong>ызо<strong>в</strong>о<strong>в</strong>. При <strong>в</strong>ызо<strong>в</strong>е ей списком (через запятую) передаются з<strong>на</strong>чения<br />

аргументо<strong>в</strong> <strong>в</strong> том порядке, <strong>в</strong> котором они следуют <strong>в</strong> описании. Чтобы<br />

отличать <strong>в</strong>ызо<strong>в</strong>ы а<strong>в</strong>торских подпрограмм от операторо<strong>в</strong>, можно пред<strong>в</strong>арять<br />

их оператором Call. Отсюда — несколько способо<strong>в</strong> <strong>в</strong>ызо<strong>в</strong>а подпрограмм:<br />

• [имяМодуля.] имяПодпрограммы [списокЗ<strong>на</strong>ченийАргументо<strong>в</strong>]<br />

• [Call] [имяМодуля.] имяПодпрограммы<br />

[ (списокЗ<strong>на</strong>ченийАргументо<strong>в</strong>) ]<br />

• [имяМодуля.] имяПодпрограммы<br />

имяИмено<strong>в</strong>анногоАргумента := З<strong>на</strong>чение [,…]<br />

Если имя модуля содержит пробелы, <strong>в</strong> <strong>в</strong>ызо<strong>в</strong>е оно заключается <strong>в</strong><br />

прямоугольные скобки. Имя модуля опускают при <strong>в</strong>ызо<strong>в</strong>ах подпрограмм <strong>в</strong><br />

пределах модуля.<br />

Как следует из этих синтаксических формул, <strong>в</strong>ызо<strong>в</strong> подпрограммы,<br />

которая не <strong>в</strong>оз<strong>в</strong>ращает з<strong>на</strong>чения, сопро<strong>в</strong>ождается передачей ей списка<br />

аргументо<strong>в</strong> через запятую после имени подпрограммы. Если подпрограмма<br />

<strong>в</strong>оз<strong>в</strong>ращает з<strong>на</strong>чение, список аргументо<strong>в</strong> заключается <strong>в</strong> скобки.<br />

Если среди списка аргументо<strong>в</strong> присутст<strong>в</strong>ует необязательный аргумент,<br />

его можно опускать, оста<strong>в</strong>и<strong>в</strong> запятую <strong>в</strong> списке. В конце же списка запятые<br />

пропущенных аргументо<strong>в</strong> не ста<strong>в</strong>ятся. При использо<strong>в</strong>ании оператора Call<br />

з<strong>на</strong>чения аргументо<strong>в</strong> следует заключать <strong>в</strong> скобки. Кроме списка, при <strong>в</strong>ызо<strong>в</strong>е<br />

подпрограмм могут использо<strong>в</strong>аться имено<strong>в</strong>анные аргументы, то есть<br />

аргументы с име<strong>на</strong>ми, определенными при описании процедуры. В случае<br />

такого <strong>в</strong>ызо<strong>в</strong>а <strong>в</strong>место того, чтобы зада<strong>в</strong>ать последо<strong>в</strong>ательный полный список<br />

аргументо<strong>в</strong>, можно прис<strong>в</strong>аи<strong>в</strong>ать з<strong>на</strong>чения <strong>в</strong> произ<strong>в</strong>ольном порядке через<br />

з<strong>на</strong>к :=.


32<br />

Примеры<br />

Sub ПростаяПроцедура ()<br />

' Вызы<strong>в</strong>аются один за другим д<strong>в</strong>а ранее описанных макроса<br />

Макрос1<br />

Макрос2<br />

End Sub<br />

Sub ВыделитьУдалитьТекст ()<br />

Call ВыделитьТекст ‘ Вызо<strong>в</strong> ранее описанных подпрограмм<br />

Call УдалитьТекст<br />

End Sub<br />

Sub Вста<strong>в</strong>итьПереместитьУдалитьЛист ()<br />

Вста<strong>в</strong>итьЛист 1, 2 ‘ Вызо<strong>в</strong>ы подпрограмм с аргументами<br />

Call ПереместитьЛист (1, 2)<br />

УдалитьЛист книга := 2, лист := 1<br />

End Sub<br />

Переменные и константы<br />

Пер<strong>в</strong>ые шаги <strong>в</strong> программиро<strong>в</strong>ании полезно сопро<strong>в</strong>ождать <strong>в</strong>ы<strong>в</strong>одом <strong>на</strong><br />

экран сообщений. Синтаксис сообщения имеет <strong>в</strong>ид:<br />

MsgBox [( ]Текст[,Кнопки [,Заголо<strong>в</strong>ок]] [ )]<br />

Сообщение предста<strong>в</strong>ляет собой текст <strong>в</strong> стандартном окне. Лексема MsgBox<br />

я<strong>в</strong>ляется именем функции Visual Basic, которая <strong>в</strong>ы<strong>в</strong>одит <strong>на</strong> экран текст и<br />

может <strong>в</strong>оз<strong>в</strong>ращать одну из констант, прис<strong>в</strong>оенных <strong>на</strong>жатой <strong>в</strong> окне диалога<br />

кнопке.<br />

Примеры<br />

Sub ПростоеСообщение ()<br />

MsgBox "Сообщаю, что <strong>в</strong>се <strong>в</strong> порядке"<br />

MsgBox ("Сообщаю, что <strong>в</strong>се <strong>в</strong> порядке")<br />

MsgBox "Сообщаю," & Chr (13) & "что <strong>в</strong>се <strong>в</strong> порядке"<br />

End Sub<br />

Sub ВремяДатаИПробелы ()<br />

MsgBox "Сейчас " & Now<br />

MsgBox "Сегодняшняя дата: " & Day (Date) & Space (2) _<br />

& Month (Date) & Space (2) & Year (Date)<br />

End Sub<br />

Sub КонстантаЯзыка ()<br />

MsgBox "Задание <strong>в</strong>ыполнено!", vbExclamation, "Операции с текстом"<br />

End Sub


33<br />

Переменные и а<strong>в</strong>торские константы перед использо<strong>в</strong>анием полезно<br />

объя<strong>в</strong>лять: операторХранения Имя, а по ходу программы инициализиро<strong>в</strong>ать:<br />

Имя = З<strong>на</strong>чение. При этом з<strong>на</strong>чения а<strong>в</strong>торских констант и <strong>на</strong>чальные<br />

з<strong>на</strong>чения переменных задаются оператором прис<strong>в</strong>аи<strong>в</strong>ания (=). Этот и другие<br />

операторы с<strong>в</strong>язы<strong>в</strong>ают переменные и константы друг с другом и с <strong>в</strong>ызо<strong>в</strong>ами<br />

процедур <strong>в</strong> операциях и <strong>в</strong>ыражениях. З<strong>на</strong>чения, соот<strong>в</strong>етст<strong>в</strong>ующие дате и<br />

<strong>в</strong>ремени, ограничи<strong>в</strong>аются с д<strong>в</strong>ух сторон сим<strong>в</strong>олами #.<br />

А<strong>в</strong>торские константы, не изменяющиеся <strong>в</strong> ходе <strong>в</strong>ыполнения<br />

программы, обязательно объя<strong>в</strong>ляют с оператором хранения Const. Прочие<br />

переменные можно объя<strong>в</strong>лять с оператором Dim или без объя<strong>в</strong>ления<br />

использо<strong>в</strong>ать <strong>в</strong> операциях.<br />

Объя<strong>в</strong>ленные <strong>в</strong>нутри подпрограммы локальные, или личные,<br />

переменные «<strong>в</strong>идимы» только <strong>в</strong>нутри с<strong>в</strong>оей подпрограммы, недоступны из<br />

других подпрограмм, и их з<strong>на</strong>чения другим подпрограммам неиз<strong>в</strong>естны.<br />

Поэтому <strong>в</strong> других процедурах можно созда<strong>в</strong>ать переменные с такими же<br />

име<strong>на</strong>ми. По за<strong>в</strong>ершении подпрограммы компьютер «забы<strong>в</strong>ает» их,<br />

ос<strong>в</strong>обождая память другим данным.<br />

Чтобы при по<strong>в</strong>торном <strong>в</strong>ызо<strong>в</strong>е подпрограммы лич<strong>на</strong>я перемен<strong>на</strong>я не<br />

забы<strong>в</strong>ала и <strong>в</strong>осста<strong>на</strong><strong>в</strong>ли<strong>в</strong>ала с<strong>в</strong>ое з<strong>на</strong>чение, следует объя<strong>в</strong>лять ее <strong>в</strong><br />

подпрограмме с оператором Static.<br />

Чтобы перемен<strong>на</strong>я стала «<strong>в</strong>идимой» изо <strong>в</strong>сех процедур и функций<br />

модуля, ее объя<strong>в</strong>ляют <strong>в</strong> <strong>на</strong>чальном разделе описаний модуля с оператором<br />

хранения Dim или Private, и перемен<strong>на</strong>я <strong>в</strong> этом случае <strong>на</strong>зы<strong>в</strong>ается<br />

переменной уро<strong>в</strong>ня модуля. О<strong>на</strong> «помнит» с<strong>в</strong>ое з<strong>на</strong>чение <strong>в</strong> пределах модуля <strong>в</strong><br />

течение <strong>в</strong>сего сеанса работы приложения. Перемен<strong>на</strong>я, «из<strong>в</strong>ест<strong>на</strong>я» <strong>в</strong>сей<br />

программе, неза<strong>в</strong>исимо от того, <strong>в</strong> <strong>на</strong>чале какого модуля о<strong>на</strong> объя<strong>в</strong>ле<strong>на</strong>,<br />

объя<strong>в</strong>ляется с оператором хранения Public и <strong>на</strong>зы<strong>в</strong>ается общей переменной.<br />

Наиболее простым способом <strong>в</strong><strong>в</strong>ода данных <strong>в</strong> программу служит<br />

функция языка Visual Basic<br />

InputBox (Текст [,Заголо<strong>в</strong>ок [,Умолчание [, X, Y]]] )<br />

О<strong>на</strong> позиционирует <strong>в</strong> точке X, Y экра<strong>на</strong> окно диалога с приглашением Текст<br />

и <strong>в</strong>оз<strong>в</strong>ращает <strong>в</strong><strong>в</strong>еденный <strong>в</strong> это окно от<strong>в</strong>ет пользо<strong>в</strong>ателя.<br />

Примеры<br />

Sub ТеоремаПифагора ()<br />

катет1 = 2: катет2 = 3<br />

сообщение = "Гипотенуза имеет длину "<br />

MsgBox сообщение & Sqr (катет1 ^ 2 + катет2 ^ 2)<br />

End Sub<br />

Sub Дата ()<br />

деньРождения = #2/12/69#<br />

' месяц, день, год


34<br />

MsgBox "День рождения " & Day (деньРождения) & Space (2) _<br />

& Month (деньРождения) & Space (2) & Year (деньРождения)<br />

End Sub<br />

Sub Время ()<br />

MsgBox "Сейчас " & Time<br />

переры<strong>в</strong> = #5:12:00#<br />

' часы, минуты, секунды<br />

MsgBox "Обед <strong>в</strong> " & Hour (переры<strong>в</strong>) & " часо<strong>в</strong> " & Minute (переры<strong>в</strong>) _<br />

& " минут " & Second (переры<strong>в</strong>) & " секунд"<br />

End Sub<br />

Sub Дли<strong>на</strong>Окружности ()<br />

Const pi = 3.14159<br />

радиус = 2.5<br />

MsgBox 2 * pi * радиус<br />

End Sub<br />

Sub ПлощадьКруга ()<br />

Const pi = 3.14159<br />

радиус = InputBox ("В<strong>в</strong>едите радиус")<br />

площадь = pi * радиус ^ 2<br />

MsgBox площадь<br />

End Sub<br />

Sub Кнопки ()<br />

от<strong>в</strong>ет = MsgBox ("Нажмите одну из кнопок", vbYesNo + vbQuestion, _<br />

"Да или Нет")<br />

MsgBox "Вы <strong>на</strong>жали кнопку с кодом " & от<strong>в</strong>ет<br />

End Sub<br />

Sub Возраст ()<br />

родился = InputBox ("В<strong>в</strong>едите год рождения")<br />

MsgBox "Ваш <strong>в</strong>озраст " & Year (Now) – Val (родился)<br />

End Sub<br />

Sub Вызы<strong>в</strong>ающаяПроцедура ()<br />

<strong>в</strong><strong>в</strong>едено = 5: ещеВ<strong>в</strong>едено = 10<br />

‘ Личные переменные<br />

Call Вызы<strong>в</strong>аемаяПроцедура (<strong>в</strong><strong>в</strong>едено, ещеВ<strong>в</strong>едено)<br />

Вызы<strong>в</strong>аемаяПроцедура потом:=7, с<strong>на</strong>чала:=3<br />

End Sub<br />

Sub Вызы<strong>в</strong>аемаяПроцедура (с<strong>на</strong>чала, потом)<br />

перенос = Chr (13)<br />

MsgBox Prompt := "С<strong>на</strong>чала <strong>в</strong><strong>в</strong>ели " & с<strong>на</strong>чала & перенос & "Затем " _<br />

& потом & перенос & «Всего: » & с<strong>на</strong>чала + потом<br />

End Sub<br />

Sub ЛичныеПеременные ()<br />

MsgBox "Я не з<strong>на</strong>ю з<strong>на</strong>чений переменных" & <strong>в</strong><strong>в</strong>едено & ещеВ<strong>в</strong>едено<br />

End Sub<br />

Sub ПятьВызо<strong>в</strong>о<strong>в</strong> ()<br />

Call Вызо<strong>в</strong>


35<br />

Call Вызо<strong>в</strong><br />

Call Вызо<strong>в</strong><br />

Call Вызо<strong>в</strong><br />

Call Вызо<strong>в</strong><br />

End Sub<br />

Sub Вызо<strong>в</strong> ()<br />

Static з<strong>в</strong>онок<br />

з<strong>в</strong>онок = з<strong>в</strong>онок + 1<br />

MsgBox "Вам з<strong>в</strong>онили " & з<strong>в</strong>онок & "-кратно"<br />

End Sub<br />

Dim <strong>в</strong><strong>в</strong>едено, ещеВ<strong>в</strong>едено<br />

‘ Переменные уро<strong>в</strong>ня модуля<br />

Sub Гла<strong>в</strong><strong>на</strong>я ()<br />

<strong>в</strong><strong>в</strong>едено = 5: ещеВ<strong>в</strong>едено = 10<br />

Call ПеременныеУро<strong>в</strong>няМодуля<br />

End Sub<br />

Sub ПеременныеУро<strong>в</strong>няМодуля ()<br />

MsgBox "Я з<strong>на</strong>ю з<strong>на</strong>чения переменных" & <strong>в</strong><strong>в</strong>едено & "," & ещеВ<strong>в</strong>едено<br />

End Sub<br />

Функции<br />

В тех случаях, когда требуется <strong>в</strong>ернуть результат <strong>в</strong> <strong>в</strong>ызы<strong>в</strong>ающую<br />

подпрограмму, используется особый <strong>в</strong>ид процедуры — функция.<br />

Определение а<strong>в</strong>торской функции:<br />

[операторХранения] Function имяФункции ( [объя<strong>в</strong>лениеАргументо<strong>в</strong>] )<br />

[Выражение<br />

…]<br />

[имяФункции = З<strong>на</strong>чение]<br />

End Function<br />

В тексте определения размещают <strong>в</strong>ыражение, <strong>в</strong> котором переменной,<br />

носящей имя функции, прис<strong>в</strong>аи<strong>в</strong>ают определенное з<strong>на</strong>чение. Это —<br />

<strong>в</strong>оз<strong>в</strong>ращаемое функцией з<strong>на</strong>чение.<br />

Вызо<strong>в</strong> функции не содержит оператора Call. Если от функции<br />

ожидается результат, ее аргументы заключаются <strong>в</strong> скобки, а <strong>в</strong>оз<strong>в</strong>ращаемое<br />

з<strong>на</strong>чение <strong>в</strong>ключается <strong>в</strong> операцию. В этом случае <strong>в</strong>ызо<strong>в</strong> функции<br />

предста<strong>в</strong>ляет собой только пра<strong>в</strong>ую часть <strong>в</strong>ыражения:<br />

[Оператор] [имяМодуля.] имяФункции[ (списокАргументо<strong>в</strong>) ]<br />

Фактически, <strong>в</strong> функцию передаются не сами аргументы, а их адреса.<br />

Поэтому аргументы не защищены от изменения их <strong>в</strong>нутри функции. В тех<br />

случаях, когда требуется исключить <strong>в</strong>озможность их изменения, используют


36<br />

лексему ByVal, <strong>на</strong>страи<strong>в</strong>ающую функцию <strong>на</strong> работу не с адресами, а со<br />

з<strong>на</strong>чениями аргументо<strong>в</strong>. Лексема ByRef <strong>в</strong>оз<strong>в</strong>ращает передачу ссылок <strong>на</strong><br />

адреса. А если передача аргументо<strong>в</strong> <strong>в</strong> функцию необязатель<strong>на</strong>, <strong>в</strong> списке<br />

аргументо<strong>в</strong> такой функции используются лексемы Optional и Paramarray.<br />

Примеры<br />

Sub ТеоремаПифагора ()<br />

MsgBox Sqr (СуммаК<strong>в</strong>адрато<strong>в</strong> (2, 3) )<br />

End Sub<br />

Function СуммаК<strong>в</strong>адрато<strong>в</strong> (катет1, катет2)<br />

СуммаК<strong>в</strong>адрато<strong>в</strong> = катет1 ^ 2 + катет2 ^ 2<br />

End Function<br />

Const pi = 3.14159<br />

Sub Круг ()<br />

радиус = InputBox ("В<strong>в</strong>едите радиус")<br />

дли<strong>на</strong> = РасчетДлины (радиус)<br />

радиус1 = радиус<br />

' радиус уд<strong>в</strong>оен<br />

площадь = РасчетПлощади (радиус)<br />

радиус2 = радиус<br />

' радиус не изменился<br />

MsgBox "Дли<strong>на</strong> окружности радиусом " & радиус1 & " ра<strong>в</strong><strong>на</strong> " _<br />

& дли<strong>на</strong> & Chr (13) & "Площадь круга радиусом " & _<br />

радиус2 & " ра<strong>в</strong><strong>на</strong> " & площадь<br />

End Sub<br />

Function РасчетДлины (перемен<strong>на</strong>я, Optional текст = "Уд<strong>в</strong>оенный радиус")<br />

перемен<strong>на</strong>я = перемен<strong>на</strong>я * 2 ' <strong>в</strong> расчете используется уд<strong>в</strong>оенный радиус<br />

РасчетДлины = 2 * pi * перемен<strong>на</strong>я<br />

MsgBox текст<br />

End Function<br />

Function РасчетПлощади (ByVal Перемен<strong>на</strong>я)<br />

перемен<strong>на</strong>я = перемен<strong>на</strong>я / 2 ' используется уменьшенный радиус<br />

РасчетПлощади = pi * перемен<strong>на</strong>я ^ 2<br />

End Function<br />

Файлы<br />

В Visual Basic различают три способа доступа к информации,<br />

размещенной <strong>в</strong> файлах <strong>на</strong>копителей: последо<strong>в</strong>ательный, прямой и д<strong>в</strong>оичный<br />

доступ. В пер<strong>в</strong>ом случае данные заносятся <strong>в</strong> файл и считы<strong>в</strong>аются строками,<br />

имеющими произ<strong>в</strong>ольную длину. Во <strong>в</strong>тором случае строки имеют строго<br />

фиксиро<strong>в</strong>анную длину, а запись и чтение <strong>в</strong>озможны <strong>в</strong> произ<strong>в</strong>ольном<br />

порядке. В последнем случае организуется произ<strong>в</strong>ольный доступ к данным<br />

без разби<strong>в</strong>ки их <strong>на</strong> строки.


37<br />

Для <strong>в</strong><strong>в</strong>ода информации <strong>в</strong> файл и чтения файло<strong>в</strong> последо<strong>в</strong>ательного<br />

доступа служит группа файло<strong>в</strong>ых операторо<strong>в</strong> и функций. В<strong>на</strong>чале файл<br />

откры<strong>в</strong>ается <strong>в</strong> памяти:<br />

Open имяФайла [For Input] [For Output] [For Random] _<br />

[Access Read,Write] [Read] [Write] [Защита] _<br />

As [#]Номер [Len=Дли<strong>на</strong>]<br />

Затем данные заносятся <strong>в</strong> файл или читаются из него одним из следующих<br />

<strong>в</strong>ыражений:<br />

• Print #Номер [, форматиро<strong>в</strong>анныйТекст]<br />

• Write #Номер [, неФорматиро<strong>в</strong>анныйТекст]<br />

• Line Input #Номер, Перемен<strong>на</strong>я<br />

и файл закры<strong>в</strong>ается:<br />

Close [#Номер,…]<br />

Прямой доступ поз<strong>в</strong>оляет <strong>на</strong>ходить нужные записи <strong>в</strong> файле, считы<strong>в</strong>ать<br />

и обно<strong>в</strong>лять их, не перебирая для этого <strong>в</strong>се записи. При этом оператор Open<br />

сопро<strong>в</strong>ождается лексемой Random и задает длину записи Len, то есть<br />

количест<strong>в</strong>о считы<strong>в</strong>аемых байто<strong>в</strong>: Get [#]Номер, [Запись], имяПеременной<br />

или записы<strong>в</strong>аемых байто<strong>в</strong>: Put [#]Номер, [Запись], имяПеременной<br />

Любой файл можно переимено<strong>в</strong>ать или удалить:<br />

• Name имяФайла As но<strong>в</strong>оеИмя<br />

• Kill имяФайла<br />

Примеры<br />

Sub Имя ()<br />

имяФайла = InputBox ("Файл ", "В<strong>в</strong>едите имя файла", _<br />

"мойФайл.txt", 100, 100)<br />

MsgBox имяФайла, vbInformation<br />

MsgBox Последо<strong>в</strong>ательныйДоступ (имяФайла), vbInformation<br />

End Sub<br />

Function Последо<strong>в</strong>ательныйДоступ (имяФайла)<br />

Open имяФайла For Output As 1<br />

Print #1, "Тест для записи и чтения"<br />

Close 1<br />

Open имяФайла For Input As 1<br />

Line Input #1, тест


38<br />

Close 1<br />

Последо<strong>в</strong>ательныйДоступ = тест<br />

End Function<br />

Sub ПрямойДоступ ()<br />

Open " мойФайл.txt" For Random As 1 Len = 20<br />

тест1 = "Это тест 1"<br />

тест2 = "Это тест 2"<br />

Put 1, 1, тест1<br />

Put 1, 2, тест2<br />

Close 1<br />

Open "мойФайл.txt" For Random As 1 Len = 20<br />

Get 1,2, тест<br />

Close 1<br />

MsgBox тест, vbInformation<br />

End Sub<br />

Sub Переимено<strong>в</strong>атьУдалить ()<br />

Name "мойФайл.txt" As " мойФайл.dat"<br />

MsgBox "Сейчас файл будет удален"<br />

Kill "мойФайл.dat"<br />

End Sub<br />

Структурное программиро<strong>в</strong>ание<br />

Структуры и модули<br />

Чем сложнее проектируемая система, тем меньше <strong>в</strong>озможность ее<br />

полного процедурного описания. Причи<strong>на</strong> этого заключается <strong>в</strong> самой<br />

природе объекто<strong>в</strong>, моделью которых я<strong>в</strong>ляется любая программ<strong>на</strong>я система.<br />

Модель — это <strong>в</strong>сегда односторонний, неполный, пред<strong>в</strong>зятый <strong>в</strong>згляд <strong>на</strong><br />

ориги<strong>на</strong>л. И этот <strong>в</strong>згляд меняется по мере изменения запросо<strong>в</strong> пользо<strong>в</strong>ателя,<br />

его жизненной и профессио<strong>на</strong>льной позиции, его опыта и миро<strong>в</strong>оззрения. И<br />

гла<strong>в</strong>ное, что сам объект постоянно раз<strong>в</strong>и<strong>в</strong>ается, побуждая к адек<strong>в</strong>атному<br />

раз<strong>в</strong>итию отражающие его модели.<br />

С учетом этого положения, <strong>в</strong> языке Algol <strong>в</strong>пер<strong>в</strong>ые была <strong>в</strong>недре<strong>на</strong><br />

концепция структурного программиро<strong>в</strong>ания. Следуя ее философии,<br />

предложенной Э.Дейкстрой, процесс проектиро<strong>в</strong>ания программы должен<br />

состоять из последо<strong>в</strong>ательности предста<strong>в</strong>лений алгоритма решения задачи<br />

«уро<strong>в</strong>нями абстрактных машин». В результате программа как бы<br />

разби<strong>в</strong>ается <strong>на</strong> ряд <strong>в</strong>ычислителей, из которых «<strong>в</strong>ерхний» максимально<br />

приспосабли<strong>в</strong>ается к конкретной прикладной задаче, а «нижний» <strong>в</strong>ыполняет<br />

команды алгоритмического языка.<br />

В качест<strong>в</strong>е инструмента структуризации Дейкстра <strong>в</strong><strong>в</strong>ел упра<strong>в</strong>ляющие<br />

структуры, именуемые также соста<strong>в</strong>ными операторами:


39<br />

• усло<strong>в</strong>ные операторы, <strong>на</strong>пра<strong>в</strong>ляющие ход <strong>в</strong>ычислительного<br />

процесса по одному из д<strong>в</strong>ух-трех путей <strong>в</strong> за<strong>в</strong>исимости от з<strong>на</strong>чений<br />

данных;<br />

• операторы <strong>в</strong>ыбора, <strong>на</strong>пра<strong>в</strong>ляющие ход <strong>в</strong>ычислительного процесса<br />

по одному из множест<strong>в</strong>а путей <strong>в</strong> за<strong>в</strong>исимости от з<strong>на</strong>чений данных;<br />

• операторы цикла, организующие <strong>в</strong>ычислительный процесс с<br />

заданным периодом по<strong>в</strong>торения;<br />

• операторы по<strong>в</strong>торения, упра<strong>в</strong>ляющие многократно<br />

по<strong>в</strong>торяющимися процессами.<br />

• операторы перехода, изменяющие ранее запланиро<strong>в</strong>анный ход<br />

<strong>в</strong>ычислительного процесса;<br />

В соот<strong>в</strong>етст<strong>в</strong>ии с концепцией структурного программиро<strong>в</strong>ания, каждая такая<br />

конструкция языка имеет только один <strong>в</strong>ход и один <strong>в</strong>ыход.<br />

Структурируемость реализуется, также, через типизацию данных,<br />

обосно<strong>в</strong>анную ш<strong>в</strong>ейцарским ученым Н.Виртом. Тип данных — это<br />

категория, разряд, к которому относятся те или иные данные <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ии<br />

со способом организации их <strong>в</strong> памяти компьютера. Тип конкретно<br />

характеризует размер используемой памяти, отображение информации и<br />

способы ее обработки.<br />

Структур<strong>на</strong>я концепция <strong>на</strong>иболее сильно проя<strong>в</strong>ляется <strong>в</strong> языках Ada,<br />

Modula 2, Fort, Pascal.<br />

Благодаря Вирту, программиро<strong>в</strong>ание стало не только структурным, но<br />

и модульным. Модуль<strong>на</strong>я программа обычно состоит из <strong>на</strong>бора<br />

самостоятельных раздело<strong>в</strong> или файло<strong>в</strong>. Модульность способст<strong>в</strong>ует<br />

<strong>в</strong>ыделению и разделению задач. Это у<strong>в</strong>еличи<strong>в</strong>ает <strong>на</strong>глядность, упрощая<br />

понимание программы, и делает процесс программиро<strong>в</strong>ания более<br />

систематическим и регулируемым по <strong>на</strong>растанию сложности. «Как пра<strong>в</strong>ило,<br />

сложность программы <strong>в</strong>озрастает <strong>в</strong> геометрической прогрессии с ее<br />

размером, так что разбиение программы <strong>на</strong> меньшие части дейст<strong>в</strong>ительно<br />

уменьшает усилия, необходимые для ее разработки», пишет из<strong>в</strong>естный<br />

программист Б.Бабэ. Модули «делят большую программу <strong>на</strong> упра<strong>в</strong>ляемые<br />

соста<strong>в</strong>ляющие, что поз<strong>в</strong>оляет программистам делить большие проблемы <strong>на</strong><br />

маленькие части и спра<strong>в</strong>ляться с каждой из них по очереди», поддержи<strong>в</strong>ает<br />

его другой теоретик программиро<strong>в</strong>ания Т.С<strong>в</strong>ан.<br />

Модульность проя<strong>в</strong>ляется <strong>в</strong> использо<strong>в</strong>ании библиотек при построении<br />

программ. В файлах библиотек среды программиро<strong>в</strong>ания хранятся<br />

структуры, описы<strong>в</strong>ающие заранее сформиро<strong>в</strong>анные данные или<br />

предписы<strong>в</strong>ающие определенные дейст<strong>в</strong>ия <strong>на</strong>д переменными. Типич<strong>на</strong>я<br />

библиотека предста<strong>в</strong>ляет собой специальным образом организо<strong>в</strong>анный файл,<br />

данные из которого по мере необходимости <strong>в</strong>ключаются <strong>в</strong> текст программы.<br />

Различают математические библиотеки, библиотеки системных функций<br />

доступа к услугам операционной среды, библиотеки средст<strong>в</strong> описания


40<br />

структур данных, <strong>в</strong><strong>в</strong>ода и <strong>в</strong>ы<strong>в</strong>ода. Библиотеки дают программам ряд <strong>в</strong>ажных<br />

преимущест<strong>в</strong>:<br />

• предлагая код общего <strong>на</strong>з<strong>на</strong>чения из одного источника, они<br />

сокращают <strong>в</strong>ремя разработки программ и по<strong>в</strong>ышают их<br />

<strong>на</strong>дежность;<br />

• стандартные библиотеки обеспечи<strong>в</strong>ают программы стандартным же<br />

интерфейсом;<br />

• объединение <strong>в</strong> библиотеку за<strong>в</strong>исящих от компьютера и периферии<br />

характеристик з<strong>на</strong>чительно облегчает решение задачи объединения<br />

программ с другими модулями информационной системы;<br />

• библиотеки, раз<strong>в</strong>и<strong>в</strong>ающиеся для поддержки конкретной<br />

прикладной области, снижают сложность разработки, предоста<strong>в</strong>ляя<br />

при этом ресурсы <strong>в</strong>ысокого уро<strong>в</strong>ня и качест<strong>в</strong>а.<br />

Все это делает структуриро<strong>в</strong>анные модульные программы<br />

компактными, мобильными и переносимыми из одной <strong>в</strong>ычислительной<br />

среды <strong>в</strong> другую.<br />

Соста<strong>в</strong>ные операторы<br />

Группу соста<strong>в</strong>ных операторо<strong>в</strong> — упра<strong>в</strong>ляющих структур Visual Basic<br />

— предста<strong>в</strong>ляют усло<strong>в</strong>ный оператор, оператор <strong>в</strong>ыбора, оператор цикла,<br />

операторы перехода, операторы по<strong>в</strong>торения с предусло<strong>в</strong>ием и операторы<br />

по<strong>в</strong>торения с постусло<strong>в</strong>ием.<br />

Усло<strong>в</strong>ный оператор используется для определения одного из<br />

нескольких <strong>в</strong>озможных <strong>на</strong>пра<strong>в</strong>лений <strong>в</strong>ычислительного процесса:<br />

If истинноеЛогическоеВыражение [= True] Then<br />

Выражение<br />

[…]<br />

[ElseIf истинноеЛогическоеВыражение [= True] Then<br />

Выражение<br />

… ]<br />

[Else<br />

Выражение<br />

…]<br />

End If<br />

Оператор поз<strong>в</strong>оляет <strong>в</strong>ыполнять различные дейст<strong>в</strong>ия <strong>в</strong> за<strong>в</strong>исимости от<br />

з<strong>на</strong>чения логического <strong>в</strong>ыражения. За лексемой If следует логическая<br />

операция, <strong>в</strong> итоге которой формируется з<strong>на</strong>чение либо True, либо False. Если<br />

ее результат истинен (True), то <strong>в</strong>ыполняются <strong>в</strong>се <strong>в</strong>ыражения до следующей


41<br />

после Then лексемы, и программа <strong>в</strong>ыходит из упра<strong>в</strong>ляющей структуры. Если<br />

же результат логической операции ложен (False), программа переходит за<br />

ключе<strong>в</strong>ое сло<strong>в</strong>о Else, а если оно отсутст<strong>в</strong>ует, то оста<strong>в</strong>шиеся <strong>в</strong>ыражения<br />

упра<strong>в</strong>ляющей структуры <strong>в</strong>ообще игнорируются. Глуби<strong>на</strong> <strong>в</strong>ложения<br />

операторо<strong>в</strong> не ограничи<strong>в</strong>ается.<br />

Как исключение, простые <strong>в</strong>ыражения разрешается записы<strong>в</strong>ать <strong>в</strong> одну<br />

строку без End If.<br />

Примеры<br />

Sub При<strong>в</strong>етст<strong>в</strong>ие ()<br />

пользо<strong>в</strong>атель = InputBox ("Вы кто ")<br />

If пользо<strong>в</strong>атель = "Смирно<strong>в</strong>" Then<br />

MsgBox "При<strong>в</strong>ет, " & пользо<strong>в</strong>атель<br />

End If<br />

End Sub<br />

Sub Но<strong>в</strong>оеПри<strong>в</strong>етст<strong>в</strong>ие ()<br />

пользо<strong>в</strong>атель = InputBox ("Вы кто ")<br />

If пользо<strong>в</strong>атель = "Смирно<strong>в</strong>" Then MsgBox "При<strong>в</strong>ет, " & пользо<strong>в</strong>атель _<br />

Else Beep<br />

End Sub<br />

Sub Бук<strong>в</strong>аЛиБольшаяЛи ()<br />

сим<strong>в</strong>ол = InputBox("В<strong>в</strong>едите бук<strong>в</strong>у")<br />

If Asc (сим<strong>в</strong>ол) > 63 And Asc (сим<strong>в</strong>ол) < 91 Then<br />

MsgBox "В<strong>в</strong>еде<strong>на</strong> загла<strong>в</strong><strong>на</strong>я латинская бук<strong>в</strong>а"<br />

ElseIf Asc (сим<strong>в</strong>ол) > 96 And Asc (сим<strong>в</strong>ол) < 123 Then<br />

MsgBox "В<strong>в</strong>еде<strong>на</strong> строч<strong>на</strong>я латинская бук<strong>в</strong>а"<br />

Else<br />

MsgBox "Это не латинская бук<strong>в</strong>а"<br />

End If<br />

End Sub<br />

Sub Кла<strong>в</strong>иатурныеКомби<strong>на</strong>ции ()<br />

число = Application.InputBox (prompt := "В<strong>в</strong>едите число", Type: = 1)<br />

If число Then<br />

Application.OnKey "^{RIGHT}", "Обработка"<br />

Else<br />

Application.OnKey "^{RIGHT}", ""<br />

Application.OnKey "^{RIGHT}"<br />

End If<br />

End Sub<br />

Sub Обработка ()<br />

MsgBox “Обрабаты<strong>в</strong>ается таблица”<br />

End Sub<br />

Оператор <strong>в</strong>ыбора служит для организации хода <strong>в</strong>ычислительного<br />

процесса <strong>в</strong> за<strong>в</strong>исимости от з<strong>на</strong>чения <strong>в</strong>ыражения или переменной:


42<br />

Примеры<br />

Select Case Перемен<strong>на</strong>я<br />

Case З<strong>на</strong>чение1 To З<strong>на</strong>чение2<br />

Выражение<br />

[…]<br />

[Case списокЗ<strong>на</strong>чений<br />

Выражение<br />

…]<br />

[Case логическоеВыражение<br />

Выражение<br />

…]<br />

[Case Else<br />

Выражение<br />

…]<br />

End Select<br />

Sub ВашеНастроение ()<br />

<strong>на</strong>строение = InputBox ("Как дела ")<br />

<strong>на</strong>строение = Left (Настроение, 3)<br />

Select Case <strong>на</strong>строение<br />

Case "хор", "Хор"<br />

MsgBox "Он <strong>в</strong> духе"<br />

Case "пло", "Пло"<br />

MsgBox "Он не <strong>в</strong> духе"<br />

Case Else<br />

MsgBox "Ни то, ни се"<br />

End Select<br />

End Sub<br />

Sub Оценка ()<br />

це<strong>на</strong> = InputBox ("В<strong>в</strong>едите цену")<br />

Select Case це<strong>на</strong><br />

Case 10 To 500<br />

MsgBox "Низкая це<strong>на</strong>"<br />

Case 501 To 50000<br />

MsgBox "Средняя це<strong>на</strong>"<br />

Case Is > 50000<br />

MsgBox "Высокая це<strong>на</strong>"<br />

Case Else<br />

MsgBox "Не<strong>в</strong>ерное число"<br />

End Select<br />

End Sub


43<br />

Традиционный оператор цикла организует по<strong>в</strong>торяющийся<br />

<strong>в</strong>ычислительный процесс <strong>в</strong> заданном диапазоне изменения переменнойсчетчика<br />

цикла:<br />

For Перемен<strong>на</strong>я = З<strong>на</strong>чение1 To З<strong>на</strong>чение2 [Step З<strong>на</strong>чение3]<br />

Выражение<br />

[…]<br />

Next [Перемен<strong>на</strong>я]<br />

Он поз<strong>в</strong>оляет созда<strong>в</strong>ать <strong>в</strong> программах циклы с переменной-счетчиком,<br />

ра<strong>в</strong>номерно уменьшающим или у<strong>в</strong>еличи<strong>в</strong>ающим с<strong>в</strong>ои з<strong>на</strong>чения. Перемен<strong>на</strong>я<br />

размещается после лексемы For и инициализируется <strong>на</strong>чальным з<strong>на</strong>чением.<br />

С каждым циклом о<strong>на</strong> изменяется <strong>на</strong> <strong>в</strong>еличину З<strong>на</strong>чение3 или <strong>на</strong> единицу,<br />

если Step З<strong>на</strong>чение3 опущено, до тех пор, пока з<strong>на</strong>чение переменной не<br />

достигнет конечной <strong>в</strong>еличины З<strong>на</strong>чение2.<br />

При работе с семейст<strong>в</strong>ами и коллекциями <strong>в</strong> <strong>VBA</strong> будет использо<strong>в</strong>ан<br />

еще один оператор цикла:<br />

Пример<br />

For Each Перемен<strong>на</strong>я In коллекцияОбъекто<strong>в</strong><br />

Выражение<br />

[…]<br />

Next [Перемен<strong>на</strong>я]<br />

Sub ЛатинскийАлфа<strong>в</strong>ит ()<br />

алфа<strong>в</strong>ит = ""<br />

For счет = 1 To 26<br />

алфа<strong>в</strong>ит = алфа<strong>в</strong>ит & Space(1) & Chr (счет + 64)<br />

Next счет<br />

MsgBox алфа<strong>в</strong>ит<br />

End Sub<br />

Оператор перехода Exit передает упра<strong>в</strong>ление за пределы упра<strong>в</strong>ляющей<br />

структуры. Для перехода <strong>в</strong> заданную позицию программного кода можно<br />

использо<strong>в</strong>ать оператор перехода GoTo Метка. Меткой может служить любое<br />

допустимое имя, расположенное <strong>в</strong> крайней ле<strong>в</strong>ой позиции текста и<br />

за<strong>в</strong>ершенное д<strong>в</strong>оеточием. Другой оператор перехода — On Error —<br />

обрабаты<strong>в</strong>ает ошибки: On Error GoTo Метка — переход <strong>на</strong> метку <strong>в</strong> случае<br />

ошибки; On Error Resume Next — переход <strong>на</strong> следующий оператор; On Error<br />

GoTo 0 — отключение обработчика ошибок. Если оператор On Error<br />

помещен <strong>в</strong> <strong>на</strong>чало подпрограммы, Visual Basic реагирует <strong>на</strong> ошибки,<br />

<strong>на</strong>чи<strong>на</strong>я с пер<strong>в</strong>ого <strong>в</strong>ыражения. Информацию об ошибке обычно несут<br />

с<strong>в</strong>ойст<strong>в</strong>а объекто<strong>в</strong> Err (код ошибки), Number (с<strong>в</strong>ойст<strong>в</strong>о по умолчанию,


44<br />

соот<strong>в</strong>етст<strong>в</strong>ующее номеру ошибки), Source (имя проекта), Description (строка<br />

с ошибкой), Raise (генерация ошибки), Clear (сброс <strong>в</strong>сех с<strong>в</strong>ойст<strong>в</strong> после<br />

обработки ошибок).<br />

Примеры<br />

Sub Оценки ()<br />

For Оценка = 1 To 5<br />

MsgBox Оценка<br />

If Оценка = 3 Then Exit For<br />

Next Оценка<br />

End Sub<br />

Sub СообщениеОбОшибке ()<br />

On Error GoTo сообщение<br />

Err.Clear<br />

число = InputBox ("В<strong>в</strong>едите число, и<strong>на</strong>че будет ошибка")<br />

сумма = число + 5<br />

MsgBox сумма<br />

Exit Sub<br />

сообщение:<br />

мsg = "Ошибка № " & Err.Number & " <strong>в</strong>озникла <strong>в</strong> " _<br />

& Err.Source & Chr(13) & Err.Description<br />

MsgBox мsg, vbExclamation, "Ошибка"<br />

End Sub<br />

Операторы по<strong>в</strong>торения пред<strong>на</strong>з<strong>на</strong>чены для организации<br />

<strong>в</strong>ычислительных процессо<strong>в</strong>, по<strong>в</strong>торяющихся неиз<strong>в</strong>естное заранее число раз.<br />

Различают операторы по<strong>в</strong>торения с предусло<strong>в</strong>ием и с постусло<strong>в</strong>ием:<br />

Do While истинноеЛогическоеВыражение [=True]<br />

Выражение<br />

[…]<br />

Loop<br />

Do<br />

Выражение<br />

[…]<br />

Loop While истинноеЛогическоеВыражение [=True]<br />

Do Until ложноеЛогическоеВыражение [=False]<br />

Выражение<br />

[…]<br />

Loop<br />

Do


45<br />

Выражение<br />

[…]<br />

Loop Until ложноеЛогическоеВыражение [=False]<br />

Лексема Do помечает <strong>на</strong>чало этих упра<strong>в</strong>ляющих структур. Следующие за<br />

ней <strong>в</strong>ыражения последо<strong>в</strong>ательно исполняются до лексемы Loop, а затем<br />

происходит <strong>в</strong>оз<strong>в</strong>рат к пер<strong>в</strong>ому после Do <strong>в</strong>ыражению и <strong>в</strong>се по<strong>в</strong>торяется.<br />

Образуется замкнутый цикл, и, если не принять мер, он стано<strong>в</strong>ится<br />

бесконечным. Для упра<strong>в</strong>ления <strong>в</strong>ыходом из цикла используются операторы<br />

While и Until, которые можно размещать как за оператором Do, так и за<br />

сло<strong>в</strong>ом Loop. После операторо<strong>в</strong> While и Until долж<strong>на</strong> присутст<strong>в</strong>о<strong>в</strong>ать<br />

логическая операция. Если ее результат после While соот<strong>в</strong>етст<strong>в</strong>ует истине<br />

или ложен после Until, то цикл продолжает <strong>в</strong>ыполняться. В проти<strong>в</strong>ном<br />

случае программа переходит <strong>на</strong> следующее за упра<strong>в</strong>ляющей структурой<br />

<strong>в</strong>ыражение.<br />

Допускается, также, использо<strong>в</strong>ание упра<strong>в</strong>ляющей структуры<br />

While…Wend:<br />

Примеры<br />

While ИстинноеЛогическоеВыражение [=True]<br />

Выражение<br />

[…]<br />

Wend<br />

Sub Приглашение ()<br />

Do While <strong>в</strong>сего < 100<br />

гость = InputBox ("Имя гостя ")<br />

сопро<strong>в</strong>ождающие = InputBox ("Сколько с ним чело<strong>в</strong>ек ")<br />

<strong>в</strong>сего = <strong>в</strong>сего + сопро<strong>в</strong>ождающие + 1<br />

Loop<br />

MsgBox "Больше мест нет. Последний <strong>в</strong> списке " & гость<br />

End Sub<br />

Sub ПокаНалог ()<br />

доход = InputBox ("Ваш месячный доход")<br />

процент = Ста<strong>в</strong>каНалога (доход)<br />

Do While процент = 13<br />

<strong>в</strong>сего = <strong>в</strong>сего + доход<br />

процент = Ста<strong>в</strong>каНалога (<strong>в</strong>сего)<br />

месяц = месяц + 1<br />

If месяц > 13 Then Exit Do<br />

Loop<br />

MsgBox "Минималь<strong>на</strong>я ста<strong>в</strong>ка <strong>на</strong>лога удержи<strong>в</strong>ается " & _<br />

месяц - 1 & " месяце<strong>в</strong>"<br />

End Sub


46<br />

Function Ста<strong>в</strong>каНалога (сумма)<br />

If сумма 12 Then Exit Do<br />

Loop While процент = 12<br />

MsgBox "Минималь<strong>на</strong>я ста<strong>в</strong>ка <strong>на</strong>лога удержи<strong>в</strong>ается " & _<br />

месяц - 1 & " месяце<strong>в</strong>"<br />

End Sub<br />

Sub НеОтме<strong>на</strong>Пока ()<br />

Do<br />

Beep<br />

от<strong>в</strong>ет = MsgBox ("По<strong>в</strong>торить ", vbYesNoCancel)<br />

Loop Until от<strong>в</strong>ет = vbNo<br />

End Sub<br />

Sub ПокаБук<strong>в</strong>ы ()<br />

алфа<strong>в</strong>ит = “”<br />

While Len (алфа<strong>в</strong>ит)


47<br />

Тип данных,<br />

обоз<strong>на</strong>чение<br />

Наз<strong>в</strong>ание,<br />

<strong>в</strong>еличи<strong>на</strong><br />

Long & Длинный<br />

целый<br />

Вещест<strong>в</strong>енный<br />

Single !<br />

Double #<br />

Размер (байт)<br />

Currency @ Валюта 8<br />

4<br />

4<br />

З<strong>на</strong>чения<br />

от –2147483648 до<br />

2147483647<br />

от –3,402823E38 до<br />

1,401298E45<br />

8 от –1,79E308 до 1,79E308<br />

от 0 до<br />

922337203685477.58<br />

Длинный <strong>в</strong>ещест<strong>в</strong>енный<br />

Decimal<br />

Масштабируемый<br />

целый<br />

14 от –10E28 до 10E28<br />

Date Дата, <strong>в</strong>ремя 8 от 1/1/100 до 31/12/9999.<br />

Object Объект 4 Ссылка <strong>на</strong> объект<br />

String $ Строка 1 байт <strong>на</strong> сим<strong>в</strong>ол от 0 до 2 млрд.<br />

Type Задается Сумма з<strong>на</strong>чений члено<strong>в</strong><br />

Variant<br />

Произ<strong>в</strong>ольный<br />

сим<strong>в</strong>ол<br />

16 + 1 байт <strong>на</strong><br />

Подтипы типа данных Variant<br />

vbEmpty 0 Отсутст<strong>в</strong>ует инициализация<br />

vbNull 1 Отсутст<strong>в</strong>ующие данные<br />

vbInteger 2 Целый<br />

vbLong 3 Длинный целый<br />

vbSingle 4 Вещест<strong>в</strong>енный<br />

vbDouble 5 Длинный <strong>в</strong>ещест<strong>в</strong>енный<br />

vbCurrency 6 Валюта<br />

vbDate 7 Дата<br />

vbString 8 Строка<br />

vbObject 9 Объект OLE Automation<br />

vbError 10 Ошибка<br />

vbBoolean 11 Логический<br />

vbVariant 12 Масси<strong>в</strong> произ<strong>в</strong>ольного типа<br />

vbDataObject 13 Не объект OLE Automation<br />

vbDecimal 14 Масштабируемый целый<br />

vbByte 17 Байт<br />

vbArray 8192 Масси<strong>в</strong><br />

Любое число, сим<strong>в</strong>ол<br />

При программиро<strong>в</strong>ании следует зада<strong>в</strong>ать типы данных, которые<br />

расходуют минимум памяти, но достаточны для хранения <strong>в</strong>сех требуемых<br />

з<strong>на</strong>чений данных.<br />

Если перемен<strong>на</strong>я или константа не объя<strong>в</strong>ле<strong>на</strong> или объя<strong>в</strong>ле<strong>на</strong> без<br />

указания типа, Visual Basic рассматри<strong>в</strong>ает ее как тип Variant. Variant


48<br />

я<strong>в</strong>ляется уни<strong>в</strong>ерсальным типом. Данные типа Variant могут принимать<br />

з<strong>на</strong>чения других типо<strong>в</strong>, а также Null и Empty. Null оз<strong>на</strong>чает, что данные<br />

отсутст<strong>в</strong>уют, неиз<strong>в</strong>естны или неприменимы. Он описы<strong>в</strong>ает пустые поля и<br />

элементы упра<strong>в</strong>ления. Специаль<strong>на</strong>я функция IsNull про<strong>в</strong>еряет, ра<strong>в</strong>но ли Null<br />

з<strong>на</strong>чение типа Variant. Прис<strong>в</strong>аи<strong>в</strong>ание этого з<strong>на</strong>чения может <strong>в</strong>ыполняться<br />

обычным образом: перемен<strong>на</strong>я = Null. З<strong>на</strong>чение Empty служит для<br />

резер<strong>в</strong>иро<strong>в</strong>ания памяти под неинициализиро<strong>в</strong>анную переменную типа<br />

Variant. Про<strong>в</strong>ерка <strong>в</strong>ыполняется функцией IsEmpty, и инициализация<br />

обычным образом: перемен<strong>на</strong>я = Empty. В число<strong>в</strong>ых расчетах Empty<br />

учиты<strong>в</strong>ается как нуль, а <strong>в</strong> строко<strong>в</strong>ых преобразо<strong>в</strong>аниях — как строка нуле<strong>в</strong>ой<br />

длины.<br />

Перемен<strong>на</strong>я типа Object может хранить любые объекты. У типо<strong>в</strong><br />

Object есть особое з<strong>на</strong>чение Nothing для резер<strong>в</strong>иро<strong>в</strong>ания памяти, если<br />

переменной не прис<strong>в</strong>оен объект (а<strong>на</strong>логично Empty у Variant).<br />

Инициализация этого з<strong>на</strong>чения <strong>в</strong>ыполняется традиционно: перемен<strong>на</strong>я =<br />

Nothing.<br />

Тип данных при необходимости можно уточнять оператором Set, с<br />

помощью которого данные можно соотнести с любым объектом. Таким<br />

образом удобно манипулиро<strong>в</strong>ать объектом, заменяя его имя <strong>в</strong> операциях<br />

именем переменной.<br />

Функция VarType <strong>в</strong>оз<strong>в</strong>ращает текущий тип переменной: 0 — vbEmpty,<br />

1 — vbNull, 2 — vbInteger и т.д.<br />

Примеры<br />

Sub Логика()<br />

Dim раз As Boolean, д<strong>в</strong>а As Boolean<br />

раз = 5 > 7<br />

д<strong>в</strong>а = 5 < 7<br />

MsgBox раз Or д<strong>в</strong>а<br />

раз = "Y" > "Z"<br />

д<strong>в</strong>а = "Y" < "Z"<br />

MsgBox раз And д<strong>в</strong>а<br />

End Sub<br />

Sub АлгоритмЕ<strong>в</strong>клида()<br />

' Решение задачи поиска <strong>на</strong>ибольшего общего делителя (НОД) д<strong>в</strong>ух чисел<br />

' по Е<strong>в</strong>клиду осно<strong>в</strong>ано <strong>на</strong> а<strong>на</strong>лизе пар чисел, пока они не сра<strong>в</strong>няются.<br />

Dim a As Integer, b As Integer<br />

a = InputBox ("В<strong>в</strong>едите пер<strong>в</strong>ое число")<br />

b = InputBox ("В<strong>в</strong>едите <strong>в</strong>торое число")<br />

Do<br />

If a > b Then a = a - b<br />

If b > a Then b = b - a<br />

Loop Until a = b


49<br />

MsgBox "НОД= " & a<br />

End Sub<br />

Соста<strong>в</strong>ные типы данных<br />

Для группо<strong>в</strong>ого предста<strong>в</strong>ления и обработки однотипных данных<br />

используются соста<strong>в</strong>ные типы — масси<strong>в</strong>ы. В масси<strong>в</strong>е под одним именем<br />

хранятся пронумеро<strong>в</strong>анные однотипные данные. Их число определяется при<br />

объя<strong>в</strong>лении. Синтаксис объя<strong>в</strong>ления масси<strong>в</strong>а:<br />

[операторХранения] имяМасси<strong>в</strong>а ( Индекс1[To Индекс2][,…] ) [As Тип]<br />

За именем масси<strong>в</strong>а следует пер<strong>в</strong>ый, <strong>в</strong>торой, а иногда и более старший индекс<br />

<strong>в</strong> круглых скобках. Индексом <strong>в</strong> языке Visual Basic <strong>на</strong>зы<strong>в</strong>ается номер<br />

последнего чле<strong>на</strong> масси<strong>в</strong>а. Произ<strong>в</strong>едение у<strong>в</strong>еличенных <strong>на</strong> единицу индексо<strong>в</strong><br />

определяет размер, то есть число члено<strong>в</strong> масси<strong>в</strong>а, а число индексо<strong>в</strong><br />

соот<strong>в</strong>етст<strong>в</strong>ует его размерности.<br />

Если одномерный масси<strong>в</strong> передается <strong>в</strong> процедуру или функцию <strong>в</strong><br />

качест<strong>в</strong>е аргумента, з<strong>на</strong>чения его индекса не указы<strong>в</strong>аются. При этом<br />

объя<strong>в</strong>ление функции может <strong>в</strong>ыглядеть, <strong>на</strong>пример, так:<br />

[операторХранения] Function имяФункции (Масси<strong>в</strong> () [As Тип],…) [As Тип]<br />

с таким <strong>в</strong>ызо<strong>в</strong>ом:<br />

MsgBox "Среднее з<strong>на</strong>чение = " & имяФункции (x ()).<br />

Размер и размерность масси<strong>в</strong>а должны быть определены до того, как<br />

он будет использо<strong>в</strong>ан. Если размер масси<strong>в</strong>а заранее из<strong>в</strong>естен, его <strong>на</strong>зы<strong>в</strong>ают<br />

статическим масси<strong>в</strong>ом.<br />

Масси<strong>в</strong>ы индексируются с нуля.<br />

Имя каждого чле<strong>на</strong> масси<strong>в</strong>а состоит из имени масси<strong>в</strong>а и индексо<strong>в</strong> <strong>в</strong><br />

круглых скобках, <strong>на</strong>пример, размер (0) — нуле<strong>в</strong>ой член одномерного<br />

масси<strong>в</strong>а, spaceArray (2,3) — (2,3)-ий член д<strong>в</strong>ухмерного масси<strong>в</strong>а.<br />

Примеры<br />

Sub ДелениеПочтиПоро<strong>в</strong>ну ()<br />

‘ Способ деления целого числа <strong>на</strong> примерно ра<strong>в</strong>ные целые части<br />

‘ с использо<strong>в</strong>анием операторо<strong>в</strong> деления <strong>на</strong>цело и остатка<br />

Dim <strong>в</strong><strong>в</strong>едено, остаток, доля (2) As Integer<br />

<strong>в</strong><strong>в</strong>едено = InputBox ("В<strong>в</strong>едите число")<br />

доля (0) = <strong>в</strong><strong>в</strong>едено \ 3: доля (1) = доля (0): доля (2) = доля (0)<br />

остаток = <strong>в</strong><strong>в</strong>едено Mod 3


50<br />

If остаток > 0 Then доля (0) = доля (0) + 1<br />

If остаток > 1 Then доля (1) = доля (1) + 1<br />

MsgBox <strong>в</strong><strong>в</strong>едено & "=" & доля (0) & "+" & доля (1) & "+" & доля (2)<br />

End Sub<br />

Dim память As Integer<br />

Sub Счетчик ()<br />

Dim масси<strong>в</strong> (10) As Integer, Индекс As Integer<br />

память = 0<br />

For индекс = 0 To 10 Step 2<br />

масси<strong>в</strong> (индекс) = индекс<br />

MsgBox Вы<strong>в</strong>од (масси<strong>в</strong> (), индекс)<br />

Next<br />

End Sub<br />

Function Вы<strong>в</strong>од (аргумент1 () As Integer, аргумент2 As Integer) As Integer<br />

память = память + аргумент1 (аргумент2)<br />

Вы<strong>в</strong>од = память<br />

End Function<br />

Если размер масси<strong>в</strong>а заранее неиз<strong>в</strong>естен, его можно объя<strong>в</strong>лять без<br />

размера, а размер зада<strong>в</strong>ать оператором ReDim по мере заполнения масси<strong>в</strong>а. В<br />

этом случае мы имеем дело с ди<strong>на</strong>мическим масси<strong>в</strong>ом, который, <strong>в</strong> отличие от<br />

статического, изменяет с<strong>в</strong>ой размер по ходу <strong>в</strong>ыполнения программы.<br />

Всякий раз при переопределении оператором ReDim содержимое<br />

масси<strong>в</strong>а уничтожается. Если по усло<strong>в</strong>ию задачи этого не требуется, после<br />

ReDim следует <strong>в</strong><strong>в</strong>ести оператор Preserve. Тогда масси<strong>в</strong> будет «запоми<strong>на</strong>ть»<br />

с<strong>в</strong>ое содержимое.<br />

Примеры<br />

Sub Покупки ()<br />

Dim список () As String, i As Integer, количест<strong>в</strong>о As Integer<br />

количест<strong>в</strong>о = InputBox ("Сколько ")<br />

ReDim список (1 To количест<strong>в</strong>о)<br />

For i = 1 To количест<strong>в</strong>о<br />

список (i) = InputBox (Str(i) & " - Это что ")<br />

Next<br />

End Sub<br />

Sub Ди<strong>на</strong>мическийМасси<strong>в</strong> ()<br />

Dim тест () As Integer, индекс As Integer, масси<strong>в</strong> As String<br />

For индекс = 10 To 20<br />

ReDim тест (индекс) As Integer<br />

тест (индекс) = индекс<br />

Next<br />

For индекс = 10 To 20<br />

масси<strong>в</strong> = масси<strong>в</strong> & тест (индекс)<br />

тест (индекс) = индекс


51<br />

Next<br />

MsgBox масси<strong>в</strong><br />

End Sub<br />

Sub Ди<strong>на</strong>мическийМасси<strong>в</strong>СПамятью ()<br />

Dim тест () As Integer, индекс As Integer, масси<strong>в</strong> As String<br />

For индекс = 10 To 20<br />

ReDim Preserve тест (индекс) As Integer<br />

тест (индекс) = индекс<br />

масси<strong>в</strong> = масси<strong>в</strong> & тест (индекс)<br />

Next<br />

MsgBox масси<strong>в</strong><br />

End Sub<br />

Dim счетчик () As Integer<br />

Sub Очко ()<br />

‘ Популяр<strong>на</strong>я игра <strong>в</strong> очко: <strong>в</strong>ы стараетесь <strong>на</strong>брать максимум очко<strong>в</strong>, но<br />

‘ не более 21, а компьютер “<strong>в</strong>ыбрасы<strong>в</strong>ает кубик”. Кроме ди<strong>на</strong>мического<br />

‘ масси<strong>в</strong>а, здесь <strong>в</strong>ы <strong>в</strong>стретитесь с датчиком случайных чисел Rnd,<br />

‘ с функцией его <strong>на</strong>чальной устано<strong>в</strong>ки Randomize, и с рекурсией.<br />

Static i As Integer<br />

ReDim Preserve счетчик (i) As Integer<br />

Randomize<br />

счетчик (i) = Rnd * 10<br />

от<strong>в</strong>ет = Info (счетчик (), i)<br />

i = i + 1<br />

If от<strong>в</strong>ет 0 Then от<strong>в</strong>ет = MsgBox (от<strong>в</strong>ет & " Еще", vbYesNo)<br />

If от<strong>в</strong>ет = vbYes Then Очко Else End ' Пример рекурсии<br />

End Sub<br />

Function Info (список () As Integer, количест<strong>в</strong>о As Integer) As Integer<br />

Dim сумма As Integer, x As Integer<br />

сумма = 0<br />

For x = 0 To количест<strong>в</strong>о<br />

сумма = сумма + список (x)<br />

Next<br />

If сумма > 21 Then<br />

MsgBox Str (сумма) & " - Вы проиграли!"<br />

Info = 0<br />

Else<br />

If сумма = 21 Then<br />

Beep<br />

MsgBox Str (сумма) & " - Вы <strong>в</strong>ыиграли!"<br />

Info = 0<br />

Else<br />

Info = сумма<br />

End If<br />

End If<br />

End Function


52<br />

Типо<strong>в</strong> данных языка Visual Basic обычно х<strong>в</strong>атает, чтобы разделить<br />

<strong>в</strong>сю информацию <strong>на</strong> тексто<strong>в</strong>ые и число<strong>в</strong>ые компоненты. Но этих типо<strong>в</strong><br />

недостаточно при работе с данными, которые требуется сгруппиро<strong>в</strong>ать по<br />

какому-либо приз<strong>на</strong>ку. В таких случаях <strong>на</strong> помощь приходят а<strong>в</strong>торские<br />

соста<strong>в</strong>ные типы данных, конструируемые как комби<strong>на</strong>ции простых типо<strong>в</strong>, и<br />

а<strong>в</strong>торские классы, содержащие данные и процедуры.<br />

Операторами Type и End Type <strong>на</strong>чи<strong>на</strong>ется и за<strong>в</strong>ершается объя<strong>в</strong>ление<br />

а<strong>в</strong>торского типа данных, предста<strong>в</strong>ляемое списком его члено<strong>в</strong>, или полей.<br />

Такие типы объя<strong>в</strong>ляются <strong>в</strong> разделе объя<strong>в</strong>лений модуля. В отличие от<br />

простых типо<strong>в</strong>, память им <strong>в</strong>ыделяется не <strong>в</strong> момент объя<strong>в</strong>ления, а <strong>в</strong> момент<br />

создания переменной, предста<strong>в</strong>ляющей такой тип и <strong>на</strong>зы<strong>в</strong>аемой объектом.<br />

Вызо<strong>в</strong> объекта из различных модулей программы <strong>в</strong>ыполняется <strong>в</strong> формате<br />

Объект.Член, соот<strong>в</strong>етст<strong>в</strong>ующем полному имени чле<strong>на</strong>. Более удобный<br />

способ инициализации члено<strong>в</strong> объекта состоит <strong>в</strong> использо<strong>в</strong>ании<br />

упра<strong>в</strong>ляющей структуры With… End With.<br />

Примеры<br />

Type Мужчи<strong>на</strong><br />

рост As Single<br />

<strong>в</strong>ес As Single<br />

имя As String<br />

<strong>в</strong>озраст As Integer<br />

End Type<br />

Type Женщи<strong>на</strong><br />

ц<strong>в</strong>етВолос As String<br />

ц<strong>в</strong>етГлаз As String<br />

имя As String<br />

рост As Integer<br />

End Type<br />

Sub Люди ()<br />

Dim И<strong>в</strong>ано<strong>в</strong> As Мужчи<strong>на</strong>, Петро<strong>в</strong>а As Женщи<strong>на</strong><br />

И<strong>в</strong>ано<strong>в</strong>.рост = 1.85<br />

Петро<strong>в</strong>а.ц<strong>в</strong>етВолос = "Каштано<strong>в</strong>ый"<br />

MsgBox "Ц<strong>в</strong>ет <strong>в</strong>олос Петро<strong>в</strong>ой " & Петро<strong>в</strong>а.ц<strong>в</strong>етВолос<br />

End Sub<br />

Type Компьютер<br />

процессор As String<br />

частота As Integer<br />

память As Integer<br />

End Type<br />

Sub Характеристики ()<br />

Dim IBMPC As Компьютер<br />

With IBMPC


53<br />

.процессор = "Pentium"<br />

.частота = 800<br />

.память = 256<br />

End With<br />

MsgBox IBMPC.процессор & "-" & IBMPC.частота _<br />

& "-" & IBMPC.память<br />

End Sub<br />

Кроме а<strong>в</strong>торских типо<strong>в</strong>, <strong>в</strong>озможно создание а<strong>в</strong>торских классо<strong>в</strong>. Членданные<br />

классо<strong>в</strong> описы<strong>в</strong>аются с<strong>в</strong>ойст<strong>в</strong>ами следующей структуры:<br />

• [операторХранения] [Property Let] имяС<strong>в</strong>ойст<strong>в</strong>а<br />

( [определениеАргументо<strong>в</strong>] )<br />

Выражение<br />

[…]<br />

End Property<br />

• [операторХранения] [Property Get] имяС<strong>в</strong>ойст<strong>в</strong>а<br />

( [определениеАргументо<strong>в</strong>] )<br />

Выражение<br />

[…]<br />

End Property<br />

Let используется для устано<strong>в</strong>ки з<strong>на</strong>чения с<strong>в</strong>ойст<strong>в</strong>а, а Get — для получения<br />

з<strong>на</strong>чения.<br />

Кроме данных, чле<strong>на</strong>ми а<strong>в</strong>торских классо<strong>в</strong> языка <strong>VBA</strong> я<strong>в</strong>ляются также<br />

процедуры, именуемые методами. Создание а<strong>в</strong>торского класса <strong>на</strong>чи<strong>на</strong>ется из<br />

меню Вста<strong>в</strong>ка .Модуль класса. В классе объя<strong>в</strong>ляются переменные модуля,<br />

процедуры Propety Let и Propety Get и методы, работающие с переменными<br />

этого модуля. Объекты как предста<strong>в</strong>ители класса создаются <strong>в</strong> д<strong>в</strong>а этапа:<br />

с<strong>на</strong>чала объя<strong>в</strong>ляется объект<strong>на</strong>я перемен<strong>на</strong>я, тип которой со<strong>в</strong>падает с именем<br />

класса, а затем ей прис<strong>в</strong>аи<strong>в</strong>ается ссылка <strong>на</strong> класс оператором Set. За<strong>в</strong>ершая<br />

работу с объектом, его удаляют прис<strong>в</strong>оением з<strong>на</strong>чения Nothing.<br />

Dim r<br />

Public Property Get Радиус ()<br />

Радиус = r<br />

End Property<br />

Public Property Let Радиус (перемен<strong>на</strong>я)<br />

If Not (IsNumeric (перемен<strong>на</strong>я)) Then<br />

MsgBox "В<strong>в</strong>едите число"<br />

Exit Property<br />

End If


54<br />

r = перемен<strong>на</strong>я<br />

End Property<br />

Public Function Площадь () As Double<br />

Площадь = 3.14159 * Радиус ^ 2<br />

End Function<br />

Public Sub Круг ()<br />

Dim маленькийКруг As Class1<br />

Set маленькийКруг = New Class1<br />

маленькийКруг.Радиус = InputBox ("В<strong>в</strong>едите радиус")<br />

MsgBox маленькийКруг.Площадь<br />

Set маленькийКруг = Nothing<br />

End Sub<br />

Визуальное программиро<strong>в</strong>ание<br />

Формы<br />

Для организации диалога с пользо<strong>в</strong>ателем <strong>в</strong> Word и Excel<br />

используются разрабаты<strong>в</strong>аемые программистом а<strong>в</strong>торские объекты —<br />

формы UserForm, которые можно отображать (Show) и скры<strong>в</strong>ать (Hide). У<br />

форм, созда<strong>в</strong>аемых через меню Вста<strong>в</strong>ка .Userform, задаются заголо<strong>в</strong>ки<br />

(Caption), изменяются размеры (Height, Width), тип границы (BorderStyle,<br />

SpecialEffect), фон и изображения (BackColor, Picture), расположение <strong>на</strong><br />

экране (Left, Top) и дополнитель<strong>на</strong>я информация (Tag) через окно С<strong>в</strong>ойст<strong>в</strong>а.<br />

Д<strong>в</strong>ойным щелчком по форме или откры<strong>в</strong>ается ее программный модуль,<br />

<strong>в</strong> котором размещают процедуры, описы<strong>в</strong>ающие реакцию формы <strong>на</strong><br />

различные события: щелчок (Click), д<strong>в</strong>ойной щелчок (DblClick),<br />

акти<strong>в</strong>изацию (Activate) и др.<br />

При <strong>на</strong>ступлении событий можно <strong>в</strong>ызы<strong>в</strong>ать как процедуры-функции,<br />

так и процедуры-подпрограммы, хотя обычно <strong>в</strong>ызы<strong>в</strong>аются последние.<br />

Процедуры, сопоста<strong>в</strong>ляемые событиям, <strong>на</strong>зы<strong>в</strong>ают процедурами обработки<br />

событий, <strong>в</strong> частности подпрограммы именуют обработчиками. Им<br />

а<strong>в</strong>томатически прис<strong>в</strong>аи<strong>в</strong>аются име<strong>на</strong>, состоящие из имени объекта и имени<br />

события, соединенных з<strong>на</strong>ком подчерки<strong>в</strong>ания. А<strong>в</strong>торская процедурафункция<br />

<strong>в</strong>ызы<strong>в</strong>ается как =имяПроцедуры(списокАргументо<strong>в</strong>).<br />

Обращение к форме <strong>в</strong>ыполняется по ее имени (Name), а из класса<br />

формы к ней удобно обращаться через лексему Me.<br />

Примеры<br />

Sub Начало ()<br />

Call С<strong>в</strong>ойст<strong>в</strong>аФормы<br />

End Sub


55<br />

Sub С<strong>в</strong>ойст<strong>в</strong>аФормы ()<br />

With UserForm1<br />

.Caption = "Старто<strong>в</strong>ый заголо<strong>в</strong>ок"<br />

.Width = 270<br />

.Height = 270<br />

.Picture = LoadPicture ("c:\user\scan.bmp")<br />

.BackColor = vbBlue<br />

.Tag = "Всегда откры<strong>в</strong>ать"<br />

End With<br />

End Sub<br />

Sub UserForm_Click ()<br />

Beep: Beep: Beep<br />

Call МакросДляФормы<br />

End Sub<br />

Sub МакросДляФормы ()<br />

MsgBox "Форма <strong>в</strong>ы<strong>в</strong>еде<strong>на</strong> <strong>на</strong> экран"<br />

UserForm1.Caption = "Но<strong>в</strong>ый заголо<strong>в</strong>ок"<br />

End Sub<br />

Sub UserForm_DblClick ()<br />

Me.Hide<br />

UserForm2.Show<br />

End Sub<br />

Элементы упра<strong>в</strong>ления<br />

Окно формы <strong>в</strong> конструкторе сопро<strong>в</strong>ождается панелью Элементы<br />

упра<strong>в</strong>ления. Каждый элемент упра<strong>в</strong>ления, указанный <strong>в</strong> при<strong>в</strong>еденной ниже<br />

таблице, предста<strong>в</strong>ляет определенный класс. Объекты данного класса<br />

программист размещает <strong>в</strong> формах, чтобы пользо<strong>в</strong>атель упра<strong>в</strong>лял с их<br />

помощью процессом обработки информации.<br />

Класс Объект Определение<br />

Label Надпись Пояснения и заголо<strong>в</strong>ки форм<br />

TextBox Поле В<strong>в</strong>од текста <strong>в</strong> формы<br />

Frame<br />

Command<br />

Button<br />

CheckBox<br />

Рамка<br />

Кнопка<br />

Флажок<br />

Обрамляет с<strong>в</strong>язанные объекты для<br />

со<strong>в</strong>местной работы<br />

Упра<strong>в</strong>ляет процессами<br />

Переключает состояния Исти<strong>на</strong> - Ложь,<br />

Ноль - Не ноль и отражает состояние<br />

с<strong>в</strong>язанного объекта


56<br />

Option<br />

Button<br />

Класс Объект Определение<br />

ListBox<br />

Переключатель<br />

Список<br />

Выбирает один из ряда <strong>в</strong>арианто<strong>в</strong>. Все<br />

переключатели <strong>в</strong> группе можно с<strong>в</strong>язать с<br />

одним объектом, з<strong>на</strong>чением которого служит<br />

число, ра<strong>в</strong>ное числу переключателей <strong>в</strong><br />

группе<br />

Предста<strong>в</strong>ляет список для <strong>в</strong>ыбора данных.<br />

Порядко<strong>в</strong>ый номер <strong>в</strong>ыбранного <strong>в</strong> списке<br />

чле<strong>на</strong> можно заносить <strong>в</strong> с<strong>в</strong>язанный объект<br />

ComboBox<br />

Поле со<br />

списком<br />

Объединяет поле и список формы<br />

ScrollBar<br />

Полоса Пла<strong>в</strong>но изменяет з<strong>на</strong>чения <strong>в</strong> число<strong>в</strong>ом ряду <strong>в</strong><br />

прокрутки заданных пределах<br />

Spinner Счетчик<br />

Изменяет з<strong>на</strong>чения <strong>в</strong> число<strong>в</strong>ом ряду с<br />

заданным шагом<br />

Toggle<br />

Уста<strong>на</strong><strong>в</strong>ли<strong>в</strong>ает одно из состояний Исти<strong>на</strong> —<br />

Выключатель<br />

Button<br />

Ложь<br />

Image Рисунок Предста<strong>в</strong>ляет рисунок графического файла<br />

TabStrip<br />

Набор<br />

<strong>в</strong>кладок<br />

Предста<strong>в</strong>ляет группу страниц формы<br />

MultiPage<br />

Набор<br />

страниц<br />

Предста<strong>в</strong>ляет группу форм<br />

RefEdit<br />

Поле ссылок<br />

Поле для <strong>в</strong><strong>в</strong>ода ссылок <strong>в</strong>ыбором их <strong>в</strong><br />

таблице<br />

Константы панели элементо<strong>в</strong> упра<strong>в</strong>ления<br />

msoControlEdit<br />

Поле<br />

msoControlButton<br />

Кнопка<br />

msoControlDropDown Раскры<strong>в</strong>ающийся список<br />

msoControlComboBox Поле со списком<br />

msoButtonAutomatic Пустая кнопка<br />

msoButtonIcon<br />

Кнопка с рисунком<br />

msoButtonCaption<br />

Кнопка с текстом<br />

msoButtonIconCaption Кнопка с рисунком и текстом<br />

Любой но<strong>в</strong>ый объект класса строится <strong>в</strong>ычерчи<strong>в</strong>анием <strong>в</strong> форме<br />

элемента упра<strong>в</strong>ления, <strong>в</strong>ыделенного <strong>на</strong> панели элементо<strong>в</strong> упра<strong>в</strong>ления. Visual<br />

Basic а<strong>в</strong>томатически прис<strong>в</strong>аи<strong>в</strong>ает име<strong>на</strong> объектам, указы<strong>в</strong>ая их <strong>в</strong> поле Name<br />

ок<strong>на</strong> С<strong>в</strong>ойст<strong>в</strong>а. В этом же окне указы<strong>в</strong>аются <strong>в</strong>се другие с<strong>в</strong>ойст<strong>в</strong>а,<br />

устано<strong>в</strong>ленные по умолчанию. Там же многие из них можно при желании<br />

изменить. После того как объект размещен, его можно перед<strong>в</strong>игать и<br />

изменять <strong>в</strong> размерах. Любой объект <strong>в</strong>ыделяется щелчком или пра<strong>в</strong>ым<br />

щелчком, а щелчками при <strong>на</strong>жатой кла<strong>в</strong>ише <strong>в</strong>ыделяется группа


57<br />

объекто<strong>в</strong>. Перетаски<strong>в</strong>анием при <strong>на</strong>жатой кла<strong>в</strong>ише создается копия<br />

объекта, а кла<strong>в</strong>ишей он уничтожается. Любое изменение<br />

за<strong>в</strong>ершается щелчком <strong>в</strong>не объекта. При пра<strong>в</strong>ом щелчке по <strong>в</strong>ыделенному<br />

объекту откры<strong>в</strong>ается контекстное меню.<br />

Каждому объекту можно <strong>на</strong>з<strong>на</strong>чать с<strong>в</strong>ои макросы или процедуры. Для<br />

кнопок, флажко<strong>в</strong> и переключателей макрос по умолчанию обычно описы<strong>в</strong>ает<br />

реакцию <strong>на</strong> щелчок (Click), для остальных элементо<strong>в</strong> — реакцию <strong>на</strong><br />

изменение их содержания (Change). Чтобы подгото<strong>в</strong>ить макрос, следует<br />

<strong>в</strong>ыполнить <strong>на</strong> объекте д<strong>в</strong>ойной щелчок или открыть окно модуля через<br />

меню, и для события, <strong>в</strong>ыбранного <strong>в</strong> пра<strong>в</strong>ом <strong>в</strong>ерхнем списке ок<strong>на</strong>, соста<strong>в</strong>ить<br />

текст. Возможен и импорт ранее подгото<strong>в</strong>ленных процедур из файло<strong>в</strong> Visual<br />

Basic с расширениями .frm, .cls, .bas через меню Файл .Импорт файла, а<br />

также экспорт созданных процедур из меню Файл .Экспорт файла.<br />

Пред<strong>в</strong>арительный просмотр формы <strong>в</strong>ыполняется из меню Запуск ().<br />

Рассмотрим <strong>на</strong>з<strong>на</strong>чение осно<strong>в</strong>ных элементо<strong>в</strong> упра<strong>в</strong>ления.<br />

Для <strong>в</strong>ы<strong>в</strong>ода сообщений <strong>в</strong> форму пред<strong>на</strong>з<strong>на</strong>чен элемент Надпись<br />

(Label). Его с<strong>в</strong>ойст<strong>в</strong>о Caption (с<strong>в</strong>ойст<strong>в</strong>о по умолчанию) предста<strong>в</strong>ляет<br />

содержание <strong>на</strong>дписи.<br />

Элементом <strong>в</strong><strong>в</strong>ода тексто<strong>в</strong>ой информации я<strong>в</strong>ляется Поле (TextBox). По<br />

умолчанию с<strong>в</strong>ойст<strong>в</strong>о Value используется для устано<strong>в</strong>ки и получения<br />

содержимого поля. Запрет и разрешение доступа к полю осущест<strong>в</strong>ляется<br />

через с<strong>в</strong>ойст<strong>в</strong>о Enabled. С<strong>в</strong>ойст<strong>в</strong>о SelText хранит <strong>в</strong>ыделенный <strong>в</strong> поле<br />

фрагмент текста, а с<strong>в</strong>ойст<strong>в</strong>а SelStart и SelLengh уста<strong>на</strong><strong>в</strong>ли<strong>в</strong>ают <strong>на</strong>чало и<br />

длину <strong>в</strong>ыделенного фрагмента. С<strong>в</strong>ойст<strong>в</strong>о Name характеризует имя поля. Его<br />

изменяют <strong>в</strong> случае необходимости для обращения к полям <strong>в</strong> разных формах.<br />

Метод Zorder определяет уро<strong>в</strong>ень, <strong>на</strong> котором размещается поле по<br />

отношению к другим, перекры<strong>в</strong>ающим его элементам формы. PasswordСhar<br />

задает сим<strong>в</strong>ол, отображаемый <strong>в</strong> поле, если оно используется для <strong>в</strong><strong>в</strong>ода<br />

пароля.<br />

Кнопка (CommandButton) инициирует <strong>в</strong>ыполнение определенных<br />

дейст<strong>в</strong>ий (пуск, остано<strong>в</strong>ка, преры<strong>в</strong>ание и т.п.). С<strong>в</strong>ойст<strong>в</strong>ом Default<br />

<strong>на</strong>з<strong>на</strong>чается кнопка по умолчанию, а Enabled организует доступ к кнопке.<br />

Метод Click я<strong>в</strong>ляется процедурой кнопки по умолчанию. С<strong>в</strong>ойст<strong>в</strong>ом<br />

Accelerator <strong>на</strong>з<strong>на</strong>чается кла<strong>в</strong>иша, <strong>на</strong>жимаемая с <strong>в</strong>место щелчка.<br />

Переключатели (OptionButtons) объединяются обычно с помощью<br />

рамки или с<strong>в</strong>ойст<strong>в</strong>а GroupName. С<strong>в</strong>ойст<strong>в</strong>о Value я<strong>в</strong>ляется з<strong>на</strong>чением<br />

переключателя по умолчанию. Флажок (CheckBox) характеризуется<br />

с<strong>в</strong>ойст<strong>в</strong>ами Value (з<strong>на</strong>чение), Caption (<strong>на</strong>з<strong>в</strong>ание), WordWrap (перенос сло<strong>в</strong> <strong>в</strong><br />

<strong>на</strong>з<strong>в</strong>ании). С<strong>в</strong>ойст<strong>в</strong>ом Value характеризуются, также, Выключатель<br />

(ToggleButton), Рамка (Frame), Полоса прокрутки (ScrollBar) и Счетчик<br />

(SpinButton).<br />

Список (ListBox) хранит ряд данных, предста<strong>в</strong>ляет и поз<strong>в</strong>оляет<br />

<strong>в</strong>ыбирать их с помощью с<strong>в</strong>ойст<strong>в</strong> Value, List, ListIndex, ListCount. С<strong>в</strong>ойст<strong>в</strong>о


58<br />

List определяет по номеру пункта его текста. С<strong>в</strong>ойст<strong>в</strong>о MultiSelect<br />

определяет способы <strong>в</strong>ыбора элементо<strong>в</strong> из списка: 0 – один элемент, 1 –<br />

произ<strong>в</strong>оль<strong>на</strong>я группа, 2 – ряд соседних з<strong>на</strong>чений. Метод AddItem дополняет<br />

список, а RemoveItem удаляет пункты. С<strong>в</strong>ойст<strong>в</strong>о TopIndex предста<strong>в</strong>ляет<br />

элемент списка с <strong>на</strong>ибольшим номером, с<strong>в</strong>ойст<strong>в</strong>о TextColumn уста<strong>на</strong><strong>в</strong>ли<strong>в</strong>ает<br />

столбец списка, элемент которого <strong>в</strong>оз<strong>в</strong>ращается с<strong>в</strong>ойст<strong>в</strong>ом Text. При<br />

истинном с<strong>в</strong>ойст<strong>в</strong>е MatchЕntry <strong>в</strong> списке акти<strong>в</strong>изируется пер<strong>в</strong>ый же<br />

подходящий элемент, со<strong>в</strong>падающий с <strong>на</strong>бираемым <strong>в</strong> поле именем. С<strong>в</strong>ойст<strong>в</strong>о<br />

ControlTipText содержит текст <strong>в</strong>сплы<strong>в</strong>ающей подсказки.<br />

Поле со списком (ComboBox) характеризуется с<strong>в</strong>ойст<strong>в</strong>ами Text и Value,<br />

задающими <strong>в</strong>ыделенный фрагмент и содержание списка. ListIndex<br />

определяет номер <strong>в</strong>ыбранного элемента. С<strong>в</strong>ойст<strong>в</strong>о Selected упра<strong>в</strong>ляет<br />

<strong>в</strong>ыделением и информирует о <strong>в</strong>ыделенных элементах списка. С<strong>в</strong>ойст<strong>в</strong>о<br />

MatchRequired разрешает (False) или запрещает (True) дополнение списка из<br />

поля. В за<strong>в</strong>исимости от с<strong>в</strong>ойст<strong>в</strong>а MatchFound, <strong>в</strong>озможно (True) со<strong>в</strong>падение<br />

<strong>в</strong><strong>в</strong>одимого <strong>в</strong> поле текста с текстом, имеющемся <strong>в</strong> списке.<br />

Элемент Набор страниц (MultiPage) обладает с<strong>в</strong>ойст<strong>в</strong>ами Value,<br />

BoundValue — номер акти<strong>в</strong>ной страницы (с 0), SelectedItem — <strong>в</strong>ыбран<strong>на</strong>я<br />

страница, а также методами Item — <strong>в</strong>оз<strong>в</strong>ращение страницы, Add — но<strong>в</strong>ая<br />

страница, Clear, Remove — удаление страниц.<br />

Рядом полезных с<strong>в</strong>ойст<strong>в</strong> обладает и объект Рисунок (Image).<br />

Инициализация формы, <strong>на</strong>полненной объектами, обычно <strong>в</strong>ыполняется<br />

как реакция <strong>на</strong> событие Initialize.<br />

Объект Screen предста<strong>в</strong>ляет ссылку <strong>на</strong> отдельную форму, отчет или<br />

текущий либо предыдущий акти<strong>в</strong>ный элемент упра<strong>в</strong>ления. Его с<strong>в</strong>ойст<strong>в</strong>а<br />

доступны только для чтения.<br />

Примеры<br />

Sub Надпись ()<br />

UserForm1.Label1.Caption = "Но<strong>в</strong>ая <strong>на</strong>дпись"<br />

UserForm1.Show<br />

End Sub<br />

Sub Поле ()<br />

UserForm1.Show<br />

Call UserForm1.TextBox1_Change<br />

End Sub<br />

Sub TextBox1_Change ()<br />

UserForm1. TextBox2 = UserForm1. TextBox1<br />

End Sub<br />

Sub Блокиро<strong>в</strong>каПоля ()<br />

имя = "Станисла<strong>в</strong>"<br />

With UserForm1.TextBox1<br />

.Value = имя


59<br />

.Enabled = False<br />

End With<br />

UserForm1.Show<br />

End Sub<br />

Sub ФормаСоСписками ()<br />

Dim масси<strong>в</strong><br />

масси<strong>в</strong> = Array ("1000", "2000", "3000", "4000")<br />

With UserForm1<br />

.ListBox1.List = Array ("июнь", "июль", "", "")<br />

.ListBox1.List (2, 0) = "сентябрь"<br />

.ComboBox1.List = масси<strong>в</strong><br />

.Show<br />

End With<br />

End Sub<br />

Sub Получатель ()<br />

If MsgBox ("Вас интересует получатель", vbYesNo) = vbYes Then<br />

Set кто = Me!TextBoxПолучатель<br />

кто.SetFocus<br />

MsgBox (кто.Text)<br />

End If<br />

End Sub<br />

Sub При<strong>в</strong>етст<strong>в</strong>ие ()<br />

Set кто = Me!Получатель<br />

кто.SetFocus<br />

If кто.Text = "Смирно<strong>в</strong>" Then MsgBox "При<strong>в</strong>ет, Смирно<strong>в</strong>" Else Beep<br />

End Sub<br />

' Процедуры формы, <strong>в</strong> которой размещены три поля.<br />

' В<strong>в</strong>од числа <strong>в</strong> любое из полей сопро<strong>в</strong>ождается <strong>в</strong>ы<strong>в</strong>одом<br />

' преобразо<strong>в</strong>анного з<strong>на</strong>чения <strong>в</strong> д<strong>в</strong>ух других полях<br />

Sub Цельсий_KeyUp (ByVal KeyCode As MSForms.ReturnInteger, _<br />

ByVal Shift As Integer)<br />

If Цельсий = "" Then Цельсий = 0<br />

Фаренгейт = Цельсий * 9 / 5 + 32<br />

Кель<strong>в</strong>ин = Цельсий + 273.15<br />

End Sub<br />

Sub Фаренгейт_KeyUp (ByVal KeyCode As MSForms.ReturnInteger, _<br />

ByVal Shift As Integer)<br />

If Фаренгейт = "" Then Фаренгейт = 0<br />

Цельсий = (Фаренгейт - 32) * 5 / 9<br />

Кель<strong>в</strong>ин = (Фаренгейт - 32) * 5 / 9 - 273.15<br />

End Sub<br />

Sub Кель<strong>в</strong>ин_ KeyUp (ByVal KeyCode As MSForms.ReturnInteger, _<br />

ByVal Shift As Integer)<br />

If Кель<strong>в</strong>ин = "" Then Кель<strong>в</strong>ин = 0<br />

Цельсий = Кель<strong>в</strong>ин - 273.15


60<br />

Фаренгейт = (Кель<strong>в</strong>ин - 273.15) * 9 / 5 + 32<br />

End Sub<br />

Sub КакДела ()<br />

Me!Состояние.SetFocus<br />

<strong>на</strong>строение = Me!Состояние.Text<br />

<strong>на</strong>строение = Left (Настроение, 3)<br />

Select Case <strong>на</strong>строение<br />

Case "хор", "Хор"<br />

MsgBox "Он <strong>в</strong> духе"<br />

Case "пло", "Пло"<br />

MsgBox "Он не <strong>в</strong> духе"<br />

Case Else<br />

MsgBox "Ни то, ни се"<br />

End Select<br />

End Sub<br />

Sub Цены ()<br />

Me!ПолеЦены.SetFocus<br />

це<strong>на</strong> = Me!ПолеЦены.Text<br />

Select Case це<strong>на</strong><br />

Case 10 To 500<br />

MsgBox "Низкая це<strong>на</strong>"<br />

Case 501 To 50000<br />

MsgBox "Средняя це<strong>на</strong>"<br />

Case Is > 50000<br />

MsgBox "Высокая це<strong>на</strong>"<br />

Case Else<br />

MsgBox "Не<strong>в</strong>ерное число"<br />

End Select<br />

End Sub<br />

Sub Форма_AfterUpdate ()<br />

Select Case Фирма<br />

Case "Apple"<br />

Me!Год = 1975<br />

Me!Президент = "Джобс"<br />

Case "Motorola"<br />

Me!Год = 1937<br />

Me!Президент = "Фишер"<br />

Case "Intel"<br />

Me!Год = 1967<br />

Me!Президент = "Нойс"<br />

End Select<br />

End Sub<br />

Sub Доступ_Exit ()<br />

MsgBox "В<strong>в</strong>од запрещен"<br />

Me.Undo<br />

End Sub<br />

Sub Год_Exit ()<br />

If Len (Год) 4 Then


61<br />

MsgBox "В<strong>в</strong>едите четырехз<strong>на</strong>чное число"<br />

Me.Undo<br />

End If<br />

End Sub<br />

Sub ФормаСЭлементамиУпра<strong>в</strong>ления_Open ()<br />

номер = 0<br />

Do<br />

Me.Controls (Номер).Properties ("BorderColor") = номер * 1000 + 1<br />

номер = номер + 1<br />

Loop While Номер < Controls.Count<br />

End Sub<br />

Sub ФормаСФлажком_Open ()<br />

Флажок.Value = Null<br />

With Выключатель<br />

.Caption = "Шрифт"<br />

.Value = False<br />

End With<br />

End Sub<br />

Sub UserForm_Activate ()<br />

With CheckBox1<br />

.Value = Null<br />

.Caption = "Жирный курси<strong>в</strong>ный шрифт"<br />

.WordWrap = True<br />

End With<br />

With ScrollBar1<br />

.Min = 20<br />

.Max = 50<br />

.Value = 30<br />

End With<br />

With ToggleButton1<br />

.Caption = "Шрифт"<br />

.Value = False<br />

End With<br />

With SpinButton1<br />

.Value = 50<br />

.Max = 100<br />

.Min = 1<br />

End With<br />

End Sub<br />

Sub ЗаполнитьПер<strong>в</strong>ыйСписок ()<br />

For i = 0 To 10<br />

UserForm2.ListBox1.AddItem "номер" & i<br />

Next<br />

End Sub<br />

Sub ПередатьВоВторойСписок ()<br />

For i = 0 To (UserForm2.ListBox1.ListCount - 1)<br />

If UserForm2.ListBox1.Selected (i) Then _


62<br />

Next<br />

End Sub<br />

UserForm2.ListBox2.AddItem _<br />

UserForm2.ListBox1.List (i)<br />

Sub ОчиститьВторойСписок ()<br />

For i = (UserForm2.ListBox2.ListCount - 1) To 0 Step -1<br />

UserForm2.ListBox2.RemoveItem i<br />

Next<br />

End Sub<br />

' Форма содержит д<strong>в</strong>а списка. Выбор <strong>в</strong>ыполняется щелчком по пер<strong>в</strong>ому списку.<br />

Sub ListBox1_Click ()<br />

строка = ListBox1.ListIndex<br />

ListBox2.AddItem (ListBox1.List (строка))<br />

End Sub<br />

Sub ListBox2_Click ()<br />

строка = ListBox2.ListIndex<br />

ListBox1.AddItem (ListBox2.List (строка))<br />

End Sub<br />

Sub UserForm_Activate ()<br />

ListBox1.AddItem "Борщ"<br />

ListBox1.AddItem "Яичница"<br />

ListBox1.AddItem "Солянка"<br />

ListBox1.AddItem "Рагу"<br />

ListBox1.AddItem "Компот"<br />

ListBox1.AddItem "Какао"<br />

ListBox1.AddItem "Мороженое"<br />

ListBox1.AddItem "Бутерброд"<br />

ListBox1.SetFocus<br />

End Sub<br />

Sub Список1_Click ()<br />

строка = Список1.ListIndex<br />

MsgBox (Список1.ItemData (Строка))<br />

End Sub<br />

Sub ПолеСоСписком_Change ()<br />

MsgBox "Опять что-то пишут :-(”<br />

End Sub<br />

' Форма содержит поле со списком, <strong>на</strong>дпись и д<strong>в</strong>е кнопки.<br />

Sub UserForm_Activate ()<br />

ComboBox1.Text = ""<br />

Label1 = ""<br />

ComboBox1.SetFocus<br />

End Sub


63<br />

Sub CommandButton1_Click ()<br />

ComboBox1.AddItem ComboBox1.Text<br />

ComboBox1.Text = ""<br />

ComboBox1.SetFocus<br />

End Sub<br />

Sub CommandButton2_Click ()<br />

сумма = 0: номерЗаписи = 1<br />

Do While номерЗаписи 60 Then<br />

Время = 60<br />

End If<br />

End Sub<br />

Sub Стрелки_SpinDown ()<br />

If UserForm1.Время > 1 Then<br />

UserForm1.Время = UserForm1.Время - 1<br />

End If<br />

End Sub<br />

Sub Стрелки_SpinUp ()<br />

If UserForm1.Время < 60 Then<br />

UserForm1.Время = UserForm1.Время + 1<br />

End If<br />

End Sub<br />

Sub UserForm_Initialize ()<br />

Set страница = UserForm.Controls.Add ("Forms.MultiPage.1")<br />

TextBox1 = Format (Now, "d mmmm yy г.")<br />

CheckBox1 = True


64<br />

CommandButton1.SetFocus<br />

End Sub<br />

Элементы оформления<br />

Методы класса Shape <strong>на</strong>пра<strong>в</strong>лены <strong>на</strong> работу с геометрическими<br />

фигурами, а Picture — с рисунками.<br />

Примеры<br />

Sub Д<strong>в</strong>ижениеЛиний ()<br />

With ActiveDocument<br />

For номерЛинии = 1 To .Shapes.Count<br />

If номерЛинии < .Shapes.Count Then<br />

.Shapes (номерЛинии).Left = .Shapes (номерЛинии + 1).Left<br />

.Shapes (номерЛинии).Top = .Shapes (номерЛинии + 1).Top<br />

Else<br />

.Shapes (номерЛинии).Left = .Shapes (1).Left<br />

.Shapes (номерЛинии).Top = .Shapes (1).Top<br />

End If<br />

Next номерЛинии<br />

End With<br />

End Sub<br />

Sub РисунокФормы ()<br />

With UserForm1.Image1<br />

.Picture = LoadPicture ("C:\User\scan.bmp")<br />

.PictureAlignment = fmPictureAlignmentTopLeft<br />

.PictureSizeMode = fmPictureSizeModeStretch<br />

.Visible = True<br />

If .Top > 0 And .Left > 0 Then<br />

.Move .Left - 5, .Top - 6<br />

Else<br />

.Visible = False<br />

End If<br />

End With<br />

End Sub<br />

' Несколько разноц<strong>в</strong>етных прямоугольнико<strong>в</strong> <strong>в</strong> форме<br />

Sub Разноц<strong>в</strong>ет<strong>на</strong>яФорма_Open ()<br />

номерЦ<strong>в</strong>ета = 1<br />

For Each фигура In Controls<br />

фигура.Properties ("BorderColor") = номерЦ<strong>в</strong>ета<br />

номерЦ<strong>в</strong>ета = номерЦ<strong>в</strong>ета + 2000<br />

Next фигура<br />

End Sub

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!