Half-Retirean's Lazy Life Diary / ダラダラ余生日記

最近思ったこと: やりたいことだけやるって幸せなことだ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  984  : 記事  4  : コメント  42105  : トラックバック  277

ニュース

My Website

初心者向けのサイトです。

C# と VB.NET の入門サイト

最近のできごと

暇人28号FX

Sponsored Link1

Sponsored Link2

Archive

書庫

ご存知な方も多いと思いますが、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 は型指定のない言語ですから、配列の配列をうまく使って回避する方法を取っても良いと言えるでしょう。実体は配列の擬似コレクション クラスを作るなんてふざけた方法もありますけどね。

投稿日時 : 2007年4月15日 18:12

コメント

# re: VBScript で Collection を使うには? 2007/04/15 18:25 ちゃっぴ
不具合でしたっけ?
単に用意されていないだけだと思っていましたが。。。

他にも、overhead が大きいけど .NET の ArrayList を VBScript で使うという記事も Technet Script Center の記事に公開されていたと思います。

# re: VBScript で Collection を使うには? 2007/04/15 18:38 じゃんぬねっと
扱えないだけで不具合とは言えないということですね。
ただ、どこかに BUG KB があったような記憶もあるのですよね。

# re: VBScript で Collection を使うには? 2023/05/12 18:31 things to do
ありがとう! さらなる最新情報を期待しています。

Post Feedback

タイトル
名前
Url:
コメント: