当我想接受可变数量的参数时,我已使用ParamArray
语句多年。一个很好的例子是MinVal函数:
Function MinVal(ParamArray Values() As Variant)
Dim ReturnVal As Variant, v As Variant
If UBound(Values) < 0 Then
ReturnVal = Null
Else
ReturnVal = Values(0)
For Each v In Values
If v < ReturnVal Then ReturnVal = v
Next v
End If
MinVal = ReturnVal
End Function
' Debug.Print MinVal(10, 23, 4, 17)
' 4
这可以在没有ParamArray的情况下重写:
Function MinVal(Optional Values As Variant)
Dim ReturnVal As Variant, v As Variant
If IsMissing(Values) Or IsNull(Values) Then
ReturnVal = Null
Else
ReturnVal = Values(0)
For Each v In Values
If v < ReturnVal Then ReturnVal = v
Next v
End If
MinVal = ReturnVal
End Function
' Debug.Print MinVal(Array(10, 23, 4, 17))
' 4
注意在第二个示例中,在对MinVal的调用中使用Array()
函数。
第二种方法的优点是能够将参数数组传递给另一个也接受数组的函数。如果我希望能够将MinVal
中的参数数组传递给其他函数,则可以提供灵活性。
我开始认为我应该总是赞成这种方法,并且完全停止使用ParamArray
。
有人可能会争辩说使用ParamArray
会产生更明确可读的代码。但是,编译时检查没有优势,因为ParamArray
必须是Variants数组。 任何人都可以提供令人信服的理由曾使用ParamArray
吗?
答案 0 :(得分:2)
我的大多数ParamArray
函数都有std Array
版本,这些版本可以像这样繁重:
Private Sub Command2_Click()
Process 1, 2, 3
End Sub
Private Sub Process(ParamArray A() As Variant)
ProcessArray CVar(A)
End Sub
Private Sub ProcessArray(B As Variant)
Debug.Print UBound(B)
End Sub
这对输出参数不起作用,所以是用ParamArray
替换Array
对于输出参数非常不方便非常不方便。
答案 1 :(得分:2)
您已经注意到使用Paramarray
的一个原因 - 有时它会使代码更清晰。事实上,我认为在你自己的例子中:
Debug.Print MinVal(10, 23, 4, 17)
优于:
Debug.Print MinVal(Array(10, 23, 4, 17))
当然,如何“引人注目”这是一个意见问题。代码清晰度在小例子中很少有用,但在大型代码库中,它可能非常重要。
如果您正在使用VBA和Excel,那么 是使用ParamArray
的一个有点令人信服的理由。考虑以下形式的UDF:
Public Function mungeRanges(ParamArray ranges())
'do something with a bunch of ranges
End Function
内置的Excel函数MIN
实际上就是这样的 - 您可以传入多个参数,包括范围或数组,并查看所有参数以查找最小的单个值。任何遵循类似模式的东西都需要使用ParamArray
。