Перевірка введених користувачем даних
Свайпніть щоб показати меню
Кнопка Save з попереднього розділу без проблем запише порожню назву компанії або некоректний email у таблицю Customers, оскільки в cmdSave_Click нічого не перевіряє дані перед збереженням. Валідація — це етап, який виконується перед збереженням, щоб виявити проблеми, поки їх ще легко виправити, а не після того, як вони вже стали некоректними даними у робочому аркуші.
Обов'язкові поля
Найпростіша перевірка: чи залишився цей TextBox порожнім?
If Trim(txtCompanyName.Value) = "" Then
MsgBox "Company Name is required."
txtCompanyName.SetFocus
Exit Sub
End If
Trim тут важливий більше, ніж здається — користувач, який введе лише кілька пробілів, пройде перевірку на = "", оскільки " " технічно не є порожнім рядком, але це так само непридатне значення, як і справжня порожнеча. SetFocus переміщує курсор безпосередньо у проблемне поле, щоб користувач не шукав, яке саме поле потрібно виправити — невелика деталь, яка робить форму значно зручнішою.
Перевірка числових значень
IsNumeric перевіряє, чи може значення бути перетворене на число, не намагаючись виконати саме перетворення і не ризикуючи помилкою:
If Not IsNumeric(txtReorderLevel.Value) Then
MsgBox "Reorder Level must be a number."
txtReorderLevel.SetFocus
Exit Sub
End If
Ця перевірка виявить, якщо у числове поле введено, наприклад, "twenty", як показано на скріншоті вище. Лише після проходження цієї перевірки можна безпечно писати код на кшталт CInt(txtReorderLevel.Value) далі у процедурі — спочатку валідація, потім перетворення, щоб уникнути неочікуваних помилок при конвертації.
Перевірка дат
IsDate працює за тим же принципом, але для дат замість чисел:
If Not IsDate(txtOrderDate.Value) Then
MsgBox "Order Date must be a valid date."
txtOrderDate.SetFocus
Exit Sub
End If
Повідомлення про помилки, які збирають усі проблеми одразу
Три перевірки вище одразу виконують Exit Sub, щойно знаходять одну проблему — це підходить для коротких форм, але дратує у довших, коли користувач виправляє одну помилку, а одразу стикається з наступною. Більш зручний підхід — накопичувати список усіх проблем і показувати одне загальне повідомлення:
Private Sub cmdSave_Click()
Dim errors As String
If Trim(txtCompanyName.Value) = "" Then
errors = errors & "- Company Name is required" & vbNewLine
End If
If Not IsNumeric(txtReorderLevel.Value) Then
errors = errors & "- Reorder Level must be a number" & vbNewLine
End If
If errors <> "" Then
MsgBox "Please fix the following:" & vbNewLine & errors, _
vbExclamation
Exit Sub
End If
' ... all checks passed, safe to save now
End Sub
Це та сама техніка формування рядка, що й у макросі попереднього розділу для сповіщення про залишки — errors починається порожнім, і кожна невдала перевірка додає до нього ще один рядок, замість негайного виходу. Лише після виконання всіх перевірок процедура перевіряє, чи залишився errors порожнім, що дозволяє користувачу побачити всі проблеми з введенням одразу, а не проходити через кожну помилку окремо.
Завдання
- Перепишіть
cmdSave_Clickіз завдання попереднього розділу так, щоб формувався рядок помилок, перевіряючи, що Company Name, Contact та Email не порожні. - Додайте четверте текстове поле, txtReorderLevel, лише для цієї вправи, і перевірте його за допомогою IsNumeric.
- Виведіть одне об'єднане MsgBox зі списком усіх проблем, використовуючи vbExclamation як іконку, і переходьте до коду ListRows.Add лише якщо рядок помилок порожній.
- Перевірте, залишивши всі поля порожніми та натиснувши Save — переконайтеся, що всі очікувані рядки помилок з'являються в одному повідомленні.
1. Формування рядка помилок
- Оголосіть одну змінну типу
String(errors) на початкуcmdSave_Click, початково порожню. - Для кожного з трьох полів використовуйте ту ж перевірку
Trim(...) = ""із розділу 5.3 — якщо поле порожнє, додайте один рядок доerrorsзамість негайного показуMsgBoxчи виходу з Sub. vbNewLineнаприкінці кожного доданого рядка забезпечує відображення кожної проблеми з нового рядка у фінальному повідомленні.
2. Додавання txtReorderLevel
- Це текстове поле лише для практики числової валідації — воно не відповідає жодній реальній колонці в
tblCustomers, тому не потрібно записувати його уnewRowпізніше. - Додайте його на форму в режимі конструктора (Shift+F7) з відповідною міткою, так само як додавали інші три текстові поля.
IsNumericперевіряє сирий текст у.Value— якщо перевірка не проходить, додайте рядок доerrorsтак само, як і для порожніх полів.
3. Одне об'єднане MsgBox, потім продовження
- Усе з прикладу розділу 5.3 застосовується тут безпосередньо — перевірте
If errors <> "" Then, покажіть однеMsgBoxзvbExclamationіExit Sub. - Код
ListRows.Addвиконується лише якщо цей блокIfне завершив виконання — тобто він має фізично розташовуватись після всього блоку валідації, а не всерединіElse.
4. Тестування з усіма порожніми полями
- Натисніть Save, не вводячи нічого.
- Ви повинні побачити рівно одне вікно
MsgBox, у якому перелічені всі чотири проблеми (Company Name, Contact, Email, Reorder Level), а не зупинку після першої — саме це об'єднане повідомлення і є метою цієї вправи, на відміну від попередньої версії, яка завершувала виконання після першої невдалої перевірки.
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
Dim errors As String
' --- Validation ---
If Trim(txtCompanyName.Value) = "" Then
errors = errors & "- Company Name is required" & vbNewLine
End If
If Trim(txtContact.Value) = "" Then
errors = errors & "- Contact is required" & vbNewLine
End If
If Trim(txtEmail.Value) = "" Then
errors = errors & "- Email is required" & vbNewLine
End If
If Not IsNumeric(txtReorderLevel.Value) Then
errors = errors & "- Reorder Level must be a number" & vbNewLine
End If
If errors <> "" Then
MsgBox "Please fix the following:" & vbNewLine & errors, vbExclamation
Exit Sub
End If
' --- All checks passed — safe to save now ---
Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "C0" & (tbl.ListRows.Count + 100)
newRow.Range(1, 2).Value = txtCompanyName.Value
newRow.Range(1, 3).Value = txtContact.Value
newRow.Range(1, 4).Value = txtEmail.Value
newRow.Range(1, 5).Value = cboCity.Value
newRow.Range(1, 6).Value = cboStatus.Value
MsgBox txtCompanyName.Value & " was added successfully."
Unload Me
End Sub
Запустіть форму, залиште всі поля порожніми та натисніть Save — ви повинні побачити одне вікно MsgBox з іконкою попередження, у якому одночасно перелічені всі чотири відсутні/некоректні поля, і жоден рядок не буде додано до tblCustomers, доки ви не заповните всі поля правильно.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат