Vba excel как удалить userform

Программное создание пользовательской формы из кода VBA Excel. Добавление на форму кнопки и события Click в модуль созданной формы. Удаление формы.

Программная работа с формой

Чтобы программно создавать формы и модули, в настройках Excel должна быть установлена галочка в опции «Доверять доступ к объектной модели проектов VBA», расположенной по адресу: «Файл» >> «Параметры» >> «Центр управления безопасностью» >> «Параметры центра управления безопасностью» >> «Параметры макросов».

Создание

Пользовательская форма программно (динамически) может быть создана только как элемент коллекции VBComponents проекта VBA:

Dim myForm As Object

Set myForm = ThisWorkbook.VBProject.VBComponents.Add(3)

Число (3) означает, что создается форма, если заменить его на (1), будет создан стандартный модуль.

Значения свойствам формы myForm, как элемента коллекции VBComponents, присваиваются следующим образом:

With myForm

    .Properties(«Name») = «myForm1»  ‘Иногда эта строка вызывает ошибку

    .Properties(«Caption») = «Эта форма создана программно»

    .Properties(«Width») = 300

    .Properties(«Height») = 150

End With

Присвоенные значения параметров динамической формы, как элемента коллекции VBComponents, сохраняются при закрытии формы.

Для элемента коллекции UserForms присвоение значений свойств будет выглядеть следующим образом:

Dim myForm As Object, myFormForms As Object

‘Создаем форму как элемент коллекции VBComponents

Set myForm = ThisWorkbook.VBProject.VBComponents.Add(3)

‘На основе myForm создаем элемент коллекции UserForms

Set myFormForms = UserForms.Add(myForm.Name)

With myFormForms

    .Caption = «Эта форма создана программно»

    .Width = 300

    .Height = 150

    .Show

End With

Присвоенные значения параметров динамической формы, как элемента коллекции UserForms, не сохраняются при закрытии формы.

Я не рекомендую работать из кода VBA Excel с программно созданной формой, как элементом коллекции UserForms, кроме случая, когда необходимо отобразить динамическую форму на экране. В других случаях можно получить непредсказуемые результаты, например, могут не работать программно созданные кнопки, а также они будут исчезать при закрытии формы.

Отображение

Здесь возникает проблема: у динамической формы, созданной как элемент коллекции VBComponents, нет метода, который позволил бы ее отобразить на экране.

Чтобы обойти это препятствие, преобразуем нашу форму myForm в элемент коллекции UserForms, как в предыдущем примере, и выводим ее на экран с помощью метода Show:

‘извлекая имя из объектной переменной

UserForms.Add(myForm.Name).Show

‘или сразу по ранее присвоенному имени

UserForms.Add(«myForm1»).Show

Удаление

Удаление программно созданных форм, если это не однократное действие, крайне важно. Если этого не предусмотреть, то все вновь создаваемые формы будут сохраняться и накапливаться в проекте VBA.

Удаляем динамически созданную форму с именем myForm1 следующим образом:

With ThisWorkbook.VBProject.VBComponents

    .Remove .Item(«myForm1»)

End With

Программно удалить форму можно только через элемент коллекции VBComponents, так как у элемента коллекции UserForms удаление не предусмотрено (нет соответствующего метода).

Добавление кнопки на форму

Код VBA Excel, добавляющий командную кнопку на динамически созданную форму и задающий ее свойства:

Dim myButton As Control

Set myButton = myForm.Designer.Controls.Add(«Forms.CommandButton.1»)

With myButton

    .Name = «myCommandButton»

    .Caption = «Новая кнопка»

    .Font.Size = 10

    .Left = 100

    .Top = 80

    .Width = 100

    .Height = 20

End With

Здесь, при создании кнопки на основе элемента коллекции VBComponents, добавляется только объект Designer, которого нет при программном создании элементов управления на основе элемента коллекции UserForms (также смотрите пример кода ниже). Константы, указывающие на класс создаваемого элемента управления, используются те же.

Запись процедуры в модуль

В модуль динамически созданной формы myForm запишем код, который будет выполняться при клике по программно созданной в предыдущем примере кнопке myButton (объектная переменная) с именем «myCommandButton». Этот код создает на форме элемент управления Label, выравнивает его и записывает в него текст: «Ура! Новая кнопка работает!».

Текст процедуры

Обработка события Click для кнопки с именем «myCommandButton»:

Private Sub myCommandButton_Click()

Dim myLabel As Object

    Set myLabel = Me.Controls.Add(«Forms.Label.1»)

    With myLabel

        .Caption = «Ура! Новая кнопка работает!»

        .Font.Size = 10

        .Left = 85

        .Top = 30

        .Width = 200

        .Height = 20

    End With

End Sub

Способ 1

Первый способ предназначен для записи в модуль формы myForm кода процедуры целиком. Для этого используется метод AddFromString:

myForm.CodeModule.AddFromString («Private Sub myCommandButton_Click()» & vbNewLine & _

«Dim myLabel As Object» & vbNewLine & _

«Set myLabel = Me.Controls.Add(« & Chr(34) & «Forms.Label.1» & Chr(34) & «)» & vbNewLine & _

«With myLabel» & vbNewLine & _

«.Caption = « & Chr(34) & «Ура! Новая кнопка работает!» & Chr(34) & vbNewLine & _

«.Font.Size = 10» & vbNewLine & _

«.Left = 85» & vbNewLine & _

«.Top = 30» & vbNewLine & _

«.Width = 200» & vbNewLine & _

«.Height = 20» & vbNewLine & _

«End With» & vbNewLine & _

«End Sub»)

Все прямые кавычки из текста процедуры заменены на функцию Chr(34), где 34 – числовой код парной прямой кавычки.

Способ 2

Этот способ предполагает запись кода процедуры в модуль формы myForm построчно. Для этого используется метод InsertLines:

Dim n As Integer

With myForm.CodeModule

    n = .CountOfLines

    .InsertLines n + 1, «Private Sub myCommandButton_Click()»

    .InsertLines n + 2, «Dim myLabel As Object»

    .InsertLines n + 3, «Set myLabel = Me.Controls.Add(« & Chr(34) & «Forms.Label.1» & Chr(34) & «)»

    .InsertLines n + 4, «With myLabel»

    .InsertLines n + 5, «.Caption = « & Chr(34) & «Ура! Новая кнопка работает!» & Chr(34)

    .InsertLines n + 6, «.Font.Size = 10»

    .InsertLines n + 7, «.Left = 85»

    .InsertLines n + 8, «.Top = 30»

    .InsertLines n + 9, «.Width = 200»

    .InsertLines n + 10, «.Height = 20»

    .InsertLines n + 11, «End With»

    .InsertLines n + 12, «End Sub»

End With

Свойство модуля CountOfLines возвращает количество уже имеющихся в модуле строк, что позволяет с помощью переменной n добавлять новые строки ниже. Это актуально, если используется для записи кода уже существующий модуль, или новый модуль, в который записывается сразу несколько процедур.

Пример создания и удаления формы

Пример кода VBA Excel по динамическому созданию новой пользовательской формы, добавлению на нее командной кнопки и программного кода в ее модуль:

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

46

47

48

49

50

Sub AddNewForm()

‘Создаем форму, как новый экземпляр коллекции VBComponents

Dim myForm As Object

Set myForm = ThisWorkbook.VBProject.VBComponents.Add(3)

‘Присваиваем значения свойствам формы myForm

With myForm

    .Properties(«Name») = «myForm1»

    .Properties(«Caption») = «Эта форма создана программно»

    .Properties(«Width») = 300

    .Properties(«Height») = 150

End With

‘Создаем командную кнопку

Dim myButton As Control

Set myButton = myForm.Designer.Controls.Add(«Forms.CommandButton.1»)

‘Присваиваем значения свойствам кнопки

With myButton

    .Name = «myCommandButton»

    .Caption = «Новая кнопка»

    .Font.Size = 10

    .Left = 100

    .Top = 80

    .Width = 100

    .Height = 20

End With

‘Записываем текст процедуры в модуль формы myForm

Dim n As Integer

With myForm.CodeModule

    n = .CountOfLines

    .InsertLines n + 1, «Private Sub myCommandButton_Click()»

    .InsertLines n + 2, «Dim myLabel As Object»

    .InsertLines n + 3, «Set myLabel = Me.Controls.Add(« & Chr(34) & «Forms.Label.1» & Chr(34) & «)»

    .InsertLines n + 4, «With myLabel»

    .InsertLines n + 5, «.Caption = « & Chr(34) & «Ура! Новая кнопка работает!» & Chr(34)

    .InsertLines n + 6, «.Font.Size = 10»

    .InsertLines n + 7, «.Left = 85»

    .InsertLines n + 8, «.Top = 30»

    .InsertLines n + 9, «.Width = 200»

    .InsertLines n + 10, «.Height = 20»

    .InsertLines n + 11, «End With»

    .InsertLines n + 12, «End Sub»

End With

‘Отображаем форму на экране

UserForms.Add(myForm.Name).Show

Set myForm = Nothing

End Sub

Пример удаления формы «myForm1», созданной процедурой «AddNewForm»:

Sub RemoveForm()

    With ThisWorkbook.VBProject.VBComponents

        .Remove .Item(«myForm1»)

    End With

End Sub

Вы можете скопировать этот код в стандартный модуль и проверить его работоспособность. После отображения динамически созданной пользовательской формы, нажмите кнопку «Новая кнопка». Результат работы кода:

Программно созданная пользовательская форма

Если хотите увидеть программно записанный код в модуле формы, кликните по форме правой кнопкой мыши и выберите в контекстном меню «View Code».

После удаления программно созданной формы, создать новую с тем же именем без перезагрузки Excel не получится. Без перезагрузки можно создавать любое количество динамических форм с разными именами.

Перезагрузка Excel – это закрытие всех открытых рабочих книг с последующим открытием любой книги.

Как скопировать пользовательскую форму из одной книги Excel в другую книгу с помощью кода VBA смотрите в статье Экспорт и импорт пользовательской формы.


 

zenija2007

Пользователь

Сообщений: 92
Регистрация: 22.10.2016

#1

18.12.2016 03:32:03

Вот код:

Код
Function NewForm(name As String) As Object
    Dim myForm As Object
    'Application.VBE.MainWindow.Visible = False
    Set myForm = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
    myForm.Properties("Caption") = name
    myForm.Properties("Width") = 300
    myForm.Properties("height") = 270
    VBA.UserForms.Add(myForm.name).Show
    Set CreateForm = myForm
End Function
Sub DelForm(name As Object)
    ThisWorkbook.VBProject.VBComponents.Remove name
End Sub
Sub Start()
    Dim my As UserForm
    Set my = NewForm("MyFormCaption")
    'Call DelForm(my)
    ThisWorkbook.VBProject.VBComponents.Remove my
End Sub

ошибок нет, но форма не удаляется. Заранее спасибо.

Прикрепленные файлы

  • Шаблон.xlsm (18.53 КБ)

Изменено: zenija200718.12.2016 09:14:27

 

Игорь

Пользователь

Сообщений: 3631
Регистрация: 23.12.2012

А в чём прикол, — создавать форму, а потом её удалять, и всё это кодом?
Вручную создайте форму, и вызывайте / закрывайте её через .Show / .Hide  

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

смею предположить, что (для вашего кода) дело в настройках самого xl — см.:
 файл —  параметры —  центр управления безопасностью —  параметры центра управления безопасностью —  параметры макросов —  доверять доступ к vba.модели — включено должно быть
(поскольку чтобы делать кодом — ThisWorkbook.VBProject.VBComponents.Add и VBProject.VBComponents.Remove — xl’ю надо иметь этот доступ)… мне подсказывает интуиция  ;)

Изменено: JeyCi18.12.2016 08:18:32

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

 

zenija2007

Пользователь

Сообщений: 92
Регистрация: 22.10.2016

#4

18.12.2016 09:09:54

включено было. что-то другое значит.

Цитата
Игорь написал:
Вручную создайте форму, и вызывайте / закрывайте её через .Show / .Hide

так и собирался, но стало интересно разобраться с удалением. наверняка где-то пригодится.

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#5

18.12.2016 09:36:17

Цитата
zenija2007 написал: ошибок нет

Ошибки есть. В UDF. Называется она у Вас NewForm, а Set CreateForm = myForm

Согласие есть продукт при полном непротивлении сторон.

 

zenija2007

Пользователь

Сообщений: 92
Регистрация: 22.10.2016

Спасибо большое, все заработало. И тип не UserForm, а Object.

Изменено: zenija200719.12.2016 16:08:28

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

Так чему у Вас равна Ваша переменная my после выполнения функции NewForm?

Согласие есть продукт при полном непротивлении сторон.

 

zenija2007

Пользователь

Сообщений: 92
Регистрация: 22.10.2016

странно, что ошибка не выскакивала.

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#9

18.12.2016 09:45:57

Цитата
zenija2007 написал:
И тип не UserForm, а Object

Да, и это тоже. И еще у меня vbext_ct_MSForm не сработал, заменил на 3

Согласие есть продукт при полном непротивлении сторон.

 

zenija2007

Пользователь

Сообщений: 92
Регистрация: 22.10.2016

#10

18.12.2016 09:47:22

Цитата
Sanja написал: И еще у меня vbext_ct_MSForm не сработал, заменил на 3

в оригинале было 3, а если считать от 0, то как раз шло vbext_ct_MSForm. По идее это одно и то же.

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#11

18.12.2016 09:51:55

Цитата
zenija2007 написал: ошибка не выскакивала

Да это, собственно, больше логическая ошибка, VBA ее не отслеживает. Ну не создана форма my и что? Откуда VBA знать почему. И что это ошибка  :)

Согласие есть продукт при полном непротивлении сторон.

При первой вставке модуля в VBA ему автоматически будет присвоено имя «Модуль1», А последующий модуль станет Module2, Module3 и т. Д. Аналогичным образом, когда вы вставляете пользовательскую форму, она будет называться UserForm1, UserForm2 и т. Д.

Переименование модуля

Чтобы переименовать модуль или форму, вам необходимо включить окно свойств в вашем VBE.

Если окна свойств не отображаются, нажмите F4 или перейдите в строку меню и выберите Вид, Характеристики Окно.

  1. Щелкните модуль, который хотите переименовать, в Обозреватель проекта.
  2. Выберите свойство name в Окно свойств (модуль будет иметь только это свойство; форма имеет несколько свойств)

3. Удалите имя модуля (в данном случае Module1) и введите имя, которое вы хотите назвать своим модулем.

4. Нажмите Enter, чтобы переименовать модуль.

Таким же образом вы переименовываете свои формы.

Удаление модуля

Иногда вам может потребоваться удалить модуль или форму, которые вам больше не нужны.

Щелкните правой кнопкой мыши модуль или форму, которые вы хотите удалить, чтобы отобразить контекстное меню, вызываемое правой кнопкой мыши.

Нажмите Удалять (в этом случае Модуль2)

ИЛИ

Нажать на Файл меню, а затем нажмите Удалите (Module2).

Появится окно с предупреждением, в котором вас спросят, хотите ли вы экспортировать модуль или форму, прежде чем удалять их. Экспорт модуля или формы позволяет сохранить его как отдельный файл для использования в другом проекте Excel в другое время.

Чаще всего, когда вы удаляете модуль или форму, это происходит потому, что он вам не нужен, поэтому нажмите Нет.

Именование модулей и форм

Рекомендуется переименовывать модули и формы, чтобы дать им более понятные имена. Например, если UserForm1 будет формой для ввода сведений о счете, мы можем переименовать ее в frmInvoices. Точно так же, если Module1 будет использоваться для хранения некоторых общих функций, которые будут повторно использоваться в вашем коде, вы можете переименовать его в basGeneral или modGeneral (в зависимости от того, какие соглашения об именах вы хотите использовать).

Рекомендуется соблюдать соглашения об именах как при именовании ваших модулей и форм, так и переменных, которые вы используете в своем коде. Вы заметите, что я написал первые 3 буквы имени модуля или формы в нижнем регистре и поставил заглавную букву в начале описания модуля или формы. Это известно как CamelCase (https://en.wikipedia.org/wiki/Camel_case) и является хорошей привычкой при именовании объектов. Я также использовал соглашение об именах Лешинского, которое часто используется программистами Visual Basic. (https://en.wikipedia.org/wiki/Leszynski_naming_convention).

Вы поможете развитию сайта, поделившись страницей с друзьями

What This VBA Code Does

 I found this concept in an Excel forum and it was attributed to an Excel great John Walkenbach, so I will do the same. This subroutine gives you a basic outline of how you can create, modify, & delete a userform with just VBA code alone.

Sub CreateUserform()

‘PURPOSE: Create & Modify a Userform with VBA Code
‘AUTHOR: John Walkenbach (www.SpreadsheetPage.com)
‘SOURCE: www.TheSpreadsheetGuru.com

‘******************************************************************
‘NOTE: You need to set a reference to the extensibility add-in.
‘To do this, go to Tools -> References and find the add-in
‘Microsoft Visual Basic for Applications Extensibility 5.3
‘******************************************************************

Dim myUserform As Object
Dim FormName As String
Dim NewButton As MSForms.CommandButton
Dim TextLocation As Integer
Dim x As Integer

    ‘Locks Excel Spreadsheet and Speeds Up Form Processing
        Application.VBE.MainWindow.Visible = False
        Application.ScreenUpdating = False

        ‘Create a New UserForm
        Set myUserform = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)

        ‘Set Properties for Userform (aka: myUserform)
        With myUserform
            .Properties(«Caption») = «Temporary Form»
            .Properties(«Width») = 200
            .Properties(«Height») = 100
        End With

        FormName = myUserform.Name

    ‘Add a CommandButton and Modify it’s Properties
        Set NewButton = myUserform.Designer.Controls.Add(«forms.CommandButton.1»)
            With NewButton
                .Caption = «Click Me»
                .Left = 60
                .Top = 40
            End With

    ‘Add an event-hander Sub for your CommandButton
        With myUserform.CodeModule
            x = .CountOfLines
            .InsertLines x + 1, «Sub CommandButton1_Click()»
            .InsertLines x + 2, «MsgBox «»Hello!»»»
            .InsertLines x + 3, «Unload Me»
            .InsertLines x + 4, «End Sub»
        End With

    ‘Show This Form
        VBA.UserForms.Add(FormName).Show

    ‘Delete This Form
        ThisWorkbook.VBProject.VBComponents.Remove VBComponent:=myUserform

End Sub

Using VBA Code Found On The Internet

Now that you’ve found some VBA code that could potentially solve your Excel automation problem, what do you do with it? If you don’t necessarily want to learn how to code VBA and are just looking for the fastest way to implement this code into your spreadsheet, I wrote an article (with video) that explains how to get the VBA code you’ve found running on your spreadsheet.

Getting Started Automating Excel

Are you new to VBA and not sure where to begin? Check out my quickstart guide to learning VBA. This article won’t overwhelm you with fancy coding jargon, as it provides you with a simplistic and straightforward approach to the basic things I wish I knew when trying to teach myself how to automate tasks in Excel with VBA Macros.

Also, if you haven’t checked out Excel’s latest automation feature called Power Query, I have put together a beginner’s guide for automating with Excel’s Power Query feature as well! This little-known built-in Excel feature allows you to merge and clean data automatically with little to no coding!

How Do I Modify This To Fit My Specific Needs?

Chances are this post did not give you the exact answer you were looking for. We all have different situations and it’s impossible to account for every particular need one might have. That’s why I want to share with you: My Guide to Getting the Solution to your Problems FAST! In this article, I explain the best strategies I have come up with over the years to get quick answers to complex problems in Excel, PowerPoint, VBA, you name it

I highly recommend that you check this guide out before asking me or anyone else in the comments section to solve your specific problem. I can guarantee that 9 times out of 10, one of my strategies will get you the answer(s) you are needing faster than it will take me to get back to you with a possible solution. I try my best to help everyone out, but sometimes I don’t have time to fit everyone’s questions in (there never seem to be quite enough hours in the day!).

I wish you the best of luck and I hope this tutorial gets you heading in the right direction!

Chris
Founder, TheSpreadsheetGuru.com

malpropio


  • #1

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.

Thx

Advertisements

Guest


  • #2

In the code window, right-click on the user-form name in the left column and
select «Remove Userform».

Guest


  • #3

in the project explorer in the VBE, right click on you userform entry under
the appropriate workbook and select remove.

malpropio


  • #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.

malpropio

Guest


  • #5

You must right click on the form you want to remove, not just in the project
window.

Chip Pearson


  • #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

Sub DeleteForm()
Dim VBComps As VBIDE.VBComponents
Dim VBComp As VBIDE.VBComponent
Set VBComps = Workbooks(«Book1.xls»).VBProject.VBComponents
Set VBComp = VBComps(«UserForm1»)
VBComps.Remove VBComp
End Sub

See www.cpearson.com/excel/vbe.htm for more details and example code.


Cordially,
Chip Pearson
Microsoft MVP — Excel
Pearson Software Consulting, LLC
www.cpearson.com
(email address is on the web site)

Advertisements

Chip Pearson


  • #7

Or, simpler, without needing a library reference:

Sub DeleteForm()
With Workbooks(«Book1.xls»).VBProject.VBComponents
.Remove .Item(«UserForm1»)
End With
End Sub


Cordially,
Chip Pearson
Microsoft MVP — Excel
Pearson Software Consulting, LLC
www.cpearson.com
(email address is on the web site)

Advertisements

Tom Ogilvy


  • #8

I didn’t say to right click on the userform itself. Re read my post.

All actions are performed in the project explorer window (defaults to the
upper left of the VBE). You right click on the name of the Useform as
shown in the project explorer.

Want to reply to this thread or ask your own question?

You’ll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.


Ask a Question

Like this post? Please share to your friends:
  • Vba excel как убрать пробелы в строке
  • Vba excel как найти пустые строки
  • Vba excel как найти пустую ячейку
  • Vba excel как найти пустую строку
  • Vba excel как найти значение в столбце