XL 2016 Remplir la 2ème colonne d'un combobox

Pouet26

XLDnaute Nouveau
Bonjour tout le monde,

Je tente désespérément de remplir la 2ème colonne d'un combobox et après une matinée de perdue, je me dois de me tourner vers vous.

Pourriez vous me dire pourquoi le code suivant ne fonctionne pas ?
Code:
For CptrCombo = 0 To .ComboLogin.ListCount - 1
            .ComboLogin.List(CptrCombo, 1) = "bonjour"
Next

Je vous joint également un classeur exemple.

Merci par avance
 

Pièces jointes

  • Test combo multi trié.xlsm
    27.7 KB · Affichages: 40

Dranreb

XLDnaute Barbatruc
Bonjour.
Parce que vous avez déjà affecté à List un tableau d'une seule colonne. Apparemment ColumCount ne change que le nombre de colonnes qui peuvent être affichées et celui préparé lors d'un AddItem, pas le nombre de colonnes du List déjà établi.
 

Pouet26

XLDnaute Nouveau
Arf....... je me demandais si ce n'étais pas un problème de ce genre là

Donc si je comprends bien, on ne peut pas affecter un tableau d'une colonne puis remplir la 2ème colonne....

Mais du coup comment dois je procéder ?

Mon but étant de :
- lister les login présents dans la feuille "Data_Périodes"
- éliminer les doublons
- trier par alpha
- remplir le combobox avec les logins en colonne 1 et "Nom prénom" en colonne 2
 

Dranreb

XLDnaute Barbatruc
Ce que je ne comprends pas bien c'est pourquoi vous ne partez pas de la liste des Login en Data_Personnel
Je reprendrais tout ça complètement. Mais provisoirement ceci semblerait faire l'affaire :
VB:
ThisWorkbook.Sheets("Déclaration").ComboLogin.List = WorksheetFunction.Transpose(Array(MonDico.keys, MonDico.items))

Remarque: Une liste classée et sans doublon pour les ComboBox, j'ai des modules de service qui font ça très bien et sans utiliser de Dictionary
 
Dernière édition:

Pouet26

XLDnaute Nouveau
J'avoue que je commence à bien savoir utiliser les variables tableau mais je ne sais absolument pas comment manipuler un dictionnaire surtout avec plusieurs "colonnes".

C'est pour ça que je passais par un dictionnaire et que je refaisais une boucle avec mes fonctions "GetNom" et "GetPrenom" pour remplir la 2ème colonne
 

Dranreb

XLDnaute Barbatruc
On peut très bien y affecter comme item un Array(…
Mais là on n'en a pas besoin.
En fait la liste Personnes est déjà classée, alors il ne reste qu'à en retenir ceux qui sont dans Périodes.
Avec référence "Microsoft Scripting Runtime" cochée :
VB:
Option Explicit

Sub InitialiserComboLogin()
Dim T1(), T2(), L1&, L2&, DicPér As New Dictionary
T1 = ThisWorkbook.Sheets("Data_Périodes").UsedRange.Value
For L1 = 2 To UBound(T1, 1): DicPér(T1(L1, 1)) = Empty: Next L1
ReDim T1(0 To DicPér.Count - 1, 0 To 1)
L1 = -1
T2 = ThisWorkbook.Sheets("Data_Personnel").UsedRange.Value
For L2 = 2 To UBound(T2, 1)
   If DicPér.Exists(T2(L2, 1)) Then L1 = L1 + 1: T1(L1, 0) = T2(L2, 1): T1(L1, 1) = T2(L2, 2) & " " & T2(L2, 3)
   Next L2
ThisWorkbook.Sheets("Déclaration").ComboLogin.List = T1
End Sub
 

Pouet26

XLDnaute Nouveau
Sauf que dans la pratique, la liste des périodes peut être dans le désordre.
Il n'y aurait pas plutôt un moyen de transférer le contenu du dictionnaire dans une variable tableau ?
Cela permettrait, après avoir supprimé les doublons et classé les valeurs, d'alimenter ligne par ligne le combobox en y rajoutant les éléments de la 2ème colonne.
 

Dranreb

XLDnaute Barbatruc
Regardez bien, ce n'est pas l'ordre des périodes que je reprends mais celui des Personnes.
Le dictionnaire période sert seulement à vérifier si le Login de la personne y est.
Ce qui vous a peut être trompé c'est que je réutilise T1 pour la sortie puisqu'il ne sert plus une fois le dictionnaire constitué.
 
Dernière édition:

Pouet26

XLDnaute Nouveau
Exact !
Désolé mais ton code est tellement synthétique que j'ai eu besoin de le recopier et l'arranger à ma sauce pour m'y retrouver.
Tout à l'air de fonctionner correctement. Il faut juste que je regarde comment supprimer les lignes vides à la fin de la liste.
 

Dranreb

XLDnaute Barbatruc
S'il y a des lignes vides à la fin de la liste, il me semble que cela ne peut venir que de Loging dans Data_Période qui n'existent pas dans Data_Personnel.
Si c'est normal il faudrait compter ceux qui existent seulement avant de dimensionner T1 pour la sortie.
Comme ça :
VB:
Option Explicit

Sub InitialiserComboLogin()
Dim T1(), T2(), L1&, L2&, DicPér As New Dictionary
T1 = ThisWorkbook.Sheets("Data_Périodes").UsedRange.Value
For L1 = 2 To UBound(T1, 1): DicPér(T1(L1, 1)) = Empty: Next L1
T2 = ThisWorkbook.Sheets("Data_Personnel").UsedRange.Value
L1 = -1
For L2 = 2 To UBound(T2, 1)
   If DicPér.Exists(T2(L2, 1)) Then L1 = L1 + 1
   Next L2
ReDim T1(0 To L1, 0 To 1)
L1 = -1
For L2 = 2 To UBound(T2, 1)
   If DicPér.Exists(T2(L2, 1)) Then L1 = L1 + 1: T1(L1, 0) = T2(L2, 1): T1(L1, 1) = T2(L2, 2) & " " & T2(L2, 3)
   Next L2
ThisWorkbook.Sheets("Déclaration").ComboLogin.List = T1
End Sub
 

Discussions similaires

Réponses
13
Affichages
368

Statistiques des forums

Discussions
312 330
Messages
2 087 335
Membres
103 521
dernier inscrit
Excellover 21