Vba 通过commandbutton动态复选框事件
我目前正在编写一个表格,以图形的形式显示数据集。因为此工作表的用户不需要所有的图形,所以我想让他们通过UserForm选择所需的图形。由于数据集的数量是可变的,因此UserForm将具有与数据集相同数量的复选框 Userform代码如下所示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
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,然后将复选框添加到该框架中。给我一分钟为你编辑我的答案完美!简单,正是我想要的,谢谢!