8

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

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

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

对象需要错误

非常感谢@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

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

4

2 回答 2

13

如果您使用的是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

但话又说回来,你真的不需要知道价值。
如果使用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
这样就不需要检查选项按钮的值是真还是假。

于 2015-06-05T05:17:05.060 回答
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
于 2015-06-05T03:55:07.523 回答