Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA多个可选功能参数_Excel_Vba - Fatal编程技术网

Excel VBA多个可选功能参数

Excel VBA多个可选功能参数,excel,vba,Excel,Vba,我正在尝试用VBA为拥有Excel 2013的同事编写。我觉得一旦我设置了所有函数参数,我的VBA就足以编写这个函数。但是,我不知道如何在一个函数中拥有无限数量的可选参数(类似于Python中的*args)。如何设置一个函数,使其具有无限数量的可选参数?您需要使用ParamArray,例如 Public Function TestSum(ParamArray a()) Dim i As Long For i = LBound(a) To UBound(a) Tes

我正在尝试用VBA为拥有Excel 2013的同事编写。我觉得一旦我设置了所有函数参数,我的VBA就足以编写这个函数。但是,我不知道如何在一个函数中拥有无限数量的可选参数(类似于Python中的
*args
)。如何设置一个函数,使其具有无限数量的可选参数?

您需要使用
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

您需要使用
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

一个有趣的问题,下面是我复制
开关
功能的尝试

您需要使用
ParamArray
参数:

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

修订版,感谢@TinMan的评论,我们不再使用字典,因此这将与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
函数FSwitch2(ValueToMatch作为变量,ParamArray valueToMatchHandReturn())
'复制Office 365等中可用的交换机功能的示例。
' https://support.office.com/en-us/article/switch-function-47ab33c0-28ce-4530-8a45-d532ec4aa25e
作为整数的Dim i
Dim retVal作为变体
将默认值变暗为变量
如果(UBound(valueToMatchHandReturn)+1)模式2 0,则
'如果数组大小不均匀,则假定最后一个参数是默认值。
默认值=ValueToMatchHandReturn(UBound(ValueToMatchHandReturn))
其他的
'否则,如果不匹配,则默认为#N/A错误。
默认值=CVErr(2042)
如果结束
对于i=LBound(ValueToMatchHandReturn)到UBound(ValueToMatchHandReturn)步骤2
如果ValueToMatch=ValueToMatchHandReturn(i),则
retVal=ValueTostHandReturn(i+1)
退出
如果结束
下一个
FSwitch2=IIf(IsEmpty(retVal),默认值,retVal)
端函数

一个有趣的问题,下面是我复制
开关功能的尝试

您需要使用
ParamArray
参数:

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

修订版,感谢@TinMan的评论,我们不再使用字典,因此这将与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
函数FSwitch2(ValueToMatch作为变量,ParamArray valueToMatchHandReturn())
'复制Office 365等中可用的交换机功能的示例。
' https://support.office.com/en-us/article/switch-function-47ab33c0-28ce-4530-8a45-d532ec4aa25e
作为整数的Dim i
Dim retVal作为变体
将默认值变暗为变量
如果(UBound(valueToMatchHandReturn)+1)模式2 0,则
'如果数组大小不均匀,则假定最后一个参数是默认值。
默认值=ValueToMatchHandReturn(UBound(ValueToMatchHandReturn))
其他的
'否则,如果不匹配,则默认为#N/A错误。
默认值=CVErr(2042)
如果结束
对于i=LBound(ValueToMatchHandReturn)到UBound(ValueToMatchHandReturn)步骤2
如果ValueToMatch=ValueToMatchHandReturn(i),则
retVal=ValueTostHandReturn(i+1)
退出
如果结束
下一个
FSwitch2=IIf(IsEmpty(retVal),默认值,retVal)
端函数

。您真的需要“无限数量”的参数吗?如果是这样,你能给出一些预期输出的用例吗?(这是一部分)。这可能是一个X/Y问题,也许您不必在VBA中重新创建
开关
函数,而只需在VBA中使用
选择大小写
操作符,它或多或少相当于。但是如果你需要从用户那里获取任意一组对,也许你确实需要重新创建开关。你真的需要“无限数量”的参数吗?如果是这样,你能给出一些预期输出的用例吗?(这是一部分)。这可能是一个X/Y问题,也许您不必在VBA中重新创建
开关
函数,而只需在VBA中使用
选择大小写
操作符,它或多或少相当于。但是,如果你需要从用户那里获取任意一组配对,也许你确实需要重新创建开关。实际上,我对这篇文章很感兴趣。然而,我想到了一个硬编码的
Switch()
语句。VBA
Switch()
语句使用索引。我不认为你真的需要一本
字典
,因为你只需要找到一个值。只需在找到时返回值。或者找不到错误。在任何情况下,真的没有太多的需要优化这样的东西+1@TinMan你不需要字典,你可以用一对数组或一对ArrayList来实现,我认为如果你定义了所有124对可选的value/result,你可以在Select案例中实现;t、 但当需要检查参数是否存在时,它会变得非常混乱。对
ParamArray
进行直接索引的问题在于,你无法区分结果中的值,这样可能会得到一些错误的结果。这是我在不到5分钟内所能做的最好的事情。不用担心,我很快就发布了完整的答案。我能写得这么快的唯一原因是你的答案结构很好。复制、粘贴、重构..VBA黑客的生活..我其实对这篇文章有点兴趣。然而,我想到了一个硬编码的
Switch()
语句。VBA
Switch()
语句使用索引。我不认为你真的需要一本
字典
,因为你只需要找到一个值。只需在找到时返回值。或者找不到错误。在任何情况下,都不需要对t这样的东西进行优化