在VBA中检测表单控件单选按钮是否被选中

8

我有一段代码,使用ActiveX选项按钮可以正常工作。但是,我希望该宏也能在Mac上运行,因此我正在尝试用表单控件替换我的ActiveX控件。使用ActiveX时,我只需要执行以下操作即可检查是否选择了我的两个选项按钮之一:

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

我一直在尝试在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

我不确定BTUButton是否是该按钮的正确名称,但我不知道在哪里检查,表单控件没有像ActiveX那样方便的“右键单击>属性”。


哇,我应该看到那个的。抱歉...现在我该如何引用这个按钮(假设我将其命名为“我的选项按钮1”)?这样不行:'如果 Sheet1."My Option Button 1"= True Then (action1) End If' - Ettelaiv
你能告诉我,你是在用户窗体中创建所有内容还是在 Excel 工作表中使用表单控件吗? - Nishank
我正在使用Excel表格中的表单控件。你和L42的回答都帮助我解决了问题,谢谢! - Ettelaiv
2个回答

15
如果您正在使用表单控件,您可以通过使用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

但再说一遍,你实际上不需要知道这个值。
如果使用 表单控件,则将与其关联一个或子例程,在其被选中时执行。因此,您只需设置一个子例程,以识别点击的是哪个按钮,然后执行相应的操作即可。

例如,您有2个表单控件选项按钮。

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来测试哪个调用了子程序。 这样,就不需要检查选项按钮的值是真还是假。

非常感谢@L42和@Sai Nishank的回答!现在,如果我想在OptionButton_Click中检查另一个组的选项按钮是否为true,该怎么办?我尝试了这个语法,但是我收到了一个错误消息: Sub USDButton_Click() MsgBox "USD" If Sheet1.BTUButton = True Then (action1) End If If Sheet1.kWhButton = True Then (action2) End If - Ettelaiv
当您点击命令按钮时,您收到了什么样的错误消息? - Nishank
1
编译错误,找不到方法或数据。如果您愿意,请查看我实际上编辑了我的原始问题并提供了更多细节。谢谢@Sai Nishank! - Ettelaiv
1
使用 If ActiveSheet.Shapes("Option4").OLEFormat.Object.Value = 1 Then 'Range("B39").Value = "what I want to set this cell to" End If 在2007年的VBA宏脚本中也可以工作,甚至在早期版本的Excel中都支持该快捷方式 Option4.Value = True,这一点在各处都有提到。我花了几个小时才找到这篇文章,感谢@L42。 - Max

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接