VBA 函数可选参数

VBA Function Optional parameters

我多次调用一段特定的代码,因此我想使用可选参数。 我可以这样写:

Public Sub main()

strA = "A"

'Calling the function
CalculateMe (strA)

End Sub

Public Sub CalculateMe(strA As String)

    Set rs = DB.OpenRecordset("tbl_A")
    rs.MoveFirst
        Do Until rs.EOF
            If rs.Fields(0) = strA Then
                dblA = rs.fields(2).Value
            End If
            rs.MoveNext
        Loop
End Sub

如何更改函数以包含 1 个以上的可选参数?

类似于:

Public Sub main()
strA = "A"
strB = "B"

'Calling the function
CalculateMe (strA, strB)

more code
End Sub

Public Sub CalculateMe(Optional strA As String, Optional strB as String)

    Set rs = DB.OpenRecordset("tbl_A")
    rs.MoveFirst
        Do Until rs.EOF
            If rs.Fields(0).Value = strA And rs.Fields(1).Value = strB Then
                dblA = rs.Fields(2).Value
            End If
            rs.MoveNext
        Loop
End Sub

按照 Pankaj Jaju 的建议,我已经 运行 将其更改为:

Public Sub main()
strA = "A"
strB = "B"

'Calling the function
dblA = CalculateMe (strA, strB)

End Sub

Public Function CalculateMe(Optional ByVal strA As String, Optional ByVal strB as String)

Set rs = DB.OpenRecordset("tbl_A")
rs.MoveFirst
    Do Until rs.EOF
        If rs.Fields(0).Value = strA And rs.Fields(1).Value = strB Then
            dblA = rs.Fields(2).Value
        End If
        rs.MoveNext
    Loop
End Sub

现在,如何清除可选参数的值?我将需要它进行一些计算。类似于:

Set strA = Nothing

更改您的子并添加 ByVal

Public Sub CalculateMe(Optional ByVal strA As String, Optional ByVal strB As String)

我不确定你的意思是 "optional"。在您的示例中,您将 args 列为可选参数,但您仍然将 both 个参数传递给函数。

无论如何,在这里你传递两个参数:

Public Sub main()
strA = "A"
strB = "B"

'Calling the function
dblA = CalculateMe(strA, strB)

more code
End Sub

如果您只想传递其中一个参数,请执行以下操作:

dblA = CalculateMe(, strB)

或者:

dblA = CalculateMe(strA)

否则,如果您总是同时传递两个参数,那么让它们都没有意义Optional

您可以使用

代替CalculateMe(,strB)
dblA = CalculateMe strB:="B"
Public Sub CalculateMe(Optional varA As Variant, Optional varB as Variant)

摘自Chip Pearson's精彩解释:

可选参数的使用规则:

  • 必须存在 Optional 关键字才能使参数成为可选参数。
  • 数据类型应该是(但不一定是,见下文)Variant数据 类型。
  • 可选参数必须在参数的末尾 列表。
  • IsMissing 函数将只对声明的参数起作用 作为 Variant。当与任何其他数据类型一起使用时,它将 return False
  • 用户定义类型 (UTD) 不能是可选参数。

例子

Function Test(L1 As Long, L2 As Long, _
    Optional P1 As Variant, Optional P2 As Variant) As String

    Dim S As String

    If IsMissing(P1) = True Then
        S = "P1 Is Missing."
    Else
        S = "P1 Is Present (P1 = " & CStr(P1) & ")"
    End If

    If IsMissing(P2) = True Then
        S = S & "  " & "P2 Is Missing"
    Else
        S = S & "  " & "P2 Is Present (P2 = " & CStr(P2) & ")"
    End If

    Test = S
End Function

此处,L1 和 L2 都是必需的,但 P1 和 P2 是可选的。由于都是Variant类型,我们可以通过IsMissing来判断参数是否传入。IsMissing returns True if Variant省略参数,如果包含 Variant 参数,则为 False。如果可选参数的数据类型是 Variant 以外的任何数据类型,IsMissing 将 return False.