Управляющие конструкции, функции, обработка ошибок 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 While выполняется, пока условие истинно; Do Until — пока условие ложно
Бэто два названия одного и того же цикла
ВDo While всегда выполняется хотя бы раз, а Do Until — нет
Г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 защищают код от аварийной остановки.

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

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