【问题标题】:Passing several arguments to sub将几个参数传递给 sub
【发布时间】:2020-02-26 23:02:37
【问题描述】:

经过搜索,似乎没有人需要将 3+ 个参数传递给子例程。

据我所知,VBA 子例程(无效)最多只能有 2 个参数(尝试 3+ 时出错),函数(可以接受超过 2 个参数)必须返回一个值给调用它们的任何参数。

多年来,我一直在使用一些小技巧来解决这个问题,但想知道是否有更好的方法将 3+ 参数传递给 sub 或调用 void 函数。我目前所做的示例:

Private Function Foo(str1 as String, Optional str2 as string = "", Optional str3 as string = "") as Boolean
    [Do something with parameters, like send an email with programmatic parameters 'to', 'body', and 'subject']
End Function

Public Sub Bar()
    Dim dummyVal as Boolean
    [Do something]
    dummyVal = Foo("CustomerX@mail.com","Report [Today's Date]","Hello [Customer Name]...")
    [Do something]
End Sub

这也可以通过使用来完成

If Foo(args) Then
End If

这些都工作,但如果有人试图阅读我的代码可能会感到困惑。有没有办法将 3+ 参数传递给 VBA 子程序,或者摆脱“dummyVal”语法?

【问题讨论】:

    标签: excel vba syntax


    【解决方案1】:

    sub 没有 2 参数限制:

    Sub Runner()
        Test 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    End Sub
    
    Sub Test(a, b, c, d, e, f, g, h, i, j)
        Debug.Print Join(Array(a, b, c, d, e, f, g, h, i, j), ",")
    End Sub
    

    输出:

    1,2,3,4,5,6,7,8,9,10
    

    【讨论】:

    • 当时我不确定自己做错了什么,但我在大约一周前尝试添加多个参数,但每次都发生这种情况尝试了2个以上的参数。可能只是我的一些愚蠢的语法错误,因为这非常有效。感谢您解决这个问题!
    【解决方案2】:

    蒂姆·威廉姆斯的回答是对的。

    但是,在处理一行数据时,我发现定义一条记录并将其传递给任何子或函数很有用。这样做的好处是,当某些事情发生变化时,不必重新编码每个参数列表 - 更改记录结构一次就足够了。 例如:

    Public Type typPerson
        GivenName As String
        Surname As String
        ShoeSize As String
        NoOfPets As Integer
    End Type
    Sub SavePersonDetails(recPerson as typPerson, ByVal dblRow as Double)
        Activesheet(dblRow, 1).Value = recPerson.GivenName
        Activesheet(dblRow, 2).Value = recPerson.Surname
        Activesheet(dblRow, 3).Value = recPerson.ShoeSize
        Activesheet(dblRow, 4).Value = recPerson.NoOfPets
    End Sub
    

    如果您想在记录结构中添加诸如“HasCar As Boolean”之类的字段,则“SavePersonDetails”的参数列表不会改变。

    因此,如果参数数量失控,记录可能会很有用。

    此外,即使在使用函数和 subs 之间存在您所描述的差异,您也可以使用函数。没有什么说您必须使用函数返回的值。 例如:

    Function ExplodeApp() as Boolean
        ExplodeApp = True
        Application.Explode
    End Function
    

    可以通过以下方式调用:

    ExplodeApp
    

    没有任何实际接受它返回的值。函数只是一个返回值的子程序; sub 只是一个返回值的函数。否则,它们是可以互换的。试试看 - 将 sub 重新编码为函数。 (此外,这是减少您可以从“开发人员”选项卡运行的宏列表中显示的名称数量的好方法,因为它只显示子程序。但如果您输入其名称,您仍然可以运行该函数。 )

    【讨论】:

    • 我非常喜欢上课的方式。至于函数调用,我觉得我一直在服用疯狂的药丸......我已经遇到了一段时间的问题,而且你们都表明我的问题实际上并不存在......大多数可能只是我第一次开始编码时采取的一些不正确的方法,而且我一直在尝试同样的不正确的事情。感谢您的贡献!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 2018-06-03
    • 2023-03-19
    • 2020-10-30
    • 1970-01-01
    • 2015-05-30
    相关资源
    最近更新 更多