- •Л.Н. Лядова, н.В. Фролова, в.В. Ланин, е.Б. Замятина, м.А. Плаксин, б.А. Ермолаев
- •Часть 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.4.Отладка программ
В редактор VBE включены средства отладки, которые позволяют осуществить пошаговое исполнение программы (выполнение программы приостанавливается после исполнения каждой инструкции), добавить в текст программы точки останова (до достижения этой точки программа выполняется в обычном режиме, а при обнаружении точки останова переходит в режим прерывания), отслеживать контрольные значения при пошаговом выполнении программы.
Для работы с перечисленными средствами в редакторе VBA имеется меню и панель «Отладка».
Более подробно эти средства рассматриваются в разделе «Инструкции по интерфейсу Visual Basic» справочной системы.
Если не удается запустить на выполнение подпрограмму или макрос в приложении, следует проверить, завершено ли выполнение запущенных ранее программ.
5.5.Обработка ошибок
Обработка ошибок – это определение реакции на выполнение ошибок, которые возникают при выполнении программы. Причины ошибок могут быть как в самой программе, так и вне ее (например, может отсутствовать нужный файл). Все ошибки можно отнести к трем категориям: ошибки компиляции, возникающие, когда VBA не может интерпретировать введенный текст; ошибки выполнения, возникающие после успешной компиляции, при выполнении программы (причиной этих ошибок могут быть, например, неправильные данные, введенные пользователем), и логические ошибки, которые не распознаются VBA и не приводят к прекращению выполнения программы, но ведут к получению неверных результатов. Логические ошибки можно выявить с помощью средств отладки (пошагового выполнения программы, отслеживания контролируемых значений и т.п.).
В VBA есть несколько средств обработки ошибок:
оператор On Error,
оператор Resume,
оператор Error,
функция IsError,
функция CVErr,
объект Err.
Оператор On Error предназначен для обработки ошибок, он задает действия, которые должны быть выполнены при возникновении ошибки. Если в программе не выполнена инструкция On Error, то любая ошибка выполнения является фатальной; это означает, что выводится сообщение об ошибке и выполнение программы прекращается. Этот оператор заставляет программу реагировать на ошибку различным образом.
Подпрограмма обработки ошибок не может быть процедурой Sub или Function. Эта подпрограмма должна быть частью программы, которая отмечается с помощью метки строки или номера строки.
Оператор
On Error GoTo Метка
можно использовать как общий обработчик ошибок (в случае возникновения ошибки управление будет передано на оператор, которому предшествует указанная метка, следующие за ней инструкции могут проверить тип возникшей ошибки, уточнить причину и выполнить действия по ее устранению).
«Включенным» обработчиком ошибок называют подпрограмму, которая указана в инструкции On Error; «активным» обработчиком ошибок является включенный обработчик ошибок, который обрабатывает текущую ошибку. Если ошибка возникает в самом обработчике ошибок (в промежутке между возникновением ошибки и выполнением инструкции Resume, Exit Sub, Exit Function или Exit Property), то обработчик ошибок, определенный в текущей процедуре, не может обработать ошибку. Управление в этом случае возвращается в вызывающую процедуру; если в вызывающей процедуре включен обработчик ошибок, то обработка ошибки передается ему. Если этот обработчик ошибок является в данный момент активным, т.е. уже обрабатывает ошибку, то управление снова передается назад в вызывающую процедуру и т.д. до тех пор, пока не будет найден включенный, но не активный обработчик ошибок. Если включенный, но неактивный обработчик ошибок найден не будет, ошибка становится фатальной в том месте программы, в котором она впервые возникла. При каждой передаче управления обработчиком ошибок в вызывающую процедуру эта процедура становится текущей. После завершения обработки ошибки обработчиком в любой процедуре возобновляется выполнение текущей процедуры с той ее части, которая указана в инструкции Resume.
Для определения причины ошибки в подпрограммах обработки ошибок используют значение свойства Number объекта Err. Необходимо обеспечить в подпрограммах обработки ошибок проверку или сохранение существенных значений свойств объекта Err перед тем, как может возникнуть новая ошибка или перед вызовом процедуры, в которой может возникнуть новая ошибка. Значения свойств объекта Err описывают последнюю ошибку. Текст сообщения об ошибке, соответствующего коду ошибки Err.Number содержится в свойстве Err.Description.
Для отключения общей обработки следует использовать оператор On Error GoTo 0. Конструкция On Error GoTo 0 отключает обработку ошибок в текущей процедуре. Эта конструкция не задает переход на строку 0 для обработки ошибок, даже если в процедуре имеется строка с номером 0. Если инструкция On Error GoTo 0 не выполнялась, то обработчик автоматически отключается при выходе из процедуры.
Инструкция
On Error Resume Next
указывает, что возникновение ошибки выполнения приводит к передаче управления на инструкцию, непосредственно следующую за инструкцией, при выполнении которой возникла ошибка, или на инструкцию, непосредственно следующую за вызывающей инструкцией в процедуре, содержащей конструкцию On Error Resume Next, т.е. эта инструкция приводит к игнорированию ошибки. Это позволяет продолжить исполнение программы несмотря на ошибку выполнения. Это позволяет также встроить подпрограмму обработки ошибок в процедуру, а не передавать управление в другую часть процедуры. Конструкция On Error Resume Next становится неактивной при вызове новой процедуры, поэтому для внутренней обработки ошибок необходимо выполнять инструкцию On Error Resume Next в каждой вызываемой процедуре. Этой формой оператора следует пользоваться с осторожностью, так как ошибка фактически не обрабатывается. Рекомендуется при доступе к объектам использовать эту форму инструкции, а не On Error GoTo.
При обработке ошибок, возникающих при доступе к другим объектам, рекомендуется использовать конструкцию On Error Resume Next. Проверка объекта Err после каждого взаимодействия с другим объектом позволяет устранить неопределенность в том, при доступе к какому объекту возникла ошибка. Это позволяет всегда точно знать, какой объект поместил значение кода ошибки в свойство Err.Number, а также в каком объекте возникла ошибка (эта информация содержится в свойстве Err.Source).
Для того чтобы предотвратить выполнение программы обработки ошибок в тех случаях, когда ошибка не возникла, следует помещать соответствующую инструкцию Exit Sub, Exit Function или Exit Property перед подпрограммой обработки ошибки, как в следующем примере:
Sub InitializeMatrix(Var1, Var2, Var3, Var4)
On Error GoTo ОбработкаОшибок
‘ Код процедуры:
. . .
Exit Sub
ОбработкаОшибок:
. . .
Resume Next
End Sub
В этом примере программа обработки ошибок помещена между инструкциями Exit Sub и End Sub, что позволяет отделить ее от части программы, соответствующей нормальному выполнению процедуры. Программу обработки ошибок можно разместить в любом месте процедуры.
Системные ошибки при вызовах библиотек динамической компоновки (DLL) не приводят к возникновению исключений и не перехватываются средствами Visual Basic. При вызове функций из библиотек DLL необходимо проверять, успешно ли возвращается каждое значение (согласно спецификациям API), и в случае неудачи проверять значение свойства LastDLLError объекта Err.
Оператор Resume используется для продолжения выполнения кода с указанной строки. Эта инструкция может использоваться только в процедурах обработки ошибок. Она имеет несколько форматов (Resume, Resume Next, Resume Строка).
Инструкция Error имитирует возникновение ошибки с кодом, переданным ей в качестве аргумента, заполняет свойства объекта Err значениями по умолчанию, после чего вызывает обработчик ошибок. Эта инструкция поддерживается для совместимости с предыдущими версиями. В новой программе, в особенности при создании объектов, следует применять для создания ошибок выполнения метод Raise объекта Err.
Функция CVErr используется для преобразования числового значения, переданного функции в качестве аргумента, в код ошибки. Возвращает значение типа Variant с подтипом Error, содержащее код ошибки, указанный пользователем.
Функция CVErr применяется для создания ошибок, определяемых пользователем, в создаваемых пользователем процедурах. Например, при создании функции, которая принимает несколько аргументов и обычно возвращает строку, имеется возможность проверить, что введенные аргументы попадают в допустимый диапазон значений. Если это не так, весьма вероятно, что функция не вернет ожидаемое значение. В этом случае функция CVErr позволяет вернуть код ошибки, чтобы знать, какие действия необходимо предпринять.
При использовании этой функции неявное преобразование значения Error не допускается. Например, не допускается прямое присвоение возвращаемого значения CVErr переменной с типом, отличным от Variant. Однако имеется возможность выполнить явное преобразование (с помощью CInt, CDbl и т.п.) значения, возвращаемого CVErr, и присвоить это значение переменной с соответствующим типом данных.
В приведенном ниже примере функция WhichRange проверяет введенное пользователем строковое значение переменной UserText на возможность его преобразования в число, принадлежащее диапазону от 1 до 10. Если преобразование не может быть выполнено или полученное число не попадает в заданный диапазон, в качестве результата вырабатывается код ошибки.
Sub CVErr_Example()
Dim VarResult As Variant
Dim UserText As String
‘ Код для ввода значения переменной UserText:
…………………………………….
‘ Вызов функции для преобразования значения переменной:
VarResult = WhichRange(UserText)
‘ Проверка, является ли результат кодом ошибки:
If IsError(VarResult) Then
MsgBox Prompt := “Нужно ввести число от 1 до 10”, _ Title := “Ошибка ввода”
Else
MsgBox Prompt := “Введено число ” & Str(VarResult)
End If
End Sub
‘ Описание функции:
Function WhichRange(ByVal Number As Integer) As Variant
If Number >= 1 And Number <= 10 Then
WhichRange = Number
Else
WhichRange = CVErr(200)
End If
End Function
Объект Err предназначен для управления информацией, связанной с ошибками. Свойства этого объекта задаются генератором ошибок Visual Basic, объектом или разработчиком программы Visual Basic. Свойством объекта, используемым по умолчанию, является свойство Number.
Если возникает ошибка выполнения, то свойства объекта Err получают значения, однозначно определяющие ошибку. В эти свойства записываются также сведения, которые могут быть использованы для обработки ошибки. Для того чтобы создать ошибку выполнения в программе, следует использовать метод Raise.
Значения свойств объекта Err сбрасываются до нулей или пустых строк (“”) после выполнения инструкций Resume или On Error любого вида, а также после выполнения инструкций Exit Sub, Exit Function или Exit Property в программе обработки ошибки. Для того чтобы явным образом сбросить значения свойств объекта Err, следует вызвать метод Clear.
Более подробную информацию об обработке ошибок и тонкостях использования различных форм описанных операторов можно получить в справочной системе.
