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)