Doublons dans plusieurs combobox

  • Initiateur de la discussion Initiateur de la discussion FloFloM
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

F

FloFloM

Guest
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

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.
 
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 !
 
Je ne suis pas du tout à l'aise pour comprendre tout ce qui est écrit dans le CBxL. Un jour viendra où tout sera clair pour moi mais si quelqu'un avait la solution à mon problème des doublons, je le remercie !
 
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:
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.
 
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)
 
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à...
 
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

Dernière édition:
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.
 
upload_2017-10-25_15-29-44.png


Voila mon problème ci-dessus que j'aimerais régler (si quelqu'un à la solution)
 
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…
 
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.
 
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.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
8
Affichages
1 K
S
Réponses
56
Affichages
10 K
sebsti34
S
A
Réponses
6
Affichages
2 K
Auzingueur
A
A
Réponses
5
Affichages
2 K
Alminar
A
M
Réponses
6
Affichages
1 K
L
Réponses
20
Affichages
2 K
G
Réponses
12
Affichages
27 K
raphde
R
P
Réponses
6
Affichages
1 K
Parazite
P
V
Réponses
2
Affichages
1 K
V
Retour