Управляющие конструкции, функции, обработка ошибок VBA

После урока сможешь: писать условия If/ElseIf, выбирать нужный вид цикла, оформлять свой код в процедуры и функции с параметрами и защищать код от падения через обработку ошибок.
Вспомни: переменные, типы и операторы из темы 5.1 — они понадобятся внутри условий и циклов без повторного объяснения.

Условия: If, ElseIf, Else

Простое условие: If age >= 18 Then MsgBox "Совершеннолетний" Else MsgBox "Нет" End If. Несколько веток — через ElseIf: сначала проверяется первое условие сверху вниз, срабатывает ПЕРВОЕ истинное, остальные не проверяются.

Dim temp As Integer
temp = 72

If temp >= 90 Then
    Debug.Print "Отлично"
ElseIf temp >= 80 Then
    Debug.Print "Хорошо"
ElseIf temp >= 70 Then
    Debug.Print "Уд."
Else
    Debug.Print "Плохо"
End If
' temp = 72 -> сработает ветка "temp >= 70", выведется "Уд."

Циклы: For, Do While, Do Until, For Each

For i = 1 To 5 ... Next i — известное число повторов. Do While условие ... Loop — пока условие ИСТИННО. Do Until условие ... Loop — пока условие ЛОЖНО (наоборот Do While). For Each элемент In коллекция ... Next — перебор элементов массива/диапазона без счётчика.

For i = 1 To 5           Do While i <= 5         Do Until i > 5
  Debug.Print i            Debug.Print i           Debug.Print i
Next i                    i = i + 1               i = i + 1
                        Loop                     Loop

Выполнится, пока        Выполнится, пока        Выполнится, пока
счётчик не превысит 5    условие ИСТИННО         условие ЛОЖНО

Свои процедуры (Sub) и функции (Function)

Процедура (Sub) выполняет действие и НЕ возвращает значение: Sub Привет() Debug.Print "Привет!" End Sub. Функция (Function) возвращает значение — присваивают имени функции внутри тела: Function Четность(n As Integer) As String : If n Mod 2 = 0 Then Четность = "Чётное" Else Четность = "Нечётное" : End Function. Обе могут принимать параметры в скобках.

Обработка ошибок: On Error

On Error Resume Next — пропустить строку с ошибкой и продолжить. On Error GoTo Метка — при ошибке перейти на метку с кодом обработки. On Error GoTo 0 — снова включить стандартный (аварийный) режим. Код ошибки и текст доступны через Err.Number/Err.Description.

Sub БезопасноеДеление()
    On Error GoTo Обработка

    Dim result As Double
    result = 10 / 0          ' деление на ноль вызовет ошибку

    Debug.Print result
    Exit Sub               ' пропускаем обработчик, если ошибки не было

Обработка:
    Debug.Print "Ошибка: " & Err.Description   ' текст ошибки
    Resume Next
End Sub

Проверь себя

Контрольный вопрос. score = 85. If score >= 90 Then MsgBox «Отлично» ElseIf score >= 80 Then MsgBox «Хорошо» ElseIf score >= 70 Then MsgBox «Уд.» Else MsgBox «Плохо» End If — что покажет MsgBox?

АХорошо
БПлохо
ВОтлично
ГУд.

Подсказка: Проверяй условия по порядку сверху вниз — первое истинное и сработает.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Контрольный вопрос. Чем Do While отличается от Do Until (при одинаковом условии)?

Аэто просто два названия одного и того же цикла, разницы нет
БDo Until работает только с числами, а Do While — с любыми данными
ВDo While всегда выполняется хотя бы раз, а Do Until — никогда
ГDo While идёт, пока условие истинно; Do Until — пока ложно

Подсказка: Смотри на смысл слов: «пока» (While) и «до тех пор пока не» (Until) — противоположные направления.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Задание. Напиши строку кода сам. Нужен цикл, который повторится 10 раз со счётчиком i, начиная с 1. Впиши только ПЕРВУЮ строку такого цикла (строку-заголовок, без тела и без закрывающей строки).

Подсказка: Строка-заголовок цикла со счётчиком состоит из ключевого слова цикла, имени счётчика, знака равно, начального значения, слова To и конечного значения.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Контрольный вопрос. For Each элемент In массив … Next — что делает эта конструкция?

Авыполняется столько раз, пока условие истинно
Бперебирает все элементы коллекции без счётчика
Вповторяет код заданное число раз по счётчику
Гподходит только для числовых массивов и списков

Подсказка: Ключевая разница с For…To — здесь нет счётчика и границ, только «для каждого элемента».

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Контрольный вопрос. В чём главное отличие процедуры (Sub) от функции (Function)?

Апроцедура быстрее выполняется
Бфункция возвращает значение, процедура — нет
Вразницы нет, это синонимы
Гфункция не может принимать параметры

Подсказка: Функция «функционирует» и отдаёт результат; процедура просто выполняет действие.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Задание. Дан код:
Function Квадрат(n As Double) As Double<br>  Квадрат = n * n<br>End Function

Sub Тест()<br>  Debug.Print Квадрат(6)<br>End Sub

Что выведет Debug.Print при запуске процедуры Тест? Впиши число.

Подсказка: Функция возвращает переданное число, умноженное само на себя.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Задание. В цикле ниже пропущен оператор сравнения. Цикл должен выполняться, пока i меньше или равно 5:
Dim i As Integer<br>i = 1<br>Do While i ___ 5<br>  Debug.Print i<br>  i = i + 1<br>Loop

Какой оператор вписать вместо ___ (запиши знаками, без слов)?

Подсказка: «Меньше или равно» — это два символа подряд, без пробела между ними.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Контрольный вопрос. On Error Resume Next перед строкой с потенциальной ошибкой делает что?

Аотменяет все изменения, сделанные до ошибки
Бостанавливает программу с сообщением об ошибке
Впропускает строку с ошибкой и продолжает выполнение дальше
Гавтоматически исправляет ошибку

Подсказка: «Resume Next» буквально означает «продолжить со следующей строки».

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Задание. Напиши строку кода сам. В начале процедуры нужно включить перехват ошибок так, чтобы при любой ошибке выполнение прыгало на метку с именем Обработка. Впиши строку целиком.

Подсказка: Конструкция состоит из трёх ключевых слов подряд (перехват ошибки и переход) и имени метки в конце — без двоеточия.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Контрольный вопрос. On Error GoTo Метка … Метка: MsgBox «Ошибка: » & Err.Description — что покажет Err.Description?

Атекстовое описание произошедшей ошибки
Бномер строки, где случилась ошибка
Вимя процедуры, где случилась ошибка
Гвремя возникновения ошибки

Подсказка: Err.Number даёт код, а Err.Description — как раз текст описания.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Задание. i = 1 : Do Until i > 3 : Debug.Print i : i = i + 1 : Loop — сколько раз выполнится Debug.Print? Впиши число.

Подсказка: Вспомни разницу Do While/Do Until: условие проверяется КАЖДЫЙ раз перед новым проходом цикла. Посчитай, сколько раз оно останется ложным до первого истинного значения.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Контрольный вопрос. Отметь все верные утверждения про управляющие конструкции VBA (не менее двух вариантов).

Выберите все верные варианты.

АElseIf проверяет условия по порядку и останавливается на первом истинном
БFor Each не требует знать заранее число элементов
Вфункция обязана возвращать значение через присвоение своему имени внутри тела
ГDo While и Do Until всегда дают одинаковый результат при любом условии
ДOn Error Resume Next останавливает выполнение программы

Подсказка: Два варианта либо путают понятия местами, либо описывают то, чего конструкция не делает.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Итог

Итог. If/ElseIf проверяет условия по порядку до первого истинного. For — известное число повторов, Do While/Do Until — пока условие истинно/ложно, For Each — перебор без счётчика. Sub выполняет действие, Function возвращает значение через присвоение своему имени. On Error Resume Next/GoTo защищают код от аварийной остановки.
Хочешь глубже? Основы языка VBA подробно и с примерами — в статье «Основы VBA (Visual Basic for Applications)».

← Назад к главе 5  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд: Объекты Excel из VBA →

Школа Виктора Комлева