- •2.1. Алфавит и словарь языка
- •2.2. Переменные
- •2.3. Константы
- •2.4. Строковые переменные
- •2.5. Массивы
- •2.6. Пользовательские типы данных
- •2.7. Операции VBA
- •2.8. Объектная модель Excel
- •2.8.1. Свойства и методы объектов
- •2.8.2. Отображение объектной модели Excel
- •2.8.2.1. Иерархия объектной модели
- •2.8.2.2. Ссылка на объекты в коде VBA
- •2.8.3. Работа с объектами
- •2.8.3.1. Задание свойств объекта
- •2.8.3.2. Использование методов объекта
- •2.8.3.3. Переменные-объекты
- •2.8.3.4. Коллекции
- •2.8.3.5. Метод Add
- •2.8.3.6. Свойство Count
- •2.8.4. Свойства и методы основных объектов Excel
- •2.8.4.1. Объект Application
- •2.8.4.2. Объект Worksheet
- •2.8.4.3. Объект Range
- •2.8.5. Просмотр объектов
- •2.8.6. Использование справочной системы
- •2.8.6.1. Использование функциональной клавиши F1
- •2.8.6.2. Использование помощника
- •2.9. Ввод и вывод данных
- •2.9.3. Метод InputBox
- •2.9.4. Объединение текстовых строк
- •2.10. Концепция событий Excel
- •2.10.1. Типы событий Excel
- •2.10.2. События объекта Workbook
- •2.10.3. События объекта Worksheet
- •2.10.4. События объекта Application
- •2.10.5. События объекта UserForm
- •2.10.6. События, не связанные с конкретными объектами
- •2.10.6.1. Метод OnKey
- •2.10.6.2. Событие OnTime
- •2.11. Формы пользователя
- •2.11.1. Свойства, методы и события экранных форм
- •2.11.1.1. Некоторые свойства форм
- •2.11.1.2. Некоторые методы форм
- •2.11.1.3. Некоторые события форм
- •2.11.2. Элементы управления
- •2.11.2.1. Элемент управления Label (Надпись)
- •2.11.2.1.1. Окно свойств формы
- •2.11.2.2. Элемент управления CommandButton (Кнопка)
- •2.11.2.3. Элемент управления TextBox (Текстовое поле)
- •2.11.2.4. Элемент управления ComboBox (комбинированный список)
- •2.11.2.5. Элемент управления ListBox (список)
- •2.11.2.6. Элемент управления CheckBox (Флажок)
- •2.11.2.7. Элемент управления ToggleButton (Выключатель)
- •2.11.2.8. Элемент управления OptionButton (Переключатель)
- •2.11.2.9. Элемент управления Image (Рисунок)
- •2.11.2.12. Элемент управления RefEdit (Поле со свёртыванием)
- •2.11.2.13. Элементы управления на рабочем листе
- •2.12. Инструкции VBA
- •2.12.1. Оператор присваивания
- •2.12.2. Инструкция Set
- •2.12.3. Циклы
- •2.12.3.1. Инструкция For… Next
- •2.12.3.2. Инструкция While…Wend
- •2.12.3.3. Инструкция Do... Loop
- •2.12.3.4. Инструкция For Each…Next
- •2.12.4. Инструкции перехода
- •2.12.4.1. Инструкция условного перехода If…Then…Else
- •2.12.4.2. Инструкция Select…Case
- •2.12.4.3. Инструкция безусловного перехода GoTo
- •2.12.4.4. Инструкции перехода к обработчику ошибок On Error
- •2.12.4.5. Инструкции прерывания выполнения блока Exit
- •2.13. Функции VBA
- •2.13.1. Встроенные функции
- •2.13.1.1. Математические функции
- •2.13.1.2. Функции преобразования данных
- •2.13.1.3. Функции даты и времени
- •2.13.1.4. Строковые функции
- •2.13.1.5. Примеры использования функций VBA
- •2.13.1.5.1. Удаление ненужных символов
- •2.13.1.5.2. Определение длины строки
- •2.13.1.5.3. Сравнение и поиск строк
- •2.13.1.5.4. Выделение части строки
- •2.13.1.5.5. Форматирование значений данных
- •2.13.2. Функции, определённые пользователем
- •2.14. Файлы VBA
- •2.14.1. Типы файлов в VBA
- •2.14.2. Открытие и закрытие файла
- •2.14.3. Ввод данных в файл последовательного доступа
- •2.14.4. Вывод данных из файла последовательного доступа
- •2.14.5. Работа с файлом произвольного доступа
- •2.15. Создание процедуры
- •2.16. Выполнение процедуры
- •2.17. Сохранение процедуры
- •2.18. Запись последовательности действий пользователя
- •2.19. Просмотр кода макроса
- •3.1. Тестирование и отладка как этап разработки приложений
- •3.1.1. Отладка
- •3.1.1.1. Режим останова
- •3.1.1.2. Использование окна Immediate
- •3.1.1.2.1. Просмотр значений в окне Immediate
- •3.1.1.3. Пошаговое выполнение программ
- •3.1.2. Исправление ошибок
- •Библиографический список
- •Оглавление
90
если используется несколько команд или конструкции Else|ElseIf, то End If в конце нужно писать обязательно, иначе возникнет синтаксическая ошибка.
для выражения If…Then рекомендуется использовать отступы для выделения блоков команд, иначе трудно будет читать код.
операторы If…Then можно вкладывать друг в друга:
If R = 5 Then
MsgBox “Отлично”
If R = 4 Then
MsgBox “Хорошо”
End If
End If
2.12.4.2. Инструкция Select…Case
Инструкция If…Then... Else может содержать большое количество выражений ElseIf и поэтому бывает трудной для проектирования и восприятия. В подобных случаях альтернативой этой инструкции может быть инструкция Select Case, которая легче для восприятия и лучше приспособлена для работы в ситуациях со многими выходами. Инструкция Select Case выполняет одну из нескольких групп инструкций в зависимости от значения некоторого выражения. Она имеет следующий формат:
Select Case выражение
[Case список_выражений-n [инструкции-n]] ...
[Case Else
[инструкции_еlsе]]
End Select
Формат инструкции Select Case содержит следующие элементы:
Элемент инструкции |
Описание элемента |
|
Выражение |
Обязательный. Любое числовое или строковое выражение |
|
Список_выражений-n |
Обязателен в случае использования Case. Список (сраздели- |
|
|
телями) из одной или более следующих форм: |
|
|
выражение |
|
|
выражение To выражение |
|
|
Is оператор_сравнения выражение |
|
|
Ключевое слово To определяет диапазон значений, в котором |
|
|
меньшее значение должно быть перед ключевым словом To. |
|
|
Ключевое слово Is следует использовать с операторами |
|
|
сравнения для указания диапазона значений. Если этот аргу- |
|
|
мент не используется, автоматически подставляется ключе- |
|
|
вое слово Is. |
|
Инструкции-n |
Необязательный. Одна или более инструкций, выполняемых, |
|
|
если выражение совпадает с любым значением из Спи- |
|
|
сок_выражений-n. |
|
Инструкции_еlsе |
Необязательный. Одна или более инструкций, выполняемых, |
|
|
если Выражение не совпадает ни с каким |
Case- |
|
предложением список_выражений-n |
|
91
Если выражение совпадает с любым из Case-выражений спи- сок_выражений-n, выполняются инструкции инструкции-n, следующие за этим Case-предложением (до следующего Case-предложения или последнего Case-предложения – до End Select). Управление выполнением программы передаётся инструкции, следующей за предложением End Select. Если выражение совпадает с список_выражений-n в нескольких Case-предложениях, выполняются инструкции, соответствующие первому совпадению. Предложение Case Else используется для указания группы инструкций инструкции_еlsе, которые следует выполнять, если ни в одном Case-предложении не нашлось совпадений. Конструкция Select Case допускает вложения. Инструкцию Case Else целесообразно использовать при выборе между тремя и более вариантами.
Приведённая ниже процедура CaseSelect позволяет решить ту же задачу, которую решает процедура IfThenElse4.
Sub CaseSelect()
Select Case Range ("A6") Case Is >= 0.84
MsgBox "Ваша оценка """ & "Отлично" & """"
Case 0.68 To 0.83
MsgBox " Ваша оценка """ & "Хорошо" & """"
Case Is > 0.5
MsgBox " Ваша оценка """ & "Удовлетворительно" & """"
Case Else
MsgBox " Ваша оценка """ & "Неудовлетворительно" & """"
End Select End Sub
2.12.4.3. Инструкция безусловного перехода GoTo
Инструкция GoTo изменяет ход выполнения программы без проверки каких-либо условий, передавая управление на метку в коде. Формат инструкции GoTo:
GoTo метка
Обязательный аргумент метка может быть текстовым или числовым, причём текстовая метка должна обязательно начинаться с буквенного символа. Метка заканчивается символом двоеточие (:).
В приведённой ниже процедуре БезУслПереход на экран выводится число 10, если значение r = 1 и строка m20, в противном случае.
Sub БезУслПереход () Dim r
r = InputBox("Иллюстрация инструкции безусловного перехода") If r = 1 Then GoTo 10 Else GoTo m20
10: MsgBox 10
92
Exit Sub m20: MsgBox "m20" End Sub
Использование GoTo удобно в очень редких случаях, например, когда нам нужно добиваться от пользователя ввода правильного значения неизвестное число раз. Однако использование GoTo считается признаком плохого тона и категорически не рекомендуется, потому что код становится трудночитаемым. Инструкцию GoTo можно заменить инструкцией организации циклов, используя инструкцию If или Select Case, как это сделано в приведённой ниже процедуре УслОператор, реализующий тот же алгоритм, что и процедура БезУслПереход:
Sub УслОператор() Dim r
r = InputBox("Иллюстрация инструкции условного перехода") If r = 1 Then MsgBox 10 Else MsgBox "m20"
End Sub
2.12.4.4. Инструкции перехода к обработчику ошибок On Error
Инструкция On Error делает доступным обработчик ошибок и определяет его положение внутри процедуры и используется также для запрета обработки ошибок. Она имеет следующий формат:
On Error GoTo строка
On Error Resume Next On Error GoTo 0
Инструкция On Error имеет следующие формы:
On Error GoTo стро- |
Делает доступным обработчик ошибок, который начинается |
ка |
со строки, определённой аргументом строка. Этот аргумент |
|
может быть числом или буквенно-числовым. При возникно- |
|
вении ошибки управление выполнением программы переда- |
|
ётся на строку кода с меткой строка. Таким образом проис- |
|
ходит активизация обработчика ошибок. Метка строка долж- |
|
на находиться в той же процедуре, что и инструкция On |
|
Error. |
On Error Resume |
Указывает на то, что при возникновении ошибки управление |
Next |
выполнением программы передаётся на инструкцию, сле- |
|
дующую непосредственно за тем, в котором произошла |
|
ошибка. Эта инструкция позволяет продолжить выполнение |
|
программы, несмотря на возникновение ошибки времени вы- |
|
полнения (run-time). |
On Error Goto 0 |
Отключает пользовательский обработчик ошибок в данной |
|
процедуре. Эта инструкция не указывает метку 0 в качестве |
|
начала обработчика ошибки, даже если в процедуре дейст- |
|
вительно имеется такая метка. |
Пользовательские обработчики ошибок позволяют реагировать на ошибки во время работы пользователя, например, когда вместо числа пользователь вводит текстовое данное или вообще не вводит данное.
93
В приведённой ниже процедуре ПримерOnErrorGoto возникает ошибка ввода до тех пор, пока не будет введено число, управление передаётся на метку Ошибка, и инструкция Resume возвращает управление инструк-
ции Num = InputBox("Введите число").
Sub ПримерOnErrorGoto() Dim Num As Single
On Error GoTo Ошибка
Num = InputBox("Введите число") MsgBox "Введено число " & Num
Exit Sub
Ошибка:
MsgBox "Число не введено " Resume
End Sub
В процедуре ПримерOnErrorResumeNext при возникновении ошибки ввода управление передаётся инструкции If, и на экран выводится сообщение "Число не введено".
Sub ПримерOnErrorResumeNext()
Dim Num As Single
On Error Resume Next
Num = InputBox("Введите число,не равное 0")
If Num <> 0 Then
MsgBox "Введено число " & Num
Else
MsgBox "Число не введено"
End If
On Error GoTo 0
End Sub
В приведённой ниже процедуре ПримерOnErrorGoto_0 инструкция On Error GoTo 0 отключает пользовательский обработчик ошибок в данной процедуре и может быть использована для восстановления нормальной обработки ошибок перед выходом из процедуры.
Sub ПримерOnErrorGoto_0()
Dim Num As Single
On Error GoTo 0
Num = InputBox("Введите число")
MsgBox "Введено число " & Num
Resume
End Sub
При возникновении ошибки ввода выводится следующее диалоговое окно, сообщающее о несоответствии типа данного введённому значению (“Пусто” или “Не число”).