【问题标题】:How to pass the value (true/false) of checkboxes created run-time on a userform如何传递在用户窗体上创建的运行时复选框的值(真/假)
【发布时间】:2013-02-04 21:16:16
【问题描述】:

在读取 Excel 工作表中的所有非空行后,我试图在用户窗体上创建多个复选框。这意味着这些复选框必须在运行时创建。我还想在用户窗体上放置一个命令按钮。我想要的是,一旦用户按下此命令按钮,代码应该能够向子例程发送有关选中哪些复选框及其名称的信息。

谁能帮我解决问题。

【问题讨论】:

  • 到目前为止您尝试了哪些方法,遇到了什么问题?发布您当前的代码(即使它不起作用)总是会给您更多帮助。现在你所拥有的只是一个要求。

标签: dynamic excel checkbox vba


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    与其尝试在用户窗体上动态创建复选框(我什至不确定是否可行),不如考虑使用 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
    

    【讨论】:

    • 可以动态添加表单控件 )Me.Controls.Add "Forms.CheckBox.1", "CheckBox1", True),但它是一个 PITA,我绝对会避免它以支持您的提议。使用像 ListBox 这样的动态控件总是比尝试管理内存中的临时控件更好。
    • 感谢@David,很高兴知道动态方式是可能的!如果列表框方法不适用于操作,也许值得将其作为单独的答案包含在内?
    猜你喜欢
    • 2015-05-07
    • 2016-09-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多