>>601
初期化されていない配列は、UBoundするとエラーになりますが、
初期化された空の配列ならば、UBound(LBound)が利用できますよ。

Dim S() As String: S = Split("")
Dim B() As Byte: B = ""
Dim O() As Object: VarType O
Dim V() As Variant: V = Array()

Debug.Print LBound(S), UBound(S)
Debug.Print LBound(B), UBound(B)
Debug.Print LBound(O), UBound(O)
Debug.Print LBound(V), UBound(V)


で、本題。

601さんが作成された関数は、既定の型(通常はVariant)を
受け取るようになっていますよね。

確かに、Variant型には配列を格納できるのですが、
そこにユーザー定義型を渡す場合には、
『ユーザー定義型が、クラスモジュールにて宣言されていて、
 かつ、クラスのInstancingがPrivate以外に設定されている』
という条件を満たさなければいけません。