Vba 为UserForm控件名生成具有For Next循环值的字符串

Vba 为UserForm控件名生成具有For Next循环值的字符串,vba,excel,for-loop,userform,Vba,Excel,For Loop,Userform,我正在努力建立价值观 If UserForm1.p1OptionButton.Value = True 其中p1OptionButton中的1是For Next循环计数器的值,但无论我如何尝试构造它,都会出现错误。如果我使用 Dim iPart As Integer For iPart = 1 to 6 If "UserForm1.p" & iPart & "OptionButton.Value" = True .... blah blah blah rest of the c

我正在努力建立价值观

If UserForm1.p1OptionButton.Value = True
其中p1OptionButton中的1是For Next循环计数器的值,但无论我如何尝试构造它,都会出现错误。如果我使用

Dim iPart As Integer
For iPart = 1 to 6
If "UserForm1.p" & iPart & "OptionButton.Value" = True
.... blah blah blah rest of the code
Next iPart
我得到这个错误:

运行时错误13类型不匹配

如果我在字符串的其他部分省略“out”,它也不起作用


感谢您的帮助。

我相信您正在尝试将字符串与布尔值进行比较,因此它不会以您希望的方式工作。如果您希望它工作得更好,您可以做一些类似的事情,只需查看每个可能的值(即UserForm1.p1OptionButton.value、UserForm1.p2OptionButton.value等)

我认为您试图将字符串与布尔值进行比较,因此它不会按照您希望的方式工作。如果您希望它工作得更好,您可以做一些类似的事情,只需查看每个可能的值(即UserForm1.p1OptionButton.value、UserForm1.p2OptionButton.value等)

我已经很久没有做过VBA了,所以可能有点生锈:)

您得到的错误是因为您将字符串与布尔值进行比较,因此类型不匹配

您可以尝试使用以下代码动态访问控件:

Forms("UserForm1").Controls("p" & iPart & "OptionButton").Value = True

我已经很久没有做过VBA了,所以可能有点生疏:)

您得到的错误是因为您将字符串与布尔值进行比较,因此类型不匹配

您可以尝试使用以下代码动态访问控件:

Forms("UserForm1").Controls("p" & iPart & "OptionButton").Value = True

例如,假设您的表单上有6个
OptionButton
s和一个
CommandButton
,则您可以根据下面的代码示例迭代这些选项。如果您将一个变量设置为
OptionButton
,然后将其中一个表单
控件
分配给该变量,则可以访问其属性,例如
Name
d
等非常容易

Option Explicit

Private Sub CommandButton1_Click()

    Dim opt As MSForms.OptionButton
    Dim i As Long

    For i = 1 To 6
        Set opt = UserForm1.Controls("p" & i & "OptionButton")
        If opt.Value = True Then
            MsgBox opt.Name & ":" & opt.Value
        End If
    Next i
End Sub

例如,假设您的表单上有6个
OptionButton
s和一个
CommandButton
,则您可以根据下面的代码示例迭代这些选项。如果您将一个变量设置为
OptionButton
,然后将其中一个表单
控件
分配给该变量,则可以访问其属性,例如
Name
d
等非常容易

Option Explicit

Private Sub CommandButton1_Click()

    Dim opt As MSForms.OptionButton
    Dim i As Long

    For i = 1 To 6
        Set opt = UserForm1.Controls("p" & i & "OptionButton")
        If opt.Value = True Then
            MsgBox opt.Name & ":" & opt.Value
        End If
    Next i
End Sub

这是正确的方法,我对其进行了相应的改进,但值得注意的是,尽管控件集合是基于0的,但实际上您是根据其名称而不是序号选择opt。在您的示例中,当I=0时,则“UserForm1.controls”(“p”&I+1&“OptionButton”)的计算结果为“UserForm1.controls”(“p1OptionButton”)'因此,您不妨通过使用'For i=1到6'和'UserForm1.Controls(“p”&i&“OptionButton”)来简化您的生活。'“.@Winterknell-是的,你当然是对的。我会更新这个示例。这是正确的方法,我也相应地对其进行了升级,但值得注意的是,尽管控件集合是基于0的,但实际上您是根据其名称而不是序号来选择opt。在您的示例中,当I=0时,则选择“UserForm1.controls”(“p”&I+1&“OptionButton”)'的计算结果为'UserForm1.Controls(“p1OptionButton”)',因此您不妨通过使用'For i=1到6'和'UserForm1.Controls(“p”&i&“OptionButton”)'来简化您的生活。@Winterknell-当然,您是对的。我将更新示例。