web-dev-qa-db-ja.com

コレクションがあるときにVBAで配列を使用するのはなぜですか?

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

だから、私は心から何かが欠けているかどうかを自問しますか?なぜ他の人々はまだ配列を使ってデータのリストを保存するのですか?それは単に過去の二日酔いですか?

40
tyrex

コレクション(または辞書)の代わりに配列を使用するいくつかの理由:

  • Range("A1:B12") = MyArrayを使用して、配列を範囲に(およびその逆に)簡単に転送できます。
  • コレクションはuniqueキーのみを格納できますが、配列は任意の値を格納できます
  • コレクションにはカップル(キー、値)を格納する必要がありますが、配列には何でも格納できます

よりよく理解するには、配列について Chip Pearsonの記事 を参照してください

より良い質問は、なぜ人々が辞書よりもコレクションを使用するのかということです(OK、コレクションは標準VBAであるのに対し、import辞書が必要です)

36
JMax

@CharlesWilliamsの答えは正しいです:配列のすべての値をループすることは、コレクションまたは辞書を繰り返すよりも高速です:そのため、必要なときに常に辞書のKeys()またはItems()メソッドを使用します-どちらのメソッドもベクトル配列を返します。

注:コレクションを使用するよりもはるかに多くのDictionaryクラスを使用しているため、Exists()メソッドは非常に便利です。

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

最悪なことに、配列(またはオブジェクト!)をメンバーとするコレクションまたは辞書がある場合、VBAがメモリの割り当てを解除するとはまったく信じていません。スコープ外ではなく、Set objCollection = Nothingでも、 by objDictionary.RemoveAll-VBEで使用可能な限定的なテストツールキットに問題があることを証明するのは困難ですが、辞書で配列を使用するアプリケーションで十分なメモリリークが発生していることに注意してください。そうは言っても、どこかで消去コマンドなしで配列を使用することはありません。

@JMaxは、配列のもう1つの大きな利点について説明しました。ワークシートに1つの「ヒット」で配列を入力し、1つの「ヒット」で作業を書き戻すことができます。

もちろん、インデックス付き配列クラスを構築することで、両方の長所を最大限に活用できます。関連するコレクションまたは辞書オブジェクトがキーとして何らかの行識別子を格納し、行序数をデータ項目として格納する2次元配列です。

18
Nigel Heffernan

自動サイズ変更を行うコレクションは低速です(理論的には、実装ごとにマイレージが異なります)。設定された数のエントリがあり、それらに直線的にアクセスするだけでよいことがわかっている場合、従来の配列が正しいアプローチです。

4
codeghost