Безусловный цикл (Цикл по счетчику)
FOR … NEXT
Цикл с определенным количеством повторений. Цикл выполняется от начального до конечного значения параметра с заданным шагом.
Пример:
Dim X As Integer
For X=1 To 10 Step 1 ‘Повторять цикл от 1 до 10 с шагом 1.
Beep ‘Звук (тело цикла).
Next X ‘Конец цикла.
Exit For или Exit Do ‘Досрочный выход из цикла.
FOR … NEXT
Цикл For Each … Next предназначен для перебора всех элементов из заданного массива или набора объектов.
Пример использования цикла применительно к массивам:
Sub Mas6()
Dim i As Integer
Dim j As Integer
Dim x(1 To 5, 1 To 5) As Single
Dim S As Single
Worksheets("Лист1").Activate
For i=1 To 5
For j=1 To 5
x(i,j)=Cells(i,j)
Next j
Next i
For Each e In x
S=S+e
Next e
MsgBox(“S=”) & CStr(s)
End Sub
Сложные (вложенные) циклы
Совокупность простых циклов, вложенных один в другой, называется сложным (вложенным) циклом. При конструировании сложных циклов необходимо руководствоваться следующими правилами:
нельзя войти во внутренний цикл, минуя вход внешнего цикла;
имена параметров простых циклов не должны повторяться в конструкции сложного цикла;
простые циклы не должны пересекаться в конструкции сложного цикла, то есть окончание внешнего цикла не должно предшествовать окончанию внутреннего цикла.
Примеры:
For i=1 to n
For j=1 to m
A(i , j)=Int(Sin(j*i)*100)
Next j
Next i
Do
X=1
Z=0
Do
S=Int(Rnd(x)*100)
Z=Z+S
X=X+1
Loop Until X>=20
Zsr=Z/20
Loop Until Zsr>=25
Процедуры ввода-вывода через диалоговые окна
В сокращенном варианте инструкции ввода-вывода имеют вид:
InputBox(<”сообщение”>)
MsgBox(<“сообщение”>)
Пример:
Sub Krb()
Dim S As Integer
Dim Sum As Single
Dim P As Integer
Dim Prom As Variant
S=5000
Do
Prom=InputBox(“Введите значение P=”)
IF Not IsNumeric(Prom) Then MsgBox(“Повторите ввод!”)
Loop Until IsNumeric(Prom)
P=Prom
Sum=S+S*0.01*P
MsgBox(“Результат S=”) & CSng(Sum)
End Sub
Основные объекты VBA
К числу основных объектов VBA, которые описываются в этом разделе, относятся: рабочая книга (Workbook) и семейство рабочих книг (Workbooks), рабочий лист (Worksheet) и семейство рабочих листов (Worksheets), диапазон ячеек или ячейка (Range).
После объекта, обычно через точку “.”, указывается свойство или метод. Иногда, чтобы добраться до определенного объекта, нужно пройти иерархию вышестоящих объектов.
Пример:
Workbooks(“Книга 1.xls”).Worksheets(“Лист1”).Activate
Свойства и методы, которые обеспечивают ссылку на нужный объект в иерархии объектов, называются семействами (наборами).
Семейство WorkBooks("Книга1") ‘Обеспечивает доступ к рабочей книге. В скобках указывается имя книги.
Семейство WorkSheets("Лист1") ‘Обеспечивает доступ к рабочему листу. В скобках указывается имя листа.
Семейство Range("диапазон") ‘Обеспечивает доступ к диапазону ячеек или к ячейке. В скобках указывается диапазон ячеек или имя ячейки.
Семейство Cells(№ строки, № столбца) ‘Обеспечивает доступ к ячейке. В скобках указываются координаты ячейки.
Примеры:
WorkBooks("Книга1")
WorkSheets("Лист1")
Range("A1")
Range("A1:В10")
Cells(2,3)
Cells(k,i+1)
Оформление рабочего листа
Внешнее оформление ячеек и данных в них производится с помощью свойств объектов:Range, Interior, Font, Border и свойства NumberFormat.
Оформление текста в ячейке
Format–свойство объекта, задающее формат вывода данных.
Пример:
Range(“a1”).Format=”шаблон”
Могут применяться следующие шаблоны.
Таблица 9.4.4.1.1
Шаблон | Расшифровка шаблона |
”#,##0.000” | Формат для вывода чисел с точностью до 3 знака после запятой. Специальные символы: “#” – необязательное число; “0” – обязательное число; “.“ – разделитель тысячных; “,” – разделитель между целой и дробной частью |
“#,##0.00$” | “$” – обозначение национальной валюты |
“dd/mm/yy” | Вывод даты в формате 11.01.99, где:“d” – день; “m” – месяц;“yy” – две последние цифры года |
“dd/mm/yyyy” | Вывод даты в формате 01.01.1999 |
“d/mm” | Вывод даты в формате 1.01 |
“d mmm yy” | 1 янв. 99, где mmm– сокращение месяца |
“d mmmm yy” | 1 января 99, где mmmm – полное название месяца |
“h:mm” | Время в формате 1:23, где h – часы, mm – минуты |
“h:mm:ss” | Время в формате 1:23:00, где ss – секунды |
“0.00%” | Процентный формат, к примеру, 3 – это 300 % |
“@” | Текстовый формат |
“0.00E+00” | Экспоненциальный формат числа |
Примеры:
Range(“C1:C6”).Select
Selection.NumberFormat=”0,0”
Range(“D1:D6”).Select
Selection.NumberFormat=”dd/mm/yy”
Range(“E1:E6”).Select
Selection.NumberFormat=”h:mm:ss”
Range(“F1:F6”).Select
Selection.NumberFormat=”@”
27.
Итак, вся разработка и отладка программ ведется с помощью Редактора Visual Basic (Visual Basic Editor, VBE). Запуск редактора для приложений Microsoft Office осуществляется следующим образом > Сервис > макрос > Редактор visaul Basic (<Alt>+<F11>) (см. раздел 21.1 "Общие положения").
Обычно в окне редактора используются три панели (три отдельных окна). На самом деле окон может быть и больше и меньше, и скоро вы узнаете обо всех, но это — основные окна, открывающиеся по умолчанию (рис. 20.2):
Project(Окно проекта);
Properties(Окно свойств);
Code(Окно кода).
Итак, первое окно, которое мы рассмотрим, — окно проекта, обычно располагающееся в верхнем левом углу редактора (рис. 20.3). Если оно не активно, выберите команду > view > Project Explorer либо нажмите комбинацию клавиш <Ctrl>+<R>.
В окне проекта отображается иерархическое дерево проектов приложения и модулей этих проектов с их элементами. О проектах VBA будет более подробно рассказано чуть ниже, сейчас же мы рассмотрим лишь возможности редактора.
В нашем случае в окне проекта открыт только один проект — Проект 1.
Каждый проект содержит пять папок с модулями:
Microsoft Outlook Objects— папка с объектом приложения ThisOutlookSession;
Forms— папка содержит пользовательские модули форм (userForm. — см. главу 22 "Разработка приложения")',
Modules— папка содержит стандартные модули пользователя;
Class Modules— папка содержит пользовательские модули классов;
References— папка содержит ссылки на объекты из внешних библиотек и список модулей этих библиотек.
Если окно кода не активно, выберите команду > View > Code или нажмите клавишу <F7>.
Рис. 20.2. Редактор Visual Basic for Application
О добавлении, удалении и переименовании модулей в проекте будет рассказано ниже.
Помимо области, где отображаются документы, на панели проекта располагаются три кнопки.
View Code.После нажатия на данную кнопку указатель перемещается в окно кода, где отображается код выделенного объекта.
View Object.При нажатии этой кнопки показывается реализация выделенного объекта. Например, если выделен Лист2, то при нажатии кнопки View Objectвы увидите второй лист рабочей книги Excel.
Toggle Folders.При нажатой кнопке отображаются элементы проекта в соответствующих кнопках, при отжатой — элементы проекта располагаются просто в алфавитном порядке.
Перейдем теперь к рассмотрению окна свойств, обычно располагающегося под окном проектов. Данное окно позволяет просматривать и изменять свойства различных объектов, входящих в проект. Для отображения свойств объекта его необходимо выделить. Объект можно выделить на панели проектов, на пользовательской форме. Кроме того, можно выделять объекты, подчиненные выделенным объектам. Так, например, для модуля доступно только свойство Name. Более эффективен этот прием при работе с многочисленными объектами, подчиненными пользовательским формам.
Чтобы изменить значение свойства объекта, необходимо: Выделить имя свойства в левой колонке.
Изменить значение этого свойства в правой колонке либо введя его с клавиатуры, либо выбрав из раскрывающегося списка.
Безусловно, окно свойств — очень полезный инструмент, поскольку сразу видны почти все свойства объекта и их допустимые значения. Но изменение свойств объекта посредством панели статично и не обладает программной динамикой. Подобная панель удобна для задания начальных или постоянных значений свойств объекта, таких как имя листа или цвет пользовательской формы. Мы изменили имя первого модуля Moduiei на Test (рис. 20.3).
Рис. 20.2. Окно проекта
Рис. 20.3. Окно свойств
Кстати, свойства можно отображать как в алфавитном порядке, так и по категориям, посредством выбора соответствующих вкладок Alphabeticили Categorized.Следующая рассматриваемая нами панель — панель кода. Это окно занимает большую часть экрана. Данная панель — это не просто "чистый лист", предназначенный для ввода кода, а специализированный высокоинтеллектуальный текстовый редактор, существенно облегчающий введение, форматирование и редактирование кода VBA. Окно кода напрямую связано с модулем проекта и открывается при двойном щелчке мышью по необходимому модулю в окне проекта.
Замечание
Вообще говоря, окно кода является "многодокументным", т. е. можно открыть одновременно несколько окон данного типа для разных модулей. На рис. 20.10 каскадно отображены три окна трех модулей соответственно. Для изменения отображения окон можно воспользоваться командами меню Window.
Здесь мы опишем главные возможности редактора кода VBA:
Автоматическое завершение ввода стандартных лексем языка.Например, после ввода ключевого слова sub имяПроцедуры и нажатия клавиши <Enter> VBA автоматически добавляет скобки и строку End Sub.
Автоматическое выравнивание и отступ.К примеру, после ввода оператора присваивания р=р+1 и нажатия клавиши <Enter> редактор вставит пробелы: р = р + 1.
Автоматическое выделение цветом лексических и синтаксических конструкций.Ключевые слова VBA выделяются синим цветом, ошибочные конструкции — красным, а комментарии — зеленым.
Автоматическая проверка правильности семантики и синтаксиса конструкций.Если вы введете inputBox () и забудете присвоить значение этой функции переменной (потеря семантики), автоматически появится предупреждение об ошибке.
Автоматический вывод списка компонентов..Позволяет избежать ошибок при вводе наименований свойств объектов, встроенных констант, типов переменных. Особенно полезна эта функция при установке свойств объекта, т. к. дает возможность не только вспомнить правильное имя свойства, но и увидеть, какие свойства объекта доступны в данный момент.
Автоматический вывод кратких сведений.Показывает в виде подсказки синтаксис встроенных процедур и функций. По мере ввода очередной параметр выделяется жирным шрифтом.
Если вы тестировали примеры предыдущего раздела, то не раз должны были встречаться со всеми свойствами редактора. Неправда ли, он умен? Но это только внутренняя часть окна кода, рассмотрим теперь его интерфейс.
В левом верхнем углу окна кода размещается раскрывающийся список Object(Объект), содержащий объекты выделенного модуля. Понятно, что для стандартного модуля этот список отсутствует, но, скажем, для модуля Этакнига данный список содержит объект workbook, для которого можно написать процедуры реакции на событие. Но и тут "умное" окно кода приходит на помощь. В правом верхнем углу в раскрывающемся списке Procedure(Процедура) содержатся все стандартные процедуры реакции на события для этого объекта. В случае со стандартным модулем этот список содержит все процедуры модуля, а также общий раздел объявлений Declarations(Объявления), в котором описываются переменные уровня модуля. При этом, выбрав одну из процедур в этом списке, вы автоматически попадете на ее начало.
С помощью кнопок в левом нижнем углу окна можно выбрать один из двух видов представления кода в окне:
представление процедуры, когда в окне отображается только выбранная процедура;
представление полного модуля, когда в окне отображается сразу несколько процедур, которые отделены друг от друга тонкой линией (см. рис. 20.4).
Рис. 20.4. Окно кода
Для более детальной настройки интерфейса всегда можно воспользоваться диалоговым окном Options(Опции) меню Tools(Инструменты). В нем вам предоставляется возможность изменить такие установки, как автоматическая проверка и помощь при вводе кода, разделение процедур тонкой чертой, изменение параметров шрифта кода, размещение окон редактора и т. д. Настройка редактора достаточно проста, и мы не будем подробно ее описывать. Если же у вас возникнут вопросы по назначению того или иного параметра, вы всегда можете обратиться к справочной системе VBA, о работе с которой и пойдет сейчас речь.
Современные системы программирования отличаются от систем программирования прежних лет:
очень богатым набором готовых программных компонент, которые можно использовать в программах (об этом пойдет речь в главе 21 "Объектная модель Outlook 2002");
очень развитой системой получения информации о среде программирования непосредственно из самого редактора (об этом рассказывается в настоящем разделе).
Нельзя объять необъятное, а точнее, невозможно (да и не нужно) в рамках этой книги описать весь VBA. Наша цель, как было сказано, краткое изложение полного вводного курса в VBA. Однако всего не опишешь. Поэтому мы советуем вам за ответом на тот или иной появившейся вопрос обращаться к встроенной справочной системе VBA. Умение пользоваться ею — это необходимое условие работы программиста и, мы думаем, не стоит уделять внимание обсуждению вопроса, насколько необходимо это условие, ибо без навыков работы со справочной системой невозможно быстрое и полноценное программирование.
Пример 20.6. Добавление модуля
>Insert > {Forms | Module | Class Module}
Для удаления какого-либо модуля из проекта необходимо его сначала выделить. При удалении модуля появится диалоговое окно, предлагающее перед удалением экспортировать модуль. Об экспорте и импорте модулей будет рассказано ниже.
Пример 20.7. Удаление модуля
> File > Remove Module Нет
Помимо вышеприведенных способов добавления и удаления модулей существует еще один, и на наш взгляд, более естественный способ. Для добавления (удаления) модуля необходимо в окне проекта выполнить следующую последовательность действий:
Insert
> (Forms | Module | Class Module}
( Remove Module)
При создании нового модуля ему присваивается имя модульы, где N — порядковый номер этого модуля. Аналогичная ситуация происходит при автоматической записи макросов, где модулю, содержащему макрос, присваивается имя NewMacros. Подобное наименование не несет никакой информативной нагрузки о содержании модуля, поэтому мы советуем всегда переименовывать стандартные имена модулей.
Пример 20.8. Переименование модуля
{В окне проекта} Modulel
{В окне свойств} Name := <Новое имя модуля>
После того как мы освоили создание и удаление модулей, давайте рассмотрим, для чего же они предназначены.
Модуль объекта приложения.Модули этого типа всегда связаны с объектами, реагирующими на события. Главное назначение подобных модулей состоит в том, что они содержат заготовки процедур реакций на события. Так, например, в Excel модуль ЭтаКнига содержит объект workBook, с которым связаны события ОТ Activate ДО WindowResize.
Стандартный модуль.В модулях этого типа следует размещать обычные процедуры и функции. Как правило, это наиболее часто используемый тип модуля. При наличии большого количества процедур разумно иметь не один большой модуль, а несколько маленьких, содержащих процедуры и функции одной тематической направленности.
Модуль класса.Это специальный тип модуля, в котором следует размещать код пользовательских классов.
Модуль пользовательской формы.В этих модулях содержатся пользовательские формы вместе с процедурами реакции на события объектов этих форм.
И наконец, говоря о ведении проекта, нельзя не упомянуть о его сохранении. Безусловно, сохраняя весь документ приложения, вы сохраняете и проект, к нему присоединенный. Но, вообще говоря, можно сохранить проект и все изменения его кода прямо в редакторе.
Пример 20.9. Сохранение проекта
> File > Save имяПроекта
Ведение современных проектов целой командой разработчиков (или даже одним человеком) зачастую требует использования кода разных модулей, лежащих в разных проектах. В таких случаях можно воспользоваться вспомогательным инструментом VBA — экспортом и импортом модулей.
Если при работе над новым проектом А вам потребовались только одна функция или один класс, описанные в проекте в, то совсем необязательно на них ссылаться. Можно экспортировать модули из одного проекта в другой. Давайте на примере класса Person рассмотрим процедуру экспорта из проекта ciassPerson в новый проект.
Сначала мы выделяем экспортируемый модуль и сохраняем его на жестком диске в виде отдельного файла с именем, после чего импортируем этот файл в новый проект. В принципе произошло простое копирование кода из проекта в проект, но более цивилизованным методом. Кстати, следующему проекту, которому будет необходим класс Person, достаточно только импортирования уже созданного файла.