[VBA] - Remplir une listbox avec un dico sur deux colonnes

Bonsoir,

J'essai de remplir une ListBox à l'aide d'un dictionnaire. Je sais comment m'y prendre pour faire ça à partir d'une colonne ; en revanche, je ne parviens pas à obtenir le résultat que j'espère lorsque je veux faire apparaître deux colonnes dans la ListBox.

Puis-je toujours passer par un dictionnaire ? Je pense que par une collection ce serait plus simple, mais j'aimerais bien essayer avec le dictionnaire, qui, de surcroît, évite les doublons et est plus rapide à exécuter.

Je joins un petit document pour que vous ayez une meilleur idée de ce que je cherche à faire.

J'ai fait au minimum, avec deux colonnes seulement pour simplifier la compréhension.

Je vous remercie de votre attention.

Bonne soirée !

Bonjour Le Drosophile le forum

voilà ton fichier en retour, tu ouvres tu testes et tu me redis

a+

Papou

Bonjour,

Merci, le listing fonctionne bien, en revanche, si je sélectionne dans la liste déroulante le code qui doit remplacer la sélection, cela ne fonctionne plus car la sélection ne correspond plus à ce qui se trouve dans la cellule.

Ça n'était pas la question initiale, sur laquelle vous m'avez apporté une solution parfaite ! Hélas le code que vous avez fait est plutôt complexe et pour le moment je ne sais pas comment m'y prendre pour effectuer la modification du code lorsque l'on change le code (H, p, ou -) et que l'on clique sur valider. Dans mon cas je me retrouve face à deux problèmes :

Mon code initial change toutes les valeurs qui correspondent à la sélection (sauf que je ne veux changer que ce qui est sélectionné) et il recherche l'équivalent de ce qui est sélectionné dans la ListBox, dans la colonne "HABZH" ; ce qui n'est plus possible car ce qui est affiché dans la ListBox est une concaténation des colonnes "LBPHYSIO" et "HABZH".

Merci beaucoup pour votre aide, c'est déjà beaucoup plus proche de ce que j'essayais de faire !

Bonsoir Le Drosophile le forum

bah à la lecture de ta réponse je suis surpris, tu veux récupérer une dans une listbox de deux colonnes c'est ce que je t'ai fait

si maintenant tu ne sais pas l'utiliser, là que veux tu que j'y fasse????

Explique clairement le but du remplissage de ta listbox, et surtout ce que l'on doit obtenir comme résultat

Il est évident que je peux te faire ce que tu veux, encore faut-il que je comprenne ce que tu souhaites réellement

à te relire

a+

Papou

(Re)Bonsoir,

bah à la lecture de ta réponse je suis surpris, tu veux récupérer une dans une listbox de deux colonnes c'est ce que je t'ai fait

Oui c'était mon problème initial et vous y avez trouvé une solution comme je l'espérais.

Pour la suite, lorsque je sélectionne une ligne dans la ListBox et que je choisis un code dans la ComboBox, je voulais que, pour la ligne qui a été sélectionnée, le code renseigné en colonne 2 soit modifié par celui sélectionné dans la ComboBox.

La macro précédente changeait tous les codes identiques à celui sélectionné dans la ListBox par par celui choisit dans la ComboBox, ce qui ne me convenait pas.

Je ne savais pas comment vous alliez vous y prendre pour modifier la macro et ne savais donc pas comment cela allait impacter le reste du code.

Vous avez déjà résolu un problème similaire sur cette discussion : https://forum.excel-pratique.com/viewtopic.php?f=2&t=135191&p=830755#p830755.

Je vais m'inspirer de ce que vous avez fait pour essayer de résoudre ce problème ci !

A plus tard !

Pour être plus clair dans ce que j'essaie de faire :

Je veux que lorsque l'on sélectionne une ligne dans la ListBox ainsi qu'un code (H, p ou -) dans la ComboBox, le changement soit réalisés sur la ligne correspondante dans le tableau, dans la colonne 2 ("HABZH").

Pour remplacer par exemple : "- x p" par "p" ; sans toucher à l'information contenue dans la colonne "LBPHYSIO".

Bonsoir Drosophile le forum

Je ne suis plus devant mon pc je regarderai demain matin milieu de matinée

J’espère que je vais comprendre ce que tu veux mais apparemment dans la colonne qui contient des h etc tu veux changer par la valeur sélectionnée dans la combo uniquement pour les lignes sélectionnées puisque de mémoire tu as une listbox multi select

A demain

Papou

Oui c'est ça.

Je suis encore en train d'essayer de bien comprendre le premier code que vous avez fait, mais je n'arrive pas à l'adapter pour ce cas de figure car la ListBox contient deux informations que je n'arrive pas à séparer l'une de l'autre.

Il faudrait peut-être deux ListBox "synchronisées"...

Je vais vous laisser jeter un œil à tout ça avant de tenter quelque chose d'autre.

Bonne soirée

Bonjour Le Drosophile le forum

non non te tracasse pas, c'est très simple

dans la listbox avec deux colonnes si tu veux la valeur de la deuxième colonne de la ligne x

listbox.list(x,1) 

et si dans ta listbox tu as 20 colonnes et que tu veux la valeur de la 18 ème colonne de la ligne a

listbox.list(a,17)

tu remarqueras que pour la colonne 2 j'ai mis 1 et pour la colonne 18 j'ai mis 17, le pourquoi est simple

les listes en fait commencent a la colonne Zéro et les lignes à la ligne Zéro

j'espère que tu comprends ce que je veux te dire (pas toujours simple d'expliquer)?

je vais te modifier ton fichier et je te le renvoie dans 2 heures, là je dois partir

a+

Papou

Bonjour Le Drosophile le forum

voilà ton fichier en retour avec ce que tu veux je pense !!!

tu ouvres tu testes et tu me redis

a+

Papou

Bonjour,

Je viens de faire quelques tests, la macro réalise exactement ce que je voulais faire, en revanche, à moins que je ne me trompe dans son utilisation, j'ai trouvé des erreurs de fonctionnement.

- Si je sélectionne toutes les lignes et que je choisi un code dans la ComboBox pour l'appliquer à l'ensemble des lignes concernées ; seule la première ligne est traitée. (Ensuite, si je les sélectionne toutes à nouveau, elles sont bien traitées ensembles).

- Lorsque toutes les lignes visibles dans la ListBox ont été traitées ; il reste des lignes vides sélectionnables. Si j'en sélectionne et que j'applique un code, alors j'ai l'erreur : "Impossible de lire la propriété List. Argument non valide". Cette erreur apparaît sur la ligne : Sheets("CSV").Cells(ListBox1.List(i, 2), 2) = C1

- Selon l'ordre dans lequel j'effectue les modifications, je peux voir apparaître sur 3 lignes ceci :

- Ligne 0 : une info correspondant à la colonne "LBPHYSIO"

- Ligne 1 : un code de la colonne "HABZH" (le code apparaît sur une ligne, seul)

- Ligne 2 : un chiffre qui correspond au numéro de ligne des infos présentes dans les deux lignes au dessus.

Pour répéter ce problème vous pouvez faire comme ceci :

  • Sélectionner toutes les lignes dans la ListBox > Utiliser un code (disons "p")
  • Sélectionner à nouveau toutes les lignes dans la ListBox (car seule 1 à été traitée) > Utiliser un code (disons "p")
  • >> L'erreur apparaît.

Savez-vous ce qui peut causer ces soucis ?

En tout cas, merci beaucoup pour votre aide, grâce à vous je suis tout près d'avoir terminé ce projet et de passer à une grosse phase de tests !

A plus tard !

Re Bonjour Le Drosophile le forum

bon alors c'est dur de te satisfaire, et pourtant!!!

J'ai répondu précisément à tes demandes, à la virgule près!!!

tu as comme condition pour remplir la listbox

If Not d.exists(aa(i, 1)) And aa(i, 2) <> "H" And aa(i, 2) <> "p" And aa(i, 2) <> "" And aa(i, 2) <> "- x -" Then

""d"" , étant le dico, tu voulais donc remplir la listbox avec une liste sans doublon des éléments de la colonne A qui répondent aux conditions ci-dessus, c'est exactement ce que j'ai fait.

Maintenant tu dis que ma macro ne marche pas, car tata ta etc etc, je te dis mon cher que la macro remplie bien la fonction demandée, et que les 5 lignes sélectionnées, ont bien été changées, et tu peux le vérifier de mémo fais le test tu regardes les lignes 34 ,36, 56 ,143. avant de lancer la macro et tu regardes ces mêmes lignes après la macro.

ou tu copies la colonne B dans la colonne D par exemple comme cela tu pourras contrôler après la macro que les données ont bien été mise à jour avec le choix fait dans la combobox.

MAIS MAIS MAIS

Ensuite on recharge la listbox avec les autres éléments de la feuille CSV, que l'on n'avait pas chargés, à savoir les doublons que nous avons éliminés à ta demande avec le dico, et qui maintenant répondent elles aussi aux conditions ci-dessous (elles n'ont pas changées)

If Not d.exists(aa(i, 1)) And aa(i, 2) <> "H" And aa(i, 2) <> "p" And aa(i, 2) <> "" And aa(i, 2) <> "- x -" Then

et donc tu te retrouves avec des nouvelles lignes dans la listbox.

Et Si tu sélectionnes les lignes et que tu cliques Valider là tu modifies les doublons de la feuille CSV.

Si tu as copié la colonne B en D avant lancer la macro tu pourras aussi vérifier que la deuxième validation de la macro a changée encore des lignes dans la feuille CSV colonne B.

Ma Macro fonctionne parfaitement, mais si tu veux charger toutes les lignes sans tenir compte des doublons, je peux le faire aussi, il faut juste que tu saches ce que tu veux c'est pas plus compliqué.

alors dans un premier temps vérifie contrôle, et redis moi ce que tu veux précisément

a+

Papou

Bonjour,

Effectivement, maintenant je comprend mieux le fonctionnement de votre macro, et ma demande initiale qui n'était pas suffisamment claire

Est-ce qu'il est possible de charger les lignes sans les doublons, comme cela est le cas ici .. et

Lorsque l'on sélectionne une ligne, tous les codes de toutes les correspondances identiques sont alors modifiés.

Pour donner un exemple qui illustrera mieux mon propos :

Si je sélectionne : "Fourré riverain à Canne de Provence x Fourré riverains à Frênes, Tamaris et Osiers H x - "

Et que j'applique un changement de code "H" .. alors

Pour chaque ligne qui correspond à "Fourré riverain à Canne de Provence x Fourré riverains à Frênes, Tamaris et Osiers" le code sera modifié par "H".

Voilà, en fonctionnant comme ça, le plus gros risque d'avoir des codes différents pour le même LBPHYSIO est évité et tout devrait fonctionner parfaitement

A plus tard !

Ré le Drosophile le forum

Oui c’est possible mais beaucoup plus compliqué, mais faisable bien sûr

On verra cela demain matin

Mais pourquoi laisser des doublons de ligne???

C’est la que tu est incohérent, si le but est d’avoir en colonne À une liste sans risque de double et de laisser les doublons dans la feuille excuse moi mais je ne comprend pas ta logique du tout

A+

Papou

Mais pourquoi laisser des doublons de ligne???

Non justement, il faut éviter les doublons.

Ne pas lister les doublons dans la ListBox et traiter toutes les lignes identiques dans la feuille.

SI l'on sélectionne dans la ListBox :

- "Fourré riverain à Canne de Provence x Fourré riverains à Frênes, Tamaris et Osiers H x - "

(et "H" dans la ComboBox)

Dans la feuille on va avoir "x" lignes identiques, pour chacune le code (colonne "HABZH") va être modifié :

[Fourré riverain à Canne de Provence x Fourré riverains à Frênes, Tamaris et Osiers] [H x - ]

[Fourré riverain à Canne de Provence x Fourré riverains à Frênes, Tamaris et Osiers] [H x - ]

[Fourré riverain à Canne de Provence x Fourré riverains à Frênes, Tamaris et Osiers] [H x - ]

Devient

[Fourré riverain à Canne de Provence x Fourré riverains à Frênes, Tamaris et Osiers] [H]

[Fourré riverain à Canne de Provence x Fourré riverains à Frênes, Tamaris et Osiers] [H]

[Fourré riverain à Canne de Provence x Fourré riverains à Frênes, Tamaris et Osiers] [H]

Quelle que soit leur position dans la feuille.

Pour ce faire, peut-être est-il possible de s'y prendre ainsi :

If .cells(lig,1) = listbox.list(x,0) Then .cells(lig,2) = ComboBox1

Ou quelque chose du genre.

Edit :

Mais pourquoi laisser des doublons de ligne???

C’est la que tu est incohérent, si le but est d’avoir en colonne À une liste sans risque de double et de laisser les doublons dans la feuille excuse moi mais je ne comprend pas ta logique du tout

Cette partie là de mon document permet de vérifier la validité d'une base de donnée. Je passe par x ListBox qui ciblent chacune une correction que seul un humain peut faire (corriger un code HABZH, un enjeu, un code "EUNIS", vérifier la présence de cellules vides, de codes identiques, etc.). Une fois que "l'humain" à corrigé ces erreurs, la base de données est prête à être utilisée, dans différentes opérations.

Mon but ici, c'est de ne pas modifier le nombre de ligne total car chaque ligne correspond à une "entité cartographique" dans un logiciel SIG.

J'espère vous avoir éclairé sur la raison de mon choix de conserver des doublons dans la feuilles que j'ai transmise.

Bonne soirée

Bonsoir Le Drosophile le forum

Je sais exactement comment faire pour régler le problème

Je regarderai demain car là je ne suis plus sur un PC jusqu’à demain matin milieu de matinée

A plus

Papou

bonjour Le Drosophile le forum

Ton fichier en retour avec peut-être ce que tu veux!!!! (enfin avec les dernières explications, je pense que c'est bon)

Assez loin de ta demande initiale, mais bon à toi de tester et tu me redis

a+

Papou

et ma demande initiale qui n'était pas suffisamment claire

oui oui oui!!

Bonjour,

C'est exactement ça. J'ai fait plusieurs tests et ai adapté votre code à mon document et tout fonctionne très bien !

Merci beaucoup !

Je commence à mieux comprendre la macro que vous avez faite et devrais pouvoir le réutiliser à l'avenir pour la correction de différentes autres erreurs dans mes bases de données. Vous m'avez apporté une aide vraiment précieuse

Bonne journée !

Re Bonjour Le Drosophile le forum

c'est parfait, mais si j'avais eu la bonne définition du travail à faire au début, j'aurais répondu tout de suite correctement.

enfin bref l'essentiel est le résultat final

a+

Papou

Rechercher des sujets similaires à "vba remplir listbox dico deux colonnes"