Pourquoi utiliser des tableaux dans VBA quand il y a des collections?

beaucoup de gens utilisent intensivement des tableaux dans Excel / VBA pour stocker une liste de données. Cependant, il y a l'objet collection qui, à mon avis, est beaucoup plus pratique (principalement: il n'est pas nécessaire de redéfinir la longueur de la liste).

Donc, je suis sincèrement me demandant si je rate quelque chose? Pourquoi d'autres gens continuent d'utiliser des tableaux pour stocker une liste de données? Est-ce simplement une relique du passé?

37
demandé sur L42 2012-05-14 11:59:28

3 réponses

plusieurs raisons d'utiliser des tableaux au lieu de collections (ou dictionnaires):

  • vous pouvez transférer facilement array à range (et vice-versa) avec Range("A1:B12") = MyArray
  • collections ne peuvent stocker que des unique touches tandis que les tableaux peuvent stocker n'importe quelle valeur
  • collections doivent stocker un couple (clé, valeur) alors que vous pouvez stocker n'importe quoi dans un tableau

Voir article de Chip Pearson à propos des tableaux pour un meilleur compréhension

une meilleure question serait plutôt de savoir pourquoi les gens utiliseraient des collections plutôt que des dictionnaires (ok, les collections sont des VBA standard alors que vous devez import dictionnaires

34
répondu JMax 2018-05-08 21:48:18

une note: j'utilise la classe du dictionnaire beaucoup plus que j'utilise des collections, la méthode Exists() est tout simplement trop utile.

il y a, ou bien sûr, des inconvénients aux collections et aux dictionnaires. L'un d'eux est que les tableaux peuvent être 2-ou même 3-dimensionnel - une structure de données beaucoup mieux pour les données tabulées. Vous stocker les tableaux en tant que membres d'une collection, mais il y a des inconvénients à cela: l'un d'eux est que vous pourriez ne pas obtenir une référence à l'article - sauf si vous utilisez arrItem = MyDictionary(strKey) vous obtiendrez certainement une copie' ByVal ' du tableau; c'est mauvais si vos données sont dynamiques, et sujettes à changement par de multiples processus. C'est aussi lent: beaucoup d'allocation et libération de la mémoire.

le pire de tout, Je ne fais pas tout à fait confiance à VBA pour désallouer la mémoire si j'ai une collection ou un dictionnaire avec des tableaux (ou des objets!) en tant que membres: PAS SUR HORS CHAMP, pas par Set objCollection = Nothing, pas même par objdictionnaire.RemoveAll-il est difficile de prouver que le problème existe avec la boîte à outils de test limitée disponible dans le VBE, mais j'ai vu assez de fuites de mémoire dans les applications qui ont utilisé des tableaux dans les dictionnaires pour savoir que vous devez être prudent. Cela étant dit, je n'ai jamais utiliser un tableau sans commande D'effacement quelque part.

@JMax a expliqué l'autre grand plus pour les tableaux: vous pouvez peupler un tableau dans un simple 'hit' à la feuille de travail, et écrire votre travail dans un simple 'hit.

vous pouvez, bien sûr, obtenir le meilleur des deux mondes en construisant une classe de tableau indexé: un tableau bidimensionnel avec des objets de collection ou de dictionnaire associés stockant une sorte d'Identificateur de rangée comme les clés, et les ordinaux de rangée comme les éléments de données.

17
répondu Nigel Heffernan 2012-05-15 13:01:37

les Collections qui se redimensionnent automatiquement sont plus lentes (théoriquement parlant, différentes implémentations auront évidemment leur propre Kilométrage). Si vous savez que vous avez un certain nombre d'entrées, et vous avez seulement besoin d'accéder de façon linéaire, puis un traditionnel tableau est la bonne approche.

3
répondu codeghost 2012-05-14 08:07:06