Урок 4 Как заставить Excel думать: работа с условиями в VBA
Содержание
Итак, переходим к Уроку 4. Теперь, когда вы освоили переменные и функции, пришло время сделать ваши макросы «умными» — способными анализировать данные и действовать по ситуации. Сегодня мы научим Excel принимать решения! Если вы попали сюда впервые и не изучили предыдущие уроки, то настоятельно рекомендуем начать именно с них. Обязательно сделайте все задания, а не просто прочитайте теорию, это очень важно.
Урок 1 Введение в макросы Excel: что это и зачем нужно
Урок 2 Как запускать макросы: 3 удобных способа, настройка кнопок и горячих клавиш
Урок 3 VBA Excel для автоматизации: переменные, типы данных и диалоговые окна
Разбор домашнего задания
Итак, здесь мы дадим код макроса, который решает задачу предыдущего урока 3. Учитывая те подсказки, которые были даны к заданию, комментировать в коде больше нечего. Он довольно-таки простой:
Sub TestCalculation() Dim UserInputAmount As String Dim UserInputPercent As String Dim Amount As Double Dim Percent As Double Dim CalculateValue As Double UserInputAmount = InputBox("Введите сумму:") UserInputPercent = InputBox("Введите процент:") Amount = CDbl(UserInputAmount) Percent = CDbl(UserInputPercent) CalculateValue = Amount * (1 + Percent / 100) MsgBox "Итого: " & CalculateValue End Sub
Вот как он выглядит в редакторе:
Если у вас ещё останутся вопросы по этому заданию — напишите в комментариях!
Работа с содержимым ячейки листа Excel
Перед тем как перейти к основной теме этого урока давайте разберемся, как из кода макроса считывать значения ячеек и как устанавливать эти значения. Это нам пригодится дальше.
' Так в ячейку A1 макрос запишет текст "Это ячейка А1" Range("A1").Value = "Это ячейка А1" ' Содержимое ячейки B1 записывается в переменную ValueB1 ValueB1 = Range("B1").Value
Давайте потренируемся. Создайте новый макрос с таким кодом:
Sub Test() MsgBox Range("A1").Value End Sub
Далее, напишите в ячейке A1 слово Привет! и запустите макрос. Вот что должно получиться в результате:
Содержимое ячейки A1 вывелось в окне сообщения. Попробуйте поменять текст в A1 и снова выполнить макрос.
Условия и зачем они нужны
Условия — это конструкции в языке программирования, которые позволяют коду принимать решения в зависимости от выполнения определенных правил. Они работают по принципу «если → то»: программа проверяет, верно ли условие (например, число > 10), и выполняет разные действия в зависимости от результата. В VBA для этого используются операторы If...Then, ElseIf, Else и Select Case.
Условия делают программы «гибкими» и адаптивными. Без них код выполнял бы одни и те же действия, не учитывая входные данные или изменения в процессе работы.
Например:
- Проверка корректности введенных пользователем данных;
- Выбор разных расчетов для клиентов (обычный/VIP);
- Обработка ошибок (если файл не найден → сообщить об этом).
Проще говоря, условия — это «мозг» программы, который анализирует ситуацию и принимает решения. Чем сложнее логика, тем важнее уметь грамотно применять условные операторы!
Базовый оператор If...Then
Простая форма условия
Самая простая форма условия (одна строка) имеет такой формат:
If условие Then действие
Если заданное вами условие выполняется, то реализуется действие. Например:
If sales > 10000 Then MsgBox "Бонус начислен!"
Такой код выведет окно с сообщением "Бонус начислен!" при условии, что значение переменной sales будет больше 10000. В противном случае, ничего не произойдет.
Многострочная форма (с End If)
В этой форме можно задать не только действие, которое будет выполнено в случае выполнения условия, но и действия, выполняемые при его не выполнении. Кроме того, действий может быть много.
If условие Then ' Действия при выполнении условия Else ' Действия, если условие не выполнено End If
Например, давайте создадим макрос с таким кодом:
Sub Test1() If Range("A1").Value > 100 Then Range("B1").Value = "Превышение" Else Range("B1").Value = "Норма" End If End Sub
Вот как он выглядит в редакторе:
Далее, в ячейку A1 запишем число 120 и запустим макрос:
И вот что должно получиться:
В ячейке B1 должен появиться текст Превышение. Если это произошло, то всё сделано верно. Условие Range("A1").Value > 100 оказалось верным. Далее выполнилось действие Range("B1").Value = "Превышение", что привело к тому, что в ячейку B1 был записан соответствующий текст.
Теперь поменяем число в A1 на 5 и вновь запустим макрос:
Так как условие Range("A1").Value > 100 перестало быть верным, то теперь выполнилось действие Range("B1").Value = "Норма" и в ячейку B1 прописалось слово Норма.
Попробуйте запускать макрос и с другими значениями A1, чтобы убедиться, что всё работает именно так, как вы понимаете.
Вложенные условия (ElseIf):
А что, если требуется выполнить множество действий в зависимости от большого количества условий? Конечно, можно использовать вложенные друг в друга условия. Но иногда можно написать более лаконичный и понятный код с помощью специальной команды ElseIf.
ElseIf позволяет провести проверку ещё на одно условие, если предыдущее оказалось не верным. Таким образом мы можем провести множество проверок, и выполнять действия только в случаях, если оказались верными (или не верными) множество условий.
Давайте сделаем ещё один макрос, чтобы разобраться как работает такой тип условий:
Sub Test2() If Range("A1").Value >= 32 Then Range("B1").Value = "Очень жарко" ElseIf Range("A1").Value >= 25 Then Range("B1").Value = "Жарко" ElseIf Range("A1").Value >= 20 Then Range("B1").Value = "Тепло" Else Range("B1").Value = "Прохладно" End If End Sub
Вот как выглядит данный код в редакторе VBA:
Теперь запишите в ячейку A1 число 42 и запустите макрос Test2. Если всё сделано корректно, то в ячейке B1 появится фраза Очень жарко. Попробуйте вписывать другие числа и запускать макрос.
Мы научили Excel словесно описывать погоду в зависимости от температуры на улице. И это уже какая-то магия? Нет, конечно, это пока ещё очень и очень простая программа. Попробуйте менять значения в A1 и убедитесь, что значение в B1 также меняется в соответствие с условиями программы.
Вы догадались, что обозначение >= означает «больше или равно»? Также можно применять и «меньше или равно» <=.
Для обозначения «не равно» используется <>
If level <> 32 Then ' Верно, если level не равен 32
Условия могут содержать ещё и другие обозначения, а также их комбинацию.
Комбинирование условий
Для построения более сложных условных конструкций пригодятся такие операторы как And (логическое «И»), Or (логическое «ИЛИ»), Not (логическое «НЕ»).
Оператор | Пример | Описание |
---|---|---|
And | If age >= 18 And age <= 65 Then | Верно, если age в диапазоне от 18 до 65 включительно |
Or | If dep = "HR" Or dep = "Finance" Then | Верно в 2-х случаях, если dep равно "HR" ИЛИ "Finance" |
Not | If Not IsEmpty(cell) Then | Верно, если функция IsEmpty() вернет значение НЕ ВЕРНО (то есть False) |
Оператор Select Case — альтернатива множественным If
Когда использовать
- При проверке одной переменной на множество значений;
- Когда условий больше 3-х.
Синтаксис
По сути, вы указываете переменную (или выражение) после Select Case, значение которой будет проверяться. Далее, будет выполнено действие после того Case, условие которого выполнено. И если ни одно условие не сработало, то будет выполнено действие после Case Else.
Select Case переменная Case значение1 ' Действия 1 Case значение2, значение3 ' Действия 2 Case Is > 100 ' Действия 3 Case Else ' Действия по умолчанию End Select
Условие может быть выражено:
- простым указанием значения, которому должно быть равна переменная;
- списком значений, записанным через запятую;
- диапазоном значений, указанным с помощью оператора диапазона To;
- условием, в котором значение переменной (или выражения) заменено обозначением Is.
Это просто фантастика! Такой огромный набор вариантов может значительно упростить код программы.
Практический пример
Посмотрим различные варианты применения на практическом примере. Макрос будет определять сезон по дате. Дату мы будем прописывать в ячейке A1, а сезон, к которому относится эта дата, макрос пропишет в ячейку B1. Обратите внимание на применение оператора диапазона: «3 To 5» означает числа от 3 до 5, то есть 3, 4, 5. И ещё в коде есть кое-что новенькое: функция Month по дате определяет номер месяца от 1 до 12.
Sub Test3() Select Case Month(Range("A1").Value) Case 12, 1, 2 Range("B1").Value = "Зима" Case 3 To 5 Range("B1").Value = "Весна" Case 6 To 8 Range("B1").Value = "Лето" Case Else Range("B1").Value = "Осень" End Select End Sub
Создайте макрос в редакторе и запишите в ячейку A1 дату 23.03.2025
Теперь запустите макрос Test3. Если всё сделано верно, то в ячейке B1 будет прописано слово Весна.
Теперь проверьте как будет работать макрос для других значений дат в A1. Убедитесь, что сезоны определяются верно.
Частые ошибки и лучшие практики
Путаница между = и ==
Обратите внимание, что в VBA используется одиночный символ = в условиях, в отличие от многих других языков программирования.
Например:
' Правильно: If x = 10 Then
Проверка строк без учета регистра
При проверках переменных со строковым значением регистр текста будет учтён. Например, Вася не будет равно вася. А МАЙ не равно Май. Особенно это становится актуально, когда обрабатывается результат ввода пользователя. Пользователь не знает как правильно вводить текст и будет вводить его, вероятнее всего, как угодно.
В этом случае нас выручит функция LCase, которая приводит текст на входе к нижнему регистру. Из слова «Вася» она сделает «вася», а из слова «МАЙ» слово «май». Поэтому программе останется только одна проверка, что значительно упрощает код:
If LCase(userInput) = "да" Then
Проверка на пустые ячейки
Проверять на пустые ячейки можно двумя способами:
If IsEmpty(Range("A1")) Then ' Или: If Range("A1").Value = "" Then
Домашнее задание
Задача 1
Напишите макрос, который:
- Проверяет значение в ячейке A1
- Если число >100, заливает ячейку зелёным
- Если между 50 и 100 включительно — желтым
- Если <50 — красным.
Подсказка: таким образом можно задать цвет ячейки зелёным:
Range("A1").Interior.Color = vbGreen
Вместе с vbGreen в задаче пригодятся и другие константы: vbYellow (жёлтый), vbRed (красный).
Также, для справки, приведём и другие возможные константы цветов: vbBlack (чёрный), vbBlue (синий), vbCyan (бирюзовый), vbMagenta (пурпурный) и vbWhite (белый).
Задача 2
Создайте функцию GetDiscount(status), которая возвращает размер скидки в зависимости от значения status:
"VIP" → 15%
"Постоянный" → 5%
"Акция" → 2%
Любое другое значение → 0%
На следующем уроке
Мы освоим циклы — мощный инструмент для обработки множества данных! Нас ждёт:
- 3 типа циклов и когда какой использовать;
- как обрабатывать ячейки, листы, файлы в циклах;
- хитрости ускорения работы макросов;
- как избежать бесконечных циклов;
- практические примеры из реальной аналитики;
- разбор домашнего задания этого урока.
🚀 Теперь ваши макросы могут принимать решения — используйте эту силу!
Следующий урок: Урок 5 Как заставить Excel повторять действия: все о циклах VBA
Вступайте в наше сообщество ВК ustanovkaos_ru, чтобы не пропустить выход следующих уроков!
Возникли трудности, или вы успешно сделали домашнее задание? В любом случае — оставляйте вопросы и отзывы в комментариях!