Пример создания пользовательской формы в редакторе VBA Excel для начинающих программировать с нуля. Добавление на форму текстового поля и кнопки.
Начинаем программировать с нуля
Часть 4. Первая форма
[Часть 1] [Часть 2] [Часть 3] [Часть 4]
Создание пользовательской формы
Создайте или откройте файл Excel с расширением .xlsm
(Книга Excel с поддержкой макросов) или с расширением .xls
в старых версиях приложения.
Перейдите в редактор VBA, нажав сочетание клавиш «Левая_клавиша_Alt+F11».
В открывшемся окне редактора VBA выберите вкладку «Insert» главного меню и нажмите кнопку «UserForm». То же подменю откроется при нажатии на вторую кнопку (после значка Excel) на панели инструментов.
На экране редактора VBA появится новая пользовательская форма с именем «UserForm1»:
Добавление элементов управления
Обычно вместе с пользовательской формой открывается панель инструментов «Toolbox», как на изображении выше, с набором элементов управления формы. Если панель инструментов «Toolbox» не отобразилась, ее можно вызвать, нажав кнопку «Toolbox» во вкладке «View»:
При наведении курсора на элементы управления появляются подсказки.
Найдите на панели инструментов «Toolbox» элемент управления с подсказкой «TextBox», кликните по нему и, затем, кликните в любом месте рабочего поля формы. Элемент управления «TextBox» (текстовое поле) будет добавлен на форму.
Найдите на панели инструментов «Toolbox» элемент управления с подсказкой «CommandButton», кликните по нему и, затем, кликните в любом месте рабочего поля формы. Элемент управления «CommandButton» (кнопка) будет добавлен на форму.
Кликнув по элементу управления на форме, вы можете изменять его размер, перетягивая границы за белые квадратики, и перетаскивать по форме, ухватив за одну из границ. Кликнув по заголовку формы или по ее рабочему полю, вы можете также изменять ее размер, перетягивая границы за белые квадратики.
Нажатием клавиши «F4» вызывается окно свойств, с помощью которого можно вручную задавать значения свойств пользовательской формы и элементов управления. В окне свойств отображаются свойства выбранного элемента управления или формы, если выбрана она. Также окно свойств можно вызвать, нажав кнопку «Properties Window» во вкладке «View».
Отображение формы на экране
Чтобы запустить пользовательскую форму для просмотра из редактора VBA, необходимо выбрать ее, кликнув по заголовку или свободному от элементов управления полю, и совершить одно из трех действий:
- нажать клавишу «F5»;
- нажать на треугольник на панели инструментов (на изображении выше треугольник находится под вкладкой «Debug»);
- нажать кнопку «Run Sub/UserForm» во вкладке «Run».
Для запуска пользовательской формы с рабочего листа Excel, можно использовать кнопки, описанные в этой статье. Например, чтобы отобразить форму с помощью «кнопки – элемента ActiveX», используйте в модуле рабочего листа следующий код:
1 2 3 |
Private Sub CommandButton1_Click() UserForm1.Show End Sub |
Для «кнопки – элемента управления формы» можно использовать следующий код, размещенный в стандартном программном модуле:
1 2 3 |
Sub ShowUserForm() UserForm1.Show End Sub |
В результате вышеперечисленных действий мы получаем на рабочем листе Excel пользовательскую форму с мигающим курсором в текстовом поле:
Добавление программного кода
Программный код для пользовательской формы и элементов управления формы записывается в модуль формы. Перейти в модуль формы можно через контекстное меню, кликнув правой кнопкой мыши на поле формы или на ссылке «UserForm1» в проводнике слева и нажав кнопку «View Code».
Переходить между открытыми окнами в редакторе VBA можно через вкладку «Window» главного меню.
Изменить название пользовательской формы и элементов управления, их размеры и другие свойства можно через окно свойств (Properties Window), которое можно отобразить клавишей «F4». Мы же это сделаем с помощью кода VBA Excel, записанного в модуль формы.
Откройте модуль формы, кликнув правой кнопкой мыши по форме и нажав кнопку «View Code» контекстного меню. Скопируйте следующий код VBA, который будет задавать значения свойств формы и элементов управления перед ее отображением на экране:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
Private Sub UserForm_Initialize() 'Me - это обращение к форме в ее модуле With Me 'Присваиваем форме заголовок .Caption = "Новая форма" 'Задаем ширину формы .Width = 300 'Задаем высоту формы .Height = 150 End With With TextBox1 'Задаем ширину текстового поля .Width = 200 'Задаем высоту текстового поля .Height = 20 'Задаем расстояние от внутреннего края 'формы сверху до текстового поля .Top = 30 'Задаем расстояние от внутреннего края 'формы слева до текстового поля, чтобы 'текстовое поле оказалось по центру .Left = Me.Width / 2 - .Width / 2 - 6 'Задаем размер шрифта .Font.Size = 12 'Присваиваем текст по умолчанию .Text = "Напишите что-нибудь своё!" End With With CommandButton1 'Задаем ширину кнопки .Width = 70 'Задаем высоту кнопки .Height = 25 'Задаем расстояние от внутреннего края 'формы сверху до кнопки .Top = 70 'Задаем расстояние от внутреннего края 'формы слева до кнопки, чтобы 'кнопка оказалось по центру .Left = Me.Width / 2 - .Width / 2 - 6 'Задаем размер шрифта .Font.Size = 12 'Присваиваем кнопке название .Caption = "OK" End With End Sub |
Вставьте скопированный код в модуль формы:
Познакомьтесь еще с одним способом отображения на экране пользовательской формы в процессе тестирования: установите курсор внутри процедуры UserForm_Initialize()
и нажмите клавишу «F5» или треугольник на панели инструментов. Все предыдущие способы (с выбором формы в редакторе и кнопками на рабочем листе) тоже работают.
В результате мы получаем следующую форму:
Теперь перейдите в редактор VBA, откройте проект формы «UserForm1» и дважды кликните по кнопке «CommandButton1». В результате откроется модуль формы и будет создан шаблон процедуры CommandButton1_Click()
, которая будет запускаться при нажатии кнопки:
1 2 3 |
Private Sub CommandButton1_Click() End Sub |
Вставьте внутрь шаблона процедуры CommandButton1_Click()
следующую строку кода, которая будет копировать текст из текстового поля в ячейку «A1» активного рабочего листа:
1 |
Range("A1") = TextBox1.Text |
Отобразите пользовательскую форму на экране и проверьте работоспособность кнопки «OK».
Подскажите пожалуйста в чём ошибка. Из первой формы перехожу во вторую форму. Закрываю ввожу там данные и закрываю. При повторном обращении ко второй форме, отображает её как она выглядит в редакторе VBA. В чем ошибка?
Привет, Сергей!
Чтобы информация, введенная в элементы управления формы, сохранилась, надо не закрывать форму, а скрывать:
Me
— это обращение к форме, на которой расположен элемент управления (в примере — CommandButton1).Me
можно заменить на имя формы, особенно, если скрывается другая форма, например,UserForm1.Hide
.Евгений, я так и делаю. Через Hide скрываю, а через Showe показываю.
У меня первая форма меню, состоящая из кнопок. Нажимаю на кнопку 1(скрываю через хиде первую форму и отображаю через шове вторую форму) , перехожу к форме ввода данных она работает, при нажатии на крестик,(прописываю скрыть 2 форму и отобразить 1). При повторном нажатии на кнопку 1 у меня отображается форма как в vba. Извиняюсь заранее за слоган, только учусь программированию.
Сергей, при нажатии на крестик форма в любом случае удаляется из памяти (происходит событие UserForm_Terminate), вне зависимости от того, что вы прописали этому событию (скрыть 2 форму и отобразить 1), все равно 2 форма будет уничтожена. Попробуйте на 2 форму добавить кнопку и уже для нее прописать скрытие 2 формы и отображение 1.
Евгений спасибо. Заработало.
Подскажите, пожалуйста, а как расположить данную форму сбоку от листа Excel?
Здравствуйте, Олег!
Добрый день, Евгений!
Прошу помощи в написании кода для моей Userform.
В ячейке B1 выпадающий список, в столбце диапазона C1:C35 данные 1А.
Пожелание: при выборе из выпадающего списка, замена производилась в диапазоне C1:C35 только активных ячеек, а не во всем диапазоне сразу.
Как дополнить (исправить) код:
Спасибо большое за помощь!
Здравствуйте, Константин!
На рабочем листе может быть только одна активная ячейка, а выделенных — любое количество.
Для активной ячейки:
Для выделенного диапазона:
Приведённый вышеуказанный мой код, работает, но не совсем так, как хотелось.
Выбирая из открывающегося списка, (ячейка B1), мне надо изменить данные в диапазоне C1:C35 нажатием на кнопку.
Мой код меняет все 35, а по сути он должен изменить только там, где есть данные.
Все чётко. Моё недельное мучение, Вы решили за час.
Благодарю Вас, за Вашу кропотливую работу.
Спасибо огромнейшее!!!!!
Доброго дня, Евгений!
У меня вчера на радости от Вашего успеха в познании написания кодов макросов, затмило разум.
Я тренировался и искал варианты для простой кнопки, а мне нужно было в Userform. Я пробовал Ваш вариант, он бесподобен, работает в Userformе.
Маху я дал с открывающимся списком в ячейке (В1).
В Userforme у меня для поля с открывающимся списком прописан код:
Как теперь поправить Ваш код вместо (В1)
Константин, замените
Range("B1")
наКласс.Value
Доброе утро, Евгений!
Заменил
Range("B1")
наКласс.Value
.Все работает отлично.
Спасибо Вам, Евгений, за Ваш кропотливый труд и БЕЗ отказа о помощи таким бестолковым как я.
Спасибо, удачи Вам, всех благ!
Доброе утро, Евгений!
Есть какой нибудь вариант по отправки вложения из ячейки активного листа в экселе, БЕЗ использования Outlook?
Используется в основном Яндекс.
Три столбца:
A1 … A60 — гиперссылка на файлы (которые в дальнейшем, если есть возможность, отправляются по email), этот столбец неизменный;
B1 … B60 — фамилии (тех, кому будут отправлены файлы), фамилии могут меняться;
C1 … C60 — ПОЖЕЛАНИЕ, чтобы появлялись ссылки привязанные к фамилии (т.к. фамилии могут меняться) для отправки на email данного человека.
Я думаю, что это НЕ реально, а Вы Евгений, как считаете?
Спасибо!
Здравствуйте, Константин!
Вам может подойти эта функция. Чтобы она работала, у вас должна быть подключена библиотека Microsoft CDO в редакторе VBA (Tools >> References).
Добрый день, Евгений!
Помогите, подскажите, как собрать данные по имеющимся в папке файлам (название этой папки Проба), дату и время изменения с отображением на активном Листе1 файла (названием Первый.xlsm) с отображением в ячейках D1…D10 (обновлено, дата, время, или просто заливается цветом).
Для работы я использую папку Проба, в ней имеется 10 файлов (ПР1.xlsm, ПР2.xlsm,…ПР10.xlsm) с постоянными именами. Обновляются файлы не открывая их, при помощи Вставить с заменой.
Может, что-то есть у Вас подобное?
Помогите пожалуйста решить задачу.
Спасибо!
Здравствуйте, Константин!
Вы можете написать код на основе второго примера из статьи VBA Excel. Список файлов в папке. Для отображения времени изменения файлов используйте функцию FileDateTime. Будут затруднения, обращайтесь, подскажу.
Константин, я добавил «Пример 3», сходный с вашей задачей, в статью VBA Excel. Функция FileDateTime.
Здравствуйте, нужна помощь по VBA, как обратиться к отдельным элементам как textbox, combobox и т.д. Я должен написать цикл где при клике кнопки должно создаваться combobox1, combobox2 и так столько сколько по требуется.
как решить? Спасибо заранее
Здравствуйте, Шавкат!
Информация по вашему вопросу есть в статье Метод Controls.Add пользовательской формы.
Обсуждение закрыто.