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

Перевірка введених користувачем даних

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

Кнопка 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 порожнім, що дозволяє користувачу побачити всі проблеми з введенням одразу, а не проходити через кожну помилку окремо.

Завдання

  1. Перепишіть cmdSave_Click із завдання попереднього розділу так, щоб формувався рядок помилок, перевіряючи, що Company Name, Contact та Email не порожні.
  2. Додайте четверте текстове поле, txtReorderLevel, лише для цієї вправи, і перевірте його за допомогою IsNumeric.
  3. Виведіть одне об'єднане MsgBox зі списком усіх проблем, використовуючи vbExclamation як іконку, і переходьте до коду ListRows.Add лише якщо рядок помилок порожній.
  4. Перевірте, залишивши всі поля порожніми та натиснувши Save — переконайтеся, що всі очікувані рядки помилок з'являються в одному повідомленні.
Підказка
expand arrow

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), а не зупинку після першої — саме це об'єднане повідомлення і є метою цієї вправи, на відміну від попередньої версії, яка завершувала виконання після першої невдалої перевірки.
Розв'язок
expand arrow
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, доки ви не заповните всі поля правильно.

Все було зрозуміло?

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

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

Секція 5. Розділ 3

Запитати АІ

expand

Запитати АІ

ChatGPT

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

Секція 5. Розділ 3
some-alt