为什么我不能在VBA中向OptionButton发送参数

3

我在VBA中有以下函数:

Private Function Option1Checked(option1 As OptionButton) As Integer
    option1.ForeColor = vbGreen
    If (option1.Value = True) Then
        Option1Checked = 1
    End If
    Option1Checked = 0
End Function

每当我尝试像这样调用函数
counter = counter + Option1Checked(OptionButton1)

我在运行时遇到了类型不匹配的错误。但是OptionButton1是一个OptionButton,那么我做错了什么?
2个回答

4
你在这里遇到了VBA的一个“特性”。如果你引用一些对象,比如选项按钮,在没有指定属性的情况下,VBA会假设你想要默认属性,而不是对象本身。在选项按钮的情况下,默认属性是.Value,所以在你的代码中,OptionButton1不是选项按钮对象,而是TRUE或FALSE,具体取决于OptionButton1是否被选中。
你最好将你的函数更改为以下内容:
Private Function Option1Checked(option1 As Boolean) As Integer
    //option1.ForeColor = vbGreen
    If (option1 = True) Then
        Option1Checked = 1
    Else
        Option1Checked = 0
    End If
End Function

这里的缺点是,如果不使用名称引用选项按钮,就无法将其前景颜色更改为绿色。另一个选择是将选项按钮的名称传递给您的函数,以获得所需的功能。
Private Function Option1Checked(ByVal option1 As String) As Integer
    UserForm1.Controls(option1).ForeColor = vbGreen
    If (UserForm1.Controls(option1) = True) Then
        Option1Checked = 1
    Else
        Option1Checked = 0
    End If
End Function

Sub MyCountingRoutine()
    Dim str As String
    str = OptionButton1.Name

   counter = counter + Option1Checked(str)
End Sub

确保在函数的If..Then语句中包含Else,否则您将始终得到0。


计数器必须声明为公共变量,否则它的生命周期将随着“End Sub”的结束而结束。 - MikeD
@MikeD,计数器不一定要声明为Public。它只需要声明为比Sub MyCountingRoutine()更大的范围即可。这就是为什么在示例代码中它没有在该程序中声明的原因。 - Stewbob

0

将控件类型以“MSForms.”为前缀,将传递对象而不是其默认值;对于您的示例

Private Function Option1Checked(option1 As MSForms.OptionButton) As Integer

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