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

Ett*_*aiv 4 excel vba excel-vba radio-button form-control

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

    Sub OptionButton1_Click
    If OptionButton1.Value = true then
        (action...)
    End if
    End sub
Run Code Online (Sandbox Code Playgroud)

我一直在尝试在Google上找到Form Controls的等价物,但每次我得到一个:

对象必需的错误

非常感谢你的答案@ L42和@Sai Nishank!现在如果我想检查OptionButton_Click,如果其他组中的选项按钮为真,该怎么办?我尝试了这种语法,但我收到一条错误消息:"编译错误方法或数据未找到"

    Sub USDButton_Click()
    MsgBox "USD"
    If Sheet1.BTUButton = True Then
    (action1)
    End If
     If Sheet1.kWhButton = True Then
    (action2)
     End If
Run Code Online (Sandbox Code Playgroud)

我不确定BTUButton是否是正确的按钮名称,但我不在哪里检查,表单控件没有那么方便的"右键单击>属性",如ActiveX

L42*_*L42 8

如果您使用的是Form Control,你可以得到相同的财产ActiveX利用OLEFormat.Object的特性Shape Object.更好的是将它分配给声明为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
Run Code Online (Sandbox Code Playgroud)

但话说回来,你真的不需要知道它的价值.
如果使用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
Run Code Online (Sandbox Code Playgroud)

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


Nis*_*ank 4

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

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

例子:

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

Sub OptionButton1_Click   
    (action code...)
End sub
Run Code Online (Sandbox Code Playgroud)