Comment ajouter des éléments dans une ListBox VBA Excel

Dans VBA, vous pouvez créer une Zone de liste (« ListBox ») où un utilisateur peut choisir une des options listées. La zone de liste est souvent utilisée dans les formulaires d’utilisateur, mais peut également être utilisée dans une feuille de calcul. Le but d’une zone de liste est d’obtenir le choix de l’utilisateur.

Notions de base : position et format des éléments

Position de l'élément dans la liste. La numérotation des éléments de la liste commence à zéro. Pour les listes comportant plusieurs colonnes, utilisez des points-virgules pour délimiter les chaînes de chaque colonne (par exemple, "1010;rouge;grand" pour une liste en trois colonnes). Si l’argument Item contient moins de chaînes que de colonnes dans le contrôle, les éléments sont ajoutés en commençant par la colonne la plus à gauche.

Vous pouvez remplir un ListBox avec un bloc de cellules dans une feuille de calcul. Vous pouvez remplir un ListBox avec un bloc de cellules dans une feuille de calcul. Une autre façon de remplir une liste est de laisser un utilisateur le faire. Une liste peut être liée à une plage de cellules. Ainsi, chaque fois qu’un utilisateur saisit une nouvelle valeur dans la plage de cellules, la zone de liste est mise à jour avec cette valeur.

Ajouter des éléments : méthode AddItem et cas pratiques

Pour remplir un contrôle ListBox avec du code VBA, vous utiliserez la méthode AddItem. Cet exemple permet d’ajouter un élément à la fin de la liste d’un contrôle de zone de liste. Pour ajouter à la ligne suivante, il faut retrouver la dernière ligne vide de ton tableau. Ici tu as la dernière ligne vide de la colonne A.

Vous voulez affecter une valeur par défaut à la zone de liste ? Rien de plus simple : affectez l’index de cette valeur à la propriété ListIndex du contrôle (la valeur 0 correspond au premier élément de la liste). Cette affectation se fera par exemple dans la procédure UserForm_Activate().

Lire aussi: Créez facilement vos devis avec notre modèle Word gratuit

Ajouter un élément à une position précise

Pour ajouter un élément au début de la liste d’un contrôle de zone de liste déroulante, ou à une position précise, il n'existe pas de méthode native unique qui insère directement au milieu d'une ListBox : dans la plupart des cas, on reconstruit la liste en insérant la nouvelle valeur à l'indice souhaité. Pour 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 ....

Par exemple, si vous gérez vos propres tableaux en mémoire :

  • Dim Liste1(12)
  • Dim i as Integer
  • For i = 0 To 11 Liste1(i) = Range("A" & i) Next

Et à 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 à 13. Pour bien faire, il faudrait ajouter un test pour être sûr que la position souhaitée soit compatible avec les indices du tableau...

Si vous utilisez AddItem, notez que j'ai trouvé plein de fonction addItem, combo box, mais trop compliquer pour l'action que j'ai à faire. J'ai tenté ça pour la forme : maliste()= maliste.AddItem(Range("A1"), 2) - ceci n'est pas correct syntaxiquement et nécessite que l'on gère le décalage des éléments manuellement ou que l'on reconstruit la ListBox.

Approche recommandée (reconstruction de la liste)

Une approche courante consiste à lire tous les éléments actuels, insérer la nouvelle valeur dans le tableau à l'indice désiré, puis vider et re-remplir la ListBox. Parfait !! ça fonctionne, mais je trouve ça 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.

Lire aussi: Facturation Freelance : Modèles Word Gratuits

ListBox multicolonne et alimentation continue

Puisque tu as une ListBox multicolonne : lorsque tu sélectionnes un élément de chaque (deux ListBox) et que tu cliques sur "Valider", les deux éléments sont envoyés sur Excel dans un tableau à 3 colonnes. Puis ce que j'ai récupérer comme information est envoyé dans une 3ème ListBox multicolonne (3 pour être exacte). Ma macro ne marche que pour un seul élément. Lorsque je clique pour rajouter un autre élément dans ma ListBox Multicolonne et bien il écrase l'élément précédent. C'est à partir de là que je ne sais pas faire. Comment faire pour alimenter mon tableau Excel à chaque fois que je clique sur Valider, sans supprimer l'élément précédent? Je ne sais pas comment m'y prendre pour la boucle. Auriez vous des conseils svp?

Do While.....Loop :x. Je présume que ça marche de la même manière. Je dois avouer que je ne sais pas trop comment intégrer ton bout de code. Je comprends à peu près ce qu'il signifie (a priori ^^). J'appelle ListBox cible ma listbox24. "Tant que la cellule ...... Je me permets de préciser au cas où :x que mon problème réside dans le fait de rajouter, dans mon tableau excel à chaque fois que je clique sur valider, un élément à la ligne suivante. Pour le moment quand je clique sur valider cela écrase la sélection précédente.

Pour ajouter à la ligne suivante, il faut retrouver la dernière ligne vide de ton tableau. Ici tu as la dernière ligne vide de la colonne A. J'ai intégré ce code dans mon UserForm.

RowSource vs manipulation par code

Quand tu utilises RowSource, ta ListBox est statique en dépendant exclusivement de ton tableau Excel. Quand tu dis que ma LB cible est statique en utilisant RowSource, ça veut dire que je ne peux pas modifier ma ListBox cible? qu'elle dépend exclusivement de mon tableau Excel? En effet, si la ListBox est liée (RowSource), elle reflète le contenu de la feuille et vous modifiez la feuille plutôt que la ListBox directement. Le me.hide masque le USF et redonne la main au sub appelant qui continu ou il en était.

Manipulations courantes et méthodes utiles

  • Pour remplir la zone de liste à l’ouverture du classeur, placez le code dans l'objet Workbook, sous l’évènement Open. Cette procédure est exécutée chaque fois que l’utilisateur ouvre le classeur.
  • Pour effacer le contenu d’une zone de liste en VBA, vous devez utiliser la méthode Clear de l’objet Feuil1.lstZoneListe. Cette méthode permet de supprimer tous les éléments de la zone de liste.
  • Vous utiliserez des contrôles ListBox pour insérer des zones de liste dans une boîte de dialogue personnalisée.
  • Pour afficher les commandes d’insertion, activez la boîte à outils : cliquez sur l’icône Boîte à outils dans la barre d’outils supérieure. Vous obtiendrez ensuite une fenêtre avec tous les contrôles disponibles.

Exemples d’utilisation et bonnes pratiques

Pour commencer, nous avons changé l’attribut Name en lstZoneListe. Nous allons nommer la Zone de liste lstZoneListe. L’affectation se fera par exemple dans la procédure UserForm_Activate().

Lire aussi: Formulaire Cerfa 12156*06

Nous avons lié notre Listbox avec la plage E2:E5, où nous mettons les noms que nous voulons (Nathan, Harry, George, Roberta). Le but d’une zone de liste est d’obtenir le choix de l’utilisateur. La sélection de l’utilisateur se trouve dans l’attribut Value de l’objet Feuil1.lstZoneListe.

Nous avons sélectionné Michael dans la zone de liste et exécuté la procédure. Comme vous pouvez le voir, la valeur de la variable strÉlémentSélectionnée est Michael, ce qui correspond à la valeur que l’utilisateur a sélectionné.

Interaction entre formulaires et focus

Verrouille le focus sur le USF tu ne peux pas te positionner sur un autre ou même une cellule excel. ça évite que le code continue dans le sub qui appel le USF. Après essai, j'ai procédé à cette rectification car le code planté.

Excel,VBA,USERFORM,Alimenter une LISTBOX entre deux DATES#2

Conseils pratiques finaux

Une autre façon de remplir une liste est de laisser un utilisateur le faire. Une liste peut être liée à une plage de cellules. Ainsi, chaque fois qu’un utilisateur saisit une nouvelle valeur dans la plage de cellules, la zone de liste est mise à jour avec cette valeur. Pour expliquer comment procéder, nous allons d’abord insérer un formulaire. Pour afficher les commandes d’insertion, vous devez activer la boîte à outils. Pour ce faire, cliquez sur l’icône Boîte à outils dans la barre d’outils supérieure.

En résumé pratique : utilisez AddItem pour ajouter en fin (ou dans une ComboBox), stockez les éléments dans un tableau pour insérer au milieu en reconstruisant la ListBox, et pour alimenter un tableau Excel sans effacer les précédents, repérez la dernière ligne vide et écrivez dessus avant de remettre à jour la ListBox.

balises:

Articles populaires: