Vba 通过commandbutton动态复选框事件

Vba 通过commandbutton动态复选框事件,vba,excel,checkbox,userform,Vba,Excel,Checkbox,Userform,我目前正在编写一个表格,以图形的形式显示数据集。因为此工作表的用户不需要所有的图形,所以我想让他们通过UserForm选择所需的图形。由于数据集的数量是可变的,因此UserForm将具有与数据集相同数量的复选框 Userform代码如下所示 Private Sub UserForm_Initialize() Dim chkBoxA As MSForms.CheckBox Dim chkBoxB As MSForms.CheckBox Dim lblBox As MSF

我目前正在编写一个表格,以图形的形式显示数据集。因为此工作表的用户不需要所有的图形,所以我想让他们通过UserForm选择所需的图形。由于数据集的数量是可变的,因此UserForm将具有与数据集相同数量的复选框

Userform代码如下所示

Private Sub UserForm_Initialize()

Dim chkBoxA     As MSForms.CheckBox
Dim chkBoxB     As MSForms.CheckBox
Dim lblBox      As MSForms.Label
Dim cnt         As Control

Amount = Sheet4.Range("C4").Value 'Amount of datasets

For i = 1 To Amount
    Set lblBox = Me.Controls.Add("Forms.label.1", "Label" & i)
        lblBox.Caption = "Set" & i
        lblBox.Left = 5
        lblBox.Top = 8 + ((i - 1) * 40)
    Set chkBoxA = Me.Controls.Add("Forms.CheckBox.1", "A" & i)
        chkBoxA.Caption = "Graph a"
        chkBoxA.Left = 55
        chkBoxA.Top = 5 + ((i - 1) * 40)
    Set chkBoxB = Me.Controls.Add("Forms.CheckBox.1", "B" & i)
        chkBoxB.Caption = "Graph b"
        chkBoxB.Left = 55
        chkBoxB.Top = 20 + ((i - 1) * 40)
Next

CommandButton1.Left = 20
CommandButton1.Top = 40 + ((Amount - 1) * 40)
CommandButton1.TabIndex = Amount * 3 + 1

Me.Height = 220

Me.ScrollBars = fmScrollBarsVertical
Me.ScrollWidth = Me.InsideWidth * 9
For Each cnt In Me.Controls
    If cnt.Top + cnt.Height > Me.ScrollHeight Then
        Me.ScrollHeight = cnt.Top + cnt.Height + 5
    End If
Next

End Sub
填写用户表单时(通过单击选项选择图形),用户将按CommandButton1。然后应该运行一个事件来显示正确的图形,但是为了简单起见,我首先测试是否会显示MsgBox。不幸的是,
MsgBox
没有显示

Private Sub CommandButton1_Click()
'Will fix this with a loop
If A1 = True Then
    MsgBox ("TestA1")
End If
If B1 = True then
    MsgBox ("TestB1")
End If
If A2 = True then
    MsgBox ("TestA2")
End If

Unload Me

End Sub

我被这部分卡住了。复选框确实会显示在用户窗体上,并且可以单击,但是commandbutton只会关闭子组件(
卸载我
)。当我选择相应的选项并单击commandbutton时,我希望看到
MsgBox
显示。我们非常感谢您的帮助

您正在子中引用'A1',但该变量在编译时不存在,因为您是动态添加它们的。您需要做的是循环控件,以检查名称。最佳实践是将复选框放在一个框架中,以便能够对它们进行分组。 向userform添加一个框架,并将其命名为“checkboxframe”

而不是:

For i = 1 To Amount
    Set lblBox = Me.Controls.Add("Forms.label.1", "Label" & i)
        lblBox.Caption = "Set" & i
        lblBox.Left = 5
        lblBox.Top = 8 + ((i - 1) * 40)
    Set chkBoxA = Me.Controls.Add("Forms.CheckBox.1", "A" & i)
        chkBoxA.Caption = "Graph a"
        chkBoxA.Left = 55
        chkBoxA.Top = 5 + ((i - 1) * 40)
    Set chkBoxB = Me.Controls.Add("Forms.CheckBox.1", "B" & i)
        chkBoxB.Caption = "Graph b"
        chkBoxB.Left = 55
        chkBoxB.Top = 20 + ((i - 1) * 40)
Next
您需要执行以下操作:

With Me.checkboxframe
    For i = 1 To Amount
        Set lblBox = .Controls.Add("Forms.label.1", "Label" & i)
            lblBox.Caption = "Set" & i
            lblBox.Left = 5
            lblBox.Top = 8 + ((i - 1) * 40)
        Set chkBoxA = .Controls.Add("Forms.CheckBox.1", "A" & i)
            chkBoxA.Caption = "Graph a"
            chkBoxA.Left = 55
            chkBoxA.Top = 5 + ((i - 1) * 40)
        Set chkBoxB = .Controls.Add("Forms.CheckBox.1", "B" & i)
            chkBoxB.Caption = "Graph b"
            chkBoxB.Left = 55
            chkBoxB.Top = 20 + ((i - 1) * 40)
    Next
End With
要将复选框添加到框架中,请使用以下方法:

For Each ctr In UserForm1.frame("checkboxframe").Controls
    If TypeName(ctr) = "CheckBox" Then
        If ctr.Value = True Then
            'do something usefull here
            msgbox ctr.name
        End If
    End If
Next ctr

没有显示的原因是没有对象“A1”手动定义为变量

要获取动态命名为“A1”的框的值,必须将其引用为:

If Me.Controls.Item("A1").Value = True then

希望这有帮助

谢谢你的回答!不幸的是,我在
UserForm1.Frame(“复选框”).Controls上遇到了一个错误:“编译错误:找不到方法或数据成员”。是的,在我的伪代码中,我使用了我所说的框架。您需要首先将其添加到Userform,然后将复选框添加到该框架中。给我一分钟为你编辑我的答案完美!简单,正是我想要的,谢谢!