如何创建函数来获取不确定数量的参数但成对?

Posted

技术标签:

【中文标题】如何创建函数来获取不确定数量的参数但成对?【英文标题】:How to create function to take indefinite number of arguments but by pairs? 【发布时间】:2018-09-18 10:08:09 【问题描述】:

我正在考虑创建一个类似于 IFS 公式的 VBA 函数,其中您可以传递不定数量的参数,但始终需要第二个参数。

=IFS(logical_test1, value_if_true1, [logical_test2, value_if_true2], ...)

要求是比较某些值,如果都相同则输出True,否则输出False。

假设我们有这张桌子。

Item ID | Price | Description
1001    | 10.00 | Item A
1002    | 10.00 | Item A
1003    | 25.00 | Item A
1004    | 10.00 | Item B

如果我需要对某些项目做某事,我只需像这样调用函数:

Function(criteria1, value1, criteria2, value2, ...)

' Mark items with Price = 10.00 and Description = Item A
Dim IsAdd As Boolean: IsAdd = FnCheckData(strCriteria2, "10.00", strCriteria3, "Item A")

' Mark items with Item ID = 1002
Dim IsAdd As Boolean: IsAdd = FnCheckData(strCriteria1, "1002")

' Mark items with Item ID = 1003, Price = 25.00 and Description = Item A
Dim IsAdd As Boolean: IsAdd = FnCheckData(strCriteria1, "1003", strCriteria2, "25.00", strCriteria3, "Item A")

' This would error out since the second argument is not supplied
Dim IsAdd As Boolean: IsAdd = FnCheckData(strCriteria1)

这可能吗?如果是这样,怎么做?提前致谢!

【问题讨论】:

你可能需要this 我在 TEXTJOINIFS UDF here 中介绍了这一点。 谢谢大家!从两个帖子中都有想法。 【参考方案1】:

你的函数可能是这样的

Function NeedEvenNumber(ParamArray vStrings()) As Boolean

    On Error GoTo EH

    If IsMissing(vStrings) Then
        Debug.Print "Nothing passed"
    End If

    If (UBound(vStrings) Mod 2) - 1 = 0 Then
        Debug.Print "Correct number of params passed"
    End If

    Exit Function

EH:
    MsgBox "Something went wrong", vbOKOnly, "Error"


End Function

【讨论】:

将返回值转换为Variant,您可以在出现错误时返回CVErr(xlErrNum) (#NUM!)。 CVErr function

以上是关于如何创建函数来获取不确定数量的参数但成对?的主要内容,如果未能解决你的问题,请参考以下文章

创建具有不确定数量参数的 Oracle 函数/宏

使用 argparse 处理不确定的成对参数

如何确定线程池中线程数量

获取 Perl 打包/解包模板的元素数量

PL/SQL 如何获取 SP 的 OUT 参数

获取以太坊相关推文的数量(每小时)