この点を明確にする記事から関連部分を抽出しました。 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
を参照してください++ New'の落とし穴は、私が[Rubberduck](HTTPで「ローカルオブジェクト変数は、自己に割り当てられている」コード検査を追加した理由は非常に理由であるとして 'こと:/ /rubberduckvba.com) - これについてはあまり知りません!ですから、実際に*参照がオブジェクト参照になるのは何ですか?コレクションを 'Nothing'に設定すると、それらはきれいに割り当て解除されますか?あなたの例は、値の種類の項目のみを表示します(ストリングはVBAのオブジェクトではありません) –
タイトなループで1024× 'New Class1'の参照を追加してテストしただけで、*タスクマネージャー*のEXCEL.EXEプロセスを監視します。それは、メモリリークは遅れているときに子供を恐れる話です - 参照を無効にすることは仕事をします。 –
@ Mat's Mug夜の睡眠の後にちょうど起こったので、私は遅く応答して申し訳ありません。私はあなたの経験を高く評価し、あなたが言及した両方の点について熟考しなければならない。 – skkakkar