Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Умовна логіка | Основи VBA
Excel VBA для автоматизації бізнесу

Умовна логіка

Свайпніть щоб показати меню

До цього моменту все стосувалося зберігання та перевірки значень. Умовна логіка — це те, де ваш код починає приймати рішення: виконує один блок інструкцій замість іншого залежно від результатів перевірок.

If...Then

Найпростіша форма: виконується одна дія лише тоді, коли виконується одна умова.

If currentStock < reorderLevel Then
    MsgBox "Reorder needed!"
End If

Якщо умова у If є False, VBA просто переходить до того, що йде після End If — нічого не відбувається, і помилки не виникає.

If...ElseIf...Else

Обробляє більше ніж два можливих результати шляхом ланцюжка умов:

If currentStock = 0 Then
    status = "Out of Stock"
ElseIf currentStock < reorderLevel Then
    status = "Reorder Now"
ElseIf currentStock < reorderLevel * 2 Then
    status = "Watch Closely"
Else
    status = "Healthy"
End If

VBA перевіряє ці умови зверху вниз і зупиняється на першій, яка є True — далі перевірки не виконуються, навіть якщо наступна умова також була б True. Саме тому порядок важливий: якщо currentStock дорівнює 0, перша умова (= 0) спрацьовує і status одразу стає "Out of Stock". Зверніть увагу, що 0 також технічно менше за reorderLevel, тому якщо б рядок ElseIf currentStock < reorderLevel перевірявся першим, система помилково повідомила б "Reorder Now" для товару, якого зовсім немає. Розміщення найконкретнішої, найтерміновішої умови першою — і лише потім ширших умов — забезпечує правильну роботу такого ланцюжка.

Select Case

Коли потрібно перевірити одну змінну на кілька можливих фіксованих значень, Select Case виражає те саме, що й довгий ланцюжок ElseIf, але виглядає зрозуміліше:

Select Case category
    Case "Electronics"
        discountRate = 0.05
    Case "Office"
        discountRate = 0.1
    Case Else
        discountRate = 0
End Select

Select Case також зручно працює з діапазонами чисел, що складніше для читання у вигляді ланцюжка ElseIf:

Select Case currentStock
    Case 0
        status = "Out of Stock"
    Case 1 To 19
        status = "Low"
    Case 20 To 49
        status = "Adequate"
    Case Is >= 50
        status = "Well Stocked"
End Select

Case 1 To 19 охоплює будь-яке значення від 1 до 19 включно; Case Is >= 50 використовує Is для порівняння зі змінною, яку перевіряють, а не з фіксованим діапазоном.

Завдання

  1. Напишіть Sub з блоком Select Case (як у прикладі вище), який присвоює рядок статусу на основі жорстко заданого числа запасу.
  2. Протестуйте його тричі в межах одного Sub, змінюючи значення запасу: спробуйте 0, 15 і 134, кожного разу виводячи результат через Debug.Print.
  3. Додайте четверту умову для точно 20 (рівень поповнення для Keyboard) і перевірте, який Case її обробляє.
Підказка
expand arrow

1. Написання Sub з Select Case

  • Оголосіть одну змінну для зберігання номера запасу та одну для зберігання результатного тексту (status).
  • Спочатку присвойте змінній запасу жорстко задане значення (наприклад, stockLevel = 0), потім пропустіть його через Select Case stockLevel — скопіюйте ту ж структуру Case з прикладу розділу 2.4 (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Кожен Case має присвоювати різне текстове значення змінній status.

2. Тестування трьох значень в одному Sub

  • Не потрібно створювати три окремі процедури — просто змініть значення змінної, запустіть блок Select Case, виведіть результат, потім змініть значення знову й запустіть його повторно, усе це в межах одного Sub, одне за одним.
  • Після кожного присвоєння Debug.Print status у Вікні негайного виконання відобразиться результат без жодних спливаючих вікон, що зупиняють інші тести.

3. Додавання випадку саме для 20

  • Поверніться до оригінального прикладу з розділу 2.4 і уважно перевірте, де закінчується Case 1 To 19 і починається Case 20 To 49 — один із цих двох уже включає значення 20.
  • Оскільки Select Case зупиняється на першому збігу, додавання окремого рядка Case 20 змінить поведінку лише якщо його розмістити до того варіанта, який інакше його перехопить.
  • Запустіть з stockLevel = 20 і перевірте, яке повідомлення буде виведено — це покаже, який саме Case його обробив, без необхідності нічого додавати.
Розв'язок
expand arrow
Sub ClassifyStockLevels()
    Dim stockLevel As Integer
    Dim status As String

    ' --- Test 1 ---
    stockLevel = 0
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 2 ---
    stockLevel = 15
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 3 ---
    stockLevel = 134
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 4: exactly 20 ---
    stockLevel = 20
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status
End Sub
Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 4

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Умовна логіка

До цього моменту все стосувалося зберігання та перевірки значень. Умовна логіка — це те, де ваш код починає приймати рішення: виконує один блок інструкцій замість іншого залежно від результатів перевірок.

If...Then

Найпростіша форма: виконується одна дія лише тоді, коли виконується одна умова.

If currentStock < reorderLevel Then
    MsgBox "Reorder needed!"
End If

Якщо умова у If є False, VBA просто переходить до того, що йде після End If — нічого не відбувається, і помилки не виникає.

If...ElseIf...Else

Обробляє більше ніж два можливих результати шляхом ланцюжка умов:

If currentStock = 0 Then
    status = "Out of Stock"
ElseIf currentStock < reorderLevel Then
    status = "Reorder Now"
ElseIf currentStock < reorderLevel * 2 Then
    status = "Watch Closely"
Else
    status = "Healthy"
End If

VBA перевіряє ці умови зверху вниз і зупиняється на першій, яка є True — далі перевірки не виконуються, навіть якщо наступна умова також була б True. Саме тому порядок важливий: якщо currentStock дорівнює 0, перша умова (= 0) спрацьовує і status одразу стає "Out of Stock". Зверніть увагу, що 0 також технічно менше за reorderLevel, тому якщо б рядок ElseIf currentStock < reorderLevel перевірявся першим, система помилково повідомила б "Reorder Now" для товару, якого зовсім немає. Розміщення найконкретнішої, найтерміновішої умови першою — і лише потім ширших умов — забезпечує правильну роботу такого ланцюжка.

Select Case

Коли потрібно перевірити одну змінну на кілька можливих фіксованих значень, Select Case виражає те саме, що й довгий ланцюжок ElseIf, але виглядає зрозуміліше:

Select Case category
    Case "Electronics"
        discountRate = 0.05
    Case "Office"
        discountRate = 0.1
    Case Else
        discountRate = 0
End Select

Select Case також зручно працює з діапазонами чисел, що складніше для читання у вигляді ланцюжка ElseIf:

Select Case currentStock
    Case 0
        status = "Out of Stock"
    Case 1 To 19
        status = "Low"
    Case 20 To 49
        status = "Adequate"
    Case Is >= 50
        status = "Well Stocked"
End Select

Case 1 To 19 охоплює будь-яке значення від 1 до 19 включно; Case Is >= 50 використовує Is для порівняння зі змінною, яку перевіряють, а не з фіксованим діапазоном.

Завдання

  1. Напишіть Sub з блоком Select Case (як у прикладі вище), який присвоює рядок статусу на основі жорстко заданого числа запасу.
  2. Протестуйте його тричі в межах одного Sub, змінюючи значення запасу: спробуйте 0, 15 і 134, кожного разу виводячи результат через Debug.Print.
  3. Додайте четверту умову для точно 20 (рівень поповнення для Keyboard) і перевірте, який Case її обробляє.
Підказка
expand arrow

1. Написання Sub з Select Case

  • Оголосіть одну змінну для зберігання номера запасу та одну для зберігання результатного тексту (status).
  • Спочатку присвойте змінній запасу жорстко задане значення (наприклад, stockLevel = 0), потім пропустіть його через Select Case stockLevel — скопіюйте ту ж структуру Case з прикладу розділу 2.4 (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Кожен Case має присвоювати різне текстове значення змінній status.

2. Тестування трьох значень в одному Sub

  • Не потрібно створювати три окремі процедури — просто змініть значення змінної, запустіть блок Select Case, виведіть результат, потім змініть значення знову й запустіть його повторно, усе це в межах одного Sub, одне за одним.
  • Після кожного присвоєння Debug.Print status у Вікні негайного виконання відобразиться результат без жодних спливаючих вікон, що зупиняють інші тести.

3. Додавання випадку саме для 20

  • Поверніться до оригінального прикладу з розділу 2.4 і уважно перевірте, де закінчується Case 1 To 19 і починається Case 20 To 49 — один із цих двох уже включає значення 20.
  • Оскільки Select Case зупиняється на першому збігу, додавання окремого рядка Case 20 змінить поведінку лише якщо його розмістити до того варіанта, який інакше його перехопить.
  • Запустіть з stockLevel = 20 і перевірте, яке повідомлення буде виведено — це покаже, який саме Case його обробив, без необхідності нічого додавати.
Розв'язок
expand arrow
Sub ClassifyStockLevels()
    Dim stockLevel As Integer
    Dim status As String

    ' --- Test 1 ---
    stockLevel = 0
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 2 ---
    stockLevel = 15
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 3 ---
    stockLevel = 134
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 4: exactly 20 ---
    stockLevel = 20
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status
End Sub
Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 4
some-alt