- •Оглавление
- •Введение
- •1. Объекты ms Excel
- •1.1. Объекты, их свойства и методы
- •1.1.1. Свойства: присвоение и использование значений
- •1.1.1.1. Присвоение значений
- •1.1.1.2. Использование значений
- •1.1.2. Примеры использования методов рабочей книги Excel
- •1.1.2.1. Вызов метода
- •1.1.2.2. Передача аргумента в метод
- •1.2. Ссылки на одиночные объекты и объекты из семейств
- •1.2.1. Различия между одиночными объектами и объектами из семейств
- •1.2.2. Семейства как объекты
- •1.2.3. Ссылка на объект
- •1.3. Иерархия объектов ms Excel
- •1.3.1. Иерархическая структура
- •1.3.2. Доступ к объектам через свойства и методы
- •1.4. Объект Application
- •1.4.1. Свойства объекта Application
- •1.4.2. Методы объекта Application
- •1.5. Объект Workbook и семейство Workbooks
- •1.5.1. Свойства объекта Workbook и семейства Workbooks
- •1.5.2. Методы объекта Workbook и семейства Workbooks
- •1.5.3. Функции, используемые для работы с файлами и папками
- •1.5.4. Функция MsgBox
- •1.5.5. Функция InputBox
- •1.6. Объект Worksheet
- •1.6.1. Свойства объекта Worksheet и семейства Worksheets
- •1.6.2. Методы объекта Worksheet и семейства Worksheets
- •1.7. Объект Range
- •1.7.1. Свойства объекта Range
- •1.7.2. Методы объекта Range
- •2. Использование переменных в vba
- •2.1. Допустимые имена
- •2.2. Типы данных переменных vba
- •2.3. Описание переменной
- •2.4. Использование переменных
- •2.5. Преимущества переменных
- •2.6. Объектные переменные
- •2.6.1. Задание объектной переменной
- •2.6.2. Объектные переменные общего типа
- •2.6.3. Объектные переменные конкретных типов
- •2.6.4. Преимущества объектных переменных
- •2.7. Неявное описание переменных и тип Variant
- •2.8. Обязательное описание переменных
- •2.9. Типы данных по умолчанию
- •2.10. Пользовательские типы данных
- •3. Массивы vba
- •3.1. Размерность массива
- •3.2. Объявление массива
- •3.3. Использование массива
- •3.4. Номер первого элемента и границы массива
- •3.5. Динамические массивы
- •3.6. Сохранение данных в динамическом массиве при изменении последней размерности
- •3.7. Пять функций для работы с массивами
- •4. Константы
- •5. Вызов одной программы из другой
- •5.1. Фрагментирование кода
- •5.2. Передача данных при вызове программы
- •6. Использование функций в vba
- •7. Область видимости переменных, констант, подпрограмм и функций
- •7.1. Область видимости переменных
- •7.1.1. Переменные уровня процедуры
- •7.1.2. Переменные уровня модуля
- •7.1.3. Переменные уровня проекта
- •7.1.4. Сохраняемые переменные
- •7.1.5. Область видимости подпрограмм и функций
- •7.1.6. Сохраняемые подпрограммы и функции
- •8. Управляющие структуры
- •8.1. Управляющая инструкция If-Then-Else
- •8.2. Управляющая инструкция Select Case
- •8.3. Управляющая инструкция For-Next
- •8.4. Управляющая инструкция For-Each-Next
- •8.4.1. Инструкция For-Each-Next с многомерными массивами
- •8.4.2. Инструкция For-Each-Next с семействами
- •8.5. Управляющая инструкция While-Wend
- •8.6. Управляющая инструкция Do-Loop
- •9. Инструкция With
- •10. Встроенные функции vba
- •10.1. Математические функции
- •10.2. Функции проверки типов
- •10.3. Функции преобразования форматов
- •10.4. Функции обработки строк
- •10.5. Функции времени и даты
- •11. Обработка ошибок
- •11.1. Предотвращение ошибок программными средствами
- •11.2. Обработка ошибок, инструкция On Error
- •12. Разработка пользовательского интерфейса
- •12.1. Форма (UserForm)
- •12.1.1. Вставка формы
- •12.1.2. Основные свойства и методы формы
- •12.1.3. События формы
- •12.2. Элементы управления формы vba
- •12.2.1. Некоторые общие свойства элементов управления
- •12.2.2. Соглашения об именах
- •12.2.3. Некоторые общие методы элементов управления
- •12.2.4. Общие события элементов управления
- •12.3. Кнопка (СоmmandButton)
- •12.4. Поле (TextBox)
- •12.5. Надпись (Label)
- •Начальные условия
- •Выполнение задания:
- •12.6. Список (ListBox)
- •12.6.1. Основные свойства элемента управления ListBox
- •12.6.2. Методы ListBox
- •12.6.3. Заполнение списка
- •12.6.4. Пример создания списка
- •12.6.5. Определение выбранных элементов списка
- •12.7. Поле со списком (ComboBox)
- •12.8. Флажок (CheckBox)
- •12.9. Выключатель (ToggleButton)
- •12.10. Переключатель (OptionButton)
- •12.11. Полоса прокрутки (ScrollBar) и счетчик (SpinButton)
- •12.12. Создание нестандартных меню и панелей инструментов
- •12.12.1. Объект CommandBar и семейство CommandBars
- •12.12.2. Методы объекта CommandBar
- •12.12.3. Свойства объекта CommandBar
- •12.12.4. Семейство CommandBarControls и объект CommandBarControl
- •12.12.5. Пример создания/удаления панели инструментов
- •12.12.5.1.Создание панели инструментов
- •12.12.5.2. Удаление панели инструментов
- •12.12.6. Пример создания/удаления меню
- •12.12.6.1. Создание меню
- •12.12.6.2. Удаление меню
- •13. Обработка событий объектов Workbook и Worksheet
- •13.1. События объекта Workbook
- •13.1.1. Событие Open
- •13.1.2. Событие BeforeClose
- •13.1.3. Событие SheetActivate
- •13.2. События объекта Worksheet
- •13.2.1. Событие Activate
- •13.2.2. Событие Deactivate
- •13.2.3. Событие SelectionChange
- •Библиография
10.5. Функции времени и даты
Функция |
Возвращаемое значение |
Date () |
Возвращает значение типа Variant, содержащее текущую системную дату: MyDate = Date()' возвращает 12.09.2012, если сегодня 12 сентября 2012 года |
Day, Month, Year |
Возвращает значение типа Variant (Integer), содержащее целое число, которое представляет день, месяц, число в значении даты: MyDay = Day(Date)' возвращает 12, если сегодня 12 число MyMonth = Month(Date)' возвращает 9, если сегодня сентябрь MyYear = Year(Date)' возвращает 2012, если сегодня 2012-й год |
11. Обработка ошибок
Когда вы пишите программу, очень важно чтобы она анализировала ошибки, возникающие по вине пользователя, и информировала его об этом. Это можно сделать двумя способами:
1-й способ – предотвращающий ошибки. Программа анализирует водимые или вычисляемые данные и в случае ошибки информирует об этом пользователя.
2-й способ – обрабатывающий ошибки. В случае появления ошибки программа перехватывает её и создает программный отклик.
Как правило, в программировании сочетаются оба способа.
11.1. Предотвращение ошибок программными средствами
Рассмотрим программу, которая вычисляет обратное число и выводит его на экран:
Sub ОбратноеЧисло()
Dim x As Double
Dim y As Double
x = CDbl(InputBox("Введите число:"))
y = 1/x
MsgBox "Обратное число:" & y
End Sub
где СDbl – функция преобразования типов (строковое значение преобразуется в число типа Double).
Даже в этой простой программе имеются свои подводные камни, – например, пользователь по невнимательности забудет ввести число, или введет его неправильно (символ вместо числа, десятичную точку вместо десятичной запятой), или введет ноль. Во всех этих случаях произойдет аварийное завершение программы, и программа выдаст сообщение об ошибке: либо о несоответствии типов (рис. 11.1), либо о делении на ноль (11.2).
Чтобы избежать этого, необходимо модернизировать программу таким образом, чтобы она предотвращала перечисленные ошибки.
Рис. 11.1. Ошибка несоответствия типов
Рис. 11.2. Ошибка деления на ноль
Например, так:
Sub ОбратноеЧисло()
Dim x As Double
Dim y As Double
Dim Число As String
Число = InputBox("Введите число:")
‘Функция IsNumeric проверяет, является ли _
введенная последовательность числом:
If IsNumeric(Число) = False Then
MsgBox "Некорректный ввод исходного значения!", _
vbExclamation, "Обратное число"
Exit Sub
End If
x = CDbl(Число)
If CDbl(Число) = 0 Then
MsgBox "Деление на ноль запрещено!", _
vbExclamation, "Обратное число "
Exit Sub
End If
y = 1/x
MsgBox "Обратное число:" & y
End Sub
Попробуем теперь решить эту проблему с помощью перехвата ошибок и их обработки. Для этого предназначена инструкция On Error.
11.2. Обработка ошибок, инструкция On Error
Инструкция On Error может быть записана следующим образом:
Инструкция |
Описание |
On Error GoTo строка |
В случае возникновении ошибки управление передается в строку с указанным номером или меткой. |
On Error Resume Next |
В случае возникновении ошибки управление передается в следующую строку. При обращении к объектам лучше использовать этот синтаксис, нежели предыдущий. Инструкция Resume допустима в следующих синтаксисах:
Пример: On Error Resume;
Пример: On Error Resume m1 – управление передается в строку с меткой m1;
|
On Error GoTo 0 |
Отключает обработчик ошибок в текущей процедуре. |
Объект Err
Процедура обработки ошибок обычно включает объект Err, который содержит всю информацию о последней ошибке.
Рассмотрим два важнейших свойства объекта Err:
Свойство |
Описание |
Number |
Возвращает код ошибки. |
Description |
Возвращает текст сообщения об ошибке |
Пример:
ОбработкаОшибок:
MsgBox "Произошла ошибка: " & _
Cstr(Err.Number) & "-" & _
Err.Description, vbInformation, _
"Cообщение об ошибке"
Объект Err имеет свои методы:
Метод |
Описание |
Clear |
Очищает все значения свойств объекта Err. |
Raise |
Создает ошибку выполнения. Используется при моделировании ошибок. |
Напишем программу ОбратноеЧислоError, в которой ошибки обрабатываются с помощью конструкции On Error:
|
|
Sub ОбратноеЧислоError () |
|
|
Dim x As Double |
|
|
Dim y As Double |
|
|
Dim Число As String |
|
|
'Передача управления на обработчик ошибок, _ помеченный меткой Ошибка: |
|
|
On Error GoTo Ошибка |
|
|
x = CDbl(InputBox("Введите число:")) |
|
|
y = 1 / x |
|
|
MsgBox "Обратное число:" & y |
|
|
Exit Sub |
|
|
'Обработчик ошибок |
|
|
Ошибка: |
|
|
MsgBox "Произошла ошибка: " & _ Cstr(Err.Number) & "-" & _ Err.Description, vbInformation, _ "Cообщение об ошибке" |
|
|
Select Case Err.Number |
|
|
Case 11 |
|
|
MsgBox "Деление на ноль запрещено!", _ vbExclamation, "Обратное число " |
|
|
Case 13 |
|
|
MsgBox "Некорректный ввод исходного значения!", _ vbExclamation, "Обратное число" |
|
|
Case Else |
|
|
MsgBox "Непредвиденная ошибка!", _ vbExclamation, "Обратное число" |
|
|
End Select |
|
|
End Sub |
Обратите внимание на 10-ю строку кода, которая обеспечивает выход из процедуры перед активизацией обработчика ошибок. При её отсутствии управление передается на следующую команду, т.е. будет выведено сообщение об ошибке, даже если её и нет.
13-я строка кода приведена лишь в учебных целях, для неискушенного пользователя она не понятна!
