Remplir une listbox en fonction du choix d'une autre listbox avec condition

Bonjour à tous,

Je me permets de revenir vers vous car je dois avouer que je suis un peu, voir beaucoup rouillé en VBA et Excel tout court. Je vous joins un fichier dans lequel j'ai 2 problèmes.

Problème N°1 : Mon fichier est long lorsque je clique sur un nom pour afficher les données

Problème N°2 : dans une première liste, j'ai les noms des employés. Lorsque je clique sur un nom, cela me donne toute les informations le concernant. tout fonctionne bien sauf que je voudrais que toutes ses qualifications soient listées dans une listbox appelée lst_formation.

Je ne vois pas comment faire......

Merci à tous

25gesinter.xlsm (43.68 Ko)

Bonsoir

Ci joint ma solution

35gesinter.xlsm (61.83 Ko)

A+ François

Je te remercie mais ce n'est pas exactement ce dont j'ai besoin. J'ai mis des vignettes dans mon fichier pour expliquer ce que je souhaite.

En vous remerciant.

22gesinter.xlsm (46.57 Ko)

Par contre, est-ce possible de faire ce que je veux faire ou pas....

Bonjour

C'est certainement possible mais je n'ai rien compris (ils sont tous monteur (par exemple) ...

A+ François

En fait il y a plusieurs monteurs, aile, carcasse, nez, initiateur, etc.... Mon but est que lorsque je clique sur un nom de la liste personnel, cela m'affiche dans la liste stage et formation toute les qualifications de la personne en question. pour exemple, si je clique sur le personnel AAAAAAAAAAAAA alors s'affiche dans la list_box stage et formation les qualifications suivantes :

Initiateur

Monteur Aile

Monteur Nez

Monteur Ours.

Merci pour les réponses

bonjour,

comme ceci ?

en AG6, le numéro de la ligne est calculé et j'ai déjà utilisé ce numéro dans les formules

26gesinter.xlsm (53.36 Ko)

C'est exactement ça!!! Mille merci. Peux-tu m'expliquer car je souhaiterai comprendre le fonctionnement.

Merci encore

Est ce que ça répond à tes souhaits ?

41gesinter.xlsm (60.91 Ko)

A+ François

Oui cela correspondrait aussi parfaitement à ce que je souhaite mais je ne comprends pas comment vous l'avez réalisé

Quand tu choisi un nom dans la liste personnel on alimente la liste formation (macro)

A+ François

https://support.microsoft.com/fr-fr/office/agregat-agregat-fonction-43b9278e-6aa7-4f17-92b6-e19993fa...

La formule en AG6

=AGREGAT(14;6;LIGNE(MesNoms)/(MesNoms&DECALER(MesNoms;;1;;)=B3&F3);1)

la partie noire :

premier argument = 14 = grande.valeur en combinaison avec le dernier argument 1 ---> on cherche la valeur la plus grande

deuxieme argument = 6 = ignorer les erreurs (dans la partie suivante, on commettra délibérément des erreurs pour ces valeurs qu'on ne veut pas)

la partie rouge

le numérateur = le numéro de lignes de la plage nommée "MesNoms"

le dénominateur = on crée un 1 pour les lignes correspondantes et un 0 pour les lignes faux,

Resultat ; en divisant les lignes faux par 0, on crée des erreurs que l'agregat ignore. Donc il ne restent que les numéros des lignes correspondantes et de ceux, on prend le plus grand (mais normallement, il n'y a qu'une ligne !).

formule du dénominateur : MesNoms&DECALER(MesNoms;;1;;)=B3&F3 --> ligne par ligne combiner les plages avec les noms et prénoms de la feuille "Données", si cela est égal au nom et prénom de la feuille "Accueil" alors c'est un 1 (Vrai) ou un 0 (Faux)

peut-être ça vous aidera d'évaluer la formule étape par étape https://support.microsoft.com/fr-fr/office/%C3%A9valuer-une-formule-imbriqu%C3%A9e-%C3%A9tape-par-%C...

Je ne calcule cette valeur qu'une fois et puis je l'utilise dans plusieurs de vos formules index(...) et la plage pour cette calcule est limitée à "MesNoms", pas une colonne complète. De cette manière, on gagne beaucoup de temps.

bonjour,

votre macro faisait 900 fois un boucle, ce qui coûte du temps

Ma macro de ce matin, mais modifiée pour ce "apte", ...

38gesinter.xlsm (53.55 Ko)
Sub lst_personnel_click()
     Dim row_number As Integer, aA, aB, s

     sp = Split(LST_PERSONNEL.ListFillRange, "!") 'split le nom de la plage "ListFillRange" du combobox, maintenant C2:E901 de la feuille "Données"
     If UBound(sp) = 1 Then Set c = Sheets(CStr(sp(0))).Range(sp(1)) Else MsgBox "error" 'comme ca, on sait la plage
     row_number = LST_PERSONNEL.ListIndex 'la ligne choisie (mais on commence à compter à 0 !!!)
     aA = c.Offset(row_number).Resize(1, 30).Value2     'ligne avec les données
     aB = c.Offset(-1).Resize(1, 30).Value2     'ligne des entêtes

     Application.ScreenUpdating = False
     Application.Calculation = xlCalculationManual 'blocquer à recalculer
     Range("A3").Value = LST_PERSONNEL.List(row_number, 0)
     Range("B3").Value = LST_PERSONNEL.List(row_number, 1)
     Range("F3").Value = LST_PERSONNEL.List(row_number, 2)

     For j = 20 To 25     'la première colonne de ListFillRange est C, alors la 20ième colonne est colonne V(monteur Aile) et 25 = AA(monteur ours)
          If StrComp(aA(1, j), "oui", 1) = 0 Then s = s & "|" & aB(1, j) ' si la cellule du personne est "Oui", on ajoute l'entête dans le string s avec "|" comme séparateur
     Next
     If Len(s) > 0 Then 's n'est pas vide
          LST_Formation.List = Split(Mid(s, 2), "|") 'on split s à partir du 2ième lettre et voilà vos "monteurs"
     Else
         LST_Formation.Clear
     End If
     Application.Calculation = xlCalculationAutomatic

End Sub

Merci pour vos solutions. J'ai juste ajouter un lst_formation.clear pour nettoyer la listbox juste avant de commencer. La solution est vraiment efficace. merci

Rechercher des sujets similaires à "remplir listbox fonction choix condition"