Программирование и ИИ
UserForm в VBA: как сделать окно ввода заявок и перебрать строки циклом
UserForm в VBA — это окно с полями и кнопками для тех, кто хочет, чтобы коллеги вводили данные в форму, а не прямо в ячейки. Форму вставляют в редакторе, заполняют в событии Initialize и показывают методом Show. По справке Microsoft форма по умолчанию модальная: код после Show ждёт, пока её не скроют или не выгрузят[1]. Ниже — форма, циклы For и For Each, массивы и ограничения.
Реестр броней ведут пять человек, и каждый пишет по-своему: где-то сумма с пробелами, где-то фамилия в столбце даты. Справка Microsoft описывает UserForm как окно или диалог, который становится частью интерфейса приложения[2]. Что умеет форма: принять ввод, показать варианты из списка и проверить поле до записи. В таком окне поля стоят по порядку, а запись на лист делает код: UserForm в VBA превращает разнобой в одинаковые строки реестра.
Путь здесь такой. Сначала поймите задачу — нужен ли ввод через окно или перебор уже готовых строк. Затем выберите инструмент: форма для ввода, цикл для обхода, массив для быстрой обработки. Освойте основы — Insert → UserForm, Show, For и ReDim, — попробуйте собрать процедуру в тренажёре и примените её к своей книге. Главная ловушка — модальное окно: пока оно открыто, лист недоступен, а код стоит.
Ключевые факты: UserForm в VBA
- UserForm — объект-окно или диалог, который становится частью интерфейса приложения[2].
- Режим показа формы задают константами vbModal со значением 1 и vbModeless со значением 0[1].
- ReDim Preserve меняет размер только последнего измерения массива[3].
- For отличается от For Each тем, что повторяет блок заданное число раз по счётчику[4].
- Справка Microsoft советует задавать начальные значения элементов в событии Initialize, чтобы код жил вместе с формой[5].
Что такое UserForm в VBA и как создать форму ввода
UserForm в VBA — окно с полями и кнопками, которое пишет ввод на лист. Новую форму создаёт команда Insert → UserForm редактора Visual Basic[6], а заголовок окна задают свойством Caption[2].
| Элемент | Префикс имени | Что делает |
|---|---|---|
| поле ввода (TextBox) | txt | принимает текст, свойство Text |
| список (ListBox) | lst | показывает варианты, метод AddItem |
| кнопка (CommandButton) | cmd | запускает процедуру _Click |
| форма целиком | UserForm1 | открывается методом Show |
Префиксы — договорённость, а не требование языка, но справка Microsoft пользуется именно ими: lstRegions, txtSalesPersonID[5]. Все элементы формы доступны через коллекцию Controls: справка показывает, как скрыть их одним циклом For Each Control In UserForm1.Controls[2].
Редактор Visual Basic, где рисуют формы, описан в справке для Excel 2016, Excel 2019, Excel 2021, Excel 2024 и Microsoft 365[7]. Окно показывают из обычного модуля одной строкой UserForm1.Show, а убирают методом Hide — так в примере справки к методу Show[1]. Если форма не загружена, Visual Basic загрузит её сам при вызове Show[1].
Разобравшись с устройством окна, переходим к коду: как заполнить список и записать ввод на лист.
Как заполнить форму и записать данные на лист: Initialize и кнопка
Форму заполняют в событии Initialize, а показывают методом Show с нужным режимом[5]. Плюс события Initialize справка называет прямо: код инициализации хранится вместе с формой и переезжает с ней в другой проект[5].
Private Sub UserForm_Initialize()
UserForm1.lstCity.AddItem "Москва"
UserForm1.lstCity.AddItem "Казань"
UserForm1.txtName.Text = ""
End Sub
Private Sub cmdSave_Click()
Worksheets("Брони").Range("B2").Value = UserForm1.txtName.Text
UserForm1.Hide
End Sub
- Вставьте форму, положите на неё поле txtName, список lstCity и кнопку cmdSave.
- В окне кода формы впишите процедуры UserForm_Initialize и cmdSave_Click.
- В модуле создайте процедуру с одной строкой UserForm1.Show и запустите её.
Аргумент modal принимает vbModal со значением 1 — режим по умолчанию — или vbModeless со значением 0[1]. Модальная форма отличается от немодальной тем, что не даёт работать с остальным приложением и останавливает код до закрытия окна[1]. Чтобы лист оставался доступен, вызывайте UserForm1.Show vbModeless. Немодальный UserForm в VBA удобен для справочника, который держат открытым рядом с таблицей.
Соберите форму и цикл в тренажёре: урок спросит, как открыть окно немодальным, и проверит, что попадёт на лист.
Однако форма закрывает только ввод: обработка готовых строк устроена иначе и требует циклов.
Циклы и массивы: чем For отличается от For Each и зачем ReDim Preserve
Цикл For в коде формы считает повторы счётчиком, а For Each обходит элементы коллекции. Оба цикла рядом с UserForm встречаются постоянно: форма собирает ввод, цикл проверяет строки реестра.
For j = 2 To 10 Step 2
total = total + j
Next j
| Конструкция | Когда брать | Что учесть |
|---|---|---|
| For … Next | известно число повторов | Step меняет шаг, отрицательный — обратный счёт |
| For Each … Next | обойти ячейки или элементы формы | массив пользовательских типов не подойдёт |
| Exit For | нашли нужное — выйти раньше | управление переходит за Next |
| ReDim Preserve | массив должен вырасти | меняется только последнее измерение |
Отрицательный шаг Step требует конечного значения меньше начального[4]. Если массив состоит из пользовательских типов, For Each его не переберёт[8] — нужен For с индексом.
Массив с изменяемым размером объявляют пустыми скобками, а размер задают ReDim. ReDim без Preserve стирает элементы массива[3], а с Preserve можно менять только верхнюю границу последнего измерения[3].
Для скорости справка о свойстве Value подсказывает приём: присвоение двумерного массива свойству Value записывает значения в диапазон одной операцией[9].
Остаётся понять, когда форма и циклы — лишняя сложность.
Когда UserForm и массивы не подойдут
UserForm не подойдёт, если книгу открывают в браузере или хватает проверки данных на листе. Окно и код VBA работают только в настольном Excel, а простой выбор из списка решается без программирования.
- Если книгу открывают в Excel в Интернете или на iPhone, макросы VBA, а с ними и формы, не запустятся[10].
- Когда нужно лишь ограничить ввод вариантами, хватит выпадающего списка в ячейке через проверку данных.
- Если массив должен расти по первому измерению, ReDim Preserve не поможет[3] — храните строки во втором измерении или пересоберите массив.
- При диапазоне меньше назначения запись массива оставит в лишних ячейках значения ошибки[9].
Коротко: UserForm не подойдёт, если книгу открывают в Excel в Интернете или на iPhone, если хватит проверки данных на листе или встроенного окна сообщения. Для Mac справка о различиях отмечает поддержку VBA[10], но форму всё равно проверьте на Mac перед раздачей. Справка Google описывает макросы Google Таблиц как Apps Script[11], о VBA и формах UserForm в ней речи нет.
Соседние темы собраны среди всех уроков тренажёра по коду и ИИ, а запись простых действий без программирования — на странице о записи макросов.
Частые вопросы
Как открыть UserForm кнопкой на листе?
UserForm открывают процедурой из обычного модуля со строкой UserForm1.Show[1]. Эту процедуру назначают фигуре или кнопке на листе, и окно появится по щелчку.
Как сделать, чтобы можно было работать с листом при открытой форме?
Чтобы работать с листом при открытой форме: 1) вызывайте окно как UserForm1.Show vbModeless; 2) учтите, что код после такого вызова продолжит выполняться[1]. Без аргумента форма модальная.
Почему ReDim стирает данные массива?
ReDim без Preserve стирает элементы массива — так описано в справке[3]. Чтобы сохранить данные, пишите ReDim Preserve и меняйте только верхнюю границу последнего измерения.
Что такое For Each в VBA?
For Each — это цикл, который обходит каждый элемент коллекции или массива без счётчика[8]. Им удобно перебрать ячейки диапазона или элементы формы UserForm в VBA.
Работают ли формы UserForm на Mac?
Формы работают там же, где VBA: справка о различиях называет Excel для Windows и Excel для Mac, но не Excel в Интернете[10]. Отдельной оговорки о формах на Mac в ней нет, поэтому проверьте окно на Mac до раздачи.
Источники
- [1] Microsoft, справка «Show method (Visual Basic for Applications)» (английская версия), 2026
- [2] Microsoft, справка «UserForm object» (английская версия), 2026
- [3] Microsoft, справка «ReDim statement (VBA)» (английская версия), 2026
- [4] Microsoft, справка «Using For...Next statements (VBA)» (английская версия), 2026
- [5] Microsoft, справка «Initializing Control Properties» (английская версия), 2026
- [6] Microsoft, справка «Insert menu» (английская версия), 2026
- [7] Microsoft, справка «Автоматизация задач с помощью средства записи макросов — Excel», 2026
- [8] Microsoft, справка «For Each...Next statement (VBA)» (английская версия), 2026
- [9] Microsoft, справка «Range.Value property (Excel)» (английская версия), 2026
- [10] Microsoft, справка «Differences between Office Scripts and VBA macros» (английская версия), 2026
- [11] Google, справка «Automate tasks in Google Sheets» (английская версия), 2026