ВГОРУ

VBA-Урок 7.1. Умови (Conditions)

YouLibreCalc for Excel logo

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

Інструкція VBA If...Then...Else виконує набір інструкцій залежно від того, чи виконується зазначена умова чи ні. Якщо умова (логічна перевірка) виконується, виконується один набір дій. Однак, якщо умова хибна, виконується альтернативний набір дій.

Однак для зручності читання ви можете використовувати оператор Select Case, а не декілька рівнів вкладених операторів If...Then...Else.


If...Then...Else

Отже, найбільш важливою функцією, яка задає умову є 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 Case

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

Розглянемо приклад макроса з оператором Select Case:

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