Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用vba在模块中以编程方式创建表单_Vba_Excel - Fatal编程技术网

使用vba在模块中以编程方式创建表单

使用vba在模块中以编程方式创建表单,vba,excel,Vba,Excel,我想以编程方式使用VBA在模块中创建用户窗体。我是一个新手,没有经验,所以我尝试了几个例子,但它们不能满足我的要求 我只是想知道 使用VBA在模块内创建用户窗体 有一个包含一些数据的列表框 有一个带有侦听器的CommandButton 这是我使用的代码 Option Explicit Sub MakeuserForm() 'Dim CommandButton1 As MsForms.CommandBarButton 'Dim ListBox1 As MsForms.ListBox Dim

我想以编程方式使用VBA在模块中创建用户窗体。我是一个新手,没有经验,所以我尝试了几个例子,但它们不能满足我的要求

我只是想知道

  • 使用VBA在模块内创建用户窗体
  • 有一个包含一些数据的列表框
  • 有一个带有侦听器的CommandButton
这是我使用的代码

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和button,而只需要一个侦听器。

经过努力,我找到了一个非常简单的问题答案。也许对你也有帮助

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
Sub-CreateUserForm()
将myForm设置为对象
将新帧调整为MSForms.Frame
将新按钮设置为MSForms.CommandButton
'将对话框设置为MSForms.ComboBox
将NewListBox设置为MSForms.ListBox
'将NewTextBox设置为MSForms.TextBox
'将新标签设置为MSForms.Label
'将NewOptionButton暗显为MSForms.OptionButton
'将NewCheckBox设置为MSForms.CheckBox
作为整数的Dim X
将线变暗为整数
'这是为了在创建表单时停止屏幕闪烁
Application.VBE.MainWindow.Visible=False
设置myForm=ThisWorkbook.VBProject.VBComponents.Add(3)
'创建用户窗体
用我的表格
.Properties(“标题”)=“新表格”
.属性(“宽度”)=300
.物业(“高度”)=270
以
'创建列表框
Set NewListBox=myForm.designer.Controls.Add(“Forms.listbox.1”)
使用NewListBox
.Name=“lst_1”
.Top=10
.左=10
.宽度=150
.高度=230
.Font.Size=8
.Font.Name=“Tahoma”
.BorderStyle=fmborderstyle不透明
.SpecialEffect=FmSpecialEffect凹陷
以
'创建命令按钮创建
Set NewButton=myForm.designer.Controls.Add(“Forms.commandbutton.1”)
纽扣
.Name=“cmd_1”
.Caption=“单击我”
.Accelerator=“M”
.Top=10
.左=200
.宽度=66
.高度=20
.Font.Size=8
.Font.Name=“Tahoma”
.BackStyle=fmbackstyle
以
'为列表框添加代码
lstBoxData=“数据1、数据2、数据3、数据4”
myForm.codemodule.insertlines 1,“私有子用户表单_初始化()
myForm.codemodule.insertlines 2,“me.lst_1.addItem”“数据1”
myForm.codemodule.insertlines 3,“me.lst_1.addItem”“数据2”
myForm.codemodule.insertlines 4,“me.lst_1.addItem”“数据3”
myForm.codemodule.insertlines 5,“结束子”
'为Comand按钮添加代码
myForm.codemodule.insertlines 6,“专用子命令\u 1\u单击()
myForm.codemodule.insertlines 7,“如果me.lst_1.text”“”“,则”
myForm.codemodule.insertlines 8,“msgbox”(“您选择的项目:”&me.lst_1.text)”
myForm.codemodule.insertlines 9,“如果结束”
myForm.codemodule.insertlines 10,“结束子”
“出示表格
VBA.UserForms.Add(myForm.Name).Show
'删除表单(可选)
'ThisWorkbook.VBProject.VBComponents.Remove myForm
端接头

发布您尝试过的内容,并请阅读常见问题解答。这不是一个获取快速答案的地方,而是一个学习的地方。像这样动态地创建整个表单通常不会像你想象的那样成功。除非你真的无法创建一个通用版本,至少是某种框架,否则这将是一个大量不必要的工作。请解释为什么需要动态创建表单。除非您有特殊需要,否则正如前面所解释的,这是一项艰巨的工作。我想动态创建它,只是因为我想创建一个加载项,以便其他用户可以轻松地将该加载项导入Excel工作表中。((如果我创建了用户表单,那么他们可能还必须创建一个用户表单才能使用我的加载项。)使用
NewFrame
?注意,命令按钮需要一个事件处理程序,因此必须使用
insertlines
硬编码。但是,
UserForm\u Initialize
例程中的任何内容实际上都可能介于
VBA.UserForms.Add(myForm.Name)
Show
之间。因此,为了填充列表,
设置newUf=VBA.UserForms.Add(myForm.Name)
,然后在对象列表上循环执行
newUf.lst_1.addItem
比将代码硬编码为字符串容易得多。最后
newUf.Show
once all setup