06.01.2015 Views

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

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

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

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

В. М. Водо<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!