TOP
VBA-Урок 7.1. Условия (Conditions)
Условия являются очень полезными при программировании, поскольку позволяют нам выполнять действия, в зависимости от установленных критериев (используется такой же принцип как и в IF функции Excel).
Наиболее важной функцией, которая задает условие является IF и сейчас мы посмотрим, как она работает:
- If [УСЛОВИЕ ЗДЕСЬ] Then
-
- Else
-
- End 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
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 ()
-
-
-
- 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 ()
'Если значение в скобках (ячейка 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") & " не является верным!"
-
- Range ("F5").ClearContents
-
- 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 условий должно быть выполнено |
NOT | NOT [условие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
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
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
-
- ElseIf [УСЛОВИЕ 2] Then
-
- Else
-
- End 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
-
-
- Range ("B1") = score_comment
- End Sub
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
- score_comment = "Великолепный бал!"
- Case Is = 5
- score_comment = "Хороший бал"
- Case Is = 4
- score_comment = "Удовлетворительный бал"
- Case Is = 3
- score_comment = "Неудовлетворительный бал"
- Case Is = 2
- score_comment = "Плохой бал"
- Case Is = 1
- score_comment = "Ужасный бал"
- Case Else
- score_comment = "Нулевой бал"
- End Select
-
-
- Range ("B1") = score_comment
- End Sub
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
- Case Is <> 6, 7
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)