【问题标题】:VBA Function Optional parametersVBA 函数 可选参数
【发布时间】:2015-04-30 11:31:49
【问题描述】:

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

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

【问题讨论】:

  • 我知道这是一个老问题了,但是你想传递一个数组吗?然后循环遍历数组中的 x 项?
  • 不,我不是;只有 2 个字符串变量。当时我不熟悉语法,Pankaj Jaju 帮助解决了这个问题。将函数更改为子例程并添加 ByVal 启用以执行我想要做的事情。忽略任何其他帖子/cmets;他们只是令人困惑。

标签: vba function optional-parameters


【解决方案1】:

更改您的子并添加ByVal

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

【讨论】:

  • 在运行时,如何判断是否提供了可选参数?
  • @ThrowawayAccount3Million - 当您调用CalculateMe 时,您可以选择指定要传递的参数。例如,如果您只想使用strB,则调用CalculateMe(,"second")。同样,如果您只想使用第一个参数,请调用CalculateMe("first")。如果您不想发送任何参数,只需调用CalculateMe
  • 既然你确实忽略了他的问题,那我再问一遍;) 在运行时,如何判断是否提供了可选参数?
  • @ThrowawayAccount3Million 使用此语句将您的参数与 Nothing 进行比较并基于此执行操作:If TheParameter Is Nothing Then [statements...] 我对其进行了测试运行,并使用TheParameter 作为字符串...所以我猜它适用于任何类型的对象。
  • @ThrowawayAccount3Million 请参阅以下摘自 Chip Pearson 的答案。
【解决方案2】:
Public Sub CalculateMe(Optional varA As Variant, Optional varB as Variant)

摘自Chip Pearson's精彩解释:

可选参数的使用规则:

  • 必须存在 Optional 关键字才能使参数成为可选参数。
  • 数据类型应该是(但不一定是,见下文)Variant 数据 类型。
  • 可选参数必须位于参数末尾 列表。
  • IsMissing 函数仅适用于声明的参数 作为Variant。与任何其他数据类型一起使用时,它将返回 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来判断参数是否传入。如果Variant参数被省略,IsMissing返回True,如果Variant参数被省略,则返回False包括。如果可选参数的数据类型是Variant以外的任何数据类型,IsMissing将返回False

【讨论】:

    【解决方案3】:

    您可以使用 CalculateMe(,strB) 代替

    dblA = CalculateMe strB:="B"
    

    【讨论】:

    【解决方案4】:

    我不确定你的意思是“可选”。在您的示例中,您将 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 是没有意义的。

    【讨论】:

    • 这是正确的,我正在传递 bot 参数,但是在另一个调用相同函数的子例程中,我会将其中一个参数(字符串变量)设置为 = vbNullString
    • 你为什么要这样做?您可以简单地传递一个空字符串:Calculate("", strB) 等...老实说,这听起来像是您试图对自己的方法过于花哨,而没有真正了解自己在做什么。
    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多