- •Л.Н. Лядова, н.В. Фролова, в.В. Ланин, е.Б. Замятина, м.А. Плаксин, б.А. Ермолаев
- •Часть 2. Основы офисного программирования
- •Оглавление
- •Глава 6. Использование Win32 api 113
- •Глава 7. Использование шаблонов и надстроек 118
- •Глава 8. Разработка приложений с помощью Excel 122
- •Глава 9. Разработка приложений с помощью Word 223
- •Глава 10. Использование Automation при интегрировании компонентов Microsoft Office 256
- •Глава 11. Организация доступа к внешним данным 279
- •Глава 12. Общие рекомендации по разработке приложений 297
- •Глава 13. Разработка справочной системы 298
- •Глава 14. Дополнительные рекомендации 301
- •Пояснительная записка
- •Уровень предварительной подготовки слушателей
- •Образовательные цели и задачи
- •Знания и навыки, получаемые в ходе изучения курса
- •Содержание занятий
- •Вопросы для самостоятельного изучения
- •Содержание лабораторных работ
- •Итоговые работы
- •Введение
- •Глава 1.Общая характеристика возможностей vba
- •Глава 2.Основные принципы разработки приложений
- •Глава 3.Основные правила разработки интерфейса
- •Глава 4.Visual Basic для приложений
- •Глава 5.Введение в язык и редактор Visual Basic
- •5.1.Окно Редактора Visual Basic
- •5.2.Основные правила записи программ на vba
- •5.2.1. Описания в программах на языке vba
- •5.2.2. Структуризация программ vba и правила записи кода процедур
- •5.2.3. Использование параметров
- •5.2.4. Типы данных vba
- •5.2.5. Описания переменных
- •5.2.6. Объекты в программах на vba и объектные переменные
- •5.2.7. Создание объектов пользователя
- •5.2.8. Описание и использование констант
- •5.2.9. Массивы в vba
- •5.2.10. Описание типов данных пользователя
- •5.2.11. Запись выражений на vba
- •5.2.12. Рекурсивные вычисления
- •5.2.13. Процедуры-подпрограммы
- •5.2.14. Процедуры-функции
- •5.2.15. Процедуры-свойства
- •5.2.16. Создание процедур
- •5.2.17. Управляющие структуры vba и события
- •5.3.Запуск программ
- •5.4.Отладка программ
- •5.5.Обработка ошибок
- •5.6.Преобразования типов
- •5.7.Функции для работы с датами и временем
- •5.8.Управление файлами
- •5.9.Функции проверки
- •5.10.Функции работы со строками
- •5.11.Взаимодействие с пользователем
- •5.12.Пользовательские формы и диалоговые окна
- •5.13.Создание пользовательских меню и панелей инструментов
- •5.14.Разработка контекстного меню
- •5.15.Открытие проектов, экспорт и импорт
- •Глава 6.Использование Win32 api
- •Глава 7.Использование шаблонов и надстроек
- •Глава 8.Разработка приложений с помощью Excel
- •8.1.Иерархия объектов Excel
- •8.2.Обзор основных объектов Excel
- •8.2.1. Объект Application
- •8.2.2. Объект Workbook
- •8.2.3. Объект WorkSheet
- •8.2.4. Объект Range
- •8.2.5. Графические объекты
- •8.2.6. Элементы управления и обработка событий
- •8.3.Представление данных и вычисления в таблицах Excel
- •8.3.1. Ссылки на ячейки рабочих листов Excel
- •8.3.2. Работа с формулами
- •8.3.3. Использование функций
- •8.3.4. Создание пользовательских функций рабочего листа
- •8.3.5. Массивы Excel
- •8.3.6. Определение связей между таблицами
- •8.3.7. Консолидация данных
- •8.3.8. Форматирование данных в таблицах
- •8.4.Анализ данных и подведение итогов
- •8.4.1. Создание сводных таблиц
- •8.4.2. Подведение промежуточных итогов
- •8.4.3. Определение частичных сумм
- •8.4.4. Создание диаграмм
- •8.4.5. Работа со структурой данных
- •8.5.Подбор параметров и поиск решения
- •8.6.Использование сценариев
- •8.7.Поиск и отбор данных в таблицах Excel
- •8.7.1. Использование автофильтра
- •8.7.2. Работа с расширенным фильтром
- •8.7.3. Поиск данных по подписям строк и столбцов
- •8.8.Упорядочение данных в таблицах
- •8.9.Защита приложений Excel
- •8.9.1. Защита от ошибок при вводе данных
- •8.9.2. Защита данных от несанкционированного доступа
- •Глава 9.Разработка приложений с помощью Word
- •9.1.Модель объектов Word
- •9.1.1. Объект Document
- •9.1.2. Другие дочерние объекты приложения Word
- •9.2.Работа с полями
- •9.3.Переменные документа
- •9.4.Использование формул в документах Word
- •9.5.Использование элементов управления в документах Word
- •9.6.Создание шаблонов документов на основе таблиц
- •9.7.Защита документов Word и кода
- •Глава 10.Использование Automation при интегрировании компонентов Microsoft Office
- •10.1.Технология ActiveX
- •10.2.Компонентная модель объектов, внедрение и связывание
- •10.3.Создание объектов Automation
- •10.4.Получение доступа к объекту
- •10.5.Пример вычислений в Access с помощью Excel
- •10.6.Управление связанными и внедренными объектами с помощью программного кода
- •Глава 11.Организация доступа к внешним данным
- •11.1.Доступ к данным из клиентских приложений
- •11.2.Интерфейс odbc
- •11.3.Использование dao для доступа к данным
- •11.3.1. Модель объектов dao
- •11.3.2. Создание рабочей области и открытие источника данных
- •11.3.3. Исследование структуры таблиц бд
- •11.3.4. Операции над данными
- •11.4.Интеграция данных и работа в сети
- •11.4.1. Доступ к данным Excel из субд Access
- •11.5.Выбор метода доступа к данным
- •Глава 12.Общие рекомендации по разработке приложений
- •Глава 13.Разработка справочной системы
- •13.1.Использование всплывающих подсказок
- •13.2.Контекстная справка «Что это такое?»
- •13.3.Подготовка файла справки
- •Глава 14.Дополнительные рекомендации Установка приложения
- •14.1.Повышение эффективности работы приложения
- •Приложение 1. Система автоматизации подготовки документов на основе пакета Microsoft Office
- •Требования к системе Office case
- •Интеллектуальность документа
- •Однократный ввод данных и их совместное использование
- •Дружественный интерфейс – «ориентация на человека»
- •Мобильность
- •Независимость от версии Microsoft Office
- •Поддержка языка разметки документов xml
- •Общий сценарий использования
- •Структура Office case
- •Структура скрытого раздела документа
- •В. Таблица ограничений
- •Подсистемы программного проекта документа Менеджер закладок
- •Менеджер классификаторов
- •Подсистема управления интерфейсом пользователя
- •Подсистема контроля данных
- •Подсистема информационного обмена
- •Дизайнер системы документов
- •Редактор классификаторов
- •Редактор правил
- •Редактор закладок
- •Редактор блоков данных
- •Пример применения Office case Постановка задачи
- •Реализация Документы «Подсистемы автоматизации подготовки отчетов»
- •Требования к квалификации пользователей
- •Установка приложения и подготовка к работе
- •Интерфейс первичных документов
- •Интерфейс сводных документов
- •Приложение 2. Автоматизированное рабочее место «Оператор автозаправочной станции»
- •Разработка структуры рабочей книги
- •Настройка пользовательского интерфейса
- •Разработка экранных форм
- •Приложение 3. Автоматизация заполнения бланка с помощью программы текстового процессора Word Постановка задачи
- •Разработка документа
- •Разработка экранной формы
- •Список литературы
5.2.12. Рекурсивные вычисления
VBA позволяет организовать рекурсивные вычисления, создавать рекурсивные процедуры, т.е. процедуры, которые явно или косвенно вызывают себя. При этом следует помнить, что код рекурсивной процедуры должен содержать проверку условия завершения рекурсивных вызовов. Каждый новый вызов рекурсивной процедуры требует выделения памяти для ее переменных, поэтому следует подумать, а нельзя ли заменить рекурсию итерацией, вложенными циклами, если есть проблема нехватки памяти.
При описании процедур-функций приведен пример рекурсивного вычисления факториала.
5.2.13. Процедуры-подпрограммы
Подпрограмма представляет собой последовательность операторов языка Visual Basic, ограниченных инструкциями Sub и End Sub. Подпрограмма выполняет действия, заданные перечисленными в ней инструкциями, а результаты работы может вернуть, если это необходимо, через параметры, переданные ей при вызове по ссылке. Таким образом, эти процедуры нельзя вызывать при вычислении значений выражений, вызов подпрограмм осуществляется отдельными операторами (инструкциями). Если подпрограмма не имеет аргументов, инструкция Sub (заголовок процедуры) должна содержать пустые скобки вслед за именем, назначенным процедуре.
Правило записи процедуры-подпрограммы следующее:
Sub ИмяПодпрограммы (СписокФормальныхПараметров)
КодПодпрограммы
End Sub
В списке параметров перечисляются через запятую описания аргументов, передаваемых подпрограмме. Для каждого параметра указывается его имя (обязательно), способ передачи в подпрограмму, тип, а также является ли аргумент обязательным при вызове и следует ли упаковывать следующие аргументы в массив. Используемые в описании списка формальных параметров ключевые слова и их назначение описаны выше. Далее будут приведены примеры описаний подпрограмм. Перед ключевым словом Sub могут быть указаны ключевые слова Public / Private, Static.
Чтобы вызвать процедуру-подпрограмму из другой процедуры, следует указать имя этой процедуры и значения для всех требуемых аргументов. Использование инструкции Call не обязательно, однако если она все же используется, аргументы должны быть заключены в скобки.
Выйти из подпрограммы можно «досрочно», не через конец, с помощью инструкции Exit Sub.
В следующем примере инструкция Sub (с парной ей инструкцией End Sub) описывает процедуру с именем ApplyFormat. Все инструкции, заключенные между Sub и End Sub выполняются всегда, когда вызывается или выполняется процедура ApplyFormat:
Sub ApplyFormat()
Const Limit As Integer = 33
Dim MyCell As Range
' Другие инструкции …
End Sub
В описанную выше процедуру при обращении к ней не передаются при вызове параметры.
В следующем примере процедура Main вызывает процедуру MultiBeep, передавая значение 56 для ее аргумента. По окончании работы MultiBeep управление возвращается к Main, и Main вызывает процедуру Message. Message показывает окно сообщения, когда пользователь выбирает мышью OK, управление возвращается к Main, и Main завершается.
Sub Main()
MultiBeep 56
Message
End Sub
Sub MultiBeep(numbeeps)
For counter = 1 To numbeeps
Beep ‘ Передача звукового сигнала через динамик
Next counter
End Sub
Sub Message()
MsgBox “Пора сделать перерыв!”
End Sub
Аргументы могут передаваться в подпрограмму как по ссылке, так и по значению. Пример, показывающий разницу в полученных результатах при использовании различных способов передачи параметров, приведен ниже, при описании функций.
Для передачи аргументов в процедуру может использоваться массив параметров. При описании процедуры не требуется указывать число элементов такого массива.
Для обозначения массива параметров используется ключевое слово ParamArray. Такой массив описывается как массив типа Variant и всегда представляет последние элементы из списка аргументов в описании процедуры. Этот способ передачи параметров может использоваться, когда может изменяться количество передаваемых в процедуру параметров. Ниже приводится пример описания процедуры с массивом параметров:
Sub AnyNumberArgs (strName As String, _ ParamArray intScores() As Variant)
Dim intI As Integer
Debug.Print strName; “ Дети:”
For intI = 0 To UBound(intScores())
Debug.Print " "; intScores(intI)
Next intI
End Sub
В следующих строках приведены примеры вызова этой процедуры с различным числом аргументов:
AnyNumberArgs “Иванов И.И.”, “Саша”, “Даша”
AnyNumberArgs “Петрова П.П.”, “Ася”, “Петя”, “Вася”, “Коля”
При вызове процедур Sub или Function возможна позиционная передача аргументов, т.е. в порядке следования в описании процедуры. Кроме того, аргументы могут передаваться по именам, вне зависимости от позиции. Именованный аргумент состоит из имени соответствующего формального параметра, за которым следует двоеточие со знаком равенства (:=) и значение передаваемого фактического параметра.
Именованные аргументы особенно полезны при вызове процедуры с необязательными аргументами (Optional). Если используются именованные аргументы, то запятые для обозначения отсутствующих параметров не нужны. С помощью именованных аргументов проще проследить, какие аргументы переданы, а какие опущены.
В описании процедуры перед необязательными аргументами должно стоять ключевое слово Optional. Кроме того, в описании процедуры можно присвоить значение необязательному аргументу, которое он принимает по умолчанию. Если при вызове процедуры с аргументом Optional этот аргумент не описан, то для него используется имеющееся значение по умолчанию. Если по умолчанию значение не присвоено, аргумент обрабатывается так же, как любая другая переменная указанного типа.
В следующей процедуре имеются необязательные параметры. Функция IsMissing определяет, были ли переданы в процедуру необязательные аргументы.
Sub OptionalArgs (strState As String, _ Optional intRegion As Integer, _
Optional strCountry As String = “USA”)
If IsMissing(intRegion) And IsMissing(strCountry) Then
Debug.Print strState
ElseIf IsMissing(strCountry) Then
Debug.Print strState, intRegion
ElseIf IsMissing(intRegion) Then
Debug.Print strState, strCountry
Else
Debug.Print strState, intRegion, strCountry
End If
End Sub
В эту процедуру можно передать, например, именованные аргументы:
OptionalArgs strCountry:=”USA”, strState:=”MD”
OptionalArgs strState:= “MD”, intRegion:=5
При передаче аргументов по занимаемой ими позиции на месте пропущенных параметров ставится обозначающая их позицию запятая.
