ご存知な方も多いと思いますが、VBScript では VBA.Collection が使えません。なぜ使えないかと言いますと確か不具合が原因だったと記憶しています。(それに関する記載を Microsoft 内の KB で発見できず...)
解決策はいくつか考えられると思います。最も手軽な回避方法は、Dictionary クラスを使うことです。VBScript では VBA.Collection クラスは使えませんが、Scripting.Dictionary クラスは使えます。Scripting.Dictionary クラスは、VBA.Collection クラスの機能をカバーしていると言えるので問題は起きにくいでしょう。
2 つ目はラッパークラスを作ることです。VB6 (Visual Basic 6.0) で ActiveX DLL プロジェクトを作成して以下のようなラッパークラスを書きましょう。
VB6.0 - VBA.Collection のラッパークラス
'/** Collection ラッパークラス */
Option Explicit
' プロパティ変数
Private m_Items As VBA.Collection
' コンストラクタ
Private Sub Class_Initialize()
Set m_Items = New VBA.Collection
End Sub
' デストラクタ
Private Sub Class_Terminate()
Set m_Items = Nothing
End Sub
' Item インデクサ - Getter
Public Property Get Item(ByVal Index As Variant) As Variant
If TypeOf m_Items(Index) Is Object Then
Set Item = m_Items(Index)
Else
Let Item = m_Items(Index)
End If
End Property
' Count プロパティ - Getter
Public Property Get Count() As Long
Let Count = m_Items.Count()
End Property
' Add メソッド
Public Sub Add(ByVal Item As Variant, Optional ByVal Key As Variant, Optional ByVal Before As Variant, Optional ByVal After As Variant)
Call m_Items.Add(Item, Key, Before, After)
End Sub
' Remove メソッド
Public Sub Remove(ByVal Index As Variant)
Call m_Items.Remove(Index)
End Sub
' NewEnum メソッド
Public Function NewEnum() As IUnknown
Set NewEnum = m_Items.[_NewEnum]
End Function
こんな感じで良いでしょう。Count はメソッドではなくプロパティにしてみました。
コードが書けましたら、Item インデクサ (インデクサって言うなw) のプロシージャ属性を変えて、デフォルト プロパティになるようにします。NewEnum メソッドは For Each ステートメントのために存在するものですから、非表示属性に変えておきましょう。
ここまで終えたらコンパイルします。そして、コンパイルしてできあがった DLL を regsvr32 を使ってレジストリに登録します。これで、VBScript でも Collection が使えるようになります。使用する時は CreateObject の引数でライブラリ名もしっかりと指定して一意になるようにします。
最後の解決策は諦めることですね。VBScrupt は型指定のない言語ですから、配列の配列をうまく使って回避する方法を取っても良いと言えるでしょう。実体は配列の擬似コレクション クラスを作るなんてふざけた方法もありますけどね。