检测是否在 VBA 中选择了表单控件选项按钮

Detect if a Form Control option button is selected in VBA

我有一个代码可以使用 ActiveX 选项按钮正常工作。但是,我也希望在 Mac 上使用 运行 的宏,因此我试图用表单控件替换我的 ActiveX 控件。使用 ActiveX,为了检查我的两个选项按钮之一是否被选中,我所要做的就是:

    Sub OptionButton1_Click
    If OptionButton1.Value = true then
        (action...)
    End if
    End sub

我一直在尝试为 Google 上的表单控件找到一个等效项,但每次我得到一个:

Object required error

非常感谢@L42 和@Sai Nishank 的回答!如果其他组的选项按钮为 true,现在我想检查 OptionButton_Click 怎么办?我尝试了这种语法,但收到一条错误消息:"Compile error Method or Data not found"

    Sub USDButton_Click()
    MsgBox "USD"
    If Sheet1.BTUButton = True Then
    (action1)
    End If
     If Sheet1.kWhButton = True Then
    (action2)
     End If

我不确定 BTUButton 是否是按钮的正确名称,但我不知道去哪里检查,表单控件不像 ActiveX

那样方便 "Right Click > Properties"

您应该从所有选项按钮中删除 .Value,因为选项按钮不保存结果值,选项组控件保存。如果您省略 .Value 那么默认界面将报告选项按钮状态,正如您所期望的那样。您应该在 commandbutton_click 事件下编写所有相关代码,因为无论何时单击命令按钮,选项按钮操作都会 运行.

如果您想 运行 在单击选项按钮时执行操作代码,那么不要为此编写 if 循环。

示例:

Sub CommandButton1_Click
    If OptionButton1 = true then
        (action code...)
    End if
End sub

Sub OptionButton1_Click   
    (action code...)
End sub

如果您使用的是 Form Control,您可以使用 Shape ObjectOLEFormat.Object 属性 获得与 ActiveX 相同的 属性 ].最好将它分配到声明为 OptionButton 的变量中,以启动 Intellisense

Dim opt As OptionButton

With Sheets("Sheet1") ' Try to be always explicit
    Set opt = .Shapes("Option Button 1").OLEFormat.Object ' Form Control
    Debug.Pring opt.Value ' returns 1 (true) or -4146 (false)
End With

不过话又说回来,你真的不需要知道这个值。
如果您使用 Form Control,则会将 Macro 或子例程与其关联,并在选择时执行。所以你只需要设置一个子例程来识别点击了哪个按钮,然后为它执行相应的动作。

例如,您有 2 个 Form Control 选项按钮。

Sub CheckOptions()
    Select Case Application.Caller
    Case "Option Button 1"
    ' Action for option button 1
    Case "Option Button 2"
    ' Action for option button 2
    End Select
End Sub

在上面的代码中,您只有一个子例程分配给两个选项按钮。
然后通过检查 Application.Caller.
来测试哪个调用了子例程 这样就不用去检查option按钮的值是true还是false了。