Comment ajouter des valeurs dans une liste VBA : collections, dictionnaires et bonnes pratiques

Si vous avez déjà programmé en VBA, vous avez peut-être déjà utilisé des tableaux (array en anglais) pour stocker vos listes de valeurs en mémoire. Redimensionner dynamiquement un tableau VBA est donc tout-à-fait possible, mais il n’est pas judicieux de le faire. Une liste fait le même boulot qu’un tableau sans qu’il soit nécessaire de définir sa taille. Vous pouvez donc y ajouter ou y enlever des éléments sans que cela entraine de recopie des valeurs précédentes.

A gauche le tableau Excel à charger. Mais supposons qu’on veuille créer un quiz dans lequel on demande au joueur la capitale de chaque pays dans un ordre aléatoire. Or, supprimer un élément d’un tableau n’est pas simple et demande de redimensionner le tableau, ce qui n’est pas efficace comme nous l’avons déjà vu. Conseil : dès que vous commencez à manipuler des listes de données en VBA, utilisez des collections plutôt que des tableaux, même si vous n’en voyez pas tout de suite l’intérêt.

Un dictionnaire est une collection de paires clé-valeur. Par exemple, notre collection de pays peut être gérée sous forme de dictionnaire dans lequel les clés sont les codes ISO des pays (exemple : DE, FR…), et les valeurs sont des objets CPays. Il garantit l’unicité de chaque élément en interdisant l’ajout de 2 clés identiques. Il permet d’accéder aux éléments via leurs clés. Conseil : lors du parcours d’un dictionnaire avec une boucle for ou for…each, il n’y a aucune possibilité de récupérer la valeur de la clé de l’élément courant. Il est donc recommandé de stocker la clé dans un champ de l’objet lui-même.

Si vous chargez dans un dictionnaire des données qui contiennent potentiellement des doublons de clés, le chargement sera interrompu au premier doublon rencontré. Pour créer des dictionnaires, il existe une autre classe nommée Scripting.Dictionary. Scripting.Dictionary n’offre de toutes façons guère plus de possibilités que la classe Collection. Dans vos macros VBA, chaque fois que vous avez besoin de stocker en mémoire un nombre d’éléments non connu à l’avance, utilisez une collection plutôt qu’un tableau VBA (Array). Déterminez au départ si vous avez plutôt besoin d’une liste simple ou d’un dictionnaire. La classe Collection est incontournable pour tout programmeur VBA qui se respecte.

mais comme tu ne nous as pas dit comment était alimenté ta combo, je doute que cela fonctionne en l'état... d'autre part, peut être des tests à faire au préalable afin de déterminer si la saisie ne correspond pas déjà à une entrée de ta combo... En effet en l'état ça ne marche pas. regarde ceci, à noter qu'il est préférable d'alimenter ta combo via la propriété list plutôt que par "rowsource", enfin à mon sens... surtout si il faut ajouter / enlever des items en cours de route... Merci beaucoup, ça marche nickel. Je ne connaissais pas la propriété list, mais je note.

Lire aussi: Modifier Activité Kbis Auto-Entrepreneur

En fait, je ne connais pratiquement rien en programmation (vba ou autre) et ma macro ressemble pour l'instant plus à un patchwork qu'autre chose. Mais ça marche. Et c'est encore mieux grace à toi. Bonjour à tous, c'est mon premiers message sur le forum =) Voilà mon soucis, sur VBA j'ai une liste de 10 éléments par exemple, et je souhaiterai connaître la commande pour rajouter par exemple 'range("A1").value' à la troisième place. J'ai trouver plein de fonction addItem, combo box, mais trop compliquer pour l'action que j'ai à faire.ps j'ai tenté ça pour la forme. maliste()= maliste.AddItem(Range("A1"), 2)Merci d'avanceBonjourUn exemple de ton fichier serait le bienvenu.

La liste est une LIstBox, une ComboBox .....Est ce qu'il y a plusieurs lignes et plusieurs colonnes ....Tu veux rajouter en 3ème ligne, en 3ème colonne ....A+wow quelle rapidité !! Oui bien entendu, voici une partie de mon code ( seulement une partie car il fait 1600 lignes environ)Dim Liste1(12)Dim i as IntegerFor i = 0 To 11 Liste1(i) = Range("A" & i)NextEt à partir de là, j'aimerai rajouter une valeur à l'intérieur de ma liste à une position précise. par exemple rajouter la valeur 10 à la 2ème place.donc les éléments se trouvant de l'indice 2 à 12 se trouverons décalés de 3 à 13j'espère avoir été plus précis. End FunctionPour bien faire, il faudrait ajouter un test pour être sûr que la position souhaitée soit compatible avec les indices du tableau...

S'il y a des milliers d'éléments, pas sûr que se soit très rapide ....Parfait !! ça fonctionne, mais je trouve cela tout de même étrange qu'il n'existe pas une fonction qui fasse ce genre d'opération et qu'il faille la créer nous même. Mes remarques et critiques sont purement techniques. Pensez à utiliser les tableaux structurés. VBA pour Excel? L'ensemble des fichiers sont empilés les uns sous les autres et le resultat est livré dans un tableau structuré... tu peux donc faire tous les TCD ou rapports Power BI que tu souhaites. En général , Power Query, l'essayer...

Utiliser les méthodes adaptées pour ajouter des éléments

  • Les listes dynamiques et les collections : privilégier les collections pour stocker des éléments non connus à l’avance et éviter les réallocations fréquentes.
  • Les dictionnaires (clé-valeur) pour garantir l’unicité et accéder rapidement par clé, avec prudence sur le parcours des éléments.
  • La différence entre ListBox/ComboBox et les méthodes d’ajout : privilégier la propriété List pour alimenter des éléments en cours d’exécution et non Rowsource.
  • Tester l’intégrité des positions lors d’insertion dans des listes ou tableaux, surtout si le nombre d’éléments est élevé.

En pratique, vous pouvez structurer votre approche ainsi :

  1. Choisir entre liste simple, dictionnaire ou collection selon les besoins en unicité et en accès par clé.
  2. Utiliser une Collection lorsque le nombre d’éléments est inconnu à l’avance et que des ajouts/ suppressions doivent être fréquents.
  3. Si vous avez besoin d’associer des métadonnées à chaque élément, envisagez des objets (par exemple CPays) stockés comme valeurs du dictionnaire.
  4. Éviter les manipulations lourdes sur les tableaux directement; préférez les structures adaptées et, si nécessaire, effectuez des tests préalables pour vérifier les indices.

Pour nourrir la réflexion, voici quelques points clés à retenir :

Lire aussi: INPI et Micro-Entreprise : Démarches

  • La ListBox et la ComboBox peuvent être alimentées via la propriété List plutôt que Rowsource pour faciliter les ajouts/suppressions en cours d’exécution.
  • La classe Scripting.Dictionary offre des possibilités similaires à Collection, avec une gestion explicite des clés et de l’unicité, mais peut être redondante selon les besoins.
  • La classe Collection est « incontournable » pour stocker des éléments sans connaître leur nombre à l’avance et pour des opérations d’ajout/suppression dynamiques.

VBA Excel | Les collections d'objets

Exemple pratique de structure avec dictionnaire et objets :

ConceptDescriptionAvantages
CollectionStockage dynamique d’élémentsAjouts/suppressions faciles
DictionnaireClé-valeur, unicité, accès par cléAccès rapide par clé, contrôle d’unicité
Scripting.DictionaryImplémentation équivalente à DictionaryInteropérabilité et compatibilité

En résumé, lorsque vous travaillez avec des listes dans VBA, privilégiez les collections et les dictionnaires plutôt que les tableaux dynamicifiés, et adaptez votre choix en fonction de l’usage (simple liste vs association clé-valeur). Si vous devez alimenter des contrôles comme ListBox/ComboBox, privilégiez la propriété List pour faciliter les opérations d’insertion et de suppression en cours de route.

Lire aussi: Comment Calculer la TVA ?

balises:

Articles populaires: