检测是否在 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 Object
的 OLEFormat.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了。
我有一个代码可以使用 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 Object
的 OLEFormat.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了。