如何处理 VBA 中的复选框值?
Posted
技术标签:
【中文标题】如何处理 VBA 中的复选框值?【英文标题】:How to handle Checkbox value in VBA? 【发布时间】:2017-04-20 01:34:00 【问题描述】:我有以下例子:
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
可以只在一个方向单击支票。这意味着,如果我第一次单击 checkboxOne,我将无法再次检查它。我需要做什么?
【问题讨论】:
你为什么不用OptionButtons? @Comintern 有什么区别? 一次只能选择一个组中的一个选项按钮,因此您不必担心确保只有一个被“选中”。它们旨在从组中选择一个选项 - 复选框不是。 【参考方案1】:由于您要求相互排除控制,因此您需要选项按钮
假设您将其中三个分别称为“OptionButton1”、“OptionButton2”和“”OptionButton3”,那么您将在 Userform 代码窗格中放置以下内容:
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
【讨论】:
【参考方案2】:您遇到的问题是在初始化复选框的值后,设置它的值将导致复选框的Click
和Change
事件触发。这会导致一个无限循环,从而有效地锁定复选框。
解决这个问题的方法是使用类变量在更新期间忽略对 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
【讨论】:
你不明白我的问题。用户应该有可能不仅一次检查复选框之一。这意味着例如用户单击checkboxOne
,然后当他单击checkboxTwo
时,第一个复选框将失去其值(设置为false)。好吧,当用户再次单击checkboxOne
时,第二个复选框会丢失其值,而第一个复选框会恢复值(设置为 true)。【参考方案3】:
这样的事情呢?
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
不太确定您是否真的希望禁用复选框,但使用 Checked
本身的值...
【讨论】:
每当用户打开表单时,所有复选框都设置为 false,因为用户需要知道需要检查哪一个。并且复选框不能被禁用。 嗯,好吧,调整了我的代码来做到这一点,但是:根据您的描述,您希望在打开表单时启用i.
,未选中复选框,并在用户单击复选框后禁用ii.
复选框一次。这意味着:根据定义,一旦它被锁定,复选框只能有.Value = Checked
...那么锁定它真的有意义吗?以上是关于如何处理 VBA 中的复选框值?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 MouseClick 事件中的 CheckBox?
如何处理 Android 运行时权限中的“不再询问”复选框?