【问题标题】:Detect if a Form Control option button is selected in VBA检测是否在 VBA 中选择了表单控件选项按钮
【发布时间】:2015-08-19 21:32:02
【问题描述】:

我有一个使用 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 那样方便的“右键单击 > 属性”

【问题讨论】:

  • 哇,我应该看到了。抱歉...现在我该如何引用这个按钮(假设我将其命名为“我的选项按钮 1”?这不起作用:'如果 Sheet1."我的选项按钮 1"= True Then (action1) End If '
  • 你能告诉我你是在用户表单中创建所有内容还是在 Excel 表中使用表单控件
  • 我在 Excel 工作表中使用表单控件。您的答案和 L42 都帮助我弄清楚了,谢谢!

标签: vba excel form-control radio-button


【解决方案1】:

您应该从所有选项按钮中删除.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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 非常感谢@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
    • 当你点击命令按钮时你得到什么样的错误信息。
    • "Compile error Method or Data not found",如果您想看一下,我实际上编辑了我的原始问题,并提供了更多详细信息。谢谢@Sai Nishank!!
    • 使用 If ActiveSheet.Shapes("Option4").OLEFormat.Object.Value = 1 Then 'Range("B39").Value = "what I want to set this cell to" End If 也可以在 2010 年之前的 Excel 版本 2007 VBA 宏脚本中使用 - 旧版本不支持到处提到的快捷方式 Option4.Value = True。花了我几个小时才找到这篇文章,谢谢@L42。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 2019-08-11
    • 2014-04-09
    • 2016-09-26
    相关资源
    最近更新 更多