@MarkFern: TypeOf VarType(vParams(pIndex)) Is Object makes no sense. Just use IsObject function like this:

Code:
    If IsObject(vParams(pIndex)) Then
        vParamType(pIndex) = vbObject
    Else
        vParamType(pIndex) = VarType(vParams(pIndex))
    End If
Note that converting this to a single expression w/ IIf has the side-effect of always evaluating VarType(vParams(pIndex)) which has the side-effect of always calling the default property/method of the object which for Word.Application instances can be an expensive out-of-process call.

VarType is not unique and evaluating default property is a standard behaviour, even built-in Array(oMyInstance1, oMyInstance2, ...) does it and this is very welcome side-effect because when you have an instance of a Recordset for instance and you try to wrap Array(rs!ID, rs!Name, rs!Address) you don't want the ADODB.Fields in this array but only their default Value property. If you pass the naked ADODB.Fields you risk rs.MoveNext actually *changing* the values in the array. Now *that* would be a big surprise!

cheers,
</wqw>