Combobox alimentée par plusieurs colonne

  • Initiateur de la discussion Initiateur de la discussion TheLio
  • 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 !

TheLio

XLDnaute Accro
Salut le forum et les mordus du Sub
Je suis en train d'alimenter des combobox par plages données (merci Hasco🙂)
ce qui donne ceci:
Code:
Private Sub UserForm_Initialize()
cbAversions1.List = Range("Aversions").Value
cbAversions2.List = Range("Aversions").Value
...
Mais la plage "Aversions" fait références à (AE6:AO357)avec des espaces vides, des doublons et le tout bien évidemment dans un ordre non-alphabétique🙄.
Comment alimenter mes combo : (cbAversions de 1 à 11) avec cette plage nommée et sans tous les désagréments cités en deuxième paragraphe.

J'ai cherché sur le forum, il y a différentes techniques associées à un cas. Mais je n'ai pas trouvé le code magique qui rassemble le tout.
Est-ce possible?
Merci d'avance pour vos éclairages.
Bonne(s) Journée(s)
Lio
 
Re : Combobox alimentée par plusieurs colonne

Bonjour,

je ne comprends pas bien...

Tes combo ont-ils 11 colonnes, ou tu alimentes chaque combo avec une colonne?

Exemple combo1 avec colonne AE, combo2 avec colonne AF.....

Et tu désires également le tri alphabétique, c'est ça?
 
Re : Combobox alimentée par plusieurs colonne

Hello,
Pas exactement, j'aimerais que les 11 combo soient alimentées avec l'intégralité des 11 colonnes (sans doublons et dans l'ordre alpha)
Pour éviter d'avoir un trop grand choix (qui ets déjà énorme)
Merci
A++
Lio
 
Re : Combobox alimentée par plusieurs colonne

Bonjour Lio,

Où l'on voit que ce qui est simple dans un cas se complique dans un autre.

Ta demande est trop vague pour pouvoir y répondre précisément.

Toutefois, dans ce cas je commencerai par faire une macro de tri de ta plage avec l'enregistreur de macro. Ensuite essaie de l'adapter à ce que tu veux.

Puis tu détermines sur quelle(s) colonne(s) il faut déterminer ce qui est doublon de ce qui ne l'est pas.

Quant aux vides??? je ne vois pas (Cellule(s), ligne(s),colonne(s) vides?)

Lorsque tu auras fait cela, joint un fichier avec ta macro et ton userform et des explications plus précises de ce que tu souhaites.

A+
[EDITION] Salut l'ami Bh²!
 
Re : Combobox alimentée par plusieurs colonne

Re les spécialistes des combo 😉
Je vous mets le fichier en pièce jointe.
Car je ne peux faire un tri sur le tablo...
C'est dans la combo qu'il doit être fait, ou alors, une fois de plus je n'ai rien compris.
Merci pour votre intérêt à mon cas bientôt désespéré.
A++
Lio
 

Pièces jointes

Re : Combobox alimentée par plusieurs colonne

Re-,

Edit : Salut Hasco 🙂🙂


essaie avec ce code (Merci à JB "Boisgontier", pour le code de tri

Nota, redéfinis ta zone "Aversions" de =BD!$AE$7:$AO$357

Code:
Private Sub UserForm_Initialize()
    'A l'ouverture du userform charger les information dans la combobox
    
    Me.cbChambres.List = Sheets("BD").Range("A6:A" & Sheets("BD").[A65000].End(xlUp).Row).Value
    cbPortionMatin.List = Range("Portions").Value
    cbPortionMidi.List = Range("Portions").Value
    cbPortionSoir.List = Range("Portions").Value
    cbRegime1.List = Range("Abrev_Regime").Value
    cbRegime2.List = Range("Abrev_Regime").Value
    cbRegime3.List = Range("Abrev_Regime").Value
    cbRegime4.List = Range("Abrev_Regime").Value
    cbConsistmidi.List = Range("Abrév_Consist").Value
    cbConsistsoir.List = Range("Abrév_Consist").Value
    cbAllergy.List = Range("Notify_Allergy").Value
Set Avers = CreateObject("Scripting.Dictionary")
    For Each cel In Range("Aversions").SpecialCells(xlCellTypeConstants, 23)
        If Not Avers.Exists(cel.Value) Then Avers.Add cel.Value, cel.Value
    Next cel
    temp = Avers.items
Call tri(temp, LBound(temp), UBound(temp))
For i = 1 To 11
    Me.Controls("cbAversions" & i).List = Application.Transpose(temp)
Next i
    End Sub

Sub tri(a, gauc, droi) ' Quick sort
  ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call tri(a, g, droi)
  If gauc < d Then Call tri(a, gauc, d)
End Sub

Ton fichier modifié :
 

Pièces jointes

Dernière édition:
Re : Combobox alimentée par plusieurs colonne

Bonsoir à tous, Bh² 😉

Comme j'ai fait également mon code, je le mets également.
Avec une "simple" collection

Code:
Private Sub UserForm_Initialize()
  Dim Inc
  ' Récupérer la liste des AVERSIONS sans ESPACES NI DOUBLONS et la TRIER
  Call CreationListe
  
  'A l'ouverture du userform charger les information dans la combobox
  Me.cbChambres.List = Sheets("BD").Range("A6:A" & Sheets("BD").[A65000].End(xlUp).Row).Value
  cbPortionMatin.List = Range("Portions").Value
  cbPortionMidi.List = Range("Portions").Value
  cbPortionSoir.List = Range("Portions").Value
  cbRegime1.List = Range("Abrev_Regime").Value
  cbRegime2.List = Range("Abrev_Regime").Value
  cbRegime3.List = Range("Abrev_Regime").Value
  cbRegime4.List = Range("Abrev_Regime").Value
  cbConsistmidi.List = Range("Abrév_Consist").Value
  cbConsistsoir.List = Range("Abrév_Consist").Value
  cbAllergy.List = Range("Notify_Allergy").Value
  ' Pour chaque Combobox, attribuer la liste des AVERSIONS
  For Inc = 1 To 11
    Call MaJCombo(Me("cbAversions" & Inc))
  Next Inc
End Sub


Sub CreationListe()
  ' Pour chaque cellule de la plage AVERSIONS
  For Each Cel In Range("Aversions")
    On Error Resume Next
    ' Si la valeur de la cellule n'est pas vide
    ' Alors l'ajouter à la collection
    If Cel.Value <> "" Then
      MyCol.Add Cel.Value, Cel.Value
    End If
    On Error GoTo 0
  Next
  ' Effectuer le tri dans la collection
  Dim I As Integer, J As Integer, Swap1 As String, Swap2 As String
  For I = 1 To MyCol.Count - 1
    For J = I + 1 To MyCol.Count
      If MyCol(I) > MyCol(J) Then
        Swap1 = MyCol(I)
        Swap2 = MyCol(J)
        MyCol.Add Swap1, before:=J
        MyCol.Add Swap2, before:=I
        MyCol.Remove I + 1
        MyCol.Remove J + 1
      End If
    Next J
  Next I
End Sub

Sub MaJCombo(CbName As ComboBox)
  Dim I As Integer
  For I = 1 To MyCol.Count
    CbName.AddItem MyCol(I)
  Next I
End Sub
A+
 
Dernière modification par un modérateur:
Re : Combobox alimentée par plusieurs colonne

Bravo et encore Merci à vous trois.
Je comprend mieux le code à Bruno mais les deux donnent le résultat escompté.
Je vasi tenter de créer d'autres collections de ce type pour les préférences.
Dois-je nommer d'autre variables, ou je peux continuer avec les mêmes?
Arrêtez-moi vite avant que je "bouzille" tout 😉
A++
Merci
Lio
 
Re : Combobox alimentée par plusieurs colonne

Hello,
j'ai tenté de reproduire le code pour avoir une deuxième collection sans doublons.En rouge dans le code joint
Mais j'ai du faire une boulette.
Code:
Dim Cel As Range, MyCol As New Collection, VItem As Integer

'-------------------------------------------------------
'La combobox s'appelle cbChambres (plus facile de savoir de quoi il s'agit
'dans le code lorsque qu'on nomme les contrôles)
'Dans le Frame1 les labels contenant les information de l'occupant de chambre
'ont pour racine de nom 'lb' (lbNom, lbPrenom,lbAge)
'Leur propriété 'tag' contient le numéro de colonne de la feuille BD
'à partir de laquelle l'information sera extraite
'-------------------------------------------------------
Private Sub cbChambres_Click()
    Dim ligne As Long 'Ligne de BD
    Dim Col As Long   'Colonne
    Dim obj As Control
    'Si une sélection de chambre a été faite
    If cbChambres.ListIndex > -1 Then
        'Récupération du numéro de ligne dans la feuille
        ligne = 6 + cbChambres.ListIndex
        
        'Chargement des informations dans les labels idoines
        For Each obj In frInfos.Controls
            'Si les deux premières lettre du nom du contrôle sont lb
            'on a affaire à un label information
            If Left(obj.Name, 2) = "lb" Then
               'Récupère l'information dans BD correspondant à la ligne 'Ligne'
               'Et au numéro de colonne contenu dans la propriété 'tag' du label
               obj.Caption = Sheets("BD").Cells(ligne, Val(obj.Tag)).Text
            End If
        Next obj
      For Each obj In frPortions.Controls
     If Left(obj.Name, 9) = "cbPortion" Then
        obj.Text = Sheets("BD").Cells(ligne, Val(obj.Tag)).Text
     End If
Next ' obj in frPortions.Controls
For Each obj In frListe_Regime.Controls
      If Left(obj.Name, 8) = "cbRegime" Then
           obj.Text = Sheets("BD").Cells(ligne, Val(obj.Tag)).Text
       End If
       Next ' obj in frPortions.Controls
For Each obj In frConsistances.Controls
      If Left(obj.Name, 9) = "cbConsist" Then
           obj.Text = Sheets("BD").Cells(ligne, Val(obj.Tag)).Text
       End If
 Next ' obj in frConsitances.Controls
 For Each obj In frAllergy.Controls
      If Left(obj.Name, 9) = "cbAllergy" Then
           obj.Text = Sheets("BD").Cells(ligne, Val(obj.Tag)).Text
       End If
 Next ' obj in frAllergy.Controls
  For Each obj In frAversions.Controls
      If Left(obj.Name, 11) = "cbAversions" Then
           obj.Text = Sheets("BD").Cells(ligne, Val(obj.Tag)).Text
       End If
 Next ' obj in frAversions.Controls
 For Each obj In frPreferences.Controls
      If Left(obj.Name, 13) = "cbPreferences" Then
           obj.Text = Sheets("BD").Cells(ligne, Val(obj.Tag)).Text
       End If
 Next ' obj in frPreferences.Controls
            End If
End Sub

Private Sub CommandButton1_Click()
Dim ligne As Long 'Ligne de BD
    Dim Col As Long   'Colonne
    Dim obj As Control
    'Si une sélection de chambre a étée faite
    If cbChambres.ListIndex > -1 Then
        'Récupération du numéro de ligne dans la feuille
        ligne = 6 + cbChambres.ListIndex
        
        'Chargement des informations dans les labels idoines
        For Each obj In frInfos.Controls
            'Si les deux premières lettre du nom du contrôle sont lb
            'on a affaire à un label information
            If Left(obj.Name, 2) = "lb" Then
               'Récupère l'information dans BD correspondant à la ligne 'Ligne'
               'Et au numéro de colonne contenu dans la propriété 'tag' du label
               obj.Caption = Sheets("BD").Cells(ligne, Val(obj.Tag)).Text
            End If
        Next obj
        For Each obj In frPortions.Controls
            If Left(obj.Name, 9) = "cbPortion" Then
                Sheets("BD").Cells(ligne, Val(obj.Tag)).Value = obj.Text
                End If
                Next
                For Each obj In frListe_Regime.Controls
            If Left(obj.Name, 8) = "cbRegime" Then
                Sheets("BD").Cells(ligne, Val(obj.Tag)).Value = obj.Text
                End If
                Next
                For Each obj In frConsistances.Controls
            If Left(obj.Name, 9) = "cbConsist" Then
                Sheets("BD").Cells(ligne, Val(obj.Tag)).Value = obj.Text
            End If
            Next
         For Each obj In frAllergy.Controls
            If Left(obj.Name, 9) = "cbAllergy" Then
                Sheets("BD").Cells(ligne, Val(obj.Tag)).Value = obj.Text
            End If
        Next
          For Each obj In frAversions.Controls
            If Left(obj.Name, 11) = "cbAversions" Then
                Sheets("BD").Cells(ligne, Val(obj.Tag)).Value = obj.Text
            End If
        Next
        For Each obj In frPreferences.Controls
            If Left(obj.Name, 13) = "cbPreferences" Then
                Sheets("BD").Cells(ligne, Val(obj.Tag)).Value = obj.Text
            End If
        Next
    End If
End Sub

Private Sub UserForm_Initialize()
  Dim Inc
  ' Récupérer la liste des AVERSIONS sans ESPACES NI DOUBLONS et la TRIER
  Call CreationListe
  ' Récupérer la liste des Preferences sans ESPACES NI DOUBLONS et la TRIER
  Call CreationListe2
  
  'A l'ouverture du userform charger les information dans la combobox
  Me.cbChambres.List = Sheets("BD").Range("A6:A" & Sheets("BD").[A65000].End(xlUp).Row).Value
  cbPortionMatin.List = Range("Portions").Value
  cbPortionMidi.List = Range("Portions").Value
  cbPortionSoir.List = Range("Portions").Value
  cbRegime1.List = Range("Abrev_Regime").Value
  cbRegime2.List = Range("Abrev_Regime").Value
  cbRegime3.List = Range("Abrev_Regime").Value
  cbRegime4.List = Range("Abrev_Regime").Value
  cbConsistmidi.List = Range("Abrév_Consist").Value
  cbConsistsoir.List = Range("Abrév_Consist").Value
  cbAllergy.List = Range("Notify_Allergy").Value
  ' Pour chaque Combobox, attribuer la liste des AVERSIONS
  For Inc = 1 To 11
    Call MaJCombo(Me("cbAversions" & Inc))
  Next Inc
  ' Pour chaque Combobox, attribuer la liste des Préférences
[COLOR="Red"]  For Inc = 1 To 13
    Call MaJCombo2(Me("cbPreferences" & Inc))
    Next Inc[/COLOR]
End Sub


Sub CreationListe()
  ' Pour chaque cellule de la plage AVERSIONS
  For Each Cel In Range("Aversions")
    On Error Resume Next
    ' Si la valeur de la cellule n'est pas vide
    ' Alors l'ajouter à la collection
    If Cel.Value <> "" Then
      MyCol.Add Cel.Value, Cel.Value
    End If
    On Error GoTo 0
    Next
  ' Effectuer le tri dans la collection
  Dim I As Integer, J As Integer, Swap1 As String, Swap2 As String
  For I = 1 To MyCol.Count - 1
    For J = I + 1 To MyCol.Count
      If MyCol(I) > MyCol(J) Then
        Swap1 = MyCol(I)
        Swap2 = MyCol(J)
        MyCol.Add Swap1, before:=J
        MyCol.Add Swap2, before:=I
        MyCol.Remove I + 1
        MyCol.Remove J + 1
      End If
    Next J
  Next I
End Sub
[COLOR="red"]Sub CreationListe2()

' Pour chaque cellule de la plage PREFERENCES
  For Each Cel In Range("Preferences")
    On Error Resume Next
    ' Si la valeur de la cellule n'est pas vide
    ' Alors l'ajouter à la collection
    If Cel.Value <> "" Then
      MyCol2.Add Cel.Value, Cel.Value
    End If
    On Error GoTo 0
  Next
    ' Effectuer le tri dans la collection
  Dim K As Integer, L As Integer, Swap3 As String, Swap4 As String
  For K = 1 To MyCol2.Count - 1
    For L = K + 1 To MyCol2.Count
      If MyCol2(K) > MyCol2(L) Then
        Swap3 = MyCol2(K)
        Swap4 = MyCol2(L)
        MyCol2.Add Swap3, before:=L
        MyCol2.Add Swap4, before:=K
        MyCol2.Remove K + 1
        MyCol2.Remove L + 1
      End If
    Next L
  Next K
End Sub[/COLOR]Sub MaJCombo(CbName As ComboBox)
  Dim I As Integer
  For I = 1 To MyCol.Count
    CbName.AddItem MyCol(I)
  Next I
End Sub
[COLOR="red"]Sub MaJCombo2(CbName2 As ComboBox)
    Dim K As Integer
    For K = 1 To MyCol2.Count
    CbName2.AddItem MyCol2(K)
    Next K
End Sub[/COLOR]
Merci pour vos conseils
A++
Lio
 
Re : Combobox alimentée par plusieurs colonne

Bonjour tous,
La démarche est peu courtoise, mais je le fais tout de même 😛
Je pars pour travailler alors je fais un petit "UP"
Et comme ça ce soir quand je rentre, je pourrais continuer à plancher sur mon USF.
Re-merci d'avance, bon dimanche
A++
Lio
 
Re : Combobox alimentée par plusieurs colonne

Bonjour TheLio,

As ton retour du travail, tu trouveras ton fichier modifié 😉

Comme suite à ton post d'hier 19h23, la réponse est : oui
on peut utiliser la même variable pour les collections, mais avec un petit aménagement.

Il faut déclarer "New Collection" dans la procédure

A+
 

Pièces jointes

Re : Combobox alimentée par plusieurs colonne

Hello,
Merci vous trois,
Je n'ai plus beaucoup de mérite pour la création de ce fichier, car vous me livrez du "tout cuit" 🙂
Dans le but de me coucher un peu moins ignorant ce soir, tu déclares "VItem As Integer", j'ai cherché des explications la-dessus, mais n'ai rien trouvé... De quoi sagit-il?
Merci d'avance pour la contribution à ma culture 🙂
A++
Lio
 
- 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

Discussions similaires

C
Réponses
1
Affichages
2 K
Clo from Ghost World
C
Retour