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
J'espère avoir été suffisamment clair.

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 Sub

Si 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...

24boby-v01.xlsm (35.53 Ko)

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 Sub

pour 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...

Rechercher des sujets similaires à "concatener doublon titre colonne vrai"