Создание формы программно в модуле с использованием vba

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

Я просто хочу макрос, который

creates a user form within a module using VBA has a ListBox with some data has a CommandButton with a listener

Вот код, который я использовал

Option Explicit

Sub MakeuserForm()
'Dim CommandButton1 As MsForms.CommandBarButton
'Dim ListBox1 As MsForms.ListBox
Dim UserForm1 As VBComponent

Set UserForm1 = ActiveWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
With UserForm1
.Properties("Height") = 100
.Properties("Width") = 200
On Error Resume Next
.Name = "My Form"
.Properties("Caption") = "This is your user form"
End With
ShowForm
End Sub

Sub ShowForm() 
NewForm.Show 
End Sub 

Теперь я не знаю, как добавить ListBox и кнопку в форму со слушателем.

 Brad17 июл. 2012 г., 15:07
Динамическое создание целых форм, подобных этому, обычно не работает так, как вы думаете. Если вы действительно не в состоянии сделать общую версию, по крайней мере, какой-то скелет, это будет чертовски много ненужной работы.
 JimmyPena17 июл. 2012 г., 15:52
Пожалуйста, объясните, почему форму необходимо создавать на лету. Если у вас нет особых потребностей, какBrad объяснил это много работы.
 Alistair Weir17 июл. 2012 г., 11:48
Опубликуйте информацию о том, что вы пробовали, и, пожалуйста, прочитайте часто задаваемые вопросы.stackoverflow.com/faq, Это не место для получения быстрых ответов, это место для обучения.
 IConfused18 июл. 2012 г., 14:14
я хочу сделать это динамически только потому, что хочу создать надстройку, чтобы другие пользователи могли легко импортировать это дополнение в свой лист Excel. ((Если я создаю пользовательскую форму, им также может понадобиться создать пользовательскую форму, чтобы использовать мой Addin.))
 IConfused17 июл. 2012 г., 11:58
Обновил вопрос

Ответы на вопрос(1)

Решение Вопроса

После тяжелой работы я нашел очень простой ответ на свой вопрос. Может помочь вам тоже.

Sub CreateUserForm()
Dim myForm As Object
Dim NewFrame As MSForms.Frame
Dim NewButton As MSForms.CommandButton
'Dim NewComboBox As MSForms.ComboBox
Dim NewListBox As MSForms.ListBox
'Dim NewTextBox As MSForms.TextBox
'Dim NewLabel As MSForms.Label
'Dim NewOptionButton As MSForms.OptionButton
'Dim NewCheckBox As MSForms.CheckBox
Dim X As Integer
Dim Line As Integer

'This is to stop screen flashing while creating form
Application.VBE.MainWindow.Visible = False

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

'Create the User Form
With myForm
    .Properties("Caption") = "New Form"
    .Properties("Width") = 300
    .Properties("Height") = 270
End With

'Create ListBox
Set NewListBox = myForm.designer.Controls.Add("Forms.listbox.1")
With NewListBox
    .Name = "lst_1"
    .Top = 10
    .Left = 10
    .Width = 150
    .Height = 230
    .Font.Size = 8
    .Font.Name = "Tahoma"
    .BorderStyle = fmBorderStyleOpaque
    .SpecialEffect = fmSpecialEffectSunken
End With

'Create CommandButton Create
Set NewButton = myForm.designer.Controls.Add("Forms.commandbutton.1")
With NewButton
    .Name = "cmd_1"
    .Caption = "clickMe"
    .Accelerator = "M"
    .Top = 10
    .Left = 200
    .Width = 66
    .Height = 20
    .Font.Size = 8
    .Font.Name = "Tahoma"
    .BackStyle = fmBackStyleOpaque
End With

'add code for listBox
lstBoxData = "Data 1,Data 2,Data 3,Data 4"
myForm.codemodule.insertlines 1, "Private Sub UserForm_Initialize()"
myForm.codemodule.insertlines 2, "   me.lst_1.addItem ""Data 1"" "
myForm.codemodule.insertlines 3, "   me.lst_1.addItem ""Data 2"" "
myForm.codemodule.insertlines 4, "   me.lst_1.addItem ""Data 3"" "
myForm.codemodule.insertlines 5, "End Sub"

'add code for Comand Button
myForm.codemodule.insertlines 6, "Private Sub cmd_1_Click()"
myForm.codemodule.insertlines 7, "   If me.lst_1.text <>"""" Then"
myForm.codemodule.insertlines 8, "      msgbox (""You selected item: "" & me.lst_1.text )"
myForm.codemodule.insertlines 9, "   End If"
myForm.codemodule.insertlines 10, "End Sub"
'Show the form
VBA.UserForms.Add(myForm.Name).Show

'Delete the form (Optional)
'ThisWorkbook.VBProject.VBComponents.Remove myForm
End Sub
 01 окт. 2014 г., 12:24
Что сNewFrame?
 22 мар. 2018 г., 18:17
Примечание: для командной кнопки требуется обработчик событий, поэтому ее нужно жесткоinsertlines, Однако что-нибудь вUserForm_Initialize рутина может на самом деле встать междуVBA.UserForms.Add(myForm.Name) а такжеShow, Так что для заполнения списка,Set newUf = VBA.UserForms.Add(myForm.Name)затем переберите список объектов,newUf.lst_1.addItem это намного проще, чем жестко кодировать код в виде строк. в заключениеnewUf.Show как только все настроено

Ваш ответ на вопрос