2012-05-14 8 views
35

多くの人がExcel/VBAで広範囲の配列を使用してデータのリストを格納しています。しかし、私の見解では、コレクションオブジェクトが非常に便利です(主に、リストの長さを再定義する必要はありません)。コレクションがあるときにVBAで配列を使用する理由

私は何かが欠けている場合、私は誠実にを頼んでいますか?なぜ他の人が配列を使ってデータのリストを保存するのですか?過去の二日酔いですか?

答えて

31

いくつかの理由:

  • Range("A1:B12") = MyArray
  • コレクションは、一方のみ一意キーを格納することができるとともに、簡単範囲配列(またはその逆)を転送することができ配列は
  • コレクションはあなたが保存できるのに対し、カップル(キー、値)を格納する必要が任意の値を格納することができ、アレイ内のどのような

は(あなたがインポート辞書に持っているのに対し、[OK]を、コレクションは標準VBAている)人々は辞書上でコレクションを使用する理由、より良い質問ではなくなり

より良く理解するために

+4

また、アレイはコレクションよりも優れています(アレイに直接インデックスできない場合はキー参照アクセスを除く)。 –

+0

@CharlesWilliams:チップありがとう – JMax

+13

コレクションにはキーを格納する必要はありません。オプションです。コレクションには任意の値を格納することもできますが、キー(使用する場合)は一意でなければなりません。 – Cutter

3

自動サイズ変更が遅いコレクション(理論的に言えば、異なる実装では明らかに独自の走行距離があります)。エントリ数が設定されていて、線形にアクセスする必要がある場合は、従来の配列が正しい方法です。アレイの代わりに、コレクション(または辞書)を使用する

15

@CharlesWilliams答えをアレイに関するChip Pearson's articleを参照してください。正しいです:配列のすべての値をループするのは、コレクションや辞書を反復するよりも速いので、私はそれを行う必要があるときに常にKeys()またはItems()メソッドを使用します。ベクトル配列

注:私はコレクションよりもはるかに辞書クラスを使用していますが、Exists()メソッドはあまりにも役に立ちます。

コレクションや辞書には欠点があります。それらのうちの1つは、配列が2次元または3次元であってもよいことです。これは、表形式のデータのデータ構造がはるかに優れています。 は、コレクションのメンバーとして配列を格納しますが、それにはいくつかの欠点があります:その1つは、アイテムへの参照を取得していない可能性があります。 arrItem = MyDictionary(strKey)を使用しない限り、配列。データが動的で、複数のプロセスによって変更される可能性がある場合、それは悪いことです。それはまた遅い:たくさんの割り当てと割り当て解除。

私はコレクションや配列の辞書(またはオブジェクト!)をメンバーとして持っていると、VBAがメモリを解放することを信用していません。範囲外ではなく、Set objCollection = Nothingでさえby objDictionary.RemoveAll - VBEで利用可能な限られたテストツールキットに問題が存在することを証明するのは難しいですが、注意する必要があることを知るために辞書で配列を使用したアプリケーションで十分なメモリリークが見られました。つまり、Eraseコマンドを使わないで配列を使用することは決してありません。

@JMaxは、配列の他の大きなプラスについて説明しました。ワークシートに1つの「ヒット」で配列を設定し、ワークを1回のヒットで書き戻すことができます。

Indexed Arrayクラスを構築することで、もちろん、最良の結果を得ることができます。関連付けられたコレクションオブジェクトまたは辞書オブジェクトを持つ2次元配列。キーとして行識別子を格納します。データ項目。

関連する問題