Excel VBA - 调用函数而不传递所有参数

时间:2017-07-12 07:21:41

标签: excel vba excel-vba

我有一个公共职能

Public Function kuc_1(Mj, R1, R2, S, J1, J2)

是否可以在不传递所有参数的情况下调用它, 例如:

kuc_1(1;5;5)

1 个答案:

答案 0 :(得分:3)

使用 Optional 关键字来声明可选参数

要阐述我的评论,您可以在以下函数中指定Optional Arguments

Public Function kuc_1(Optional Mj, Optional R1, _
                      Optional R2, Optional S, _
                      Optional J1, Optional J2)

    '/* your codes here */

End Function

要使用此功能,您可以省略您不需要的参数:

kuc_1(1;;2) '/* here you supply Mj and R2 and omit the rest of the arguments

注意:如果您的默认分隔符不是分号;,请尝试使用逗号,。我使用了分号,因为OP使用分号发布了样本用法。但是在VBE中,您使用逗号,

编辑1: 我收到了一条评论(以及对该问题的投票)因为我的帖子不清楚。 OP可能很清楚,但可能不是那些阅读它的人,特别是那些不熟悉VBA的人。因此,我会尽可能清楚地说明这一点。 :)

处理可选参数

在上面的代码中,我们只是声明参数是可选的。它并没有结束,因为我们需要在代码中处理可选参数。虽然它是可选的,但如果提供了可选参数,我们需要明确代码如何运行。

  • 检查是否提供了可选参数 - 根据声明为Optional的变量类型,有不同的方法可以执行此操作。例如,如果使用Variant函数提供,则可以测试声明为IsMissing的变量。请考虑以下事项:

    Private Function cRept(text As String, number As Integer, _
                           Optional delimiter As Variant) As String
    
        cRept = Join(Split(String$(number, "."), "."), delimiter & text)
        cRept = Mid(cRept, Len(delimiter) + 1)
    
    End Function
    

    记下Optional变量delimiter。如果您不提供第三个参数Type mismatch error,即使它是delimiter,此代码将生成Optional。要解决此问题,我们将使用IsMissing

    Private Function cRept(text As String, number As Integer, _
                           Optional delimiter As Variant) As String
    
        If IsMissing(delimiter) Then delimiter = ""
        cRept = Join(Split(String$(number, "."), "."), delimiter & text)
        cRept = Mid(cRept, Len(delimiter) + 1)
    
    End Function
    

    即使您提供delimiter参数,上面的代码现在也会执行。以下是根据您拥有的可选变量类型进行检查的其他方法:

    If a = "" Then a = "#N/A" '/* optional variable a declared as String */
    If a = 0 Then a = 1 '/* optional variable a declared as Integer */
    If a Is Nothing Then Set a = Application '/* optional variable a declared as Object */
    
  • 设置可选参数的默认值 - 如果您已经知道在未提供可选参数的情况下分配可选参数,请执行此操作。

    Private Function cRept(text As String, number As Integer, _
                           Optional delimiter As Variant = "") As String
    
        'If IsMissing(delimiter) Then delimiter = ""
        cRept = Join(Split(String$(number, "."), "."), delimiter & text)
        cRept = Mid(cRept, Len(delimiter) + 1)
    
    End Function
    

    上面的代码现在将运行,即使我们省略了检查是否提供,因为我们在调用函数时将delimiter的值初始化为""并且未提供该参数。 / p>

  • 使用可选参数调用函数 - 最简单的是省略可选参数。让我们回到OP的原始功能。以下是我们将如何在VBE和/或工作表中调用它。

    kuc_1(1, ,2) '/* supplying Mj and R2 only */
    kuc_1(, , , , ,4) '/* supplying last argument J2 only */
    

    在VBA中使用它(在VBE中运行)时,可以使用语法<argument name>:=在许多可选参数中提供特定参数。上面的最后一个例子可以写成:

    kuc_1(J2:=4) '/* we specify what optional argument we are supplying */
    

免责声明:上面的函数cRept用于重复字符串,就像工作表函数REPT一样。第三个参数实际上没有必要,但用于演示可选参数。