VBA-Урок 7.1. Условия (Conditions)

Условия являются очень полезными при программировании, поскольку позволяют нам выполнять действия, в зависимости от установленных критериев (используется такой же принцип как и в IF функции Excel).

Наиболее важной функцией, которая задает условие является IF и сейчас мы посмотрим, как она работает:

If [УСЛОВИЕ ЗДЕСЬ] Then '=> ЕСЛИ условие верно, ТОГДА
    'Инструкции, если "правда"
Else '=> В ПРОТИВНОМ СЛУЧАЕ
    'Инструкции, если "ложь"
End If

Давайте перейдем к практике и вернемся к примеру, который мы использовали в уроке с переменными. Цель этой процедуры была в том, чтобы открыть диалоговое окно, которое бы содержало значение из строки, указанного в ячейке F5 :

Если вы введете букву в ячейку F5 , это повлечет ошибку. Мы хотим предотвратить это.

Sub variables ()
    'Декларирование переменных
   Dim last_name As String, first_name As String, age As Integer, row_number As Integer
       
   'Присвоение значений переменным
   row_number = Range("F5") + 1
   last_name = Cells(row_number, 1)
   first_name = Cells(row_number, 2)
   age = Cells(row_number, 3)
   
   'Диалоговое окно
   MsgBox last_name & " " & first_name & "," & age & " лет"
End Sub

Давайте добавим условие, которое будет проверять - является ли введенное значение в ячейку F5 числом, перед тем, как код будет выполнен.

Мы воспользуемся функцией IsNumeric для проверки условия:

Sub variables ()

   'Если значение в скобках (ячейка F5) является числовым (И ПОЭТОМУ УСЛОВИЕ IF ЕСТЬ ВЕРНЫМ) тогда
   'выполнить инструкции, которые следуют после THEN
    If IsNumeric (Range ("F5")) Then
   
        'Декларирование переменных
        Dim last_name As String, first_name As String, age As Integer, row_number As Integer
        'Присвоение значений переменным
        row_number = Range ("F5") + 1
        last_name = Cells (row_number, 1)
        first_name = Cells (row_number, 2)
        age = Cells (row_number, 3)
        'Диалоговое окно
        MsgBox last_name & " " & first_name & "," & age & " лет"
       
     End If
   
End Sub

Нам также нужно прописать инструкции, если поставленное нами условие не выполнится:

Sub variables ()

     If IsNumeric (Range ("F5")) Then 'Если условие выполняется
   
        'Декларирование переменных
        Dim last_name As String, first_name As String, age As Integer, row_number As Integer
        'Присвоение значений переменным
        row_number = Range ("F5") + 1
        last_name = Cells (row_number, 1)
        first_name = Cells (row_number, 2)
        age = Cells (row_number, 3)
        'Диалоговое окно
        MsgBox last_name & " " & first_name & "," & age & " лет"
       
     Else 'Если условие не выполняется
   
        'Диалоговое окно: предупреждение
        MsgBox "Введенное значение " & Range ("F5") & " не является верным!"
        'Удаление содержимого ячейки F5
        Range ("F5").ClearContents
   
     End If
   
End Sub

Теперь нечисловое значения не повлечет никаких проблем.

Работая с нашим массивом, который содержит 16 строк данных, наш следующий шаг будет в проверке является ли переменная row_number: "больше чем или равно 2" и "меньше чем или равно 17".

Но сначала взглянем на операторы сравнения:
= равно
<> не равно
< менше чем
<= меньше или равно
> больше чем
>= больше или равно

и эти полезные операторы:
AND [условие1] AND [условие2]
Два условия должны быть выполнены
OR[условие1] OR [условие2]
Не менее 1 из 2 условий должно быть выполнено
NOTNOT [условие1]
Условие не должно выполниться

Теперь давайте добавим одно из выше указанных условий AND между операторов сравнения:

Sub variables ()
     If IsNumeric (Range ("F5")) Then 'Если числовое значение
         Dim last_name As String, first_name As String, age As Integer, row_number As Integer
         row_number = Range ("F5") + 1

         If row_number> = 2 And row_number <= 17 Then 'Если верное число
             last_name = Cells (row_number, 1)
             first_name = Cells (row_number, 2)
             age = Cells (row_number, 3)
             MsgBox last_name & " " & first_name & "," & age & " лет"
         Else 'Если число не является корректным
             MsgBox "Введенное число" & Range ("F5") & " не является корректным!"
             Range ("F5").ClearContents
         End If
       
     Else 'Если это не числовое значение
         MsgBox "Введенное значение " & Range ("F5") & " не является верным!"
         Range ("F5").ClearContents
     End If
End Sub

Если мы хотим сделать наш макрос более практичным, мы можем заменить 17 на переменную, которая бы содержала количество строк. Это бы позволило нам добавлять и удалять строки из массива без необходимости изменять этот лимит каждый раз.

Для того, чтобы сделать это, мы должны создать переменную nb_rows и добавить эту функцию.

В этом случае, мы используем функцию WorksheetFunction.CountA , которая является аналогом функции COUNTA в самом Excel.

Мы хотим, чтобы эта функция подсчитала количество непустых ячеек в первой колонке по записала полученное значение в переменную nb_rows:

Sub variables ()
    If IsNumeric (Range ("F5")) Then 'ЕСЛИ ЧИСЛО
        Dim last_name As String, first_name As String, age As Integer, row_number As Integer
        Dim nb_rows As Integer
       
        row_number = Range ("F5") + 1
        nb_rows = WorksheetFunction.CountA (Range ("A:A")) 'Функция подсчета количества строк
       
        If row_number > = 2 And row_number < = nb_rows Then 'ЕСЛИ ВЕРНОЕ ЧИСЛО
            last_name = Cells (row_number,1)
            first_name = Cells (row_number,2)
            age = Cells (row_number,3)
            MsgBox last_name & " " & first_name & "," & age & " лет"
        Else 'ЕСЛИ ЧИСЛО НЕКОРРЕКТНО
            MsgBox "Введенное число " & Range("F5") & " не является корректным!"
            Range("F5").ClearContents
        End If

    Else 'ЕСЛИ НЕ ЕСТЬ ЧИСЛОМ
        MsgBox "Введенное значение " & Range ("F5") & " не является верным!"
        Range("F5").ClearContents
    End If
End Sub

ElseIf

ElseIf дает возможность добавлять дополнительные условия после IF команды:

If [УСЛОВИЕ 1] Then '=> ЕСЛИ условие 1 верно, ТОГДА
    'Инструкции 1
ElseIf [УСЛОВИЕ 2] Then '=> ЕСЛИ условие 1 неверно, но условие 2 верно, ТОГДА
    'Инструкции 2
Else '=> ИНАЧЕ
    'Инструкции 3
End If

 

Если УСЛОВИЕ 1 выполняется, Инструкция 1 будет выполнена и покинет оператор IF (который начинается с IF и заканчивается End If ). Если УСЛОВИЕ 2 принимает значение " ложь ", тогда будет выполнена Инструкция 2 , и если она в свою очередь возвращает " ложь ", тогда Инструкция 3 (под Else ) будет выполнена.

Далее есть пример с оценками от 1 до 6 в ячейке A1 и комментарием к этим оценкам в ячейке B1:

Sub scores_comment ()
'Переменные
Dim note As Integer, score_comment As String
note = Range ("A1")

'Комментарии, основанные на полученной оценке
If note = 6 Then
score_comment = "Великолепный бал!"
ElseIf note = 5 Then
score_comment = "Хороший бал"
ElseIf note = 4 Then
score_comment = "Удовлетворительный бал"
ElseIf note = 3 Then
score_comment = "Неудовлетворительный бал"
ElseIf note = 2 Then
score_comment = "Плохой бал"
ElseIf note = 1 Then
score_comment = "Ужасный бал"
Else
score_comment = "Нулевой бал"
End If

'Комментарий в ячейке B1
Range ("B1") = score_comment
End Sub

Select

Существует альтернатива использованию If со многими ElseIf инструкциями, а именно команда Select , которая больше подходит к такого рода ситуаций.

Рассмотрим пример макроса с оператором Select:

Sub scores_comment ()
    'Переменные
    Dim note As Integer , score_comment As String
    note = Range ("A1")
   
    'Комментарии , основанные на полученной оценке
    Select Case note '< = оценка теста (баллы)
    Case Is = 6 '< = если значение = 6
       score_comment = "Великолепный бал!"
    Case Is = 5 '< = если значение = 5
       score_comment = "Хороший бал"
    Case Is = 4 '< = если значение = 4
       score_comment = "Удовлетворительный бал"
    Case Is = 3 '< = если значение = 3
       score_comment = "Неудовлетворительный бал"
    Case Is = 2 '< = если значение = 2
       score_comment = "Плохой бал"
    Case Is = 1 '< = если значение = 1
       score_comment = "Ужасный бал"
    Case Else   '< = если значение не является равным любому из вышеуказанных
       score_comment = "Нулевой бал"
    End Select
   
    'Комментарий в ячейке B1
    Range ("B1") = score_comment
End Sub

Стоит отметить, что мы также могли использовать и другие операторы сравнения:

Case Is > = 6 'если значение> = 6

Примеры с различными значениями:

Case Is = 6, 7 'если значение = 6 или 7
Case Is <> 6, 7 'если значение не равно 6 или 7
Case 6 To 10 'если значение = любому числу от 6 до 10

Статьи по теме:

  • VBA-Урок 6.2. Типы данных (Variables)
  • VBA-Урок 7.2. Условия (Conditions)