【问题标题】:VBA Excel Pass a variable name to a sub; update the value of the variable name in the subVBA Excel 将变量名传递给子;更新 sub 中变量名的值
【发布时间】:2019-01-20 19:24:29
【问题描述】:

试图将变量的名称传递给 SUB,然后更新 SUB 中变量的值,但我没有做对。

我有一个全局变量

    Dim booLastNm as Boolean

我有一个函数

    Public Sub FilltheForm(myCTL As Control, intNum As Integer, Optional booName As String)
        myCTL.Value = myArray(1, intNum)
        If booName <> "" Then booName = True
        MsgBox booName & vbCrLf & vbCrLf & booLastNm
    End Sub

我在组合框更改例程中调用该函数:

    FilltheForm Me.boxLastNm, 1, "booLastNm"

它正确地更改了 myArray(1, 1) 中的用户表单字段“Me.boxLastNm”。我还希望将全局变量“booLastNm”的值设置为 True。但是,“booName”的值设置为 True,而“booLastNm”的值仍设置为“False”。如何将要更改的变量的名称(在本例中为“booLastNm”)传递给函数,以便更改值而不是变量“booName”?我从 Excel 电子表格中读取了大约 148 个变量,并试图将它们转储到多页用户表单中以进行数据验证。 “boo”变量是我在页面更改时检查的布尔变量;如果选定的布尔变量设置为 false,我希望用户在前进到下一页之前对当前页面进行更正。

【问题讨论】:

  • If booName &lt;&gt; "" Then booLastNm = True
  • Scott,问题在于我有 148 个可能的变量要传递给函数。如何提取作为可选变量传递的变量名称,并将变量名称的值正确设置为 True?
  • 很遗憾,您不能这样做。您将需要指定要设置的每个变量。您可以在函数中使用 case 语句,但您必须在该 case 语句中显式设置每个变量的值。
  • 那太臭了!我试图避免在 If...Then...Else 场景中对布尔变量名称进行硬编码,或者选择包含 148 个案例的案例。对如何改进有任何想法?
  • 嗯。不要使用 148 个布尔变量?这是一个想法。这样做是绝对必要的,还是只需要在每次运行时测试一个条件,然后根据该测试返回一些结果?最好的编程方式是编写能很好地完成一件事的程序,并根据需要将它们组合起来。如果您只需要根据您传递的参数测试某些东西,那么就这样做,进出并根据结果编写更多决策。您可能会发现更多模式,您可以在这些模式上构建更多功能来处理。

标签: vba excel


【解决方案1】:

通过引用传递。

Public Sub FilltheForm(myCTL As Control, intNum As Integer, Optional ByRef booName As String)

但是,在您的示例中,您将booName 用作BooleanString(上面的函数签名是您的副本)。此外,您不会将任何内容重新分配给 BooLastNm,这就是它没有改变的原因。

如果您通过ByRef,值得使用Variant 进行检查,这样您也可以使用IsMissing() 在UDF 中提供一些灵活性。在这种情况下可能不相关,但学习东西总是很方便。

【讨论】:

    猜你喜欢
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多