Excel Analysis Blog
BETA
Придется немного поработать


Макросы. Урок пятый

Условия выполнения, ветки решения

GoTo

Теперь разберемся как делать так, чтобы код сам решал, что ему нужно выполнять, в зависимости от заданных условий. Для начала разберемся с самой грубой командой прямого приказа GOTO. Используется очень редко, но для начала нужно понимать, чему мы сейчас хотим научиться. Пишем понятный нам код:

Sub test()
    Dim a As Byte, b As Byte, c As Byte
    a = 1
    b = 1
    c = a + b
    MsgBox (c)
End Sub

Тут никаких вопросов. Теперь внедряем команду GoTo. Данная команды информирует редактор о том, что нужно перейти в коде к определенной метке и выполнять его оттуда. Выполните пошагово следующий код:

Sub test()
    Dim a As Byte, b As Byte, c As Byte
    a = 1
    GoTo metca
    b = 1
metca:
    c = a + b
    MsgBox (c)
End Sub

Как мы видим, здесь не выполняется строка кода b=1, т.к. команда GoTo принуждает макрос сразу перейти к metca и выполнять код оттуда. Таких операторов можете поставить сколько угодно. Только не забывайте (если надо) ставить меткам разные имена.

Оператор GoTo может возвращать код не только вперед, но и назад. В этом его уникальность, но и опасность. Можете создать рекурсию (по сути бесконечный цикл, хоть здесь цикла и нету). Например, попробуйте выполнить пошагово следующий код. ВНИМАНИЕ, он никогда не закончится:

Sub test1()
    Dim a As Byte, b As Byte, c As Byte
    a = 1
metca:
    b = 1
    c = a + b
    GoTo metca
    MsgBox (c)
End Sub

В данном случае оператор GoTo постоянно отправляет код на изначальную позицию. Сам по себе данный оператор абсолютно бесполезен, но он может пригодиться, когда работает в связке с IF или Case, которые мы в будущем разберем.

IF

Это один самых востребованных операторов, которые часто используются. Надеюсь вам знакома функция ЕСЛИ в Excel (в англ. Версии IF), если нет, то просьба сначала ознакомиться, функция одна из простых.Так вот, тоже самое можно организовать и на программном уровне. Данная операция выглядит следующим образом:

  1. IF — непосредственно сам оператор, по-русски переводим как ЕСЛИ
  2. Затем задается условие выполнения. ИСТИНА или ЛОЖЬ. Конкретно можно привести бородатую шутку программистов:
    «Мы можем ответь любой вопрос, даже тот, который уже содержит ответ. Пример:
    — 2+2=4 ?
    Ответ:
    — ИСТИНА»
  3. Then — переводим как тогда
  4. Здесь описываем какое действие производить
  5. Else — необязательный аргумент, но можно описывать, что делать, когда условие выдает ЛОЖЬ
  6. End If — просто закрывает условие.

ВАЖНО. Не забывайте про 6 оператор. Без него работать весь макрос не будет. Лучше взять в привычку правило: написали If, внизу сразу End If, а далее уже между ними пишите. Сейчас мало что понятно, поэтому лучше разберем на примере. Сначала без Else. Выполните пошагово, чтобы понять как он работает

Sub test3()
    Dim a As Byte
    Dim b As String
    
    a = 1
    If a = 1 Then ‘т.е. условие выполняется только в том случае, если а=1
        b = "Переменная равна 1"
    End If
    
    MsgBox (b)
    
End Sub

Попробуйте изменить значение A на любую другую цифру, посмотрите как код выполняется в этом случае. Также вы можете добавить условие ELSE — что делать, если условие не выполняется

Sub test3()
    Dim a As Byte
    Dim b As String
    
    a = 1
    If a = 1 Then
            b = "Переменная равна 1"
        Else
            b = "Переменная совсем не равна 1"
    End If
        MsgBox (b)
    
End Sub

В выражениях If вы можете использовать операторы AND (И) и OR (ИЛИ).

Sub test4() ‘пример с И
    Dim a As Byte, c As Byte
    Dim b As String
    
    a = 1
    c = 2
    'условие будет выполняться в случае, если и а=1 и c=2. Если хоть одно не совпадет, то нет.
    If a = 1 And c = 2 Then
            b = "Переменная равна 1"
        Else
            b = "Переменная совсем не равна 1"
    End If
    
    MsgBox (b)
    
End Sub
Sub test5() ‘пример с ИЛИ
    Dim a As Byte, c As Byte
    Dim b As String
    
    a = 1
    c = 1
    'тут достаточно, чтобы выполнялось хотя бы одно условие
    If a = 1 Or c = 2 Then
            b = "Переменная равна 1"
        Else
            b = "Переменная совсем не равна 1"
    End If
    
    MsgBox (b)
    
End Sub

Точно также вы можете проводить внутри IF операции сравнения нескольких переменных, например If a=b Then. Кстати, символ неравенства в VBA выглядит так <>.

Вложенные условия

Вы также можете вкладывать внутри If несколько подобных функций. Например:

Sub test6()
    Dim a As Byte, b As Byte, c As Byte
    
    a = 5
    b = 6
    c = 7
    
    If a > 1 Then
            If b = 6 Then
                MsgBox "Выполнилось первое условие"
            End If
        Else
            If c < 10 Then
                MsgBox "Выполнилось второе условие"
            End If
    End If
End Sub

Если мне не изменяет память, то 2003 Excel поддерживалось 7 вложенных IF, сколько сейчас не знаю.

И, как я уже говорил, вот тут иногда может быть полезна операция GoTo.

Sub test7()
    Dim a As Byte, b As Byte, c As Byte
    
    a = 10
    b = 0
    'по сути хочу забить выражение c=a/b. Но как мы знаем, на ноль делить нельзя (мнимых чисел в vba нету)
    'не буду ничего делать, чтобы ошибок не вылетало
    If b <= 0 Then
        GoTo metca
    End If
    
    c = a / b
metca:
End Sub

Хотя это конечно лишнее, привел только для примера. На самом деле я просто отделаюсь одним только IF:

Sub test8()
    Dim a As Byte, b As Byte, c As Byte
    
    a = 10
    b = 3
    If b > 0 Then
        c = a / b
    End If
    
End Sub

Приступаем к самостоятельной работе.

Скачать примеры урока

Скачать самостоятельное задание