【问题标题】:how to pass indefinite number of boolean arguments ByRef in VBA如何在 VBA 中传递不确定数量的布尔参数 ByRef
【发布时间】:2020-09-17 05:55:19
【问题描述】:

我有一些用户表单选项,我想将它们的值设为 false,为此我需要一个 sub 可以接收不定数量的布尔参数并将它们全部设为 false。

我试过了:

Sub MakeFalse(ParamArray options())
For I = 0 To UBound(options)
    options(I) = False
Next
End Sub

然后这样称呼它:

MakeFalse OptionButton1.Value,OptionButton2.Value,OptionButton3.Value,OptionButton5.Value

它接收值,但它们在用户表单中没有改变

我也试过这个:

Sub MakeFalse(options() As Boolean)
For I = 0 To UBound(options)
    options(I) = False
Next
End Sub

然后通过这个来调用它:

b = Array(OptionButton1.Value,OptionButton2.Value,OptionButton3.Value,OptionButton5.Value)
MakeFalse b

但它给了我 TypeMismatch 错误。

【问题讨论】:

  • 您只传递了选项按钮控件的布尔 - 该布尔值和控件之间没有链接。你应该自己传入控件。

标签: excel vba


【解决方案1】:

下面的代码应该放在你的用户表单的代码表中,它应该是Private,因为它不会被另一个模块调用。

Private Sub MakeFalse(ParamArray Options())

    Dim i As Integer
    For i = 0 To UBound(Options)
        Me.Controls("OptionButton" & Options(i)).Value = False
    Next
End Sub

用这样的代码调用 sub:-

Private Sub TestMakeFalse()
    MakeFalse 1, 2, 3, 5
End Sub

请注意,您可能会自己传递控件,就像您尝试做的那样,但这看起来像很多多余的输入。按照我的建议,您可以通过给出控件的编号来组成控件的名称,并在获得名称后在 sub 中创建对象本身。

【讨论】:

  • 非常感谢,我喜欢你的绝妙建议,很有帮助
  • 我尝试这样修改一组文本框的 .visible 属性:Me.Controls(Options(i)).Value = False 但它给了我“不正确使用关键字 Me” 我试过这个: UserForm1.Controls(Options(i)).Value = False 但它使整个用户窗体不可见你能帮帮我吗?
  • 使用 Visible 属性而不是 Value 属性。
  • Me 指定当前对象。如果对象是用户表单,则为表单,否则通常为工作表。在Controls(Options(i)) 中,“Options(1)”必须是有效的控件名称。变量 Options(1) 代表一个字符串,如Me.Controls("TextBox1").Visible = False
猜你喜欢
  • 1970-01-01
  • 2022-01-04
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多