Delete a UserForm and add a New UserForm in Excel VBA
What I would like to do is Delete a Userform and replace it with an updated Userform using VBA for Excel.
I exported the original Userform, made my changes, and now would like to replace the original with the new Userform. Both Userforms have the same names. I’m hoping, by keeping the UserForm names the same the button that activates the Userform won’t be damaged.
I have am going to have the VBA loop through all the workbooks and do this
delete userforms in vba
Hey everyone,
I’m trying to get rid of a form I created in a project so I can
import another one which has the same name.
But so far I havent been able to find a way to do it.
So please let me know if thats possible and if not what would be the
solution to my problem.
Advertisements
Guest
- Mar 5, 2007
- #2
Guest
- Mar 5, 2007
- #3
malpropio
- Mar 5, 2007
- #4
Thk u Tom and Jim,
But I don’t know if its because I’m using the vb code editor of excel
but when I right click on the userform in the project explorer it does
not give me the choice to delete it.
Guest
- Mar 5, 2007
- #5
Chip Pearson
- Mar 6, 2007
- #6
If you want to do this by code, set a reference to the VBA 5.3 Extensibility
Library (in VBA, go to the Tools menu, choose References, and check
"Microsoft Visual Basic For Applications Extensibility Library 5.3"). Then
use code like
VBA Close UserForm with Unload Me
Close a UserForm with VBA by using the Unload Me VBA statement. You can also unload userforms with different names by replacing “Me” with the name of your form.
I’ll show you how to close userforms with VBA in this brief tutorial from the VBA Tutorials Blog. At the bottom, you’ll see a macro showing how to use a loop to close all your userforms at once.
Example — VBA Close UserForm
Make powerful macros with our free VBA Developer Kit
This is actually pretty neat. If you have trouble understanding or remembering it, our free VBA Developer Kit can help. It’s loaded with VBA shortcuts to help you make your own macros like this one — we’ll send a copy, along with our Big Book of Excel VBA Macros, to your email address below.
Tutorial — VBA Close UserForm
Close a UserForm from UserForm Event
The macro above only works when you call it from an event procedure on that UserForm — like a command button. That’s because only the UserForm knows that “Me” is the UserForm.
In other words, if you type Unload Me in a regular module, it will fail with an error saying “Invalid use of Me keyword.” Remember, the module doesn’t know what UserForm you want to unload!
Let’s walk through an example showing where it’s appropriate to use “Unload Me” to close your form. Pretend you have a userform that looks like this:

You may recognize this UserForm from my Mouse To Macro mouse recording Excel Add-in. On this form, I’ve named the Cancel button cbCancel .
When you click the cbCancel button, the form is closed, because I double clicked the cbCancel button during development and pasted the example macro for the click event.
Your macro can be a lot more complicated than this. Feel free to run whatever commands you want before you put the Unload Me statement. “Unload Me” closes your form and removes everything associated with it from memory.
Close UserForm from another Module
This isn’t the first time you’ve seen me use the Unload statement. I used it to demonstrate my VBA Excel splash screen, but if you recall, I didn’t use the “Me” keyword. I could have, but I didn’t.
Let’s say you have a modeless UserForm (ShowModal property set to False), titled UserForm1 . When you have a modeless UserForm, you can click around in Excel and run other macros while your UserForm is open. You can interact with things other than your UserForm. This isn’t the default way to show a UserForm.
Anyway, pretend you have this modeless UserForm floating around. You have several other macros that run while the UserForm is just chilling there. To close your UserForm from one of these macros, you would pair “Unload” with the name of your UserForm, like this:
Because the UserForm was named UserForm1 , you enter that instead of the Me keyword.
Close All UserForms with VBA
If you want to close all your UserForms, you could create a loop that loops through each form and unloads each form — one by one. Here’s an example:
Application Ideas — VBA Close UserForm
I’m going to leave you with an application idea to motivate, inspire and challenge you. A long time ago, I created a modeless UserForm that stayed on the screen until the user pressed a certain key. Once that key was pressed, the form was closed.
Can you do that? Leave a comment below with your macros demonstrating how to do it!
If you haven’t already done so, join our VBA Insiders using the form below. After that, share this article on Twitter so your friends can learn.
Ready to do more with VBA?
We put together a giant PDF with over 300 pre-built macros and we want you to have it for free. Enter your email address below and we’ll send you a copy along with our VBA Developer Kit, loaded with VBA tips, tricks and shortcuts.
Before we go, I want to let you know we designed a suite of VBA Cheat Sheets to make it easier for you to write better macros. We included over 200 tips and 140 macro examples so they have everything you need to know to become a better VBA programmer.
VBA Excel. Программное создание формы
Пользовательская форма программно (динамически) может быть создана только как элемент коллекции VBComponents проекта VBA:
Число (3) означает, что создается форма, если заменить его на (1), будет создан стандартный модуль.
Значения свойствам формы myForm, как элемента коллекции VBComponents, присваиваются следующим образом:
Присвоенные значения параметров динамической формы, как элемента коллекции VBComponents, сохраняются при закрытии формы.
Для элемента коллекции UserForms присвоение значений свойств будет выглядеть следующим образом:
Присвоенные значения параметров динамической формы, как элемента коллекции UserForms, не сохраняются при закрытии формы.
Я не рекомендую работать из кода VBA Excel с программно созданной формой, как элементом коллекции UserForms, кроме случая, когда необходимо отобразить динамическую форму на экране. В других случаях можно получить непредсказуемые результаты, например, могут не работать программно созданные кнопки, а также они будут исчезать при закрытии формы.
Отображение
Здесь возникает проблема: у динамической формы, созданной как элемент коллекции VBComponents, нет метода, который позволил бы ее отобразить на экране.
Чтобы обойти это препятствие, преобразуем нашу форму myForm в элемент коллекции UserForms, как в предыдущем примере, и выводим ее на экран с помощью метода Show:
Удаление
Удаление программно созданных форм, если это не однократное действие, крайне важно. Если этого не предусмотреть, то все вновь создаваемые формы будут сохраняться и накапливаться в проекте VBA.
Удаляем динамически созданную форму с именем myForm1 следующим образом:
Программно удалить форму можно только через элемент коллекции VBComponents, так как у элемента коллекции UserForms удаление не предусмотрено (нет соответствующего метода).
Добавление кнопки на форму
Код VBA Excel, добавляющий командную кнопку на динамически созданную форму и задающий ее свойства:
Здесь, при создании кнопки на основе элемента коллекции VBComponents, добавляется только объект Designer, которого нет при программном создании элементов управления на основе элемента коллекции UserForms (также смотрите пример кода ниже). Константы, указывающие на класс создаваемого элемента управления, используются те же.
Запись процедуры в модуль
В модуль динамически созданной формы myForm запишем код, который будет выполняться при клике по программно созданной в предыдущем примере кнопке myButton (объектная переменная) с именем «myCommandButton». Этот код создает на форме элемент управления Label, выравнивает его и записывает в него текст: «Ура! Новая кнопка работает!».
Текст процедуры
Обработка события Click для кнопки с именем «myCommandButton»:
Способ 1
Первый способ предназначен для записи в модуль формы myForm кода процедуры целиком. Для этого используется метод AddFromString:
Все прямые кавычки из текста процедуры заменены на функцию Chr(34), где 34 – числовой код парной прямой кавычки.
Способ 2
Этот способ предполагает запись кода процедуры в модуль формы myForm построчно. Для этого используется метод InsertLines:
Свойство модуля CountOfLines возвращает количество уже имеющихся в модуле строк, что позволяет с помощью переменной n добавлять новые строки ниже. Это актуально, если используется для записи кода уже существующий модуль, или новый модуль, в который записывается сразу несколько процедур.
Пример создания и удаления формы
Пример кода VBA Excel по динамическому созданию новой пользовательской формы, добавлению на нее командной кнопки и программного кода в ее модуль:
Пример удаления формы «myForm1», созданной процедурой «AddNewForm»:
Вы можете скопировать этот код в стандартный модуль и проверить его работоспособность. После отображения динамически созданной пользовательской формы, нажмите кнопку «Новая кнопка». Результат работы кода:

Если хотите увидеть программно записанный код в модуле формы, кликните по форме правой кнопкой мыши и выберите в контекстном меню «View Code».
После удаления программно созданной формы, создать новую с тем же именем без перезагрузки Excel не получится. Без перезагрузки можно создавать любое количество динамических форм с разными именами.
Перезагрузка Excel – это закрытие всех открытых рабочих книг с последующим открытием любой книги.
Как скопировать пользовательскую форму из одной книги Excel в другую книгу с помощью кода VBA смотрите в статье Экспорт и импорт пользовательской формы.
22 комментария для “VBA Excel. Программное создание формы”
Здравствуйте. У меня не работает. Ругается на Dim myButton As Control . Пишет Compile Error — User-defined type not defined . Что не так?
Здравствуйте, Максим!
Замените Dim myButton As Control на Dim myButton As Object . Скорее всего, у вас какая-то библиотека не подключена.
После изменения на Object все равно ошибка 1004 Application-defined or object-defined error .
Если у вас 64-битная версия Excel, попробуйте добавить ссылки на библиотеки, которых у вас нет (Tools – References…):

Если у вас 32-битная версия Excel, добавьте еще ссылки на библиотеки Microsoft Windows Common Controls и Microsoft Windows Common Controls 2 .
У меня Office 2019 и нет таких библиотек. Думал будет все проще с макросом. У меня есть документ в Excel, и я хотел при его открытии сразу создавать пользовательскую форму. Так то оно все работает, если форма уже в нем создана. Но я решил заморочиться ))) и заморочился. К примеру, если я сделаю подобную форму, и все будет работать после добавления библиотек, придется ли другому пользователю добавлять сторонние библиотеки для того чтобы все работало?
Максим, необходимые библиотеки должны быть в списке ниже, их нужно только выделить галочками и нажать «OK». Если у вас нет в списке Microsoft Windows Common Controls , значит у вас 64-битная версия Excel.
Посмотрите у себя, есть ли у вас галочки на библиотеках Microsoft Excel Object Library, Microsoft Office Object Library и Microsoft Forms Object Library. Если нет, добавьте ссылки на них из списка ниже. Цифры у вас могут быть другие.
У другого пользователя ссылки на эти библиотеки тоже должны быть установлены.
Из того, что вы перечислили есть только Microsoft Excel Object Library, Microsoft Office Object Library и они включены.
Попробуйте с помощью строки поиска найти на диске «C:» файл FM20.DLL с библиотекой Microsoft Forms 2.0 Object Library. Если найдете, попробуйте добавить эту библиотеку в список References, нажав кнопку «Browse…» и выбрав файл FM20.DLL.
Если получится, библиотека Microsoft Forms 2.0 Object Library появится в списке, и ее можно будет выбрать.
Евгений, я добавил как вы сказали и 1004 Application-defined or object-defined error
То есть код не выполняется.
Максим, если в списке References появилась ссылка на библиотеку Microsoft Forms 2.0 Object Library и вы ее выбрали, то, в принципе, все должно заработать в 64-разрядной версии Excel. Проверьте разрядность вашей версии по инструкции Как узнать версию Excel? Попробуйте перезагрузить Excel (закрыть все файлы, потом открыть), если в течение дня этого не делали. Проверьте еще раз работоспособность кода из этой статьи.
Евгений, Excel 2019 64-разрядной версии, ссылка на Microsoft Forms 2.0 Object Library появилась и я ее выбрал, но к сожалению у меня код не работает. Хотя и Windows и Office лицензионные. Не знаю что уж тут к чему, но такие танцы с бубнами мне ни к чему. Спасибо за помощь и внимание к моей писанине. Я просто хотел сделать полностью автоматизированный документ чтобы упростить жизнь на работе себе и моим коллегам, но похоже что могу только ее усложнить ))).
Остальные статьи касательно Excel у вас написаны прекрасно и понятно. Я только увлекся изучением VBA скриптинга и они здорово помогают. Спасибо.
Евгений, решил эту проблему погуглив. Наверное можно добавить это сюда. В настройках самого Excel: Файл => Параметры => Центр управления безопасностью => Параметры центра управления безопасностью => Параметры макросов => Установить галочку на «Доверять доступ к объектной модели VBA». И как пишут там: «It doesn’t follow the workbook and you can’t change it in code». А это грустно. То есть я не смогу создать форму в коде, которая запустится у любого пользователя. Кстати, ваш код заработал после этой манипуляции.
Спасибо, Максим!
Я упустил из вида, что у многих пользователей выключена опция «Доверять доступ к объектной модели проектов VBA». Теперь добавил информацию об этом в статью.