可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a code that work just fine using ActiveX option buttons. However, I want the macro to run on a Mac as well so I am trying to replace my ActiveX controls with form controls. With ActiveX, all I had to do in order to check if one of my two option buttons was selected is:
Sub OptionButton1_Click If OptionButton1.Value = true then (action...) End if End sub
I have been trying to find an equivalent for Form Controls on Google but each time I get an:
Object required error
Thank you very much for your answers @L42 and @Sai Nishank! Now what if I want to check in an OptionButton_Click if an option button from an other group is true ? I tried this syntax but I get an error message : "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
I am not sure if BTUButton is the correct name of the button, but I don't where to check, form controls don't have that handy "Right Click > Properties" like ActiveX
回答1:
You should remove .Value
from all option buttons because option buttons don't hold the resultant value, the option group control does. If you omit .Value
then the default interface will report the option button status, as you are expecting. You should write all relevant code under commandbutton_click events because whenever the commandbutton is clicked the option button action will run.
If you want to run action code when the optionbutton is clicked then don't write an if loop for that.
EXAMPLE:
Sub CommandButton1_Click If OptionButton1 = true then (action code...) End if End sub Sub OptionButton1_Click (action code...) End sub
回答2:
If you are using a Form Control
, you can get the same property as ActiveX
by using OLEFormat.Object
property of the Shape Object
. Better yet assign it in a variable declared as OptionButton to get the Intellisense kick in.
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
But then again, you really don't need to know the value.
If you use Form Control
, you associate a Macro
or sub routine with it which is executed when it is selected. So you just need to set up a sub routine that identifies which button is clicked and then execute a corresponding action for it.
For example you have 2 Form Control
Option Buttons.
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
In above code, you have only one sub routine assigned to both option buttons.
Then you test which called the sub routine by checking Application.Caller
.
This way, no need to check whether the option button value is true or false.