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
.
我多次调用一段特定的代码,因此我想使用可选参数。 我可以这样写:
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
。当与任何其他数据类型一起使用时,它将 returnFalse
。- 用户定义类型 (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
.