如何处理 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】:

您遇到的问题是在初始化复选框的值后,设置它的值将导致复选框的ClickChange 事件触发。这会导致一个无限循环,从而有效地锁定复选框。

解决这个问题的方法是使用类变量在更新期间忽略对 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 运行时权限中的“不再询问”复选框?

如何处理 Oracle APEX 报告中的复选框项目?

如何处理带有不确定复选框的浏览器差异

在 Rails 中,如何处理多个选中的复选框,只在 , 或?

在 Selenium Webdriver 如何处理这种包含复选框的多选下拉列表