うろ覚えだけど、VBの関数やクラスというのは
COMオブジェクトがベースになってる。

privateなものは、COMオブジェクトではない部分として処理されるから、
COMの仕様を守らなくても良いがpublicなものは、COMの仕様を守る必要がある。

COMの仕様を守るというのは、例えばメソッドの
引数、戻り値の型はCOMと互換性のある型であるということ。

privateなユーザー定義型はCOMではない。
だからCOMを扱うCollectionに入れられない。
ユーザー定義型をpublicにするとCOMになるから
Collectionに入れられる。

とまあ、こんな感じだったと思う。