Concatener sans doublon titre colonne si "VRAI"
Bonjour
dans le doc joint, dans l'USF, je voudrais faire apparaitre dans le textbox1, une concaténation mais sans doublons des titres de colonnes dès que l'info VRAI (en jaune) se retrouve dans les colonnes I à O selon les choix faits dans les 3 combo.
Pas facile a expliquer donc je vous ai joint une t'ite capture d'écran en exemple ...
Quelques précisions qui peuvent être utiles :
- Dans le classeur réel, il y a 18 combo (les n° se suivent)
- tous les combo ne sont pas forcément renseignés
Merci d'avance
cordialement
Bonjour Boby, bonjour le forum,
Essaie avec ce code :
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Private Sub UserForm_Initialize()
Dim O As Worksheet 'déclare la variable O (Onglet)
Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
For I = 1 To 3 'boucle sur les 3 ComboBoxes
'alimente la Combobox avec les données de A2 à A... dernière ligne éditée de la colonne A de l'onglet O
Me.Controls("ComboBox" & I).List = O.Range("A2:A" & O.Range("A" & Application.Rows.Count).End(xlUp).Row).Value
Next I 'prochaine ComboBox de la boucle
End Sub
Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
Dim LI As Integer 'déclare la variable LI (Ligne)
LI = Me.ComboBox1.ListIndex + 2 'définit la ligne LI
For I = 9 To 15 'boucle sur les colonnes 9 à 15 (= I à O)
'si la donnée ligne LI colonne I de TV est égale à [Vrai], récupère (en concatenant) le titre le la colonne ligne 1 de TV
If TV(LI, I) = True Then Me.TextBox1 = IIf(Me.TextBox1 = "", TV(1, I), Me.TextBox1.Value & ", " & TV(1, I))
Next I 'prochaine colonne de la boucle
End Sub
Private Sub ComboBox2_Change() 'au changement dans la ComboBox2
Dim LI As Integer 'déclare la variable LI (Ligne)
LI = Me.ComboBox2.ListIndex + 2 'définit la ligne LI
For I = 9 To 15 'boucle sur les colonnes 9 à 15 (= I à O)
'si la donnée ligne LI colonne I de TV est égale à [Vrai], récupère (en concatenant) le titre le la colonne ligne 1 de TV
If TV(LI, I) = True Then Me.TextBox1 = IIf(Me.TextBox1 = "", TV(1, I), Me.TextBox1.Value & ", " & TV(1, I))
Next I 'prochaine colonne de la boucle
End Sub
Private Sub ComboBox3_Change() 'au changement dans la ComboBox3
Dim LI As Integer 'déclare la variable LI (Ligne)
LI = Me.ComboBox3.ListIndex + 2 'définit la ligne LI
For I = 9 To 15 'boucle sur les colonnes 9 à 15 (= I à O)
'si la donnée ligne LI colonne I de TV est égale à [Vrai], récupère (en concatenant) le titre le la colonne ligne 1 de TV
If TV(LI, I) = True Then Me.TextBox1 = IIf(Me.TextBox1 = "", TV(1, I), Me.TextBox1.Value & ", " & TV(1, I))
Next I 'prochaine colonne de la boucle
End Sub[Édition]
Oooops !... Je navet pas bien lu... Je revoie ma copie pour le "sans doublon"...
Bonjour
Merci pour votre intéressement à cette problématique.
J'ai effectivement testé votre code, les doublons ne sont pas supprimés.
J'attend patiemment votre nouvelle proposition.
Merci d'avance et bonne journée.
Cordialement
Bonjour Boby, bonjour le forum,
Le code sans doublon :
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Private D As Object 'déclare la variable D (Dictionnaire)
Private Sub UserForm_Initialize()
Dim O As Worksheet 'déclare la variable O (Onglet)
Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionanire D
For I = 1 To 3 'boucle sur les 3 ComboBoxes
'alimente la Combobox avec les données de A2 à A... dernière ligne éditée de la colonne A de l'onglet O
Me.Controls("ComboBox" & I).List = O.Range("A2:A" & O.Range("A" & Application.Rows.Count).End(xlUp).Row).Value
Next I 'prochaine ComboBox de la boucle
End Sub
Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
Dim LI As Integer 'déclare la variable LI (Ligne)
LI = Me.ComboBox1.ListIndex + 2 'définit la ligne LI
For I = 9 To 15 'boucle sur les colonnes 9 à 15 (= I à O)
'si la donnée ligne LI colonne I de TV est égale à [Vrai], alimente le dictionnaire D avec les en-tête, renvoie dans la TextBox1, les éléments du dictionnaire D sans doublon
If TV(LI, I) = True Then D(TV(1, I)) = "": TextBox1.Value = Join(D.keys, ", ")
Next I 'prochaine colonne de la boucle
End Sub
Private Sub ComboBox2_Change() 'au changement dans la ComboBox2
Dim LI As Integer 'déclare la variable LI (Ligne)
LI = Me.ComboBox2.ListIndex + 2 'définit la ligne LI
For I = 9 To 15 'boucle sur les colonnes 9 à 15 (= I à O)
'si la donnée ligne LI colonne I de TV est égale à [Vrai], alimente le dictionnaire D avec les en-tête, renvoie dans la TextBox1, les éléments du dictionnaire D sans doublon
If TV(LI, I) = True Then D(TV(1, I)) = "": TextBox1.Value = Join(D.keys, ", ")
Next I 'prochaine colonne de la boucle
End Sub
Private Sub ComboBox3_Change() 'au changement dans la ComboBox3
Dim LI As Integer 'déclare la variable LI (Ligne)
LI = Me.ComboBox3.ListIndex + 2 'définit la ligne LI
For I = 9 To 15 'boucle sur les colonnes 9 à 15 (= I à O)
'si la donnée ligne LI colonne I de TV est égale à [Vrai], alimente le dictionnaire D avec les en-tête, renvoie dans la TextBox1, les éléments du dictionnaire D sans doublon
If TV(LI, I) = True Then D(TV(1, I)) = "": TextBox1.Value = Join(D.keys, ", ")
Next I 'prochaine colonne de la boucle
End SubSi tu dis qu'il y a 18 ComboBoxes, plutôt que d'avoir 18 macros Change (une par ComboBox) il serait préférable d'utiliser une Module de Classe et de regrouper en un seul événement. Je pourrai le faire si ça t'intéresse mais que ce soir...
Bonjour
Ça me semble parfait, merci beaucoup.
Oui bien sûr, un module de classe m'intéresserait.
Je le découvrirai avec plaisir dès que tu le pourras.
Merci encore et bonne journée
Bonsoir Boby, bonsoir le forum,
En pièce jointe ton fichier modifié avec un Module de Classe. Attention, si tu transposes les codes dans ton fichier original, il faut que le module de classe soit aussi renommé CBBox et il te faudra copier/coller l'intégralité du code qui se trouve dans les composants suivants :
• Module de Classe / CBBox
• Module / Module1
• UserForm1
J'ai codé pour que ça s'adapte automatiquement à condition que, comme tu l'as dit, les ComboBoxes se suivent de ComboBox1 à ComboBox18...
Bonjour
Essayez: la combinaison 4 -6-8 qui donne (Voiture, Radiateur, Blabla, Maroc, Casier) puis sans quitter l’UserForm essayez la combinaison 12 -20-24 qui doit donner (Autre chose, Maroc) alors qu’elle donne (Voiture, Sucre, Casier, Radiateur, Maroc, Blabla, Autre chose) vous constatez que le tableau doit être initialisé à chaque fois qu’une comboBox est changé, si non il va conserver les données (genre de cumulation) donc fausser le résultat
Essayer avec ca :
Private Sub ComboBox1_Change()
rplr_tstbx
End Sub
Private Sub ComboBox2_Change()
rplr_tstbx
End Sub
Private Sub ComboBox3_Change()
rplr_tstbx
End Sub
Private Sub UserForm_Initialize()
Dim Bx
With Sheets("Feuil1")
Set Plage = .Range("A2:A" & .Range("A65536").End(xlUp).Row)
End With
For Bx = 1 To 3 'Bx changer le nbre de ComboBox de 3 a 18
Me.Controls("ComboBox" & Bx).List = Plage.Value
Next Bx
End Sub
Private Sub rplr_tstbx()
Dim i As Integer, x As Integer, D
'-----------------------#######-----------------------
Set D = CreateObject("Scripting.Dictionary")
With Sheets("Feuil1")
For Bx = 1 To 3 'Bx changer le nbre de ComboBox de 3 a 18
For J = 9 To 15
If .Cells(Me.Controls("ComboBox" & Bx).ListIndex + 2, J).Value = True Then
D(.Cells(1, J).Value) = ""
TextBox1.Value = Join(D.keys, ", ")
End If
Next J
Next Bx
End With
End Subpour le module de classe Essayer avec ca :
Quelques précisions qui peuvent être utiles :
- Dans le classeur réel, il y a 18 combo (les n° se suivent)
Sur le classeur réel changer le nbre de ComboBox de 3 a 18 Dans le module de classe et dans l’userform
ReDim TCB(1 To 3) ' changer le nbre de ComboBox de 3 a 18
For Bx = 1 To 3 'Bx changer le nbre de ComboBox de 3 a 18- tous les combo ne sont pas forcément renseignés
si une ComboBox n est pas renseigné
UserForm1.Controls("ComboBox" & Bx).ListIndex + 2 prend toujours la valeur =1 , ce qui représente la ligne 1 sur la feuille Excel et ca ne produit pas des erreurs mais il faut être prudent comme même
Bonjour
C'est parfait.
L'adaptation à mon fichier semble correcte.
Je vous remercie infiniment.
Bonne journée
Bonjour Boby, Amir, bonjour le forum,
Bien vu Amir ! Mon code en effet avait quelques défauts que je navet (oui dans ce cas on peut !) pas relevés...