如何处理VBA中的checkbox值?

我有以下例子:

Private Sub setCheck(ByVal val1 As Boolean, ByVal val2 As Boolean, ByVal val3 As Boolean) With userForm1 .checkboxOne.Value = val1 .checkboxTwo.Value = val2 .checkboxThree.Value = val3 End With End Sub Private Sub checkboxOne_Change() Call setCheck(True, False, False) End Sub Private Sub checkboxTwo_Change() Call setCheck(False, True, False) End Sub Private Sub checkboxThree_Change() Call setCheck(False, False, True) End Sub 

只能在一个方向上点击支票。 这意味着,如果我第一次点击checkbox,我无法再次检查它。 我需要做什么?

你有问题是checkbox的值被初始化后设置它的值会导致checkbox的ClickChange事件触发。 这会导致一个无限循环,有效地lockingcheckbox。

在这里输入图像说明

解决方法是在更新期间使用类variables忽略对setCheck的后续调用。

 Private EditMode As Boolean Private Sub setCheck(ByVal val1 As Boolean, ByVal val2 As Boolean, ByVal val3 As Boolean) If Not EditMode Then EditMode = True With UserForm1 .checkboxone.Value = val1 .checkboxtwo.Value = val2 .checkboxthree.Value = val3 End With EditMode = False End If End Sub Private Sub checkboxOne_Change() setCheck True, False, False End Sub Private Sub checkboxTwo_Change() setCheck False, True, False End Sub Private Sub checkboxThree_Change() setCheck False, False, True End Sub 

这样的事情呢?

 Private Sub chkbx1_Click() chkbx1.Enabled = False chkbx1.Value = Checked End Sub Private Sub Form_Load() Dim ctrl As Control ' reset it whenever you open the form. this could also be defined separately in the F4-properties of the checkbox For Each ctrl In Me.Controls If TypeName(ctrl) = "CheckBox" Then ctrl.Enabled = True ctrl.Value = False End If Next ctrl End Sub 

不太确定,如果你真的想checkbock禁用,但本身Checked值…

既然你要求互斥控制,你需要选项button

说你把他们三个名为“OptionButton1”,“OptionButton2”和“”OptionButton3“,那么你会把下面的用户窗体代码窗格中:

 Option Explicit Private Sub OptionButton1_Click() CheckOBs End Sub Private Sub OptionButton2_Click() CheckOBs End Sub Private Sub OptionButton3_Click() CheckOBs End Sub Sub CheckOBs() Dim iOB As Integer For iOB = 1 To CInt(Right(ActiveControl.Name, 1)) Controls("OptionButton" & iOB).Enabled = False Next iOB End Sub 

让我们说你的checkbox是checkboxOne然后像这样的东西将启用它永远,一旦启用:

 Private Sub checkboxOne_Click() If Me.checkboxOne Then 'code something here Else Me.checkboxOne = True End If End Sub 

将代码放在它所在的工作表中。