2016-06-14 6 views
3

私の手順では、データのテンプレートであるcollectionsが複数あります。これらのコレクションには、データが蓄積され、呼び出された後、私の反復プロセス中に再増殖のために空にされます。私はできることを読んだ:set myCollection = new Collectionは、本質的に再利用のためにそれをクリアする。コレクションをクリアする理想的な方法

私はまたset myCollection = Nothingを見ました。既存のコレクションのクリアを処理するための好ましい方法はありますか?

答えて

5

この点を明確にする記事から関連部分を抽出しました。 Setを使用すると、コレクションを何も設定しない場合とは動作が異なることを意味します。次のセクションでこれについて説明します。

あなたは、単に何にそれを設定することができ、コレクションからすべての項目を削除するにはコレクション

からすべての項目を削除します。

Set Coll = Nothing 

ここで重要なことは、コレクションの作成方法によって異なります。私たちが見たように、Newを使って宣言するかSetとNewを使ってCollectionを作成することができます。あなたは、それが「オブジェクトが設定されていない」状態に設定されます何もこのコレクションを設定した場合は新しい

を使用して、両方のタイプの宣言

を見てみましょう。新しい項目を追加すると、VBAによって自動的にCollection変数が有効なコレクションに設定されます。

つまり、コレクションを何も設定しないと、すべてのアイテムが空になります。コレクションにアイテムを追加すると、アイテムが1つのコレクションが作成されます。これにより、コレクションを空にすることが簡単になります。

次のコードはこれを示しています。

Sub EmptyColl() 

    ' Create collection and add items 
    Dim coll As New Collection 

    ' add items here 

    ' Empty collection 
    Set coll = Nothing 

    ' Add item 
    coll.Add "Pear" 

End Sub 

ここで強調すべき微妙な点は、コレクションをNothingに設定すると、実際には何も設定されていないことです。したがって、あなたとそれを比較しようとすると、うまくいかないでしょう。あなたがNothingにそれを設定する場合は、もう一度コレクションを作成する必要がありますコレクションを作成するための設定を使用すると設定し、新しい

を使用して

。次のコードで、何も設定しなかった場合は、再度newを使用して設定する必要があります。これをしないと、 "Object VariableまたはWithブロック変数が設定されていません"というエラーが表示されます。

Sub EmptyCollSet() 

    ' Create collection 
    Dim coll As Collection 
    Set coll = New Collection 

    ' Add items here 

    ' Empty collection 
    Set coll = Nothing 

    ' SET TO NEW BEFORE USING 
    Set coll = New Collection 

    ' Add item 
    coll.Add "Pear" 

End Sub 

すべて削除 - 別の方法を

次のような方法では、コレクションのすべての要素を削除するが、それを行うには、より遅い方法であるだろう。利点は、あなたがコレクションをどのように作成しても機能するということです。詳細について

Sub RemoveAll(ByRef coll As Collection) 

    Dim i As Long 
    For i = coll.Count To 1 Step -1 
     coll.Remove i 
    Next i 

End Sub 

The Ultimate Guide To Collections in Excel VBA by Paul Kelly

+1

を参照してください++ New'の落とし穴は、私が[Rubberduck](HTTPで「ローカルオブジェクト変数は、自己に割り当てられている」コード検査を追加した理由は非常に理由であるとして 'こと:/ /rubberduckvba.com) - これについてはあまり知りません!ですから、実際に*参照がオブジェクト参照になるのは何ですか?コレクションを 'Nothing'に設定すると、それらはきれいに割り当て解除されますか?あなたの例は、値の種類の項目のみを表示します(ストリングはVBAのオブジェクトではありません) –

+1

タイトなループで1024× 'New Class1'の参照を追加してテストしただけで、*タスクマネージャー*のEXCEL.EXEプロセスを監視します。それは、メモリリークは遅れているときに子供を恐れる話です - 参照を無効にすることは仕事をします。 –

+0

@ Mat's Mug夜の睡眠の後にちょうど起こったので、私は遅く応答して申し訳ありません。私はあなたの経験を高く評価し、あなたが言及した両方の点について熟考しなければならない。 – skkakkar

関連する問題