Программирование и ИИ

UserForm в VBA: как сделать окно ввода заявок и перебрать строки циклом

UserForm в VBA — это окно с полями и кнопками для тех, кто хочет, чтобы коллеги вводили данные в форму, а не прямо в ячейки. Форму вставляют в редакторе, заполняют в событии Initialize и показывают методом Show. По справке Microsoft форма по умолчанию модальная: код после Show ждёт, пока её не скроют или не выгрузят[1]. Ниже — форма, циклы For и For Each, массивы и ограничения.

Тренажёр: 7 шагов

Реестр броней ведут пять человек, и каждый пишет по-своему: где-то сумма с пробелами, где-то фамилия в столбце даты. Справка 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].

Миф: при открытой форме всегда можно работать с листом — на деле справка Microsoft пишет, что форма по умолчанию модальная и код ждёт её закрытия[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
  1. Вставьте форму, положите на неё поле txtName, список lstCity и кнопку cmdSave.
  2. В окне кода формы впишите процедуры UserForm_Initialize и cmdSave_Click.
  3. В модуле создайте процедуру с одной строкой 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].

Миф: ReDim Preserve меняет любое измерение массива — на деле справка Microsoft разрешает менять только последнее измерение и только верхнюю границу[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 в ней речи нет.

Не путать: модуль, Option Explicit и первая процедура — база языка; подробнее — на странице о первой процедуре VBA и редакторе.

Соседние темы собраны среди всех уроков тренажёра по коду и ИИ, а запись простых действий без программирования — на странице о записи макросов.

Частые вопросы

Как открыть 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. [1] Microsoft, справка «Show method (Visual Basic for Applications)» (английская версия), 2026
  2. [2] Microsoft, справка «UserForm object» (английская версия), 2026
  3. [3] Microsoft, справка «ReDim statement (VBA)» (английская версия), 2026
  4. [4] Microsoft, справка «Using For...Next statements (VBA)» (английская версия), 2026
  5. [5] Microsoft, справка «Initializing Control Properties» (английская версия), 2026
  6. [6] Microsoft, справка «Insert menu» (английская версия), 2026
  7. [7] Microsoft, справка «Автоматизация задач с помощью средства записи макросов — Excel», 2026
  8. [8] Microsoft, справка «For Each...Next statement (VBA)» (английская версия), 2026
  9. [9] Microsoft, справка «Range.Value property (Excel)» (английская версия), 2026
  10. [10] Microsoft, справка «Differences between Office Scripts and VBA macros» (английская версия), 2026
  11. [11] Google, справка «Automate tasks in Google Sheets» (английская версия), 2026

Похожие темы