如何在userform上传递创建运行时的复选框的值(true / false)

时间:2013-02-20 00:28:09

标签: excel dynamic excel-vba checkbox vba

我正在尝试在读取Excel工作表中的所有非空行后在UserForm上创建许多复选框。这意味着必须在运行时创建这些复选框。我还想在UserForm上放置一个CommandButton。我想要的是,一旦用户按下这个CommandButton,代码应该能够向子例程发送检查哪些复选框以及它们的名称是什么的信息。

任何人都可以帮我解决问题。

2 个答案:

答案 0 :(得分:1)

不要试图动态创建用户窗体上的复选框(我甚至不确定是否可行),而是考虑使用列表框,其中ListStyle为fmListStyleOption,并且使用fmMultiSelectMulti打开MultiSelect

使用AddItem方法填充列表框

For i = 0 to 9
  Me.lbxDivisions.AddItem
  Me.lbxDivisions.List(i) = "Checkbox " & format(i)
Next i

并确定通过Selected属性检查哪些项目:

For i = 0 To lbxDivisions.ListCount - 1
  If lbxDivisions.Selected(i) Then
    MsgBox "Item " & Format(i) & " is selected and has value " & lbxDivisions.List(i)
  End If
Next i

答案 1 :(得分:0)

您可以以编程方式将表单控件(复选框,列表框等)添加到用户表单。从表单的代码模块中,

Me.Controls.Add "Forms.CheckBox.1", "CheckBox1", True)

从任何其他代码模块,只需按名称引用表单,而不是Me,例如

MyUserForm.Controls.Add "Forms.CheckBox.1", "CheckBox1", True)

我个人赞成使用更动态的控件(如列表框或组合框),除非你的任务绝对要求你使用复选框。使用动态控件,您需要管理它们的大小,相对于其他控件的位置,调整用户窗体的大小(如果需要)等,尽管可以将事件处理添加到这些控件(see here),这是真的有限的(例如,如果你希望你需要添加10个复选框,每个复选框都做不同的事情,你需要预先编写10个复选框子程序。如果你创建11个复选框但只有10个预先写好的例程,最后一个检查框不会做任何事情。在设计表单时创建所有复选框会更容易,然后根据情况需要以编程方式将它们设置为Visible=TrueVisible=False

所以,我倾向于使用像列表框或组合框这样的动态控件,但 可以在运行时添加复选框等表单控件,如果必须的话。