web-dev-qa-db-fra.com

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

de nombreuses personnes utilisent largement des tableaux dans Excel/VBA pour stocker une liste de données. Cependant, il y a l'objet de collection qui, à mon avis, est BEAUCOUP PLUS pratique (principalement: pas besoin de redéfinir la longueur de la liste).

Donc, je suis sincèrement me demandant si je manque quelque chose? Pourquoi d'autres personnes utilisent-elles encore des tableaux pour stocker une liste de données? Est-ce simplement une gueule de bois du passé?

40
tyrex

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

  • vous pouvez facilement transférer le tableau vers la plage (et vice-versa) avec Range("A1:B12") = MyArray
  • les collections peuvent stocker uniquement des clés uniques tandis que les tableaux peuvent stocker n'importe quelle valeur
  • les collections doivent stocker un couple (clé, valeur) alors que vous pouvez stocker tout dans un tableau

Voir article de Chip Pearson sur les tableaux pour une meilleure 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 du VBA standard alors que vous devez importer dictionnaires)

36
JMax

La réponse de @CharlesWilliams est correcte: parcourir toutes les valeurs d'un tableau est plus rapide que d'itérer une collection ou un dictionnaire: à tel point que j'utilise toujours la méthode Keys () ou Items () d'un dictionnaire lorsque je dois le faire - les deux méthodes renvoient un tableau vectoriel.

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

Il existe, ou bien sûr, des inconvénients aux collections et aux dictionnaires. L'un d'eux est que les tableaux peuvent être bidimensionnels ou même tridimensionnels - une structure de données bien meilleure pour les données tabulées. Vous pouvez stocker des tableaux en tant que membres d'une collection, mais il y a quelques inconvénients à cela: l'un d'eux est que vous n'obtiendrez peut-être pas de référence à l'élément - à moins que vous n'utilisiez arrItem = MyDictionary(strKey) vous obtiendrez presque certainement une copie "ByVal" du tableau; c'est mauvais si vos données sont dynamiques et sujettes à changement par plusieurs processus. C'est aussi lent: beaucoup d'allocation et de désallocation.

Pire encore, je ne fais pas vraiment 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 de portée, pas par Set objCollection = Nothing, même pas par objDictionary.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 suffisamment de fuites de mémoire dans les applications qui utilisaient des tableaux dans les dictionnaires pour savoir que vous devez être prudent. Cela étant dit, je n'utilise jamais un tableau sans commande Erase quelque part.

@JMax a expliqué l'autre grand avantage des tableaux: vous pouvez remplir un tableau en un seul "hit" dans la feuille de calcul et réécrire votre travail en un seul "hit".

Vous pouvez, bien sûr, tirer le meilleur parti des deux mondes en construisant une classe de tableau indexé: un tableau à 2 dimensions avec des objets de collection ou de dictionnaire associés stockant une sorte d'identifiant de ligne comme clés et les ordinaux de ligne comme éléments de données.

18
Nigel Heffernan

Les collections qui se redimensionnent automatiquement sont plus lentes (théoriquement, différentes implémentations auront évidemment leur propre kilométrage). Si vous savez que vous avez un nombre défini d'entrées et que vous n'avez besoin d'y accéder que de manière linéaire, un tableau traditionnel est la bonne approche.

4
codeghost