通过命令按钮动态复选框事件

时间:2015-12-11 15:02:37

标签: excel vba excel-vba checkbox userform

我目前正在编写一张可以在图表中显示数据集的工作表。因为此工作表的用户不需要所有图表,所以我想让他们通过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

当填写UserForm时(通过单击选项选择图形),用户将按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

我被困在这一部分。复选框确实显示在UserForm上,并且它们是可单击的,但命令按钮仅关闭子(Unload Me)。当我选择相应的选项并单击命令按钮时,我希望看到MsgBox显示。任何有关让这个工作的帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

您在sub中引用了'A1',但该变量在编译时没有退出,因为您动态添加它们。你需要做的是循环控件,检查名称。最佳做法是将复选框放在框架中,以便对它们进行分组。 将一个框架添加到用户窗体并将其命名为“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

答案 1 :(得分:0)

没有出现的原因是因为没有对象“A1”被手动定义为变量。

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

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

希望这有帮助!