Создание формы ввода данных студентов в Excel с помощью VBA

Visual Basic for Applications (VBA) — удобный инструмент для автоматизации рутинных задач в Excel. Один из самых визуально полезных приёмов — создание пользовательских форм (UserForm) для упрощённого ввода данных. В этой статье вы научитесь проектировать форму ввода данных студентов, привязывать её к таблице и внедрять базовую валидацию и обработку ошибок.
Важно: храните книгу с макросами как файл формата Excel Macro‑Enabled Workbook (*.xlsm).
Что мы создаём
Мы соберём форму, которая:
- собирает данные студента (личные данные, курс, оплату);
- валидирует числовые и датированные поля;
- записывает данные в связанный лист «Student Database»;
- обеспечивает кнопки «Сохранить», «Очистить», «Выход»;
- демонстрирует простую логику обновления данных о платеже.
Кому полезно: разработчикам Excel, администраторам учебных программ, конечным пользователям, которые хотят безопасно и последовательно собирать данные.
Подготовка книги и листов
- Создайте новую рабочую книгу Excel и сохраните её как Excel Macro‑Enabled Workbook (*.xlsm).
- Добавьте два листа и переименуйте их:
- Sheet1 → Home
- Sheet2 → Student Database

Совет: имена листов можно менять, но в коде нужно использовать те же имена либо параметризовать их в модуле конфигурации.
Добавление кнопки на лист Home
На листе Home добавьте кнопку (Developer → Insert → Button). Разместите её в удобном месте. Переименуйте кнопку через правый клик и назначьте ей макрос, который будет показывать форму.
Вставьте этот код в стандартный модуль или в обработчик кнопки на листе:
Sub Button1_Click()
UserForm.Show
End SubТеперь при нажатии кнопки форма будет открываться.
Создание UserForm в редакторе VBA
Откройте редактор VBA (Developer → Visual Basic или ALT+F11). Insert → UserForm. Появится пустая форма и панель инструментов.

Из тулбокса добавьте Frame (рамку) и расположите в ней элементы управления. Примеры элементов и их имена (важно использовать читаемые имена):
- txtApplicationNo — поле для Application Number
- txtStudentID — поле для Student ID
- txtName, txtAge, txtAddress, txtPhone, txtCity, txtCountry, txtDOB, txtZip, txtNationality
- optMale, optFemale — переключатели для пола
- txtCourse, txtCourseID, txtEnrollmentStart, txtEnrollmentEnd, txtCourseDuration, txtDept
- cmbPayment — комбобокс для «Payment Received» (Yes/No)
- cmbPaymentMode — комбобокс для способа оплаты (Cash/Card/Check)
- cmdSave, cmdClear, cmdExit — кнопки управления
Название свойств (Name) лучше задать осмысленное. Caption — текст, который увидит пользователь.

Важно: следите за тем, чтобы Name и Caption не смешивались в логике — Name используется в коде, Caption — для интерфейса.
Рекомендуемая структура колонок листа Student Database
Для простоты далее будем использовать такое соответствие столбцов (колонка → поле):
- A — Application Number
- B — Student ID
- C — Name
- D — Age
- E — Date of Birth
- F — Gender
- G — Address
- H — Phone
- I — City
- J — Country
- K — Zip Code
- L — Nationality
- M — Course Name
- N — Course ID
- O — Enrollment Start Date
- P — Enrollment End Date
- Q — Course Duration
- R — Department
- S — Payment Received
- T — Mode of Payment
Примечание: исходный пример кода в статье использует частично другие буквы колонок (например, повторно использует “g”). Это потенциальная ошибка. Приведённая выше таблица упрощает понимание и устраняет конфликт.
Код обработки: кнопка Сохранить (оригинал)
Ниже — исходный код, который был в примере. Сохраните его в обработчике кнопки «Save Details» (двойной клик по кнопке в дизайнере формы):
Private Sub CommandButton2_Click()
‘declare the variables used throughout the codes
Dim sht As Worksheet, sht1 As Worksheet, lastrow As Long
'Add validations to check if character values are being entered in numeric fields.
If VBA.IsNumeric(txtApplicationNo.Value) = False Then
MsgBox "Only numeric values are accepted in the Application Number", vbCritical
Exit Sub
End If
If VBA.IsNumeric(txtStudentID.Value) = False Then
MsgBox "Only numeric values are accepted in the Student ID", vbCritical
Exit Sub
End If
If VBA.IsNumeric(txtAge.Value) = False Then
MsgBox "Only numeric values are accepted in Age", vbCritical
Exit Sub
End If
If VBA.IsNumeric(txtPhone.Value) = False Then
MsgBox "Only numeric values are accepted in Phone Number", vbCritical
Exit Sub
End If
If VBA.IsNumeric(Me.txtCourseID.Value) = False Then
MsgBox "Only numeric values are accepted in Course ID", vbCritical
Exit Sub
End If
'link the text box fields with the underlying sheets to create a rolling database
Set sht = ThisWorkbook.Sheets("Student Database")
'calculate last populated row in both sheets
lastrow = sht.Range("a" & Rows.Count).End(xlUp).Row + 1
'paste the values of each textbox into their respective sheet cells
With sht
.Range("a" & lastrow).Value = txtApplicationNo.Value
.Range("b" & lastrow).Value = txtStudentID.Value
.Range("c" & lastrow).Value = txtName.Value
.Range("d" & lastrow).Value = txtAge.Value
.Range("e" & lastrow).Value = txtDOB.Value
.Range("g" & lastrow).Value = txtAddress.Value
.Range("h" & lastrow).Value = txtPhone.Value
.Range("i" & lastrow).Value = txtCity.Value
.Range("j" & lastrow).Value = txtCountry.Value
.Range("k" & lastrow).Value = txtZip.Value
.Range("l" & lastrow).Value = txtNationality.Value
.Range("m" & lastrow).Value = txtCourse.Value
.Range("n" & lastrow).Value = txtCourseID.Value
.Range("o" & lastrow).Value = txtenrollmentstart.Value
.Range("p" & lastrow).Value = txtenrollmentend.Value
.Range("q" & lastrow).Value = txtcourseduration.Value
.Range("r" & lastrow).Value = txtDept.Value
End With
sht.Activate
'determine gender as per user's input
If optMale.Value = True Then sht.Range("g" & lastrow).Value = "Male"
If optFemale.Value = True Then sht.Range("g" & lastrow).Value = "Female"
'Display a message box, in case the user selects the Yes radio button
If optYes.Value = True Then
MsgBox "Please select the payment details below"
Else:
Exit Sub
End If
End SubВажно: в оригинальном примере поле адреса и поле пола записываются в один и тот же столбец “G”. Это создаёт конфликт и перезапись данных. Ниже приведён улучшенный и безопасный вариант.
Улучшенный и более безопасный код для кнопки Сохранить
Рекомендации по надёжности кода:
- Включите Option Explicit и объявляйте все переменные.
- Привязывайте Rows.Count и Cells к конкретному листу (sht.Rows.Count), чтобы избежать ошибок, если код запускается с другого листа.
- Используйте Trim для удаления пробелов, IsNumeric и IsDate для валидации.
- Обрабатывайте исключения через обработчик ошибок.
Пример улучшенного кода:
Option Explicit
Private Sub cmdSave_Click()
On Error GoTo ErrHandler
Dim sht As Worksheet
Dim lastrow As Long
Set sht = ThisWorkbook.Sheets("Student Database")
' Валидация обязательных числовых полей
If Trim(txtApplicationNo.Value) = "" Or Not VBA.IsNumeric(Trim(txtApplicationNo.Value)) Then
MsgBox "Введите корректный Application Number (только цифры)", vbExclamation
Exit Sub
End If
If Trim(txtStudentID.Value) = "" Or Not VBA.IsNumeric(Trim(txtStudentID.Value)) Then
MsgBox "Введите корректный Student ID (только цифры)", vbExclamation
Exit Sub
End If
If Trim(txtAge.Value) <> "" And Not VBA.IsNumeric(Trim(txtAge.Value)) Then
MsgBox "Поле Age должно быть числом", vbExclamation
Exit Sub
End If
If Trim(txtPhone.Value) <> "" And Not VBA.IsNumeric(Trim(txtPhone.Value)) Then
MsgBox "Поле Phone должно содержать только цифры", vbExclamation
Exit Sub
End If
If Trim(txtCourseID.Value) <> "" And Not VBA.IsNumeric(Trim(txtCourseID.Value)) Then
MsgBox "Course ID должен быть числом", vbExclamation
Exit Sub
End If
If Trim(txtEnrollmentStart.Value) <> "" And Not IsDate(Trim(txtEnrollmentStart.Value)) Then
MsgBox "Некорректная дата Enrollment Start Date", vbExclamation
Exit Sub
End If
If Trim(txtEnrollmentEnd.Value) <> "" And Not IsDate(Trim(txtEnrollmentEnd.Value)) Then
MsgBox "Некорректная дата Enrollment End Date", vbExclamation
Exit Sub
End If
' Найти следующую пустую строку
lastrow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row + 1
' Записать значения в соответствии с рекомендуемой схемой колонок
With sht
.Cells(lastrow, "A").Value = Trim(txtApplicationNo.Value)
.Cells(lastrow, "B").Value = Trim(txtStudentID.Value)
.Cells(lastrow, "C").Value = Trim(txtName.Value)
.Cells(lastrow, "D").Value = Trim(txtAge.Value)
.Cells(lastrow, "E").Value = IIf(Trim(txtDOB.Value) <> "" And IsDate(Trim(txtDOB.Value)), CDate(Trim(txtDOB.Value)), "")
.Cells(lastrow, "F").Value = IIf(optMale.Value, "Male", IIf(optFemale.Value, "Female", ""))
.Cells(lastrow, "G").Value = Trim(txtAddress.Value)
.Cells(lastrow, "H").Value = Trim(txtPhone.Value)
.Cells(lastrow, "I").Value = Trim(txtCity.Value)
.Cells(lastrow, "J").Value = Trim(txtCountry.Value)
.Cells(lastrow, "K").Value = Trim(txtZip.Value)
.Cells(lastrow, "L").Value = Trim(txtNationality.Value)
.Cells(lastrow, "M").Value = Trim(txtCourse.Value)
.Cells(lastrow, "N").Value = Trim(txtCourseID.Value)
.Cells(lastrow, "O").Value = IIf(Trim(txtEnrollmentStart.Value) <> "" And IsDate(Trim(txtEnrollmentStart.Value)), CDate(Trim(txtEnrollmentStart.Value)), "")
.Cells(lastrow, "P").Value = IIf(Trim(txtEnrollmentEnd.Value) <> "" And IsDate(Trim(txtEnrollmentEnd.Value)), CDate(Trim(txtEnrollmentEnd.Value)), "")
.Cells(lastrow, "Q").Value = Trim(txtCourseDuration.Value)
.Cells(lastrow, "R").Value = Trim(txtDept.Value)
.Cells(lastrow, "S").Value = Trim(cmbPayment.Value)
.Cells(lastrow, "T").Value = Trim(cmbPaymentMode.Value)
End With
MsgBox "Данные успешно сохранены", vbInformation
Exit Sub
ErrHandler:
MsgBox "Ошибка: " & Err.Number & " - " & Err.Description, vbCritical
End SubПояснения:
- Cells(row, “A”) читаемее и защищает от конфликтов с буквенными адресами.
- Обработка ошибок упрощает поиск проблем при исполнении.
- Даты хранятся в виде даты, если введены корректно.
Код очистки формы и выхода (оригинал и улучшение)
Оригинал очистки формы (в исходнике есть опечатки с двойной точкой):
With Me
.txtApplicationNo.Value = ""
.txtStudentID.Value = ""
..txtName.Value = ""
.txtAge.Value = ""
.txtAddress.Value = ""
.txtPhone.Value = ""
.txtCity.Value = ""
.txtCountry.Value = ""
.txtDOB.Value = ""
.txtZip.Value = ""
.txtNationality.Value = ""
.txtCourse.Value = ""
.txtCourseID.Value = ""
.txtenrollmentstart.Value = ""
.txtenrollmentend.Value = ""
.txtcourseduration.Value = ""
.txtDept.Value = ""
.cmbPaymentMode.Value = ""
.cmbPayment.Value = ""
.optFemale.Value = False
.optMale.Value = False
.optYes.Value = False
.optNo.Value = False
End WithУлучшенный код очистки (нажмите cmdClear):
Private Sub cmdClear_Click()
With Me
txtApplicationNo.Value = ""
txtStudentID.Value = ""
txtName.Value = ""
txtAge.Value = ""
txtAddress.Value = ""
txtPhone.Value = ""
txtCity.Value = ""
txtCountry.Value = ""
txtDOB.Value = ""
txtZip.Value = ""
txtNationality.Value = ""
txtCourse.Value = ""
txtCourseID.Value = ""
txtEnrollmentStart.Value = ""
txtEnrollmentEnd.Value = ""
txtCourseDuration.Value = ""
txtDept.Value = ""
cmbPaymentMode.Value = ""
cmbPayment.Value = ""
optFemale.Value = False
optMale.Value = False
optYes.Value = False
optNo.Value = False
End With
End SubКнопка выхода просто выгружает форму:
Private Sub cmdExit_Click()
Unload Me
End SubЗаполнение комбобоксов при активации формы
В событии UserForm_Activate добавьте элементы для комбобоксов:
Private Sub UserForm_Activate()
With cmbPayment
.Clear
.AddItem ""
.AddItem "Yes"
.AddItem "No"
End With
With cmbPaymentMode
.Clear
.AddItem ""
.AddItem "Cash"
.AddItem "Card"
.AddItem "Check"
End With
End SubСовет: можно заполнять значения из листа конфигурации, если нужно удобно редактировать варианты оплаты без изменения кода.
Объяснение ключевых частей кода
- Проверки IsNumeric/IsDate — предотвращают логические ошибки при записи.
- lastrow = sht.Cells(sht.Rows.Count, “A”).End(xlUp).Row + 1 — находит следующую пустую строку в столбце A.
- With sht / .Cells(…) — надёжный метод записи в конкретный лист.
- Trim — удаляет лишние пробелы, что уменьшает риск некорректного парсинга.
Важно: всегда тестируйте код на копии книги, чтобы не потерять данные.
Контрольные тесты и критерии приёмки
Критерии приёмки (что проверить перед запуском в продакшн):
- Форма корректно открывается и закрывается.
- Валидация чисел не позволяет ввести буквы в числовые поля.
- Корректные даты сохраняются как даты в листе.
- Пол сохраняется в отдельную колонку, не перезаписывая адреса.
- Комбобоксы содержат ожидаемые варианты.
- При обработке ошибок приложение не «падает», выводит понятное сообщение.
Тестовые сценарии (минимум):
- Ввести валидные данные, нажать Сохранить — данные появились в новой строке.
- Ввести буквы в поле Age — ожидать предупреждение и отсутствие записи.
- Оставить необязательные поля пустыми — запись создаётся с пустыми ячейками.
- Ввести дату в неверном формате — ожидать предупреждение.
Чек‑лист для развёртывания (ролевая разбивка)
Для разработчика:
- Включён Option Explicit во всех модулях
- Все элементы формы имеют осмысленные имена
- Колонки листа соответствуют схеме
- Добавлена обработка ошибок
Для администратора/конечного пользователя:
- Книга сохранена как *.xlsm
- В Trust Center разрешены макросы (или книга подписана)
- Создан бэкап данных перед запуском
Мини‑методология: от идеи до рабочей формы (коротко)
- Спроектируйте поля и таблицу назначения. 2. Создайте форму и назовите элементы. 3. Напишите код валидации и записи. 4. Тестируйте на копии. 5. Разверните и обучите пользователей.
Когда предложенный подход не подходит
- Когда требуется централизованная база данных с одновременным доступом множества пользователей — лучше использовать SQL/Access или облачную БД.
- Когда нужно сложное аудирование и история изменений — Excel ограничен.
- При работе с чувствительными персональными данными в корпоративной среде — рассмотрите защищённые хранилища и шифрование.
Безопасность и соответствие (GDPR и приватность)
Если вы храните персональные данные студентов, учтите:
- Храните минимум необходимой информации.
- Убедитесь, что доступ к файлу ограничен по учётным записям.
- Для персональных данных используйте шифрование файлов или хранилище с контролем доступа.
- При передаче данных за пределы организации получите согласие или обезличьте данные.
Важно: эти рекомендации носят общий характер. Обратитесь к специалисту по комплаенсу для формирования политики хранения данных.
Технические советы и совместимость
- Работает в настольных версиях Excel, поддерживающих VBA (Windows Excel — полная совместимость). На macOS функционал VBA есть, но поведение ActiveX и некоторые элементы управления может отличаться.
- Подписывайте макросы цифровым сертификатом для безопасного распространения в организации.
Шаблон: таблица соответствия полей (можно скопировать в Excel)
Поле Имя элемента формы Колонка Application Number txtApplicationNo A Student ID txtStudentID B Name txtName C Age txtAge D Date of Birth txtDOB E Gender optMale/optFemale F Address txtAddress G Phone txtPhone H City txtCity I Country txtCountry J Zip Code txtZip K Nationality txtNationality L Course Name txtCourse M Course ID txtCourseID N Enrollment Start txtEnrollmentStart O Enrollment End txtEnrollmentEnd P Course Duration txtCourseDuration Q Department txtDept R Payment Received cmbPayment S Mode of Payment cmbPaymentMode T
Decision flow: валидация перед сохранением
flowchart TD
Start'[Начало]' --> ValidateNums{Проверить числовые поля}
ValidateNums -- Неверно --> ShowNumError[Показать ошибку и остановить]
ValidateNums -- ОК --> ValidateDates{Проверить даты}
ValidateDates -- Неверно --> ShowDateError[Показать ошибку и остановить]
ValidateDates -- ОК --> ConfirmPayment{Выбрана опция оплаты Yes?}
ConfirmPayment -- Yes --> EnsurePaymentDetails[Убедиться, что выбрана оплата и способ]
EnsurePaymentDetails -- ОК --> Save[Сохранить в лист]
ConfirmPayment -- No --> Save
Save --> End'[Готово]'
ShowNumError --> End
ShowDateError --> EndШаблон тест‑кейсов (кратко)
- TC01 — Сохранение валидной записи: все поля корректны → PASS если строка добавлена.
- TC02 — Некорректный Student ID (буквы) → PASS если сообщение об ошибке и запись не создана.
- TC03 — Некорректная дата → PASS если сообщение об ошибке.
- TC04 — Опция Payment = Yes, но Mode пустой → PASS если форма просит заполнить способ оплаты.
- TC05 — Очистка формы → PASS если все поля пусты.
Рекомендации по дальнейшему развитию
- Добавьте возможность редактирования существующей записи: найдите по Student ID и перезапишите строку.
- Логгируйте изменения: добавляйте колонку с датой/пользователем, который внёс запись.
- Экспортируйте данные в CSV для интеграции с внешними системами.

Итог
Формы VBA в Excel — простой и быстрый способ стандартизировать ввод данных и снизить количество ошибок при ручном вводе. Следуя рекомендациям по валидации, обработке ошибок и правильной привязке столбцов, вы получите надёжную систему для учёта студентов.
Ключевые действия: проектирование полей, осмысленные имена элементов, надёжная валидация, тестирование и защита данных.
Примечание: перед развёртыванием протестируйте на копии книги и настройте резервное копирование данных.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента