64
В. М. Водовозов Введение в программирование на VBA Санкт-Петербург 2003

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

Embed Size (px)

Citation preview

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

В. М. Водовозов

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

Санкт-Петербург 2003

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

УДК 681.3.016 В.М.Водовозов. Введение в программирование на VBA. 64 c. Даны основные сведения о языке Visual Basic for Applications и

правила работы в редакторе Visual Basic. Для всех, кто владеет основами Microsoft Office.

© В.М.Водовозов, 2003.

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

Оглавление ИНФОРМАЦИОННАЯ СИСТЕМА ..............................................................................4 Базовые понятия информатики ....................................................................4 Организация Windows......................................................................................6 Функционирование Windows ...........................................................................9

УПРАВЛЕНИЕ ОБЪЕКТАМИ WINDOWS .................................................................11 Элементы управления ...................................................................................11 Свойства объектов .......................................................................................12 Макросы .........................................................................................................14

ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ .....................................................................20 От алгоритма к программе .........................................................................20 Процедуры ......................................................................................................22 Редактор Visual Basic ...................................................................................23 Выражения.....................................................................................................25

ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ .................................................................30 Подпрограммы...............................................................................................30 Переменные и константы ............................................................................32 Функции ..........................................................................................................35 Файлы .............................................................................................................36

СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ ..................................................................38 Структуры и модули ....................................................................................38 Составные операторы .................................................................................40 Простые типы данных .................................................................................46 Составные типы данных..............................................................................49

ВИЗУАЛЬНОЕ ПРОГРАММИРОВАНИЕ....................................................................54 Формы.............................................................................................................54 Элементы управления ...................................................................................55 Элементы оформления .................................................................................64

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

4

Информационная система

Базовые понятия информатики

Сведения об окружающем нас мире обычно называют информацией. Информация обособляет сообщество людей, выделяя его из животной и растительной среды и объединяя между собой. Знаки как минимальные носители информации моделируют реальные явления и процессы, выражая отношение к ним и устанавливая связь между людьми через эти отношения. Знаковая система, представляющая и организующая информацию, регламентирующая нормы и характер взаимодействия знаковых потоков, называется языком.

Среди миллионов знаков, которыми обмениваются люди � звуков и жестов, световых и электромагнитных сигналов, � выделяется особая группа. Это символы, способные передавать информацию сквозь время. Символьные изображения характернее, чем любая другая информация, выделяют человека в мире природы, позволяя соединять между собой поколения. Личность приходит и уходит, а оставленные ею символы остаются, чтобы быть прочитанными и понятыми современниками и потомками. Каждый символ представляет организованное множество пространственных точек и линий, формируемых разнообразными инструментами. Чем больше таких изобразительных элементов и богаче их организация, тем шире возможность отразить в символе реальность во всем богатстве ее проявлений. Из-под резца мастера и кисти художника, из студии скульптора и лаборатории фотографа выходят бессмертные образы мира, которому он принадлежит.

Изобразительные средства всегда ограничены во времени и пространстве возможностями инструмента, свойствами материала, способностями творца. Чем выше потребность в передаче сведений и больше ограничений на ее реализацию, тем лаконичнее символ и значимее каждая его точка и линия. А значит, между автором и получателем информации возникают новые отношения, связанные с пониманием (расшифровкой, интерпретацией) поступающих символов. И требуется время, в течение которого их надо хранить и преобразовывать. Жить в мире информации � значит участвовать в четырех категориях информационных процессов, связанных с непрерывным восприятием, хранением, переработкой и передачей сведений. Каждый отдельный поток воспринятой, сохраненной, обработанной и переданной информации образует сообщение. Сообщение � это факт и условие общения, выражающее отношение между источником и приемником информации. Символьные сообщения называют документами.

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

5

Единение знака и значения, символа и явления раскрывается через образование. Любая образовательная система нацелена на обучение пониманию, созданию и использованию максимально широкой гаммы таких связей. Большая часть образовательной деятельности посвящена языкам и освоению погруженных в них информационных процессов. Собственно лингвистика как наука о языках рассматривает в качестве элементарных информационных единиц не любые, а лишь зарегистрированные в конкретной языковой системе основные (терминальные) и вспомогательные (нетерминальные) символы. Терминальные символы объединяются в алфавиты (азбуки), а символьные последовательности, принадлежащие одному алфавиту, называют цепочками, лексемами или словами данного алфавита. В составе языка присутствует множество цепочек алфавита. Из терминалов и слов строится словарь � структура данных, обеспечивающая доступ к информации по именам.

В естественных языках цепочки терминальных символов имеют фонетические эквиваленты. Искусственные языки обычно не несут фонетической окраски. Каждый такой язык создавался как модель некоторого естественного языка, удобная для реализации в определенной техногенной среде. Эта «модель модели» имеет еще более абстрактную природу и еще более далека от реальных прототипов, чем обычный язык символов. Вероятно, по этой причине искусственный язык было бы еще сложнее понять, если бы не «инженерная» природа его появления. Язык, созданный для техники, интерпретируется самой техникой, и чем выше «интеллектуальный» уровень машины, тем ниже требования к интеллекту ее пользователя.

Наиболее совершенные технические средства строятся на базе компьютеров. Компьютерные информационные ресурсы включают в свой состав аппаратное, математическое и технологическое обеспечение для физической, логической и организационной реализации информационных процессов. Информатика � это наука о компьютерном сопровождении информационных процессов. Компьютерная модель информации представляется данными. Как и любая модель, данные не полностью отражают реальный мир, но сохраняют главное � сведения о тех его явлениях и процессах, которые существенны с позиции решения конкретной проблемы, ради которой создается информационная система.

Знаковая система, отображающая и организующая информацию и регламентирующая нормы и характер взаимодействия данных, именуется языком программирования.

Под программой пользователь обычно понимает компьютерную модель прикладной области, тогда как программист видит в ней систему документов, созданную средствами языка программирования, и данные для него � это факты, известные программе. Как и в любой модели, в программе через данные можно передать далеко не все, что связано с

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

6

моделируемым миром, но главное в ней, то есть сведения, необходимые для адекватного отображения предметной области.

Информационная система обрабатывает электронные документы, представляющие программные модели документов реальных. Несмотря на принципиально иную внутреннюю природу языка программы, «внешний» язык электронного документа часто не отличается от прототипа. Если же такие отличия есть, то, как правило, они направлены на повышение производительности обработки информации и улучшение условий труда пользователя. А в качестве инструмента для работы с электронными документами выступают инструментальные программы, или приложения.

С помощью данных прикладная область в программе представляется объектами. Объект � это компьютерная модель конкретного предмета, процесса, явления. Каждый объект выступает в роли представителя своего класса. Класс � это категория всеобщности и подобия объектов, шаблон, который, по словам основателя объектно-ориентированного программирования Г.Буча, «определяет абстракцию существенного в объекте». Объекты одного класса объединяются в коллекции, или семейства. Объекты характеризуются идентичностью, состоянием и поведением.

Идентичность объекта программы проявляется в его имени. «Символом мы видим реальность, а именем слышим ее», говорил П.А.Флоренский. «Говорящие» имена делают программы понятными автору и читателю, соответствуют контексту и несут описательную нагрузку. «Именуйте вещи согласно вашим знаниям об их природе, получаемым через познание их свойств и действий», писал в древности Ф.Аквинский. Состояние программного объекта определяется данными. Данные, значения которых меняются в ходе выполнения программы, выражаются переменными, а данные, не изменяемые программой, именуются константами. Поведение программного объекта � это наблюдаемая и проверяемая деятельность, направленная на изменение его состояния.

Организация Windows

Ресурсами компьютера (процессором, памятью, периферийными устройствами) и процессами, использующими эти ресурсы, управляет операционная система. Основную долю рынка операционных систем для персональных компьютеров составляют различные версии Microsoft Windows.

Важными чертами Windows являются:

• независимость программного обеспечения приложений от аппаратуры, т.к. Windows полностью берет на себя общение приложений с дисплеями, принтерами, портами, мышью,

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

7

клавиатурой и пр., а пользователям и программистам предоставляет универсальные средства обращения к аппаратуре;

• стандартный, единый для всех приложений графический интерфейс пользователя;

• многозадачность и многопоточность, обеспечивающие возможность одновременного запуска нескольких приложений и их частей и переключения между ними;

• виртуальный режим распределения памяти, в котором каждому приложению выделяется как бы свой собственный компьютер � виртуальная машина со всеми ресурсами;

• программная совместимость при обмене данными между приложениями.

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

пользователя, окно � это прямоугольная область экрана, которая отображает ту информацию, которую приложение Windows или его часть адресует пользователю. С точки зрения программиста, каждое окно � это самостоятельно существующий объект, характеристики и поведение которого описаны в классе окна. Любое приложение обязательно имеет главное окно, играющее роль точки входа и центра управления программы.

При создании окна приложением выполняются специальные действия по подготовке к запуску в Windows. Общение приложения с пользователем осуществляется, как правило, только через окна.

Существует три основных типа окон:

• главные родительские перекрывающиеся окна; • вспомогательные всплывающие окна диалога; • дочерние окна, подчиненные главным, в которых обычно располагаются все элементы управления.

После создания необходимых окон, приложение передает управление операционной системе Windows и в дальнейшем, вплоть до завершения работы, Windows возвращает ему управление только по специальным запросам.

Ключевая идея организации Windows заключается в первичности данных. Данные, несущие информацию об объектах, управляют программой, описывающей поведение этих объектов. Модель данных реализуется в Windows при помощи особого механизма сообщений. Сообщения являются единственным средством связи приложения и его окна с операционной системой. Все внешние по отношению к приложению действия таймеров, мыши, клавиатуры, портов кодируются в виде сообщений и распределяются по приложениям. Источниками сообщений служат прерывания.

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

8

Прерыванием называется ситуация временного прекращения выполнения операции с передачей управления другой операции по внешнему сигналу. Устройства, работающие в режиме обмена по прерываниям (таймеры, распределители импульсов, синхронизаторы и т.п.), выставляют требования прерывания в произвольные моменты времени, асинхронно по отношению к действиям процессора. В ответ на требование прерывания выполняется:

• идентификация источника прерывания; • запоминание текущего состояния прерванного процесса; • маскирование (запрет) повторных прерываний; • выполнение обработки прерывания; • восстановление и продолжение прерванного процесса.

По прерываниям операционная система формирует соответствующие

сообщения. Сообщения от таких разделяемых ресурсов как таймер, клавиатура или мышь, помещаются во входные очереди частей приложений, имеющих или получающих фокус. Для каждого потока данных Windows организует отдельную очередь. Обслуживаются очереди самими приложениями. При этом каждое приложение, получающее сообщения, «решает», следует ли на него реагировать. Такое поведение информационных объектов называют событийно-управляемым, или ориентированным на события.

Сообщения Windows весьма разнообразны. Существует более 200 встроенных идентификаторов сообщений Windows. Обычно выделяют системные сообщения, сообщения управления окнами, сообщения мыши, клавиатуры и др. Они неравноправны и образуют сложную иерархию, причем старшие сообщения могут порождать младшие.

Обрабатывая сообщения, Windows поддерживает два типа многозадачности: процессную и потоковую. Процессом называют приложение, находящееся в фазе выполнения. Процессная многозадачность выражается в том, что Windows позволяет одновременно запускать несколько приложений, разделяя между ними ресурсы компьютера, в первую очередь память и дисплей. Поток � это самостоятельно выполняемая и управляемая часть приложения. Любой процесс имеет как минимум один поток и поэтому, работая в Windows, можно по отдельности выполнять несколько частей одной программы.

Система Windows функционирует в режиме разделения времени. Она использует схему переключения задач с автовыгрузкой � вытесняющую многозадачность, базирующуюся на временных квантах. Отработав установленный квант времени, задача автоматически выгружается системой, и управление передается следующей задаче (если таковая имеется). Всякий раз перед переключением с одной задачи на другую процессор сохраняет

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

9

необходимый минимум сведений о задаче с тем, чтобы позднее можно было возобновить работу с точки прерывания. Такая схема переключения позволяет операционной системе полностью контролировать все задачи и предохраняет ее от блокирования какой-нибудь одной задачей, пытающейся захватить ресурсы.

Windows управляет памятью таким образом, чтобы предоставить ресурсам максимально большое свободное непрерывное пространство. Для этого система регулярно уплотняет коды программ, перемещая их на освобождающиеся места. Каждому приложению она старается предоставить столько виртуальной памяти, сколько ему требуется для нормальной работы. Если после уплотнения свободного пространства все же не хватает, Windows освобождает дополнительные ресурсы. При этом на диск временно выгружаются из памяти коды неактивных приложений в режиме свопинга.

Функционирование Windows

При включении компьютера операционная система загружается в оперативную память и формирует список необходимых для загрузки устройств с их уникальными номерами. Затем специальный драйвер Windows � менеджер конфигурации � запрашивает подчиненные ему драйверы шин о всех обнаруженных ими устройствах, которые требуют системных ресурсов. Операционная система реализует конфигурирование периферии в соответствии с технологией Plug & Play. Если периферийное оборудование удовлетворяет стандарту системной шины, портов и устройств ввода и вывода, оно заносится в специальную запись � дерево аппаратной конфигурации, � сохраняемую в памяти. При обнаружении в составе компьютера устройств, не поддерживающих технологию Plug & Play, Windows обращается в созданную заранее базу данных драйверов таких устройств. После регистрации еще один драйвер � арбитр ресурсов � на основании дерева аппаратной конфигурации планирует присвоение ресурсов. Драйверы шин сообщают устройствам о доступных им ресурсах и заносят эту информацию в регистры устройств.

В дальнейшем Windows предоставляет подключенные ресурсы программам, требующим их использования: принтеры � программам печати, CD-ROM � аудиопрограммам, модемы � почтовым системам и т.д. Если в ходе последующей эксплуатации произойдет отказ того или иного ресурса или замена его, операционная система обнаруживает возникшее несоответствие и пытается его разрешить путем восстановления нарушенной связи или подключения другого драйвера. При любом исходе подобной операции � успешном или безуспешном � Windows информирует об этом пользователя.

Завершив подключение ресурсов, система открывает программы, предписанные загрузочной процедурой, в частности � драйверы, утилиты,

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

10

диспетчеры и т.п. Специальная часть Windows � планировщик � для каждой открытой программы формирует очередь задач и распределяет эти очереди таким образом, чтобы все задачи могли участвовать в едином информационном процессе. Каждая самостоятельная часть выполняемой программы в многозадачной операционной системе Windows ассоциируется с отдельной задачей и проектируется таким образом, что обладает способностью генерировать сообщения о событиях. В сообщении указывается источник события и его характер (щелчок, включение, нажатие клавиши и т.п.).

Любая задача может находиться в состоянии выполнения, если ее обслуживает процессор; состоянии готовности, когда она ждет обслуживания; состоянии блокировки в ожидании наступления событий. В соответствии с очередностью, операционная система подключает задачам ресурсы и выделяет защищенное виртуальное адресное пространство в оперативной памяти и на свободных местах магнитных накопителей. В этом пространстве каждая задача функционирует в течение разрешенного отрезка времени, а по завершении его автоматически выгружается системой из памяти, освобождая ресурсы следующей задаче. При этом задачи могут зависеть друг от друга: одна из них занимается подготовкой данных, другая их сортирует, а третья выводит результаты в файл. Пока решается одна задача, следующая готовится к выполнению, не занимая ресурсов. Последовательность решения может быть самой разной в зависимости от приоритета и числа задач в очереди. Очереди отдельных программ не теряются и не перепутываются, а планировщик распределяет время центрального процессора так, чтобы обеспечить его оптимальную загрузку.

В ходе выполнения одной группы задач, Windows может обнаружить новую программу, требующую выделения ресурсов. Для такой программы операционная система формирует новую очередь и обрабатывает ее наряду с другими во вновь выделенном адресном пространстве. Выделяя отдельное пространство каждой задаче, система исключает их конфликты. Но существуют программы, которые изначально не спроектированы для многозадачной среды и пытаются монополизировать память и ресурсы. К ним относятся, в частности, программы операционной среды MS DOS. Все задачи подобного типа Windows ставит в одну общую очередь и, отождествляя их с одной задачей, выделяет одно адресное пространство. В случае аварийного завершения любой из них, все остальные однозадачные программы приходится завершать вместе с аварийной и принудительно выгружать из памяти.

Для интеграции программ и документов с ранее созданными программными объектами в Windows используются буфер обмена, объектное связывание и встраивание (OLE) и динамический обмен данными (DDE). Через буфер обмена выполняется статическое связывание данных. Технологии OLE и DDE реализуют динамическое внедрение и связывание,

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

11

регламентируя правила создания документов, включающих в свой состав объекты из различных приложений. Любые данные, которые переносятся из документа, созданного с помощью одной программы (сервера), в документ другой программы (клиента), по терминологии OLE называются объектом. Источник такого объекта представляется обычно областью экрана, которую можно выделить щелчком мыши, чтобы изменить ее масштаб или перенести на новое место. Этот же объект редактируется прямо в исходном файле после его активизации двойным щелчком. Поэтому, если вставляемая информация используется в нескольких документах и во всех должна выглядеть одинаково, динамическому внедрению и связыванию целесообразно отдавать предпочтение перед статическим. Правда, подобная связь может оборваться при переносе клиента или сервера на новое место. Код каждого объекта содержит два особых компонента. Первый из них отвечает за отображение, а второй � за возможность редактирования. Благодаря такой организации, пользователь может либо связываться с объектом из своего документа (link), либо внедрять его в документ (embed). При использовании связи объект хранится отдельно от документа, но после редактирования в документе появляется его обновленное изображение. Если же объект внедряется, в документе отображается его копия. Основными достоинствами OLE являются:

• возможность редактирования объекта прямо в приложении; • поддержка встроенных объектов; • возможность устанавливать связи между объектами, встроенными в документы;

• «знание» объектом приложения, которым он создан, и поддержка его инструментария;

• возможность редактирования объектов, подготовленных на разных языках, и сложных объектов, сделанных другими разработчиками.

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

Его основой является протокол, описывающий обмен данными между активными приложениями, удобный для создания программ одновременной обработки одного объекта из разных приложений.

Управление объектами Windows

Элементы управления

Все электронные документы и инструментальные программы Windows размещаются в файлах � именованных областях накопителей. Каждый файл характеризуется размером, датой создания и обновления, значком и рядом других атрибутов. Разработчики программ и пользователи группируют

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

12

файлы по тематическому или иному принципу в отдельные папки. Каждая папка � это файл, в котором зарегистрированы сгруппированные вместе файлы. В свою очередь, несколько папок и файлов могут объединяться в новые папки и т.д. На экране каждая папка и инструментальная программа вместе с обрабатываемыми документами представляется в своем окне. Наиболее объемная папка, в которой зарегистрированы все остальные папки, электронные документы и инструментальные программы, доступные пользователю, получила название Рабочего стола. В ней располагаются информационные объекты Windows - значки, кнопки, панели и меню. В окнах могут находиться находится строки состояния, вкладки, поля и надписи, переключатели и флажки, счетчики, ползунки, индикаторы и полосы прокрутки.

Управление информационными объектами осуществляется по принципу «укажи и воздействуй». Кнопки действуют по щелчку, а значки открываются и инициализируются клавишей <Enter>, щелчком или двойным щелчком в зависимости от настройки интерфейса. Меню представляет список доступных пользователю операций. Почти каждый информационный объект Windows имеет меню. Оно может быть постоянной частью объекта с раскрывающимися при выделении пунктами, либо появляться в определенных ситуациях. Первое обычно называют главным меню, так как оно отражает все возможные операции над объектом. Второе именуют контекстным меню. Оно появляется в ответ на правый щелчок или клавиатурную комбинацию <Shift F10>, и его содержание зависит от текущего состояния информационного объекта. Если имя выделенного пункта заканчивается многоточием, то при выборе меню появляются уточняющие вопросы или предложения. Если имя пункта завершается стрелкой, то указание на него приводит к появлению меню следующего уровня. В остальных случаях меню открывает выбранный информационный объект.

Управление элементами выполняется по событиям, трансформируемым из сообщений Windows. Событие описывается ссылкой на процедуру-обработчика сообщения Windows или исключительной ситуации.

К основным событиям Windows относятся открытие и загрузка в память; изменение размеров и активизация элемента управления; его выгрузка из памяти и закрытие; щелчок, двойной щелчок и правый щелчок мышью; нажатия клавиш; получение и потеря фокуса объектами.

Свойства объектов

Каждый элемент управления, каждое окно и каждый файл характеризуется набором характеристик � свойствами. Кратчайший путь к свойствам конкретного объекта лежит через контекстное меню, открываемое

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

13

правым щелчком по его значку. В меню Вид многих окон также есть пункт Свойства папки, позволяющий пользователю делать выбор между различными интерфейсами. Чтобы применить выбранную настройку ко всем папкам окна, в меню Вид .Свойства папки на вкладке Вид нажимается кнопка Как у текущей папки. А комплексную проверку и корректировку свойств всей номенклатуры информационных объектов Windows можно провести из меню Пуск .Настройка.

Наиболее важные характеристики аппаратного и программного обеспечения описаны в свойствах первого объекта Рабочего стола � Мой компьютер, доступных как через его контекстное меню Свойства, так и через меню Пуск .Настройка .Панель управления. Здесь указаны:

• общие свойства компьютера � тип операционной системы, сведения о пользователе, модель процессора, размер оперативной памяти;

• информация об устройствах � контроллерах, адаптерах, накопителях, клавиатуре, дисководах, дисплее, мыши, портах, сетевом оборудовании, системной аппаратуре;

• сведения о конфигурации и быстродействии системы. Контекстное меню Рабочего стола открывает свое окно Свойства

.Экран, доступное также из меню Пуск .Настройка .Панель управления. В нем можно оценить и выбрать фон экрана; заставку, обеспечивающую энергосберегающие функции дисплея; оформление и эффекты окон (цвет, размер, шрифт, значки); представление в Интернете (стиль Web); параметры (цветовую палитру и разрешающую способность).

В ходе комплексной проверки и корректировки свойств информационных объектов (меню Пуск .Настройка .Панель управления) уточняются дата и время; язык и стандарты на числа и денежные единицы; параметры клавиатуры; конфигурация драйвера мыши и скорость указателя; состояние источника питания; специальные возможности клавиатуры, звукового сопровождения, экрана, мыши. В сведениях о накопителях присутствуют их емкость и степень заполнения, даты проверки и дефрагментации, рекомендации по улучшению характеристик. Инструменты форматирования накопителей присутствуют в их контекстных меню.

Для задания свойств вновь подключаемых информационных ресурсов используются мастера. С помощью их окон диалога устанавливаются модемы и средства мультимедиа, формируются рабочие группы и организуется их взаимодействие. Через окна диалога выполняется конфигурирование сети и управление доступом к ее клиентам, устанавливаются драйверы нового оборудования. Системой осуществляется поддержка более 800 моделей матричных, лазерных и струйных принтеров, реализуется очередь заданий, отложенная печать и фоновое управление

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

14

печатью. Мастер установки и удаления программ помогает произвести все необходимые операции по развертыванию и регистрации новых программных продуктов, а также по удалению некоторых из них. В частности, системой реализуется обновление компонентов самой Windows и ее основного приложения Microsoft Office. Специальная программа занимается просмотром и установкой шрифтов.

Отдельный пункт меню Пуск .Настройка посвящен панели задач и меню Пуск. Под управлением мастера организации меню Пуск выполняется его корректировка, добавление новых и удаление лишних пунктов, просматривается все дерево меню, перемещаются его уровни. Из этого же пункта очищается меню Пуск .Документы. При соответствующей настройке Windows многие пункты меню Пуск могут быть перенесены или удалены из него через контекстные меню нижних уровней или простым перетаскиванием, в том числе � за пределы меню

Макросы

Многие приложения оснащены программными средствами, позволяющими автоматизировать деятельность пользователя посредством записи макросов � небольших программ, воспроизводящих определенную последовательность действий пользователя. Такими средствами оснащены, в частности, программные продукты Microsoft Office.

Первым шагом на пути создания макроса является мысленное построение такой последовательности, разработка и оптимизация выполняемых шагов. На втором шаге проводится тренировочное выполнение задуманных действий с помощью мыши и клавиатуры. Затем можно приступать к записи.

В Word из меню Сервис .Макрос .Начать запись или двойным щелчком по индикатору ЗАП в строке состояния открывается окно диалога Запись макроса, в котором начинается процесс записи действий пользователя. Каждое нажатие клавиши и многие события, вызываемые мышью, заносятся компьютером в память. В процессе записи можно «научить» программу каким-либо действиям, например, заполнению документа текстом или переносу данных на соседнюю страницу. Имеется возможность приостановить запись, для чего на панели инструментов Остановка записи присутствует кнопка Пауза. Ошибочные действия отменяются кнопкой Отменить или клавишей <Esc>. Для завершения записи следует нажать кнопку Остановить запись на панели Остановка записи, дважды щелкнуть индикатор ЗАП или выбрать меню Сервис .Макрос .Остановить запись. Чтобы испытать полученную программу, надо обратиться в меню Сервис .Макрос .Макросы, указать макрос в открывшемся окне диалога и нажать кнопку Выполнить. Неудачный или неработоспособный макрос может быть удален из документа кнопкой

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

15

Удалить окна диалога Макрос. Макросы можно перемещать и копировать между документами и шаблонами через окно Организатор.

Другой способ записи макросов в Word связан с панелями инструментов Формы и Web-компоненты. Текстовое поле, Флажок, Поле со списком и другие объекты, создаваемые с помощью этих панелей, в Свойствах содержат возможность вызова макросов при входе и выходе. Подготовленный макрос может быть испытан не только через меню Сервис .Макрос .Макросы, но и щелчком по вызывающему его объекту формы.

Макросы удобно назначать клавиатурным комбинациям. С этой целью в поле Новое сочетание клавиш, открываемое из окна Запись макроса, вводятся требуемые клавиши. Многие клавиатурные комбинации зарезервированы в Microsoft Office. Чтобы узнать их, в меню Сервис .Макрос .Макросы выбирается пункт Команд Word в списке Макросы из: и нажимается кнопка Выполнить. А для подключения макроса к кнопке панели инструментов или к пункту меню используется окно диалога Настройка. На вкладке Команды данного окна следует выбрать категорию Макросы и перетащить значок ранее созданного макроса на одну из панелей инструментов. Затем, не закрывая окна Настройка, из контекстного меню новой кнопки или из-под кнопки Изменить выделенный объект меняют значок или вид кнопки или пункта меню. Лишние кнопки удаляют перетаскиванием их за пределы панели инструментов при нажатой клавише <Alt> или при открытом окне Настройка. С макросом можно связать, кроме того, поле MacroButton из меню Вставка .Поле.

В Excel запись макросов также начинается из меню Сервис .Макрос .Начать запись. В процессе записи можно «научить» программу заполнению ячеек информацией или переносу данных на соседний лист. Имеется возможность записывать относительные ссылки на ячейки, для чего на панели инструментов Остановка записи присутствует кнопка Относительная ссылка. Завершение записи осуществляется нажатием кнопки Остановить запись на панели Остановка записи или выбором меню Сервис .Макрос .Остановить запись. Испытание полученной программы производится из меню Сервис .Макрос .Макросы.

Иной способ записи макросов Excel связан с панелью инструментов Рисование, открываемую через меню Вид .Панели инструментов .Рисование. Любая автофигура, созданная с помощью этой панели, в своем контекстном меню содержит пункт Назначить макрос, открывающий окно диалога Назначить макрос объекту. Кнопка Записать этого окна ведет в знакомое окружение Запись макроса. Подготовленный макрос может быть испытан как через меню Сервис .Макрос .Макросы, так и щелчком по вызывающему его объекту.

Макросы Excel можно назначать клавиатурным комбинациям и переназначать для вызова их другими объектами и клавишами. Макрос можно назначить кнопке на панели инструментов или меню через окно

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

16

диалога Настройка. На вкладке Команды данного окна в категории Макросы перетаскивают объект Настраиваемая кнопка на одну из панелей инструментов. Затем в контекстном меню новой кнопки выбирают пункт Назначить макрос, указывают один из макросов и нажимают кнопку ОК. Вместо контекстного меню можно использовать кнопку Изменить выделенный объект того же окна Настройка. А для назначения макроса пункту меню, на вкладке Команды выбирается категория Новое меню, и в строку меню перетаскивается объект Новое меню.

В Access макрос указывает на языке макрокоманд, какие действия следует выполнить в ответ на то или иное событие.

При наличии открытой базы данных Access любая группа ее макросов открывается с вкладки Макросы, доступной через меню Вид .Объекты базы данных .Макросы. Для открытия окна макроса выделяют имя группы и нажимают кнопку Конструктор. Окно разделено на четыре столбца � Имя макроса, Условие, Макрокоманда и Примечание, причем первые два из них могут оказаться скрытыми в меню Вид .Имена макросов и Вид .Условия или под одноименными кнопками панели инструментов. Использование столбца Имя макроса необязательно, если в окне находится всего один макрос. В этом случае имя окна совпадает с именем макроса. Если же окно содержит несколько макросов, то каждый макрос в нем обладает уникальным именем, определяемым программистом. Как правило, каждая такая группа описывает процесс обработки событий одного объекта базы данных: формы или отчета. Ее назначение комментируется в столбце Примечание, который Access игнорирует при выполнении.

Каждый макрос ассоциируется с группой макрокоманд, обрабатываемых одна за другой, пока Access не обнаружит строку с новым именем или не достигнет последней строки окна макроса. Пустые строки игнорируются, поэтому такими строками принято разделять макросы в группе для удобства их чтения и правки. Все макрокоманды макроса перечислены в столбце Макрокоманда. После выделения любой из них в нижней части окна раскрывается список аргументов, уточняющих область значений и особенности выполнения.

В столбец Условие может быть занесено условное выражение, определяющее необходимость выполнения макрокоманды соответствующей строки. Макрокоманда запускается только в случае выполнения условия. В противном случае Access ее пропускает. Если одним условием надо запустить несколько макрокоманд, в последующих строках столбца Условие располагают многоточие (�). Если запуск макрокоманды нужно произвести только тогда, когда условие не выполняется, используется макрокоманда ОстановитьМакрос. Всякий раз, когда условие не выполняется, Access переходит к выполнению первой из макрокоманд, против которой нет многоточия. Макрокоманда ЗапускМакроса используется для организации циклов. Ее аргументы указывают число повторений или их условия.

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

17

Для документирования макросов создается отчет из меню Сервис .Анализ .Архивариус.

Перед программированием макроса назначается событие, реакцию на которое он должен описывать:

Событие Имя Комментарий

События мыши и клавиатуры

Двойной щелчок DblClick При двойном щелчке мышью, в обрамлении событий Click

Нажатие кнопки Click При щелчке левой кнопкой мыши Кнопка вниз MouseDown При нажатии любой кнопки мыши Кнопка вверх MouseUp При отпускании любой кнопки Перемещение указателя MouseMove При передвижении мыши Клавиша вниз KeyDown При нажатии клавиши клавиатуры Клавиша вверх KeyUp При отпускании клавиши Нажатие клавиши KeyPress При нажатии символьной клавиши

События окна Открытие Open До отображения данных Загрузка Load После открытия и вывода данных Выгрузка UnLoad Закрытие Close Изменение размера Resize В т.ч. при первом открытии формы

События данных Вход Enter Перед принятием элементом фокуса Получение фокуса GotFocus После принятия элементом фокуса Выход Exit При выходе, но до потери фокуса Применение фильтра ApplyFilter Включение Activate Перед получением формой фокуса Отключение Deactivate Текущая запись Current Перед получением фокуса записью До вставки BeforeInsert Перед обновлением записи После вставки AfterInsert После обновления записи Удаление Delete

До подтверждения Del BeforeDel-Confirm

Перед открытием окно диалога, подтверждающего удаление

После подтверждения Del

AfterDel-Confirm

После закрытия окна диалога, подтверждающего удаление

До обновления Before-Update

При выходе с изменением элемента, перед заполнением буфера записи

После обновления AfterUpdate При выходе с изменением элемента, после заполнения буфера записи

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

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

18

Событие Имя Комментарий При обновлении Updated

Отсутствие в списке NotInList При выходе из измененного поля со списком, перед его обновлением

Фильтрация Filter Потеря фокуса LostFocus Потеря фокуса, после события Exit Форматирование Format Печать Print Возврат Retreat Нет данных NoDate Страница Page Таймер Timer

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

состояния объекта, сопровождаемое откликом Windows. В частности, события клавиатуры и мыши сопровождаются прерываниями процессов. События окна связаны с открытием и закрытием форм и отчетов. События фокуса определяют активность или пассивность информационного объекта. События данных происходят при их изменении, а события фильтра � при отборе. События печати характеризуют режимы печати и просмотра отчетов. События ошибок и таймера передаются в формы и отчеты.

Для создания макроса в открытом окне базы данных на вкладке Макрос нажимается кнопка Создать либо используется меню Вставка .Макрос. Проще же применить Построитель макросов в окне Конструктора форм или Конструктора отчетов. Для этого выделяется нужный элемент управления, выбирается меню Вид. Свойства или нажимается кнопка Свойства и в открывшемся окне диалога выбирается вкладка События. На ней выполняется щелчок на нужном событии и кнопкой Построитель открывается Построитель макросов. Можно также создать новое окно макроса через меню Файл .Сохранить как или клавишей <F12>. Для дополнения новым макросом существующей группы, ее открывают и, отступив строку от предыдущего макроса, вводят имя нового. Затем со следующей строки вводятся макрокоманды, их аргументы, условия и примечания. Из меню Файл .Сохранить или одноименной кнопкой панели инструментов выполняется сохранение группы, после чего макрос испытывается.

Макрокоманды, из которых формируются макросы, перечислены в таблице:

Макрокоманда Имя Макрокоманда Имя

КопироватьОбъект CopyObject ОстановитьВсе Макросы StopAllMacros

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

19

Макрокоманда Имя Макрокоманда Имя Переименовать Rename Выход Quit УдалитьОбъект DeleteObject ОтменитьСобытие ConcelEvent ОткрытьТаблицу OpenTable ПрименитьФильтр ApplyFilter ОткрытьЗапрос OpenQuery СледующаяЗапись FindNext ОткрытьФорму OpenForm НайтиЗапись FindRecord Панель- Инструментов ShowToolBar КЭлементу

Управления GoToControl

ОткрытьМодуль OpenModule НаЗапись GoToRecord Закрыть Close НаСтраницу GoToPage Сохранить Save ВывестиВФормате OutputAs Печать Print ОтправитьОбъект SendObject Установить- Сообщения SetWarnings ПреобразоватьБазу

Данных Transfer Database

ОбновитьОбъект RepaintObject Преобразовать ЭлТаблицу

TransfSpread Sheet

Обновление Require ПреобразоватьТекст TransferText ПоказатьВсеЗаписи ShowAllRecords ДобавитьМеню AddMenu ЗадатьЗначение SetValue ЗапускМакроса RunMacro

Сигнал Beep КомандаМеню DoMenuItem ЗапускЗапросаSQL RunSQL ЗадатьКоманду- Меню SetMenuItem Команды

Клавиатуры SendKeys

ЗапускПрограммы RunCode ПесочныеЧасы Haurglass ЗапускПриложения RunApp ВыводНаЭкран Echo ОстановитьМакрос StopMacro ВыделитьОбъект SelectObject ОткрытьОтчет OpenReport Сообщение MsgBox

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

Макрокоманда либо нажимается <F4> или <Alt ↓ >. Если в качестве аргумента макрокоманды необходимо ввести имя объекта базы данных, его можно не впечатывать, а выбрать из раскрывающегося списка. Некоторые макросы удобно вводить перетаскиванием в окно макроса объекта базы данных: таблицы, запроса, формы, отчета. При этом Access вставляет строку над ячейкой, на которой опущена кнопка мыши, вводит макрокоманду открытия окна объекта и автоматически определяет его параметры. При перетаскивании в столбец другого макроса вводится команда ЗапускМакроса с указанием его имени в строке аргумента. Если же аргумент описывается выражением, его можно описать построителем выражений под соответствующей кнопкой.

Для удаления строки макроса выполняется щелчок в столбце выделения в левой части окна макросов и нажимается кнопка на панели

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

20

инструментов, удаляющая строку. Чтобы добавить строку, указатель располагается в следующей строке и нажимается клавиша <Insert> или соответствующая кнопка панели инструментов. Для вставки строк вместо существующих, они предварительно выделяются.

Каждая макрокоманда реализует определенную операцию. Макрокоманда КомандаКлавиатуры имитирует нажатие клавиш: {Backspace}, {Bs}, {BkSp}; {CapsLock}; {Clear}; {Delete}, {Del}; {End}; {Enter}, {~}; {Escape}, {Esc}; {Help}; {Home}; {Insert};{Fn} (n = 1,.. 16); {Down}; {Left}; {PgDn}; {PgUp}; {Tab}; {Up}. Вместо <Shift> вводится +, вместо <Ctrl> печатают ^, а вместо <Alt> ставят %. Чтобы послать клавиатурную комбинацию несколько раз, добавляется число ее повторений, например {^Down 3}. Для автоматического обновления данных с помощью макросов используют макрокоманды ОбновитьОбъект, Обновление или ПоказатьВсеЗаписи. Макрокоманда ЗадатьЗначение используется для инициализации элементов таблиц, управляющих объектов, свойств формы или отчета.

Макрокоманда ЗапускЗапросаSQL запускает запрос на изменение с помощью соответствующего выражения SQL длиной до 256 символов. Кроме того, эта макрокоманда позволяет запустить управляющий запрос. Для запуска в макросе запроса на выборку или перекрестного запроса следует с помощью аргумента Режим макрокоманды ОткрытьЗапрос открыть существующий запрос на выборку или перекрестный запрос в режиме таблицы. Эта же макрокоманда позволяет выполнить сохраненные запросы на изменение и запросы SQL.

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

От алгоритма к программе

Историю программирования традиционно ведут от языка Fortran (FORmula TRANslator), ставшего в 1957 г. первым языком программирования высокого уровня, не имевшим жесткой привязки к физическим адресам внутренних и периферийных устройств компьютера. А в 1963 г. профессорами Дармутского колледжа Д.Кемени и Р.Куртцем были разработаны первые 14 команд языка Basic. Basic (Beginner's All-purpose Symbolic Instruction Code) первоначально предназначался для обучения программированию. В конце 60-х � начале 70-х годов язык получил мощную поддержку фирм General Electric, HP и DEC, и позднее практически все мини- и микрокомпьютеры снабжались Basic-системами. Благодаря президенту Microsoft Б.Гейтсу, Basic стал первым языком программирования для персональных компьютеров. Язык приобрел огромную популярность во всем мире в силу своей простоты и ориентации на диалоговый режим. Разработан стандарт минимального подмножества

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

21

языка Basic, утвержденный в 1976 г. Сегодня наибольшее распространение получил Visual Basic, и в первую очередь � Visual Basic for Applications (VBA), обслуживающий все приложения Microsoft Office.

Как и все языки высокого уровня, Basic строится в соответствии с концепцией процедурного программирования. Процедурный подход основан на алгоритмической декомпозиции решаемой проблемы и реализуется посредством решения очевидных формализуемых задач. Правило «разделяй и властвуй» ориентирует на представление проблемы набором самостоятельных блоков данных � процедур таким образом, чтобы, выполнив каждую из них, можно было прийти к решению всей проблемы. «Благодаря процедурам, лучше прослеживается структура больших и сложных программ; они обеспечивают логическую сегментацию всей задачи и облегчают отладку», утверждает автор «Искусства программирования» Д.Кнут.

Обычно подобное разделение выполняется на этапе алгоритмизации � первом этапе «нисходящего проектирования» (top-down design). Алгоритмом в информатике принято называть систему правил, предписывающую конечную последовательность действий, шагов решения во времени. Слово «алгоритм» произошло от имени персидского математика Al Khowarizmi, автора трактата об основах десятичной арифметики, хотя концепция алгоритмизации родилась гораздо раньше, в 300 � 400 гг. до н.э. в трудах Евклида.

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

• понятностью применительно к конкретному исполнителю � вычислительной системе, человеку � и доступностью средств реализации;

• массовостью, то есть независимостью от входных данных, что позволяет использовать один и тот же алгоритм для решения разных однотипных задач;

• конечным множеством входных данных, составляющих область определения алгоритма, и конечным выходным множеством, то есть областью значений;

• конечностью решения, то есть способностью приводить к ответу после выполнения конечного числа шагов;

• однозначностью, то есть приведением к одному и тому же результату при многократной подаче на вход его одних и тех же данных.

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

учетом возможной последовательности их обработки. Иначе говоря, проблема должна быть хорошо продумана, прежде чем она сможет быть решена. Не закончив алгоритмизации, нет смысла начинать кодирование,

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

22

ибо в противном случае процесс проектирования теряет устойчивость, а найденные решения вряд ли удовлетворят поставленным требованиям.

Процедуры

В процедурах состояние и поведение программных объектов описывается на алгоритмическом языке операциями над данными. Данные в операциях представляются операндами, которые соединяются знаками операций � специальными лексемами � операторами, зарегистрированными в словаре языка. В первую очередь операциями описываются процессы инициализации переменных и констант, то есть присваивания им определенных значений. Операции описывают, также, логические, математические и прочие процессы.

Кроме операторов, лексемами являются стандартные константы и имена стандартных функций языка программирования. Обращение к стандартной функции называют вызовом. Передаваемые при вызове данные для функции именуются значениями аргументов, а результат их обработки � возвращаемым значением. Стандартная функция обрабатывает передаваемые ей значения аргументов по заданному алгоритму, возвращая результат в операцию, из которой она была вызвана.

Операции группируют в выражения � аналоги предложений естественных языков, строящиеся в соответствии с синтаксисом языка

В дополнение к выражениям, текст программы часто содержит комментарии, помогающие понять смысл выражений � их семантику. Благодаря особому синтаксису, комментарии не влияют на ход выполнения программы. «Удачно подобранные и хорошо написанные комментарии � существенная часть программы. Но если что-то можно оформить средствами самого языка, следует это делать, а не вводить комментарии, ибо хорошие программы удобочитаемы сами по себе», писал автор языка С++ Б. Страуструп.

Процедуры с выражениями и комментариями заключаются в файлы исходных текстов, из которых собираются программы. Группы файлов обычно объединяются проектом. Через проект поддерживается отношение исходных текстов программы с операционной системой и библиотеками. Проект включает в себя объекты приложения, в котором он разрабатывается и выполняется. В случае Word или Excel это:

• модули ThisDocument или ThisWorksheet шаблона Normal и всех открытых документов;

• дополнительные модули с размещенными в них программными фрагментами;

• модули форм для ведения диалога с пользователем, описывающие их поведение;

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

23

• модули классов, характеризующие состав, свойства и подпрограммы авторских объектов разработчика.

Проект хранится в одном файле с документом. В

многодокументальной среде Microsoft Office можно обрабатывать сразу несколько документов, представленных своими шаблонами.

Редактор Visual Basic

Программа на языке Visual Basic скрыта от пользователя Microsoft Office. Для знакомства с текстом любого макроса и подготовки авторских проектов надо перейти со страниц документа в редактор Visual Basic.

Для этого в окне Макрос выделяется имя макроса и нажимается кнопка Изменить. Возможен и иной способ: через меню Сервис .Макрос .Редактор Visual Basic (<Alt F11>) открывается интегрированная среда редактора � конструктор, в окне Проект которого активизируется требуемая Программа. Здесь же функциональной клавишей <F2> можно открыть окно Просмотр объектов и выбрать модуль в его списке VBAProject.

Главное меню редактора Visual Basic содержит традиционные для Microsoft Office пункты Файл, Правка, Вид, Вставка, Формат, Сервис, Окно, Справка и новые пункты Отладка, Запуск. Меню Файл управляет проектами, удаляя и перемещая их командами Файл .Удалить, Файл .Экспорт файла, Файл .Импорт файла. Через Вид открываются необходимые окна, дополняющие ранее открытые Проект и Программу. Из меню Вставка проект дополняется новыми модулями, формами и процедурами. Управление ходом выполнения программы осуществляется из меню Запуск. В меню Отладка входят средства наблюдения за данными, а Сервис управляет ссылками, макросами, параметрами, защитой.

Исходный текст представляется в окне Программа. Контекстное меню окна помогает найти Описание активной подпрограммы, а также Вернуться к последней позиции правки. Под строкой заголовка окна расположены два списка ускоренного поиска. В первом из них перечисляются все объекты модуля, а во втором � связанные с выбранными объектами процедуры. Слева от горизонтальной полосы прокрутки окна находятся кнопки, управляющие представлением всего содержимого модуля или его отдельных составляющих.

Все модули имеют единую структуру и содержат раздел описаний и раздел процедур. В первом даны все установки параметров и объявления, касающиеся всего модуля. Говорят, что здесь хроанится код уровня модуля. Во втором разделе описываются процедуры.

Текст программы может быть размещен в одном или в нескольких модулях. Различают стандарные модули и модули классов. Для создания

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

24

стандартного модуля в окне проекта следует обратиться к меню Вставка .Модуль или нажать кнопку Вставить .Модуль на панели инструментов. В модуль аналогичным образом (Вставка .Процедура) вставляются шаблоны процедур. Модули классов встраиваются в формы. Для сохранения модулей используется меню Файл .Сохранить.

Перед выполнением созданной или измененной программы через меню Отладка .Компилировать VBAProject полезно убедиться в отсутствии синтаксических ошибок. В случае ошибки компилятор выводит на экран сообщение. При возникновении проблем с устранением ошибки производится отладка программы. Отладка выполняется в режиме прерывания, в который можно перейти одним из следующих способов:

• нажатием кнопки Отладка в окне Сообщение об ошибке; • нажатием клавиш <Ctrl Break> в ходе работы программы; • размещением в тексте программы оператора Stop; • заданием остановки через меню Отладка .Точка останова (<F9>) или щелчком в полосе, ограничивающей слева окно программы.

В режиме прерывания можно

• узнать значение переменной или свойства, подведя к ним указатель мыши (при установленном флажке Подсказки значений переменных в меню Сервис .Параметры) или через меню Отладка .Контрольное значение, Отладка .Добавить контрольное значение;

• выполнить выражение из меню Вид .Окно отладки. Выход из режима прерывания осуществляется через меню Запуск .Сброс.

Выполнение программы начинается из меню Запуск .Запуск программы, либо одноименной кнопкой панели Visual Basic или функциональной клавишей <F5>. Для вызова макросов из документа, их назначают кнопкам, полям, меню или клавиатурным комбинациям.

Некоторые особенности имеет редактор, встроенный в Access, в котором готовятся коды модулей.

Программирование в Access ведется как с использованием макросов, так и на базе модулей. Но по завершении создания приложения все макросы целесообразно преобразовать в модули. Это можно выполнить из меню Сервис .Макрос .Преобразовать макросы или Файл. Сохранить как / экспорт переключателем В виде модуля Visual Basic. Модули способны выполнять действия, недоступные макросам, реализовать объектные связи, участвовать в подготовке печатных документов. Как и в других офисных приложениях, в Access различают стандартные, или общие модули, и модули классов. Язык модулей определен подключаемыми к Access библиотеками,

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

25

конфигурацию которых при необходимости меняют из меню Сервис .Ссылки.

Для создания стандартного модуля, доступного изо всех форм и отчетов, в открытом окне базы данных на вкладке Модуль нажимается кнопка Создать либо на панели инструментов под соответствующей кнопкой выбирается Модуль. В результате открывается окно конструктора модуля, в котором размещаются тексты программ. Модули классов создаются непосредственно в формах и отчетах и реагируют только на события объектов, к которым они относятся: форм, отчетов, элементов управления. Для их построения используется Построитель кода в окнах свойств Конструктора форм или Конструктора отчетов. Для этого выделяется нужный объект, выбирается меню Вид .Свойства или нажимается кнопка Свойства и в открывшемся окне выбирается вкладка События. На ней выполняется щелчок на нужном событии и кнопкой Построитель окна свойств открывается конструктор. Той же цели можно достичь и с помощью меню Вид .Программа или кнопки Программа панели инструментов, доступной с вкладок Формы и Отчеты окна базы данных.

Процесс подготовки и отладки модулей Access не отличается от ранее описанного.

Выражения

Обычное выражение языка Visual Basic занимает отдельную строку, ограничителем которой служит непечатаемый символ абзаца. Иногда в одной строке объединяют несколько коротких выражений, соединяя их двоеточием. Длинные же выражения разбивают по строкам, используя для этого символ пробела, за которым следует символ подчеркивания. Пробел (<Space>) является разделителем, причем несколько пробелов считаются эквивалентными одному. Другими разделителями служат непечатаемые символы <Enter> и <Tab>.

Лексемы языка представлены в первую очередь операторами. Операторы Visual Basic представляют собой вызовы стандартных процедур языка, а также знаки операций. Примеры использования многих операторов приведены в таблице: Оператор Определение Пример

Ввод и вывод Input # Ввод (последовательный) Input #1, строка, номер Line Input # Ввод строки из файла Line Input #1, т1

SendKeys Ввод клавиатурной комбинации SendKeys "%{F4}", True

Width Ширина поля вывода Width #1, 5

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

26

Оператор Определение Пример Математические

+ Сложение y=3+2 �5 - Вычитание, знак y=50-30 �20 * Умножение y=7*3 �21 / Деление y=7/3 �2.333333 \ Деление нацело y=7\3 �2 Mod Остаток y=7 Mod 3 �1 ^ Возведение в степень y=7^3 �343

Строковые & Слияние y="sc" & "an" �scan ! Ссылка на объект Персонал.xls!a . Свойство, метод Application.Open Rset Правое выравнивание Rset мояСтрока

Сравнение и присваивание = Присваивание а = 5 := Присваивание аргумента а := 5 < Меньше 123<1000 <= Меньше или равно "свет"<="свет" = Равно "март" = "ма" > Больше "л" >"г" >= Больше или равно "тьма" >= "свет" <> Не равно "б"<>"b"

Логические And Логическое И True And True Or Логическое ИЛИ True Or False Not Логическое НЕ Not True Xor Исключающее ИЛИ True Xor False Eqv Эквивалентность False Eqv False Imp Импликация False Imp False

Файловые Write Write #1, "привет" Print # Print #1, "тeст" Put Put #1, х, мойТест Seek

Запись в файл

Seek #1, запись ChDir Смена папки ChDir "D:\WIN\S" ChDrive Смена дисковода ChDrive "D" Close Закрытие файла Close Kill Удаление файла Kill "тестФайл" MkDir Создание папки MkDir "D:\WIN\S" Name Переименование Name x As y

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

27

Оператор Определение Пример Open Открытие файла Open "тест" For Input As #1 RmDir Удаление папки RmDir "тест"

Прочие Beep Сигнал Beep Call Вызов подпрограммы Call Пример (2, 3) Const Авторская константа Const ТЕСТ Dim Авторская переменная Dim тест Function Авторская функция Function Тест () Let Присваивание Let тест = "привет" Private Личная переменная Private тест Propety Свойство Property Let Длина () Public Общая переменная Public тест

Randomize Инициализация генератора случайных чисел Randomize

ReDim Переобъявление массива ReDim тест (5) Rem, � Комментарий Rem замечание Reset Закрытие всех файлов Reset Resume Завершение подпрограммы Resume Set Cсылка на объект Set тест = объект Static Статическая переменная Static тест Stop Остановка программы Stop Sub Авторская подпрограмма Sub Тест () Type Абстрактный тип Type �End Type

В следующей таблице даны примеры некоторых функций и их

вызовов: Функция Определение Пример

Ввод и вывод Input Ввод символа из файла символ = Input (1, #1) InputBox Окно диалога для ввода слово = InputBox (слово1, т, Def) MsgBox Вывод сообщения ответ = MsgBox (слово1, , слово2)

Дата и время Date Текущая дата дата = Date Day День месяца день = Day (дата)

Format Формат даты Msgbox Format (Now, "d mmmm yyyy г.")

Hour Час суток часов = Hour (время) Minute Минута часа минут = Minute (время) Month Месяц года месяц = Month (дата)

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

28

Функция Определение Пример Now Текущие дата и время сегодня = Now Time Текущее время время = Time Timer Число секунд с полуночи конец = Timer Year Год год = Year (дата)

Математические Abs Абсолютное значение число = Abs (-50.3) ' 50.3 Int, Fix Целая часть числа число = Fix (56.5) ' 56 Sgn Знак числа знак = Sgn (-5) ' -1 Sqr Квадратный корень число = Sqr (4) ' 2 Rnd Случайное число число = 6 * Rnd

Строковые Asc Код заданного символа число = Asc ("A") ' 65 Chr Символ заданного кода знак = Chr (65) ' A IsNull Пустая строка сколько = IsNull (слово) Left Левая часть строки слева = Left (строка, 1) Len Длина строки длина = Len (что) Mid Средняя часть строки среди = Mid (строка, 1, 3) Right Правая часть строки справа = Right (строка, 1) Space Строка пробелов строка = Space (10) String Повторяющийся символ строка = String (5, "*") ' *****

StrComp Сравнение строк больше = StrComp ("первая", "вторая") � 1

Val Числовое значение строки число = Val (" 2 45 7") ' 2457 RGB Цвет красный = RGB (255, 0, 0)

Файловые CurDir Текущая папка п = CurDir ("D") ' "D:\Word" Dir Заданная папка папка = Dir ("C:\WIN\*.ini") EOF Конец файла Do While Not EOF (1) FileLen Размер файла длина = FileLen ("тест") LOF Размер файла длина = LOF (1) Err Номер ошибки номер = Err

Функции VBA Choose Вывод значения из списка x = Choose (a, "0", "1", "2", "3")

IIf Значение в зависимости от первого аргумента x = IIf (аргумент, "2000", "0")

IsArray Массив? x = IsArray (аргумент) IsDate Поле даты? x = IsDate (Forms!Клиенты!День) IsEmpty Инициализировано? x = IsEmpty (Forms!Клиенты!День) IsError Ошибка? x = IsError (Forms!Клиенты!День) IsMissing Пропуск? x = IsMissing (аргумент)

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

29

Функция Определение Пример

IsNumeric Числовое поле? x = IsNumeric (Forms!Клиенты!День)

IsObject Объект OLE? x = IsObject (Forms!Клиенты!День) Partition Число в интервале? MsgBox Partition (a, 0, 100, 50) Switch Первое выражение истины x = Switch (Forms!Год!День=1,"1") TypeName Имя типа данных Variant x = TypeName (a)

Константы Visual Basic бывают числовыми, строковыми, объектными.

Таблица некоторых констант языка:

Константа Код Определение Константы диалога

vbOKOnly 0 Кнопка OK vbOKCancel 1 Кнопки OK и Отмена

vbAbortRetryIgnore 2 Кнопки Удалить, Повторить, Пропустить

vbYesNoCancel 3 Кнопки Да, Нет, Отмена. vbYesNo 4 Кнопки Да и Нет vbRetryCancel 5 Кнопки Повторить и Отмена vbCritical 16 Предостережение vbQuestion 32 Вопрос vbExclamation 48 Предупреждение vbInformation 64 Информация vbDefaultButton1 0 Первая кнопка по умолчанию vbDefaultButton2 256 Вторая кнопка по умолчанию vbDefaultButton3 512 Третья кнопка по умолчанию vbSystemModal 4096 Системное окно сообщений

Возвращаемые значения vbOK 1 Кнопка OK vbCancel 2 Кнопка Отмена vbAbort 3 Кнопка Удалить vbRetry 4 Кнопка Повторить vbIgnore 5 Кнопка Пропустить vbYes 6 Кнопка Да vbNo 7 Кнопка Нет

Преобразование символов vbUpperCase 1 Прописные буквы vbLowerCase 2 Строчные буквы vbProperCase 3 Прописные первые буквы

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

30

Константа Код Определение Константы меню

msoBarLeft 0 Строка меню слева msoBarTop 1 Строка меню сверху msoBarRight 2 Строка меню справа msoBarBottom 3 Строка меню снизу msoBarFloating 4 Плавающее меню msoBarPopup 5 Контекстное меню

Кроме констант Visual Basic, в программах используют системные константы Yes, No, On, Off, True, False, Null.

Процедурное программирование

Подпрограммы

С точки зрения синтаксиса Visual Basic, макрос является одной из разновидностей процедур и в тексте программы представляется так:

Sub имяПроцедуры( )

[ Выражение � ]

End Sub Здесь и далее используется своеобразный метаязык описания языка программирования, в котором в прямоугольные скобки ([ ]) принято заключать необязательные части выражений, а многоточием (�) отмечается возможность повторения элементов синтаксической формулы. Допустимые варианты выражений будут выделяться маркерами (●).

Операторы Sub и End Sub ограничивают тело макроса. Требованию идентичности программного объекта отвечает имяПроцедуры: оно уникально, и ни одна процедура в проекте не может иметь имени, присвоенного другой процедуре или лексеме. Имя начинается с буквы. Имена процедур не содержат пробелов. Однажды описанный макрос используется в ходе выполнения программы столько раз, сколько будет проведено его вызовов, т.е. повторено его имя.

Комментарий Visual Basic начинается апострофом ( ' ) или оператором Rem и продолжается до конца строки. Поскольку синтаксическим анализатором игнорируется текст комментария, в нем могут использоваться любые символы.

Обычную процедуру в Visual Basic называют подпрограммой. Макрос является частным случаем подпрограммы. Но подпрограмма, в отличие от макроса, может работать при некоторых начальных условиях, если в момент

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

31

вызова ей передаются данные в виде аргументов. Определение подпрограммы: [операторХранения] Sub имяПодпрограммы ( [объявлениеАргументов] )

[Выражение �]

End Sub К операторам хранения относятся Const, Dim, Static, Public, Private, а объявлениеАргументов представляет упорядоченную последовательность разделенных запятыми имен переменных, значения которых передаются в процедуру. Как и макрос, однажды описанная подпрограмма используется в ходе выполнения программы столько раз, сколько будет проведено ее вызовов. При вызове ей списком (через запятую) передаются значения аргументов в том порядке, в котором они следуют в описании. Чтобы отличать вызовы авторских подпрограмм от операторов, можно предварять их оператором Call. Отсюда � несколько способов вызова подпрограмм:

• [имяМодуля.] имяПодпрограммы [списокЗначенийАргументов] • [Call] [имяМодуля.] имяПодпрограммы

[ (списокЗначенийАргументов) ] • [имяМодуля.] имяПодпрограммы

имяИменованногоАргумента := Значение [,�] Если имя модуля содержит пробелы, в вызове оно заключается в прямоугольные скобки. Имя модуля опускают при вызовах подпрограмм в пределах модуля.

Как следует из этих синтаксических формул, вызов подпрограммы, которая не возвращает значения, сопровождается передачей ей списка аргументов через запятую после имени подпрограммы. Если подпрограмма возвращает значение, список аргументов заключается в скобки.

Если среди списка аргументов присутствует необязательный аргумент, его можно опускать, оставив запятую в списке. В конце же списка запятые пропущенных аргументов не ставятся. При использовании оператора Call значения аргументов следует заключать в скобки. Кроме списка, при вызове подпрограмм могут использоваться именованные аргументы, то есть аргументы с именами, определенными при описании процедуры. В случае такого вызова вместо того, чтобы задавать последовательный полный список аргументов, можно присваивать значения в произвольном порядке через знак :=.

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

32

Примеры Sub ПростаяПроцедура ()

' Вызываются один за другим два ранее описанных макроса Макрос1 Макрос2 End Sub Sub ВыделитьУдалитьТекст () Call ВыделитьТекст � Вызов ранее описанных подпрограмм Call УдалитьТекст End Sub Sub ВставитьПереместитьУдалитьЛист () ВставитьЛист 1, 2 � Вызовы подпрограмм с аргументами Call ПереместитьЛист (1, 2) УдалитьЛист книга := 2, лист := 1 End Sub

Переменные и константы

Первые шаги в программировании полезно сопровождать выводом на экран сообщений. Синтаксис сообщения имеет вид:

MsgBox [( ]Текст[,Кнопки [,Заголовок]] [ )]

Сообщение представляет собой текст в стандартном окне. Лексема MsgBox является именем функции Visual Basic, которая выводит на экран текст и может возвращать одну из констант, присвоенных нажатой в окне диалога кнопке.

Примеры Sub ПростоеСообщение () MsgBox "Сообщаю, что все в порядке" MsgBox ("Сообщаю, что все в порядке") MsgBox "Сообщаю," & Chr (13) & "что все в порядке" End Sub Sub ВремяДатаИПробелы ()

MsgBox "Сейчас " & Now MsgBox "Сегодняшняя дата: " & Day (Date) & Space (2) _ & Month (Date) & Space (2) & Year (Date) End Sub Sub КонстантаЯзыка ()

MsgBox "Задание выполнено!", vbExclamation, "Операции с текстом" End Sub

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

33

Переменные и авторские константы перед использованием полезно объявлять: операторХранения Имя, а по ходу программы инициализировать: Имя = Значение. При этом значения авторских констант и начальные значения переменных задаются оператором присваивания (=). Этот и другие операторы связывают переменные и константы друг с другом и с вызовами процедур в операциях и выражениях. Значения, соответствующие дате и времени, ограничиваются с двух сторон символами #.

Авторские константы, не изменяющиеся в ходе выполнения программы, обязательно объявляют с оператором хранения Const. Прочие переменные можно объявлять с оператором Dim или без объявления использовать в операциях.

Объявленные внутри подпрограммы локальные, или личные, переменные «видимы» только внутри своей подпрограммы, недоступны из других подпрограмм, и их значения другим подпрограммам неизвестны. Поэтому в других процедурах можно создавать переменные с такими же именами. По завершении подпрограммы компьютер «забывает» их, освобождая память другим данным.

Чтобы при повторном вызове подпрограммы личная переменная не забывала и восстанавливала свое значение, следует объявлять ее в подпрограмме с оператором Static.

Чтобы переменная стала «видимой» изо всех процедур и функций модуля, ее объявляют в начальном разделе описаний модуля с оператором хранения Dim или Private, и переменная в этом случае называется переменной уровня модуля. Она «помнит» свое значение в пределах модуля в течение всего сеанса работы приложения. Переменная, «известная» всей программе, независимо от того, в начале какого модуля она объявлена, объявляется с оператором хранения Public и называется общей переменной.

Наиболее простым способом ввода данных в программу служит функция языка Visual Basic

InputBox (Текст [,Заголовок [,Умолчание [, X, Y]]] ) Она позиционирует в точке X, Y экрана окно диалога с приглашением Текст и возвращает введенный в это окно ответ пользователя.

Примеры Sub ТеоремаПифагора ()

катет1 = 2: катет2 = 3 сообщение = "Гипотенуза имеет длину " MsgBox сообщение & Sqr (катет1 ^ 2 + катет2 ^ 2)

End Sub Sub Дата ()

деньРождения = #2/12/69# ' месяц, день, год

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

34

MsgBox "День рождения " & Day (деньРождения) & Space (2) _ & Month (деньРождения) & Space (2) & Year (деньРождения)

End Sub Sub Время ()

MsgBox "Сейчас " & Time перерыв = #5:12:00# ' часы, минуты, секунды MsgBox "Обед в " & Hour (перерыв) & " часов " & Minute (перерыв) _

& " минут " & Second (перерыв) & " секунд" End Sub Sub ДлинаОкружности ()

Const pi = 3.14159 радиус = 2.5 MsgBox 2 * pi * радиус

End Sub Sub ПлощадьКруга ()

Const pi = 3.14159 радиус = InputBox ("Введите радиус") площадь = pi * радиус ^ 2 MsgBox площадь

End Sub Sub Кнопки ()

ответ = MsgBox ("Нажмите одну из кнопок", vbYesNo + vbQuestion, _ "Да или Нет?")

MsgBox "Вы нажали кнопку с кодом " & ответ End Sub Sub Возраст () родился = InputBox ("Введите год рождения") MsgBox "Ваш возраст " & Year (Now) � Val (родился) End Sub Sub ВызывающаяПроцедура ()

введено = 5: ещеВведено = 10 � Личные переменные Call ВызываемаяПроцедура (введено, ещеВведено)

ВызываемаяПроцедура потом:=7, сначала:=3 End Sub Sub ВызываемаяПроцедура (сначала, потом) перенос = Chr (13) MsgBox Prompt := "Сначала ввели " & сначала & перенос & "Затем " _ & потом & перенос & «Всего: » & сначала + потом End Sub Sub ЛичныеПеременные ()

MsgBox "Я не знаю значений переменных" & введено & ещеВведено End Sub Sub ПятьВызовов () Call Вызов

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

35

Call Вызов Call Вызов Call Вызов Call Вызов End Sub Sub Вызов () Static звонок звонок = звонок + 1 MsgBox "Вам звонили " & звонок & "-кратно" End Sub Dim введено, ещеВведено � Переменные уровня модуля Sub Главная ()

введено = 5: ещеВведено = 10 Call ПеременныеУровняМодуля

End Sub Sub ПеременныеУровняМодуля ()

MsgBox "Я знаю значения переменных" & введено & "," & ещеВведено End Sub

Функции

В тех случаях, когда требуется вернуть результат в вызывающую подпрограмму, используется особый вид процедуры � функция. Определение авторской функции: [операторХранения] Function имяФункции ( [объявлениеАргументов] )

[Выражение �] [имяФункции = Значение]

End Function В тексте определения размещают выражение, в котором переменной, носящей имя функции, присваивают определенное значение. Это � возвращаемое функцией значение.

Вызов функции не содержит оператора Call. Если от функции ожидается результат, ее аргументы заключаются в скобки, а возвращаемое значение включается в операцию. В этом случае вызов функции представляет собой только правую часть выражения:

[Оператор] [имяМодуля.] имяФункции[ (списокАргументов) ] Фактически, в функцию передаются не сами аргументы, а их адреса. Поэтому аргументы не защищены от изменения их внутри функции. В тех случаях, когда требуется исключить возможность их изменения, используют

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

36

лексему ByVal, настраивающую функцию на работу не с адресами, а со значениями аргументов. Лексема ByRef возвращает передачу ссылок на адреса. А если передача аргументов в функцию необязательна, в списке аргументов такой функции используются лексемы Optional и Paramarray.

Примеры Sub ТеоремаПифагора () MsgBox Sqr (СуммаКвадратов (2, 3) ) End Sub Function СуммаКвадратов (катет1, катет2)

СуммаКвадратов = катет1 ^ 2 + катет2 ^ 2 End Function Const pi = 3.14159 Sub Круг ()

радиус = InputBox ("Введите радиус") длина = РасчетДлины (радиус) радиус1 = радиус ' радиус удвоен площадь = РасчетПлощади (радиус) радиус2 = радиус ' радиус не изменился MsgBox "Длина окружности радиусом " & радиус1 & " равна " _

& длина & Chr (13) & "Площадь круга радиусом " & _ радиус2 & " равна " & площадь

End Sub Function РасчетДлины (переменная, Optional текст = "Удвоенный радиус") переменная = переменная * 2 ' в расчете используется удвоенный радиус РасчетДлины = 2 * pi * переменная MsgBox текст End Function Function РасчетПлощади (ByVal Переменная) переменная = переменная / 2 ' используется уменьшенный радиус РасчетПлощади = pi * переменная ^ 2 End Function

Файлы

В Visual Basic различают три способа доступа к информации, размещенной в файлах накопителей: последовательный, прямой и двоичный доступ. В первом случае данные заносятся в файл и считываются строками, имеющими произвольную длину. Во втором случае строки имеют строго фиксированную длину, а запись и чтение возможны в произвольном порядке. В последнем случае организуется произвольный доступ к данным без разбивки их на строки.

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

37

Для ввода информации в файл и чтения файлов последовательного доступа служит группа файловых операторов и функций. Вначале файл открывается в памяти:

Open имяФайла [For Input] [For Output] [For Random] _ [Access Read,Write] [Read] [Write] [Защита] _ As [#]Номер [Len=Длина]

Затем данные заносятся в файл или читаются из него одним из следующих выражений:

• Print #Номер [, форматированныйТекст] • Write #Номер [, неФорматированныйТекст] • Line Input #Номер, Переменная

и файл закрывается:

Close [#Номер,�] Прямой доступ позволяет находить нужные записи в файле, считывать

и обновлять их, не перебирая для этого все записи. При этом оператор Open сопровождается лексемой Random и задает длину записи Len, то есть количество считываемых байтов: Get [#]Номер, [Запись], имяПеременной или записываемых байтов: Put [#]Номер, [Запись], имяПеременной

Любой файл можно переименовать или удалить:

• Name имяФайла As новоеИмя • Kill имяФайла

Примеры Sub Имя ()

имяФайла = InputBox ("Файл ?", "Введите имя файла", _ "мойФайл.txt", 100, 100)

MsgBox имяФайла, vbInformation MsgBox ПоследовательныйДоступ (имяФайла), vbInformation End Sub Function ПоследовательныйДоступ (имяФайла)

Open имяФайла For Output As 1 Print #1, "Тест для записи и чтения" Close 1 Open имяФайла For Input As 1 Line Input #1, тест

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

38

Close 1 ПоследовательныйДоступ = тест

End Function Sub ПрямойДоступ ()

Open " мойФайл.txt" For Random As 1 Len = 20 тест1 = "Это тест 1" тест2 = "Это тест 2" Put 1, 1, тест1 Put 1, 2, тест2 Close 1 Open "мойФайл.txt" For Random As 1 Len = 20 Get 1,2, тест Close 1

MsgBox тест, vbInformation End Sub Sub ПереименоватьУдалить ()

Name "мойФайл.txt" As " мойФайл.dat" MsgBox "Сейчас файл будет удален" Kill "мойФайл.dat"

End Sub

Структурное программирование

Структуры и модули

Чем сложнее проектируемая система, тем меньше возможность ее полного процедурного описания. Причина этого заключается в самой природе объектов, моделью которых является любая программная система. Модель � это всегда односторонний, неполный, предвзятый взгляд на оригинал. И этот взгляд меняется по мере изменения запросов пользователя, его жизненной и профессиональной позиции, его опыта и мировоззрения. И главное, что сам объект постоянно развивается, побуждая к адекватному развитию отражающие его модели.

С учетом этого положения, в языке Algol впервые была внедрена концепция структурного программирования. Следуя ее философии, предложенной Э.Дейкстрой, процесс проектирования программы должен состоять из последовательности представлений алгоритма решения задачи «уровнями абстрактных машин». В результате программа как бы разбивается на ряд вычислителей, из которых «верхний» максимально приспосабливается к конкретной прикладной задаче, а «нижний» выполняет команды алгоритмического языка.

В качестве инструмента структуризации Дейкстра ввел управляющие структуры, именуемые также составными операторами:

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

39

• условные операторы, направляющие ход вычислительного процесса по одному из двух-трех путей в зависимости от значений данных;

• операторы выбора, направляющие ход вычислительного процесса по одному из множества путей в зависимости от значений данных;

• операторы цикла, организующие вычислительный процесс с заданным периодом повторения;

• операторы повторения, управляющие многократно повторяющимися процессами.

• операторы перехода, изменяющие ранее запланированный ход вычислительного процесса;

В соответствии с концепцией структурного программирования, каждая такая конструкция языка имеет только один вход и один выход.

Структурируемость реализуется, также, через типизацию данных, обоснованную швейцарским ученым Н.Виртом. Тип данных � это категория, разряд, к которому относятся те или иные данные в соответствии со способом организации их в памяти компьютера. Тип конкретно характеризует размер используемой памяти, отображение информации и способы ее обработки.

Структурная концепция наиболее сильно проявляется в языках Ada, Modula 2, Fort, Pascal.

Благодаря Вирту, программирование стало не только структурным, но и модульным. Модульная программа обычно состоит из набора самостоятельных разделов или файлов. Модульность способствует выделению и разделению задач. Это увеличивает наглядность, упрощая понимание программы, и делает процесс программирования более систематическим и регулируемым по нарастанию сложности. «Как правило, сложность программы возрастает в геометрической прогрессии с ее размером, так что разбиение программы на меньшие части действительно уменьшает усилия, необходимые для ее разработки», пишет известный программист Б.Бабэ. Модули «делят большую программу на управляемые составляющие, что позволяет программистам делить большие проблемы на маленькие части и справляться с каждой из них по очереди», поддерживает его другой теоретик программирования Т.Сван.

Модульность проявляется в использовании библиотек при построении программ. В файлах библиотек среды программирования хранятся структуры, описывающие заранее сформированные данные или предписывающие определенные действия над переменными. Типичная библиотека представляет собой специальным образом организованный файл, данные из которого по мере необходимости включаются в текст программы. Различают математические библиотеки, библиотеки системных функций доступа к услугам операционной среды, библиотеки средств описания

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

40

структур данных, ввода и вывода. Библиотеки дают программам ряд важных преимуществ:

• предлагая код общего назначения из одного источника, они сокращают время разработки программ и повышают их надежность;

• стандартные библиотеки обеспечивают программы стандартным же интерфейсом;

• объединение в библиотеку зависящих от компьютера и периферии характеристик значительно облегчает решение задачи объединения программ с другими модулями информационной системы;

• библиотеки, развивающиеся для поддержки конкретной прикладной области, снижают сложность разработки, предоставляя при этом ресурсы высокого уровня и качества.

Все это делает структурированные модульные программы

компактными, мобильными и переносимыми из одной вычислительной среды в другую.

Составные операторы

Группу составных операторов � управляющих структур Visual Basic � представляют условный оператор, оператор выбора, оператор цикла, операторы перехода, операторы повторения с предусловием и операторы повторения с постусловием.

Условный оператор используется для определения одного из нескольких возможных направлений вычислительного процесса:

If истинноеЛогическоеВыражение [= True] Then Выражение [�]

[ElseIf истинноеЛогическоеВыражение [= True] Then Выражение � ]

[Else Выражение �]

End If Оператор позволяет выполнять различные действия в зависимости от значения логического выражения. За лексемой If следует логическая операция, в итоге которой формируется значение либо True, либо False. Если ее результат истинен (True), то выполняются все выражения до следующей

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

41

после Then лексемы, и программа выходит из управляющей структуры. Если же результат логической операции ложен (False), программа переходит за ключевое слово Else, а если оно отсутствует, то оставшиеся выражения управляющей структуры вообще игнорируются. Глубина вложения операторов не ограничивается.

Как исключение, простые выражения разрешается записывать в одну строку без End If.

Примеры Sub Приветствие ()

пользователь = InputBox ("Вы кто ?") If пользователь = "Смирнов" Then

MsgBox "Привет, " & пользователь End If

End Sub Sub НовоеПриветствие ()

пользователь = InputBox ("Вы кто ?") If пользователь = "Смирнов" Then MsgBox "Привет, " & пользователь _

Else Beep End Sub Sub БукваЛиБольшаяЛи ()

символ = InputBox("Введите букву") If Asc (символ) > 63 And Asc (символ) < 91 Then

MsgBox "Введена заглавная латинская буква" ElseIf Asc (символ) > 96 And Asc (символ) < 123 Then

MsgBox "Введена строчная латинская буква" Else

MsgBox "Это не латинская буква" End If

End Sub Sub КлавиатурныеКомбинации ()

число = Application.InputBox (prompt := "Введите число", Type: = 1) If число Then

Application.OnKey "^{RIGHT}", "Обработка" Else

Application.OnKey "^{RIGHT}", "" Application.OnKey "^{RIGHT}"

End If End Sub Sub Обработка () MsgBox �Обрабатывается таблица� End Sub

Оператор выбора служит для организации хода вычислительного

процесса в зависимости от значения выражения или переменной:

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

42

Select Case Переменная Case Значение1 To Значение2 Выражение

[�] [Case списокЗначений Выражение

�] [Case логическоеВыражение Выражение

�] [Case Else

Выражение �]

End Select

Примеры Sub ВашеНастроение ()

настроение = InputBox ("Как дела ?") настроение = Left (Настроение, 3) Select Case настроение Case "хор", "Хор"

MsgBox "Он в духе" Case "пло", "Пло"

MsgBox "Он не в духе" Case Else

MsgBox "Ни то, ни се" End Select

End Sub Sub Оценка ()

цена = InputBox ("Введите цену") Select Case цена Case 10 To 500

MsgBox "Низкая цена" Case 501 To 50000

MsgBox "Средняя цена" Case Is > 50000

MsgBox "Высокая цена" Case Else

MsgBox "Неверное число" End Select

End Sub

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

43

Традиционный оператор цикла организует повторяющийся вычислительный процесс в заданном диапазоне изменения переменной-счетчика цикла:

For Переменная = Значение1 To Значение2 [Step Значение3]

Выражение [�]

Next [Переменная] Он позволяет создавать в программах циклы с переменной-счетчиком, равномерно уменьшающим или увеличивающим свои значения. Переменная размещается после лексемы For и инициализируется начальным значением. С каждым циклом она изменяется на величину Значение3 или на единицу, если Step Значение3 опущено, до тех пор, пока значение переменной не достигнет конечной величины Значение2.

При работе с семействами и коллекциями в VBA будет использован еще один оператор цикла:

For Each Переменная In коллекцияОбъектов

Выражение [�]

Next [Переменная]

Пример Sub ЛатинскийАлфавит ()

алфавит = "" For счет = 1 To 26

алфавит = алфавит & Space(1) & Chr (счет + 64) Next счет MsgBox алфавит

End Sub Оператор перехода Exit передает управление за пределы управляющей

структуры. Для перехода в заданную позицию программного кода можно использовать оператор перехода GoTo Метка. Меткой может служить любое допустимое имя, расположенное в крайней левой позиции текста и завершенное двоеточием. Другой оператор перехода � On Error � обрабатывает ошибки: On Error GoTo Метка � переход на метку в случае ошибки; On Error Resume Next � переход на следующий оператор; On Error GoTo 0 � отключение обработчика ошибок. Если оператор On Error помещен в начало подпрограммы, Visual Basic реагирует на ошибки, начиная с первого выражения. Информацию об ошибке обычно несут свойства объектов Err (код ошибки), Number (свойство по умолчанию,

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

44

соответствующее номеру ошибки), Source (имя проекта), Description (строка с ошибкой), Raise (генерация ошибки), Clear (сброс всех свойств после обработки ошибок).

Примеры Sub Оценки ()

For Оценка = 1 To 5 MsgBox Оценка If Оценка = 3 Then Exit For

Next Оценка End Sub Sub СообщениеОбОшибке ()

On Error GoTo сообщение Err.Clear число = InputBox ("Введите число, иначе будет ошибка") сумма = число + 5 MsgBox сумма Exit Sub

сообщение: мsg = "Ошибка № " & Err.Number & " возникла в " _

& Err.Source & Chr(13) & Err.Description MsgBox мsg, vbExclamation, "Ошибка"

End Sub Операторы повторения предназначены для организации

вычислительных процессов, повторяющихся неизвестное заранее число раз. Различают операторы повторения с предусловием и с постусловием:

Do While истинноеЛогическоеВыражение [=True]

Выражение [�]

Loop Do

Выражение [�]

Loop While истинноеЛогическоеВыражение [=True] Do Until ложноеЛогическоеВыражение [=False]

Выражение [�]

Loop Do

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

45

Выражение [�]

Loop Until ложноеЛогическоеВыражение [=False] Лексема Do помечает начало этих управляющих структур. Следующие за ней выражения последовательно исполняются до лексемы Loop, а затем происходит возврат к первому после Do выражению и все повторяется. Образуется замкнутый цикл, и, если не принять мер, он становится бесконечным. Для управления выходом из цикла используются операторы While и Until, которые можно размещать как за оператором Do, так и за словом Loop. После операторов While и Until должна присутствовать логическая операция. Если ее результат после While соответствует истине или ложен после Until, то цикл продолжает выполняться. В противном случае программа переходит на следующее за управляющей структурой выражение.

Допускается, также, использование управляющей структуры While�Wend:

While ИстинноеЛогическоеВыражение [=True] Выражение

[�] Wend

Примеры Sub Приглашение ()

Do While всего < 100 гость = InputBox ("Имя гостя ?") сопровождающие = InputBox ("Сколько с ним человек ?") всего = всего + сопровождающие + 1

Loop MsgBox "Больше мест нет. Последний в списке " & гость

End Sub Sub ПокаНалог ()

доход = InputBox ("Ваш месячный доход?") процент = СтавкаНалога (доход) Do While процент = 13

всего = всего + доход процент = СтавкаНалога (всего)

месяц = месяц + 1 If месяц > 13 Then Exit Do

Loop MsgBox "Минимальная ставка налога удерживается " & _

месяц - 1 & " месяцев" End Sub

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

46

Function СтавкаНалога (сумма) If сумма <= 30000 Then СтавкаНалога = 12 Else СтавкаНалога = 20

End Function Sub НалогПока ()

� Здесь использована рассмотренная выше функция СтавкаНалога доход = Val (InputBox ("Ваш месячный доход?")) процент = СтавкаНалога (доход) Do

всего = всего + доход процент = СтавкаНалога (всего)

месяц = месяц + 1 If месяц > 12 Then Exit Do

Loop While процент = 12 MsgBox "Минимальная ставка налога удерживается " & _

месяц - 1 & " месяцев" End Sub Sub НеОтменаПока ()

Do Beep ответ = MsgBox ("Повторить ?", vbYesNoCancel)

Loop Until ответ = vbNo End Sub Sub ПокаБуквы ()

алфавит = �� While Len (алфавит) <= 25

алфавит = алфавит & Chr (Len (алфавит) + 65) Wend MsgBox алфавит

End Sub

Простые типы данных

Объявление типа данных переменных, констант и процедур в программе на языке Visual Basic не обязательно, но в ряде случаев способствует повышению надежности программ. Если же модуль открывается строкой Option Explicit, без объявления типов всех данных программа работать не будет. Простые типы данных Visual Basic приведены в следующей таблице:

Тип данных, обозначение

Название, величина Размер (байт) Значения

Byte Байт 1 От 0до 255 Boolean Логический 2 True, False Integer % Целый 2 от �32768 до 32767

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

47

Тип данных, обозначение

Название, величина Размер (байт) Значения

Long & Длинный целый 4 от �2147483648 до

2147483647

Single ! Вещест-венный 4 от �3,402823E38 до 1,401298E45

Double # Длинный ве-щественный 8 от �1,79E308 до 1,79E308

Currency @ Валюта 8 от 0 до 922337203685477.58

Decimal Масштабиру-емый целый 14 от �10E28 до 10E28

Date Дата, время 8 от 1/1/100 до 31/12/9999. Object Объект 4 Ссылка на объект String $ Строка 1 байт на символ от 0 до 2 млрд. Type Задается Сумма значений членов

Variant Произволь-ный

16 + 1 байт на символ Любое число, символ

Подтипы типа данных Variant vbEmpty 0 Отсутствует инициализация vbNull 1 Отсутствующие данные vbInteger 2 Целый vbLong 3 Длинный целый vbSingle 4 Вещественный vbDouble 5 Длинный вещественный vbCurrency 6 Валюта vbDate 7 Дата vbString 8 Строка vbObject 9 Объект OLE Automation vbError 10 Ошибка vbBoolean 11 Логический vbVariant 12 Массив произвольного типа vbDataObject 13 Не объект OLE Automation vbDecimal 14 Масштабируемый целый vbByte 17 Байт vbArray 8192 Массив

При программировании следует задавать типы данных, которые

расходуют минимум памяти, но достаточны для хранения всех требуемых значений данных.

Если переменная или константа не объявлена или объявлена без указания типа, Visual Basic рассматривает ее как тип Variant. Variant

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

48

является универсальным типом. Данные типа Variant могут принимать значения других типов, а также Null и Empty. Null означает, что данные отсутствуют, неизвестны или неприменимы. Он описывает пустые поля и элементы управления. Специальная функция IsNull проверяет, равно ли Null значение типа Variant. Присваивание этого значения может выполняться обычным образом: переменная = Null. Значение Empty служит для резервирования памяти под неинициализированную переменную типа Variant. Проверка выполняется функцией IsEmpty, и инициализация обычным образом: переменная = Empty. В числовых расчетах Empty учитывается как нуль, а в строковых преобразованиях � как строка нулевой длины.

Переменная типа Object может хранить любые объекты. У типов Object есть особое значение Nothing для резервирования памяти, если переменной не присвоен объект (аналогично Empty у Variant). Инициализация этого значения выполняется традиционно: переменная = Nothing.

Тип данных при необходимости можно уточнять оператором Set, с помощью которого данные можно соотнести с любым объектом. Таким образом удобно манипулировать объектом, заменяя его имя в операциях именем переменной.

Функция VarType возвращает текущий тип переменной: 0 � vbEmpty, 1 � vbNull, 2 � vbInteger и т.д.

Примеры Sub Логика()

Dim раз As Boolean, два As Boolean раз = 5 > 7 два = 5 < 7 MsgBox раз Or два раз = "Y" > "Z" два = "Y" < "Z" MsgBox раз And два

End Sub Sub АлгоритмЕвклида()

' Решение задачи поиска наибольшего общего делителя (НОД) двух чисел ' по Евклиду основано на анализе пар чисел, пока они не сравняются.

Dim a As Integer, b As Integer

a = InputBox ("Введите первое число") b = InputBox ("Введите второе число") Do

If a > b Then a = a - b If b > a Then b = b - a

Loop Until a = b

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

49

MsgBox "НОД= " & a End Sub

Составные типы данных

Для группового представления и обработки однотипных данных используются составные типы � массивы. В массиве под одним именем хранятся пронумерованные однотипные данные. Их число определяется при объявлении. Синтаксис объявления массива: [операторХранения] имяМассива ( Индекс1[To Индекс2][,�] ) [As Тип] За именем массива следует первый, второй, а иногда и более старший индекс в круглых скобках. Индексом в языке Visual Basic называется номер последнего члена массива. Произведение увеличенных на единицу индексов определяет размер, то есть число членов массива, а число индексов соответствует его размерности.

Если одномерный массив передается в процедуру или функцию в качестве аргумента, значения его индекса не указываются. При этом объявление функции может выглядеть, например, так: [операторХранения] Function имяФункции (Массив () [As Тип],�) [As Тип] с таким вызовом:

MsgBox "Среднее значение = " & имяФункции (x ()).

Размер и размерность массива должны быть определены до того, как он будет использован. Если размер массива заранее известен, его называют статическим массивом.

Массивы индексируются с нуля. Имя каждого члена массива состоит из имени массива и индексов в

круглых скобках, например, размер (0) � нулевой член одномерного массива, spaceArray (2,3) � (2,3)-ий член двухмерного массива.

Примеры Sub ДелениеПочтиПоровну ()

� Способ деления целого числа на примерно равные целые части � с использованием операторов деления нацело и остатка Dim введено, остаток, доля (2) As Integer введено = InputBox ("Введите число") доля (0) = введено \ 3: доля (1) = доля (0): доля (2) = доля (0) остаток = введено Mod 3

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

50

If остаток > 0 Then доля (0) = доля (0) + 1 If остаток > 1 Then доля (1) = доля (1) + 1 MsgBox введено & "=" & доля (0) & "+" & доля (1) & "+" & доля (2)

End Sub Dim память As Integer Sub Счетчик ()

Dim массив (10) As Integer, Индекс As Integer память = 0 For индекс = 0 To 10 Step 2

массив (индекс) = индекс MsgBox Вывод (массив (), индекс)

Next End Sub Function Вывод (аргумент1 () As Integer, аргумент2 As Integer) As Integer

память = память + аргумент1 (аргумент2) Вывод = память

End Function Если размер массива заранее неизвестен, его можно объявлять без

размера, а размер задавать оператором ReDim по мере заполнения массива. В этом случае мы имеем дело с динамическим массивом, который, в отличие от статического, изменяет свой размер по ходу выполнения программы.

Всякий раз при переопределении оператором ReDim содержимое массива уничтожается. Если по условию задачи этого не требуется, после ReDim следует ввести оператор Preserve. Тогда массив будет «запоминать» свое содержимое.

Примеры Sub Покупки ()

Dim список () As String, i As Integer, количество As Integer количество = InputBox ("Сколько ?") ReDim список (1 To количество) For i = 1 To количество

список (i) = InputBox (Str(i) & " - Это что ?") Next

End Sub Sub ДинамическийМассив ()

Dim тест () As Integer, индекс As Integer, массив As String For индекс = 10 To 20

ReDim тест (индекс) As Integer тест (индекс) = индекс

Next

For индекс = 10 To 20 массив = массив & тест (индекс) тест (индекс) = индекс

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

51

Next MsgBox массив

End Sub Sub ДинамическийМассивСПамятью ()

Dim тест () As Integer, индекс As Integer, массив As String For индекс = 10 To 20

ReDim Preserve тест (индекс) As Integer тест (индекс) = индекс массив = массив & тест (индекс)

Next MsgBox массив

End Sub Dim счетчик () As Integer Sub Очко ()

� Популярная игра в очко: вы стараетесь набрать максимум очков, но � не более 21, а компьютер �выбрасывает кубик�. Кроме динамического � массива, здесь вы встретитесь с датчиком случайных чисел Rnd, � с функцией его начальной установки Randomize, и с рекурсией.

Static i As Integer ReDim Preserve счетчик (i) As Integer Randomize счетчик (i) = Rnd * 10 ответ = Info (счетчик (), i) i = i + 1 If ответ <> 0 Then ответ = MsgBox (ответ & " Еще?", vbYesNo) If ответ = vbYes Then Очко Else End ' Пример рекурсии End Sub Function Info (список () As Integer, количество As Integer) As Integer Dim сумма As Integer, x As Integer сумма = 0 For x = 0 To количество сумма = сумма + список (x) Next If сумма > 21 Then MsgBox Str (сумма) & " - Вы проиграли!" Info = 0 Else If сумма = 21 Then Beep MsgBox Str (сумма) & " - Вы выиграли!" Info = 0 Else Info = сумма End If End If End Function

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

52

Типов данных языка Visual Basic обычно хватает, чтобы разделить всю информацию на текстовые и числовые компоненты. Но этих типов недостаточно при работе с данными, которые требуется сгруппировать по какому-либо признаку. В таких случаях на помощь приходят авторские составные типы данных, конструируемые как комбинации простых типов, и авторские классы, содержащие данные и процедуры.

Операторами Type и End Type начинается и завершается объявление авторского типа данных, представляемое списком его членов, или полей. Такие типы объявляются в разделе объявлений модуля. В отличие от простых типов, память им выделяется не в момент объявления, а в момент создания переменной, представляющей такой тип и называемой объектом. Вызов объекта из различных модулей программы выполняется в формате Объект.Член, соответствующем полному имени члена. Более удобный способ инициализации членов объекта состоит в использовании управляющей структуры With� End With.

Примеры Type Мужчина

рост As Single вес As Single имя As String возраст As Integer

End Type Type Женщина

цветВолос As String цветГлаз As String имя As String рост As Integer

End Type Sub Люди ()

Dim Иванов As Мужчина, Петрова As Женщина Иванов.рост = 1.85 Петрова.цветВолос = "Каштановый" MsgBox "Цвет волос Петровой " & Петрова.цветВолос

End Sub Type Компьютер

процессор As String частота As Integer память As Integer

End Type Sub Характеристики ()

Dim IBMPC As Компьютер With IBMPC

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

53

.процессор = "Pentium"

.частота = 800

.память = 256 End With MsgBox IBMPC.процессор & "-" & IBMPC.частота _

& "-" & IBMPC.память End Sub

Кроме авторских типов, возможно создание авторских классов. Член-данные классов описываются свойствами следующей структуры:

• [операторХранения] [Property Let] имяСвойства ( [определениеАргументов] )

Выражение [�]

End Property

• [операторХранения] [Property Get] имяСвойства ( [определениеАргументов] )

Выражение [�]

End Property Let используется для установки значения свойства, а Get � для получения значения.

Кроме данных, членами авторских классов языка VBA являются также процедуры, именуемые методами. Создание авторского класса начинается из меню Вставка .Модуль класса. В классе объявляются переменные модуля, процедуры Propety Let и Propety Get и методы, работающие с переменными этого модуля. Объекты как представители класса создаются в два этапа: сначала объявляется объектная переменная, тип которой совпадает с именем класса, а затем ей присваивается ссылка на класс оператором Set. Завершая работу с объектом, его удаляют присвоением значения Nothing. Dim r Public Property Get Радиус ()

Радиус = r End Property

Public Property Let Радиус (переменная)

If Not (IsNumeric (переменная)) Then MsgBox "Введите число" Exit Property End If

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

54

r = переменная End Property Public Function Площадь () As Double

Площадь = 3.14159 * Радиус ^ 2 End Function Public Sub Круг ()

Dim маленькийКруг As Class1 Set маленькийКруг = New Class1 маленькийКруг.Радиус = InputBox ("Введите радиус") MsgBox маленькийКруг.Площадь Set маленькийКруг = Nothing

End Sub

Визуальное программирование

Формы

Для организации диалога с пользователем в Word и Excel используются разрабатываемые программистом авторские объекты � формы UserForm, которые можно отображать (Show) и скрывать (Hide). У форм, создаваемых через меню Вставка .Userform, задаются заголовки (Caption), изменяются размеры (Height, Width), тип границы (BorderStyle, SpecialEffect), фон и изображения (BackColor, Picture), расположение на экране (Left, Top) и дополнительная информация (Tag) через окно Свойства. Двойным щелчком по форме или <F7> открывается ее программный модуль, в котором размещают процедуры, описывающие реакцию формы на различные события: щелчок (Click), двойной щелчок (DblClick), активизацию (Activate) и др.

При наступлении событий можно вызывать как процедуры-функции, так и процедуры-подпрограммы, хотя обычно вызываются последние. Процедуры, сопоставляемые событиям, называют процедурами обработки событий, в частности подпрограммы именуют обработчиками. Им автоматически присваиваются имена, состоящие из имени объекта и имени события, соединенных знаком подчеркивания. Авторская процедура-функция вызывается как =имяПроцедуры(списокАргументов).

Обращение к форме выполняется по ее имени (Name), а из класса формы к ней удобно обращаться через лексему Me.

Примеры Sub Начало () Call СвойстваФормы End Sub

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

55

Sub СвойстваФормы () With UserForm1

.Caption = "Стартовый заголовок"

.Width = 270

.Height = 270

.Picture = LoadPicture ("c:\user\scan.bmp")

.BackColor = vbBlue

.Tag = "Всегда открывать" End With

End Sub Sub UserForm_Click ()

Beep: Beep: Beep Call МакросДляФормы

End Sub Sub МакросДляФормы ()

MsgBox "Форма выведена на экран" UserForm1.Caption = "Новый заголовок"

End Sub Sub UserForm_DblClick ()

Me.Hide UserForm2.Show

End Sub

Элементы управления

Окно формы в конструкторе сопровождается панелью Элементы управления. Каждый элемент управления, указанный в приведенной ниже таблице, представляет определенный класс. Объекты данного класса программист размещает в формах, чтобы пользователь управлял с их помощью процессом обработки информации.

Класс Объект Определение Label Надпись Пояснения и заголовки форм TextBox Поле Ввод текста в формы

Frame Рамка Обрамляет связанные объекты для совместной работы

Command Button Кнопка Управляет процессами

CheckBox Флажок Переключает состояния Истина - Ложь, Ноль - Не ноль и отражает состояние связанного объекта

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

56

Класс Объект Определение

Option Button

Переклю-чатель

Выбирает один из ряда вариантов. Все переключатели в группе можно связать с одним объектом, значением которого служит число, равное числу переключателей в группе

ListBox Список Представляет список для выбора данных. Порядковый номер выбранного в списке члена можно заносить в связанный объект

ComboBox Поле со списком Объединяет поле и список формы

ScrollBar Полоса прокрутки

Плавно изменяет значения в числовом ряду в заданных пределах

Spinner Счетчик Изменяет значения в числовом ряду с заданным шагом

Toggle Button Выключатель Устанавливает одно из состояний Истина �

Ложь Image Рисунок Представляет рисунок графического файла

TabStrip Набор вкладок Представляет группу страниц формы

MultiPage Набор страниц Представляет группу форм

RefEdit Поле ссылок Поле для ввода ссылок выбором их в таблице

Константы панели элементов управления msoControlEdit Поле msoControlButton Кнопка msoControlDropDown Раскрывающийся список msoControlComboBox Поле со списком msoButtonAutomatic Пустая кнопка msoButtonIcon Кнопка с рисунком msoButtonCaption Кнопка с текстом msoButtonIconCaption Кнопка с рисунком и текстом

Любой новый объект класса строится вычерчиванием в форме

элемента управления, выделенного на панели элементов управления. Visual Basic автоматически присваивает имена объектам, указывая их в поле Name окна Свойства. В этом же окне указываются все другие свойства, установленные по умолчанию. Там же многие из них можно при желании изменить. После того как объект размещен, его можно передвигать и изменять в размерах. Любой объект выделяется щелчком или правым щелчком, а щелчками при нажатой клавише <Shift> выделяется группа

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

57

объектов. Перетаскиванием при нажатой клавише <Ctrl> создается копия объекта, а клавишей <Delete> он уничтожается. Любое изменение завершается щелчком вне объекта. При правом щелчке по выделенному объекту открывается контекстное меню.

Каждому объекту можно назначать свои макросы или процедуры. Для кнопок, флажков и переключателей макрос по умолчанию обычно описывает реакцию на щелчок (Click), для остальных элементов � реакцию на изменение их содержания (Change). Чтобы подготовить макрос, следует выполнить на объекте двойной щелчок или открыть окно модуля через меню, и для события, выбранного в правом верхнем списке окна, составить текст. Возможен и импорт ранее подготовленных процедур из файлов Visual Basic с расширениями .frm, .cls, .bas через меню Файл .Импорт файла, а также экспорт созданных процедур из меню Файл .Экспорт файла. Предварительный просмотр формы выполняется из меню Запуск (<F5>).

Рассмотрим назначение основных элементов управления. Для вывода сообщений в форму предназначен элемент Надпись

(Label). Его свойство Caption (свойство по умолчанию) представляет содержание надписи.

Элементом ввода текстовой информации является Поле (TextBox). По умолчанию свойство Value используется для установки и получения содержимого поля. Запрет и разрешение доступа к полю осуществляется через свойство Enabled. Свойство SelText хранит выделенный в поле фрагмент текста, а свойства SelStart и SelLengh устанавливают начало и длину выделенного фрагмента. Свойство Name характеризует имя поля. Его изменяют в случае необходимости для обращения к полям в разных формах. Метод Zorder определяет уровень, на котором размещается поле по отношению к другим, перекрывающим его элементам формы. PasswordСhar задает символ, отображаемый в поле, если оно используется для ввода пароля.

Кнопка (CommandButton) инициирует выполнение определенных действий (пуск, остановка, прерывание и т.п.). Свойством Default назначается кнопка по умолчанию, а Enabled организует доступ к кнопке. Метод Click является процедурой кнопки по умолчанию. Свойством Accelerator назначается клавиша, нажимаемая с <Alt> вместо щелчка.

Переключатели (OptionButtons) объединяются обычно с помощью рамки или свойства GroupName. Свойство Value является значением переключателя по умолчанию. Флажок (CheckBox) характеризуется свойствами Value (значение), Caption (название), WordWrap (перенос слов в названии). Свойством Value характеризуются, также, Выключатель (ToggleButton), Рамка (Frame), Полоса прокрутки (ScrollBar) и Счетчик (SpinButton).

Список (ListBox) хранит ряд данных, представляет и позволяет выбирать их с помощью свойств Value, List, ListIndex, ListCount. Свойство

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

58

List определяет по номеру пункта его текста. Свойство MultiSelect определяет способы выбора элементов из списка: 0 � один элемент, 1 � произвольная группа, 2 � ряд соседних значений. Метод AddItem дополняет список, а RemoveItem удаляет пункты. Свойство TopIndex представляет элемент списка с наибольшим номером, свойство TextColumn устанавливает столбец списка, элемент которого возвращается свойством Text. При истинном свойстве MatchЕntry в списке активизируется первый же подходящий элемент, совпадающий с набираемым в поле именем. Свойство ControlTipText содержит текст всплывающей подсказки.

Поле со списком (ComboBox) характеризуется свойствами Text и Value, задающими выделенный фрагмент и содержание списка. ListIndex определяет номер выбранного элемента. Свойство Selected управляет выделением и информирует о выделенных элементах списка. Свойство MatchRequired разрешает (False) или запрещает (True) дополнение списка из поля. В зависимости от свойства MatchFound, возможно (True) совпадение вводимого в поле текста с текстом, имеющемся в списке.

Элемент Набор страниц (MultiPage) обладает свойствами Value, BoundValue � номер активной страницы (с 0), SelectedItem � выбранная страница, а также методами Item � возвращение страницы, Add � новая страница, Clear, Remove � удаление страниц.

Рядом полезных свойств обладает и объект Рисунок (Image). Инициализация формы, наполненной объектами, обычно выполняется

как реакция на событие Initialize. Объект Screen представляет ссылку на отдельную форму, отчет или

текущий либо предыдущий активный элемент управления. Его свойства доступны только для чтения.

Примеры Sub Надпись ()

UserForm1.Label1.Caption = "Новая надпись" UserForm1.Show

End Sub Sub Поле ()

UserForm1.Show Call UserForm1.TextBox1_Change

End Sub Sub TextBox1_Change ()

UserForm1. TextBox2 = UserForm1. TextBox1 End Sub Sub БлокировкаПоля ()

имя = "Станислав" With UserForm1.TextBox1

.Value = имя

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

59

.Enabled = False End With UserForm1.Show

End Sub Sub ФормаСоСписками () Dim массив массив = Array ("1000", "2000", "3000", "4000") With UserForm1 .ListBox1.List = Array ("июнь", "июль", "", "") .ListBox1.List (2, 0) = "сентябрь" .ComboBox1.List = массив .Show End With End Sub Sub Получатель ()

If MsgBox ("Вас интересует получатель?", vbYesNo) = vbYes Then Set кто = Me!TextBoxПолучатель кто.SetFocus MsgBox (кто.Text) End If End Sub Sub Приветствие ()

Set кто = Me!Получатель кто.SetFocus

If кто.Text = "Смирнов" Then MsgBox "Привет, Смирнов" Else Beep End Sub ' Процедуры формы, в которой размещены три поля. ' Ввод числа в любое из полей сопровождается выводом ' преобразованного значения в двух других полях Sub Цельсий_KeyUp (ByVal KeyCode As MSForms.ReturnInteger, _

ByVal Shift As Integer) If Цельсий = "" Then Цельсий = 0

Фаренгейт = Цельсий * 9 / 5 + 32 Кельвин = Цельсий + 273.15

End Sub Sub Фаренгейт_KeyUp (ByVal KeyCode As MSForms.ReturnInteger, _

ByVal Shift As Integer) If Фаренгейт = "" Then Фаренгейт = 0

Цельсий = (Фаренгейт - 32) * 5 / 9 Кельвин = (Фаренгейт - 32) * 5 / 9 - 273.15

End Sub Sub Кельвин_ KeyUp (ByVal KeyCode As MSForms.ReturnInteger, _

ByVal Shift As Integer) If Кельвин = "" Then Кельвин = 0

Цельсий = Кельвин - 273.15

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

60

Фаренгейт = (Кельвин - 273.15) * 9 / 5 + 32 End Sub Sub КакДела ()

Me!Состояние.SetFocus настроение = Me!Состояние.Text настроение = Left (Настроение, 3) Select Case настроение

Case "хор", "Хор" MsgBox "Он в духе"

Case "пло", "Пло" MsgBox "Он не в духе"

Case Else MsgBox "Ни то, ни се"

End Select End Sub Sub Цены ()

Me!ПолеЦены.SetFocus цена = Me!ПолеЦены.Text Select Case цена Case 10 To 500

MsgBox "Низкая цена" Case 501 To 50000

MsgBox "Средняя цена" Case Is > 50000

MsgBox "Высокая цена" Case Else

MsgBox "Неверное число" End Select

End Sub Sub Форма_AfterUpdate ()

Select Case Фирма Case "Apple"

Me!Год = 1975 Me!Президент = "Джобс"

Case "Motorola" Me!Год = 1937 Me!Президент = "Фишер"

Case "Intel" Me!Год = 1967 Me!Президент = "Нойс"

End Select End Sub Sub Доступ_Exit ()

MsgBox "Ввод запрещен" Me.Undo

End Sub Sub Год_Exit ()

If Len (Год) <> 4 Then

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

61

MsgBox "Введите четырехзначное число" Me.Undo

End If End Sub Sub ФормаСЭлементамиУправления_Open ()

номер = 0 Do

Me.Controls (Номер).Properties ("BorderColor") = номер * 1000 + 1 номер = номер + 1

Loop While Номер < Controls.Count End Sub Sub ФормаСФлажком_Open ()

Флажок.Value = Null With Выключатель

.Caption = "Шрифт"

.Value = False End With

End Sub Sub UserForm_Activate ()

With CheckBox1 .Value = Null .Caption = "Жирный курсивный шрифт" .WordWrap = True

End With With ScrollBar1

.Min = 20 .Max = 50 .Value = 30

End With With ToggleButton1

.Caption = "Шрифт" .Value = False

End With With SpinButton1

.Value = 50 .Max = 100 .Min = 1

End With End Sub Sub ЗаполнитьПервыйСписок ()

For i = 0 To 10 UserForm2.ListBox1.AddItem "номер" & i

Next End Sub Sub ПередатьВоВторойСписок ()

For i = 0 To (UserForm2.ListBox1.ListCount - 1) If UserForm2.ListBox1.Selected (i) Then _

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

62

UserForm2.ListBox2.AddItem _ UserForm2.ListBox1.List (i)

Next End Sub Sub ОчиститьВторойСписок ()

For i = (UserForm2.ListBox2.ListCount - 1) To 0 Step -1 UserForm2.ListBox2.RemoveItem i

Next End Sub ' Форма содержит два списка. Выбор выполняется щелчком по первому списку. Sub ListBox1_Click ()

строка = ListBox1.ListIndex ListBox2.AddItem (ListBox1.List (строка))

End Sub Sub ListBox2_Click ()

строка = ListBox2.ListIndex ListBox1.AddItem (ListBox2.List (строка))

End Sub Sub UserForm_Activate ()

ListBox1.AddItem "Борщ" ListBox1.AddItem "Яичница" ListBox1.AddItem "Солянка" ListBox1.AddItem "Рагу" ListBox1.AddItem "Компот" ListBox1.AddItem "Какао" ListBox1.AddItem "Мороженое" ListBox1.AddItem "Бутерброд" ListBox1.SetFocus

End Sub Sub Список1_Click ()

строка = Список1.ListIndex MsgBox (Список1.ItemData (Строка))

End Sub Sub ПолеСоСписком_Change ()

MsgBox "Опять что-то пишут :-(� End Sub ' Форма содержит поле со списком, надпись и две кнопки. Sub UserForm_Activate ()

ComboBox1.Text = "" Label1 = "" ComboBox1.SetFocus

End Sub

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

63

Sub CommandButton1_Click () ComboBox1.AddItem ComboBox1.Text ComboBox1.Text = "" ComboBox1.SetFocus

End Sub Sub CommandButton2_Click ()

сумма = 0: номерЗаписи = 1 Do While номерЗаписи <= ComboBox1.ListCount

сумма = сумма + Val (ComboBox1.List (НомерЗаписи - 1)) номерЗаписи = номерЗаписи + 1

Loop Label1 = "Итого: " & сумма

End Sub ' Форма содержит набор вкладок с надписью. Sub TabStrip1_Change () Label1.Caption = "Отделение № " & TabStrip1.Value End Sub ' В форме размещены поле Время и счетчик Стрелки Sub UserForm_Activate () UserForm1.Время = 5 End Sub Sub Время_Change () On Error Resume Next If Время < 1 Then Время = 1 ElseIf Время > 60 Then Время = 60 End If End Sub Sub Стрелки_SpinDown () If UserForm1.Время > 1 Then UserForm1.Время = UserForm1.Время - 1 End If End Sub Sub Стрелки_SpinUp () If UserForm1.Время < 60 Then UserForm1.Время = UserForm1.Время + 1 End If End Sub Sub UserForm_Initialize ()

Set страница = UserForm.Controls.Add ("Forms.MultiPage.1") TextBox1 = Format (Now, "d mmmm yy г.") CheckBox1 = True

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

64

CommandButton1.SetFocus End Sub

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

Методы класса Shape направлены на работу с геометрическими фигурами, а Picture � с рисунками.

Примеры Sub ДвижениеЛиний ()

With ActiveDocument For номерЛинии = 1 To .Shapes.Count If номерЛинии < .Shapes.Count Then

.Shapes (номерЛинии).Left = .Shapes (номерЛинии + 1).Left

.Shapes (номерЛинии).Top = .Shapes (номерЛинии + 1).Top Else

.Shapes (номерЛинии).Left = .Shapes (1).Left

.Shapes (номерЛинии).Top = .Shapes (1).Top End If Next номерЛинии

End With End Sub Sub РисунокФормы ()

With UserForm1.Image1 .Picture = LoadPicture ("C:\User\scan.bmp") .PictureAlignment = fmPictureAlignmentTopLeft .PictureSizeMode = fmPictureSizeModeStretch .Visible = True If .Top > 0 And .Left > 0 Then

.Move .Left - 5, .Top - 6 Else

.Visible = False End If

End With End Sub ' Несколько разноцветных прямоугольников в форме Sub РазноцветнаяФорма_Open ()

номерЦвета = 1 For Each фигура In Controls

фигура.Properties ("BorderColor") = номерЦвета номерЦвета = номерЦвета + 2000

Next фигура End Sub