UserForm в Excel помогает создать простое окно ввода данных: имя, телефон, email, сумма, комментарий. Разбираем, как сделать форму на VBA, добавить кнопку сохранения и записывать данные в следующую свободную строку таблицы.
UserForm в Excel — собственное окно ввода данных за 20 строк кода
Есть таблицы, которые ломаются не от формул. Они ломаются от рук.
Человек должен добавить новую заявку. Открывает Excel, ищет последнюю строку, случайно попадает не туда, вставляет данные со сдвигом, забывает дату, оставляет пустой телефон, пишет сумму в колонку комментария, а потом говорит старую офисную молитву: «Я ничего не трогал».
Знакомо? Конечно знакомо. Excel сам по себе не виноват. Просто обычная таблица плохо защищена от обычного человеческого ввода.
Для таких задач в Excel есть UserForm — пользовательская форма. Это отдельное окно, где человек вводит данные в понятные поля: имя, телефон, email, сумма, комментарий. Нажимает кнопку Сохранить, и макрос сам добавляет запись в следующую свободную строку таблицы.
Не надо искать конец списка. Не надо думать, в какой столбец писать телефон. Не надо случайно стереть формулу. Не надо прокручивать таблицу на тысячу строк вниз.
Форма превращает Excel из «простыни с ячейками» в маленькую программу. Без отдельного сайта, без базы данных, без сложной разработки. Да, выглядит скромно. Но для офисной рутины иногда этого хватает с головой.
Что такое UserForm по-человечески
UserForm — это окно ввода, которое создаётся в редакторе VBA. В нём можно разместить текстовые поля, подписи, кнопки, выпадающие списки, переключатели, флажки, поля даты и сообщения об ошибках.
Самый простой вариант выглядит так: поля «Имя», «Телефон», «Email», «Сумма», «Комментарий» и кнопка «Сохранить». Пользователь заполняет форму, макрос переносит данные в таблицу.
Это особенно полезно, если файлом пользуются люди, которые не должны лезть в структуру таблицы. Им нужно не «работать с диапазоном A:F», а просто добавить заявку, клиента, заказ, оплату или задачу. Форма не делает Excel неуязвимым. Но она резко снижает количество случайных ошибок.
Где UserForm реально полезна
UserForm не нужна в каждой книге. Если вы один раз в месяц вводите три строки, форма будет избыточна. Но если данные добавляются регулярно, форма быстро окупается.
Практичные сценарии: журнал заявок (имя клиента, телефон, тема обращения, статус, ответственный), учёт оплат (дата, клиент, сумма, способ оплаты, комментарий), база клиентов (имя, компания, email, телефон, источник), складской учёт (артикул, товар, количество, операция, сотрудник), задачи отдела (задача, срок, приоритет, исполнитель, статус), регистрация участников (ФИО, email, телефон, мероприятие, примечание) или мини-CRM в Excel (клиент, контакт, стадия, дата следующего контакта). Если в таблице есть повторяющийся ручной ввод, UserForm может стать хорошим входом в данные.
Почему форма лучше ручного ввода в таблицу
Обычная таблица даёт слишком много свободы. А свобода в рабочем Excel часто заканчивается строкой «почему отчёт не сходится». Форма помогает ограничить хаос.
Пользователь видит только нужные поля — не всю таблицу, не скрытые формулы, не служебные столбцы. Данные попадают в правильные столбцы: телефон в телефон, email в email, сумма в сумму, без ручного прицеливания. Можно добавить проверки — например, не сохранять запись без имени или суммы. Можно автоматически ставить дату, чтобы пользователь её не забыл. Можно записывать в следующую свободную строку, и макрос сам найдёт конец таблицы. Можно защитить лист от случайного редактирования: пользователь работает через форму, а таблица остаётся аккуратной.
В старой школе офисной автоматизации это нормальный подход: не доверяй человеку то, что машина может сделать одинаково. Человек пусть думает, а не целится мышкой в строку 1248.
Что мы сделаем в этой статье
Создадим простую форму для добавления заявок в Excel. В таблице будут столбцы Дата, Имя, Телефон, Email, Сумма, Комментарий. В форме будут поля «Имя», «Телефон», «Email», «Сумма», «Комментарий», а дата будет ставиться автоматически.
Кнопка Сохранить добавит данные в следующую свободную строку. Кнопка Закрыть закроет форму. Это базовый, но очень рабочий пример. Его можно потом адаптировать под клиентов, оплаты, заявки, склад или задачи.
Подготовьте таблицу
Сначала создайте обычный лист Excel и назовите его Заявки. В первой строке сделайте заголовки:
ABCDEFДатаИмяТелефонEmailСуммаКомментарий
Сохраните файл как книгу с поддержкой макросов: Файл → Сохранить как → Книга Excel с поддержкой макросов (*.xlsm). Это важно. В обычном .xlsx форма и макросы не сохранятся. Excel в этом смысле строгий: хочешь VBA — сохраняй правильно.
Как открыть редактор VBA
Нажмите Alt + F11 — откроется редактор Visual Basic for Applications. Если вкладки «Разработчик» нет в Excel, это не страшно: через Alt + F11 редактор всё равно открывается. Но вкладку можно включить:
Файл → Параметры → Настроить ленту
Поставьте галочку «Разработчик»
ОК
Теперь создадим форму.
Как создать UserForm
В редакторе VBA:
Insert → UserForm (или Вставка → UserForm)
Появится пустое серое окно — это и есть будущая форма. В свойствах формы задайте имя frmRequest, а заголовок формы (свойство Caption) сделайте «Новая заявка». Теперь на форму нужно добавить элементы.
Какие элементы добавить на форму
На панели инструментов выберите элементы и разместите их на форме. Нам нужны подписи (Label), поля ввода (TextBox) и кнопки (CommandButton).
Добавьте 5 подписей: «Имя», «Телефон», «Email», «Сумма», «Комментарий». Рядом с ними добавьте 5 текстовых полей и задайте им имена txtName, txtPhone, txtEmail, txtAmount, txtComment. Добавьте две кнопки: cmdSave с надписью «Сохранить» и cmdClose с надписью «Закрыть».
Имена элементов важны. Код будет обращаться именно к ним. Если поле называется не txtName, а TextBox1, код из статьи придётся менять. Поэтому лучше сразу дать нормальные имена.
Код кнопки «Сохранить»
Дважды щёлкните по кнопке Сохранить. Откроется окно кода. Вставьте туда:
Private Sub cmdSave_Click()
Dim ws As Worksheet
Dim nextRow As Long
Set ws = ThisWorkbook.Worksheets("Заявки")
If Trim(Me.txtName.Value) = "" Then
MsgBox "Введите имя.", vbExclamation
Me.txtName.SetFocus
Exit Sub
End If
If Trim(Me.txtAmount.Value) = "" Then
MsgBox "Введите сумму.", vbExclamation
Me.txtAmount.SetFocus
Exit Sub
End If
If Not IsNumeric(Me.txtAmount.Value) Then
MsgBox "Сумма должна быть числом.", vbExclamation
Me.txtAmount.SetFocus
Exit Sub
End If
nextRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
ws.Cells(nextRow, "A").Value = Date
ws.Cells(nextRow, "B").Value = Trim(Me.txtName.Value)
ws.Cells(nextRow, "C").Value = Trim(Me.txtPhone.Value)
ws.Cells(nextRow, "D").Value = Trim(Me.txtEmail.Value)
ws.Cells(nextRow, "E").Value = CDbl(Me.txtAmount.Value)
ws.Cells(nextRow, "F").Value = Trim(Me.txtComment.Value)
Me.txtName.Value = ""
Me.txtPhone.Value = ""
Me.txtEmail.Value = ""
Me.txtAmount.Value = ""
Me.txtComment.Value = ""
Me.txtName.SetFocus
MsgBox "Заявка добавлена в строку " & nextRow & ".", vbInformation
End Sub
Да, формально здесь больше 20 строк, потому что добавлены проверки, очистка полей и сообщение. Если убрать проверки, можно сделать короче. Но для реальной работы лучше не гнаться за спортивной краткостью. Код должен не только работать, но и защищать от типичных ошибок.
Что делает этот код
Разберём по частям. Сначала код выбирает лист:
Set ws = ThisWorkbook.Worksheets("Заявки")
Это значит: данные будут записываться на лист Заявки. Если лист называется иначе, код выдаст ошибку, поэтому имя листа должно совпадать. Дальше идут проверки:
If Trim(Me.txtName.Value) = "" Then
Эта строка проверяет, заполнено ли имя. Trim убирает лишние пробелы по краям: если человек ввёл просто пробелы, это не считается нормальным именем. Потом проверяется сумма:
If Not IsNumeric(Me.txtAmount.Value) Then
Если сумма не число, форма не сохраняет запись. Это полезно — иначе в столбец суммы легко попадёт текст вроде «примерно 5000» или «потом уточнить». Дальше код ищет следующую свободную строку:
nextRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
Это уже знакомый приём: Excel идёт в конец столбца A, поднимается до последней заполненной строки и прибавляет 1. Так мы получаем строку для новой записи. Потом данные записываются в столбцы:
ws.Cells(nextRow, "A").Value = Date
ws.Cells(nextRow, "B").Value = Trim(Me.txtName.Value)
ws.Cells(nextRow, "C").Value = Trim(Me.txtPhone.Value)
И так дальше. После сохранения форма очищает поля, чтобы можно было сразу ввести следующую заявку.
Код кнопки «Закрыть»
Теперь дважды щёлкните по кнопке Закрыть и вставьте код:
Private Sub cmdClose_Click()
Unload Me
End Sub
Эта строка закрывает форму. Просто и красиво. Иногда в VBA тоже бывает без драмы.
Как открыть форму из Excel
Форма создана, но её нужно как-то запускать. Для этого создадим обычный макрос в модуле. В редакторе VBA:
Insert → Module (или Вставка → Модуль)
Вставьте код:
Sub ShowRequestForm()
frmRequest.Show
End Sub
Теперь вернитесь в Excel, нажмите Alt + F8, выберите макрос ShowRequestForm и нажмите Выполнить. Откроется форма «Новая заявка».
Как сделать кнопку на листе
Чтобы не запускать форму через Alt + F8, удобнее сделать кнопку прямо на листе.
Разработчик → Вставить
Кнопка (элемент управления формы)
Нарисуйте кнопку на листе
Выберите макрос ShowRequestForm
Нажмите ОК и назовите кнопку «Добавить заявку»
Теперь пользователь просто нажимает кнопку и заполняет форму. Никакого редактора VBA, никаких списков макросов. Хорошая автоматизация начинается там, где человек видит понятную кнопку, а не «Module1.ShowRequestForm».
Кстати, чтобы не собирать всю форму с нуля, в конце я положу в Telegram готовый файл: лист «Заявки», кнопка «Добавить заявку», готовая форма ввода и код с комментариями. Открываете, смотрите, как всё связано, и адаптируете под свои заявки, клиентов или оплаты.
Как проверить, что всё работает
Сделайте тест. Откройте форму, введите имя, телефон, email, сумму, комментарий и нажмите Сохранить. Проверьте лист Заявки — данные должны появиться в следующей свободной строке. Потом добавьте ещё одну запись: она должна появиться ниже первой, а не поверх неё.
Проверьте ошибки: оставьте имя пустым, оставьте сумму пустой, введите в сумму текст и нажмите сохранить. Форма должна остановить сохранение и показать сообщение. Если всё так и работает, базовая форма готова.
Частая ошибка 1. Неправильные имена полей
Самая частая проблема новичка: в коде написано txtName, а на форме поле называется TextBox1. VBA не угадывает. Если имя элемента другое, будет ошибка.
Проверьте свойство Name каждого поля: txtName, txtPhone, txtEmail, txtAmount, txtComment, а у кнопок — cmdSave и cmdClose. Caption — это текст, который видит пользователь. Name — это имя, которое использует код. Их нельзя путать: на кнопке можно написать «Сохранить», но имя кнопки в коде должно быть cmdSave.
Частая ошибка 2. Лист называется не так
В коде есть строка:
Set ws = ThisWorkbook.Worksheets("Заявки")
Если лист называется Заявка, Лист1, Заявки 2026 или Requests, код не найдёт лист. Решение простое: или переименуйте лист в Заявки, или измените имя в коде, например:
Set ws = ThisWorkbook.Worksheets("Лист1")
Но лучше давать листам понятные имена. Через месяц вы сами скажете себе спасибо.
Частая ошибка 3. Файл сохранён как .xlsx
Если вы создали форму, написали код, закрыли файл, а потом всё исчезло — почти наверняка файл был сохранён как .xlsx. Макросы и формы нужно сохранять в формате .xlsm. Проверяйте это сразу. Не после часа работы.
Частая ошибка 4. Макросы отключены
Когда вы открываете файл с макросами, Excel может показывать предупреждение безопасности. Если макросы отключены, форма не откроется. Включать макросы можно только в файлах, которым вы доверяете. Свой файл — да. Чужой файл из неизвестного письма — нет.
Это важная граница. VBA умеет делать много полезного, но чужие макросы могут быть опасны. Не надо открывать файл «Срочный акт.xlsm» из мутного письма и радостно нажимать «Включить содержимое».
Частая ошибка 5. Сумма с запятой не распознаётся
В русской версии Excel десятичный разделитель обычно запятая. Но VBA иногда может вести себя капризно с преобразованием текста в число, особенно если настройки системы отличаются. В нашем примере используется:
CDbl(Me.txtAmount.Value)
Если у вас возникают ошибки с десятичными значениями, можно временно вводить целые суммы или доработать код под замену точки на запятую:
ws.Cells(nextRow, "E").Value = CDbl(Replace(Me.txtAmount.Value, ".", ","))
Но тут всё зависит от региональных настроек. Для обычных целых сумм проблем обычно нет.
Как добавить выпадающий список статусов
Форма станет полезнее, если добавить статус заявки — например, «Новая», «В работе», «Готово», «Отменена». Для этого на форму можно добавить ComboBox и назвать его cmbStatus. В код инициализации формы добавьте:
Private Sub UserForm_Initialize()
Me.cmbStatus.Clear
Me.cmbStatus.AddItem "Новая"
Me.cmbStatus.AddItem "В работе"
Me.cmbStatus.AddItem "Готово"
Me.cmbStatus.AddItem "Отменена"
Me.cmbStatus.Value = "Новая"
End Sub
На листе добавьте столбец G Статус, а в код сохранения добавьте:
ws.Cells(nextRow, "G").Value = Me.cmbStatus.Value
Это уже делает форму ближе к настоящему рабочему журналу. Пользователь не пишет статус руками, а выбирает из списка. Меньше опечаток, меньше вариантов «готово», «Готово», «ГОТОВО», «сделано», «закрыто», «выполнено». Excel любит единообразие, и выпадающий список — хороший способ его добиться.
Как добавить автоматический номер заявки
Можно сделать так, чтобы каждая заявка получала номер. Добавьте в таблицу столбец A Номер, а остальные столбцы сдвиньте вправо: A — Номер, B — Дата, C — Имя, D — Телефон, E — Email, F — Сумма, G — Комментарий. Тогда код можно доработать:
ws.Cells(nextRow, "A").Value = nextRow - 1
ws.Cells(nextRow, "B").Value = Date
ws.Cells(nextRow, "C").Value = Trim(Me.txtName.Value)
ws.Cells(nextRow, "D").Value = Trim(Me.txtPhone.Value)
ws.Cells(nextRow, "E").Value = Trim(Me.txtEmail.Value)
ws.Cells(nextRow, "F").Value = CDbl(Me.txtAmount.Value)
ws.Cells(nextRow, "G").Value = Trim(Me.txtComment.Value)
Здесь номер заявки равен номеру строки минус 1, если заголовки стоят в первой строке. Для простого журнала этого достаточно. Для серьёзных систем лучше делать более устойчивую нумерацию, чтобы номер не менялся при удалении строк. Но для старта этот вариант понятный.
Как защитить лист, но оставить форму рабочей
Идея хорошая: пользователь не редактирует таблицу руками, а работает через форму. Можно защитить лист через Рецензирование → Защитить лист. Но если лист защищён, макрос может не записать данные. Тогда нужно либо разрешить макросу снимать защиту на время записи, либо настроить защиту аккуратно. Простой вариант в коде:
ws.Unprotect Password:="1234"
' запись данных
ws.Protect Password:="1234"
Пароль 1234 — только для примера. В реальной работе не используйте слабые пароли. И помните: защита листа в Excel — это защита от случайного редактирования, а не банковский сейф. Её задача — чтобы человек случайно не снёс формулу, а не остановить профессионального злоумышленника.
Как сделать форму удобнее для людей
Технически форма может работать. Но если она неудобная, люди будут её ненавидеть и всё равно лезть в таблицу. Сделайте просто: поля идут сверху вниз в логичном порядке, обязательные поля понятны, кнопка «Сохранить» заметная, кнопка «Закрыть» отдельно, сообщения об ошибках человеческие, после сохранения поля очищаются, курсор возвращается в первое поле, заголовок формы понятный.
Плохое сообщение: Ошибка 13. Type mismatch. Хорошее сообщение: Сумма должна быть числом. Пользователь не обязан понимать внутреннюю кухню VBA. Если макрос ругается языком программиста, он плохо обслуживает обычного человека.
Мини-чек-лист перед использованием формы
Перед тем как дать файл другим, проверьте:
1. Файл сохранён как .xlsm.
2. Лист называется так же, как в коде.
3. Все поля формы имеют правильные имена.
4. Кнопка «Сохранить» записывает данные в нужные столбцы.
5. Кнопка «Закрыть» закрывает форму.
6. Пустое имя не сохраняется.
7. Пустая сумма не сохраняется.
8. Текст вместо суммы не сохраняется.
9. Новая запись добавляется вниз, а не поверх старой.
10. Есть кнопка запуска формы на листе.
11. Пользователь не должен открывать редактор VBA.
12. Есть резервная копия файла.
Последний пункт скучный, но священный. Сначала копия, потом эксперименты. Старый Excel-закон, написанный слезами людей, которые «просто чуть-чуть поправили».
Что можно улучшить дальше
Базовую форму можно развивать: добавить выпадающий список статусов, выбор ответственного, календарь или поле даты, проверку email и телефона, поиск заявки по номеру, редактирование и удаление записи, фильтр по статусу, сохранение истории изменений, отправку письма из Excel. Но не надо делать всё сразу. Сначала форма должна уверенно решать одну задачу: добавить новую запись без ручного ввода в таблицу. Когда это работает, улучшения добавляются спокойно.
Главное
UserForm — это простой способ сделать из Excel маленькое рабочее приложение. Не для красоты, а для порядка. Вместо того чтобы пускать людей прямо в таблицу, вы даёте им понятное окно: заполнить поля, нажать кнопку, получить запись в нужной строке. Это снижает ошибки, ускоряет ввод и делает файл более управляемым.
Да, это уже VBA. Да, сначала непривычно. Но если вы уже запускали первые макросы, искали последнюю строку и собирали отчёты из листов, UserForm — следующий логичный шаг. Не страшный, а практичный.
В Telegram я подготовлю файл-шаблон с готовой формой: лист «Заявки», кнопка «Добавить заявку», форма ввода и код с комментариями. Можно будет открыть, посмотреть и адаптировать под свои заявки, клиентов или оплаты.
Напишите в комментариях, для чего вам полезнее форма в Excel: заявки, клиенты, оплаты, задачи, склад или регистрация участников?
Макрос решает — Excel, Word, PowerPoint и VBA без лишних слов.