使用ParamArray(与Variant数组相比)有什么好处?

时间:2014-03-17 20:50:59

标签: vba vb6

当我想接受可变数量的参数时,我已使用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吗?

2 个答案:

答案 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