如何处理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的Click
和Change
事件触发。 这会导致一个无限循环,有效地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
将代码放在它所在的工作表中。