22/08/2020 | jiangws2002 The ParamArray keyword allows you to accept a dynamic number of arguments.The word ParamArray is an abbreviation for parameter array.Instead of using a large number of optional parameters it might be better to use a parameter array instead.This can only be used as the last argument in a procedure or function.This keyword cannot be used with ByRef, ByVal or Optional (it is always ByVal).The parameter array must be defined with a Variant data type.The parameter array is always zero based and is not effected by the Option Base statement.The parameter array can contain different data types, including objects. Accessing with a For – Each Loop This subroutine requires one integer argument.Followed by any number of other arguments.These arbitrary arguments can be of any data type.This subroutine uses a For-Each loop to through the parameter array. Public Sub Procedure_One(ByVal iConstant As Integer, _ ParamArray aArgumentsArray() As Variant) Dim vArg As Variant For Each vArg In aArgumentsArray Debug.Print vArg Next vArg End Sub Public Sub RunThis_One() Call Procedure_One(100, "one") Call Procedure_One(100, "one", "two") Call Procedure_One(100, 1, 2, 3, 4, 5) End Sub Accessing with a For – Next Loop This subroutine uses a For-Next loop to loop through the parameter array. Public Sub Procedure_Two(ByVal iConstant As Integer, _ ParamArray aArgumentsArray() As Variant) Dim vArg As Variant Dim icount As Integer For icount = 0 To UBound(aArgumentsArray) vArg = aArgumentsArray(icount) Debug.Print vArg Next icount End Sub Public Sub RunThis_Two() Call Procedure_Two(100, 1, 2, 3, 4, 5) End Sub Empty Parameter Array This subroutine can detect if the parameter array is empty.Instead of leaving the argument completely blank you could pass in the keyword Nothing. Public Sub Procedure_Three(ByVal iConstant As Integer, _ ParamArray aArgumentsArray() As Variant) Dim vArg As Variant If ((LBound(aArgumentsArray) = 0) And _ (UBound(aArgumentsArray) = -1)) Then Debug.Print "Arguments array was not provided" Exit Sub End If If (aArgumentsArray(0) Is Nothing) Then Debug.Print "'Nothing' was passed in" Exit Sub End If For Each vArg In aArgumentsArray Debug.Print vArg Next vArg End Sub Public Sub RunThis_Three() Call Procedure_Three(100) Call Procedure_Three(100, Nothing) End Sub Passing In One Dimensional Array These two subroutines will extract the arguments when they are passed in using a one dimensional array.This subroutine extracts the one dimensional array from the first argument and then uses a for-loop. Public Sub Procedure_Four(ByVal iConstant As Integer, _ ParamArray aArgumentsArray() As Variant) Dim vArguments As Variant Dim vArg As Variant vArguments = aArgumentsArray(0) For Each vArg In vArguments Debug.Print vArg Next vArg End Sub Public Sub RunThis_Four() Dim myarray As Variant ReDim myarray(1) As String 'zero based array, do not use Option Base 1 myarray(0) = "one" myarray(1) = "two" Call Procedure_Four(100, myarray) End Sub It is possible to access the arguments directly using an ‘array of array’ type syntax. Public Sub Procedure_Five(ByVal iConstant As Integer, _ ParamArray aArgumentsArray() As Variant) Dim icount As Integer Dim vArg As Variant For icount = 0 To UBound(aArgumentsArray(0)) vArg = aArgumentsArray(0)(icount) Debug.Print vArg Next icount End Sub Public Sub RunThis_Five() Call Procedure_Five(100, Array("one","two")) End Sub https://bettersolutions.com/vba/arrays/paramarray.htm