61
СОДЕРЖАНИЕ Введение. 1. Общие сведения об объектно-ориентированном программировании. 2. Интегрированная среда разработки приложений на языке VBA. 3. Особенности программирования на языке VBA. 3.1. Типы данных. 3.2. Арифметические операторы. Приоритет операторов. 3.3. Стандартные функции. 3.4. Создание модулей. Процедуры и функции пользователя. 3.5. Объекты, свойства и методы VBA. 3.6. Операторы ввода – вывода. 3.7. Условные операторы. 3.8. Операторы цикла. 4. Создание экранных форм и включение их в проекты. 4.1. Создание форм. Методы и свойства форм. 4.2. Выбор и использование управляющих элементов. 5. Работа с файлами. Запись и чтение данных. Заключение. Список литературы. 4 7 8 10 11 14 15 16 20 22 23 26 30 30 32 38 42 44

Методичка по созданию приложений на VBA p. 1

Embed Size (px)

DESCRIPTION

Guidelines for creating applications on VBA p. 1

Citation preview

СОДЕРЖАНИЕ

Введение.

1. Общие сведения об объектно-ориентированном программировании.

2. Интегрированная среда разработки приложений на языке VBA.

3. Особенности программирования на языке VBA.

3.1. Типы данных.

3.2. Арифметические операторы. Приоритет операторов.

3.3. Стандартные функции.

3.4. Создание модулей. Процедуры и функции пользователя.

3.5. Объекты, свойства и методы VBA.

3.6. Операторы ввода – вывода.

3.7. Условные операторы.

3.8. Операторы цикла.

4. Создание экранных форм и включение их в проекты.

4.1. Создание форм. Методы и свойства форм.

4.2. Выбор и использование управляющих элементов.

5. Работа с файлами. Запись и чтение данных.

Заключение.

Список литературы.

4

7

8

10

11

14

15

16

20

22

23

26

30

30

32

38

42

44

ВВЕДЕНИЕ

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

Восточная мудрость гласит: “сколько знаешь языков, столько раз ты человек”. Огромное количество сведений, необходимых в повседневной работе и жизни, человек, находящийся в любых точках планеты и околоземного пространства, получает из глобальных компьютерных сетей (например, “INTERNET”). Следовательно, знать язык (языки), на которых человек общается и ставит задачи компьютеру должен каждый. Можно утверждать, что сегодня “программирование – это вторая грамотность”. Отметим любопытную тенденцию. На заре развития ЭВМ, в 50-60-е годы программирование - это грань таланта избранных, затем это желательная часть багажа каждого (70-е годы) и, на рубеже веков и тысячелетий, это необходимое условие жизни личности в обществе.

Сегодня как никогда актуально высказывание классиков кибернетики: “программирование - это элемент культуры”. То есть культурным можно считать человека, который не только умеет работать с готовыми программными продуктами, но и может дополнять и расширять их возможности, а также создавать новые приложения. А это накладывает дополнительные требования к уровню знаний и подготовке специалистов всех специальностей.

Настоящее методическое пособие поможет вам грамотно и эффективно использовать компьютер в своей работе, изучить основы программирования на языке Visual Basic for Application (VBA), расширить возможности стандартных приложений (в частности, популярного пакета MS Office), создавать приложения с поддержкой Internet при помощи технологии ActiveX, решать другие задачи.

В условиях постоянного роста производительности компьютеров и изменений в масштабах и номенклатуре приложений все большую значимость приобретает такой инструмент, как языки сценариев (scripting languages). Одно из фундаментальных изменений в подходе к программированию за последние 15 лет связано с переходом от традиционных языков программирования систем, таких как Си или С++, к языкам описания сценариев наподобие Perl или Tcl.. Языки

4

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

Языки Perl, Python, Rexx, Tcl, Visual Basic и оболочки Unix (shell) представляют стиль программирования, отличный от присущего языкам программирования систем. Этот стиль предполагает, что набор полезных в контексте решаемой задачи компонентов уже существует и остается должным образом их скомбинировать. Например, Tcl и Visual Basic могут служить для размещения на экране набора управляющих элементов пользовательского интерфейса, а написанные на shell командные файлы позволяют собрать программы-фильтры в конвейеры. Хотя языки сценариев часто используются для расширения свойств компонентов, они мало пригодны для программирования сложных алгоритмов и структур данных, обычно как раз и обеспечиваемых компонентами. Вот почему языки сценариев часто называют склеивающими языками (glue languages) или языками интеграции систем (system integration languages).

Экспансия Internet во многом способствовала популяризации языков сценариев. В конце концов, Сеть - не что иное, как склеивающий инструмент. Она не создает новых данных или вычислительных процедур, а просто делает огромное множество уже существующих ресурсов более доступными. Другой пример сценарно-ориентированных приложений - компонентные интегрированные среды, такие как ActiveX и JavaBeans. Без хорошего языка сценариев, предназначенного для манипулирования компонентами, потенциал интегрированных сред не получит реального воплощения. Не удивительно, что интегрированные среды завоевали столь большую популярность на персональных компьютерах - ведь именно на этой платформе Visual Basic обеспечивает удобное средство для сценарно-ориентированных технологий, а на других платформах, например, Unix/CORBA, такого рода средства в компонентную интегрированную среду в явном виде не включены.

Еще одна весьма важная причина роста популярности сценарных языков

5

связана с изменениями в программистском сообществе. 20 лет назад программистом мог быть только специалист с солидным профильным образованием. Считалось нормальным затратить несколько месяцев на освоение языка и среды программирования, и языки программирования систем проектировались с расчетом на таких профессионалов. Но с появлением персональных компьютеров к программистскому сообществу стали присоединяться люди, для которых программирование было не основным занятием, а лишь средством, к которому они иногда должны были прибегать. Примером такого нерегулярного программирования является написание простых запросов к базам данным и макросов для электронных таблиц. Программисты "по случаю" не склонны тратить месяцы на изучение языка, а хотели бы освоить его за несколько часов. В случае языков сценариев это вполне реально. Их легче осваивать, поскольку у них простой синтаксис и обычно опущены сложные конструкции наподобие объектов и потоков. Сравните Visual Basic и Visual C++ - мало кому из непрофессионалов может прийти сама мысль об использовании Visual C++, но очень многие с успехом пишут на Visual Basic.

Уже сегодня количество приложений, написанных на языках сценариев, превосходит число тех, что написаны на языках программирования систем. Это верно и для Unix-систем, в которых функционирует намного больше сценариев на shell, чем программ на Си; и для Windows, где больше приложений на Visual Basic, чем на Си или C++. Конечно, большинство сложных и наиболее распространенных приложений по-прежнему создается на языках программирования систем. Однако, языки сценариев стали основной движущей силой в разработке приложений, и их доля на рынке будет возрастать.

Расширение возможностей стандартных компонентов пакета Microsoft Office для решения конкретных задач достигается созданием собственных приложений путем программирования на языке MS Visual Basic, который доступен любому квалифицированному пользователю персональных компьютеров. MS Visual Basic может быть как встроенным в одно из приложений Microsoft Office, так и самостоятельным программным модулем. Одной из последних версий языка программирования является MS Visual Basic 6, которая при помощи технологии ActiveX позволяет создавать приложения с поддержкой Internet с неограниченными возможностями.

Цель данного методического пособия - познакомить учащегося с основными возможностями, средствами и способами программирования на языке Visual Basic for Application (VBA), встроенном в приложения Microsoft Office.

6

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

1. ОБЩИЕ СВЕДЕНИЯ ОБ ОБЪЕКТНО-ОРИЕНТИРОВАННОМ ПРОГРАММИРОВАНИИ

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

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

Методами называются действия, выполняемые объектом. Например, объект-окно может отображать или скрывать себя на экране.

Наследованием называется способность объекта сохранять атрибуты класса-родителя. Чтобы создать экземпляр объекта в Visual Basic, следует указать на его принадлежность некоторому классу и затем воспользоваться ключевым словом New. Новый объект наследует свойства и методы родителя.

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

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

7

2. ИНТЕГРИРОВАННАЯ СРЕДА РАЗРАБОТКИ ПРИЛОЖЕНИЙНА ЯЗЫКЕ VBA

Для вызова интегрированной среды разработки приложений (IDE) необходимо в любом приложении пакета Microsoft Office, выбрать в меню следующие команды: Сервис Макрос Редактор Visual Basic. Общий вид IDE приведен на рис. 2.1. IDE состоит из нескольких компонентов: главного меню, панели инструментов, окна проекта, окна свойств, панели элементов, конструктора форм, окна контрольных значений и нескольких других вспомогательных окон.

Окно проекта Форма Строка меню Панель инструментовОкно свойств Окно контрольных значений Панель элементов Конструктор

8

формРисунок 2.1. Общий вид IDE VBA.

Главное меню – это строка текста, расположенная в верхней части окна Visual Basic, и состоит из нескольких пунктов. Меню Файл предназначено для работы с файлами, из которых образуются приложения. В нем можно создавать, сохранять и печатать проекты. Меню Правка выполняет стандартные операции с буфером обмена – вырезание, копирование и вставка. Они применяются не только к фрагментам программы, но и к управляющим элементам. В меню Вид включаются режимы просмотра различных компонентов и инструментов. Просматривать можно формы и программные модули. Меню Вставка позволяет добавлять процедуры, формы, модули и модули класса. Команды меню Формат определяют расположение и размеры элементов и форм. При помощи команд меню Отладка можно запустить и остановить приложение, расставить точки прерывания и выбрать просматриваемые объекты, а также выполнить другие операции, помогающие следить за работой приложения. Команды меню Запуск запускают и останавливают приложение, прерывают и возобновляют выполнение программы, что особенно удобно в процессе отладки. Меню Сервис позволяет включить дополнительные элементы, запустить макросы и настроить параметры редактора. Меню Окно позволяет выстроить окна IDE (каскадное или мозаичное расположение), упорядочить значки свернутых форм, а также создает список, позволяющий быстро перейти к одному из открытых окон IDE. Меню ? – помощь пользователю. Для быстрого вызова главного меню необходимо нажать клавишу F10.

Панель инструментов находится под главным меню (рис.2.2). Если она отсутствует, необходимо выполнить команду Вид Панели инструментов Стандарт. Переход в MS Excel Прерывание программы Сохранение проекта Конструктор Копирование Окно проекта Найти Окно свойств Отменить Панель элементов

9

Вырезать Сброс Справка Вставить объект Вставить Запуск проекта Окно просмотра объектов

Рисунок 2.2. Панель инструментов VBA.

Окно проекта напоминает собой окно Проводника Windows, и предназначено для быстрого просмотра составляющих проекта, который объединяет в себе все объекты, составляющие приложение (рис. 2.3). Это

стандартные объекты от крытого приложения Microsoft Office (документ редактора MS Word, книга и её листы MS Excel), формы, модули и классы. Рисунок 2.3. Окно проекта. Рисунок 2.4. Окно свойств.

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

Окно контрольных значений позволяет просматривать значения контрольных переменных в процессе проверки правильности работы (отладки) проекта, что позволяет находить ошибки в логике работы программ.

Конструктор форм расположен в центре экрана редактора VBA. Здесь выводится либо изображение формы, что позволяет производить визуальное конструирование макета формы и расположенных на ней элементов, либо окно программы (более подробно об этом будет рассказано ниже).

3. ОСОБЕННОСТИ ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ VBA

10

Процесс разработки программ на языке VBA состоит из нескольких этапов, в зависимости от конечного результата. Если необходимо получить программу, которая будет производить определенные вычисления или действия, то достаточно создать программный модуль, содержащий текст исходного кода. Для применения этой программы можно поместить в рабочей области стандартного приложения Microsoft Office, кнопку, нажатие которой будет вызывать выполнение программы. Для этого в приложении необходимо включить панель инструментов с помощью команды Вид Панели инструментов Элементы управления, а затем создать кнопку с соответствующим программным кодом. Либо выполнять программу с помощью команды Сервис Макрос Макросы.

Разработка “полноценного” приложения (для выполнения которого требуется отдельное окно, с различными элементами управления) будет включать два этапа. Первый этап - этап визуального программирования, на котором создается окно (форма) программы, где располагаются необходимые элементы управления. Второй - этап программирования в исходном коде, на котором создаются части программы, выполняющиеся в ответ на определенные события. Событием является, например, щелчок левой кнопкой мыши на командной кнопке (событие Click), нажатие клавиши на клавиатуре (событие KeyPress) и т.д. Использовать такое приложение можно способом, аналогичным описанному выше.

3.1. Типы данных

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

Dim ИМЯ_ПЕРЕМЕННОЙ As ТИП_ПЕРЕМЕННОЙНапример:Dim A As Integer - объявляется переменная А целого типа;

11

Dim E As Single - объявляется переменная Е действительного типа;Dim S As String - объявляется строковая переменная S.

Базовые типы переменных VBA приведены в табл. 3.1. VBA позволяет не описывать переменные перед использованием в программе. В этом случае по умолчанию используется тип Variant. Переменные этого типа могут хранить все, что в них поместят, т.е. их тип изменяется в зависимости от последнего присвоения. Однако, рекомендуется все переменные, которые будут использоваться в программе, описывать явно. Для запрета использования переменных, которые не были явно описаны в начало программы необходимо вставить строку Option Explicit.

Таблица 3.1. Типы данных для переменных.

Типы данныхРазмер памяти

Назначение

Boolean (Логический)

2Содержит значения True (Истина) или False (Ложь).

Byte (Положитель-ное целое)

1Содержит целые положительные числа в диапазоне от 0 до 255.

Integer(Целое)

2Содержит целые числа в диапазоне от –32768 до 32768.

Long (Длинное целое)

4Содержит целые числа в диапазоне от – 2147483648 до 2147483647.

Single (Число с плавающей точкой)

4Содержит вещественные числа по абсолютной величине от 1,401298 Е-45 до 3,402823 Е+38.

Date (Дата) 8 Содержит даты от 1.01.100 г. до 1.12. 9999 г.Double (Число с плавающей точкой двойной точности)

8Содержит вещественные числа по абсолютной величине от 4,940656458 Е-324 до 1,79769313 Е+308.

Object (Объект) 4 Содержит ссылки на любой заданный объект.String (Строковый)

10 +длина

Содержит текстовые или строковые значения длиной от 0 до 2*109.

Currency (Денежный)

8Содержит денежные величины в диапазоне от -922337203685477,58 до 922337203685477,58.

12

Variant (Вариант)

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

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

Const ИМЯ_ПОСТОЯННОЙ = ВЫРАЖЕНИЕConst ИМЯ_ПОСТОЯННОЙ As ТИП_ПОСТОЯННОЙ= ВЫРАЖЕНИЕНапример:Соnst FileName = "text.xls"Соnst PI As Double = 3.14159 Для хранения векторов, матриц и т.д. можно использовать массивы.

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

Dim ИМЯ_МАССИВА(Размерность) As ТИП_МАССИВАНапример:Dim A(12) As Integer - объявляется вектор из 12 целых чисел, причем по

умолчанию первый элемент массива будет А(0), а последний А(11). Говорят, что 0 – базовый индекс.

Dim B(3, 3) As Single -объявляется матрица 3х3 действительных чисел.Чтобы задать массив, у которого 1-й элемент будет иметь индекс 1,

необходимо использовать следующую конструкцию:Dim ИМЯ_МАССИВА(1 to Размерность) As ТИП_МАССИВАНапример:

Dim B(1 to 3, 1 to 3) As SingleDim A(1 to 12) As Integer

- использование ключевого слова to при объявлении массива изменяет базовый индекс на 1.

Массив в программе определяется поэлементно, например:Dim B(1 to 2) As SingleB(1) = 2.1 : B(2) = 4.6

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

13

динамическим.

Dim ИМЯ_МАССИВА( ) As ТИП_МАССИВА

Например: Dim Y( ) As Integer

Затем добавление элементов в массив осуществляется оператором ReDim, который можно использовать только в процедурах. Например: ReDim Y(5)

Созданным элементам необходимо присвоить значения. Позднее количество элементов массива снова можно изменить. При этом все значения, хранящиеся в массиве, теряются. Чтобы сохранить их необходимо использовать ключевое слово Preserve. Например: ReDim Preserve Y(7)

3.2. Арифметические операторы. Приоритет операторов.

Оператор присваивания имеет следующий синтаксис:ИМЯ_ПЕРЕМЕННОЙ = ВЫРАЖЕНИЕВЫРАЖЕНИЕ - это любые арифметические и логические операторы,

операторы сравнения и конкатенации, написанные по правилам VBA. Результат вычисления выражения заносится в указанную переменную. Для избежания ошибок рекомендуется выполнять присвоение только между совместимыми типами данных. Например, переменная, которая требует целое значение, не может принимать строковое значение, если вся строка не распознается как целое число. Тип Integer всегда может быть присвоен типу Long, тип Single всегда может быть присвоен типу Double, и любой тип (кроме типа, определяемого пользователем) может быть присвоен типу Variant. При присвоении вещественного типа целому происходит округление (если результат округления не превышает максимального значения, которое может храниться в этом типе). В таблице 3.2 приведены арифметические операторы.

Таблица 3.2. Арифметические операторы.

Оператор Описание

Оператор ^ Возводит число в степень.Оператор * Возвращает произведение двух чисел.Оператор / Возвращает результат деления двух чисел.Оператор \ Возвращает результат целого деления двух чиселОператор Mod Возвращает остаток при целом делении двух чисел (значение

14

по модулю).Оператор + Возвращает сумму двух чиселОператор - Возвращает разность двух чисел или изменяет знак числового

выражения.

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

Если выражение содержит операторы разных типов, то первыми выполняются арифметические операции, следом за ними операции сравнения, а последними логические операции. Все операторы сравнения имеют равный приоритет, т.е. выполняются в порядке их расположения в выражении слева направо. Арифметические и логические операторы выполняются в порядке их расположения в таблице 3.3.

Таблица 3.3. Приоритет операторов.

Арифметические Сравнения Логические

Возведение в степень (^) Равняется (=) NotИзменение знака (–) Не равняется (<>) AndУмножение и деление (*, /) Меньше (<) OrЦелое деление (\) Больше (>) XorДеление по модулю (Mod) Меньше или равняется (<=)Сложение и вычитание (+, –) Больше или равняется (>=)

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

Например, математическое выражение на VBA будет

иметь следующий вид: y = (x ^ 2 - 3 * x ^ (0.7)) / ((0.2 * x + 1) * (x - 4))

3.3. Стандартные функции VBA

В таблицах 3.4 и 3.5 приведены наиболее часто используемые стандартные функции преобразования типов и математические функции VBA.

15

Таблица 3.4. Функции преобразования типов.

Функция Описание

CDate(выражение) Преобразует выражение в тип Date.CInt(выражение) Преобразует выражение в тип Integer.CLng(выражение) Преобразует выражение в тип Long.CSng(выражение) Преобразует выражение в тип Single.CStr(выражение) Преобразует выражение в тип String.

Таблица 3.5. Математические функции.

Функция Описание

abs(аргумент) Возвращает значение, тип которого совпадает с типом переданного аргумента, равное абсолютному значению указанного числа.

atn(аргумент) Возвращает значение типа Double, содержащее арктангенс числа.

cos(аргумент) Возвращает значение типа Double, содержащее косинус угла.int(аргумент) Возвращает значение типа, совпадающего с типом аргумента,

которое содержит целую часть числа.log(аргумент) Возвращает значение типа Double, содержащее натуральный

логарифм числа.exp(аргумент) Возвращает значение типа Double, содержащее результат

возведения числа e (основание натуральных логарифмов) в указанную степень.

sin(аргумент) Возвращает значение типа Double, содержащее синус угла.sqr(аргумент) Возвращает значение типа Double, содержащее квадратный

корень указанного числа.tan(аргумент) Возвращает значение типа Double, содержащее тангенс угла.

3.4. Создание модулей. Процедуры и функции пользователя

Модуль представляет собой

16

Рисунок 3.1. Окно модуля.

текстовый ASCII-файл с программным кодом, содержащим подпрограммы, переменные и константы. Проект может состоять из множества программных модулей. Для их создания необходимо выполнить команду Вставка Модуль. Рабочее окно модуля представлено на рис. 3.1.

Основу программного кода в VBA составляют процедуры и функции.Процедура Sub– это обособленная совокупность операторов VBA,

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

[ДОСТУП] Sub ИМЯ_ПРОЦЕДУРЫ ([СПИСОК_ПАРАМЕТРОВ]) ТЕЛО_ ПРОЦЕДУРЫ End Sub Ключевое слово ДОСТУП является необязательным и определяет область

видимости процедуры. Public указывает, что процедура доступна для всех других процедур во всех модулях (глобальная). Private указывает, что процедура доступна для других процедур только того модуля, в котором она описана (локальная). СПИСОК_ПАРАМЕТРОВ также является необязательным элементом и позволяет передавать процедуре различные исходные данные при вызове, которые называются формальными параметрами. При этом ключевое слово Dim не указывается. ТЕЛО_ПРОЦЕДУРЫ состоит из описательной части и блока операторов, выполняющихся один за другим. Если необходимо прекратить выполнение процедуры в некотором конкретном месте, это можно сделать с помощью оператора Exit Sub. ИМЯ_ПРОЦЕДУРЫ – это любой идентификатор, определенный пользователем. Идентификатор – это последовательность букв, цифр и символа подчеркивания, начинающаяся с буквы (пробелы внутри идентификатора недопустимы). Имя процедуры всегда определяется на уровне модуля. Для использования процедуры в тексте программы (т.е. для её вызова), необходимо указать имя процедуры и список фактических параметров, которые должны по типу и порядку следования совпадать с формальными параметрами.

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

17

которых возвращается функцией. Структура функции следующая:

[ДОСТУП] Function ИМЯ_ФУНКЦИИ(СПИСОК_АРГУМЕНТОВ) As ТИП ТЕЛО_ ФУНКЦИИ ИМЯ_ФУНКЦИИ = ВЫРАЖЕНИЕEnd Function ТИП определяет тип данных возвращаемого результата. В теле функции

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

части которого указывается имя функции с перечнем фактических параметров, как и любой другой встроенной функции, например, Sqr, Cos или Chr.

Процедуры и функции, не описанные явно с помощью ключевых слов Public или Private, по умолчанию являются общими.

Для быстрого добавления в модуль подпрограмм удобно воспользоваться командой Вставка Процедура. В появившемся окне (рис. 3.2) нужно

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

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

Пример. В MS Excel создать функцию пользователя, математически определенную следующим образом:

y = sin(x) e-5x

Создадим модуль, как указано выше (рис 3.1), и введем в него текст следующей программы:

Public Function Y(x As Single) As Single Y = Sin(x) * Exp(- 5 * x )

18

Рисунок 3.2. Диалоговое окно Вставка процедуры

End FunctionНа рабочем листе MS Excel запишем в ячейку А1 число 0.1. В ячейке В2

нужно вычислить значение функции Y при x = 0.1. Для этого в ячейку В2 достаточно ввести формулу =Y(A1). Это можно сделать и с помощью Мастера функций, который будет содержать функцию Y наряду с другими встроенными функциями MS Excel (рис 3.3).

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

процедурах модуля. Далее располагают непосредственно текст функций и процедур, составляющих саму программу. Разделителем операторов в одной строке при записи программы является символ “ : ”. Для переноса оператора на другую строку используется символ “_” (знак подчеркивания).

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

Пример организации модуля:Option Base 1Option Explicit‘ PI – глобальная константаConst PI As Double = 3.14159‘ x - глобальная переменная

19

Рисунок 3.3. Ввод функции Y( ).

Dim x As Double ‘ Функция Disc вычисляет площадь кругаPublic Function Disc(R As Double) As Double x = 2 Disc = PI * R ^ 2End Function‘ Функция Rec вычисляет площадь треугольникаPublic Function Rec(a As Double, b As Double, c As Double ) As Double ‘ p – локальная переменная Dim p As Double p = ( a + b + c) / 2 Rec = Sqr ( p * ( p – a )* ( p – b ) * ( p – c))End Function‘ Процедура Result вызывает функции Disc и Rec и выводит результатыPublic Sub Result ( ) ‘R_1, R_2, a, b, c - локальные переменные Dim R_1 As Double, R_2 As Double, a As Double, b As Double, c As Double R_1 = Disc( 2. 5 ) x = x + 2 MsgBox “ Площадь круга = “ & CStr( R_1) & “, x = “ & CStr (x) a =1: b = 1 : c = Sqr (2 ) R_2 = Rec (a, b, c) MsgBox “ Площадь треугольника = “ & CStr( R_2)End Sub Здесь инструкция Option Explicit указывает на необходимость описания

типов переменных, используемых на данном листе модуля. Инструкция Option Base 1 указывает, что индексация элементов массива будет начинаться с 1. Функция Sqr вычисляет корень квадратный аргумента. Функция CStr переводит числовой формат в строковый.

3.5. Объекты, свойства и методы VBA

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

20

свойствами. Например, форма может быть видимой или невидимой в данный момент на экране. Другой пример свойства объекта – шрифт для отображения информации в ячейке (объекте) рабочего листа.

Объект содержит также список методов, которые к нему применимы. Методы – это то, что вы можете делать с объектом. Например, показать форму на экране или убрать её можно с помощью методов Show и Hide.

Таким образом, объект – это программный элемент, который имеет свое отображение на экране, содержит некоторые переменные, определяющие его свойства, и некоторые методы для управления объектом. Например, в MS Excel имеется много встроенных объектов:Range(“Адрес”) - диапазон ячеек (может включать только одну ячейку).Cells(i, j) - ячейка, находящаяся на пересечении i-й строки и j-го

столбца рабочего листа MS Excel (i и j – целые числа).Sheet(“Имя”) - лист.WorkSheet - рабочий лист.

Установка значений свойств – это один из способов управления объектами. Синтаксис установки значения свойства объекта следующий:

Объект. Свойство = ВыражениеОсновным свойством объектов Cells и Range, является Value (значение),

которое, однако, можно не указывать. Например:Range(“A5:A10”). Value = 0 – в диапазон ячеек A5:A10 заносится значение 0.Cells(2, 4).Value = n – в ячейку, находящуюся на пересечении 2-й строки и 4-

го столбца (ячейка с адресом “D2”), заносится значение переменной n. Синтаксис чтения свойств объекта следующий:Переменная = Объект. СвойствоНапример:Xn = Cells(1,2).Value или Xn = Range(“B1”).Value – переменной Xn

присваивается значение из ячейки B1 текущего рабочего листа.Синтаксис применения методов к объекту:Объект. МетодНапример:Range("A5:A10").Clear - очищается диапазон ячеек A5:A10.Range("A2:B10").Select - выбирается диапазон ячеек A2:B10В MS Excel имеется много объектов, причем некоторые из них содержат

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

21

содержит диапазон ячеек и т.д. Объектом самого высокого уровня является Appli-cation (приложение). Если вы изменяете его свойства или вызываете его методы, то результат применяется к текущей работе MS Excel. Например:

Application.Quit - завершение работы с Excel.Отметим, что точка после имени объекта может использоваться для

перехода от одного объекта к другому. Например, следующее выражение очищает вторую строку рабочего листа Май в рабочей книге Отчет:

Application.Workbooks("Отчет").Worksheets("Май").Rows(2).DeleteНужно отметить следующее:

Можно не писать имя объекта Application, так как это подразумевается по умолчанию. При работе с подобъектом уже активизированного объекта нет необходимости указывать содержащий его объект. VBA использует некоторые свойства и методы, которые возвращают объект к которому они относятся (это позволяет быстро указывать нужный объект). Примеры таких свойств: ActiveCell (активная ячейка), ActiveSheet (активный лист), ActiveWorkBook (активная рабочая книга). Так, установить значение активной ячейки можно следующим образом:

ActiveCell.Value = " Да".

3.6. Операторы ввода-вывода

Функция MsgBox осуществляет вывод информации в диалоговом окне и устанавливает режим ожидания нажатия кнопки пользователем. Она имеет следующий синтаксис:

MsgBox СООБЩЕНИЕ[,КНОПКИ][, ЗАГОЛОВОК] Аргументы:СООБЩЕНИЕ - обязательный аргумент, задающий в окне выводимое

информационное сообщение. Может состоять из нескольких текстовых строк, объединенных знаком &. Использование в этом аргументе Chr(13) приводит к переходу на новую строку при выводе информации.

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

22

ОК. В табл. 3.6 приведены возможные комбинации кнопок и значков в окне сообщений.

ЗАГОЛОВОК - задает заголовок окна. Функция MsgBox возвращает значение типа Integer, указывающее, какая

кнопка была нажата в диалоговом окне. Таблица 3.6. Допустимые значения переменной кнопки.

Отображение Аргумент

Кнопка ОК VbOKOnlyКнопки ОК и Отмена VbOKCancelКнопки Да и Нет VbYesNoКнопки Да, Нет и Отмена VbYesNoCancelКнопки Прекратить, Повторить и Игнорировать VbAbortRetryIgnoreКнопки Повторить и Отмена. VbRetryCancelИнформационный знак VbInformationЗнак вопроса VbQuestionЗнак восклицания VbExclamation

Функция InputBox осуществляет ввод значений с помощью окна ввода и имеет следующий синтаксис:

ИМЯ_ПЕРЕМЕННОЙ = InputBox( СООБЩЕНИЕ[, ЗАГОЛОВОК])Аргументы:СООБЩЕНИЕ - обязательный аргумент. Задает в окне информационное

сообщение, обычно поясняющее смысл вводимой величиныЗАГОЛОВОК - задает заголовок окна. Например:MsgBox "Сумма = " & CStr(S), vbOKOnly, "Результаты" - выводит в

отдельное окно с именем "Результаты", содержащее только кнопку "Ok", значение переменной S, с соотвующим пояснением.

n = InputBox("Введите размерность массива", "Ввод данных") -

3.7. Условные операторы

Оператор If…Then…Else представляет собой простейшую форму проверки условий в VBA, и имеет следующий синтаксис:

23

If УСЛОВИЕ Then ОПЕРАТОР_1 Else ОПЕРАТОР_2ОПЕРАТОР_1 выполняется, если УСЛОВИЕ истинно, в противном случае

выполняется ОПЕРАТОР_2. При этом оператор If…Then…Else записывается в одну строку.

УСЛОВИЕ – это выражение логического типа. Результат выражения всегда имеет булевский тип. Выражение может быть простым и сложным. При записи простых условий могут использоваться все возможные операции отношения, указанные в табл. 3.7.

Таблица 3.7. Логические отношения.

Операция Название Выражение Результат

= Равно A = В True, если А равно В<> Не равно A<>В True, если А не равно В> Больше А>B True, если А ,больше В< Меньше A<B True, если А меньше В

>= Больше или равно A>=B True, если А больше или равно В<= Меньше или равно A<=B True, если А меньше или равно В

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

Таблица 3.8. Логические операции.

Операция Название Выражение А В Результат

Not Логическое отрицание Not AFalseTrue

TrueFalse

And Логическое И A And B

TrueTrueFalseFalse

TrueFalseTrueFalse

TrueFalseFalseFalse

Or Логическое ИЛИ A Or B

TrueTrueFalseFalse

TrueFalseTrueFalse

TrueTrueTrueFalse

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

If УСЛОВИЕ Then

24

БЛОК_ОПЕРАТОРОВ_1 Else БЛОК_ОПЕРАТОРОВ_2End IfВетвь Else в условном операторе является необязательной. В операторе

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

If A > 10 Then A = A+1 : B = B + A : C = C + BВ условном операторе может проверяться несколько условий. В этом случае

условный оператор имеет вид:If УСЛОВИЕ_1 Then БЛОК_ОПЕРАТОРОВ_1 Else If УСЛОВИЕ_2 Then БЛОК_ОПЕРАТОРОВ_2 Else …. End IfEnd IfПример: составим функцию пользователя, которые вычисляет

комиссионные, начисляемые по следующему правилу: если продукции продано не меньше, чем на 10000 грн., то комиссионные составляют 2% от стоимости реализованной продукции; если продукции продано меньше, чем на 10000 грн., то комиссионные составляют 1% от стоимости реализованной продукции; если стаж работы в фирме не меньше 5 лет, то выплачивается доплата в размере 0,5% от стоимости реализованной продукции.

1-й способ.Public Function Bonus( Age As Byte, Sales As Single) As Single

If Age >=5 And Sales >= 10000 Then Bonus= 0.025 * SalesIf Age < 5 And Sales >= 10000 Then Bonus= 0.02 * SalesIf Age >=5 And Sales < 10000 Then Bonus = 0.015 * SalesIf Age < 5 And Sales < 10000 Then Bonus = 0.01 * Sales

End Function2-й способ.

25

Public Function Bonus( Age As Byte, Sales As Single) As SingleDim sAge As Single, sSale As Single

If Age >=5 Then sAge =0.005 * SalesIf Sales >= 10000 Then

sSale =0.02 * SalesElse

sSale =0.01 * SalesEnd IfBonus = sAge + sSale

End Function

3.8. Операторы цикла

Для многократного выполнения одного оператора или их группы служит оператор цикла For…Next, который имеет следующий синтаксис:

For СЧЕТЧИК=НАЧ_ЗНАЧЕНИЕ Тo КОН_ЗНАЧЕНИЕ Step ШАГ БЛОК_ОПЕРАТОРОВ [Exit For] БЛОК_ОПЕРАТОРОВNext СЧЕТЧИКЦикл For…Next обеспечивает многократное выполнение блока операторов

при последовательном изменении счетчика от начального до конечного значения с указанным шагом изменения. Если Step ШАГ в конструкции отсутствует, то по умолчанию считается, что шаг равен 1. По оператору Exit For можно выйти из оператора цикла до того, как СЧЕТЧИК достигнет последнего значения.

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

где P(1), d(1) – размер и дата выдачи ссуды, причем Р(1) берется со знаком минус;

P( j ), d( j ) – размер и дата j – й выплаты,n – 1 - число выплат,

26

i - годовая процентная ставка.Option ExplicitOption Base 1Public Function Доход(процент As Double, платеж As Variant,_ год As Variant) As DoubleDim i As Integer, j As Integer, n As Integer, s As Double n = платеж. Rows. Count s = 0 For i = 1 To n s = s + платеж( i ) / (1 + процент)^((год( i ) – год( 1 ))/ 365) Next i Доход = sEnd Function

Решим с помощью функции Доход следующую задачу. Предположим, что 11.01.97. у вас берут в долг 10000 грн. и предлагают вернуть: 20.12 97 – 2000 грн., 18.10.98 – 4000 грн., 12.04.99 – 7000 грн. Имеет ли смысл эта сделка при годовой ставке 10%? Для решения этой задачи введем данные, как показано на рис 3.4.

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

В ячейку В8, где вычисляется разность между текущим объемом вклада и размером ссуды, введем формулу = Доход(В7; В2:В5; D2:D5). В данном случае найденное значение равно 857.91. Так как результат положителен, данная сделка

27

выгодна.Отметим, что метод Rows возвращает строки диапазона платеж, а свойство

Count считает число элементов объекта. Таким образом, платеж. Rows. Count определяет число строк в диапазоне платеж. Если бы вы хотели найти число столбцов диапазона платеж, то вам нужно было бы использовать конструкцию платеж. Columns. Count.

Пример. Составить функцию Test, определяющую номер первого вхождения элемента b в вектор a. Если среди компонент вектора a нет элементов, равных b, функция Test принимает значение равное –1.

Public Function Test( a As Variant, b As Variant) As IntegerDim i, n As Integer, t As Boolean n = a. Rows. Count * a. Columns. Count t = False For i = 1 To n If a( i ) = b Then Тest = I : t = True Exit For End If Next i If t = False Then Тest = -1End FunctionДля перебора объектов из группы подобных объектов, например, ячеек из

диапазона или элементов массива, удобно использовать оператор цикла For… Each…Next.

For Each ЭЛЕМЕНТ In ГРУППА БЛОК_ОПЕРАТОРОВ [Exit For] БЛОК_ОПЕРАТОРОВNext ЭЛЕМЕНТПример. Составим процедуру Знак, которая заменяет все положительные

числа из диапазона ячеек А1:В2 знаком “+”, все отрицательные числа – знаком “-“, а нули оставить без изменения:

Option ExplicitPublic Sub Знак( )Dim c As Object

28

For Each c In Worksheets(“Лист1”).Range(“A1:B2”)If IsNumeric(c.Value) Then If c.Value > 0 Then c.Value = “+” End IfIf IsNumeric(c.Value) Then If c.Value < 0 Then c.Value = “-” End IfIf IsNumeric(c.Value) Then If c.Value = 0 Then c.Value = 0 End IfEnd IfNext cEnd SubВ процедуре Знак использовалась функция IsNumeric(ВЫРАЖЕНИЕ),

которая возвращает True, если ВЫРАЖЕНИЕ может быть описано как числовое, и False в противном случае.

В VBA для организации циклов с неизвестным заранее числом повторений используются и другие операторы цикла: Do While…Loop, Do Until…Loop, Do… Loop While, Do…Loop Until, которые имеют следующий синтаксис:

Do While УСЛОВИЕ БЛОК_ОПЕРАТОРОВ [Exit Do] БЛОК_ОПЕРАТОРОВLoop

Do Until УСЛОВИЕ БЛОК_ОПЕРАТОРОВ [Exit Do] БЛОК_ОПЕРАТОРОВLoop

Do БЛОК_ОПЕРАТОРОВ [Exit Do] БЛОК_ОПЕРАТОРОВLoop While УСЛОВИЕ

Do БЛОК_ОПЕРАТОРОВ [Exit For] БЛОК_ОПЕРАТОРОВLoop Until УСЛОВИЕ

Оператор Do While…Loop обеспечивает многократное повторение блока операторов до тех пор, пока УСЛОВИЕ соблюдается, а оператор Do Until…Loop пока УСЛОВИЕ не соблюдается. Операторы Do…Loop While, Do…Loop Until отличаются от перечисленных выше операторов тем, что сначала блок операторов выполняется по крайней мере один раз, а потом проверяется УСЛОВИЕ. Для

29

избежания зацикливания в теле цикла должен быть хотя бы один оператор, который изменяет значения переменных, стоящих в УСЛОВИИ. Оператор Exit Do обеспечивает досрочный выход из оператора цикла.

4. СОЗДАНИЕ ЭКРАННЫХ ФОРМ И ВКЛЮЧЕНИЕ ИХ В ПРОЕКТЫ4.1. Создание форм. Свойства, события и методы форм

Форма – это главный объект, образующий визуальную основу приложения. По своей сути форма представляет собой окно, в котором можно размещать различные управляющие элементы при создании приложений. Для создания формы необходимо выполнить команду Вставка UserForm. В окне Конструктора форм появится форма, имеющая стандартный вид для ОС Windows (рис. 4.1).

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

Таблица 4.1. Основные свойства формы.

Свойство Описание

BackColor Цвет фона для формы.BorderStyle Определяет тип границы, окружающей формуCaption Текст, который выводится в заголовке формы.Font Определяет тип и вид шрифта в форме.Height Определяет высоту формы в твипах.(Name) Имя объекта, для программы VBA. Width Определяет ширину формы в твипах.

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

30

frmForm1.Caption = "Привет"Программы в ОС Windows управляются событиями. Каждый раз, когда

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

Таблица 4.2. Основные события форм.

Событие Описание

Initialize Происходит во время конфигурации и до загрузки формы в память.Activate Происходит после загрузки формы в память.Deactivate Происходит, если форма перестает быть активной.Click Происходит при нажатии левой кнопки мыши на форме.

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

Private Sub UserForm_Activate() frmForm1.Caption = "Щелчок на форме уменьшает её размеры"End SubPrivate Sub UserForm_Click() frmForm1.Width = frmForm1.Width / 2 frmForm1.Height = frmForm1.Height / 2 frmForm1.Caption = "Сделай это еще раз!"End SubТакже форма обладает набором методов и инструкций. Метод определяет

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

Таблица 4.3. Основные методы форм.

31

Метод Описание

Hide Скрывает объект UserForm, но не выгружает его.Show Выводит на экран объект UserForm.

Таблица 4.4. Основные инструкции форм. Инструкция ОписаниеLoad Загружает объект UserForm, но не отображает его на экране.Unload Удаляет объект UserForm из памяти.

В следующем примере предполагается, что в проекте созданы две формы frmForms. При запуске проекта происходит событие Initialize для формы frmForm1, форма frmForm2 загружается и выводится на экран. Когда при помощи мыши выбирается frmForm2, она делается невидимой, и появляется форма frm Form1. Если же выбирается frmForm1, frmForm2 появляется вновь.'Событие Initialize формы frmForm1.

Private Sub UserForm_Initialize()Load frmForm2frmForm2.Show

End Sub' Событие Click для формы frmForm2Private Sub UserForm_Click()

frmForm2.HideEnd Sub' Событие Click для формы

frmForm1Private Sub UserForm_Click()

frmForm2.ShowEnd Sub

4.2. Выбор и использование управляющих элементов

Создание управляющих элементов на форме выполняется с помощью Панели инструментов, которая выводится на экран командой Вид Панель элементов (рис.4.2).

Выбор объекта Надпись

Текстовое поле Поле со списком

Список Флажок

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

32

Выключатель

Рамка Командная кнопка

Набор вкладок Набор страниц

Полоса прокрутки Счетчик

Рисунок

Рисунок 4.2. Панель элементов VBA.С помощью кнопок этой панели можно поместить в форму необходимый

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

Каждый управляющий элемент (объект) характеризуется набором свойств (которые можно изменять в режимах конструирования или выполнения), событий и методов.

Для каждого объекта проекта необходимо определить его имя. В соответствии с общепринятыми соглашениями об именах объектов первые три символа имени должны отражать вид элемента, а остальные символы - назначение. В табл. 4.5. представлены сочетания первых трех символов для наиболее часто используемых элементов.

Таблица 4.5. Рекомендуемые сочетания первых трех символов имен.

Объект Первые 3 символа имени Пример имени

Форма frm frmMyFormНадпись lbl lblInfoТекстовое поле txt txtInputКомандная кнопка cmd cmdExitФлажок chk chkSoundПереключатель opt optLevelСписок lsb lsbTypesРамка fra fraChoices

33

Полоса прокрутки vcb vcbSpeedРисунок pic picChema

Командная кнопка является самым распространенным элементом управления, и может использоваться для организации выполнения вычислений и других действий, вызова процедур и функций пользователя, открытия форм и т.д. Основные свойства командной кнопки представлены в табл. 4.6. В свойстве Cap-tion можно ставить символ & перед буквой, которая будет использоваться в сочетании с клавишей Alt для ускоренного доступа к кнопке. Также можно перейти к кнопке клавишей Tab, а затем нажать Enter.

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

Таблица 4.6. Свойства командных кнопок.

Свойство Описание

BackColor Цвет фона кнопки.Caption Текст, который выводится на кнопке.Enabled Значение False делает кнопку недоступной.Font Определяет тип и вид шрифта на кнопке.ForeColor Определяет цвет шрифта на кнопке.(Name) Имя объекта, для программы VBA. Picture Добавляет рисунок на кнопку.PicturePosition Определяет расположение текста и рисунка на кнопке.Visible Значение False делает кнопку невидимой.

Наиболее полезным методом командной кнопки является SetFocus, позволяющий вернуться к кнопке (передать ей фокус). Например, следующая команда позволяет вернуться к кнопке по умолчанию после ввода данных в текстовое поле: cmdMyButtum.SetFocus

Текстовое поле применяется для ввода или вывода информации. Основные свойства текстового поля представлены в табл. 4.7.

Таблица 4.7. Свойства текстового поля.

Свойство Описание

Enabled Значение False делает поле недоступным.Font Определяет тип и вид шрифта в текстовом поле.

34

ForeColor Определяет цвет шрифта в текстовом поле.(Name) Имя объекта, для программы VBA. MaxLength Определяет количество вводимых символов в текстовое поле.PasswordChar Определяет символ, отображаемый при вводе в текстовое поле.Text Определяет содержимое текстового поля.

Например, для очистки содержимого текстового поля в ходе выполнения программы необходимо ввести в требуемом месте программного кода команду:

txtResult.Text=" "Основным событием текстового поля является Change, происходящее при

вводе или удалении символов. Например, команду cmdMyButtum.SetFocus можно поместить в процедуру события Change текстового поля.

Надпись применяется как самостоятельно для вывода справочной информации, так и в виде "подсказок" для текстового поля, списка или другого элемента. Главное её отличие от текстового поля в том, пользователь не может изменить текст надписи (хотя его можно изменить как свойство во время выполнения программы). Основные свойства надписи представлены в табл. 4.8.

Таблица 4.8. Свойства надписи.

Свойство Описание

Caption Определяет текст, содержащийся в надписи.Font Определяет тип и вид шрифта надписи.ForeColor Определяет цвет шрифта надписи.(Name) Имя объекта, для программы VBA. Picture Добавляет рисунок в надпись.PicturePosition Определяет расположение текста и рисунка надписи.

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

Таблица 4.9. Свойства списка.

Свойство Описание

35

(Name) Имя объекта, для программы VBA. ListIndex Возвращает номер текущей выделенной строки списка -1.Text Содержимое текущей выделенной строки списка.

Для списка чаще всего используются события Click и DblClick (двойной щелчок левой кнопкой мыши на одной из строк списка). Во втором случае пользователь одновременно выделяет строку и начинает ее обработку.

Работа со списком начинается с его заполнения методом AddItem, который может вызываться несколько раз подряд. Часто метод AddItem помещается в процедуру UserForm_Initialize(), чтобы список заполнялся при загрузке формы. Метод RemoveItem удаляет строки из списка. Метод Clear очищает сразу весь список. Следующий пример показывает, как работают списки, при этом предполагается, что в проекте создана форма с двумя списками (List1 и List2). Двойной щелчок на любой строке одного списка перемещает её в другой список. Строка включается в другой список до того, как она будет удалена из текущего.

Private Sub UserForm_Initialize() List1.AddItem "Стол" List1.AddItem "Стул" List1.AddItem "Диван" List1.AddItem "Кресло" List1.AddItem "Кровать"End Sub Private Sub List1_DblClick() List2.AddItem List1.Text

List1.RemoveItem List1.ListIndexEnd SubPrivate Sub List2_dblClick() List1.AddItem List2.Text List2.RemoveItem List2.ListIndexEnd Sub

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

Таблица 4.10. Свойства переключателя.

Свойство Описание

Caption Задает текст, определяющий назначение переключателя.(Name) Имя объекта, для программы VBA. Value Значение True указывает, что переключатель выбран.

Наиболее важным является свойство Value значение True (переключатель

36

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

Флажок частично аналогичен переключателю, но в отличие от него может использоваться как отдельный самостоятельный элемент. Даже объединенные в группу флажки работают независимо друг от друга. Основные свойства флажков такие же, как и у переключателя (см. табл. 4.10). Однако свойство Value может принимать три значения (флажок находится в установленном состоянии, снятом или неопределенном).

Наиболее часто используемым событием флажков является Click, в процедуре которого можно проверять состояние флажка по свойству Value. Следующий пример иллюстрирует работу флажков, при этом предполагается, что в проекте создана форма с двумя флажками (ChkBold и ChkInalic) и текстовым полем TxtExam (рис.4.3). После ввода символов в текстовое поле, с помощью флажков можно делать текст полужирным или курсивом. Свойства FontBold и FontItalic текстового поля устанавливают способы начертания текста. Рисунок 4.3. Использование флажков. Private Sub Chkbold_Click() If ChkBold.Value = True Then TxtExam.FontBold = True Else TxtExam.FontBold = False End IfEnd Sub

Private Sub ChkItalic_Click() If ChkBold.Value = True Then TxtExam.FontItalic = True Else TxtExam.FontItalic = False End If End Sub

Рамка используется для группировки переключателей или флажков, и помещается на форму раньше элементов, находящихся внутри неё. Переключатели находящиеся внутри рамки, работают как самостоятельная группа

37

и не влияют на состояние переключателей в других рамках. Основным свойством рамки является Caption, которое задает текст, определяющий назначение элементов в рамке.

Рисунок используется для простейшего вывода изображения на форме. Он может отображать растровые файлы (.BMP), значки (.ICO), метафайлы (WMF), а также файлы в формате JPEG (.JPG) и GIF (.GIF). Основные свойства рисунка представлены в табл. 4.11.

Таблица 4.11. Свойства рисунка.

Свойство Описание

Autosize Значение True подгоняет размер элемента под размер содержимого.(Name) Имя объекта, для программы VBA. Picture Задает файл для рисунка.

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

5. ЗАПИСЬ И ЧТЕНИЕ ДАННЫХ

При работе с большим количеством данных часто бывает удобно записывать данные в файл или считывать из файла. Работа с файлом любого типа начинается с его открытия. Для этого используется оператор Open, который открывает файл и готовит его к чтению или записи. Синтаксис:

Open ИМЯ_ФАЙЛА For РЕЖИМ [Access ДОСТУП] [БЛОКИРОВКА] As [#]НОМЕР_ФАЙЛА [Len=ДЛИНА]Описание параметров оператора Open приведено в табл. 5.1.

Таблица 5.1. Параметры оператора Open.

Параметр Описание

ИМЯ_ФАЙЛА Обязательный. Строковое выражение, указывающее имя файла; может содержать имя каталога или папки и имя диска.

РЕЖИМ Обязательный. Ключевое слово, указывающее режим открытия файла: Append, Binary, Input, Output или Random. По умолчанию, файл открывается для доступа в режиме Random.

ДОСТУП Необязательный. Ключевое слово, указывающее операции,

38

разрешенные с открытым файлом: Read, Write или Read Write.

БЛОКИРОВКА Необязательный. Ключевое слово, указывающее операции, разрешенные с открытым файлом другим процессам: Shared, Lock Read, Lock Write и Lock Read Write.

НОМЕ_ФАЙЛА Обязательный. Допустимый номер файла в интервале от 1 до 511 включительно. Для определения следующего свободного номера файла следует использовать функцию FreeFile.

ДЛИНА Необязательный. Число, меньшее либо равное 32 767 (байт). Для файлов, открытых в режиме Random, это значение является длиной записи. Для файлов с последовательным доступом это значение является числом буферизуемых символов.

В VBA обеспечивается три типа доступа к файлам:· последовательный доступ (режимы Input, Output и Append), обычно

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

· произвольный доступ (режим Random), используемый при необходимости считать и записать данные в файл без его закрытия. Файлы произвольного доступа содержат данные в виде записей, которые упрощают и ускоряют поиск нужных сведений;

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

Инструкцию Open не следует использовать для доступа к собственным типам файлов приложений. Например, не следует использовать Open для доступа к документу Word, к электронной таблице Microsoft Excel или к базе данных Microsoft Access, поскольку это вызовет потерю целостности и порчу файла.

Если аргумент ИМЯ_ФАЙЛА описывает несуществующий файл, такой файл будет создан при открытии в режиме Append, Binary, Output или Random. Если файл уже открыт другим процессом и указанный режим доступа не разрешен, инструкция Open не будет выполнена и возникнет ошибка. В режимах Binary, Input и Random можно еще раз открыть уже открытый файл под другим номером, не закрывая его. В режиме Append и Output необходимо закрыть файл, чтобы

39

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

режиме Output (при этом данные, имеющиеся в файле, стираются) или Append (новые данные добавляются в конец файла). Для чтения данных из последовательного файла следует открыть его в режиме Input.

После завершения работы с файлом его следует закрыть оператором Close.Close [#]НОМЕР_ФАЙЛАНиже приведен фрагмент программы, который создает в папке C:\Data файл

последовательного доступа test.txt для вывода данных:Dim FileNo As Integer‘Получить уникальный файловый номерFileNo = FreeFileOpen “C:\Data\test.txt” For Output As FileNo БЛОК_ОПЕРАТОРОВClose FileNoВ таблице 5.2 приведены операторы, обычно используемые для записи

данных в файлы и для чтения данных из файлов.

Таблица 5.2. Операторы считывания и записи данных в файлы.

Тип доступа Запись данных Чтение данных

Последовательный Print #, Write # Input #Произвольный Put GetДвоичный Put Get

Оператор Print # записывает отформатированные данные в файл с последовательным доступом. Синтаксис:

Print # НОМЕР_ФАЙЛА[, СПИСОК_ВЫВОДА]НОМЕР_ФАЙЛА является обязательным параметром. СПИСОК_ВЫВОДА

необязательный параметр и состоит из выражения или списка выражений, которые следует вывести в файл. Ниже приведены допустимые значения аргумента СПИСОК_ВЫВОДА и их описание (табл. 5.3.):

[{Spc(n) | Tab[(n)]}] [ВЫРАЖЕНИЕ] [ПОЗИЦИЯ]Таблица 5.3. Описание элементов списка вывода.

40

Значение Описание

Spc(n) Используется для вставки пробелов в файл; здесь n число пробелов, которые следует вставить.

Tab(n) Устанавливает курсор в столбец с указанным номером; здесь n номер столбца. Tab без аргумента устанавливает курсор в начало следующей зоны вывода.

ВЫРАЖЕНИЕ Числовые выражения или строковые выражения, которые следует вывести.

ПОЗИЦИЯ Указывает позицию, в которой следует вывести следующий символ. Для установки курсора сразу после последнего выведенного символа используйте точку с запятой. Для установки курсора в столбец с указанным номером используйте Tab(n). Для установки курсора в начало следующей зоны вывода используйте Tab без аргумента. Если аргумент позиция опущен, следующий символ выводится на следующей строке.

Если параметр СПИСОК_ВЫВОДА опущен, после параметра НОМЕР_ФАЙЛА идет только разделитель списка, в файл печатается пустая строка. Для разделения выражений можно использовать пробелы или точки с запятой, которые в данной ситуации полностью эквивалентны.

Данные, записанные с помощью оператора Print #, обычно считываются из файла с помощью операторов Line Input # или Input. Для записи в файл данных, который в будущем планируется читать с помощью оператора Input #, следует вместо оператора Print # использовать оператор Write #, который имеет аналогичный синтаксис. Использование оператора Write # гарантирует, что записанные данные будут корректно разделены, что позволит прочитать их с помощью оператора Input #.

Оператор Input # читает данные из открытого последовательного файла и присваивает их переменным. Синтаксис:

Input # НОМЕР_ФАЙЛА, СПИСОК_ПЕРЕМЕННЫХСПИСОК_ПЕРЕМЕННЫХ – это разделяемый запятыми список

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

41

Данные, считываемые с помощью инструкции Input #, обычно записываются в файл с помощью инструкции Write #. Эта инструкция применима только к файлам, открытым в режиме Input или Binary. После считывания стандартные строки и числовые данные присваиваются переменным без изменения.

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

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

EOF ([#]НОМЕР_ФАЙЛА)Ниже приведен фрагмент программы, в котором в массив строк загружается

содержимое файла C:\Data\test.txt до полного его исчерпания:Dim FileNo As Integer‘Описание динамического массива GetValues строкового типаDim GetValues() As StringDim i As Integer‘Инициализация счетчика ii = 0FileNo = FreeFileOpen “C:\Data\test.txt” For Input As FileNo ’Выполнение цикла пока не достигнут конец файла Do Until EOF(FileNo) i = i +1 ‘Переопределение массива GetValues размерности i с сохранением ранее ‘ присвоенных значений ReDim Preserve GetValues(i) Input #FileNo, GetValues(i) LoopClose FileNo

42

ЗАКЛЮЧЕНИЕ

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

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

Цель практикума: скорейшее привлечение учащегося к самостоятельному и осмысленному

составлению законченных программ; привитие основных навыков алгоритмической и программистской

грамотности: ясного и понятного стиля; надёжности решений; экономии вычислений; организации переборов и т.д.

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

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

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

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

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

на этом этапе детально изучается и уточняется условие задачи; выявление исходных данных и результатов; уточняются типы данных; даются имена переменным;

43

продумываются формы представления и выдачи результатов. Приводимые способы и программы решения задач по возможности

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

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

Авторы будут благодарны читателям за замечания, новые решения и интересные задачи, которые можно направлять как в адрес кафедры "Вычислительной математики и программирования" ФВТИ ДонГТУ, так и по E-mail: sha maev @ pop . dgtu . donetsk . ua .

СПИСОК ЛИТЕРАТУРЫ

1. Брайан Сайлер, Джефф Споттс Использование VISUAL BASIC 6. Специальное издание // Вильямс, 1999, 832с.2. Браун С. VISUAL BASIC 6: Учебный Курс // Питер, 1999, 688с.3. Visual Basic 6: Полное Руководство // BHV - Санкт - Петербург, 1999, 992с.4. Грэг Перри, Санжайа Хеттихева Освой смостоятельно Visual Basic 6 за 24 часа // Бином, 1999,384с.5. Евангелос Петрусос Visual Basic 6 Руководство разработчика. Том 1 //Издательский Дом "Вильямс", 1999, 560с. 6. Евангелос Петрусос Visual Basic 6 Руководство разработчика. Том 2 //Издательский Дом "Вильямс", 1999, 586с. 7. Брюс Мак-Кинни . Крепкий орешек Visual Basic. // Русская редакция, 1999, 632с.

44

8. П. В. Румянцев Азбука программирования в Win32 API // Радио и связь, 1999, 272с.9. М. Ченнел Разработка приложений на Microsoft Visual Basic 6.0 // Трейдинг Лимитед, 2000, 400с. 10.А. Гарнаев. Самоучитель VBA. Технология создания пользовательских приложений // BHV - Санкт - Петербург, 1999, 512 с.11.Кен Гетц, Майк Джилберт Программирование в Microsoft Office. Руководство по Visual Basic for Applications //BHV, 2000, 384с.12.http://vbrussian.com/ 13.Кен Гетц, Майк Джилберт Программирование в Microsoft Office. Полное руководство по VBA //BHV, 1999, 768с.14.Microsoft Press . Руководство программиста по Visual Basic для MS Office 97 // Русская редакция, 1997, 544с.15.Deborah Kurata. Doing Objects in Microsoft Visual Basic 6 // 1999, 642р.

45