Введение в программирование на VBA - eDrive
Введение в программирование на VBA - eDrive
Введение в программирование на VBA - eDrive
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