【问题标题】:VBA Multiple Optional Function ParametersVBA 多个可选函数参数
【发布时间】:2018-06-27 13:10:01
【问题描述】:

我正在尝试为拥有 Excel 2013 的同事在 VBA 中编写 SWITCH function。我觉得我的 VBA 足够强大,可以在设置完所有函数参数后编写此函数。但是,我不确定如何在函数中拥有无限数量的可选参数(类似于 Python 中的*args)。如何设置一个函数,使其可以有无限数量的可选参数?

【问题讨论】:

  • 您真的需要“无限数量”的参数吗?如果是这样,你能给出一些预期输出的用例吗? (这是How to Ask 的一部分)。这可能是一个 X/Y 问题,也许不是在 VBA 中重新创建 Switch 函数,您可以简单地在 VBA 中使用 Select Case 运算符,它或多或少等同于 c# switch statement。但是,如果您需要从用户那里获取任意一组对,也许您确实需要重新创建 Switch。

标签: excel vba


【解决方案1】:

你需要使用ParamArray,例如

Public Function TestSum(ParamArray a())
    Dim i As Long
    For i = LBound(a) To UBound(a)
        TestSum = TestSum + a(i)
    Next i
End Function

【讨论】:

    【解决方案2】:

    一个有趣的问题,这是我复制Switch 功能的尝试。

    您需要使用ParamArray 参数:

    可选。仅用作 arglist 中的最后一个参数,以指示最后一个参数是 Variant 元素的可选数组。 ParamArray 关键字允许您提供任意数量的参数。它不能与 ByVal、ByRef 或 Optional 一起使用。 (source)

    经过修订,感谢带有 @TinMan 的 cmets,我们不再使用字典,因此无需进一步调整即可与 Mac OS 兼容。

    Function FSwitch2(ValueToMatch As Variant, ParamArray ValuesToMatchAndReturn())
    ' example of replicating the Switch function available in Office 365, etc.
    ' https://support.office.com/en-us/article/switch-function-47ab33c0-28ce-4530-8a45-d532ec4aa25e
    Dim i As Integer
    Dim retVal As Variant
    Dim default As Variant
    
    If (UBound(ValuesToMatchAndReturn) + 1) Mod 2 <> 0 Then
        ' if the array is not evenly sized, assume the last argument is the default value.
        default = ValuesToMatchAndReturn(UBound(ValuesToMatchAndReturn))
    Else
        ' Otherwise, default to #N/A error if no match.
        default = CVErr(2042)
    End If
    
    For i = LBound(ValuesToMatchAndReturn) To UBound(ValuesToMatchAndReturn) Step 2
        If ValueToMatch = ValuesToMatchAndReturn(i) Then
            retVal = ValuesToMatchAndReturn(i + 1)
            Exit For
        End If
    Next
    
    FSwitch2 = IIf(IsEmpty(retVal), default, retVal)
    
    End Function
    

    【讨论】:

    • 我实际上对这篇文章有一点兴趣。然而,我正在考虑一个硬编码的Switch() 声明。
    • VBA Switch() 语句使用索引。我认为您实际上不需要Dictionary,因为您只需要找到一个值。只需在找到时返回值。或者没有发现错误。无论如何,确实没有太多需要优化这样的东西。 +1
    • @TinMan 你不需要字典,你可以用一对数组或一对ArrayLists来做到这一点,我认为你可以 i> 如果您定义了所有 124 个可选的值/结果对,则在 Select Case 中执行此操作;但当需要检查参数是否存在时,它会真的变得混乱。对ParamArray 直接执行 index 的问题在于,您无法区分 valuesresults 并且可能最终得到那样会有一些错误的结果。
    • 这是我在 5 分钟内能做到的最好的事情 fswitch.txt
    • 别担心,我太快发布了完整的答案。我能写得这么快的唯一原因是你的答案结构很好。复制、粘贴、重构……VBA Hack 的生命……
    猜你喜欢
    • 2015-04-30
    • 2014-06-27
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2018-03-25
    • 2018-02-14
    • 2019-10-04
    相关资源
    最近更新 更多