Умовна логіка
Свайпніть щоб показати меню
До цього моменту все стосувалося зберігання та перевірки значень. Умовна логіка — це те, де ваш код починає приймати рішення: виконує один блок інструкцій замість іншого залежно від результатів перевірок.
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 для порівняння зі змінною, яку перевіряють, а не з фіксованим діапазоном.
Завдання
- Напишіть
Subз блокомSelect Case(як у прикладі вище), який присвоює рядок статусу на основі жорстко заданого числа запасу. - Протестуйте його тричі в межах одного
Sub, змінюючи значення запасу: спробуйте 0, 15 і 134, кожного разу виводячи результат черезDebug.Print. - Додайте четверту умову для точно 20 (рівень поповнення для Keyboard) і перевірте, який Case її обробляє.
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його обробив, без необхідності нічого додавати.
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
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Умовна логіка
До цього моменту все стосувалося зберігання та перевірки значень. Умовна логіка — це те, де ваш код починає приймати рішення: виконує один блок інструкцій замість іншого залежно від результатів перевірок.
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 для порівняння зі змінною, яку перевіряють, а не з фіксованим діапазоном.
Завдання
- Напишіть
Subз блокомSelect Case(як у прикладі вище), який присвоює рядок статусу на основі жорстко заданого числа запасу. - Протестуйте його тричі в межах одного
Sub, змінюючи значення запасу: спробуйте 0, 15 і 134, кожного разу виводячи результат черезDebug.Print. - Додайте четверту умову для точно 20 (рівень поповнення для Keyboard) і перевірте, який Case її обробляє.
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його обробив, без необхідності нічого додавати.
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
Дякуємо за ваш відгук!