【问题标题】:How can I pass optional arguments on to another function which has optional arguments如何将可选参数传递给另一个具有可选参数的函数
【发布时间】:2014-12-04 07:14:41
【问题描述】:

我有一个名为 myfunction 的函数。它有 10 个可选参数。这会调用另一个名为 myotherfunction 的函数,该函数具有相同的 10 个可选参数。

假设我只使用参数 1 调用 myfunction。当我不知道 10 个可选参数中的哪一个被传递时,如何仅使用参数 1 调用 myotherfunction?

我不能说 ret_value=myotherfunction(arg1:=argumentone) 因为我可能需要传递 1 到 10 个参数。如果我使用 2 个参数,那么它必须是 ret_value=myotherfunction(arg1:=argumentone, arg2:=argumenttwo) 但在运行时我不知道哪些参数已传递给 myfunction。有没有办法解析函数调用?

【问题讨论】:

    标签: vba function excel argument-passing


    【解决方案1】:

    只需沿链传递参数即可。作为一个非常简单的例子:

    Sub foo()
        Call bar("test")
    End Sub
    Sub bar(sOne As String, Optional sTwo)
        Call foobar(sOne, sTwo)
    End Sub
    Sub foobar(strOne As String, Optional strTwo)
        If IsMissing(strTwo) Then
            MsgBox strOne
        Else
            MsgBox strOne & "- " & strTwo
        End If
    End Sub
    

    注意:Foobar 中的 IsMissing 仅表示每个例程都需要在对可选参数进行任何操作之前对其进行测试。也许只是传递它们的一个更清楚的例子是:

    Sub foo()
       ' note only one parameter provided
        Call bar("test")
    End Sub
    Sub bar(sOne As String, Optional sTwo, Optional sThree, Optional sFour)
         ' still pass all parameters even if we only got one
        Call foobar(sOne, sTwo, sThree, sFour)
    End Sub
    Sub foobar(strOne As String, Optional strTwo, Optional strThree, Optional strFour)
       ' some code here
    End Sub
    

    【讨论】:

    • 问题是可能有 10 个变量的任意组合。我当然可以使用 ismissing 来找出在运行时传入了哪些变量,但是如何在设计阶段构造第二个函数调用来满足所有这些组合呢?
    • 我认为你没有理解我的意思。只需将所有相同的变量从第一个例程传递到第二个例程。不要费心测试它们。请注意,Call foobar(sOne, sTwo) 不会检查或关心 sTwo 是否已传递给 bar,它只是将其传递。老实说,10 个可选参数对我来说似乎是糟糕的设计——也许你需要一个 ParamArray 或一个 UDT/Class。
    • 好吧,我想我正在寻找一个更优雅的解决方案。但它看起来不像有一个。我向其发送请求的 API 使用了 10 个可选参数。我无法改变这一点。感谢您的帮助。
    • 出于好奇,这里有什么不雅点?
    【解决方案2】:

    使用IsMissing

    If IsMissing(arg1) Then
        'do something
    End If
    

    它仅适用于Variant 类型。

    【讨论】:

    • 值得注意的是,IsMissing 函数仅适用于 Variant 类型的可选参数。更多IsMissing function
    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2019-12-13
    • 2011-12-28
    • 2020-06-14
    • 2018-11-03
    • 1970-01-01
    相关资源
    最近更新 更多