Doublons dans plusieurs combobox

FloFloM

XLDnaute Nouveau
Bonsoir,

J'aimerais supprimer les doublons de mes combobox. J'ai lu sur d'autres articles qu'il fallait faire des combobox imbriquées... mais je n'ai pas le cerveau bien imbriqué à cette heure. Si quelqu'un de plus lucide pourrait me mettre sur la voie, je lui en serai reconnaissant !!!

Je vous prie de bien vouloir trouver ci-joint mon fichier avec macro.

Merci au moins de me donner une piste :)
 

Pièces jointes

  • Fichier test.xlsm
    77 KB · Affichages: 37

Dranreb

XLDnaute Barbatruc
Re-bonsoir.
Mon objet ComboBoxLiées s'en occupe tout seul. Il crée pour chaque ComboBox dont il a la charge une liste classée, sans doublon, et dépendant des choix déjà effectués dans les autres.
Tout ce que vous avez à faire dans la Sub UserForm_Initialize c'est d'indiquer chacun d'eux à sa méthode Add suivi de la colonne d'où prendre la liste. Mais tout cela est expliqué dans l'aide de CBxL.
 

FloFloM

XLDnaute Nouveau
Bonjour,

Fonction qui renvoie un Array(xx,3) sans doublons

Code:
Function SansDoublons3(Tbl)
Dim d, i, j, c, clé, a
Set d = CreateObject("Scripting.Dictionary")
For i = LBound(Tbl) To UBound(Tbl)
   clé = CStr(Tbl(i, 1)) & "|" & Tbl(i, 2) & "|" & Tbl(i, 3)
   d(clé) = d(clé) + 1
Next i
j = 0
Dim b(): ReDim b(1 To d.Count, 1 To 3)
For Each c In d.keys
     j = j + 1
     a = Split(c, "|")
     b(j, 1) = a(0): b(j, 2) = a(1): b(j, 3) = a(2)
Next c
SansDoublons3 = b
End Function

Code:
 Set f = Sheets("historique global")
Tbl = f.Range("b2:d" & f.[b65000].End(xlUp).Row).Value
Me.cboMember.List = SansDoublons3(Tbl)

Bisson
Bonjour,
J'ai testé d'entrer le code sur vba mais j'ai toujours mes doublons.
Je ne sais pas par où commencer pour enlever ces doublons...
Merci si vous pourriez me proposer une solution par rapport à mon fichier.
Bonne journée !
 

Dranreb

XLDnaute Barbatruc
Une fois le CBxL.xlam installé et la référence à CBxL cochée, L'important c'est déjà d'écrire le début. C'est facile et ça marche généralement du 1er coup. (je veux dire: la UserForm_Initialize marche du 1er coup et les listes et gestion des choix sont directement opérationnelles tout de suite. Après, bien sûr ça se complique un tout petit peu pour exploiter le travail de CL, l'objet ComboBoxLiées, mais pour la recherche et la localisation d'une ligne, plus rien d'autre à faire !)
J'ai un début qui tourne:
VB:
Option Explicit
Private WithEvents CL As ComboBoxLiées, TLgn() As Long, TV(), LL As Long, LCou As Long

Private Sub UserForm_Initialize()
Set CL = Création.ComboBoxLiées
CL.Plage [A10:H10], True
CL.Add Me.CBxEMAT8, 1
CL.Add Me.CBxAISM, 4
CL.CouleurSympa
CL.Actualiser
End Sub

Private Sub CBnEffacer_Click()
CL.Nettoyer
End Sub

Private Sub CBnPrécédent_Click()
If LL <= 1 Then Beep: Exit Sub
LL = LL - 1: LCou = TLgn(LL): TV = CL.PlgTablo.Rows(LCou).Value
CL.ValeursDepuis TV
GarnirAutresContrôles
End Sub

Private Sub CBnSuivant_Click()
If LL >= UBound(TLgn) Then Beep: Exit Sub
LL = LL + 1: LCou = TLgn(LL): TV = CL.PlgTablo.Rows(LCou).Value
CL.ValeursDepuis TV
GarnirAutresContrôles
End Sub

Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
If NbrLgn > 0 Then Exit Sub
ReDim TLgn(0 To 0), TV(1 To 1, 1 To 10): LL = 1: LCou = 0
GarnirAutresContrôles
End Sub

Private Sub CL_Résultat(Lignes() As Long)
TLgn = Lignes: LL = 1
LCou = TLgn(LL): TV = CL.PlgTablo.Rows(LCou).Value
GarnirAutresContrôles
End Sub

Private Sub GarnirAutresContrôles()
'EMAT8.Text = TV(L, 1) ' déjà en ComboBox CBxEMAT8
NomdeBapteme.Text = TV(1, 2)
ASM.Text = TV(1, 3)
'AISM.Text = TV(L, 4) ' déjà en ComboBox CBxAISM
SGL.Text = TV(1, 5)
CIE.Text = TV(1, 6)
Observation.Text = TV(1, 7)
GQGN.Text = TV(1, 8)
End Sub
 
Dernière édition:

FloFloM

XLDnaute Nouveau
Une fois le CBxL.xlam installé et la référence à CBxL cochée, L'important c'est déjà d'écrire le début. C'est facile et ça marche généralement du 1er coup. J'ai un début qui tourne:
VB:
Option Explicit
Private WithEvents CL As ComboBoxLiées, TLgn() As Long, TV(), LL As Long, LCou As Long

Private Sub UserForm_Initialize()
Set CL = Création.ComboBoxLiées
CL.Plage [A10:H10], True
CL.Add Me.CBxEMAT8, 1
CL.Add Me.CBxAISM, 4
CL.CouleurSympa
CL.Actualiser
End Sub

Private Sub CBnEffacer_Click()
CL.Nettoyer
End Sub

Private Sub CBnPrécédent_Click()
If LL <= 1 Then Beep: Exit Sub
LL = LL - 1: LCou = TLgn(LL): TV = CL.PlgTablo.Rows(LCou).Value
CL.ValeursDepuis TV
GarnirAutresContrôles
End Sub

Private Sub CBnSuivant_Click()
If LL >= UBound(TLgn) Then Beep: Exit Sub
LL = LL + 1: LCou = TLgn(LL): TV = CL.PlgTablo.Rows(LCou).Value
CL.ValeursDepuis TV
GarnirAutresContrôles
End Sub

Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
If Not Complet Then ReDim TLgn(0 To 0)
End Sub

Private Sub CL_Résultat(Lignes() As Long)
TLgn = Lignes: LL = 1
LCou = TLgn(LL): TV = CL.PlgTablo.Rows(LCou).Value
GarnirAutresContrôles
End Sub

Private Sub GarnirAutresContrôles()
'EMAT8.Text = TV(L, 1) ' déjà en ComboBox CBxEMAT8
NomdeBapteme.Text = TV(1, 2)
ASM.Text = TV(1, 3)
'AISM.Text = TV(L, 4) ' déjà en ComboBox CBxAISM
SGL.Text = TV(1, 5)
CIE.Text = TV(1, 6)
Observation.Text = TV(1, 7)
GQGN.Text = TV(1, 8)
End Sub
J'ai copier coller le code et cela ne fonctionne pas. J'ai installé le CBxL en cochant la case dans Références. J'ai déjà Option explicit donc il le voit comme un doublon... A mon avis il y a quelque chose de plus simple mais je ne vois pas.
 

Dranreb

XLDnaute Barbatruc
J'ai oublié de vous dire que j'ai remplacé les TextBox1 et TextBox2 par deux ComboBox CBxAISM et CBxEMAT8, renommé les boutons Précédent et Suivant en mettant CBn devant (comme CommandButton), Remplacé le bouton rechercher par un CBnEffacer (un bouton Rechercher est inutile: la recherche se déclenche d'office sur frappe ou choix dans la ComboBox)
 

FloFloM

XLDnaute Nouveau
J'ai oublié de vous dire que j'ai remplacé les TextBox1 et TextBox2 par deux ComboBox CBxAISM et CBxEMAT8, renommé les boutons Précédent et Suivant en mettant CBn devant (comme CommandButton), Remplacé le bouton rechercher par un CBnEffacer (un bouton Rechercher est inutile: la recherche se déclenche d'office sur frappe ou choix dans la ComboBox)
Pouvez-vous, s'il vous plaît, me renvoyer le fichier "Fichier test"xlsm avec la formule qui fonctionne car je suis totalement perdu là...
 

Dranreb

XLDnaute Barbatruc
Je ne sais pas si j'ai raison de le faire, mais je me suis lancé dans une refonte du Parc PEPG avec deux objets ComboBoxLiées un pour la Base et un pour le Parc, les deux ne pouvant pas fonctionner en même temps parce qu'il ont une ComboBox CBxEMAT8 en commun mais s'appuyent sur 2 tables différentes. Je ne suis donc pas prêt à vous envoyer quelque chose pour l'instant.

Mais bien qu'il soit en chantier, je peux le joindre dans son état actuel.
 

Pièces jointes

  • CBxLiéesFloFloM.xlsm
    380.4 KB · Affichages: 69
Dernière édition:

FloFloM

XLDnaute Nouveau
Je ne sais pas si j'ai raison de le faire, mais je me suis lancé dans une refonte du Parc PEPG avec deux objets ComboBoxLiées un pour la Base et un pour le Parc, les deux ne pouvant pas fonctionner en même temps parce qu'il ont une ComboBox CBxEMAT8 en commun mais s'appuyent sur 2 tables différentes. Je ne suis donc pas prêt à vous envoyer quelque chose pour l'instant.
Je pensais que le but de ce forum était de rendre les choses plus claires pour les utilisateurs VBA plus ou moins compétents. Je ne comprend pas pourquoi vous me répondez de cette manière. Mais je comprend que vous travaillez sur votre projet qui utilise également des combobox liées.
 

FloFloM

XLDnaute Nouveau
upload_2017-10-25_15-29-44.png


Voila mon problème ci-dessus que j'aimerais régler (si quelqu'un à la solution)
 

Dranreb

XLDnaute Barbatruc
C'est une autre application ?
Mais vous pouvez aussi utiliser CBxL pour celle ci.
Pour constituée une liste unique classée et sans doublon vous pouvez faire ComboBox1.List = CBxL.SujetCBx(LaPlage)(0)
Mais vous perdriez plein d'avantages à ne pas utiliser un ComboBoxLiées qui s'occupe de faire toutes ces choses là à votre place…
 

FloFloM

XLDnaute Nouveau
Et par exemple si je veux trier une combobox, juste une sans doublons et triée, quel serait le code simplifié ? J'utilise cette formule pour alimenter ma combobox NomPrenom (ne pas tenir compte de txtFamille, c'est du copier-coller) txtFamille.List = Range("C2:C" & Cells(Application.Rows.Count, 1).End(xlUp).Row).Value . J'ai toujours ces doublons sur la capture que j'ai postée au-dessus.
 

Dranreb

XLDnaute Barbatruc
Essayez ça:
VB:
Option Explicit
Private WithEvents CL As ComboBoxLiées

Private Sub UserForm_Initialize()
Set CL = Création.ComboBoxLiées
CL.Plage shtMember
CL.Add Me.txtFamille, "Nom/Prénom"
CL.Actualiser
End Sub

Virez tout le reste du code. Tout est à refaire de toute façon.
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 917
Membres
101 839
dernier inscrit
laurentEstrées