2 Проект VBA

advertisement
3
СОДЕРЖАНИЕ
1 Введение ......................................................................................... 6
2 Проект VBA ................................................................................... 8
3 Типы данных и переменные ....................................................... 10
3.1 Типы данных в VBA ............................................................ 10
3.2 Объявление простых переменных ...................................... 12
3.3 Объявление констант ........................................................... 14
3.4 Массивы ................................................................................ 14
3.5 Записи и тип, определенный пользователем ..................... 16
4 Операции и встроенные функции .............................................. 19
4.1 Выражение. Правила построения выражений в VBA ............ 19
4.2 Функции обработки числовых данных .............................. 21
4.3 Обработка строковых данных ............................................. 22
4.4 Работа с датами и временем ................................................ 24
5 Операторы .................................................................................... 29
5.1 Операторы как основа.......................................................... 29
5.2 Оператор комментария ........................................................ 30
5.3 Присваивание ....................................................................... 31
5.4 Управляющие операторы .................................................... 35
5.5 Работа с файлами и папками ............................................... 48
5.6 Прочие операторы ................................................................ 57
6 Процедуры и функции ................................................................ 61
6.1 Классификация процедур .................................................... 61
6.2 Синтаксис процедур и функций ......................................... 62
7 Диалоговый ввод/вывод информации ....................................... 65
8 Интегрированная среда VBA ..................................................... 69
8.1 Окно редактирования проекта ............................................ 69
8.2 Окно редактирования форм UserForm ............................... 72
8.2.1 Создание формы............................................................ 72
8.2.2 Размещение элементов управления в форме .............. 73
8.2.2.1 Поле (TextBox) ....................................................... 74
8.2.2.2 Надпись (Label) ...................................................... 76
8.2.2.3 Кнопка (CommandButton) ..................................... 77
8.2.2.4 Список (ListBox) .................................................... 79
8.2.2.5 Поле со списком (ComboBox) .............................. 81
8.2.2.6 Флажок (CheckBox) ............................................... 82
8.2.2.7 Переключатель (OptionButton) ............................. 83
4
8.2.2.8 Рамка (Frame) ......................................................... 84
8.2.2.9 Счетчик (SpinButton) ............................................. 84
8.2.2.10 Выключатель (ToggleButton) .............................. 85
8.2.3 Пример: инициализация значений элементов
управления .................................................................... 87
8.2.4 Отображение диалоговых окон ................................... 88
8.2.5 Пример: проверка условий на значение полученных
данных из формы .......................................................... 88
9 Объекты. Классы. Методы и свойства объектов ...................... 91
9.1 Объекты и классы................................................................. 91
9.2 Объекты OLE и ActiveX ...................................................... 92
9.3 Иерархия объектов ............................................................... 92
9.4 Методы .................................................................................. 93
9.5 Свойства ................................................................................ 94
9.6 Событие................................................................................. 94
10 Автоматизация работы в Word с помощью VBA ................... 96
10.1 Программирование на макроязыке Visual Basic для
приложений ........................................................................ 96
10.2 Автоматическое создание макросов ................................. 96
10.3 Просмотр и корректировка и удаление макросов............... 97
10.4 Создание макросов в редакторе VBA .............................. 98
10.5 Добавление модуля VBA в шаблон ................................ 101
10.6 Какие файлы присоединены к шаблону? ....................... 103
10.7 Автоматизация решения типичных задач ...................... 104
10.7.1 Отображение диалогового окна при запуске ......... 104
10.7.2 Выделение слов предметного указателя ................. 104
10.7.3 Выбор принтера ........................................................ 107
11 Автоматизация работы в Excel с помощью VBA ................. 112
11.1 Модель объектов Excel .................................................... 112
11.2 Использование объекта Application ................................ 112
11.3 Использование свойств объекта Application.................. 112
11.4 Использование методов объекта Application ................. 118
11.6 Использование семейства Workbooks и объекта
Workbook .......................................................................... 128
11.6.1 Использование свойств и методов семейства
Workbooks ................................................................... 129
11.6.2 Использование свойств объекта Workbook ............ 133
11.6.3 Методы объекта Workbook ...................................... 134
5
11.6.4 Использование событий объекта Workbook ........... 137
11.7 Использование семейства Worksheets ............................ 142
11.7.1 Использование свойства Count семейства
Worksheets ................................................................... 143
11.7.2 Использование метода Add семейства Worksheets .. 143
11.8 Использование объекта Worksheet, его свойств
и методов .......................................................................... 144
11.9 Использование объекта Range ........................................ 146
11.9.1 Использование свойств объекта Range ................... 146
11.9.2 Использование методов объекта Range .................. 150
11.9.3 Примеры использования объектов Range ............... 153
11.10 Создание собственных функций рабочего листа ........ 154
11.10.1 Описание собственных функций рабочего листа 154
11.10.2 Разработка собственных функций рабочего листа . 155
Методические указания по выполнению курсовой работы по
дисциплине «Компьютерная подготовка» ................................. 157
Контрольная работа № 1 .............................................................. 166
Контрольная работа №2 ............................................................... 175
Список рекомендуемой литературы ........................................... 181
6
1 ВВЕДЕНИЕ
Microsoft Office – это среда, в которой решение многих задач не требует знания программирования. В то же время, создатели пакета Microsoft Office предусмотрели прекрасную возможность для пользователя – возможность самому конструировать профессиональные приложения, работающие в любом из
компонентов пакета Microsoft Office. Это существенно расширило возможности применения пакета Microsoft Office в различных сферах деятельности и бизнеса. Для создания собственных
приложений пользователю предоставлен программный инструментарий, встроенный в пакет Office – редактор языка Visual
Basic for Applications (VBA). Встроенный язык открывает дорогу достаточно новому направлению в современном программировании – офисному программированию.
VBA является одним из самых популярных языков программирования, прост в освоении и позволяет быстро получить
ощутимые результаты. VBA применяет технологию визуального
программирования, позволяющую наглядно конструировать
экранные формы и управляющие элементы, а также запись всей
программы или ее частей при помощи средства MacroRecorder
(автоматическая запись макроса). Довольно часто при решении
простейших задач достаточно средств визуального программирования. Но если требуется создать более сложное приложение
с содержательной обработкой данных, то на первый план выступает сам язык программирования VBA.
Цель курса «Компьютерная подготовка» – изучение основ
программирования в среде VBA, создание собственных приложений, работающих в Word и Excel.
В рамках дисциплины «Компьютерная подготовка» предусмотрено:
1) самостоятельное изучение всех тем курса на основе
учебного пособия и рекомендуемой литературы;
2) обязательное выполнение двух контрольных работ;
3) сдача экзамена;
4) выполнение курсовой работы;
5) консультации преподавателя через центр дистанционного
образования.
7
Данное учебное методическое пособие содержит теоретический материал дисциплины. Рассматриваются основные элементы
языка программирования VBA (переменные, константы, операторы, объекты языка, макросы, элементы управления, формы).
8
2 ПРОЕКТ VBA
VBA относится к языкам объектно-ориентированного программирования. Чтобы начать писать программы на VBA, необходимо знать элементы языка, инструкции, их синтаксис и правила составления кода, объекты и их иерархию. Код VBA хранится в проектах. Рассмотрим элементы, которые могут входить
в состав проекта.
Процедуры. Процедура представляет собой поименованную
последовательность совместно выполняемых инструкций (операторов). Существуют процедуры типа Sub, Function и Property.
Имя процедуры всегда определяется на уровне модуля.
Процедура Sub (подпрограмма) представляет собой набор
команд, с помощью которого можно решить определенную задачу. При запуске процедуры выполняются ее команды, затем
управление передается в вызвавшее данную процедуру приложение или процедуру. В процедурах типа Sub обычно содержится большинство исполняемых программ.
Процедура Function (функция) отличается от предыдущего
типа процедур тем, что обязательно возвращает одно результирующее значение. Функции обычно используют для вычисления
численного значения, получения символьной строки в результате операций над текстом или для определения логического значения.
Процедура Property (свойство) применяется для ссылки на
свойство объекта. В частности, этот тип процедур используется
для задания или определения значений пользовательских форм
и модулей.
Модули. В состав проекта можно включать модули кода
(или просто модули). Модули служат для размещения в них
процедур. Число модулей в составе проекта может определяться в зависимости от сложности проекта. Внутрь одного модуля
имеет смысл помещать процедуры, обеспечивающие решение
одной прикладной задачи.
Макросы представляют собой подпрограммы (процедуры
типа Sub), не имеющие параметров и размещаемые в модуле.
Макросы, создаваемые путем протоколирования действий пользователя, размещаются в модуле New Macros.
9
Модули класса служат для размещения в них описания
объектов, создаваемых в VBA. Каждый модуль класса содержит
описание одного типа объекта.
Формы позволяют решить задачу организации ввода и вывода данных. В среде VBA можно разрабатывать формы, а также процедуры обработки событий, возникающих в этих формах.
10
3 ТИПЫ ДАННЫХ И ПЕРЕМЕННЫЕ
3.1 Типы данных в VBA
Любая программа выполняет обработку данных, которые
размещаются в памяти, используя переменные или константы.
Переменная представляет собой поименованный участок оперативной памяти, содержимое которого может изменяться при работе с приложением. Константа определяет неизменяемые данные программы.
Как переменная, так и константа характеризуются следующими элементами: именем, типом, областью видимости – областью, где имя переменной видимо и, значит, возможен доступ к
ее значению. При задании имен переменных нужно соблюдать
следующие правила:
 имена должны начинаться с буквы;
 имя не должно содержать пробел, точку, восклицательный знак и символы @, &, $, #;
 имя должно включать не более 255 символов;
 не рекомендуется задавать имена, совпадающие с ключевыми словами VBA;
 имя каждой переменной должно быть уникальным.
Определение типа данных задает:
 область возможных значений;
 структуру организации данных;
 операции, определенные над данными этого типа.
В VBA поддерживается определенная классификация типов
данных.
Простые и сложные типы данных. Простые типы данных
(табл. 3.1) могут принимать единственное значение. Сложные
типы данных могут принимать множества значений данных в
текущий момент работы программы.
Встроенные и определенные пользователем типы данных.
Встроенные типы данных изначально принадлежат языку программирования и составляют его базис. На основе встроенных
типов программист может строить собственные, им определенные типы данных, следуя определенным правилам.
11
Статические и динамические типы данных. Для данных
статического типа память отводится в момент объявления – требуемый размер данных известен в момент объявления. Для данных динамического типа размер данных в момент объявления не
известен, и память им выделяется в процессе выполнения программы.
Таблица 3.1  Простые типы данных языка VBA
Имя
типа
Boolean
Byte
Integer
Long
Decimal
Single
Double
Currency
String
Date
Object
Возможные значения
True, False
0..255
-32768…+32767
Примерно -2 000 000 000 …+ 2 000 000 000
Примерно 30 десятичных цифр;
можно указать число цифр после десятичной
запятой
-3,4Е38…-1,4Е-45 для отрицательных значений;
1,4Е–45…3,4Е38 для положительных значений
1,7Е308…-4,9Е-324 для отрицательных значений;
4,9Е-324…1,7Е308 для положительных значений
Десятичные числа с фиксированной позицией запятой. Возможны 15 цифр до запятой и
4 после
Есть два вида строк:
 строки фиксированной длины имеют до
216 символов;
 строки переменной длины имеют до 231
символов
Даты изменяются в диапазоне от 1 января
100 г. до 31 декабря 9999 года
Ссылка на объект (указатель)
Требуемая
память
2 байта
1 байт
2 байта
4 байта
12 байтов
4 байта
8 байтов
8 байтов
10 байтов
+1 байт на
символ в
обычной
кодировке
и 2 байта в
кодировке
Unicode
8 байтов
4 байта
12
Продолжение табл. 3.1
Имя
типа
Variant
Возможные значения
Универсальный тип, значением которого
могут быть данные любого из перечисленных выше типов, объекты, значения NULL и
значения ошибок ERROR.
Требуемая
память
Зависит от
контекста,
но не менее 16 байтов
3.2 Объявление простых переменных
Объявление переменных можно осуществлять на двух
уровнях – уровне процедуры и уровне модуля. Для объявления
переменных используют операторы Dim, Public, Private и Static.
Оператор Dim можно использовать на обоих уровнях, Public,
Private – на уровне модуля, Static – только на уровне процедуры.
Переменные, объявленные на уровне процедуры, называются локальными по отношению к ней, то есть они видны только в данной процедуре. Переменные уровня модуля являются
глобальными. Область видимости глобальных переменных может распространяться:
 на все процедуры модуля, в котором они объявлены. Такие глобальные переменные, называемые закрытыми (Private),
должны быть объявлены на уровне модуля: либо оператором
Private, либо оператором Dim;
 на весь программный проект – все процедуры всех модулей данного проекта. Такие глобальные переменные, называемые открытыми (Public), должны быть объявлены оператором
Public.
Локальные переменные уровня процедуры могут быть объявлены оператором Static, что делает их статическими. Статические переменные характеризуются тем, что при выходе из процедуры их значения сохраняются, в отличие от обычных локальных переменных. Просто данные значения становятся временно недоступными до тех пор, пока процедура не будет вызвана вновь. При использовании статических переменных необходима их первоначальная инициализация. VBA инициализирует переменные при их объявлении следующими значениями:
13
 0 – для числовых значений;
 пустая строка («») – для строк переменной длины;
 строка, содержащая нули, – для строк фиксированной
длины;
 Empty (значение, указывающее на отсутствие инициализации) – для типа Variant;
 для массивов и записей (типа, определенного пользователем) каждый элемент инициализируется в соответствии с указанными правилами.
Объявление простых переменных имеет следующий синтаксис:
{Dim | Public | Private | Static} <имя переменной> [As <имя типа>]
[,<имя переменной> [As <имя типа>]]
Каждое объявление переменной связывает имя переменной
с ее типом, заданным конструкцией As. Если после имени переменной отсутствует указанная конструкция, то переменной будет присвоен тип Variant. Отметим также, что переменные типа
Decimal объявляются с использованием функции CDec.
Приведем пример описания переменных:
Public Const pi As Double = 3.1415926 ' Глобальная переменная
Public Sub MY_Prnt()
' Локальные переменные
Dim
B As Byte,
I As Integer,
L As Long
Dim
Sng As Single, D As Double,
C As Currency
Dim
Sf As String,
Sv As String,
Dat As Date
Dim
O As Object,
V
Debug.Print "Sng=", Sng, "D=", D, "C=", C
Debug.Print "B=", B, "I=", I, "L=", L
Debug.Print "Sf=", Sf, "Dat=", Dat, "Sv=", Sv
If O Is Nothing Then Debug.Print "Объект не определен"
If V = Empty Then Debug.Print "Variant переменные не инициализированы"
End Sub
Результат отладочной печати после запуска на исполнение
данной процедуры выглядит следующим образом:
14
Sng = 0
D=0
C=0
B =0
I =0
L=0
Sf =
Dat = 0:00:00
Sv=
Объект не определен.
Variant переменные не инициализированы.
3.3 Объявление констант
Синтаксис объявления констант:
[Public | Private] Const <имя константы> [As type] = <константное выражение>
Пример объявления константы:
Public Const pi As Double = 3.1415926
Как и переменные, именованные константы можно объявлять на уровне процедуры или модуля. В первом случае используется только ключевое слово Const, во втором – дополнительно
можно задать спецификаторы Public или Private. По умолчанию
глобальные константы имеют статус Private.
3.4 Массивы
Массив – это самый распространенный структурный тип
данных. Массив представляет собой упорядоченную совокупность данных одного типа. Порядок элементов задается индексами, то есть порядковыми номерами элементов в соответствующей структуре. В VBA массивы могут одномерными и многомерными. Допустимое число измерений около 60.
При описании массивов к уже знакомой структуре описания
переменных добавляется необходимость указания размерности:
{ Dim | Public | Private | Static} <имя переменной> (<список размерностей>) [As <имя типа>]
Каждое измерение в списке отделяется запятой и определяется заданием верхней и нижней границы изменения индексов.
Массивы – это структуры с прямым доступом к элементам. Доступ осуществляется посредством указания имени массива и
15
индекса элемента. Индекс элемента прописывается в круглых
скобках.
Приведем пример:
Public Sub MyArray()
Const LowBound As Integer = –5, HighBound As Integer = 5
Dim MyArr(LowBound To HighBound) As Byte
Dim I As Integer
Debug.Print "Элементы массива MyArr:"
For I = LowBound To HighBound
MyArr(I) = I + 6
Debug.Print MyArr(I)
Next I
End Sub
При исполнении данной процедуры будут напечатаны числа от 1 до 11.
Рассмотренный пример показывает работу со статическим
массивом. Количество элементов такого массива определено в
момент объявления его в программе. VBA имеет мощное средство работы с массивами – динамические массивы. Массив считается динамическим, если при первоначальном объявлении не
указывается его размерность, но в последующем она может
быть определена и переопределена оператором ReDim. Размерность определяется динамически в той процедуре и в тот момент, когда она становится фактически известной. При этом
границы изменения индексов можно задавать не только как константы, но и как выражения, зависимые от переменных. Если же
при переопределении массива задать ключевое слово Preserve,
можно сохранить все ранее полученные значения элементов и
расширить массив, добавив новые элементы.
Приведем пример работы с динамическим массивом:
'Объявление динамического массива на уровне модуля
Public Vector() As Integer
Public Sub DinArray()
'Определяется фактическая размерность массива Vector
Dim N As Byte, I As Byte
N = InputBox("Введите число элементов вектора")
16
ReDim Vector(1 To N)
For I = 1 To N
Vector(I) = 2 * I + 1
Next I
' Массив расширяется с сохранением ранее вычисленных элементов
ReDim Preserve Vector(1 To 2 * N + 1)
For I = N + 1 To 2 * N + 1
Vector(I) = 2 * I
Next I
'А теперь печать
Debug.Print "Элементы Vector:" & Chr(13)
For I = 1 To N * 2 + 1
Debug.Print Vector(I)
Next I
End Sub
При исполнении данной процедуры будет выдан запрос на
определение количества элементов массива, затем печать выведенных значений. Например, если ввести число 10, то вначале
будут напечатаны нечетные числа от 3 до 21, а затем четные от
22 до 42.
3.5 Записи и тип, определенный пользователем
Запись относится к сложным типам данных, который конструируется, как и массив, объединением совокупности данных
простых типов. В отличие от массива, запись представляет собой объединение элементов, каждый из которых может иметь
свой тип. Элементы записи называют ее полями. Запись хорошо
ассоциируется с таблицей. В этом случае имена полей записи
соответствуют наименованиям столбцов таблицы, а значения
элементов записи – значениям соответствующих ячеек какойлибо строки таблицы.
Формально в VBA отсутствует понятие «запись». Чтобы
обеспечить работу с записями, в VBA предусмотрены средства
для определения пользовательского типа. Таким образом, записи в VBA называются типом, определенным пользователем.
Синтаксис такого определения определен следующим образом:
17
[Private | Public] Type <имя типа>
<имя элемента> [([<размерность массива>])] As <тип элемента>
[<имя элемента> [([<размерность массива>])] As <тип элемента>]
End Type
Определение типа дается на уровне модуля, и если оно является закрытым (Private), то оно распространяется на один модуль, а для общих (Public) типов – на все.
Приведем пример определения типа и его использования:
Type Fam 'Определение структуры записи из двух полей
FirstName As String
LastName As String
End Type
Type Person
Fio As Fam
Birthdate As Date
End Type
Public Sub UserType()
Объявление переменных типа запись
Dim Petrov As Person
Dim Mamontov As Person
'Присваиваются значения полям соответствующих записей
Petrov.Fio.FirstName = "Петр"
Petrov.Fio.LastName = "Петров"
Petrov.Birthdate = #1/23/1961#
Mamontov.Fio.FirstName = Petrov.Fio.FirstName
Mamontov.Fio.LastName = "Мамонтов"
Mamontov.Birthdate = #7/21/1966#
'А теперь просмотр результата в окне вывода
MsgBox (Petrov.Fio.FirstName & " " & Petrov.Fio.LastName &
" родился " & Petrov.Birthdate)
MsgBox (Mamontov.Fio.FirstName & " " & Mamontov.Fio.LastName & " родился " & Mamontov.Birthdate)
End Sub
18
Как видно из представленного фрагмента программы, определенный пользователем тип используется при описании программных переменных так же, как и стандартные типы. Здесь
же показан принцип работы с записями. Записи обрабатываются
поэлементно. Для доступа к элементу записи используется составное имя, которое состоит из имени записи и имени соответствующего поля или полей. Соответствующие имена разделяются знаком точка. Другая форма обращения к элементу записи
предполагает использование оператора присоединения (With ….
End With). Рассмотрим на примере принцип кодирования данной инструкции языка VBA.
With Mamontov
.Fio.FirstName = Petrov.Fio.FirstName
.Fio.LastName = "Мамонтов"
.Birthdate = #7/21/1966#
End With
Над элементами записи можно выполнять все операции, которые допустимы над данными соответствующего типа. В целом над записью можно выполнять только операцию присвоения, например, Petrov = Mamontov.
19
4 ОПЕРАЦИИ И ВСТРОЕННЫЕ ФУНКЦИИ
4.1 Выражение. Правила построения выражений в VBA
В основе программирования на любом алгоритмическом
языке лежит построение выражений. Выражение строится из
переменных, констант, встроенных функций с использованием
знаков, операций и скобок. Запись выражения задает правило
вычисления его значения и типа.
Перечислим основные операции, которые можно использовать в VBA при построении выражений (табл. 4.1).
Приоритет
Таблица 4.1  Операции и их приоритет
Арифметические
Сравнения Логические
1
Возведение в степень (^)
Равенство
(=)
Отрицание
(Not)
2
Унарный минус (–)
Неравенство (<>)
3
Умножение, деление (*, /)
Меньше (<)
4
Деление нацело (\)
Больше (>)
Конъюнкция
(And)
Дизъюнкция
(Or)
Исключительное ИЛИ
(Xor)
Описание
некоторых
операций
При возведении в
степень основание и показатель
могут быть
арифметическими выражениями
любого типа.
Результат имеет
тип Double
Деление нацело
определено над
целочисленными
данными (применимо и к
20
Приоритет
Продолжение табл. 4.1
Арифметические
Сравнения Логические
5
Остаток от деления нацело (mod)
Меньше
или равно
(<=)
Эквивалентность
(Eqv)
6
Сложение,
вычитание (+, –)
Больше или
равно (>=)
Импликация
(Imp)
7
Конкатенация
строк (&)
Подобия
(Like),
равенство
ссылок (Is)
Описание
некоторых
операций
вещественным
данным) и дает
результат целого
типа. Исключительное ИЛИ
требует, чтобы
один из операндов имел значение, отличное от
True
Операция mod
определена над
данными целого
типа и возвращает результат целого типа
Среди логических операций
определена операция следования
(импликация),
ложная в единственном случае
– когда посылка
истинна, а заключение ложно
Операция Like
проверяет соответствие строки
образцу. Операция Is, определенная над объектами, не проверяет равенство
21
Приоритет
Окончание табл. 4.1
Арифметические
Сравнения Логические
Описание
некоторых
операций
самих объектов,
она проверяет
совпадение ссылок. Ссылки
должны задавать
один и тот же
объект
При построении выражений необходимо учитывать следующее:
 если выражение содержит операции разных категорий,
то первыми выполняются арифметические операции, затем операции сравнения, и последними – логические;
 все операции сравнения имеют один и тот же приоритет.
Арифметические и логические операции выполняются в соответствии с указанным приоритетом;
 одна и та же операция, записанная несколько раз подряд,
или операции одного приоритета выполняются слева направо –
из двух операций первой выполняется та, которая стоит левее в
записи выражения;
 скобки позволяют изменить указанный порядок вычисления выражения, поскольку выражения в скобках имеют
наивысший приоритет и вычисляются первыми. Внутри скобок
действует обычный порядок следования;
 операция конкатенации не является арифметической, но
при ее появлении в выражении она выполняется после всех арифметических операций, но до вычисления операций сравнения.
4.2 Функции обработки числовых данных
Помимо вышеуказанных операций VBA предоставляет
набор математических функций, расширяющий возможности
обработки числовых данных. Перечислим базовые функции:
22
 Abs(число) – абсолютное значение числа;
 Atn(число) – арктангенс (в радианах) аргумента, задающего тангенс угла;
 Cos(число) – косинус угла. Аргумент число задает угол
в радианах;
 Sin(число) – синус угла;
 Exp(число) – экспонента, т.е. результат возведения в
степень числа е;
 Log(число) – натуральный логарифм числа;
 Rnd[(число)] – результат представляет число, равномерно распределенное случайное число в интервале [0–1]. Если аргумент число не задан или больше нуля, то порождается очередное случайное число. Если он равен 0, то результатом будет
предыдущее случайное число, а если число меньше нуля, то
каждый раз порождается одно и то же число, определяемое аргументом. Перед тем, как получить последовательность случайных чисел, необходимо вызвать функцию Randomize для
инициализации последовательности;
 Sng(число) – знак числа (если число больше нуля – 1,
равно нулю – 0, меньше нуля – –1);
 Sqr(число) – квадратный корень;
 Tan(число) – тангенс угла.
4.3 Обработка строковых данных
Операции над строками
Над строковыми переменными, определенными в проектах
VBA, допустимо выполнение двух видов операций: сравнения и
конкатенации строк.
Операция конкатенации используется для сцепления двух
или нескольких строк. Обозначается данная операция знаком
«+» либо знаком «&». В случае, если применяется первый знак,
то в качестве аргументов выражения, определяющего операцию
конкатенации, должны выступать переменные или константы
строкового типа. В случае применения второго знака (&) – один
23
из аргументов может быть переменной или константой типа
число или дата. Например:
Dim stroka As String
Dim Ver As Single
Ver = 1
stroka = "Компьютерная " + "подготовка " + " часть " & Ver
MsgBox (stroka)
При сравнении строк применимы обычные операции сравнения. При этом сравнение может быть осуществлено в соответствии с расположением строк в словаре либо побитно. Второй
тип сравнения обладает чувствительностью к регистру. Чтобы
определить тип сравнения, необходимо в начале модуля поместить инструкцию Option Compare Text | Binary.
Сравнение строк с образцом осуществляется с использованием операции Like. При задании образца используются специальные символы (табл. 4.2), позволяющие разнообразить операцию сравнения.
Таблица 4.2  Специальные символы, используемые при задании шаблона
Символы
*
Интерпретация
Любой текст – произвольное число
?
Один любой символ
#
Любая цифра от 0
до 9
[множество символов]
Любой символ,
принадлежащий
множеству
[!множество символов]
Любой не принадлежащий множеству символ
Примеры
Шаблону Agent* соответствуют
все тексты, начинающиеся со
слова Agent. Строки Agent007 и
Agent Майор Пронин удовлетворяют шаблону
Шаблону К?к удовлетворяют
строки Кок и Кук
Шаблону Agent### соответствует
1000 различных строк, среди которых и Agent007
Задать множество можно с помощью перечисления и интервалов.
Шаблону К[аоу]к удовлетворяют
слова «Как», «Кок», «Кук»
Шаблону [!а–я] удовлетворяет
символ, не являющийся буквой
русского алфавита
24
Основные функции обработки строковых переменных
Функция Len(string) возвращает длину строки (число символов), которая задана аргументом String.
Функция InStr определяет позицию первого вхождения одной строки внутри другой строки. Синтаксис:
InStr([start,]string1, string2[, compare])
Необязательный аргумент start задает позицию, с которой
начинается поиск (по умолчанию – с первого символа строки).
String1 – строка, в которой осуществляется поиск, string2 – подстрока, вхождение которой ищется. Необязательный аргумент
compare указывает способ сравнения строк. Его значение по
умолчанию 0 используется для выполнения двоичного сравнения; 1 задает посимвольное сравнение без учета регистра.
Функция Left(string, length) выделяет в строке string указанное число length символов слева.
Функция Rigth(string, length) выделяет в строке string указанное число length символов справа.
Функция Mid(string, start[, length]) позволяет выделить из
строки string подстроку длины length, начиная с позиции start.
Функции Ltrim(string), Rtrim(length), Trim(length) возвращают копию строки, из которой удалены пробелы, находящиеся в начале строки, в конце строки или в начале и в конце
строки соответственно.
Функции Lcase(string), UCase(string) возвращают копию
строки, символы которой приведены к нижнему или к верхнему
регистру.
4.4 Работа с датами и временем
Для того чтобы обеспечить программисту возможность
корректно работать с датами и временем, VBA предоставляет
специальный тип Date, хранящий дату и время. Представление
дат занимает 4 байта памяти. Целая часть хранит число дней от
начальной даты, а дробная часть хранит время от полуночи.
Начальной датой является 30 декабря 1899 года. При работе с
25
данными значениями чаще всего используются специальные
встроенные функции.
Присваивание значений
При присваивании значений типа Date следует заключать
дату в специальные ограничители "#" или задавать ее как строковую константу. При задании даты в ограничителях, например
#9, May, 99#, она автоматически преобразуется в стандартную
форму #5/9/99#.
Пример работы с датами:
Public Sub WorkWithDates()
Dim dat1 As Date, dat2 As Date, dat3 As Date
dat1 = 12
dat2 = 9 / 5 / 99
dat3 = #9/5/99#
Debug.Print dat1, dat2, dat3
dat1 = "15/7/99"
dat2 = #5/9/99#
dat3 = dat3 + 100
Debug.Print dat1, dat2, dat3
If dat3 > dat2 Then
Debug.Print dat3 – dat2
Else
Debug.Print dat2 – dat3
End If
End Sub
Результаты выполнения этой программы:
11.01.1900 0:26:11 05.09.1999
15.07.1999 09.05.1999
14.12.1999
219
В первом операторе данной программы к начальной дате
прибавляется 12 дней, отсюда получается 11 января 1900 года.
Второй оператор вычисляется как обычное арифметическое выражение, так как выражение не заключено в ограничители. Полученное дробное число воспринимается как время от начала
26
суток. Далее программой выполняются операции над датами –
прибавление целого числа дней, сравнение дат и вычитание дат.
Встроенные функции работы над датами
Date возвращает текущую дату.
Time возвращает текущее время по часам компьютера.
Now возращает значение типа Variant(Date), содержащее
текущую дату и время по системному календарю.
DateAdd добавляет и вычитает указанный временной интервал из значения даты:
DatAdd (interval, number, data)
Аргумент interval – строка, указывающая тип добавляемого
временного интервала, number – число временных интервалов,
на которые надо изменить дату, data – дата, к которой добавляется указанный временной интервал. Допустимые значения аргумента interval приведены в таблице 4.3.
DateDiff – определяет время, прошедшее между двумя датами:
DateDiff (interval, date1, date2[, firstdayofweek[, firstweekofyear]] )
Таблица 4.3  Возможные временные интервалы
Значение
yyyy
Q
m
Y
D
w
ww
H
N
S
Описание
Год
Квартал
Месяц
День года
День месяца
День недели
Неделя
Часы
Минуты
Секунды
27
Параметры имеют следующий смысл:
 Interval задает тип временного интервала при вычислении разности между датами date1 и date2 – его возможные
значения те же, что и для функции DateAdd;
 date1 и date2 – две даты, разность между которыми следует вычислить;
 firstdayofweek – константа, указывающая первый день
недели (по умолчанию считается, что неделя начинается с воскресенья);
 firstweekofyear – константа, указывающая первую неделю года (по умолчанию первой неделей считается неделя, содержащая первое января).
DateSerial – вычисляет значение даты типа Variant(Date) по
ее компонентам – году, месяцу, дню:
DateSerial(year, month, day)
Значение каждого аргумента должно лежать в соответствующем диапазоне: 100 – 9999 для года, 1–31 для дней, 1–12 для
месяцев. Можно использовать для аргументов числовые выражения для описания относительной даты.
Примеры:
DateSerial(1977–25, 10–2, 18–1)
Результат: 17.08.1952
DateSerial(Year(Now) – 3, Month(Now) – 2, Day(Now) – 1)
Результат на текущий день, например: 24.11.2000
DateValue переводит аргумент-строку в дату.
DateValue(date)
Примеры тестирования данной функции в окне отладки:
?DateValue("25.04.1997")
25.04.1997
?DateValue("04.25.1997")
25.04.1997
?DateValue("25 апреля 1997")
25.04.1997
?DateValue("25–апр–97")
25.04.1997
28
?DateValue("Апрель, 25, 97")
25.04.1997
?DateValue("25/04/1997")
25.04.1997
?DateValue("25.04")
25.04.2004
Day(date), Month(date), Year(date) по аргументу-дате
определяют номер дня, месяца и года.
Hour(time), Minute(time), Second(time) по аргументу, который является числовым или строковым выражением и представляет время, возвращает соответственно часы, минуты и секунды в значении времени.
TimeSerial(hour, minute, second) вычисляет результат
Variant(Date), содержащий значение времени, соответствующее
указанному часу, минуте, секунде.
TimeValue(time) возвращает значение типа Variant(Date),
содержащее время. Аргумент time задается строковым выражением, представляющем время от 0:00:00 (12:00:00 А.М.) до
23:59:59 (11:59:59 Р.М.)
29
5 ОПЕРАТОРЫ
5.1 Операторы как основа
VBA – операторный язык. Это значит, что его программы
(модули) представляют последовательность операторов. Набор
операторов VBA весьма обширен и не уступает в этом таким
«большим» языкам, как Паскаль и С. Группа декларативных
операторов VBA, служащих для описания объектов, с которыми
работает программа (типов, переменных, констант, объектов
приложений), уже рассмотрена. Операторы второй группы
обеспечивают присвоение и изменение значений этих объектов;
операторы третьей группы управляют ходом вычислений, четвертой – работой с каталогами и файлами и т.д. Часть операторов досталась VBA в наследство от предыдущих версий Бейсика
и без них можно обойтись при написании новых программ.
При записи текста программ для упрощения чтения, отладки и модификации программы удобней каждый оператор располагать в отдельной строке текста. Следуйте правилу: «Один
оператор – одна строка». Но на этой строке разрешается размещать и несколько операторов. В отличие от общепринятого
символа разделения операторов «точка с запятой», в VBA символом разделения двух операторов в одной строке служит двоеточие. Заметьте, некоторые операторы, например оператор If,
могут стоять лишь на первом месте в строке. И по этой причине
каждый оператор, как правило, следует начинать с первой строки. Лишь иногда разумно группу операторов присваивания размещать в одной строке. Чаще возникает другая ситуация – оператор слишком длинный, и его текст не виден полностью на
экране дисплея, что затрудняет чтение и понимание программы.
В этом случае оператор следует продолжить в одной или нескольких строках. Чтобы продолжить (перенести) оператор на
следующую строку, используется пара символов пробелподчеркивание « _». Например,
MyAddress = "дом: " & Number & " улица: " & Street _
& " город: " & City
Перед оператором в строке может стоять метка – последовательность символов, начинающаяся с буквы и кончающаяся
30
двоеточием «:». Метки можно размещать в отдельных строках
перед теми операторами, которые они должны помечать. Они
нужны для операторов перехода типа GoTo, использование которых считается «дурным тоном» в структурном программировании. Но иногда без меток и переходов обойтись трудно – в
частности, при указании входов в обработчике ошибок в некоторых процедурах.
5.2 Оператор комментария
Комментарии на исполнение программы не влияют, но
необходимы как признак «хорошего стиля». Офисные программы используются многократно и не раз модернизируются в процессе жизни. Вы можете сэкономить на комментариях и написать, а затем и отладить небольшой модуль без них. Но уже через неделю никто, в том числе и Вы, не сможет понять его действие и модифицировать нужным образом. Затраченные на это
усилия и время намного превзойдут «экономию». Любая строка
текста программы может заканчиваться комментарием. Комментарий в VBA начинается апострофом (') и включает любой
текст, расположенный в строке правее. Обычно в комментариях
описываются задачи, решаемые модулями; функции, выполняемые процедурами; смысл основных переменных (если он неясен
из имен); алгоритмы работы процедур. Полезно также комментировать операторы вызова внешних данных для данного модуля процедур, объясняя их действия.
Другое применение комментарии находят при отладке программ. Если требуется исключить из программы некоторые операторы (например, вызовы еще не реализованных или сомнительных процедур), то достаточно перед ними поместить апостроф, например, при выполнении последовательности операторов:
x  x  z;
' z  fun ( x, z );
y  y  z.
31
Функция fun для вычисления нового значения z во второй
строке не вызывается и мешает проверить правильность значения y.
В VBA имеется еще один способ выделения комментариев
с помощью ключевого слова Rem. Такой комментарий (в отличие от комментария, начинающегося апострофом) должен отделяться в строке от предыдущего оператора двоеточием:
weight=weight+z : Rem Увеличение веса
value=weight*price 'Новая стоимость
При отладке VBA-программ часто приходится временно
комментировать отдельные участки текста, а иногда и целые
страницы. В этом случае закомментировать или снять комментарии довольно утомительно, и поэтому разумно пользоваться
двумя полезными командами меню Edit: Comment Block и UnComment Block. Они позволят автоматически закомментировать
или снять комментарий с выделенного блока.
5.3 Присваивание
Операторы присваивания – основное средство изменения
состояния программы (значений переменных и свойств объектов). Они уже многократно использовались в примерах в предыдущих разделах. В VBA есть несколько видов операторов присваивания: Let, Lset, Rset и Set.
Оператор Let
С помощью этого оператора происходит «обычное» присвоение значения выражения переменной или свойству.
Его синтаксис:
[Let] переменная = выражение
Ключевое слово Let, как правило, опускается. Переменная
является именем переменной или свойства; выражение задает
значение, присваиваемое переменной. Его тип должен соответствовать типу переменной. Нарушение этого условия, например,
при попытке присвоить числовой переменной строковое значе-
32
ние, приводит к тому, что при компиляции появляется сообщение об ошибке. Переменным типа Variant можно присваивать
значения разных типов, например, строковых или числовых выражений. Строковой переменной можно присваивать любое
значение типа Variant, кроме Null. Числовой же переменной
значение типа Variant можно присвоить, только если оно может
быть преобразовано к числу.
Оператор Let можно применять для присваивания одной
переменной типа запись значения другой такой переменной.
Заметьте, это возможно, только если обе они – переменные –
одного определенного пользователем типа.
Примеры:
Public Sub Assign1()
Dim MyStr As String, MyInt As Integer
Let MyStr = "Здравствуйте, зайчик! " 'С ключевым словом Let
MyInt = 5
'Без него. Обычный вариант.
Debug.Print MyStr, MyInt
End Sub
Оператор Lset
Этот оператор служит для присваивания строк с одновременным выравниванием слева, а также для копирования записи
одного определенного пользователем типа в запись другого типа.
Его синтаксис:
Lset СтрПеременная = СтрВыражение
Lset переменная1 = переменная2
Здесь ключевое слово Lset обязательно, СтрПеременная –
имя строковой переменной, СтрВыражение – выражение строкового типа. Во втором варианте переменная1 – имя переменной
некоторого определенного пользователем типа, в которую выполняется копирование, переменная2 – имя переменной, возможно, другого пользовательского типа, значение которой копируется.
Результатом присваивания строк всегда является строка той
же длины, что и у СтрПеременная. Если при этом СтрВыра-
33
жение короче, добавляются пробелы справа; длинее – лишние
символы справа удаляются.
При втором варианте оператора двоичное присваивание записи из участка памяти, отведенного переменной2, копируется в
участок памяти, отведенный переменной1, – при этом данные не
преобразуются в соответствии с типами элементов (полей) записи, и если типы соответствующих элементов обеих записей не
совпадают, результат операции трудно предсказать (часто выдается сообщение о несоответствии типов). Поэтому этот вариант
следует использовать в том случае, когда типы всех соответствующих элементов записей совпадают и имеют одинаковый
размер.
Примеры:
Public Sub Assign2()
Dim Str1 As String, Str2t As String
Str1 = "0123456789"
Str2 = "abcd"
Debug.Print Str1, Str2
' Начальное значение
Lset Str2 = Str1
' Результат – "0123"
Lset Str1 = "Влево"
' ' Результат – "Влево"
Debug.Print Str1, Str2
End Sub
Результаты отладочной печати:
0123456789
Влево
0123
abcd
В следующем примере происходит корректное копирование
одной записи в другую; типы соответствующих элементов в
определенных пользователем типах MyType1, MyType2 совпадают:
Type MyType1
age As Integer
cost As Long
End Type
34
Type MyType2
year As Integer
pay As Long
End Type
Public Sub Assign3()
Dim my1 As MyType1
Dim my2 As MyType2
my1.age = 50
my1.cost = 45666
my2.year = 1997
my2.pay = 22000
Debug.Print my1.age, my1.cost, my2.pay, my2.year
Lset my2 = my1
' после этого присвоения my2.year = 50 и my2.pay = 45666
Debug.Print my1.age, my1.cost, my2.pay, my2.year
End Sub
Результаты отладочной печати:
50
50
45666
45666
22000
45666
1997
50
Если изменить тип элемента pay и MyType2 на Integer, то
будет напечатано значение my2.pay, равное 0.
35
Оператор Rset
Этот оператор присваивает значение строковой переменной
с выравниванием справа:
Rset СтрПеременная = СтрВыражение
СтрПеременная – имя строковой переменной, СтрВыражение – выражение строкового типа. В отличие от оператора
Lset, оператор Rset нельзя использовать для копирования переменных записей. Результатом присвоения строк всегда является
строка той же длины, что и СтрПеременная. Если при этом
СтрВыражение короче, добавляются пробелы слева, длинее –
лишние символы слева удаляются.
Примеры:
Public Sub Assign4()
Dim Str1, Str2, Str3
Str1 = "0123456789 " ' Начальное значение
Str2 = "abcd "
Debug. Print Str1, Str2
Rset Str2 = Str1
' Результат – "0123 "
Rset Str1 = "Вправо " ' Результат – "Вправо "
Rset Str3 = Str1
' Результат – пустая строка " "
Debug.Print Str1, Str2, Str3
End Sub
Результаты отладочной печати:
0123456789
Вправо
abcd
0123
5.4 Управляющие операторы
Набор управляющих операторов VBA делает честь любому
хорошо структурированному языку программирования. Циклы с
возможной проверкой условия в начале, в конце и в середине
работы оператора, обычный оператор If и оператор разбора случаев Case – все эти средства позволяют организовать процесс
36
вычислений надежно и эффективно в соответствии с лучшими
традициями программирования.
Условный оператор If Then Else End If
Этот общепринятый в языках программирования оператор
управления вычислениями позволяет выбирать и выполнять
действия в зависимости от истинности некоторого условия.
Имеется два варианта синтаксиса: в одну строку и в форме
блока. В первом случае он имеет вид:
If условие Then [операторы1] [Else операторы2]
Во втором случае оператор расположен на нескольких
строках:
If условие Then
[операторы]
[ElseIf условие-n Then
[операторы-n]…
[Else
[ИначеОператоры]]
End If
Здесь условие обязательно в обоих вариантах. Оно может
быть числовым или строковым выражением со значениями True
или False (Null трактуется как False). Операторы1 и операторы2 – это последовательности из одного или нескольких разделенных двоеточием операторов. По крайней мере, одна из этих
последовательностей должна быть недоступной. Если условие
истинно (True), выполняется последовательность операторы1,
ложно (False) – операторы2. Форма условного оператора выделяется по наличию в строке, начинающейся If условие Then, текста после Then, отличного от комментария. Если такой текст
есть, считается, что использована форма в одну строку, нет –
оператор должен иметь форму блока. В этом случае подблоки
вида:
[ElseIf условие-n Then
[операторы-n]…
могут отсутствовать, либо повторяться несколько раз;
37
подблок:
[Else
[ИначеОператоры]]
также необязателен, а закрывающийся оператор End If необходим. По крайней мере, одна из последовательностей операторы,
операторы-n… или ИначеОператоры должна быть непустой.
Если условие истинно, выполняются операторы, нет – отыскивается первое истинное условие-n и выполняются операторы-n.
Если все эти условия ложны, выполняются ИначеОператоры.
После выполнения одной (возможно, пустой) последовательности операторов управление передается оператору, следующему
за End If.
Примеры:
Public Sub MinMax2(ByVal X As Integer, ByVal Y As Integer, _
Min As Integer, Max As Integer)
'Оператор If в виде блока
If X > Y Then
Max = X
Min = Y
Else
Max = Y
Min = X
End If
End Sub
Public Sub If1()
Dim Max As Integer, Min As Integer
Call MinMax1 (2+3, 2*3, Min, Max)
Debug.Print Max, Min
Call MinMax2 (2+3, 2*3, Min, Max)
Debug.Print Max, Min
End Sub
В этом примере в процедуре MinMax определяется максимальное из двух значений переменных. Приведем еще один
пример, где показана работа с записями. Вначале определим тип
данных:
Private Type Man
Age As Byte
38
Name As String
End Type
А теперь приведем процедуру, в которой будем работать с
переменной типа Man.
Public Sub BoyOrMan()
Dim Person As Man
Dim SomeBody As Byte
Person.Age=InputBox("Введите число от 10 до 20", "Возраст", 15)
If Person.Age > 15 And Person.Age <= 20 Then
SomeBody = 1
ElseIf Person.Age <= 15 Then SomeBody = 2
End If
If SomeBody=2 Then
Debug.Print "Это мальчик! "
ElseIf SomeBody=1 Then
Debug.Print "Это мужчина! "
Else
Debug.Print "Не знаю, кто это "
End If
End Sub
Результаты ее работы зависят от того, какой возраст Вы
введете в окне ввода.
Оператор выбора Select Case
Этот оператор производит разбор случаев и в зависимости
от значения анализируемого выражения выбирает и исполняет
одну из последовательностей операторов.
Его синтаксис:
Select Case Выражение-текст
[Case Список выражений-n
[операторы-n]]
[Case Else
[ИначеОператоры]]
End Select
39
Выражение-текст должно присутствовать обязательно.
Оно может быть произвольным выражением с числовым или
строковым значением. СписокВыражений-n должен присутствовать в строке, начинающейся ключевым словом Case (Случай). Выражения в этом списке отделяются запятыми и могут
иметь одну из форм:
 выражение;
 выражение-нижняя-граница То выражение-верхняя-граница;
 If оператор-сравнение – выражение.
Первая форма задает отдельные значения, вторая и третья
 позволяет задавать сразу целые диапазоны (области) значений.
Последовательность операторов операторы-n необязательна.
Она будет исполнена, если соответствующий СписокВыражений-n является первым списком, сопоставимым с текущим значением Выражения-текста (оно явно содержит это значение,
либо оно попадает в один из заданных в списке диапазонов).
После исполнения операторов последовательности операторы-n
проверка на соответствие другим спискам выражений не производится, и управление передается на оператор, следующий за
End Select. Необязательная последовательность ЕслиОператоры
выполняется, если ни один из списков выражений несопоставим
со значением Выражения-текста.
Пример:
Public Sub Case1()
Dim Before As Integer
Dim CurrentYear As Integer, Str As String
'Инициализация переменных:
CurrentYear = 1999
Before = InputBox("Сколько лет тому назад? ", "Когда", 10)
Select Case CurrentYear - Before
Case 1954 To 1969, 1971 To 1974, 1982, Is < 1970
Str = "Годы учебы"
Case 1972 To 1989
Str = "Годы воспитания"
Case Else
Str = "Прочие годы"
End select
Debug.Print Str
40
End Sub
Здесь, если перед выполнением выбора Before = 20, значением текстового выражения будет 1979, и будет работать второй
вариант ("Годы воспитания "). При Before = 25 значение 1974
сопоставимо с двумя списками, но для исполнения будет выбран
лишь первый вариант ("Годы учебы ").
Диапазоны значений можно задавать и для строк. При этом
их значения считаются упорядоченными лексикографически.
Например, возможен такой список выражений:
Case "everything ", "nuts" To "soup"
Задаваемое им множество строк включает строку
"everything" и все строки от "nuts" до "soup" (например, "onion").
Цикл For…Next
Цикл For…Next позволяет повторять группу операторов заданное число раз.
Его синтаксис:
For счетчик_цикла = начало To конец [Step шаг]
тело цикла
Next [счетчик_цикла]
Здесь счетчик_цикла – это числовая переменная. В начале
выполнения цикла она принимает значение, задаваемое числовым выражением начало. Переменная счетчик_цикла не может
иметь тип Boolean или быть элементом массива. Числовое выражение конец задает заключительное значение счетчика цикла.
Оно вычисляется до начала исполнения тела цикла и не меняется, даже если входящие в него переменные изменяют в теле
цикла свои значения. Числовое выражение шаг необязательно.
Его значение также вычисляется в начале цикла и прибавляется
к счетчику цикла всякий раз, когда завершается выполнение тела цикла и вычисление достигает строки Next [счетчик_цикла].
Если шаг цикла явно не указан, по умолчанию он равен 1. Тело
цикла – это последовательность операторов, которая будет выполнена заданное число раз. Значение переменной счетчик_цикла, при котором происходит завершение цикла, зависит
41
от знака параметра шаг. Если шаг положителен, цикл завершится, когда впервые выполнится условие:
счетчик_цикла > конец
Если шаг цикла отрицателен, условие его завершения:
счетчик_цикла < конец
Это условие проверяется перед началом работы цикла, а затем –
после каждого прибавления шага к счетчику цикла в операторе
Next. Если оно выполнено, управление передается на оператор,
следующий за Next, нет – выполняются операторы из тела цикла. Завершить цикл For…Next можно и с помощью оператора
Exit For. Такие операторы могут быть расположены в тех местах
тела цикла, где требуется из него выйти, не дожидаясь выполнения условия завершения.
Примеры.
В данном примере три вложенных цикла For…Next использованы для вычисления двух целочисленных матриц, инициализированных случайными числами. Затем результирующая матрица проверяется на наличие в ней нулевого значения:
Public Sub For1()
Dim A(1 To 5, 1 To 5) As Integer
Dim B(1 To 5, 1 To 5) As Integer
Dim C(1 To 5, 1 To 5) As Integer
Dim I As Integer, J As Integer, K As Integer
Dim Res As String
'Инициализация матриц A и B случайными числами в интервале
[-10,+10]
VBA.Randomize
For I = 1 To 5
For J = 1 To 5
' Получение случайного числа Rnd и преобразование в целое
A(I, J) = Int(21 * Rnd) – 10
Next J
Next I
For I = 1 To 5
For J = 1 To 5
B(I, J) = Int(21 * Rnd) - 10
42
Next J
Next I
' Вычисление произведения матриц
For I = 1 To 5
For J = 1 To 5
C(I, J) = 0
For K = 1 To 5
C(I, J) = C(I, J) + A(I, K) * B(K, J)
Next K
Next J
Next I
Res = "No"
C(2, 2) = 0
' Проверка на нулевое значение
For I = 1 To 5
For J = 1 To 5
If C(I, J) = 0 Then
Debug.Print "Индексы: ", I, J
Res = "Yes"
Exit For
End If
Next J
Next I
Debug.Print Res
End Sub
Обратите внимание, что оператор выхода Exit For прекращает выполнение только внутреннего цикла, т.е. проверка на
ноль будет осуществляться в каждой строке матрицы, независимо от существования нулей в предыдущих строках. Сделаем
еще несколько замечаний по поводу оператора For Next:
 по окончании цикла счетчик цикла сохраняет свое значение в момент выхода, и его можно использовать, например,
для анализа преждевременного выхода из цикла. Заметим, что в
большинстве языков программирования значение счетчика цикла считается неопределенным по завершении цикла;
 в операторе Next можно не указывать имя переменной,
задающей счетчик, – это имя подразумевается по умолчанию,
как завершающее последний открытый оператор For. Однако и
43
эту возможность не следует использовать. Рекомендуется всегда
явно указывать имя счетчика в операторе Next;
 допускается менять значение счетчика в теле цикла, но
делать этого не следует никогда. К сожалению, система не следит за этим и допускает подобные безобразия. В этом случае
цикл никогда не завершится:
Public Sub For2()
Dim A(1 To 5) As Integer
Dim i As Integer
For i = 1 To 5 To 1 Step -1
A(i) = i
i=i+1
Next i
End Sub
Обычно попытка изменить значение счетчика цикла в его
теле означает, что вместо цикла For…Next следовало бы применить цикл другого вида, например Do…Loop.
Цикл Do…Loop
В этом случае повторяется блок операторов, пока заданное
условие является истинным или пока оно не станет истинным.
Имеется четыре варианта синтаксиса этого цикла. В двух
первых вариантах условие проверяется в начале цикла:
Do [{While | Until} условие]
тело цикла
Loop
В других двух вариантах условие проверяется в конце цикла:
Do [{While | Until} условие]
тело цикла
Loop [{While | Until} условие]
Здесь условие является числовым или строковым выражением со значениями True или False. Вообще, оно необязательно.
Значение Null условия трактуется как False. Тело цикла – это
последовательность операторов, которая будет выполняться,
44
пока условие остается истинным, если перед ним стоит ключевое слово While, или пока оно остается ложным – в вариантах
цикла с ключевым словом Until. Таким образом, циклы вида
While условие эквивалентны циклам вида Until Not условие.
Кроме того, в тело цикла может входить оператор Exit Do, выполнение которого сразу прекращает цикл и передает управление оператору, непосредственно следующему за Loop. В случае
нескольких вложенных циклов Do…Loop оператор Exit Do завершает лишь самый внутренний цикл, в теле которого он расположен.
Примеры.
В данном примере реализованы три варианта поиска по образцу с проверкой условия в начале цикла, в конце цикла и в
середине цикла для варианта поиска по образцу с барьером:
Public Sub Loop1()
Const Size = 5
Dim X() As Integer
Dim I As Integer
Dim Found As Boolean
Const pat = 7
'Инициализация случайными числами в интервале [1, 11]
ReDim X(1 To Size)
Randomize
For i = 1 To Size
X(i) = Int(11 * Rnd)
Next i
' Поиск по образцу с проверкой в начале цикла
i = 1: Found = False
Do While (i <= Size) And (Not Found)
If X(i) = pat Then
Found = True
Else: i = i+1
End If
Loop
If Found Then
Debug.Print "Найден образец!"
Else: Debug.Print "Образец не найден!"
End If
45
' Поиск по образцу с проверкой в конце цикла
i = 1: Found = False
Do
If X(i) = pat Then
Found = True
Else: i = i+1
End If
Loop Until Found Or (i = Size + 1)
If Found Then
Debug.Print "Найден образец!"
Else: Debug.Print "Образец не найден!"
End If
' Поиск с барьером
ReDim Preserve X(1 To Size + 1)
X(Size + 1) = pat
i=1
Do
If X(i) = pat Then Exit Do
i=i+1
Loop
If i = size + 1 Then
Debug.Print " Образец не найден!"
Else: Debug.Print "Образец найден!"
End If
End Sub
Цикл While…Wend
Этот цикл повторяет выполнение последовательности операторов, пока заданное условие не станет ложным.
Его синтаксис:
While условие
тело цикла
Wend
Здесь условие и тело цикла такие же, как и для цикла
Do…Loop. Только для этого вида цикла не предусмотрен оператор выхода Exit. Фактически, цикл While…Wend – частный слу-
46
чай цикла Do…Loop – оставлен в языке для совместимости с
предыдущими версиями.
Цикл For Each…Next
Цикл For Each…Next повторяет заданную последовательность операторов для каждого элемента массива или набора.
Его синтаксис:
For Each элемент In группа
тело цикла
Next [элемент]
Здесь элемент – переменная, которая пробегает в качестве
значений элемента массива. В случае цикла по массиву элемент
обязан быть переменной типа Variant. Группа – это имя массива,
для элементов которого выполняется цикл. Цикл не применим
для массивов, тип элементов которых определен пользователем,
так как такие элементы не могут быть значениями переменной
типа Variant. В таких массивах можно использовать цикл вида
For…Next. Тело цикла – последовательность операторов, выполняемая для каждого элемента набора или массива, – может содержать операторы Exit For, позволяющие прервать выполнение
цикла и передать управление оператору, следующему за Next
(обычно такой выход происходит при выполнении некоторого
условия, проверяемого в операторе If…Then…Else). Указывать
переменную элемент после ключевого слова Next не обязательно, но желательно.
Примеры.
В примере создается динамический массив, размерность
которого определяется в ходе решения задачи. Каждый набор
чисел, записываемый в массив, сортируется. На последнем этапе
массив распечатывается. В цикле типа For…Each формируется
строка вывода, элементы которой выбираются из массива
Stroka.
Private Mas() As Integer
Public Sub ForEach1()
Dim i As Integer
Dim s As String
47
ReDim Mas(10) As Integer
Make_Mas 10
Call Print_Mass(10, "Начальное ", "значение ", "массива Х(10)")
Sort_Mas 10
Call Print_Mass(10, "Отсортированный ", "массив Х(10)")
ReDim Mas(20) As Integer
Make_Mas 20
Call Print_Mass(20, "Начальное ", "значение ", "массива Х(20)")
Sort_Mas 20
Call Print_Mass(20, "Отсортированный ", "массив Х(20)")
End Sub
Sub Print_Mass(ByVal n As Integer, ParamArray Stroka())
Dim i As Integer
Dim s As String
Dim sl
For Each sl In Stroka
s = s & sl
Next
Debug.Print (s)
For i = 0 To n - 1
Debug.Print Mas(i);
Next i
Debug.Print
End Sub
Sub Make_Mas(n)
Dim i As Integer
For i = 0 To n - 1
Mas(i) = Rnd * 20 - 2
Next i
End Sub
Sub Sort_Mas(ByVal n)
Dim i, j, k As Integer
Dim Min As Integer
For i = 0 To n - 1
Min = Mas(i): k = i
For j = i + 1 To n - 1
If Mas(j) < Min Then
48
k=j
Min = Mas(j)
End If
Next j
Mas(k) = Mas(i)
Mas(i) = Min
Next i
End Sub
Кроме рассмотренных управляющих операторов, VBA содержит доставшиеся в наследство от прежних версий операторы
перехода по метке GoTo, перехода по метке с возвратом
GoSub…Return и условные операторы перехода по меткам
On…GoSub и On…GoTo.
5.5 Работа с файлами и папками
При работе с большим количеством данных часто удобно
записывать данные в файл или считывать из файла. Работа с
файлами определяется следующими функциями языка программирования: создание файла, запись данных в файл, чтение данных из файла, закрытие файла. Кроме этого, существует дополнительная группа процедур обработки файловой системы, которые рассмотрим ниже. Операторы этой группы позволяют перемещать текущий каталог (папку) по дискам системы, создавать
новые и удалять каталоги (папки); изменять атрибуты файлов,
копировать и удалять файлы. Их набор, по существу, совпадает
с набором соответствующих команд операционной системы
Создание файла: оператор Open
Инструкция Open позволяет создать файл и получить к
нему доступ. Данная инструкция обеспечивает три типа доступа
к файлам:
1. Последовательный доступ (определяется тремя режимами доступа):
 Input (для ввода данных из файла, то есть для чтения),
 Output (для вывода данных, то есть для записи),
49
 Append (добавление данных в существующий файл).
2. Произвольный доступ (режим Random). Данный режим
используется, если необходимо считать и записать данные в
файл без его закрытия.
3. Двоичный доступ (режим Binary). Двоичный режим позволяет организовать доступ как по чтению, так и по записи в
любую позицию файла.
Тип доступа к файлам определяет список допустимых инструкций чтения и записи данных (табл. 5.1).
Таблица 5.1  Инструкции чтения/записи данных в файл
Тип доступа
Последовательный
Произвольный
Двоичный
Запись данных
Print #, Write #
Put
Put
Чтение данных
Input #
Get
Get
Синтаксис инструкции Open:
Open путь For режим As [#]НомерФайла
Здесь:
 путь – строковое выражение, указывающее имя файла,
может содержать имя папки и диска;
 режим – ключевое слово, указывающее режим работы с
файлом;
 номерФайла – число, определяющее порядковый номер
файла в программе. Допустимый номер файла может определяться из диапазона от 1 до 511 включительно. Для определения
следующего свободного номера файла следует использовать
функцию FreeFile.
Приведем пример описания файла, открываемого для последовательного чтения:
Open "TestFile" For Input As #1
50
Завершение операций ввода/вывода: оператор Close
Close [[#]НомерФайла][,[#]НомерФайла…]
Необязательный аргумент списокНомеровФайлов может содержать один или несколько номеров файлов.
Если список пуст, то закрываются все активные файлы, открытые с помощью инструкции Open.
При закрытии файла, открытого в режимеOutput или
Append, в него добавляется содержимое последнего буфера вывода. Инструкция Close разрывает связь между файлом на диске
и соответствующим ему номером в программе.
Запись отформатированных данных в файл с последовательным доступом: оператор Print #
Print #НомерФайла, [ СписокВывода]
НомерФайла – обязательный параметр.
СписокВывода – необязательный параметр, который может
содержать следующие элементы:
 Sps(n) – используется для вставки пробелов в файл.
Здесь n – число пробелов, которые следует вставить;
 Tab (n) – устанавливает курсор в столбец с указанным
номером. Tab без аргумента устанавливает курсор в начало следующей зоны печати;
 выражение – числовые или строковые выражения, которые следует вывести в файл;
 позиция – указывает позицию, в которой следует печатать следующий символ. Для установки курсора сразу после последнего выведенного символа используется точка с запятой.
Рассмотрим на примере действие данной инструкции.
Private Sub MyPrint()
Open "TESTFILE" For Output As #1 'Открываем файл
Print #1, "Пример"; " форматирования вывода" 'Сплошная пе
'чать
For i = 1 To 5
Print #1, i * 10; ' Числа выводятся через пробел
Next i
51
Print #1, ' Пропустить строку в файле
Print #1, "Зона 1", "Зона 2" ' Вторая зона печатается с 15 пози
'ции
Print #1, "Зона 1"; Tab; "Зона 2" Вторая зона печатается с 15
'пози'ции
Print #1,
Print #1, Tab(15); "Вывод с заданной позиции"
Print #1, Tab(15); "Очередной вывод"
Print #1,
Print #1, Spc(5); "Печатаем 5 пробелов"
Print #1, "Между"; Spc(3); "словами"; Spc(3); "по"; Spc(3); _
"три"; Spc(3); "пробела"
Close #1
End Sub
Запись неформатированных данных в файл с последовательным доступом: оператор Write #
Write #НомерФайла, [СписокВывода]
НомерФайла – обязательный параметр.
СписокВывода – необязательный параметр, который может
содержать один или несколько разделяемых запятыми числовых
или строковых выражений.
Чтение данных из открытого последовательного файла:
оператор Input #
Input #НомерФайла, СписокПеременных
НомерФайла – обязательный параметр.
СписокПеременных – разделяемый запятыми список переменных, которым следует присвоить значения, считываемые из
файла. Элементы данных должны располагаться в файле в том
же порядке, что и переменные в СпискеПеременных. Данные в
файл должны быть записаны с помощью оператора Write.
При достижении конца файла во время считывания элемента данных ввод прекращается и возникает ошибка. В этом случае в программе используют функцию Eof, которая позволяет
определить признак конца файла и обработать его.
Private Sub MyInput()
52
Dim MyString, MyNumber
Open "TESTFILE1" For Input As #1
Do While Not EOF(1)
Input #1, MyString, MyNumber
Debug.Print MyString, MyNumber '
Loop
Close #1
End Sub
Если требуется осуществить построчное чтение данных из
открытого последовательного файла, то используется оператор
Line Input #. Его синтаксис следующий:
Line Input #НомерФайла, ИмяПеременной
НомерФайла – обязательный параметр.
ИмяПеременной – обязательный параметр. Допустимое имя
переменной типа Variant или String. Данные в файл предварительно записываются с помощью оператора Print.
Чтение данных из открытого файла: оператор Get
Get [#]НомерФайла, [НомерЗаписи], ИмяПеременной
НомерФайла – обязательный параметр.
НомерЗаписи – необязательный параметр (для файлов в режиме Random).
ИмяПеременной – обязательный параметр. Определяет допустимое имя переменной, в которую следует помещать считываемые данные.
Первой записи в файле соответствует номер 1, второй – 2 и
т.д. Если параметр НомерЗаписи опущен, читается запись, на
которую был установлен указатель после выполнения последнего оператора Get или Put. Перевести указатель на нужную запись можно с помощью оператора Seek. Наличие запятых разделителей является обязательным, например:
Get #4,,FileBuff
Рассмотрим пример чтения данных из файла, который содержит не менее пяти элементов типа запись.
53
Type Record
ID As Integer
Name As String*20
End Type
Private Sub RndFile()
Dim MyRecord As Record, Position
Open "TestFile3" For Random As #1 Len = Len(MyRecord)
Position = 3
Get #1, Position, MyRecord ' Читает третью запись в файле
Close #1
End Sub
Запись содержимого переменной в файл: оператор Put
Put [#]НомерФайла, [НомерЗаписи], ИмяПеременной
НомерФайла – обязательный параметр.
НомерЗаписи – необязательный параметр (для файлов в режиме Random – номер записи, для файлов Binary – номер байта,
с которого следует читать данные).
ИмяПеременной – обязательный параметр. Определяет допустимое имя переменной, содержащей данные, которые следует записать в файл.
Первой записи в файле соответствует номер 1, второй – 2 и
т.д. Если параметр НомерЗаписи опущен, записывается запись,
на которую был установлен указатель после выполнения последнего оператора Get или Put. Перевести указатель на нужную
запись можно с помощью оператора Seek. Наличие запятых разделителей является обязательным, например:
Put #4,,FileBuff
Приведем пример записи в файл.
Type Record
ID As Integer
Name As String*20
End Type
Private Sub WriteRndFile()
Dim MyRecord As Record, RecordNumber
Open "TestFile3" For Random As #1 Len = Len(MyRecord)
54
For RecordNumber =1 To 5
MyRecord.ID = RecordNumber
MyRecord.Name ="My Name" & RecordNumber
Put #1, RecordNumber, MyRecord
Next RecordNumber
Close #1
End Sub
Изменение текущего диска: оператор ChDrive
ChDrive диск.
Обязательный параметр диск – это строка, задающая имя
существующего диска, который должен стать текущим, например:
ChDrive "D"
сделает диск "D" текущим.
Изменение текущего каталога (папки): оператор CHDir
ChDir путь.
Обязательный параметр путь – это строковое выражение,
значение которого задает новый текущий каталог (папку). Если
путь не содержит имени диска, меняется текущий каталог на
текущем диске. Подчеркиваем, что оператор ChDir меняет текущий каталог (папку), но не диск. Например, если текущим
является диск "C", команда:
ChDir "D:\TMP"
изменит текущий каталог на диске "D", но диск "C" останется
текущим.
Создание каталога (папки): оператор MkDir
MkDir путь
Обязательный параметр путь – это строковое выражение,
которое задает новый создаваемый каталог (папку). Если путь
не содержит имени диска, каталог создается на текущем диске.
55
В следующем примере на диске F создаются три новых каталога
(папки):
Public Sub Dirs ()
' Сделать текущим диск F
ChDrive "F"
' Cоздать 3 каталога на F
MkDir "Temp1"
MkDir "F:\Temp2"
MkDir "F:Temp3"
End Sub
Переименование каталогов (папок) и файлов: оператор
Name
Оператор Name позволяет переименовывать каталоги (папки) и файлы и перемещать файлы.
Его синтаксис:
Name СтароеИмя As НовоеИмя
СтароеИмя и НовоеИмя – обязательные параметры, задающие старое и новое имя файла (каталога, папки). Они могут
включать имя диска и путь. СтароеИмя должно быть именем
существующего файла (каталога, папки), а НовоеИмя не должно
быть именем уже существующего объекта. Оба имени должны
использовать один и тот же диск. Если указанный новый путь
существует и отличается от старого, оператор перемещает файл
в новый каталог (папку) и, если требуется, переименовывает его.
Каталоги и папки с помощью оператора Name перемещать нельзя, – только переименовывать. Перед переименованием файл
должен быть закрыт.
В этом примере файл переименовывается, а затем и перемещается в другой каталог:
Public Sub DirsAndFiles()
' Сделать текущим диск F
ChDrive "F"
' Переименование файла
Name "Example1.xls" As "Example2.xls"
56
' Перемещение файла
Name "Example1.xls" As "Temp\Example2.xls"
End Sub
Удаление каталога (папки): оператор RmDir
RmDir путь
Аргумент путь – строковое выражение, задающее удаляемый каталог или папку. Нельзя удалять каталог или папку, содержащие файлы (иначе будет выдано сообщение об ошибке).
RmDir "Temp3"
удалит папку Temp3 с текущего диска.
Установка атрибутов файла: оператор SetAttr
SetAttr имяфайла, атрибуты
Первый параметр имяфайла – строковое выражение, задающее имя файла, у которого требуется изменить атрибуты. Оно
может включать имя диска и путь по каталогам (папкам). Параметры атрибуты – константа или числовое выражение, определяющее новые атрибуты файла в соответствии с таблицей 5.2.
Таблица 5.2  Атрибуты файла
Имя константы
VbNormal
VbReadOnly
VbHidden
VbSystem
VbArchive
Значение
0
1
2
4
32
Описание
Нормальный (по умолчанию)
Только для чтения
Скрытый
Системный файл
Файл изменен со времени последнего создания резервной копии
Нельзя менять атрибуты открытого файла, иначе будет выдано сообщение об ошибке.
Копирование файлов: оператор FileCopy
57
FileCopy файл-источник, файл-результат
Параметр файл-источник – строковое выражение, задающее имя копируемого файла, файл-результат – строковое выражение, которое определяет имя результирующего файла. Оба
имени могут включать имена дисков, каталогов или папок. Открытый в данный момент файл копировать нельзя.
Пример:
' Копирование файла
FileCopy "Temp1\Example1.xls", "Temp2\Example1.xls"
Удаление файлов: оператор Kill
Kill файл
Параметр файл – строковое выражение, задающее имя удаляемого файла. Он может включать имя диска и путь по каталогам или папкам. Для удаления нескольких файлов можно использовать в образце имени файла символ '*' для обозначения
произвольной последовательности букв и '?' – для обозначения
одного символа. Нельзя удалять открытый в данный момент
файл.
Пример.
Допустим в текущем каталоге находятся файлы
PROG.DOC, PROG.CPP и PROG.OBG. Тогда оператор:
Kill "PROG.*"
удалит эти файлы с диска.
5.6 Прочие операторы
Звуковой сигнал: оператор Beep
Данный оператор подает звуковой сигнал через динамик
компьютера.
Beep
Частота и сила звука зависят от оборудования. Обычно звуковой сигнал используется как реакция на какие-либо ошибки
58
или исключительные ситуации, возникающие при выполнении
программы.
Установка системной даты: оператор Date
Date = дата
Пример:
Date = #April 29, 1999#
' Изменение системной даты.
Установка системного времени: оператор Time
Time = время
Пример:
Time = #8: 15: 47 PM#
' Установка системного времени
Моделирование ввода с клавиатуры: оператор SendKeys
Данный оператор посылает один или несколько кодовсимволов в текущее активное окно, как если бы соответствующие клавиши были нажаты.
Его синтаксис:
SendKeys строка[, режим-ожидания]
Параметр строка – строковое выражение, задающее последовательность посылаемых символов. Необязательный параметр
режим-ожидания – выражение с булевым значением. Если оно
равно False (по умолчанию), то управление возвращается в процедуру сразу же после посылки кодов; если – True, то посланная
последовательность кодов должна быть обработана, прежде чем
возвратиться в процедуру.
Большинство символов, набираемых на клавиатуре, входят
в строку непосредственно. Например, чтобы послать последовательность из трех символов Y, E и S, возьмите в качестве строки
«YES». Символы: +, ^, %, ~, скобки и некоторые другие следует
помещать в фигурные скобки. Например, чтобы послать +, в параметр строка нужно поместить {+}. Для посылки кодов клавиш, не отображаемых на экране, имеются специальные коды.
59
Некоторые представлены в таблице 5.3, остальные можно найти
с помощью подсказки.
Таблица 5.3  Коды клавиш, не отображаемых на экране
Клавиша
BACKSPACE
BREAK
CAPS LOCK
DEL
DOWN ARROW
END
ENTER
ESC
HOME
INS
LEFT ARROW
PAGE DOWN
PAGE UP
RIGHT ARROW
TAB
UP ARROW
Fn
Код
{BS}
{BREAK}
{CAPSLOCK}
{DEL}
{DOWN}
{END}
{ENTER} или ~
{ESC}
{HOME}
{INS}
{LEFT}
{PGDN}
{PGUP}
{RIGHT}
{TAB}
{UP}
{Fn} (n=1, …, 12)
Чтобы послать комбинацию клавиш, для Shift, Ctrl и Alt используются следующие коды:
Shift
Ctrl
Alt
+
^
%
В качестве примера рассмотрим открытие документа, требующего пароль при его открытии:
Public Sub OpenDocWithPassword()
' Открытие документа с паролем
SendKeys "+^" 'Переключение раскладки клавиатуры
SendKeys "don" & "{'}" & "t know", False 'пароль "don’t know"
Documents.Open "c:\work\crt.doc"
Documents ("crt.doc").Activate
End Sub
60
Обратите внимание на два момента:
 прежде, чем послать сам пароль, происходит переключение клавиатуры на другую раскладку, для чего используется
комбинация символов «Shift+Ctrl»;
 символы клавиатуры посылаются в буфер ввода еще до
того, как они потребуются. Если бы оператор Open предшествовал оператору SendKeys, то окно ввода пароля появлялось бы до
выполнения этого оператора. В данном же случае при открытии
документа пароль автоматически появится в окне ввода, так что
останется только щелкнуть по кнопке ОК.
61
6 ПРОЦЕДУРЫ И ФУНКЦИИ
6.1 Классификация процедур
Процедуры и функции являются минимальными модульными конструкциями, из которых строится проект.
Процедура (функция) – это программная единица VBA,
включающая операторы описания ее локальных данных и исполняемые операторы. Обычно в процедуру объединяют регулярно выполняемую последовательность действий, решающую
отдельную задачу или подзадачу. Особенность процедур VBA
состоит в том, что они работают в мощном окружении Office и
могут использовать в качестве элементарных действий большое
количество встроенных методов и функций, оперирующих с
разнообразными объектами этой системы. Поэтому структура
управления типичной процедурой прикладной офисной системы
проста: она состоит из последовательности вызовов встроенных
процедур и функций. Последовательность эта управляется небольшим количеством условных операторов и циклов.
Процедуры VBA можно классифицировать по нескольким
признакам:
 по способу использования (вызова) в программе;
 по способу запуска процедуры на исполнение;
 по способу создания кода процедуры;
 по месту нахождения процедуры в проекте.
Процедуры VBA подразделяются на подпрограммы и
функции. Первые описываются ключевым словом Sub, вторые –
Function.
По способу создания кода процедуры делятся на обычные,
разрабатываемые вручную, и на процедуры, код которых создается автоматически генератором макросов; их называют макропроцедурами или командными процедурами, поскольку их код –
это последовательность вызова команд соответствующего приложения Office. Любую макропроцедуру можно изменить вручную, дописав в нее требуемую последовательность операторов.
По способу запуска процедур на исполнение можно выделить в отдельную группу процедуры, запускаемые автоматиче-
62
ски при наступлении того или иного события, – так называемые
процедуры обработки событий.
По положению в проекте различают процедуры, находящиеся в специальных программных единицах – стандартных модулях, модулях классов и модулях, связанных с объектами, реагирующими на события.
6.2 Синтаксис процедур и функций
Описание процедуры Sub в VBA имеет следующий вид:
[Private | Public | Static] Sub имя ([список-аргументов])
тело-процедуры
End Sub
Ключевое слово Public в заголовке процедуры используется, чтобы объявить процедуру общедоступной, т.е. разрешить
вызывать ее из всех других процедур всех модулей всех проектов. Если модуль, в котором описана процедура, содержит закрывающий оператор Option Private, то процедура доступна
лишь модулям своего проекта. Альтернативный ключ Private
используется, чтобы закрыть процедуру от всех модулей, кроме
того, в котором она описана. По умолчанию процедура считается общедоступной.
Ключевое слово Static означает, что значение локальных
переменных будут сохраняться в промежутках между вызовами
процедуры (используемые процедурой глобальные переменные
при этом не сохраняются).
Параметр имя – это имя процедуры, удовлетворяющее
стандартным условиям VBA на имена переменных.
Необязательный параметр список-аргументов – это последовательность разделенных запятыми переменных, задающих
при вызове процедуры передаваемые параметры. Аргументы,
или формальные параметры (с их типами), задаваемые при описании процедуры, всегда представляют только имена. В то же
время при вызове процедуры ее аргументы – фактические параметры – могут быть не только переменными, но и выражениями.
Приведем пример процедур со списком параметров. Предположим, что необходимо вычислить сумму двух различных
63
произведений, отличающихся по виду сомножителей, которые
являются элементами некоторых массивов.
4
S   f k   Sin( f k ) ,
где
f  5; 3; 1; 2.
k 1
Для решения данной задачи создадим две процедуры: процедуру Main с нулевым списком параметров и процедуру
Product, которая имеет три параметра.
Private Sub Main()
Dim f(4), f1(4), s, p2, p1 As Single
Dim i As Integer
For i = 1 To 4
f(i) = Val(InputBox("Введите f"))
f1(i) = Sin(f(i))
Next
Product 4, f, p1
Call Product(3, f1, p2)
s = p1 + p2
Debug.Print "Сумма произведений равна "; s
End Sub
Sub Product(ByVal k As Integer, ByVal z, p)
Dim i As Integer
p=1
For i = 1 To k
p = p * z(i)
Next
End Sub
Здесь после ввода в память значений элементов массивов f
и f1 дважды вызывается процедура Product. Обратите внимание
на различный синтаксис вызова процедуры. При использовании
ключевого слова Call список параметров должен быть заключен
в скобки. Ключевое слово ByVal определяет список входных
параметров, в данном примере это параметры k, z. Параметр p в
данном примере является выходным, следовательно, вычисленное значение произведения передается через этот параметр в
точку вызова процедуры.
64
В отличие от процедуры, функция не имеет выходных параметров и не вызывается, подобно процедуре, как самостоятельная инструкция, а включается в состав выражения, значение
которого может быть присвоено какой-либо программной переменной. Описание функции имеет следующий вид:
[Private | Public | Static] Function имя ([список-аргументов]) _
As типЗначения
тело-функции
End Function
Рассмотрим в качестве примера определение функции SQ,
которая возвращает значение площади треугольника, если заданы декартовы координаты трех вершин. Очевидно, что у данной
функции 6 аргументов – 3 пары координат вершин.
Function SQ(x1 As Single, y1 As Single, x2 As Single, y2 As Single, _
x3 As Single, y3 As Single) As Double
SQ = Abs((x1 * (y3 - y2) + x2 * (y1 - y3) + x3 * (y2 - y1)) / 2)
SQ = CInt(SQ * 100) / 100
End Function
Private Sub Main()
Dim s As Double
s= SQ(2.7, 9.1, 14.1, 16.4, 17.9, 2)
Debug.Print "Площадь треугольника равна "; s
End Sub
Обратите внимание, что в заголовке функции указаны не
только тип аргументов, но тип значения самой функции. Другой
особенностью описания функции является то, что результат работы операторов, стоящих в теле функции, присваивается имени
функции: SQ = CInt(SQ * 100) / 100.
65
7 ДИАЛОГОВЫЙ ВВОД/ВЫВОД ИНФОРМАЦИИ
При разработке любой программы требуется организовать
обмен информацией между пользователем и программой. Эта
задача решается с помощью функций InputBox и MsgBox.
Функция InputBox
Функция InputBox выводит на экран диалоговое окно, содержащее сообщение и поле ввода, устанавливает режим ожидания
ввода текста пользователем или нажатия кнопки, а затем возвращает
значение типа String, содержащее текст, введенный в поле.
InputBox (сообщение[,заголовок][,текст_по_умолчанию]
Сообщение – текст в диалоговом окне. Максимальная длина
сообщения 1024 символа. Для разделения строк используется
символ возврата каретки (Chr(13)), символ перевода строки
(Chr(10)) или комбинация этих символов (Chr(13)&Chr(10)).
Заголовок – строковое выражение, отображаемое в строке
заголовка диалогового окна. Если аргумент опущен, в строку
заголовка помещается имя приложения.
Текст_по_умолчанию – строковое выражение, отображаемое в поле ввода. Если аргумент опущен, поле ввода отображается пустым.
Если пользователь нажимает кнопку OK или клавишу
ENTER, функция возвращает содержимое поля ввода. Если
пользователь нажмет кнопку Отмена, функция вернет пустую
строку ("").
Рассмотрим на примере использование функции InputBox.
Результат работы функции отображен на рис 7.1.
Рис. 7.1  Диалоговое окно функции InputBox
66
Dim MyValue
MyValue = InputBox("Введите число от 0 до 3","Пример","1")
Функция MsgBox
Функция MsgBox выводит на экран диалоговое окно, содержащее сообщение, устанавливает режим ожидания нажатия
кнопки пользователем, а затем возвращает значение типа
Integer, указывающее, какая кнопка была нажата.
MsgBox (сообщение[,кнопки][,заголовок]
Сообщение – текст в диалоговом окне. Максимальная длина
сообщения 1024 символа. Для разделения строк используется
символ возврата каретки (Chr(13)), символ перевода строки
(Chr(10)) или комбинация этих символов (Chr(13)&Chr(10)).
Кнопки – числовое выражение, представляющее сумму значений, которые указывают количество и тип отображаемых
кнопок, тип используемого значка, основную кнопку.
Заголовок – строковое выражение, отображаемое в строке
заголовка диалогового окна. Если аргумент опущен, в строку
заголовка помещается имя приложения.
Значения аргумента кнопки приведены в таблице 7.1.
Таблица 7.1  Значение аргумента кнопки
Константа
vbOKOnly
vbOKCancel
vbAbortRetryIgnor
e
vbYesNoCancel
vbYesNo
vbRetryCancel
Числовое значение
0
1
2
3
4
5
vbCritical
16
vbQuestion
32
Реакция
Отображается только кнопка ОК
Отображаются кнопки ОК, Отмена
Отображаются кнопки Прервать, Повторить, Пропустить
Отображаются кнопки Да, Нет, Отмена
Отображаются кнопки Да, Нет
Отображаются кнопки Повторить,
Отмена
Используется значок Критическое
сообщение
Используется значок, предупреждающий запрос
67
Продолжение табл. 7.1
Константа
vbExclamation
vbInformation
Числовое значение
48
64
vbDefaultButton1
vbDefaultButton2
vbDefaultButton3
vbDefaultButton4
vbApplicationModa
l
0
256
512
768
0
vbSystemModal
4096
Реакция
Используется значок Предупреждение
Используется значок Информационное сообщение
Основной является первая кнопка
Основной является вторая кнопка
Основной является третья кнопка
Основной является четвертая кнопка
Модальное окно на уровне приложения: чтобы продолжить работу с текущим приложением, необходимо
ответить на данное сообщение
Модальное окно на уровне системы:
все приложения будут недоступны до
тех пор, пока пользователь не ответит
на данное сообщение
В таблице определены три группы значений:
1) значения от 0 до 5;
2) значения 16, 32, 48, 64;
3) значения 0, 256, 512;
4) значения 0, 4096.
При определении значения аргумента кнопки следует суммировать не более одного значения из каждой группы.
Как отмечалось ранее, функция MsgBox возвращает числовое значение, определяющее выбор пользователя. В таблице 7.2
приведены коды возврата функции.
Таблица 7.2  Возвращаемые значения функции MsgBox
Константа
vbOK
vbCancel
vbAbort
vbRetry
vbIgnore
vbYes
vbNo
Значение
1
2
3
4
5
6
7
Нажатая кнопка
ОК
Отмена
Прервать
Повторить
Пропустить
Да
Нет
68
Приведем пример использования функции MsgBox.
Public Sub WinMsg()
Dim Msg, Style, Title, Response, MyString
Msg = "Обнаружена ошибка. Продолжить?"
Style = vbYesNo + vbCritical + vbdDefoultBotton2
Title = "Пример"
Response = MsgBox(Msg, Style, Title)
If Response = vbYes Then
MyString = " Нажата кнопка Да"
Else
MyString = " Нажата кнопка Нет"
End If
MsgBox MyString
End Sub
Результат работы данной процедуры отображен на рис.7.2,
7.3
Рис. 7.2  Окно с сообщением
Рис.7.3  Сообщение
о нажатой кнопке
69
8 ИНТЕГРИРОВАННАЯ СРЕДА VBA
8.1 Окно редактирования проекта
Написание и отладка программ осуществляется с использованием интегрированной среды Visual Basic. Среда (в дальнейшем мы будем называть ее редактором) VBA активизируется
командой Сервис/Макрос/Редактор Visual Basic непосредственно с рабочего окна программы Word либо Excel. Вид окна
редактора Visual Basic показан на рисунке 8.1.
Рис. 8.1  Окно VBA
Интерфейс редактора Visual Basic является стандартным
для всех приложений Windows. В верхней части окна находится
строка меню, ниже располагается панель инструментов Стандартная. В рабочем поле могут отображаться следующие окна:
Проект, Свойства, Проверка, Локальные переменные, Контрольные значения, Просмотр объектов, Программа. Вызов
70
всех перечисленных окон выполняется с помощью почти одноименных меню Вид.
Программное окно или окно модуля служит для написания
любых программ (макросов, процедур любого типа) VBA. Под
строкой заголовка окна содержится два списка: список объектов
модуля и список процедур, связанных с выбранным объектом. В
окне модуля можно задать отображение отдельной процедуры
или модуля в целом. Переключение режимов отображения выполняется с помощью кнопок, расположенных в левом нижнем
углу окна модуля. Тексты программ вводятся непосредственно в
окне модуля.
Чтобы добавить в проект VBA новый модуль, необходимо
выполнить следующие команды:
1) выбрать в окне проекта проект, в состав которого
добавляется модуль;
2) выполнить
команду
Модуль меню Вставка;
3) присвоить
модулю
имя. Для этого необходимо
открыть окно Свойства (рис.
Рис. 7.2  Окно Свойства
7.2) и в диалоговом окне ввести новое имя.
Формирование и отладка
процедур
Рис.7.3  Окно Вставка процедуры
Для добавления процедуры необходимо выполнить
следующие команды:
1) открыть окно модуля;
2) выполнить
команду
Процедура меню Вставка
(рис. 7.3);
3) в предложенном окне
запроса выбрать тип процедуры (Sub, Function или
Property);
71
4) в поле Имя ввести имя процедуры: любая последовательность символов;
5) задать область определения функции (Public – общая или
Private – личная);
6) при необходимости установить переключатель Все локальные переменные считать статическими;
7) нажать кнопку ОК.
В результате в окне модуля выводится пустая процедура с
заданным именем. Для окончательного создания процедуры
нужно ввести ее тело, то есть последовательность операторов и
выполнить отладку.
Отладка процедур проводится для выявления и исправления синтаксических и алгоритмических ошибок.
Синтаксические ошибки заключаются в неправильной записи инструкций VBA, неверном указании имен процедур и переменных. Такие ошибки выявляются автоматически на этапе
компиляции.
Алгоритмические ошибки проявляются в том, что процедура не дает ожидаемых результатов. Такие ошибки выявляются
путем пошагового выполнения процедуры и контроля промежуточных результатов с помощью средств отладки VBA.
Пошаговое выполнение процедур можно задать с помощью
панели инструментов Отладка или с помощью команд одноименного меню.
Меню Отладка предоставляет четыре варианта пошагового
выполнения процедуры:
1. Команда Шаг с заходом предписывает выполнить одну
строку процедуры и перейти к следующей. В случае, если очередная строка содержит вызов процедуры, то осуществляется
переход к ее первой инструкции.
2. Команда Шаг с обходом предписывает выполнить одну
строку процедуры и перейти к следующей. Вызываемая процедура выполняется как одна строка. Этот вариант применяется в
том случае, когда вызываемая процедура уже отлажена.
3. Команда Шаг с выходом задает выполнение текущей
процедуры до конца и переход к следующей инструкции в вызывающей процедуре.
72
4. Команда Выполнить до текущей позиции задает выполнение процедуры от текущей инструкции до инструкции, в
которой был предварительно установлен курсор.
Отладка процедур сопровождается переходом в режим прерывания. Переход в этот режим происходит в следующих случаях:
 при прерывании выполнения макроса с помощью комбинации <Ctrl>+<Break>;
 при пошаговом выполнении процедуры;
 при достижении инструкции Stop;
 при достижении точек останова.
Для выхода из режима прерывания нужно в среде редактора
Visual Basic выполнить команду Сброс меню Запуск.
8.2 Окно редактирования форм UserForm
Для создания диалоговых окон разрабатываемых приложений в VBA используются формы. Помимо всего прочего формы
позволяют реализовать интерфейс, который знаком пользователю. Редактор форм является одним из основных инструментов
визуального программирования.
8.2.1 Создание формы
Диалоговое окно является формой. Чтобы добавить форму в
проект:
1. Запустите редактор VBA.
2. Выберите команду Вставка\Форма (Insert\UserForm).
Выводится новая форма (рис. 8.1).
3. Добейтесь требуемого размера формы, перетащив маркеры изменения размеров.
73
Рис. 8.1  Новая форма
8.2.2 Размещение элементов управления в форме
Чтобы разместить элемент управления в форме:
1. На панели инструментов Элементы управления щелкните значок того элемента, который требуется добавить в форму.
2. С помощью мыши разместите элемент на форме и перетащите рамку размещаемого элемента управления, добившись
требуемого размера.
Описанные шаги можно произвести для любого элемента
управления, который требуется использовать в диалоговом
окне, будь то список или кнопка. Если необходимо изменить
размеры объекта, выберите его, а затем перетащите маркер изменения размеров. Элементы, размещенные на форме, можно
удалять, копировать, вырезать, вставлять в новую позицию.
Панель инструментов Элементы управления (рис. 8.2)
обычно содержит следующие кнопки:
•
•
•
•
Выбор объектов.
Поле.
Список.
Переключатель.
•
•
•
•
Надпись.
Поле со списком.
Флажок.
Выключатель.
74
•
•
•
•
Рамка.
Набор вкладок.
Полоса прокрутки.
Рисунок.
выбор объектов
текстовое поле
список
переключатель
рамка
набор вкладок
полоса прокрутки
•
•
•
•
Кнопка.
Набор страниц.
Счетчик.
RefEdit
надпись
поле со списком
флажок
выключатель
кнопка
набор страниц
счетчик
рисунок
Рис. 8.2  Панель «Элементы управления»
При необходимости набор элементов на панели инструментов Элементы управления может быть изменен. Одни элементы могут быть удалены, а другие добавлены. Например, можно
добавить:
• Свойства элементов управления.
• Текст программы.
• Сетка привязки.
• Запуск окна диалога
8.2.2.1 Поле (TextBox)
Элемент управления TextBox позволяет ввести в форму информацию, которая затем может быть использована в программе. Также элемент управления TextBox может служить и для вывода информации.
По умолчанию поля имеют имена TextBoxl, TextBox2 и т.д.
75
Рекомендуется сразу после создания элементов управления
присваивать им имена. Чтобы переименовать элемент управления:
1. Выберите элемент управления.
2. Выделите в окне свойств поле Имя (Name).
3. Введите новое имя элемента управления.
4. Нажмите клавишу <Enter>, чтобы сохранить имя.
Новое значение имени любого элемента управления можно
установить и непосредственно в коде процедуры, связанной с
этим элементом управления. При присвоении имен полей используется следующее правило:
TxtИмяОбъекта
Например, txtAge  название поля, в которое вводится возраст, a txtFistName  название поля, в которое вводится фамилия.
Для установки и получения содержимого поля используется
свойство Value. Это свойство имеет тип Variant.
Например, установка значения свойства поля txtFistName
имеет вид:
TxtMyFirstName.Vаlue = "Петров" ' в поле заносится
' значение "Петров"
Для получения значения элемента управления TextBox
можно использовать следующие инструкции:
Dim varFirstName As Variant
varFirstName = txtFirstName.Value
Если нужно запретить изменение содержимого поля
(например, объект TextBox применяется для отображения доступной только для чтения информации, такой, как имена файлов), следует «отключить» поле с помощью свойства Enabled,
установив его равным значению False. Если значение свойства
равно True, то изменение содержимого поля разрешено.
TxtMyFirstName.Enabled = False
76
Для получения выделенного в поле текста (с помощью мыши или стрелок управления курсором при нажатой клавише
Shift) используется свойство SelText. Например:
Dim varSelected As Variant
varSelected = txtMyFirstName.SelText
Кроме получения выбранного в поле текста можно установить его в программе с помощью свойств SelStart и SelLength
элемента TextBox.
Рассмотрим следующий пример, в котором выделим слово
«был» в поле TxtMyControl с помощью рассмотренных выше
свойств:
Dim VarText As Text
VarText = "У Петрова был экзамен"
TxtMyControl.Value = VarText
TxtMyControl.SelStart=11
TxtMyControl.SelLength = 3
Для автоматической установки размеров поля используется
свойство AutiSize. Если значение этого свойства равно True, то
ширина поля автоматически уменьшается или увеличивается в
зависимости от числа находящихся в нем символов.
Инструкция может быть записана следующим образом:
TxtMyControl.AutoSize = True
Отметим, что значения свойств могут устанавливаться как в
коде программы с помощью соответствующих операторов, так и
в окне свойств.
8.2.2.2 Надпись (Label)
Элемент управления Label предназначен для вывода текста
в форме, например, для вывода заголовка для тех элементов
управления, у которых отсутствует собственное свойство
Caption. В качестве примера таких элементов можно назвать
поле или рисунок в форме. В этом случае надпись находится
около этого элемента управления, указывая его назначение.
77
Для задания текста надписи можно использовать свойство
Caption. Например:
TxtMyAdress.Caption="Адрес"
По умолчанию надписи имеют имена Label1, Label2 и т.д.
8.2.2.3 Кнопка (CommandButton)
Элемент управления CommandButton задает выполнение
некоторого действия, например запуск, прерывание или останов
некоторого процесса.
По
умолчанию
кнопкам
присваиваются
имена
CommandButton1, CommandButton2 и т.д. Для изменения имени
кнопки откройте окно свойств и введите новое имя в поле Имя
(Name).
Можно задать текст, который будет выводиться на кнопке
вместо установленного по умолчанию значения CommandButton_n (где n – порядковый номер данной кнопки в общем
списке кнопок в соответствии с очередностью их создания). Для
этого установите новое значение свойства Caption. Например:
CbMyButton.Caption="Моя новая программа"
Чтобы получить текст, выведенный на кнопке, можно использовать следующие инструкции:
Dim Str_My_Button_Caption As String
Str_My_Button_Caption = CbMyButton.Caption
Можно задать автоматическое изменение размеров элемента управления CommandButton с помощью свойства AutoSize.
Если установлено значение этого свойства, равное True, то весь
текст надписи, заданный свойством Caption, будет умещаться на
кнопке. Например:
CbMyButton.AutoSize=True
Если в форме имеется несколько кнопок, то одну из них
можно назначить применяемой по умолчанию. Например, при
выводе окна сообщений, в котором содержится запрос на подтверждение удаления данных, кнопка Да обычно задана по
78
умолчанию. Если по ошибке нажать клавишу «Пробел» или
Enter, то вся информация будет уничтожена. Поэтому нужно
назначить применяемой по умолчанию кнопку Нет. Для того
чтобы назначить кнопку по умолчанию, нужно присвоить значение True ее свойству Default. Тогда свойству Default остальных кнопок формы автоматически будет присвоено значение
False. Например:
CbMyButton.Default=True
С нажатием кнопки можно связать выполнение некоторого
действия, если назначить эту кнопку некоторому событию
Нажатие кнопки (Click). Процедура обработки события Click
не имеет параметров. Например, следующая процедура обработки события выводит в окне отладки Debug сообщение «Моя
новая программа», после того как нажата кнопка
CommandButtonl.
Private Sub CbMyButton_Click()
Debug.Print "Моя новая программа"
End Sub
Можно изменить состояние кнопки: запретить пользователю нажатие кнопки, если оно приведет к опасным или нежелательным последствиям. Например, можно отключить кнопку
печати, пока не выбран принтер. При запрете доступа кнопка
выглядит серой. Для отключения объекта используется значение
False свойства Enabled.
Например, процедура запрета печати, пока не выбран принтер, имеет вид:
Public Sub CheckPrinter()
If PrinterNotReady() Then
cbPrinter.Enabled = False
GetPrinterReady()
End If
End Sub
79
8.2.2.4 Список (ListBox)
Элемент управления ListBox предназначен для хранения
списка значений, из которого можно выбрать один или несколько элементов.
По умолчанию списки имеют имена ListBox1, ListBox2 и т.д.
Существуют следующие варианты выбора элементов в
списке (табл. 8.1):
• один элемент,
• несколько последовательно расположенных элементов,
• несколько произвольно расположенных элементов.
Таблица 8.1  Варианты выбора элементов в списке
Вариант
Значение
1
2
3
0
1
2
Константа
FmMultiSelect
FmMultiSelectExtended
FmMultiSelectMulti
Способ выбора элементов в списке определяется свойством
MultiSelect, значение которого можно задать в окне свойств или
в программе.
Например, следующая инструкция позволяет выделить в
списке несколько последовательно расположенных элементов:
ListBox1.MultiSelect = fmMultiSelectExtended
Для добавления новых элементов в список используется
метод AddItem. При этом нужно задать параметр, который определяет строку с названием добавляемого в список элемента:
ListBox1.AddItem элемент
В следующей процедуре метод AddItem добавляет в список
названия месяцев года:
Public Sub Months()
ListBox1.AddItem "Январь"
ListBox1.AddItem "Февраль"
80
...
ListBox1.AddItem "Декабрь"
End Sub
Для заполнения списка последовательными числами можно
использовать процедуру
Public Sub Number-List ()
For i = 1 To 20
ListBox1.AddItem "Номер элемента:"+str$(i)
Next i
End Sub
Пусть в программе требуется определить выбранные элементы списка. Если в списке задан выбор только одного элемента, то свойство Text элемента управления ListBox содержит выделенный элемент, в противном случае свойство Text равно пустой строке. Свойство ListIndex содержит номер выделенного
пункта в списке. Выбранный в списке элемент можно вывести,
например, в окне отладки Debug с помощью инструкции:
Debug.Print ListBox1.Text
Если известно, что в списке выделено несколько элементов,
то необходимо проверить каждый пункт списка, чтобы определить, выделен он или нет. Для этого используется свойство
Selected, которое по индексу пункта возвращает значение True,
если пункт выбран, и значение False – в противном случае.
Свойство ListCount содержит общее количество элементов
(пунктов) в списке. При этом первый элемент имеет номер «0»,
а последний – (ListCount – 1).
Свойство – возвращает по номеру пункта его текст.
Для удаления элемента из списка используется метод
RemoveItem, при этом в качестве параметра метода указывается
номер удаляемого пункта.
Например, для очистки списка может использоваться следующая процедура:
Public Sub NumberList()
For i = 0 to (ListBox1.ListCount-1)
ListBox.Remove Item i
Next i
81
End Sub
8.2.2.5 Поле со списком (ComboBox)
Если используется поле со списком, то необходимый элемент можно выбрать из списка или ввести вручную. Текущее
значение в элементе управления ComboBox отображается в поле,
а список возможных значений выводится при нажатии кнопки
со стрелкой. Элемент управления ComboBox отличается от элемента управления ListBox тем, что в нем можно явно выделить
требуемое значение.
Существует два типа полей со списком.
С помощью объектов первого типа можно ввести в поле
данные, которые затем можно использовать как:
• критерий выбора элементов в списке; например, если
список содержит названия месяцев года и вводится слово
«Май», то осуществляется перемещение на этот пункт списка;
при этом используются свойства MatchEntry и MatchRequired;
• новое значение; например, для задания новой величины
масштаба изображения; таким образом, в программе должен
быть предусмотрен случай, когда введенного значения нет в
списке.
Если элемент управления ComboBox относится ко второму
типу, то для выбора элемента необходимо открыть список,
нажав кнопку со стрелкой, а затем указать в списке требуемый
элемент списка. Этот элемент появится в поле элемента управления ComboBox.
Тип объекта ComboBox можно указать с помощью свойства
Style (табл. 8.2).
Таблица 8.2  Типы элемента управления ComboBox
Тип
Ввод данных
Выбор значения из списка
Значение
0
2
Константа
FmStyleDropDownCombo
FmStyleDropDownList
Для заполнения поля со списком применяется метод
AddItem.
82
Для получения значения, содержащегося в поле элемента
управления ComboBox, можно использовать свойства Value и
Text.
Например, два следующих оператора выполняют одно и то
же действие – выводят в окне отладки Debug текст, содержащийся в поле элемента управления ComboBox:
Debug.Print ComboBox1.Value
Debug.Print ComboBox1.Text
При присвоении значения свойству Text автоматически выполняются следующие действия:
• заданный текст выводится в поле элемента управления
ComboBox (если заданный текст не является элементом списка,
то выдается сообщение об ошибке);
• свойству ListIndex элемента ComboBox присваивается
индекс элемента списка, соответствующего заданному значению.
8.2.2.6 Флажок (CheckBox)
Элемент управления CheckBox создает ячейку («маленький
квадрат»), которая может быть помечена пользователем как
имеющая значение True или False. С флажком можно связать
некоторый заголовок. Если этот квадрат пуст, то при щелчке по
нему в нем появляется галочка, и, наоборот, если квадрат был
помечен галочкой, то при щелчке по нему галочка исчезает.
Если флажок установлен, то свойство Value элемента
управления CheckBox имеет значение True.
Состояние флажка используется в процедурах обработки
события флажка Нажатие кнопки или при принятии решения о
выполнении некоторого действия.
Элемент управления CheckBox может иметь три состояния:
• Ложь (False),
• Истина (True),
• не Ложь и не Истина (Null).
По умолчанию флажки имеют имена: CheckBox1,
CheckВох2 и т.д. С помощью свойства Name можно присвоить
флажку новое имя. Свойство Caption позволяет установить
83
текст, который будет появляться рядом с элементом управления
CheckBox. Если заголовок флажка очень длинный, то можно
разместить его в нескольких строках, присвоив свойству
WordWrap значение True.
Описать работу элемента управления CheckBox можно с
помощью следующих инструкций:
Public Sub CheckBox1_Click()
If CheckBox1.Value=True Then
' инструкции 1
else
'инструкции 2
End If
End Sub
8.2.2.7 Переключатель (OptionButton)
Элемент управления OptionButton предназначен для выбора
одного варианта из нескольких. В любое время в группе может
быть выбран только один переключатель. Отмена выбора одного элемента управления OptionButton при выделении другого
осуществляется автоматически.
По умолчанию переключатели имеют имена OptionButton1,
OptionButton2 и т.д.
Группировка переключателей может быть выполнена двумя
способами:
• С помощью элемента управления Рамка (Frame). Все
объекты управления OptionButton, расположенные в одной рамке, рассматриваются как члены одной группы. Для каждого
набора переключателей должна использоваться своя рамка.
• С помощью свойства для группировки объектов –
GroupName. При выборе элемента управления OptionButton отменяется выбор всех переключателей, значение свойства
GroupName которых совпадает со значением того же свойства
выделенного элемента управления OptionButton. При использовании свойства GroupName отпадает необходимость в создании
элемента управления Frame. Свойство GroupName может быть
установлено как в окне свойств, так и в программе.
84
Свойство Value выбранного переключателя имеет значение
True.
Процедура, описывающая работу трех переключателей,
может иметь вид:
Public Sub CheckOptionButton()
If OptionButton1.Value Then
' инструкции 1
Elself OptionButton2.Value Then
' инструкции 2
Elself OptionButton3.Value Then
' инструкции 3
End If
End Sub
8.2.2.8 Рамка (Frame)
Элемент управления Frame предназначен для группирования элементов в форме. По умолчанию рамки имеют имена
Frame1, Frame2 и т.д. Установить новое значение имени рамки
можно с помощью свойства Name. Свойство Caption определяет
текст, который появляется вверху рамки. Например:
Frame1. Сарtioп = "Варианты заданий"
8.2.2.9 Счетчик (SpinButton)
Одновременно с элементом управления SpinButton (Счетчик) необходимо создать элемент управления TextBox (Поле),
значение которого будет меняться с помощью этого счетчика.
Можно изменять размеры счетчика SpinButton в форме, растянув его границы. Также можно изменить направление стрелок
на элементе управления SpinButton (с вертикального на горизонтальное), изменив пропорции счетчика.
При нажатии кнопок счетчика возникают события:
Private Sub SpinButton1_SpinUp()
…
End Sub
и
85
Private Sub SpinButton1_SpinDown()
…
End Sub
События SpinUp (Вверх), SpinDown (Вниз) предназначены
для изменения значения в связанном со счетчиком элементе
управления.
Свойство Value счетчика автоматически изменяется при
нажатии на кнопку.
Процедуры, в которых при нажатии кнопки счетчика присваивается значение связанному со счетчиком объекту (полю
TextBox), могут быть записаны как
Private Sub SpinButton1_SpinUp()
TextBox1.Value = SpinButton1.Value
End Sub
и
Private Sub SpinButtonl_SpinDown()
TextBoxl.Value= SpinButtonl.Value
End Sub
Элемент управления SpinButton имеет три свойства, которые используются при изменении его значения:
• Мах – определяет максимальное значение элемента
управления SpinButton;
• Min – определяет минимальное значение элемента
управления SpinButton;
• Value – определяет текущее значение элемента управления SpinButton, изменяется при нажатии кнопки счетчика.
Значения этих свойств могут быть заданы как в окне
свойств, так и в коде программы.
8.2.2.10 Выключатель (ToggleButton)
Элемент управления ToggleButton создает кнопку с двумя
состояниями: Включено и Выключено. Внешне выключатель
напоминает кнопку, однако щелчок по выключателю меняет его
состояние, и этим он похож на флажок. Свойство Value элемен-
86
та ToggleButton может принимать одно из трех значений: True,
False, Null.
Работа переключателя может быть описана с помощью следующих процедур:
Public Sub ToggleButton1_Click()
If ToggleButton1.Value then
' операторы 1
else
' операторы 2
End If
End Sub
Public Sub My_Work()
Work_project(ToggleButton1.Value)
End Sub
Также можно поместить в форму полосу прокрутки
ScrollBar и набор вкладок TabStrip.
Форма может включать произвольное количество элементов управления. На рис. 8.2 показано завершенное диалоговое
окно.
Рис. 8.2  Пример диалогового окна
87
8.2.3 Пример: инициализация значений элементов
управления
При отображении формы требуется ввести значения полей,
применяемые по умолчанию, чтобы облегчить работу пользователя. Инициализация выполняется с помощью процедуры обработки события формы Initialize.
В данной процедуре необходимо установить значения свойства Теxt для всех полей диалогового окна. В простейшем случае требуется ввести элементы управления Пустые строки.
Кроме того, можно задать значение свойства Value для переключателей или флажков. И, наконец, если имеется значение по
умолчанию для объектов со списками, требуется указать значение свойства Listlndex для этих элементов управления. Приведем пример процедуры инициализации (рис. 8.3).
Рис. 8.3  Результат выполнения процедуры инициализации
Private Sub UserForm_Initialize()
'Инициализация каждого поля пустой строкой.
txtExpAmount.Text = "" ' Поле Сумма
txtExpDescription.Text = ""
' Поле Описание
' Инициализация списка Статья расходов
drpExpCategory.AddItem "Покупка"
drpExpCategory.AddItem "Погрузка"
drpExpCategory.AddItem "Отправка"
drpExpCategory.AddItem "Перевозка"
With frmExpense
88
.txtExpDate.Text = Format(Now(),"mm/dd/yy") ' Поле Дата
.drpExpCategory.Listlndex = 2 'Список Статья расходов
End With
End Sub
8.2.4 Отображение диалоговых окон
Для отображения формы используется метод Show. Его выполнение можно связать с командой меню, кнопкой панели инструментов или кнопкой в форме. Синтаксис данного метода
является следующим:
Form_object.Show
Параметр Form_object – имя отображаемой формы. Приведем пример использования метода Show. Следующая процедура
связана с нажатием кнопки, размещенной на рабочем листе:
Sub CmdAddExpense_Click()
frmExpense.Show
End Sub
8.2.5 Пример: проверка условий на значение полученных
данных из формы
После вывода формы и задания значений, вероятно, потребуется проверить введенные данные. Например, следует убедиться, что информация, введенная в элементы управления,
принадлежит некоторому диапазону допустимых значений.
Данный процесс называется проверкой условий на значение.
Если введенные данные правильны, требуется сохранить их
и скрыть диалоговое окно. В противном случае, необходимо вывести сообщение и передать фокус объекту, содержащему недопустимую информацию. Рекомендуется связать проверку условий на значение с нажатием кнопки ОК. 3акончив ввод, пользователь нажимает клавишу <Enter> или кнопку ОК. Если кнопке
назначена подпрограмма проверки данных, то необходимо присвоить значение True свойству Default этой кнопки. Таким образом, можно задать запуск процедуры обработки события Click,
если пользователь нажимает клавишу <Enter>.
89
Если в форму введена неверная информация, то обычно
отображается сообщение, аналогичное показанному на рис. 8.5,
а затем с помощью метода SetFocus фокус передается элементу
управления, содержащему недопустимую информацию.
Рис 8.5  Сообщение о вводе неправильной информации
После ввода требуется сохранить данные. Обычно для этого
требуется присвоить значение, содержащееся в элементе управления, свойству Value требуемого диапазона. Информация, введенная в поле, хранится в свойстве Text, значения переключателей, списков и флажков – в свойстве Value. Кроме того, может
потребоваться сохранить в диапазоне вместо значений флажков
строки, например, «Да» или «Нет». При этом следует воспользоваться инструкцией If. Необходимо отметить, что если занести
в диапазон значение свойства Value, то записывается значение
типа Boolean. Приведем пример сохранения на рабочем листе
Excel введенных в форму данных:
Private Sub cmdExpOK_Click()
If txtExpDescription.Text = "" Then
MsgBox "Введите описание."
'Метод SetFocus используется для передачи фокуса
'указанному объекту.
txtExpDescription. SetFocus
Else
'Необходимо создать новую строку, чтобы
'ввести в нее данные.
Worksheets("Лист1").Range("A6").EntireRow.Insert
'Сохранение значений элементов управления формы
'на рабочем листе
Worksheets("Лист1").Range("A6").Value = drpExpCategory
Worksheets("Лист1"). Range("B6").Value = _
90
txtExpDescription.Text
Worksheets("Лист1").Range("C6").Value = txtExpAmount.Text
Worksheets("Лист1").Range("D6").Value = txtExpDate.Text
'Скрытие формы.
frmExpense.Hide
End If
End Sub
Обратите внимание, что после сохранения данных выполняется скрытие формы с помощью метода Hide.
Теперь необходимо написать процедуру обработки события
Cancel кнопки Отмена. Обратите внимание, что следует присвоить значение True свойству Cancel данной кнопки, чтобы событие Cancel возникало как при щелчке по кнопке Отмена, так
и при нажатии клавиши <Esc>. Чтобы скрыть форму, требуется
только одна строка:
Private Sub cmdExpCancel_Click()
frmExpense.Hide
End Sub
91
9 ОБЪЕКТЫ. КЛАССЫ. МЕТОДЫ И СВОЙСТВА
ОБЪЕКТОВ
9.1 Объекты и классы
Как отмечалось ранее, VBA относится к языкам объектноориентированного программирования (ООП), которое можно
описать как методику анализа, проектирования и написания
приложений с помощью объектов. Что такое объект? Объект
позволяет рассматривать данные вместе с кодом, предназначенным для их обработки, т. е. объединить их в нечто целое, именуемое объектом. Класс является обобщением понятия тип данных и задает свойства и поведение объектов класса – экземпляров класса. Каждый экземпляр объекта принадлежит некоторому классу. Отношение между объектом и его классом такое же,
как между переменной и ее типом. Класс – это объединение
данных и обрабатывающих их процедур и функций. Данные
называются также переменными класса, а процедуры и функции
– методами класса или методами объекта. Переменные определяют свойства объекта, а совокупность их значений – его состояние.
Программирование в классах – основной способ современного программирования. За примерами далеко ходить не нужно.
Так устроена операционная система Windows, – окно является
ее основным объектом. Сам Office 2000 полностью построен на
классах и работе с объектами этих классов – здесь все, начиная
от отдельного символа и заканчивая приложением, рассматривается как объект некоторого класса. Профессиональный прикладной программист, работающий в некоторой проблемной
области и решающий разнообразные задачи из нее, как правило,
начинает с создания классов, описывающих специфику данной
проблемной области. Затем уже решение тех или иных специальных задач он описывает в терминах работы с объектами данной проблемной области.
92
9.2 Объекты OLE и ActiveX
В VBA используется механизм OLE (Object Linking and
Embedding – связывание и внедрение объектов), который позволяет взаимодействовать с любыми программами, поддерживающими OLE. Примером элементов, которые можно интегрировать при помощи механизма OLE, являются вставляемые объекты OLEObject, создаваемые, например, при помощи программ
WordArt, ClipArt и т.д. Все OLE-объекты рабочего листа образуют семейство OLEObjects. Вручную в рабочий лист OLEобъекты вставляются командой Вставка/Объект с выбором в
появившемся диалоговом окне Вставка объекта из списка на
вкладке Создание внедряемого объекта. OLE-объект отличается
от обычного тем, что при выборе внедренного объекта (при перемещении на него указателя и щелчке кнопкой мыши) активизируется программа, связанная с этим объектом, и меню приложения заменяется меню программы, его создавшей. Теперь
можно, не выходя из основного приложения, работать с данным
объектом, редактируя и видоизменяя его средствами создавшей
его программы. Кроме того, OLE-технология обладает так называемым свойством Automation, с помощью которого можно
устанавливать свойства, применять методы и обрабатывать события внедренных объектов как обычных объектов приложения.
С 1996 г. фирма Microsoft ввела новую терминологию, и теперь то, что раньше именовалось OLE-объектом, называется
объектом ActiveX, a OLE Automation называется ActiveX
Automation.
9.3 Иерархия объектов
Объектная библиотека VBA содержит более 100 различных
объектов, находящихся на разных уровнях иерархии. Иерархия
определяет связь между объектами и показывает пути доступа к
ним (рис. 9.1).
Иерархия позволяет определить доступ к объектам. Полная
ссылка на объект состоит из ряда имен вложенных последовательно друг в друга объектов. Разделителями имен объектов в
этом ряду являются точки. Рассмотрим на примере иерархиче-
93
ской модели Excel. Ряд начинается с объекта Application и заканчивается именем самого объекта. Например, полная ссылка
на ячейку А1 рабочего листа Лист1 рабочей книги с именем
Кафедра имеет вид:
Application.Workbooks("Кафедра").Workheets("Лист1").Range("Al")
Производить каждый раз полную ссылку на объект необязательно. Обычно достаточно ограничиться только неявной
ссылкой на объект. В неявной ссылке, в отличие от полной, объекты, которые активны в данный момент, как правило, можно
опускать. В рассмотренном случае, если ссылка на ячейку А1
дана в программе, выполняемой в среде Excel, то ссылка на объект Application может быть опущена, т. е. достаточно привести
относительную ссылку:
Workbooks("Кафедра").Worksheets("Лист1").Range("A1")
Если рабочая книга Кафедра является активной, то ссылку
можно записать еще короче:
Worksheets("Лист1").Range("A1")
Если и рабочий лист Лист1 активен, то в относительной
ссылке вполне достаточно ограничиться упоминанием только
диапазона А1:
Range("A1")
9.4 Методы
Объект сам по себе не представляет большого значения.
Намного значительнее то, какие действия можно совершать над
объектом и какими свойствами он обладает. Метод как раз и
представляет собой действие, выполняемое над объектом.
Синтаксис применения метода:
Объект.Метод
Например, при помощи метода Quit (Закрыть) закрывается
приложение (объект Application):
94
Application.Quit
Метод можно применять ко всем объектам семейства.
Например, к семейству chartobjects (Диаграммы) рабочего листа
Лист1 применен метод Delete (Удалить), который приводит к
удалению всех диаграмм с рабочего листа Лист1:
Worksheets("Лист1").ChartObjects.Delete
9.5 Свойства
Свойство представляет собой атрибут объекта, определяющий его характеристики, такие, как размер, цвет, положение на
экране и состояние объекта, например, доступность или видимость. Чтобы изменить характеристики объекта, надо просто
изменить значения его свойств.
Синтаксис установки значения свойства:
Объект.Свойство = ЗначениеСвойства
В следующем примере изменяется заголовок окна Excel посредством задания свойства Caption объекту Application:
Application.Caption = "База данных"
Свойство можно изменять сразу у всех объектов семейства.
Например, с помощью установки свойства Visible (Видимость)
значения False (Ложь) все рабочие листы активной книги (семейство объектов Worksheets) скрываются:
Worksheets.Visible = False
9.6 Событие
Наряду со свойствами и методами, с классом связывается
еще одно понятие – событие. Событие представляет собой действие, распознаваемое объектом (например, щелчок мышью или
нажатие клавиши), для которого можно запрограммировать отклик. События возникают в результате действий пользователя
или программы, или же они могут быть вызваны системой.
95
Суть программирования на VBA как раз и заключается в
этих двух понятиях: событие и отклик на него. Если пользователь производит какое-то воздействие на систему, например,
нажимает кнопку, тогда в качестве отклика выполняется код
созданной пользователем процедуры. Если такой отклик не создан, т. е. не написана соответствующая процедура, то система
никак не реагирует на данное событие, и оно остается безответным. Таким образом, действия, происходящие в системе, являются событиями, а отклики на них – процедурами. Этот специальный вид процедур, генерирующих отклик на события, называется процедурами обработки событий. В целом программирование на VBA состоит в создании кода программ, которые генерируют прямо или косвенно отклики на события.
В рамках данного курса изучаются основы программирования в приложениях Office: Word и Excel. В первой части (Автоматизация работы в Word) рассматриваются вопросы создания
макросов, во второй части (Автоматизация работы в Excel) рассматриваются вопросы создания проекта VBA с использованием
модели объектов Excel.
96
10 АВТОМАТИЗАЦИЯ РАБОТЫ В WORD
С ПОМОЩЬЮ VBA
10.1 Программирование на макроязыке Visual
Basic для приложений
При создании проекта VBA используется один из трех методов:
1) запись макроса при помощи MacroRecorder (автоматическая запись макросов) с последующим его редактированием,
2) создание макроса в редакторе VBA,
3) создание проекта в VBA.
Автоматическая запись макросов дает возможность сохранить последовательность действий пользователя в виде макрокоманд и использовать их в дальнейшем как программу на макроязыке VBA. При записи макроса создается код, который можно просмотреть и отредактировать. Приемы создания макросов
рассмотрим на примере приложения Microsoft Word.
10.2 Автоматическое создание макросов
Макросы Microsoft Word хранятся в шаблоне документа.
Шаблон – это специальный файл Microsoft Word с расширением
.DOT, где хранится информация о стилях оформления документа, настройках, макросах и пользовательских инструментальных
панелях. По умолчанию используется общий шаблон
NORMAL.DOT, в который записываются макросы. Можно для
своих документов создать другой шаблон под произвольным
именем и записывать туда вновь созданные макросы. Эти макросы будут доступны только из документа, открытого в этом
шаблоне.
Чтобы записать макрос, необходимо выполнить следующие
шаги:
1. Выбрать пункт меню Сервис\Макрос\Начать запись.
2. В окне ввода Имя макроса введите имя макроса, например, Мой_макрос (рис. 10.1).
3. С помощью кнопок Назначить макрос панели или клавишам поставить создаваемому макросу для быстрого вызова в
97
соответствие свою кнопку на панели инструментов или «горячую клавишу» на клавиатуре.
4. В строке ввода Макрос доступен для выбрать шаблон, с
которым требуется связать создаваемый макрос.
5. Щелкнуть по кнопке ОК, чтобы перейти в режим записи
макроса.
После выполнения этих шагов система переходит в режим
протоколирования действий пользователя. Каждое действие записывается в виде команд Visual
Basic. При этом манипулятор
мышь можно использовать только
для выбора команд меню и кнопок
на панелях инструментов. Все
остальные действия (выделение
Рис. 10.1  Окно Запись
фрагментов текста, таблицы и
макроса
т.п.) выполняются с помощью
клавиатуры.
Во время записи макроса на экране находится панель Остановка записи макроса, на которой находятся две кнопки:
СТОП и ПАУЗА (рис . 10.2). Первая прекращает запись макроса,
а вторая приостанавливает запись. Вторая кнопка используется
только тогда, когда не все действия пользователя требуется записать в макрос.
Рис. 10.2  Кнопка остановки
записи макроса
10.3 Просмотр и корректировка и удаление макросов
Для просмотра тела макроса необходимо выбрать его имя
из списка макросов в окне Макрос и нажать кнопку Изменить.
На экране появится окно редактора Visual Basic. В нем в виде
команд Visual Basic представлены все действия пользователя
98
при записи макроса. Для примера рассмотрим макрос, в котором
производилась работа с текстом (рис. 10.3).
Первая строка нашего кода – это запись текста.
Вторая строка – переключение клавиатуры для набора английского текста.
Третья строка – запись текста.
Четвертая строка – нажатие клавиши ENTER, новый абзац.
Для редактора макрос является простым текстом, который
можно редактировать как обыкновенный документ, то есть
вставлять новые строки, удалять, копировать и переносить ранее
записанные строки макроса и т.д.
Рис. 10.3  Текст макроса в окне редактора Visual Basic
Чтобы удалить макрос, необходимо выбрать его имя из
списка макросов в окне Макрос и нажать на кнопку Удалить.
10.4 Создание макросов в редакторе VBA
Довольно часто макросы создаются непосредственным
набором текста в редакторе VBA. Почему?
Приведем следующие аргументы:
1) во-первых, в некоторых случаях средство автоматической записи макросов не может решить поставленную задачу.
99
Например, нельзя записать нажатия клавиш, выполненные в
другом приложении. В то же время одна из важнейших характеристик VBA – это возможность использования в любом приложении, поддерживающем VBA;
2) во-вторых, мышь используется только для выбора команд меню и работы в диалоговых окнах. Например, нельзя
воспользоваться мышью, чтобы выделить текст;
3) в-третьих, команды отмены и нажатия клавиши
<Backspace> не записываются. Хотя текст макросов, при записи
которых отменялись побочные действия, укорачивается, однако,
при этом становится и возможной запись команд отмены и
нажатий клавиши <Backspace>, если они действительно нужны.
Кроме того, с помощью VBA можно создавать более короткие макросы. Предположим, требуется создать макрос, который
только выделяет выбранный текст синим цветом. Для запуска
средства автоматической записи пользуйтесь командой Сервис\Макрос\Начать запись (Tools\Macro\Record), задайте имя
макроса (например, «Blue»), а затем нажмите кнопку OK
(Record).
Затем
выберите
команду
Формат\Шрифт
(Format\Font) и укажите цвет шрифта. Посмотрите, сколько текста содержится в созданном макросе!
Sub Blue()
'
' Blue Макрос
' Макрос записан 01.02.2004 Alex Potahov
'
With Selection.Font
.Name = "Times New Roman"
.Size = 12
.Bold = False
.Italic = False
.Underline = wdUnderlineNone
.UnderlineColor = wdColorAutomatic
.StrikeThrough = False
.DoubleStrikeThrough = False
.Outline = False
.Emboss = False
.Shadow = False
.Hidden = False
100
.SmallCaps = False
.AllCaps = False
.Color = wdColorSkyBlue
.Engrave = False
.Superscript = False
.Subscript = False
.Spacing = 0
.Scaling = 100
.Position = 0
.Kerning = 0
.Animation = wdAnimationNone
End With
End Sub
Только небольшая часть данного макроса относится к требуемому действию. Выполнение же остальных команд процедуры может привести к нежелательным последствиям. Поясним
это утверждение. Предположим, что выбранное слово выделено
курсивом или шрифтом. Поскольку данный макрос выполняет
также установку начертания и гарнитуры (эти параметры были
установлены в диалоговом окне Шрифт (Font)), то макрос изменит цвет слова, а также установит другое начертание и шрифт.
Обратите внимание, что выполнение макросов или процедур VBA, в которых указана избыточная информация, может
привести к нежелательным результатам. Поэтому после записи
макроса убедитесь, что в нем используются только нужные
свойства и методы объекта.
Из данной ситуации имеются два выхода: можно создать
макрос в VBA, не прибегая к автоматической записи, либо использовать редактор Visual Basic, чтобы удалить ненужные
строки. В последнем случае довольно просто найти подлежащие
уничтожению инструкции. Например, параметры, описывающие
шрифт, перечисляются ниже строки with Selection.Font, поэтому
все, что необходимо сделать – это запустить редактор VBA и
уничтожить инструкции, которые не относятся к цвету символов.
Конечная версия макроса лаконична и изменяет только требуемые параметры. Конечно, если необходимо кроме цвета символов установить для выделенного текста другой шрифт, то сле-
101
дует оставить в записанном макросе строку, устанавливающую
шрифт. Необходимо отметить, что если параметр не указан, то
он не изменяется.
Sub Blue()
'
' Blue Макрос
' Макрос записан 01.02.2004 Alex Potahov
'
With Selection.Font
.Color = wdColorSkyBlue
End With
End Sub
Для рассмотренного примера выявить ненужные строки в
макросе довольно просто. Однако для написания более сложных
процедур, которые нельзя создать с помощью средства автоматической записи, можно сразу воспользоваться редактором VBA
добавить соответствующие модуля кода.
10.5 Добавление модуля VBA в шаблон
Добавить модуль VBA в шаблон довольно просто: откройте
требуемый шаблон, а не документ, основанный на этом шаблоне, и создайте модуль, выбрав команду Сервис\Макрос\Редактор Visual Basic (Tools\Macro\Visual Basic Editor), а
затем команду Вставка\Модуль (Insert\Module). Обратите внимание, что в шаблон нельзя добавить формы, однако созданные
модули можно использовать для запуска форм.
После создания модуля можно связать макросы, находящиеся в нем, кнопками панелей инструментов, командами меню
или нажатием комбинации клавиш, воспользовавшись командой
Сервис\Настройка (Tools\Customize). В независимости от того
будет ли это сделано или нет, макрос является частью шаблона,
а указанный шаг позволяет только упростить запуск макроса.
Приведем пример добавления макроса:
1. Скопируйте требуемый шаблон и назовите копию
TESTTEMPLATE.DOT.
2. Откройте файл TESTTEMPLATE.DOT.
102
Примечание. Чтобы добавить модуль в шаблон, требуется
открыть файл с расширением DOT. Если вставить модуль в связанный с шаблоном документ, то модуль сохраняется в документе, а не в шаблоне.
3. Выберите команду Сервис\Макрос\Макросы для открытия диалогового окна Макросы (Macros).
4. Нажмите кнопку Создать (Create) для запуска редактора
Visual Basic (рис. 10.4.)
Рис. 10.4  Тело нового макроса
5. Введите инструкции в тело нового макроса. При необходимости создайте также другие процедуры.
6. Сохраните модуль в шаблоне, нажав на панели инструментов кнопку Сохранить (Save), либо выбрав команду
Файл\Сохранить (File\Save).
По умолчанию все создаваемые макросы записываются в
шаблон NORMAL.DOT. Чтобы добавить процедуры в другой
шаблон, необходимо предварительно сохранить его в папке
MICROSOFT OFFICE\ШАБЛОНЫ.
103
10.6 Какие файлы присоединены к шаблону?
В Visual Basic в отличие от VBA файлы проекта (с расширением VBP) можно преобразовать в исполняемые файлы. Макросы VBA хранятся в файлах с расширением BAS. Именно они
присоединены к шаблонам (или документам), а не к формам или
модулям класса.
Иерархия шаблонов
Следует отметить, что на документ могут влиять несколько
шаблонов. Шаблон, на котором основан документ, содержит
набор одних установок, а глобальный шаблон NORMAL.DOT
может содержать другое множество установок (предполагая, что
документ не базируете на этом шаблоне). Кроме того, могут
быть загружены также и другие глобальные шаблоны. В этом
случае может оказаться, что в разных шаблонах совпадают имена модулей и т.п.
При разрешении данных конфликтов используется иерархия шаблонов. В зависимости от характера связи шаблона с документом, установки шаблона отменяют или не отменяют установки другого шаблона для этого документа. Иерархия выглядит следующим образом:
 шаблон, присоединенный к активному документу (верхний уровень);
 обычный шаблон;
 другие глобальные шаблоны;
 надстройки;
 уровень приложения.
Таким образом, установки в шаблоне, присоединенном к
документу, имеют наиболее высокий приоритет.
Примечание. Существующая иерархия шаблонов является
причиной распространения вирусов в макросах Word. Вирусы
часто носят имя стандартной функции Word (например,
FileOpen), но поскольку они являются частью шаблона, присоединенного к файлу, то они отменяют выполнение стандартной
104
процедуры FileOpen. Если создать макрос с тем же именем, что
и стандартный, то исполняется новая процедура.
10.7 Автоматизация решения типичных задач
Рассмотрим прмеры создания макросов, с помощью которых можно решить типичные задачи.
10.7.1 Отображение диалогового окна при запуске
После запуска Word автоматически создает новый документ. Однако в большинстве случаев необходимо возвратиться к
редактированию сохраненного документа, а не работать с новым
файлом. Чтобы отобразить диалоговое окно Открытие документа (Open) при запуске Word, создайте следующий макрос:
Sub OpenFile()
'
' OpenFile Макрос
'Макрос записан 20.03.2001 Потахов А.П.
'
Dialogs(wdDialogFileOpen).Show
End Sub
Простое, но верное решение. Макрос OpenFile добавляется
в шаблон. Чтобы задать выполнение этой процедуры при запуске Word, щелкните правой кнопкой мыши по кнопке Word, расположенной на панели Microsoft Office, для вывода свойств, а
затем добавьте строку /m OpenFile в поле Файл.
Параметр /m можно использовать для предотвращения выполнения любого макроса при запуске Word. Это особенно полезно, если имеются подозрения, что обычный шаблон заражен
вирусами.
10.7.2 Выделение слов предметного указателя
Обычно выделение слов, входящих в предметный указатель, приносит одну головную боль. В большинстве случаев не
105
достаточно только пометить, на какой странице находится фраза: необходимо выявить все вхождения термина, чтобы поместить в указателе ссылку на интервал страниц.
Данная задача несколько сложнее, чем предыдущая, поэтому необходимо определить порядок действий:
 Ввести слово, которое требуется выделить.
 Найти все вхождения заданного слова в документе, игнорируя частичные совпадения. Если требуется отыскать именно слово «NT», например, в «Windows NT», то необходимо отсеять все комбинации символов «nt».
 Выделить все вхождения слова.
Если требуется просто воспользоваться командой Заменить все (Replace All), чтобы заменить все вхождения определенного слова, то макрос не так уж сложен:
Sub IndexColor ()
' IndexColor Макрос
' Макрос записан 20.03.2001 Потахов А.П.
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.ColorIndex = wdRed
With Selection.Find
.Text = "Алекс"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = True
.MatchWholeWord = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Данный макрос находит все вхождения слова "Алекс" (но не
"алекс" "АЛЕКС" или "Александр") и выделяет их красным цветом. Чтобы выделить в документе другой термин, требуется
106
внести исправления в макрос, заменив слово "Алекс". Таким образом, чтобы не вносить изменения в макрос в каждом случае,
следует добавить в процедуру инструкции для ввода данных.
Чтобы ввести данные, можно добавить в модуль форму.
Однако для ввода фразы достаточно и стандартного диалогового
окна InputBox, которое предназначено для задания строки:
Dim Message, Title, Default, IndexWord
Message = "Какое слово требуется выделить?"
Title = "Ввод термина"
Default = ""
' Вывод сообщения, заголовка и значения по умолчанию.
IndexWord = InputBox(Message, Title, Default)
В приведенном фрагменте сначала описываются используемые переменные, а затем они инициализируются. Обратите
внимание на переменную IndexWord. Она определяет текст, который заменяется командой Заменить все.
Объединив вышеприведенный макрос и указанный фрагмент, получаем:
Sub IndexColor ()
' IndexColor Макрос
'Макрос записан 20.03.2001 Потахов А.П.
Dim Message, Title, Default, IndexWord
Message = "Какое слово требуется выделить?"
Title = "Ввод термина"
Default = ""
' Вывод сообщения, заголовка и значения по умолчанию.
IndexWord = InputBox(Message, Title, Default)
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.ColorIndex = wdRed
With Selection.Find 'Поиск заменяемого текста.
.Text = IndexWord
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue 'Данная строка определяет
' замену слова во всем тексте
107
.Format = True
.MatchCase = True
.MatchWholeWord = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
При запуске данного макроса выводится приглашение на
ввод требуемого термина (рис. 10.5).
Рис. 10.5  Диалоговое окно Ввод термина
10.7.3 Выбор принтера
Приведем еще один простой пример. Создадим макрос, с
помощью которого можно выбрать принтер для печати документа, а также добавим форму, содержащую указание не печатать без крайней необходимости на цветном принтере. Предположим, что загружено два драйвера принтера. В данном примере
используются черно-белый принтер HEWLETT-PACKARD
LaserJet 4 и цветной принтер HEWLETT-PACKARD DeskJet
550C. Если у вас в распоряжении находятся другие принтеры,
просто измените информацию, относящуюся к типу принтеров.
Если на компьютере установлен только один драйвер принтера, добавьте еще один, воспользовавшись командой меню
Пуск (Start) Настройка\Принтеры (Settings\Printers). Для нормальной работы макроса не требуется печатать на принтере или
108
подключать его. Просто необходимо задать в Word использование двух принтеров.
До настоящего момента можно было обойтись без форм.
Однако не все стандартные диалоговые окна справляются с поставленной задачей. Поэтому построим диалоговое окно на основе формы.
1. Откройте шаблон или документ, в который требуется
добавить макрос. Выберите команду Сервис\Макрос\Макросы, введите в поле Имя Maкроса (Macro Name) имя
"ChoosePrinter", а затем нажмите кнопку Создать для запуска
редактора Visual Basic.
2. Выберите команду Вставка\Форма (Insert\UserForm),
чтобы создать форму и открыть ее. В случае необходимости выберите команду Вид\Панель элементов управления
(View\Toolbox) для вывода панели элементов управления.
3. В окне свойств измените имя формы на "frmPrinter" и
введите ее заголовок Выбор принтера.
4. Разместите в форме переключатель. Присвойте ему имя
"optColor" и задайте связанную с ним надпись Цветной принтер. Создайте еще один переключатель, назвав его "optLaser" и
задав заголовок Лазерный принтер.
В данном случае переключатели, а не флажки, используются для того, чтобы пользователь не смог выбрать два принтера
одновременно.
5. Поскольку печать на цветном принтере стоит недешево,
необходимо напомнить пользователям о том, что принтер не
следует использовать для черновиков. Разместите в форме
надпись, а затем задайте ей "lblPrintInfo" и текст "Внимание:
цветной принтер используется только для окончательных распечаток!".
6. Разместите в форме кнопку. Задайте ей имя "cmdOK" и
надпись OK. Чтобы предусмотреть возможность закрыть диалоговое окно, не выполняя действий, создайте кнопку "cmdCancel"
и укажите для нее надпись Отмена.
Созданная форма выглядит примерно так, как показано на
рис.10.6. Теперь следует связать с ее элементами выполнение
требуемых действий.
109
Рис. 10.6  Созданное диалоговое окно Выбор принтера
1. Откройте диалоговое окно Принтеры (Printers), выбрав
команду Пуск\Настройка\Принтеры для вывода имен установленных принтеров. Не требуется знать номера и типы принтеров, достаточно только помнить их названия, например:
"Цветной принтер" и "Обычный принтер".
2. Запустите редактор Visual Basic из Word, щелкните правой кнопкой мыши по переключателю optСolor и выберите из
контекстного меню команду Программа (View Code). Открывается окно модуля.
3. В процедуре Сlick для переключателя optColor введите
инструкцию ActivePrinter = "Цветной Принтер". Процедура
должна выглядеть следующим образом:
Private Sub optColor_Click()
ActivePrinter = "Цветной Принтер"
End Sub
4. Откройте форму, выберите переключатель optLaser и выполните то же самое для него, указав в инструкции строку "Лазерный принтер".
5. Откройте окно модуля для кнопок cmdOK и cmdCancel и
введите в процедуры обработки их события Click инструкцию
frmPrinter.Hide для закрытия формы при нажатии этих кнопок.
В подпрограмму для кнопки cmdCancel добавьте также строку
cmdCancel.Cancel = True,
110
чтобы закрыть форму, не сохраняя произведенных изменений.
Форма почти готова. Сохраните проект. Полная распечатка
текста процедур выглядит следующим образом:
Private Sub cmdCancel_Click()
frmPrinter.Hide
cmdCancel.Cancel = True
End Sub
Private Sub cmdOK_Click()
frmPrinter.Hide
End Sub
Private Sub optLaser_Click()
ActivePrinter = "Лазерный принтер"
End Sub
Private Sub optColor_Click()
ActivePrinter = "Цветной принтер"
End Sub
Теперь можно запустить форму из редактора Visual Basic.
Чтобы запустить ее из Word, требуется модуль: как уже отмечалось ранее, Word не добавляет формы к списку макросов. Откройте окно проекта в редакторе VBA, щелкните правой кнопкой мыши по требуемому проекту и выберите команду Вставка\Модуль (Insert\Module). Назовите модуль "ChoosePrinter" и
создайте подпрограмму, содержащую только одну строку:
frmPrinter.Show
Данная инструкция отображает созданную форму. Забыв
про это, вы потратите массу времени, задаваясь вопросом, почему форма видна в организаторе макросов, но ее нельзя вывести. Однако, используя новый модуль, можно отобразить готовую форму (рис. 10.7).
111
Рис. 10.7  Диалоговое окно Выбор принтера (в режиме выполнения)
Совет. Чтобы упростить запуск макроса, можно связать его
с командой меню или кнопкой панели инструментов.
112
11 АВТОМАТИЗАЦИЯ РАБОТЫ В EXCEL С
ПОМОЩЬЮ VBA
11.1 Модель объектов Excel
Excel был первым офисным приложением, в котором VBA
использовался как язык разработки приложений. Модель объектов Excel совершенствуется в течение нескольких лет, а теперь
она стала более удобной и полной.
В модели объектов Excel имеются более 100 объектов и семейств. Не следует пугаться этого. Вероятно, окажется, что
приблизительно 10 процентов объектов и семейств достаточно,
чтобы выполнить 90 процентов всех возможных действий. Примерами наиболее часто используемых объектов и семейств являются объекты Application, Рабочая книга (Workbook) и Рабочие книги (Workbooks), Рабочий лист (Worksheet) и Рабочие листы Worksheets, а также объект Диапазон (Range). С помощью
только этих объектов и семейств можно произвести огромное
множество операций.
11.2 Использование объекта Application
Исходным элементом любой модели объектов Office является объект Application. Он представляет все приложение в целом. С помощью свойств и методов элемента Application можно
установить параметры работы программы, такие как задаваемые
с помощью команды Сервис/Параметры. В свойствах объекта
Application, например, Активная книга (ActiveWorkbook), Активный лист (ActiveSheet) и Активная ячейка (ActiveCell) хранится
информация об объекте, с которым в текущий момент работает
пользователь. Кроме того, данный объект имеет полезные методы, например, метод Application.InputBox, который удобнее, чем
стандартная функция VBA InputBox().
11.3 Использование свойств объекта Application
Как уже отмечалось выше, свойства объекта Application
позволяют задавать общие параметры работы приложения Excel.
Рассмотрим некоторые свойства элемента Application.
113
Рис. 11.1  Модель объектов Excel
Свойства ActiveWorkbook, ActiveSheet и ActiveCell. В данных свойствах хранится информация об активном объекте. Активный объект – это объект, с которым в текущий момент взаимодействует пользователь. Значение свойства ActiveCell хранится в свойстве ActiveSheet, а величина свойства ActiveSheet – в
свойстве ActiveWorkbook. Приведем пример использования
свойства ActiveCell:
114
With ActiveCell
.FontBold = True
.Value = "Отчет о продажах"
End With
Свойство Caption. В свойстве Caption объекта Application
хранится имя, которое появляется в заголовке окна приложения
Excel. Данное свойство доступно как для чтения, так и для установки. Если требуется скрыть, что приложение в действительности работает в Excel, то можно вместо значения "Microsoft
Excel" указать другую строку. Покажем, как устанавливается
значение свойства:
Application.Caption = "Корпорация АБВ. Продажи"
Чтобы вернуть заголовок "Microsoft Excel", укажите ключевое слово Empty:
Application.Caption = Empty
Свойство Cursor. Свойство Cursor используется для задания внешнего вида указателя мыши во время выполнения макроса. При задании значения данного свойства можно указать
одну из четырех констант Excel:
 Константа XlDefault определяет использование указателя, заданного по умолчанию в приложении Excel.
 Константа XlWait определяет использование указателя
мыши в виде песочных часов. Рекомендуется присвоить свойству Cursor это значение в начале обработки данных (например,
извлечения информации), чтобы сообщить пользователю, что
ему требуется подождать завершения операции.
 Константа XlNorthwestArrow используется реже. Она
определяет вывод указателя мыши в виде стрелки основного
режима.
 Константа XlIBeam используется также не очень часто.
Она определяет вывод указателя мыши в виде стрелки выделения текста.
Необходимо отметить, что после изменения свойства
Cursor необходимо установить исходный вид мыши, присвоив
свойству Cursor значение XlDefault, т.к. это не производится автоматически по завершении работы макроса.
115
Свойство DisplayAlerts. Если требуется отключить вывод
встроенных подсказок и предупреждений при выполнении макроса, необходимо присвоить значение False свойству
DisplayAlerts. В этом случае Excel производит стандартные действия, выбирая применяемый по умолчанию ответ на сообщения. Исходное значение свойства DisplayAlerts равно True. Если
макрос изменяет значение свойства DisplayAlerts, то перед
окончанием его работы требуется присвоить данному свойству
значение True.
Свойства DisployFormulaBar, DisplayScrollBars и DisplayStatusBar. Чтобы скрыть строку формулы, полосы прокрутки или строку состояния, требуется присвоить значение False
свойству
DisplayFormulaBar,
DisplayScrollBars
или
DisplayStatusBar соответственно. И, наоборот, для вывода требуемого элемента интерфейса необходимо присвоить значение
True соответствующему свойству. Значение по умолчанию для
данных свойств равно True.
Свойство EnableCancelKey. Обычно прерывание выполнения макроса осуществляется с помощью комбинации клавиш
<Ctrl>+<Break>. По умолчанию свойство EnableCancelKey равно значению xlInterrupt, которое допускает остановку процедуры пользователем для ее отладки или завершения. Если же требуется запретить прерывание выполнения, присвойте значение
xlDisabled или xlErrorHandler свойству EnableCancelKey.
Heoбxодимо отметить, что константу xlDisabled следует использовать с особой осторожностью. Если свойство EnableCancelKey
имеет данное значение, то выход из бесконечного цикла или
прерывание макроса невозможно. Таким образом, перед установкой свойства требуется убедиться, что процедура полностью
и тщательно отлажена.
Вместо константы xlDisable можно указать константу
xlErrorHandler. Если свойство EnableCancelKey равно данному
значению, то в выполняемой процедуре осуществляется переход
к процедуре обработки ошибки. При использовании константы
xlErrorHandler необходимо включить в макрос подпрограмму
обработки ошибки, указав инструкцию On Error GoTo. Hомер
116
ошибки, возникающей в результате нажатия комбинации клавиш <Ctrl>+<Break>, равен 18.
По завершении работы макроса свойству EnableCancelKey
автоматически присваивается значение xlInterrupt.
Свойство PathSeparator. Свойство PathSeparator доступно
только для чтения. В нем хранится символ разделителя используемого в системе: для Windows – наклонная черта (\), для
Macintosh – двоеточие (:). Данное свойство применяется, если
необходимо использовать приложения на обеих платформах.
Покажем применение свойства PathSeparator:
'Данный макрос открывает рабочую книгу temp.xls,
'находящуюся в текущем каталоге.
Dim strPath As String
'В свойстве Application.ThisWorkbook.Path хранится путь
'к рабочей книге, связанной с данной процедурой.
'Свойство Application.pathSeparator равно \ или :
'в зависимости от операционной системы.
StrPath = Application.ThisWorkbook.Path & Application.PathSeparator
'Переменная strPath является параметром метода Open
'семейства Workbooks. Данный метод открывает указанный
файл.
Workbooks.Open strPath & "temp.xls"
Свойство ScreenUpdating. Один из способов ускорить выполнение программы заключается в том, чтобы присвоить значение False свойству ScreenUpdating. Обычно этот метод применяется для макросов, которые отображают большое количество текста на рабочий лист. Если свойство ScreenUpdating равно False, то при выполнении макроса отключается вывод на
экран. В конце процедуры требуется присвоить значение True
свойству ScreenUpdating.
Свойство StatusBar. Свойство StatusBar позволяет задать
текст строки состояния. Рекомендуется применять данное свойство совместно со свойством Cursor. Приведем пример использования свойства StatusBar:
117
'Присвоить значение True свойству DisplayStatusBar,
'чтобы вывести строку состояния,
Application.DisplayStatusBar = True
'Установка текста строки состояния.
Application.StatusBar = "Обработка, пожалуйста, подождите.. "
'Замена обычного указателя мыши на песочные часы,
Application.Cursor = xlWait
'Вызов требуемой процедуры.
GetSalesData
'Восстановление обычного вида указателя.
Application.Cursor = xlDefault
'Восстановление стандартного текста строки состояния
Application.StatusBar = False
Свойство ThisWorkbook. В свойстве ThisWorkbook хранится ссылка на объект Workbook, являющийся рабочей книгой, в
которой содержится выполняемый макрос. Значение данного
свойства и свойства ActiveWorkbook необязательно совпадают.
Если в Excel открыто несколько рабочих книг, возможно, что в
свойстве ActiveWorkbook содержится ссылка на одну рабочую
книгу, а в свойстве ThisWorkbook – на другую, которая и содержит выполняющийся макрос. Покажем пример использования
свойств ThisWorkbook, если необходимо открыть рабочую книгу, которая находится в той же папке, что и рабочая книга, содержащая выполняющийся макрос:
Workbooks.Open Application.ThisWorkbook.Path & _
Application.PathSeparator & "SalesReport.xls"
Свойство UserName. В свойстве UserName хранится имя
текущего пользователя. Оно допускает как чтение, так и установку. Значение данного свойства по умолчанию равно содержимому поля Имя пользователя (UserName), находящееся во
вкладке Общие (General) диалогового окна Параметры
(Options) (для открытия данного диалогового окна выберите команду Сервис\Параметры).
118
Данное свойство можно использовать при создании файлов,
в названии которых участвует имя пользователя:
Sub FileNameMe()
Dim sUserName As String
Dim sMsgBoxPrompt As String
Dim sFileName As String
Dim iResponse As Integer
sUserName = Application.UserName
sMsgBoxPrompt = "Имя файла: " & sUserName & vbCrLf
sMsgBoxPrompt = sMsgBoxPrompt & "Использовать данное _
имя файла?"
iResponse = MsgBox(sMsgBoxPrompt, vbYesNo)
If iResponse = vbNo Then
sUserName = InputBox("Введите свое имя: ")
End If
sFileName = Application.Path & Application.PathSeparator & _
sUserName
ActiveWorkbook. SaveAs FileName:=sFileName
End Sub
Свойство Version. В свойстве Version хранится номер текущей версии Excel. Данное свойство используется для проверки того, что приложение выполняется в требуемой версии Excel,
например:
Sub WhatsMyVersion()
If Application.Version <> "8.0" Then
MsgBox "Для выполнения приложения требуется _
Microsoft Excel 8.0."
End If
End Sub
11.4 Использование методов объекта Application
В большинстве программ VBA, в которых используется
объект Application, обычно изменяются свойства этого объекта.
119
Однако также имеются несколько методов объекта Application,
требующие детального рассмотрения.
Метод Calculate. Если в Excel установлен режим вычислений вручную, можно использовать метод Calculate объекта
Application для принудительного выполнения вычислений во
всех открытых рабочих книгах. Метод имеет следующий синтаксис:
Application.Calculate
Метод Goto. Метод Goto позволяет выбрать требуемый
диапазон или процедуру Visual Basic в любой рабочей книге.
Отличие данного метода от рассматриваемого ниже метода
Select заключается в том, что метод Goto активизирует связанную с диапазоном или процедурой рабочую книгу, если она не
активна. Метод имеет следующий синтаксис:
Application.Goto Reference, Scroll
Параметр Reference необязательный аргумент, который используется для задания требуемого диапазона в формате R1C1
или для задания имени процедуры Visual Basic. Если данный
параметр опущен, то подставляется последний диапазон, который указывался в методе Goto.
Параметр Scroll также не обязателен. Если он равен True, то
после выполнения метода левый верхний угол заданного в методе диапазона выводится в левом верхнем углу окна.
Метод InputBox. Метод InputBox кажется похожим на
функцию InputBox(), но на самом деле имеет большие отличия.
Функция InputBox() возвращает только строку. Метод InputBox
имеет необязательный параметр type, который позволяет задать
тип введенных пользователем данных. Метод имеет следующий
синтаксис:
Application.InputBox(prompt, title, default, left, top, helpFile,_ helpContextID, type)
Параметр prompt – обязательный аргумент, определяющий
сообщение, которое требуется отобразить в окне ввода. Параметр title – дополнительный аргумент, который задает заголовок
окна. По умолчанию выводится заголовок «Ввод» (Input). Дру-
120
гим необязательным параметром является аргумент default. Он
определяет значение по умолчанию, которое нужно вывести в
окне. Параметры left и top – дополнительные параметры, которые определяют положение окна ввода по горизонтали и по вертикали относительно левого верхнего угла экрана. Параметры
helpFile и helpContextID – имена файла справки и контекстного
идентификатора в этом файле. Аргумент type определяет тип
данных, возвращаемый методом. Если аргумент type не задан, то
возвращается текст. В качестве значения данного аргумента
можно использовать значения, перечисленные в табл. 11.1.
Таблица 11.1  Значения параметра Type
Значение
0
1
2
4
8
16
64
Тип
Формула
Номер
Текст (строка)
Логическое значение (True или False)
Ссылка на ячейки, например, на объект
Range
Значение ошибки, например, #Н/А
Массив
Значения параметра type не являются последовательными,
поскольку в программе можно использовать их комбинацию.
Например, если необходимо задать ввод либо текста, либо чисел, следует присвоить данному параметру значение 1 + 2.
При нажатии кнопки ОК метод InputBox возвращает значение, введенное окно, при нажатии кнопки Отмена (Cancel) –
значение False. Приведем пример использования метода
InputBox, в котором показано, как данный макрос реагирует на
ввод текста или на нажатие кнопки Отмена:
Sub Input_example()
Dim hourly_wage As Currency
Dim num_of_hours As Single
Dim error_text As String
'Параметр Type получает значение 1 (число).
121
hourly_wage = Application. InputBox.("Введите ставку _
почасовой оплаты:", "Почасовая оплата", 3.75, Туре=1)
'Обратите внимание на использование значения False.
If hourly_wage = False Then
MsgBox "Операция отменена."
End
End If
num_of_hours = Application.InputBox("Введите количество _
отработанных часов:", "Отработанные часы", 40, Туре=1)
If num_of_hours = False Then
MsgBox "Операция отменена."
End
Else
MsgBox "К оплате " & Format((num_of_hours * _
hourly_wage), "$##,##0.00")
End If
End Sub
Методы OnKey, OnRepeat, OnTime и OnUndo. Они обычно
используются в процедуре Auto_Open, которая автоматически
выполняется при открытии рабочей книги.
Метод OnKey выполняет заданную процедуру при нажатии
определенной клавиши или комбинации клавиш. Метод имеет
следующий синтаксис:
Application.OnKey Key, Procedure
Параметр Key – обязательный строковый аргумент, который
определяет комбинацию клавиш или клавишу, которая назначена процедуре. В параметре Key можно указать также специальные клавиши (табл. 11.2).
Таблица 11.2  Код клавиш для метода OnKey
Клавиша
<BackSpace>
<Break>
<Caps Lock>
<Clear>
<Delete>
Код
{BACKSPACE} или {BS}
{BREAK}
{CAPSLOCK}
{CLEAR}
{DELETE} или {DEL}
122
Продолжение табл. 11.2
Клавиша
<>
<End>
<Enter>(цифровая клавиатура)
<Escape>
<Enter>
<F1> – <F12>
<Home>
<Insert>
<>
<Num Lock>
<Page Down>
<Page Up>
<>
<Scroll Lock>
<Tab>
<>
Код
{DOWN}
{END}
{ENTER}
{ESCAPE} или {ESC}

<F1> – <F12>
{HOME}
{INSERT}
{LEFT}
{NUMLOCK}
{PGDN}
{PGUP}
{RIGHT}
{SCROLLLOCK}
{TAB}
{UP}
Если требуется задать сочетание одновременно нажимаемых клавиш, используйте табл. 11.3.
Таблица 11.3  Коды специальных клавиш для метода OnKey
Специальная клавиша
Alt или Option
Shift
Ctrl
Command
Код

+
^
*
Параметр Procedure – необязательный строковый аргумент,
который определяет имя процедуры, запускаемой при нажатии
клавиши или комбинации клавиш. Если требуется отключить
исполнение макроса при нажатии комбинации, присвойте данному параметру пустую строку (""). Если требуется восстановить исходную функцию сочетания клавиш, выполните метод
123
OnKey, не указывая параметр Procedure. Приведем пример использования метода ОnКеу:
'Назначение комбинации клавиш <Ctrl>+<>
'процедуре GetSalesData.
Application.OnKey "^{RIGHT}", "GetSalesData"
'Отмена назначения комбинации клавиш <Ctrl>+< >
Application.OnKey "^{RIGHT}", ""
'Восстановление функции комбинации клавиш <Ctrl>+< >
Application.OnKey "^{RIGHT}"
Метод OnRepeat определяет процедуру, которая выполняется при выборе команды Правка\Повторить (Edit\Repeat). Метод имеет следующий синтаксис:
Application.OnRepeat Text, Procedure
Параметр Text – обязательный аргумент, задающий текст
команды Правка\Повторить. Параметр Procedure – обязательный аргумент, содержащий имя процедуры, которая выполняется при выборе команды Правка\Повторить.
Приведем пример использования данного метода. Следующая инструкция устанавливает текст команды Правка\Повторить равным "Повторить чтение данных по сбыту" и
связывает процедуру GetSalesData с данной командой:
Application.OnRepeat "Повторить чтение данных по сбыту", _
"SaleData.xls!GetSalesData"
Метод OnTime позволяет назначить выполнение процедуры
на заданное время. Метод имеет следующий синтаксис:
Application.OnTime(EarliestTime, Procedure LatestTime, Schedule)
Обязательный параметр EarliestTime – момент запуска процедуры. Параметр Procedure также обязателен. Он содержит
имя выполняемой процедуры. Следует отметить, что для ввода
значения параметра EarliestTime можно использовать функцию
TimeValue ().
124
Если на момент, заданный параметром EarliestTime, Excel
не может запустить указанную процедуру из-за того, что выполняет другую операцию, то дополнительный параметр LatestTime
определяет последний момент запуска этой процедуры. Если по
прошествии указанного времени Excel так и не освободился, то
процедура не исполняется.
Параметр Schedule – необязательный аргумент. Если он равен значению True (по умолчанию), то выполнение процедуры
откладывается на сутки. Приведем пример использования метода OnTime:
'Выполнение процедуры GetSalesData по прошествии 1 минуты
'с текущего момента.
Application.OnTime Now + TimeValue ("00:01:00"), "GetSalesData"
'Выполнение процедуры UpdateSalesData в 14:00.
Application.OnTime TimeValue("14:00:00 "), "UpdateSalesData"
Метод OnUndo позволяет установить текст команды Правка\Отменить (Edit\Undo) и связать с этой командой процедуру.
Синтаксис метода напоминает синтаксис метода OnRepeat:
Application.OnUndo(Text, Procedure)
Параметр Text устанавливает текст команды Правка\Отменить. Аргумент Procedure определяет процедуру, связанную с этой командой.
Метод Quit. Чтобы выйти из Excel, не запуская макросы
Auto_Close, используется метод Quit объекта Application. При
выходе выводится запрос на запись несохраненных открытых
рабочих книг. Метод имеет следующий синтаксис:
Application.Quit
Использование событий объекта Application
Объекты VBA, включая элемент Application, имеют множество событий. Чтобы обработать событие с помощью объекта
125
Application, необходимо создать новый модуль класса и объявить в нем переменную, используя ключевое слово WithEvents:
Public WithEvents оАрр As Application
Ключевое слово WithEvents определяет, что переменная
оАрр используется для обработки события объекта. Данное
ключевое слово допускается только в модулях класса и описывает только переменные уровня модуля.
Теперь требуется связать описанный в модуле класса объект с элементом Application. Это можно сделать в любом модуле, указав следующий код:
'Инструкция Dim располагается в разделе описаний модуля.
'Имя EventClassModule – имя модуля класса.
Dim X As New EventClassModule
Sub InitializeAppEvents()
Set X.oApp = Application
End Sub
После выполнения процедуры InitializeAppEvents объект
оАрр в модуле класса указывает на объект Excel Application, что
позволяет использовать процедуры обработки в модуле класса
при возникновении событий. Если необходимо включить или
отключить обработку событий, в программе следует изменить
значение свойства Application.EnableEvents. Если данное свойство имеет значение True, то процедуры обработки доступны.
Ниже описываются некоторые события объекта Application.
Следует отметить, что именем объекта для события
objесt_ИмяСобытия (например, object_NewWorkbook) является
имя переменной, которая описана с помощью ключевого слова
withEvents.
Событие NewWorkbook. Событие NewWorkbook возникает
при создании новой рабочей книги. Процедура обработки события имеет следующий синтаксис:
Private Sub object_NewWorkbook(ByVal Wb As Workbook)
Параметр Wb – ссылка на рабочую книгу, создание которой
вызвало событие.
126
Событие WorkbookActivate. Событие WorkbookActivate
возникает при активизации любой рабочей книги. Процедура
обработки события имеет следующий синтаксис:
Private Sub object_WorkbookActivate(ByVal Wb As Workbook)
Параметр Wb – ссылка на рабочую книгу, активизация которой вызвало событие. Например, если требуется вручную
произвести вычисления для всех открытых рабочих книг, то при
активизации книги можно использовать следующую процедуру:
Private Sub oApp_WorkbookActivate(ByVal Wb As Workbook)
Application.Calculate
End Sub
Событие WorkbookAddinInstall. Событие WorkbookAddinlnstall возникает при установке рабочей книги в качестве дополнительной надстройки. Данное событие можно использовать в
процедуре, которая действует как программа установки для других рабочих книг. Синтаксис процедуры обработки следующий:
Private Sub object_WorkbookAddinInstall(ByVal Wb As Workbook)
Параметр Wb является ссылкой на устанавливаемую рабочую книгу.
Событие WorkbookAddinUninstall. Событие WorkbookAddinUninstall возникает при отмене установки рабочей книги в
качестве дополнительной надстройки. Синтаксис процедуры
обработки следующий:
Private Sub object_WorkbookAddinUninstall(ByVal Wb As Workbook)
Параметр Wb является ссылкой на рабочую книгу, установку которой в качестве надстройки требуется отменить.
Событие WorkbookBeforeClose. Событие WorkbookBeforeClose возникает непосредственно перед закрытием открытой
рабочей книги. Синтаксис процедуры обработки следующий:
Private Sub object_WorkbookBeforeClose(ByVal Wb As Workbook, _
ByVal Cancel As Boolean)
127
Параметр Wb – ссылка на рабочую книгу, которую требуется закрыть. Параметр Cancel имеет значение False при возникновении события. Если процедура обработки события присваивает значение True данному параметру, то рабочая книга не закрывается по завершении выполнения процедуры. Данное событие используется, например, для выполнения метода Calculat
или для исполнения подпрограммы проверки условий на значение:
Private Sub oApp_WorkbookBeforeClose(ByVal Wb As Workbook, _
Application.Calculate)
'Вызов внешней подпрограммы проверки условий на значение
ValidateEntries
End Sub
Событие WorkbookBeforePrint. Событие WorkbookBeforePrint возникает непосредственно перед печатью открытой рабочей книги. Синтаксис процедуры обработки следующий:
Private Sub object_WorkbookBeforePrint(ByVal Wb As Workbook, _
ByVal Cancel As Boolean)
Параметр Wb – ссылка на рабочую книгу, которую требуется напечатать. Параметр Cancel имеет значение False при возникновении события. Если требуется отменить печать документа, присвойте данному параметру в процедуре обработки значение True.
Событие WorkbookBeforeSave. Событие WorkbookBeforeSave возникает непосредственно перед сохранением открытой
рабочей книги. Синтаксис процедуры обработки следующий:
Private Sub object_WorkbookBeforeSave(ByVal Wb As Workbook, _
ByVal SaveAsUi As Boolean, ByVal Cancel As Boolean)
Параметр Wb – ссылка на сохраняемую рабочую книгу. Если требуется отобразить диалоговое окно Сохранение документа (Save As), присвойте параметру SaveAsUi значение True.
Параметр Cancel имеет значение False при возникновении события. Если требуется отменить сохранение документа, присвойте данному параметру в процедуре обработки значение
True.
128
Событие WorkbookDeactiVate. Событие WorkbookDeactivate возникает, когда открытая рабочая книга теряет фокус. Синтаксис процедуры обработки следующий:
Private Sub object_WorkbookDeactivate(ByVal Wb As Workbook)
Параметр Wb – ссылка на рабочую книгу, которая теряет
фокус.
Событие WorkbookNewSheet. Событие WorkbookNewSheet возникает при добавлении нового листа в открытую рабочую книгу. Синтаксис процедуры обработки следующий:
Private Sub object_WorkbookNewSheet(ByVal Wb As Workbook, _
ByVal Sh As Object)
Параметр Wb – ссылка на рабочую книгу, в которую добавлен лист. Аргумент Sh – вновь созданный лист.
Данное событие можно использовать, чтобы удалить вновь
созданный рабочий лист, если количество листов в рабочей книге больше заданного:
Private Sub object_WorkbookNewSheet(ByVal Wb As Workbook, _
Sh As Object)
If Wb.Worksheets.Count > 6 Then
MsgBox "Максимальное число листов в рабочей книге равно 5."
Wb.Sh. Delete
End If
End Sub
Событие WorkbookOpen. Событие WorkbookOpen возникает при открытии рабочей книги. Синтаксис процедуры обработки следующий:
Private Sub object_WorkbookOpen(ByVal Wb As Workbook)
Параметр Wb – ссылка на открываемую рабочую книгу.
11.6 Использование семейства Workbooks и объекта Workbook
Нa следующем уровне иерархии классов Excel находится
семейство Workbooks, которое содержит объекты Workbook.
129
Элемент Workbook – это объект, представляющий файл Excel.
Большинство других используемых при разработке объектов,
например, объекты Range, ChartObjects PivotTables, хранятся в
элементе Workbook.
11.6.1 Использование свойств и методов семейства
Workbooks
Зная как работать со свойствами и методами семейства
Workbooks, можно выполнить все операции над файлами.
Например, можно с помощью метода Add создать файл рабочей
книги.
Свойство Count. Семейство Workbooks имеет всего несколько свойств. Одним из них является доступное только для
чтения свойство Count. В нем хранится число объектов
Workbook в семействе Workbooks. Например, если имеются пять
открытых рабочих книг, то следующая программа выводит
текст "Открыто 5 рабочих книг":
Dim iNumWB As Integer
iNumWB = Workbooks.Count
MsgBox "Открыто " & iNumWB & " рабочих книг."
Метод Add. Семейство Workbooks имеет всего несколько
методов. Один из наиболее важных – метод Add. Все семейства
имеют метод Add. Он создает новый объект семейства, для семейства Workbooks – это новая рабочая книга. Метод Add эквивалентен команде Файл\Создать (File\New). После создания
книги она становится активной. Метод Add имеет следующий
синтаксис:
Синтаксис 1:
Workbooks.Add template
Синтаксис 2 (описывается объектная переменная и используется инструкция Set, чтобы назначить переменной ссылку на
созданный объект):
130
Dim variable_name as Workbook
Set variable_name = Workbooks.Add(Template)
Параметр template необязателен. Он позволяет задать шаблон, на который основывается создаваемая рабочая книга. Данный аргумент используется, например, чтобы выбрать существующую книгу в качестве шаблона для новой книги.
В качестве значения параметра template можно использовать следующие константы: xlWBATChart, xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet или xlWBATWorksheet. Если аргумент template опущен, то создается рабочая книга с пустыми листами, параметры которой определяются с помощью команды Сервис\Параметры во вкладке Общие, либо
задаются значением свойства Application.SheetsInNewWorkbook.
Приведем пример программы, в которой показано создание
рабочих книг:
Dim oNewWorkbook as Workbook
'Создание рабочей книги с помощью константы
'Workbooks.Add xlWBATWorksheet
'Создание рабочей книги с использованием в качестве шаблона
'другого файла
Workbooks.Add "C:\My Documents\Expense Report.xls"
'Создание рабочей книги и связывание
'с ней объектной переменной
Set oNewWorkbook = Workbooks.Add
Метод Open. Метод Open используется для открытия существующей рабочей книги. Метод имеет следующий синтаксис:
Workbooks.Open(FileName, UpdateLinks, Readonly, Format, _
Password, WriteResPassword, IgnoreReadOnlyRecommended, _
Origin, Delimiter, Editable, Notify, Converter, AddToMRU)
Параметр FileName – обязательный аргумент, определяющий имя открываемой рабочей книги и полный путь к ней.
Параметр UpdateLinks – необязательный аргумент, который
позволяет задать способ обновления ссылок в файле. Если данный параметр опущен, выводится запрос на указание метода
131
обновления. В табл. 11.4 показаны допустимые значения параметра UpdateLinks.
Таблица 11.4  Значения параметра UpdateLinks
Значение
0
1
2
3
Описание
Не обновлять ссылки
Обновлять только внешние ссылки
Обновлять только удаленные ссылки
Обновлять все ссылки
Другим необязательным параметром является аргумент
ReadOnly. По умолчанию его значение равно False. Если присвоить ему значение True, то рабочая книга открывается только
для чтения.
Дополнительный параметр Format используется для работы
с текстовыми файлами. Он определяет символ разделителя содержимого полей записей. В табл. 11.5 показаны допустимые
значения для этого параметра.
Таблица 11.5  Значения параметра Format
Значение
1
2
3
4
5
6
Разделитель
Символ табуляции
Запятая
Пробел
Точка с запятой
Нет разделителя
Другой символ (см.
Delimiter)
ниже
параметр
Если при открытии рабочей книги требуется ввод пароля,
то его можно задать, используя необязательный параметр
Password. Если данный параметр опущен, а в рабочей книге
имеется пароль на открытие, то выводится запрос на ввод пароля.
132
Если при сохранении рабочей книги требуется ввод пароля,
то его можно задать, используя необязательный параметр
WriteResPassword. Если данный параметр опущен, а в рабочей
книге имеется пароль на сохранение, то выводится запрос на
ввод пароля.
Если рабочая книга сохранена как файл, с которым рекомендуется работа в режиме чтения, то чтобы отключить вывод
запроса на работу без внесения изменений, требуется присвоить
необязательному параметру IgnoreReadOnlyRecommended значение True.
Если файл является текстовым, то дополнительный параметр Origin позволяет указать его тип, чтобы использовать соответствующую кодовую страницу и правильно распознать символы конца строк. Допустимыми значениями для данного параметра являются константы xlWindows и xlMSDOS. Если параметр не задан, то используется значение для текущей операционной системы.
Дополнительный параметр Delimiter используется совместно с параметром Format. Если присвоить параметру Format значение 6, то параметр Delimiter определяет символ, который требуется использовать в качестве разделителя.
Необязательный параметр Editable используется только для
надстроек Excel 4.0. Если открываемый файл является
надстройкой Excel 4.0, присвойте данному параметру значение
True, чтобы открыть файл для редактирования. Если же аргумент Editable имеет значение False или опущен, то надстройка
будет скрыта, и ее нельзя вывести для внесения изменений.
Присваивание значения True параметру Editable при открытии
файла, не являющегося надстройкой, приводит к тому, что макрос Auto_Оpen не выполняется.
Если файл нельзя открыть в режиме чтения или записи, то
при задании значения True для необязательного параметра Notify
имя файла добавляется в список нотификации файлов. Если же
данный аргумент имеет значение False или опущен, то запрос на
нотификацию не выводится и открыть недоступный файл невозможно.
Дополнительный параметр Converter используется для передачи индекса конвертера файла, с помощью которого произ-
133
водится попытка открыть файл. Если заданный конвертер не
распознает файл, то применяются другие программы преобразования.
Последним параметром метода Open является необязательный параметр AddToMRU. Присвойте ему значение True, чтобы
добавить рабочую книгу в список ранее открывавшихся файлов.
По умолчанию для данного параметра применяется значение
False.
Метод Close. Метод Close позволяет закрыть рабочую книгу. Метод имеет следующий синтаксис:
Application.Close
11.6.2 Использование свойств объекта Workbook
Объект Workbook представляет рабочую книгу, свойства
которой требуется использовать в программе. Примерами ссылок на рабочую книгу являются Workbooks("name_of_workbook"), где параметр name_of_workbook – имя используемой рабочей книги, а также ActiveWorkbook или ThisWorkbook.
Свойство ActivateSheet. Объект Workbook имеет полезные
свойства. Одно из них – свойство ActivateSheet, содержащее
ссылку на активный лист в данной рабочей книге. Если в книге
нет активного листа, то в свойстве хранится значение Nothing.
Свойство доступно только для чтения.
Свойство Author. Свойство Author используется для чтения
или установки имени автора рабочей книги. Кроме того, данное
свойство применяется в программе установки для регистрации
пользователя. После создания используемых в приложении рабочих книг, задайте имя автора рабочей книги с помощью свойства Author:
Sub Name_Those_Workbooks ()
Dim registration_name As String
'По умолчанию имя пользователя равно значению свойства
'Application.UserName.
registration_name = InputBox("Введите свое имя или _
134
название вашей фирмы:", "Регистрация", _
default:=Application.UserName)
ThisWorkbook.Author = registration_name
MsgBox "This application has been registered to " & _
ThisWorkbook.Author
End Sub
Свойство Saved. Другим полезным свойством объекта
Workbook является свойство Saved. Оно имеет значение True,
если в рабочую книгу не будут внесены изменения с момента
последнего сохранения. Данное свойство доступно как для чтения, так и для установки. Например, если требуется закрыть рабочую книгу, которая редактировалась, либо если необходимо
просто выдать запрос на ее сохранение, используйте следующую программу:
Workbooks("SalesData").Saved = False
Workbooks("SalesData").Close
11.6.3 Методы объекта Workbook
Параметр Workbook_object, используемый при описании
синтаксиса методов, является ссылкой на рабочую книгу. Примерами ссылок на рабочую книгу являются выражения
Workbooks("name_of_workbook"), где параметр name_of_workbook – имя используемой рабочей книги, а также ActiveWorkbook
или ThisWorkbook.
Метод Activate. Метод Activate используется очень часто.
Он применяется для активизации требуемой рабочей книги. Метод имеет следующий синтаксис:
Workbook_object. Activate
Метод Close. Объект Workbook, как и семейство
Workbooks, имеет метод Close. Однако метод Close для объекта
Workbook включает дополнительные параметры:
Workbook_object.Close (SaveChanges, FileName, RouteWorkbook)
Если рабочая книга закрывается с помощью метода Close,
то макрос Auto_close не выполняется. Если требуется вручную
135
запустить процедуру Auto_close, необходимо воспользоваться
методом RunAutoMacros.
Необязательный параметр SaveChanges позволяет задать
сохранение рабочей книги. Если файл не изменялся, то данный
параметр игнорируется. В противном случае, можно присвоить
аргументу значение True, чтобы сохранить изменения в рабочей
книге. Если файл только что создан и, следовательно, не имеет
имени, то имеется возможность задать его имя с помощью параметра FileName. Если параметр FileName опущен, то выводится запрос ввод имени. Чтобы переслать рабочую книгу другому
пользователю, присвойте необязательному параметру RouteWorkbook значение True.
Метод Route. С помощью метода Route можно переслать
рабочую книгу другому пользователю, используя текущий
маршрут. При этом свойству Routed присваивается значение
True. Метод имеет следующий синтаксис:
Workbook_object.Route
Приведем пример использования метода Route:
'Пересылка активной рабочей книги
ActiveWorkbook.HasRoutingSlip = True
With ActiveWorkbook
.Recipients = "Сергей Власенко"
.Subject = "Отработанные часы"
.Message = "Информация об отработанных часах."
End With
'Пересылка рабочей книги, не являющейся активной
Workbooks("SalesData.xls").HasRoutingSlip = True
With Workbooks("SaleData.xls").RoutingSlip
.Delivery = xlOneAfterAnother
.Subject = "Отчет о продажах"
.Recipients = Аrrау("Федор Новиков", "Дмитрий Козлов")
.Message = "Информируйте меня о своих соображениях."
End With
Workbooks("SalesData.xls").Route
136
Методы Save и SaveAs. Метод Save позволяет сохранить
рабочую книгу. Он имеет следующий синтаксис:
Workbook_object.Save
Метод SaveAs также сохраняет рабочую книгу, но он включает дополнительные параметры. Данный метод, как и метод
Save, присваивает свойству Saved значение True. Метод SaveAs
имеет следующий синтаксис:
Workbook_object.SaveAs(Filename, FileFormat, Password, _
WriteResPassword, ReadOnlyRecommended, CreateBackup, _
AccessMode, ConflictResolution, AddToMru, TextCodePage, _
TextVisualLayout)
Параметр Filename – имя сохраняемого файла. Если в имени не указан путь, то рабочая книга сохраняется в текущей папке. Чтобы записать файл в формате, отличном от формата рабочей книги Microsoft Excel, используется параметр FileFormat.
При сохранении рабочей книги можно установить пароль доступа к файлу из 15 символов. Для этого используется необязательный параметр Password. Кроме того, имеется возможность задать пароль на сохранение с помощью аргумента
WriteResPassword. Если необходимо установить для файла рекомендуемый режим доступа только для чтения, присвойте дополнительному параметру ReadOnlyRecommended значение True.
Если требуется создать резервную копию файла, присвойте
необязательному параметру CreateBackup значение True.
Дополнительный параметр AccessMode позволяет установить режим доступа к рабочей книге. При этом можно использовать три константы: xlShared (общая рабочая книга),
xlExclusive (монопольный доступ) или xlNoChange (запрет изменения режима доступа).
Необязательный аргумент ConflictResolution определяет
способ разрешения конфликтов при одновременном внесении
несколькими пользователями изменений в общие рабочие книги. Допустимыми значениями параметра являются: xlUserResolution (отображение диалогового окна разрешения конфликтов), xlLocalSessionChanges (автоматическое принятие изменений, внесенных пользователем) или xlOtherSessionChanges
137
(принятие изменений, внесенных другими пользователями). Если параметр опущен, по умолчанию используется значение
xlUserResolution.
По умолчанию имена рабочих книг, сохраненных с помощью метода SaveAs, не добавляются в список ранее открывавшихся файлов. Чтобы внести название файла в этот список, присвойте аргументу AddToMru значен True.
11.6.4 Использование событий объекта Workbook
Для обработки событий объекта Workbook, в отличие от событий объекта Application, не требуется создавать модуль класса
или производить другие специальные действия. События в рабочей книге возникают при изменении объекта Workbook или
при редактировании в ней листа. Чтобы вывести список событий рабочей книги:
1) Восстановите или сверните окно рабочей книги. Если
окно развернуто, то вывод списка событий невозможен.
2) Щелкните правой кнопкой мыши по заголовку окна рабочей книги.
3) Выберите из контекстного меню команду Исходный
текст (View Code). Запускается редактор VBA (рис. 11.2).
4) Выберите имя требуемого события в правом списке окна
модуля.
Рис. 11.2  Процедура обработки события рабочей книги
138
Объект Workbook имеет множество событий. Ниже описываются некоторые из них.
Событие BeforeClose. Событие BeforeClose возникает при
закрытии рабочей книги до вывода запроса на сохранение изменений. Процедура обработки данного события имеет следующий синтаксис:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Параметр Cancel имеет значение False при возникновении
события. Если процедура обработки события присваивает значение True данному параметру, то рабочая книга не закрывается.
Событие BeforePrint. Событие BeforePrint возникает непосредственно перед печатью всей рабочей книги или ее части.
Процедура обработки данного события имеет следующий синтаксис:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Параметр Cancel имеет значение False при возникновении
события. Если требуется отменить печать документа, присвойте
данному параметру значение True.
Событие BeforeSave. Событие BeforeSave возникает непосредственно перед сохранением рабочей книги. Процедура обработки данного события имеет следующий синтаксис:
Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, _
Cancel As Boolean)
Если требуется отобразить диалоговое окно Сохранение документа, присвойте параметру SaveAsUi значение True. Параметр Cancel имеет значение False при возникновении события.
Если требуется отменить сохранение документа, присвойте данному параметру в процедуре обработки значение True.
Событие Deactivate. Событие Deactivate возникает, когда
рабочая книга теряет фокус. Синтаксис процедуры обработки
следующий:
139
Private Sub Workbook_Deactivate()
Событие NewSheet. Событие NewSheet возникает при добавлении нового листа в рабочую книгу. Синтаксис процедуры
обработки следующий:
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Аргумент Sh – вновь созданный лист.
Событие Open. Событие Open возникает при открытии рабочей книги. Процедура обработки данного события имеет следующий синтаксис:
Private Sub Workbook_Open()
Приведем пример, в котором процедура обработки события
Open устанавливает значения различных свойств рабочей книги:
Private Sub Workbook_Open()
With ActiveWindow
.DisplayGridlines = False
.DisplayHeadings = False 'убирает сетку таблицы
.DisplayHorizontalScrollBar = False
'убирает горизон'тальную линейку прокрутки
.DisplayVerticalScrollBar = False 'убирает вертикальную
'линейку прокрутки
.DisplayWorkbookTabs = False 'убирает ярлычки листов
End With
End Sub
На рис. 11.3 показано, как выглядит окно рабочей книги после выполнения данной процедуры. Обратите внимание на то,
что ярлычки рабочих листов, сетка и полосы прокрутки не отображаются.
140
Рис. 11.3  Результат выполнения процедуры Workbook_Open
Событие SheetActivate. Событие SheetActivate возникает
при активизации любого рабочего листа книги. Процедура обработки данного события имеет следующий синтаксис:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Параметр Sh является ссылкой на активизированный элемент, будь то объект Chart или объект Worksheet. Следует отметить, что событие SheetActivate не возникает в рабочих листах
диалоговых окон Excel 5.O.
Событие SheetBeforeDoubleClick. Событие SheetBeforeDoubleClick возникает при двойном щелчке по любому рабочему листу книги. Процедура обработки исполняется до выполнения стандартной операции, которая производится по умолчанию
при двойном щелчке. Следует отметить, что событие
SheetBeforeDoubleClick не возникает на листах диаграмм. Синтаксис процедуры обработки данного события следующий:
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, _
ByVal Target As Range, ByVal Cancel As Boolean)
Параметр Sh является ссылкой на объект Worksheet, по которому произведен двойной щелчок. Аргумент Target – ближайшая к указателю мыши ячейка в момент возникновения со-
141
бытия SheetBeforeDoubleClick. Aprумент Cancel имеет значение
False при возникновении данного события. Если требуется отменить выполнение стандартной обработки двойного щелчка,
присвойте данному параметру в процедуре обработки значение
True.
Событие SheetBeforeRightClick. Событие SheetBeforeRightClick возникает при щелчке правой кнопкой мыши по рабочему
листу. Процедура обработки исполняется до выполнения стандартной операции, которая производится по умолчанию при
нажатии правой кнопки мыши. Следует отметить, что событие
SheetBeforeRightClick не возникает на листах диаграмм. Синтаксис процедуры обработки данного события следующий:
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, _
ByVal Target As Range, ByVal Cancel As Boolean)
Параметр Sh является ссылкой на объект Worksheet, по которому произведен щелчок правой кнопкой мыши. Аргумент
Target – ближайшая к указателю мыши ячейка в момент возникновения события SheetBeforeRightClick.
Если требуется отменить выполнение стандартной обработки щелчка правой кнопкой мыши, присвойте параметру Cancel в
процедуре обработки значение True.
Событие SheetCalculate. Событие SheetCalculate возникает
после перерасчета значений на любом рабочем листе книги или
после вывода измененных данных на диаграмме. Синтаксис
процедуры обработки данного события следующий:
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Параметр Sh является ссылкой на лист, для которого произведен перерасчет значений.
Событие SheetChange. Событие SheetChange возникает
после изменения пользователем или внешней ссылкой содержимого ячейки на любом рабочем листе. Следует отметить, что
событие SheetChange не возникает на листах диаграмм.
142
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal _
Source As Range)
Параметр Sh является ссылкой на объект Worksheet, на котором находится ячейка с новыми данными. Аргумент Source
указывает на диапазон, ячейки которого изменились. Данную
процедуру обработки можно использовать для проверки условий на значение.
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal _
Source As Range)
If Worksheets("Data").Range("A7").Value > 5Then
Msgbox "Значение не должно быть меньше 5."
Worksheets ("Data").Range("A7").Activate
End If
End Sub
Событие SheetDeactivate. Событие SheetDeactivate возникает, когда активный лист рабочей книги теряет фокус. Синтаксис процедуры обработки данного события следующий:
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Событие
SheetSetectionChange.
Событие
SheetSelectionChange возникает при изменении выделенного
диапазона ячеек. Следует отметить, что данное событие не возникает на листах диаграмм. Синтаксис процедуры работки данного события следующий:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _
Val Target As Excel.Range)
Параметр Sh является ссылкой на рабочий лист, на котором
выделен новый диапазон ячеек. Аргумент Target определяет выбранный диапазон.
11.7 Использование семейства Worksheets
Семейство Worksheets представляет множество всех объектов Worksheet в рабочей книге. Элементы данного семейства
являются подмножеством семейства Sheets. Семейство Sheets
143
включает не только рабочие листы, но и листы диаграмм, листы
диалоговых окон Excel и т.д.
11.7.1 Использование свойства Count семейства
Worksheets
Вероятно, наиболее часто используемым свойством семейства Worksheets является свойство Count. Напомним еще раз, что
в свойстве Count хранится число объектов Worksheet в семействе Worksheets.
11.7.2 Использование метода Add семейства Worksheets
Семейство Worksheets включает метод Add, c помощью которого можно создать рабочий лист точно так же, как, используя
метод Add семейства Workbooks, можно создать рабочую книгу.
Метод имеет следующий синтаксис:
Worksheets.Add Before, After, Count, Type
либо
Sheets.Add Before, After, Count, Type
Параметр Before  необязательный параметр, указывающий
на лист, перед которым требуется добавить новый. Значение
данного параметра можно задать двумя способами:
1. Использовать имя, которое отображается на ярлычке рабочего листа.
2. Использовать индекс листа. Например, чтобы разместить
новый рабочий лист перед первым, укажите следующую инструкцию:
WorkSheets.Add Before:= WorksSheets.Item(3)
Вместо параметра Before можно использовать необязательный параметр After. Например, если требуется разместить рабочий лист последним в рабочей книге, укажите следующую инструкцию:
144
Worksheets.Add After:=Worksheets (Worksheets.Count)
Если параметры Before и After опущены, то новый лист
вставляется перед активным листом. Если же необходимо добавить несколько объектов, задайте их число в качестве значения
аргумента Count. Значение по умолчанию равно 1. Дополнительный параметр Туре позволяет указать тип листа. Допустимыми значениями данного параметра являются константы
xlWorksheet, xlExcel4MacroSheet или xlExcel4IntlMacroSheet.
Значение по умолчанию равно xlWorksheet.
11.8 Использование объекта Worksheet, его
свойств и методов
Объект Worksheet – это лист в рабочей книге. Он входит как
в семейство Worksheets, так и в семейство Sheets. В программе
на объект Worksheet можно сослаться двумя способами: либо
указать имя, которое отображается на ярлычке рабочего листа,
либо задать индекс листа в рабочей книге. Например, чтобы использовать в программе второй лист активной книги, следует
указать выражение ActiveWorkbook.Worksheets (2).
Параметр Worksheet_object, используемый при описании
синтаксиса методов, является ссылкой на рабочий лист. В качестве примеров ссылок можно привести следующие: ActiveSheet,
либо Worksheets("name_of_worksheet"), параметр name_of_worksheet – имя, отображаемое на ярлычке листа, Worksheets (index),
где аргумент index – индекс листа.
Свойство Name. В свойстве Name объекта Worksheet хранится имя, отображаемое на ярлычке рабочего листа. При создании объекта Worksheet листу присваивается стандартное имя,
например, "Лист12". С помощью свойства Name можно указать
название, несущее больше полезной информации, например,
"Сбыт по 1 кварталу". Приведем пример, в котором свойство
Name получает значение имени пользователя Excel:
Sub Name_a_sheet ()
Worksheets(1).Name = Application.UserName
End Sub
145
Свойство Type. В свойстве Туре, доступном только для
чтения, хранится тип рабочего листа. Допустимыми значениями
данного
свойства
являются
константы
xlWorksheet,
xlExcel4MacroSheet или xlExcel4IntlMacroSheet.
Свойство Visible. Объекту Worksheet принадлежит свойство Visible. Если данное свойство имеет значение True (по
умолчанию), то рабочий лист виден на экране. В противном
случае лист не виден. С помощью свойства Visible можно,
например, скрыть рабочий лист, на котором находится список,
используемый в приложении, и пользователь не сможет увидеть
перечень пунктов и внести в него изменения.
Метод Calculate. Метод Calculate объекта Worksheet позволяет выполнить вручную вычисления на заданном рабочем
листе, например:
ActiveWorksheet.Calculate
Методы Сору и Move. Для копирования рабочего листа используется метод Сору. Он имеет следующий синтаксис:
Worksheet_object.Сору Before, After
Необязательный параметр Before определяет лист, перед
которым требуется разместить скопированный объект. Данный
аргумент не указывается, если задан параметр After. Аргумент
After также является дополнительным. Он определяет лист, после которого требуется разместить скопированный объект. Если
опущены оба параметра, то создается новая рабочая книга, содержащая требуемый лист.
Метод Move похож на метод Сору. Однако метод Move не
копирует, а перемещает лист в указанное место рабочей книги.
Синтаксис данного метода следующий:
Worksheet_object.Move Before, After
Параметры Before и After для метода Move играют ту же
роль, что и для метода Сору. Если опущены оба аргумента, то
создается новая рабочая книга, содержащая перемещаемый
лист.
146
Метод Delete. Для удаления рабочего листа используется
метод Delete, например:
Sheet2.Delete
11.9 Использование объекта Range
Объект Range – наиболее часто используемый объект Excel.
Характерная особенность этого объекта заключается в том, что
он не входит ни в одно семейство. Объектом Range является
ячейка, строка, столбец, несколько расположенных как рядом,
так и отдельно ячеек, или трехмерный диапазон. Обратите внимание, что одна ячейка – это также объект Range.
Диапазон можно задать в программе следующим образом:
1) Используя ссылку на ячейки, например, Range ("G14")
или Range("B1:B6").
2) Используя имя диапазона, например, "Итоги". Чтобы
сослаться на диапазон, требуется указать выражение
Range("Итоги").
3) Используя объект ActiveCell. Объект ActiveCell указывает на ячейку или объект Range, который имеет фокус при вводе
данных с клавиатуры.
4) Используя объект Selection. Объект Selection – это то, что
выделено на рабочем листе. Объект Selection может указывать
на тот же диапазон, что и объект ActiveCell, а может и не указывать. С помощью объекта Selection можно сослаться, например,
на диапазон, включающий одну или несколько ячеек, на рисунок или на диаграмму. Объект ActiveCell всегда указывает на
диапазон, содержащий одну ячейку.
11.9.1 Использование свойств объекта Range
Параметр Range_object, используемый при описании
свойств, является ссылкой на диапазон. В качестве примеров
ссылок можно привести следующие: Range("range_name"), где
параметр range_name – имя диапазона, а также ActiveCell, или
Selection, если выбран диапазон.
147
Свойство Address. В свойстве Address хранится расположение диапазона на рабочем листе. При указании данного свойства используются следующие параметры:
Range_0bject.Address(RowAbsolute, ColumnAbsolute, _
ReferenceStyle, External, RelativeTo)
Если необязательный параметр RowAbsolute имеет значение
True, то возвращается абсолютный адрес строки. Величиной по
умолчанию для данного аргумента является значение True. Если
необязательный параметр ColumnAbsolute имеет значение True,
то возвращается абсолютный адрес столбца. Величиной по
умолчанию для данного аргумента является значение True. Если
объект Range указывает на диапазон, включающий несколько
ячеек, то параметры RowAbsolute и ColumnAbsolute относятся ко
всем строкам и столбцам.
По умолчанию применяется стиль ссылок А1. Если необходимо использовать нотацию R1C1, присвойте необязательному
параметру ReferenceStyle значение xlR1C1. Для задания нотации
А1 следует указать константу xlA1.
По умолчанию ссылки являются локальными. Чтобы возвратить внешнюю ссылку, присвойте необязательному параметру External значение True.
Дополнительный параметр RelativeTo позволяет задать абсолютные координаты точки, относительно которой вычисляется положение заданного диапазона. Если параметры RowAbsolute и ColumnAbsolute имеют значение False, a аргумент
ReferenceStyle – значение xlR1C1, то параметр RelativeTo указывать обязательно.
Например, свойство Address используется для вывода в
окне сообщения положения активной ячейки (рис. 11.4). Для
этого укажите следующую инструкцию:
MsgBox "Активной ячейкой является " & ActiveCell.Address
Свойство Cells. Если требуется сослаться на ячейки, зная
их положение относительно заданного объекта Range, необходимо использовать свойство Cells. При указании данного свойства используются следующие параметры:
Range_object.Cells(Row, Column)
148
Рис. 11.4  Вывод положения активной ячейки
Необязательный параметр Row является относительным адресом строки, а дополнительный параметр Column – относительным адресом столбца. Например, если необходимо перемещаться к разным диапазонам в программе и вводить в них данные, можно использовать следующую программу:
'Если начальной ячейкой (диапазоном) являлась ячейка А1, то
'после выполнения следующей инструкции активной станет
'ячейка А2.
ActiveCell.Cells(2).Activate
ActiveCell.Value = 12
'После выполнения следующей инструкции активной ячейкой
'становится ячейка С2.
ActiveCell.Cells(, 3).Activate
ActiveCell.Value = "Итог"
'Ввод в ячейку D3 значения 100.
ActiveCell.Cells(2, 2).Activate
ActiveCell.Value = 100
Свойство CurrentRegion. Свойство CurrentRegion очень
полезное свойство объекта Range. Предположим, что требуется
часто импортировать данные на рабочий лист. В некоторых случаях результат включает пять строк, а в других – более 500
149
строк. Для выбора диапазона данных используется свойство
CurrentRegion. Оно указывает на объект Range, включающий
диапазон ячеек, границами которого являются пустые строки и
пустые столбцы.
Допустим, что неизвестно, сколько строк содержится в результирующем множестве, но имеется адрес первой ячейки, в
которую помещены обработанные данные. Чтобы выбрать все
ячейки результирующего множества, воспользуйтесь следующей процедурой:
Public Sub SelectAll()
'Активизация первой ячейки результирующего множества
Range ("А2") .Activate
'Выделение всего результирующего множества.
'Обратите внимание на то, что метод Select использован для
'того, чтобы выделить диапазон, включающий несколько ячеек.
ActiveCell.CurrentRegion.Select
'Для вывода количества строк в результирующем множестве,
'используется свойство Count.
MsgBox "Число строк равно " & Selection.Rows.Count
End Sub
На рис.11.5 показан результат выполнения данной процедуры.
Рис. 11.5  Вывод числа строк в результирующем множестве ячеек
150
Свойство Formula. Свойство Formula используется для задания или чтения формулы в стиле А1. После ввода формулы в
объект Range свойстству HasFormula автоматически присваивается значение True. Например, если необходимо задать функцию
Sum для диапазона С7, укажите следующую инструкцию:
Range("C7").Formula = "=Sum(Cl:C6)"
Свойство Name. Чтобы присвоить в программе имя диапазону, используется свойство Name. Например, для задания диапазона Titles укажите следующую инструкцию:
Range("A1:D1").Name = "Titles"
Свойство Value. Для установки или чтения содержимого
указанной ячейки используется Value.
11.9.2 Использование методов объекта Range
Параметр Range_object, используемый при описании синтаксиса методов, является ссылкой на диапазон. В качестве
примеров ссылок можно привести следующие: range("range_name"), где параметр range_name – имя диапазона, ActiveCell, или
Selection, если выбран диапазон.
Некоторые методы объекта Range, например, метод
Activate, рассматривались выше. Обратите внимание, что ниже
не описывается метод Add. Это вызвано тем, что объект Range
не входит ни в одно семейство.
Метод AutoFit. Метод AutoFit используется, чтобы задать
автоматическую настройку ширины столбца и высоты строки
диапазона. Данный метод имеет следующий синтаксис:
Range_object.AutoFit
Если необходимо использовать метод AutoFit для выделенного диапазона, можно использовать следующий фрагмент:
Range("А2").Activate
ActiveCell.CurrentRegion.Select
Selection.AutoFit
151
Методы Clear, ClearComments, ClearContents, ClearFormats, ClearNotes. Для очистки диапазона используется метод
Clear. Он имеет следующий синтаксис:
Range_object. Clear
Методы ClearComments, ClearContents, ClearFormats и
ClearNotes позволяют убрать комментарии, содержимое ячеек,
форматы и примечания.
Если удаляется диапазон ячеек, то находящиеся рядом
(смежные) ячейки сдвигаются на место удаленных. При очистке
убирается содержимое ячеек, форматы и комментарии, но сами
пустые ячейки остаются.
Метод Сору. Метод Сору используется для копирования
диапазона или другого объекта в Буфер обмена. Данный метод
имеет два варианта синтаксиса:
Object. Copy
Копирует объект, в данном случае, объект Range в Буфер
обмена.
Если требуется выполнить копирование и вставку одной
командой:
Range _ object.Сору destination
Параметр destination определяет диапазон, в который производится копирование.
Метод Cut. Метод Cut позволяет вырезать объект и поместить его либо в Буфер обмена, либо в указанный диапазон. Его
синтаксис похож на синтаксис метода Сору:
Range_object.Cut destination
Необязательный параметр destination определяет диапазон,
в который требуется произвести вставку объекта. Если данный
аргумент опущен, то объект вырезается и копируется в Буфер
обмена.
Свойство Count. В свойстве Count хранится число объектов семейства. Обычно данное свойство применяется, если объ-
152
ект Range совместно используется с семействами Rows и
Columns (рис. 11.6), например:
Public Sub countit()
Dim Counting As String
ActiveCell.CurrentRegion.Select
Counting = "Число ячеек = " & Selection.Count
Counting = Counting & Chr(13) & "Число строк = " & _
Selection.Rows.Count
Counting = Counting & Chr(13) & "Число столбцов = " & _
Selection.Columns.Count
MsgBox Counting
End Sub
Рис. 11.6  Вывод числа ячеек, строк и столбцов
в выделенном диапазоне
Метод PasteSpecial. Чтобы вставить диапазон или другой
объект из Буфера обмена, используется метод PasteSpecial. Данный метод идентичен команде Правка\Специальная вставка
(Edit\Paste Special). Синтаксис метода PasteSpecial следующий.
Range_object.PasteSpecial paste, operation, skipBlanks, transpose
Необязательный параметр paste определяет элементы диапазона, – формулы, данные, форматы, комментарии, – которые
153
требуется вставить. Допустимыми значениями данного аргумента являются константы Excel: xlPasteAll (по умолчанию),
xlPasteFormulas, xlPasteValues, xlPasteFormats, xlPasteNotes или
xlPasteAllExceptBorders.
Чтобы определить тип вставки, используется дополнительный параметр operation. Допустимыми значениями данного аргумента являются константы: xlPasteSpecialOperationNone (по
умолчанию),
xlPasteSpecialOperationAdd,
xlPasteSpecialOperationSubtract, xlPasteSpecialOperationMultiply или xlPasteSpecialOperationDivide.
Если следует пропустить при вставке пустые ячейки, присвойте необязательному параметру skipBlanks значение True.
Значение по умолчанию для данного аргумента равно False.
Если требуется при вставке поменять местами строки и
столбцы, присвойте необязательному параметру transpose значение True. Значение по умолчанию для данного аргумента равно False.
11.9.3 Примеры использования объектов Range
Форматирование диапазонов. Как изменить начертание
или шрифт содержимого ячеек диапазона? При рассмотрении
свойств объекта Range эти свойства не обсуждались. Причиной
этого является то, что объект Range не имеет свойств Bold, Italic
и т.п. Эти свойства принадлежат объекту Font, который относится ко многим объектам, включая и объект Range. Покажем
использование свойств объекта Font:
Sub Formatting()
With Selection.Font
.Name = "Times New Roman"
.FontStyle = "Bold"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
154
End With
End Sub
Обратите внимание на свойство Underline. Можно было бы
ожидать, что оно равно либо True, либо False. Однако дело обстоит иначе. Excel поддерживает несколько стилей подчеркивания. Допустимыми значениями данного свойства являются константы: xlUnderlineStyleNone, xlUnderlineStyleSingle, xlUnderlineStyleDouble, xlUnderlineStyleSingleAccounting и xlUnderlineStyleDoubleAccounting.
Работа c отдельными ячейками диапазона. В некоторых
случаях требуется получить содержимое заданной ячейки диапазона. Для этого используется инструкция For …Each:
Dim currCell as Range
For each currCell in Range("Data")
If currCell.Value >100000 Then
With currCell.Font
.Bold = True
.Underline = xlUnderlineStyleDouble
End With
End If
Next currCell
11.10 Создание собственных функций рабочего
листа
Чтобы расширить возможности Excel c помощью VBA, используются функции, определяемые пользователем.
11.10.1 Описание собственных функций рабочего листа
Функция рабочего листа, определенная пользователем, –
это процедура Function, которую можно указать в формуле, хранящейся в ячейке. Эти функции работают точно так же, как и
другие функции, используемые на рабочем листе Excel. Создавая собственные функции, можно:
155
1. Разработать функции, которые решают требуемые задачи. Если требуется производить специальные расчеты, то можно
написать собственную функцию.
2. Указать вместо вложенных и сложных формул одну
функцию.
3. Создать функции, содержащие математические выражения, встроенные функции рабочего листа Excel и инструкции
VBA.
Функция, определяемая пользователем, выполняет вычисления и возвращает значение. После создания она становится
доступной для всех листов рабочей книги. Функция, определяемая пользователем, используется точно так же, как и любая
встроенная функция Excel, например, СУММ() или СРЗНАЧ().
Функции, определяемые пользователем, обычно используются, чтобы произвести расчеты. Они не могут изменять значения свойств или выполнять методы. С помощью функций, заданных пользователем, нельзя выполнить следующие операции:
1. Задать свойства объектов.
2. Вставить, удалить или отформатировать ячейки.
3. Задать или изменить содержимое ячейки.
4. Переместить, переименовать, удалить или добавить рабочие листы.
5. Создать, открыть, закрыть или удалить рабочую книгу.
11.10.2 Разработка собственных функций рабочего листа
Функции, определяемые пользователем, разрабатываются
точно так же, как и любая функция VBA. Они хранятся в модуле
и описываются с помощью ключевого слова Public. Чтобы создать функцию, достаточно выполнить команду Сервис\Макрос\Макросы. В предложенном окне ввести имя макроса
(функции) и нажать кнопку Создать.
Внести изменения в тело функции. Приведем пример функции, которая вычисляет налог на прибыль:
Public Function SalesTax(SalesAmount)
SalesTax = SalesAmount * 0.35
End Function
156
Параметром функции является значение или ссылка на
ячейку. Чтобы использовать эту функцию в ячейке, введите следующую формулу:
=SalesTax(50)
=SalesTax(Bl)
На рис. 11.7 показано использование функции, определяемой пользователем. Обратите внимание на выражение в строке
формулы.
Рис. 11.7  Использование собственной функции рабочего листа
157
МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ВЫПОЛНЕНИЮ
КУРСОВОЙ РАБОТЫ ПО ДИСЦИПЛИНЕ
«КОМПЬЮТЕРНАЯ ПОДГОТОВКА»
Цель работы: закрепление знаний, полученных при изучении курса «Компьютерная подготовка», а так же приобретение
новых навыков создания завершенных программных приложений для MS Excel.
Порядок выполнения работы
1. Курсовая работа выполняется в соответствии с заданием.
Темы заданий определяются вариантом; номер варианта рассчитывается по общему правилу расчета вариантов контрольных
заданий.
2. Работа студентом выполняется самостоятельно. Консультации по работе осуществляются через диспетчерскую
службу ТМЦДО.
3. Курсовая работа оформляется в виде пояснительной записки в соответствии с общими требованиями и правилами
оформления курсовых и дипломных работ (ОС ТУСУР 6.1-97).
Приложением к курсовой работе служит программа, выполненная для MS Excel.
Требования к программе
1. Приложение выполнить с использованием языка программирования VBA для MS Excel.
2. При открытии книги Excel, содержащей проект, обеспечить один рабочий лист, на котором оформить рекламную заставку проекта и разместить элемент запуска проекта на исполнение.
3. Проект должен обеспечивать следующие режимы работы:
 ввод исходных данных и формирование базы;
 корректировка данных (исправление, добавление, удаление);
 работа с данными (поиск по полям базы, сортировка,
просмотр);
 формирование выходных документов.
158
4. Для каждого режима работы определить кнопку запуска
и пользовательскую форму.
5. Для выходных документов использовать дополнительные листы книги, если этого требует задача.
6. На экране разместить одну панель инструментов, обеспечивающую работу проекта. Остальные панели скрыть.
7. Данные проекта сохранять в файле.
8. При вводе числовых данных обеспечить обработку ошибок некорректного ввода. (Пример ошибки: при вводе числа
случайно нажата символьная клавиша).
9. На проверку отправить тестовую базу с заранее подготовленными данными.
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
Пояснительная записка к проекту должна включать в указанной ниже последовательности:
1) титульный лист;
2) задание;
3) содержание;
4) введение;
5) основную часть;
6) заключение;
7) список литературы;
8) приложения.
1. Титульный лист оформляется согласно ОС ТУСУР 6.1-97.
2. Задание. В задании указывается вариант, исходные данные и перечень характеристик, которым должен соответствовать
программный продукт.
3. Содержание. В содержании перечисляются заголовки
разделов, подразделов, список литературы, приложения и указываются страницы, на которых они начинаются.
4. В разделе "Введение" указывают основную цель работы,
дают характеристику изучаемых вопросов (вопросов программирования в среде Office).
5. Основная часть проекта должна содержать:
159
- описание структуры программного комплекса;
- описание иерархии объектов;
- руководство пользователя программного продукта.
6. Заключение. В заключении студент формулирует свои
выводы по проделанной работе.
ВАРИАНТЫ ИНДИВИДУАЛЬНОГО ЗАДАНИЯ
Вариант 1
Написать программу-приложение, которая формирует базу,
содержащую сведения о книгах: название, автор, издательство,
год издания, количество. Просмотр базы и обработка должна
выполняться в программе Excel.
Программа должна удовлетворять всем вышеперечисленным требованиям и дополнительно выдавать следующую статистику:
 количество книг указанного автора. Учитывать только
один экземпляр каждого названия;
 какие издательства представлены в базе по указанному
наименованию книги;
 общий фонд базы.
Вариант 2
Написать программу, которая создает базу, содержащую сведения по студентам: ФИО, номер группы, экзаменационные оценки по N предметам и сведения о зачетах по M предметам. Просмотр базы и обработка должна выполняться в программе Excel.
Программа должна удовлетворять всем вышеперечисленным требованиям и дополнительно формировать следующий
документ: стипендиальная таблица. Таблицу формировать для
выбранной группы.
ФИО
Экзамены
Пр. 1 … Пр. N
Пр. 1
Зачеты
…
Пр. M
Стипендия
160
Назначение стипендии выполнять по следующей схеме: базовая стипендия – К руб.; отличник получает стипендию равную
Базовая + 50%. Хорошист получает стипендию равную Базовая + 25%.
Вариант 3
Написать программу, которая создает базу, содержащую
сведения о работниках предприятия: ФИО, должность, стаж и
заработная плата. Просмотр базы и обработка должна выполняться в программе Excel.
Программа должна удовлетворять всем вышеперечисленным требованиям и дополнительно выполнять следующие запросы:
 определить общую численность работников предприятия, работающих на текущий момент;
 вывести список сотрудников, у которых стаж превышает
10 лет с указанием ФИО, должности, зарплаты и стажа работы;
 вывести список сотрудников, имеющих самую низкую
заработную плату.
Вариант 4
Написать программу, которая формирует базу, содержащую
следующие поля:
Дисциплина
Кол-во
групп
лекции
Количество часов
лаб.
практ.
курс.
Некоторые поля данной базы могут содержать пустые значения. Просмотр базы и обработка должна выполняться в программе Excel.
Программа должна удовлетворять всем вышеперечисленным требованиям и дополнительно формировать следующий
документ: таблица распределения занятий в компьютерных залах на семестр (семестр – 18 недель). Загрузка должна быть равномерной и не превышать 10 часов в сутки. В случае превыше-
161
ния загрузки залов программа должна выдавать сообщение о
количестве часов, на которые требуются дополнительные ресурсы. Расчетное время заполняется по следующему алгоритму: для
лабораторных работ – Время_по_плану*кол-во_групп*2; для
практических занятий и курсовых работ – Время_по_плану*колво_групп.
№
п/п
Дисциплина
Время
Вид заня- по пла- расчетное
тий
ну
лаб.
Программировапракт.
ние
курс.
лаб.
Операционные
2
системы
курс.
Искусственный практ.
3 интеллект
курс.
лаб.
Системное пропракт.
4
граммирование
курс.
Итого
36
28
28
40
12
28
18
34
22
38
284
1
В том числе
к. зал1
к. зал2
Место проведения
144 к. зал1
56 к. зал2
56 к. зал2
160 к. зал1
24 к. зал2
56 к. зал2
36 к. зал2
136 к. зал2
44 к. зал1
76 к. зал1
788
424
364
Вариант 5
Написать программу формирования базы, в которой хранится расписание движения автобусов на междугородной автостанции: номер рейса, пункт отправления, пункт назначения,
время отправления, время прибытия. Просмотр базы и обработка должна выполняться в программе Excel.
Программа должна удовлетворять всем вышеперечисленным требованиям и дополнительно выполнять следующий запрос: как оптимально добраться из пункта А в пункт В, если
между указанными пунктами нет прямого сообщения.
162
Вариант 6
Написать программу, которая формирует базу, содержащую
следующие сведения: марка автомобиля, модель автомобиля,
дата отправления, дата прибытия, время отправления, время
прибытия. Просмотр базы и обработка должна выполняться в
программе Excel.
Программа должна удовлетворять всем вышеперечисленным требованиям и дополнительно формировать счет за аренду
для указанного автомобиля. Если время прибытия не занесено в
базу, то должно выдаваться сообщение об этом.
«Счет за аренду автомобиля»
Счет
Марка
ГАЗ
Магазину «Дом книги»
Модель
3307
с:
по:
Итого:
От
Дата
12.08.2000
22.08.2000
10 дней
Всего:
Тариф
до 4 часов
до 1 дня
до 1 недели
22.08.2000
Время
9:00
14:58
5:58
10450 р.
450 р.
1200 р.
5000 р.
Вариант 7
Написать программу, которая формирует базу сотрудников,
содержащую следующие сведения: ФИО, должность, оклад.
Просмотр базы и обработка должна выполняться в программе
Excel.
163
Программа должна удовлетворять всем вышеперечисленным требованиям и дополнительно формировать документ «Ведомость начисления заработной платы».
Оклад
ФИО
Начислено
Район. Сумма
коэф.
начис.
Подоход.
налог
Удержано
ПенСумсион.
ма
фонд
удерж.
Сумма
к выдаче
Данные для расчета ввести в окне запроса:
 районный коэффициент – n%;
 подоходный налог – p%;
 пенсионный фонд – k%.
Вариант 8
Написать программу, которая формирует две базы. Автомобиль – база, содержащая поля: марка автомобиля, расход бензина на 100 км. Города – база, содержащая поля: название города, расстояние до Москвы. Просмотр баз и обработка должна
выполняться в программе Excel.
Программа должна удовлетворять всем вышеперечисленным
требованиям и дополнительно формировать документ «Стоимость бензина для проезда из Москвы» для выбранных городов. Стоимость одного литра бензина вводить в окне запроса.
Стоимость бензина для проезда из Москвы
Марка автомобиля
Расход бензина на 100 км.
Цена 1 л бензина, руб
ВАЗ 2101
8
4
Город
Путь, км
Стоимость, руб.
Баку
Ленинград
Рига
Тбилиси
2420
680
1090
1990
774.4
217.6
348.8
636.8
164
Вариант 9
Написать программу, которая формирует базу «Телефонный справочник», содержащую следующие сведения: ФИО, адрес, телефон. Просмотр базы и обработка должна выполняться в
программе Excel.
Программа должна удовлетворять всем вышеперечисленным требованиям и дополнительно выводить следующую статистику:
 общее количество абонентов телефонной сети;
 количество телефонов на указанной улице;
 количество телефонов в указанном доме.
Вариант 10
Написать программу, которая формирует базу, в которой
содержатся сведения об основных средствах производства:
наименование, балансовая стоимость, дата постановки на учет.
Просмотр базы и обработка должна выполняться в программе
Excel.
Программа должна удовлетворять всем вышеперечисленным требованиям и дополнительно формировать документ
«Начисление месячного износа основных средств». Данные
для расчета вводить в окне запроса:
№ документа
Наименование
Дата
Коэф-т аморт.
165
Вычисленные данные записать в таблицу Excel. Амортизация вычисляется по формуле: Балансовая стоимость * Коэффициент амортизации /12.
Наименование
Здание
Балансовая
стоимость
350000
Амортизация
729
Остаточная
стоимость
349271
166
КОНТРОЛЬНАЯ РАБОТА № 1
Тема: «Базовые конструкции языка Visual Basic»
Содержание и требования к контрольной работе
1. В контрольной работе №1 необходимо выполнить алгоритмические задачи с использованием базовых типов данных и
основных операторов языка программирования VBA.
2. Контрольная работа содержит пять задач, выполнение
всех задач обязательно.
3. Темы задач: простые вычислительные алгоритмы, работа
с переменными типа строка, работа с одномерным массивом,
работа с двумерным массивом, работа с переменными типа запись.
4. Определить номер варианта и выполнить все задачи контрольной работы.
5. Задачи на проверку прислать в виде файлов Word либо
Excel, с кодом программы, выполненном в среде VBA соответствующего компонента Office.
6. В программах обязательно наличие комментариев, поясняющих основные алгоритмические шаги.
Вариант 1
1. Известны год и номер месяца рождения человека, а также год и номер месяца сегодняшнего дня (январь – 1 и т.д.).
Определить возраст человека (число полных лет). В случае совпадения указанных месяцев считать, что прошел весь год.
2. В файле хранится произвольный текст. Исключить из
каждой строки текста группы символов, расположенные между
скобками {,}. Сами скобки тоже должны быть исключены.
Предполагается, что внутри каждой пары скобок нет других
скобок. Результат записать в новый файл.
3. Написать процедуру, которая в одномерном массиве
определяет минимальный и максимальный элементы и находит
их среднее арифметическое. Размерность массива вводите с помощью оператора InputBox. Значения элементов массива определить датчиком случайных чисел. Для вывода скалярных ре-
167
зультатов вычислений используйте оператор вывода MsgBox.
Вывод массива выполнить в файл.
4. Написать процедуру, которая формирует двумерный
массив размерностью 5  5 по следующей схеме:
3
4
5 
1 2
1 4
9
16
25 

1 8 27
64
125 .


1 16 81 256 625 
1 32 243 1024 3125 
5. Дан список, состоящий из названия книг, фамилии авторов, названия издания и года издания. Напечатать список, упорядоченный по фамилии автора. Вывод на экран сформировать
в виде таблицы. Для ввода данных использовать форму и элементы управления.
Вариант 2
1. Услуги телефонной сети оплачиваются по следующему
правилу: за разговоры до А минут в месяц – по В руб., а разговоры сверх установленной нормы оплачиваются из расчета С
руб. за минуту. Написать программу, вычисляющую плату за
пользование телефоном для введенного времени разговоров за
месяц.
2. В файле хранится произвольный текст. Группы символов, разделенные пробелом и не содержащие пробелов внутри
себя, будем называть словами. Вывести самое длинное слово в
тексте и его длину.
3. Написать процедуру вычисления Z i  ( xi  50)  yi , где х
изменяется от 50 до 100, а y является элементом массива
y1 , y2 , ..., y11. Значения элементов массива вводите с помощью
оператора InputBox. Вывод массива выполнить в файл и на
экран с помощью оператора вывода MsgBox.
168
4. Даны две матрицы Х(n,m); У(k,l). Найти среднее арифметическое всех элементов в каждой матрице.
5. Дан список, состоящий из названия книг, фамилии авторов, названия издания и года издания. Напечатать список, упорядоченный по годам изданий. Вывод на экран сформировать в
виде таблицы. Для ввода данных использовать форму и элементы управления.
Вариант 3
1. К финалу конкурса лучшего по профессии «Специалист
электронного офиса» были допущены трое: Иванов, Петров,
Сидоров. Соревнования проходили в три тура. Иванов в первом
туре набрал m1 баллов, во втором – n1, в третьем – p1. Петров –
m2, n2, p2 соответственно; Сидоров – m3, n3, p3. Составить программу, определяющую, сколько баллов набрал победитель.
2. В файле хранится произвольный текст. Группы символов, разделенные пробелом и не содержащие пробелов внутри
себя, будем называть словами. Найти количество слов в тексте,
у которых первый и последний символ совпадают.
3. Написать процедуру поиска максимального элемента в
массиве из N элементов, используя «кубковую систему»: на первом шаге алгоритма из каждой пары рядом стоящих элементов
выбирается максимальный – он проходит в следующий тур.
Элемент, которому не находится пара, переходит в следующий
тур безусловно. На следующем шаге алгоритм повторяется и
так до тех пор, пока в массиве не останется один элемент – он и
будет максимальным. Размерность массива вводите с помощью
оператора InputBox. Значения элементов массива определить
датчиком случайных чисел. Для вывода скалярных результатов
вычислений используйте оператор вывода MsgBox. Вывод массива выполнить в файл.
4. Даны три матрицы А(n,m); В(l,l); С(k,l). Вычислить сумму элементов первой строки и произведение последнего столбца
в каждой матрице.
5. Дан список студентов группы и оценки экзаменационной
сессии. Напечатать список, упорядоченный по алфавиту, средний балл каждого и фамилии лучшего и худшего студента по
169
среднему баллу. Вывод на экран сформировать в виде таблицы.
Для ввода данных использовать форму и элементы управления.
Вариант 4
1. В небоскребе N этажей и всего один подъезд; на каждом
этаже по три квартиры; лифт может останавливаться только на
нечетных этажах. Человек садится в лифт и набирает номер
квартиры M. На какой этаж лифт должен доставить пассажира?
2. В файле хранится произвольный текст. Группы символов, разделенные пробелом и не содержащие пробелов внутри
себя, будем называть словами. Удалить из каждого слова текста
все последующие вхождения его первой буквы. Результат записать в новый файл.
3. Дан массив x1, x2 , ..., xN . Удалить элемент массива,
больший заданного числа. Если таких элементов нет, выдать
сообщение: «Элементы для удаления не найдены». Если таких
элементов несколько, то удалить последний из найденных. Размерность массива и заданное число вводите с помощью оператора InputBox. Значения элементов массива определить датчиком случайных чисел. Для вывода скалярных результатов вычислений используйте оператор вывода MsgBox. Вывод массива
выполнить в файл.
4. Даны две матрицы А(5,5); В(6,6). Уменьшить максимальный элемент в каждой из этих матриц в 10 раз.
5. Дан список, состоящий из названий книг, фамилий авторов, издательства и года изданий. Упорядочить список по издательствам. Вывод на экран сформировать в виде таблицы. Для
ввода данных использовать форму и элементы управления.
Вариант 5
1. Составить программу, имитирующую применение компьютера в книжном магазине. Компьютер запрашивает стоимость книг, сумму денег, внесенную покупателем; если сдачи не
требуется, печатает на экране «Спасибо»; если денег внесено
больше, чем необходимо, то печатает «Возьмите сдачу» и ука-
170
зывает сумму сдачи; если денег недостаточно, то печатает сообщение об этом и указывает размер недостающей суммы.
2. В файле хранится произвольный текст. Группы символов, разделенные пробелом и не содержащие пробелов внутри
себя, будем называть словами. Вывести все буквы, которые входят в наибольшее количество слов текста.
3. Дан массив А(N). В массиве найти сумму элементов после первого отрицательного и сумму элементов до него. Размерность массива вводите с помощью оператора InputBox. Значения элементов массива определить датчиком случайных чисел. Для вывода скалярных результатов вычислений используйте оператор вывода MsgBox. Вывод массива выполнить в файл.
4. Дана матрица А(n,m). Вычислить произведения элементов в каждом столбце заданной матрицы.
5. Имеется K заявлений на получение жилплощади, в каждом указан срок подачи заявлений, площадь занимаемой квартиры и количество членов семьи. Составить и напечатать список
очередности по сроку подачи заявления. Вывод на экран сформировать в виде таблицы. Для ввода данных использовать форму и элементы управления.
Вариант 6
1. Год является високосным, если его номер кратен 4. Из
кратных 100 високосными годами являются лишь те года, которые кратны также 400 (например, 1700, 1800, 1900 – не високосные года, 2000 – високосный год). Дано натуральное число N.
Определить, является ли високосным год с таким номером.
2. В файле хранится произвольный текст. Между словами
текста минимум один пробел. Написать программу, которая
между словами текста ставит по три знака точка (…). Результат
записать в новый файл.
3. Даны три массива А(N), В(M), С(L). Найти максимальный элемент в каждом массиве и максимальный среди них.
Размерность массивов вводите с помощью оператора InputBox.
Значения элементов массивов определить датчиком случайных
чисел. Для вывода скалярных результатов вычислений исполь-
171
зуйте оператор вывода MsgBox. Вывод массивов выполнить в
файл.
4. Даны две матрицы А(n,m); В(k,l). Вычислить сумму и
разность максимальных элементов этих матриц.
5. Дан список сотрудников лаборатории, должность и возраст каждого сотрудника. Напечатать список по должностям и
средний возраст каждой группы. (Должности: ст. инж., м.н.с.,
с.н.с., лаборант). Вывод на экран сформировать в виде таблицы.
Для ввода данных использовать форму и элементы управления.
Вариант 7
1. Работа светофора для пешеходов запрограммирована
следующим образом: в начале каждого часа в течение трех минут горит зеленый сигнал, затем в течение двух минут – красный, в течение трех минут – опять зеленый и т.д.; дано вещественное число t, означающее время в минутах.
2. В файле хранится произвольный текст. Написать программу, которая преобразует каждую строку текста, выравнивая
ее до заданной длины добавлением пробелов между словами.
Результат записать в новый файл.
3. Дан массив a1 , a2 , ..., aN . Расположить положительные
элементы массива, стоящие на нечетных местах, по возрастанию, остальные оставить на своих местах. Размерность массива
вводите с помощью оператора InputBox. Значения элементов
массива определить датчиком случайных чисел. Вывод массива
выполнить в файл и на экран с помощью оператора вывода
MsgBox.
4. Дана матрица А(n,m). Если сумма всех элементов матрицы больше 0, то у первого элемента этой матрицы заменить
знак на противоположный.
5. Дан список группы с оценками экзаменационной сессии.
Подсчитать количество отличников в группе и в поле «имеется
задолженность» студентам, имеющим двойки, напечатать «да»,
а всем остальным «нет». Вывод на экран сформировать в виде
таблицы, упорядоченной по алфавиту. Для ввода данных использовать форму и элементы управления.
172
Вариант 8
1. В ЭВМ поступают результаты соревнований по плаванию; для трех спортсменов составить программу, которая выбирает лучший результат и выводит его на экран с сообщением о
том, что это результат победителя заплыва.
2. В файле хранится произвольный текст. Группы символов, разделенные пробелом и не содержащие пробелов внутри
себя, будем называть словами. Определить количество слов в
каждой строке текста, которые содержат ровно две буквы а. На
экран вывести номер строки и соответствующее ей количество
слов.
3. Дан массив А(N). Найти максимальный элемент массива
и нормировать элементы массива по максимальному. Размерность массива вводите с помощью оператора InputBox. Значения
элементов массива определить датчиком случайных чисел. Для
вывода скалярных результатов вычислений используйте оператор вывода MsgBox. Вывод массива выполнить в файл.
4. Даны три матрицы А(n,n); В(n,n); С(n,n). Присвоить переменной Y значение 2, если все матрицы равны между собой,
значение 1, если равны какие-либо две из них, значение 0 в противном случае.
5. Дан список абитуриентов, средний балл аттестата и
оценки на вступительных экзаменах у каждого. Считая, что
проходной балл 22, определить, станет ли данный абитуриент
студентом. Если да, то в графе «принят» поставить «да», в противном случае – «нет». Вывод на экран сформировать в виде
таблицы, упорядоченной по алфавиту. Для ввода данных использовать форму и элементы управления.
Вариант 9
1. В древнем японском календаре был принят 60-летний
цикл, состоящий из пяти 12-летних подциклов. Подциклы означались названиями цветов: зеленый, красный, желтый, белый и
черный. Внутри каждого подцикла годы носили названия животных: крыса, корова, тигр, заяц, дракон, змея, лошадь, овца,
173
обезьяна, курица, собака и свинья. Например, 1984 год – год
начала очередного цикла – назывался годом зеленой крысы.
Составить программу, которая по заданному номеру года
нашей эры N выводит его название по древнему японскому календарю.
2. В файле хранится произвольный текст на русском языке.
Проверить, каких букв в нем больше: гласных или согласных.
3. Дан массив a1 , a2 , ..., aN . Расположить ненулевые элементы массива по убыванию; остальные элементы оставить на
своих местах. Размерность массива вводите с помощью оператора InputBox. Значения элементов массива определить датчиком случайных чисел. Вывод массива выполнить в файл и на
экран с помощью оператора вывода MsgBox.
4. Даны две матрицы А(n,n); В(m,m). Присвоить переменной B1 значение 1, если элементы матрицы А симметричны относительно главной диагонали, и значение 0 в противном случае. Значение переменной В определить аналогично для матрицы В.
5. Дан список группы и оценки экзаменационной сессии с
названием предметов. Напечатать список, упорядоченный по
алфавиту, и подсчитать, по какому предмету в группе имеется
наибольшее количество двоек. Вывод на экран сформировать в
виде таблицы. Для ввода данных использовать форму и элементы управления.
Вариант 10
1. В некотором учебном заведении действуют следующие
правила приема. Абитуриенты сдают три экзамена. Если они
набирают не менее 13 баллов, то это дает право поступить на
дневное отделение, от 10 до 12 – на вечернее, от 8 до 9 – на заочное, ниже восьми баллов означает отказ в приеме на учебу.
Написать программу, которая в зависимости от суммы набранных баллов сообщает абитуриенту его права на поступление.
2. В файле хранится произвольный текст. Отредактировать
заданный текст, удаляя из него все слова с четными номерами и
174
переворачивая (печатая символы в обратном порядке) слова с
нечетными номерами. Результат записать в новый файл.
3. Подсчитать число точек, находящихся внутри круга радиусом R, с центром в точке с координатами (1,1). Координаты
заданы массивами X(N), Y(N). Размерность массивов вводите с
помощью оператора InputBox. Значения элементов массивов
определить датчиком случайных чисел. Для вывода скалярных
результатов вычислений используйте оператор вывода MsgBox.
Вывод массивов выполнить в файл.
4. Написать процедуру, которая формирует двумерный
массив А по следующему алгоритму:
Aij   i   j 3 , i изменяется от 0 до N, j изменяется от 0 до
M.
5. Дан список группы с результатами сессии. Считая, что
студент, имеющий не более одной тройки, имеет право на стипендию, поставить в соответствие такому студенту в поле «стипендия» знак «+», в противном случае – знак «–». Вывод на
экран сформировать в виде таблицы, упорядоченной по алфавиту. Для ввода данных использовать форму и элементы управления.
175
КОНТРОЛЬНАЯ РАБОТА №2
Тема: «Макросы VBA»
Содержание и требования к контрольной работе
1. Контрольная работа содержит четыре задачи, выполнение
всех задач обязательно.
2. Первое и второе задания: требуется создать макрос, используя средство автоматического создания макросов. Назначить
макросу кнопку на панели инструментов, выбрав либо создав
уникальный значок. Название значка определить только во
всплывающей подсказке. Проверить работу макроса. Добавить к
макросу необходимые комментарии. Внести в код созданного
макроса изменения, обеспечивающие возможность выбора устанавливаемых параметров макроса, например, выбор цвета для
шрифта и т.п. Для этого разработать пользовательскую форму, в
которой в качестве элемента управления могут быть использованы полоса прокрутки, список, поле со списком. Вновь проверить работу макроса.
3. Третье задание: создать функцию пользователя в соответствии с вариантом.
4. Четвертое задание: для функций из задания №3 разработайте пользовательскую форму, в которой в качестве элемента
управления для выбора варианта решения применяются переключатели. На форме определите поля ввода данных для расчета
значения функции в заданной точке и вывода результата вычислений. Добавьте в форму кнопку Отмена для завершения работы
с пользовательской формой.
5. Задачи на проверку прислать в виде файлов Word и Excel,
с кодом программы, выполненном в среде VBA соответствующего компонента Office.
6. В программах обязательно наличие комментариев, поясняющих основные алгоритмические шаги.
176
Вариант 1
1. Создайте макрос для Word, изменяющий тип обрамления
(а также толщину и цвет обрамления) фрагмента теста.
2. Создайте макрос для Excel, изменяющий цвет и размер
символов в ячейке.
3. Создайте две функции пользователя в соответствии с
формулами. Проверьте, что вновь созданные функции появились в общем списке функций, вызвав, например, Мастер
функций в MS Excel. Используя функции пользователя, протабулируйте каждую функцию в MS Excel.
Y  cos(3x)  sin( 5x).
 x  2 x 2  11, x  3,
g
3 x 2  2 x  4, x  3.
Вариант 2
1. Создайте макрос для Word, переносящий фрагмент текста в новую позицию и изменяющий его стиль.
2. Создайте макрос для Excel, производящий автозаполнение строки ячеек месяцами.
3. Создайте две функции пользователя в соответствии с
формулами. Проверьте, что вновь созданные функции появились в общем списке функций, вызвав, например, Мастер
функций в MS Excel. Используя функции пользователя, протабулируйте каждую функцию в MS Excel.
Z
3
1  x4  x2  y
.
1 y
2 x , x  2,
g
 x 3  x 2  12 x, x  2.
4. Для функций из задания №3 разработайте пользовательскую форму, в которой в качестве элемента управления для выбора варианта решения применяются переключатели. Добавьте
177
в форму кнопку Отмена для завершения работы с пользовательской формой.
Вариант 3
1. Создайте макрос для Word, преобразующий фрагмент
текста в маркированный список.
2. Создайте макрос для Excel, устанавливающий название
рабочего листа.
3. Создайте две функции пользователя в соответствии с
формулами. Проверьте, что вновь созданные функции появились в общем списке функций, вызвав, например, Мастер
функций в MS Excel. Используя функции пользователя, протабулируйте каждую функцию в MS Excel.
Y  2 sin( x) sin( 3x)  0.5.
 x 2  10 x  5 , x  4,
g
e  x  x  1, x  4.
Вариант 4
1. Создайте макрос для Word, изменяющий в абзаце цвет,
размер, начертание символов.
2. Создайте макрос для Excel, меняющий местами содержимое двух ячеек.
3. Создайте две функции пользователя в соответствии с
формулами. Проверьте, что вновь созданные функции появились в общем списке функций, вызвав, например, Мастер
функций в MS Excel. Используя функции пользователя, протабулируйте каждую функцию в MS Excel.
cos(x)  sin(x)
Y
.
x
2
1  x  , x  1,
g
3x 2  5 x  1, x  1.
178
Вариант 5
1. Создайте макрос для Word, добавляющий в таблицу два
смежных столбца слева от заданного столбца.
2. Создайте макрос для Excel, меняющий местами заданные строки.
3. Создайте две функции пользователя в соответствии с
формулами. Проверьте, что вновь созданные функции появились в общем списке функций, вызвав, например, Мастер
функций в MS Excel. Используя функции пользователя, протабулируйте каждую функцию в MS Excel.
(1  xy  x 2  y 2 ) x
Z
 2.
y3
y
 x

, x  1,
g   x 1

1  x 2 , x  1.
Вариант 6
1. Создайте макрос для Word, разбивающий текст на колонки.
2. Создайте макрос для Excel, изменяющий формат вводимого в ячейке числа.
3. Создайте две функции пользователя в соответствии с
формулами. Проверьте, что вновь созданные функции появились в общем списке функций, вызвав, например, Мастер
функций в MS Excel. Используя функции пользователя протабулируйте каждую функцию в MS Excel.
x2
Z  e x x3  y 3  .
y
 x  5 , x  1,
g
 x 2  x  1, x  1.
179
Вариант 7
1. Создайте макрос для Word, изменяющий параметры абзаца (выравнивание, интервал, отступ первой строки).
2. Создайте макрос для Excel, вставляющий формулу в
ячейку.
3. Создайте две функции пользователя в соответствии с
формулами. Проверьте, что вновь созданные функции появились в общем списке функций, вызвав, например, Мастер
функций в MS Excel. Используя функции пользователя, протабулируйте каждую функцию в MS Excel
sin( 3x)
Y  2 cos(3x) sin(x) 
.
x
e x , x  0,
g
sin(x), x  0.
Вариант 8
1. Создайте макрос для Word, добавляющий номера строк
и изменяющий начертание символов.
2. Создайте макрос для Excel, меняющий местами заданные столбцы.
3. Создайте две функции пользователя в соответствии с
формулами. Проверьте, что вновь созданные функции появились в общем списке функций, вызвав, например, Мастер
функций в MS Excel. Используя функции пользователя, протабулируйте каждую функцию в MS Excel.
cos(x)
Y
 sin(x) x.
x
 x
, x  1,

g   x 1
 x 2 , x  1.

180
Вариант 9
1. Создайте макрос для Word, устанавливающий новые параметры страницы.
2. Создайте макрос для Excel, присваивающий ячейке имя
и центрирующий ее содержимое.
3. Создайте две функции пользователя в соответствии с
формулами. Проверьте, что вновь созданные функции появились в общем списке функций, вызвав, например, Мастер
функций в MS Excel. Используя функции пользователя, протабулируйте каждую функцию в MS Excel.
Y  0.4 cos(x) sin(x) cos(3x).
 x , x  5,
g
1  x 2 , x  5.
Вариант 10
1. Создайте макрос для Word, добавляющий к тексту номера страниц.
2. Создайте макрос для Excel, добавляющий в ячейку текст
заданного цвета.
3. Создайте две функции пользователя в соответствии с
формулами. Проверьте, что вновь созданные функции появились в общем списке функций, вызвав, например, Мастер
функций в MS Excel. Используя функции пользователя, протабулируйте каждую функцию в MS Excel.
sin(x)
cos(x)
Y  3 cos(x)

.
1  sin(x)
x
 x 2  x  2 , x  1,
g
5 x 2  x  6, x  1.
181
СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ
1. Биллиг В.А. VBA и OFFICE 2000. Офисное программирование. – М.: Издательско-торговый дом «Русская редакция»,
1999. – 480 с.
2. Биллиг В.А. Средства разработки VBA-программиста.
Офисное программирование. Том 1. – М.: Издательско-торговый
дом «Русская редакция», 2001.– 480 с.
3. Хомоненко А. MS Word-97. – СПб.: BHV. – СанктПетербург, 1998. – 512 с.
4. Гарнаев А.Ю. Использование MS Excel и VBA в экономике и финансах. – СПб.: BHV. – Санкт-Петербург, 1999. –
336 с.
5. Демидова Л.А., Пылькин А.Н. Программирование в среде Visual Basic For Applications: Практикум – М.: Горячая линия
– Телеком, 2004. – 175 с.
6. Малышев С.А. Самоучитель по VBA. Как это делается в
Word, Excel, Access. – СПб.: Наука и техника, 2001. – 496 с.
7. А.Иванюк. Продолжаем изучать Visual Basic.
http://www.codenet.ru/progr/vbasic/cont/
8. Библиотека программиста. http://prog.agava.ru/
9. Курс для начинающих в Visual Basic
http://vb.hut.ru/vbnovice/lessons.htm
Download