FormulaCamp
Пройдено
13. VBA и макросы · События и формы · 20 мин

5. VBA: пользовательские формы (UserForm)

Урок 5 из 7
    Теория урока

    UserForm — собственное окно ввода. В редакторе VBA: Insert → UserForm, затем элементы с панели Toolbox: Label (подпись), TextBox (поле), ComboBox (раскрывающийся список), ListBox, CheckBox, CommandButton (кнопка). Имена элементов задаются в окне свойств (Name): удобно txtСумма, cmbГород, btnOK.

    • показать форму: frmЗаявка.Show (по умолчанию модально: пока форма открыта, лист недоступен);
    • UserForm_Initialize — событие перед показом, здесь заполняют списки через .AddItem;
    • btnOK_Click — нажатие кнопки;
    • Unload Me — закрыть форму и выгрузить из памяти; Me.Hide — только спрятать, значения полей сохранятся.
    Private Sub UserForm_Initialize()
        cmbГород.AddItem "Алматы"
        cmbГород.AddItem "Астана"
        cmbГород.AddItem "Шымкент"
    End Sub
    
    Private Sub btnOK_Click()
        Dim r As Long
        If cmbГород.Value = "" Then MsgBox "Выберите город": Exit Sub
        If Not IsNumeric(txtСумма.Value) Then MsgBox "Сумма должна быть числом": Exit Sub
        With Worksheets("Заявки")
            r = .Cells(.Rows.Count, 1).End(xlUp).Row + 1    ' первая пустая строка
            .Cells(r, 1).Value = Date
            .Cells(r, 2).Value = cmbГород.Value
            .Cells(r, 3).Value = CDbl(txtСумма.Value)
        End With
        Unload Me
    End Sub

    Всё, что ввели в TextBox, — текст. Перед расчётами проверьте IsNumeric и преобразуйте (CDbl, CLng), иначе в таблицу попадёт текст «1500», который не суммируется. Блок With … End With позволяет не повторять Worksheets("Заявки"): всё, что начинается с точки, относится к этому листу.

    Формы есть только в настольном Excel. В Excel для Интернета и в Office Scripts их нет: там ввод делают через таблицы, Microsoft Forms или Power Apps.

    Тренажёр не выполняет макросы и скрипты. Код из урока запускайте в настольном Excel (VBA) или в Excel для Интернета (Office Scripts). Здесь вы учитесь читать код и проверяете себя формулами и тестом.

    Проверьте себя

    1. В каком событии формы удобнее всего заполнить ComboBox списком городов перед показом?
    2. В двух TextBox введены 2 и 3. Что запишет код Range("A1").Value = TextBox1.Value + TextBox2.Value ?
    3. Чем Unload Me отличается от Me.Hide?
    4. Какое выражение даёт номер первой пустой строки под таблицей в столбце A?
    5. Какую проверку вставить в btnOK_Click, чтобы в столбец «Сумма» не попал текст «пятьсот»?
    6. Сотрудник открыл файл с формой в Excel для Интернета. Что он увидит при запуске макроса с формой?