Liste combobox triée par ordre alphabétique excluant les doublons et les vides

modus57

XLDnaute Occasionnel
Bonjour le forum. :)

Pour remplir une ComboBox en fonction des données en colonne A j’ai trouvé ce code sur un autre forum :
Code:
Private Sub UserForm_Initialize()
Dim C As Range
Dim tablo()
Dim i As Integer, j As Integer
Dim temp As String
Dim present As Boolean
 
ReDim tablo(1 To 1)
 tablo(1) = Cells(2, 2)
 For Each C In Sheets("exemple 1").Range("A2:A" & Range("A65536").End(xlUp).Row)
     present = False
     For i = 1 To UBound(tablo)
         If tablo(i) = C Then present = True
     Next i
     If Not present Then
         ReDim Preserve tablo(1 To UBound(tablo) + 1)
         tablo(UBound(tablo)) = C
     End If
     For i = 1 To UBound(tablo)
         For j = 1 To UBound(tablo)
             If tablo(i) < tablo(j) Then
                 temp = tablo(i)
                 tablo(i) = tablo(j)
                 tablo(j) = temp
             End If
         Next j
     Next i
 Next C
ComboBox1.List = tablo
End Sub
Cela fonctionne très bien pour la ComboBox1.

Mais comment remplir la ComboBox2 avec les données de la colonne B, la ComboBox3 avec les données de la colonne C, sans être obligé de répéter chaque fois le code en modifiant la lettre de la colonne ?

Auriez-vous une solution, merci d’avance.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Liste combobox triée par ordre alphabétique excluant les doublons et les vides

Bonsoir modus57,

Sans certitude aucune puisqu'aucun fichier joint pour tester.
VB:
Private Sub UserForm_Initialize()
Dim C As Range
Dim tablo()
Dim i As Integer, j As Integer
Dim temp As String
Dim present As Boolean
Dim k as long

for k= 1 to 3
ReDim tablo(1 To 1)
 tablo(1) = Cells(2, k)
 For Each C In Sheets("exemple 1").cells(rows.count,k).End(xlUp).Row
     present = False
     For i = 1 To UBound(tablo)
         If tablo(i) = C Then present = True
     Next i
     If Not present Then
         ReDim Preserve tablo(1 To UBound(tablo) + 1)
         tablo(UBound(tablo)) = C
     End If
     For i = 1 To UBound(tablo)
         For j = 1 To UBound(tablo)
             If tablo(i) < tablo(j) Then
                 temp = tablo(i)
                 tablo(i) = tablo(j)
                 tablo(j) = temp
             End If
         Next j
     Next i
 Next C
me.controls("ComboBox" & k).List = tablo
next k
End Sub
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Liste combobox triée par ordre alphabétique excluant les doublons et les vides

(re)

Après m'être penché sur votre code, je vous proposerai plutôt:
VB:
Private Sub UserForm_Initialize()
Dim C As Range, tablo(), temp
Dim i As Integer, j As Integer, k As Long
Dim present As Boolean, ech As Boolean

For k = 1 To 3
  ReDim tablo(1 To 1)
   tablo(1) = Cells(2, k)
   For Each C In Sheets("exemple 1").Range(Cells(2, k), Cells(Rows.Count, k).End(xlUp))
       present = False
       For i = 1 To UBound(tablo)
           If tablo(i) = C Then
              present = True
              Exit For
            End If
       Next i
       If Not present Then
           ReDim Preserve tablo(1 To UBound(tablo) + 1)
           tablo(UBound(tablo)) = C
       End If
    Next C
    
    Do
    ech = False
       For i = 1 To UBound(tablo) - 1
          If tablo(i + 1) < tablo(i) Then
              temp = tablo(i)
              tablo(i) = tablo(i + 1)
              tablo(i + 1) = temp
              ech = True
          End If
       Next i
    Loop Until Not ech
  Me.Controls("ComboBox" & k).List = tablo
Next k
End Sub
 

Pièces jointes

  • Liste combobox.xlsm
    20.3 KB · Affichages: 69
  • Liste combobox.xlsm
    20.3 KB · Affichages: 78
  • Liste combobox.xlsm
    20.3 KB · Affichages: 82
Dernière édition:

modus57

XLDnaute Occasionnel
Re : Liste combobox triée par ordre alphabétique excluant les doublons et les vides

Bonsoir mapomme, BOISGONTIER.

Merci pour vos réponses.

JB j'ai cliqué sur votre lien, le code que vous proposez ne répond pas à ma question.

Par contre celui de mapomme convient, sauf petit détail, si des cellules sont vides dans les colonnes A-B-C, au déroulement des ComboBox 1-2-3 la première donnée est vide ?

Est-ce possible de corriger ce petit problème.

@ + modus57
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Liste combobox triée par ordre alphabétique excluant les doublons et les vides

(re)Bonsoir Modis57,

sauf petit détail, si des cellules sont vides dans les colonnes A-B-C, au déroulement des ComboBox 1-2-3 la première donnée est vide ?
Est-ce possible de corriger ce petit problème.

Voir le fichier joint. Rajouté la ligne suivante juste avant la ligne du "Next k":
Code:
If Me.Controls("ComboBox" & k).List(0) = "" Then Me.Controls("ComboBox" & k).RemoveItem 0
 

Pièces jointes

  • Liste combobox v2.xlsm
    24.7 KB · Affichages: 68

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Liste combobox triée par ordre alphabétique excluant les doublons et les vides

Pour 1.000 lignes, le programme initial prend 37 secondes
C'est un bon exemple de ce qu'il ne faut pas faire.
Le mien 0,04 s

JB
 

Pièces jointes

  • Copie de FormListeTrieeVidesSD.xls
    106 KB · Affichages: 76
  • Copie de FormListeTrieeVidesSD2.xls
    133 KB · Affichages: 71
Dernière édition:

modus57

XLDnaute Occasionnel
Re : Liste combobox triée par ordre alphabétique excluant les doublons et les vides

Bonjour BOISGONTIER , mapomme.:)

Effectivement j’aurais dû joindre un fichier, désolé !

J’opte pour votre solution BOISGONTIER nettement plus rapide.

Une question subsidiaire, dans votre formulaire les comboBox ont le fond blanc.

J’aurais aimé savoir si on pouvait changer la couleur de fond (exemple bleu clair) au moment où l’on clique avec la souris sur un comboBox et quand on passe au suivant il reprenne sa couleur de fond blanc.

L’utilisation des évènements 'Enter' et 'Exit' pour 3 combobox n’est pas contraignante, mais en admettant que l’userform en contienne plusieurs dizaine, quelle est la procédure à suivre ?

Un module de classe peut-être, pourriez-vous m’aider, car j’ai peu de connaissance dans ce domaine.

Est-ce nécessaire de créer une nouvelle discussion ?

@+
 

Eric C

XLDnaute Barbatruc
Re : Liste combobox triée par ordre alphabétique excluant les doublons et les vides

Bonjour le forum
Bonjour modus57, bonjour mapomme, bonjour BOISGONTIER

La dernière réponse à ta question relative aux modules de classes faisant référence aux évènements, se trouve sur ce lien :
https://www.excel-downloads.com/threads/exemples-modules-de-classe.111527/
(Module de classe n° 03). Je suis certain que tu trouveras ta réponse - Attention, il faut attendre un peu avant le téléchargement, pub oblige.
 
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Liste combobox triée par ordre alphabétique excluant les doublons et les vides

Bonjour,


Cf PJ

Code:
Module de classe

Public WithEvents GrCbx As Msforms.ComboBox
Private Sub GrCbx_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  For i = 1 To 3
    GrCbx.Parent("Combobox" & i).BackColor = RGB(255, 255, 255)
  Next
  GrCbx.BackColor = RGB(255, 0, 0)
End Sub

Code:
Option Compare Text
Dim Cbx(1 To 10) As New ClasseCbx
Private Sub UserForm_Initialize()
  Dim temp()
  For i = 1 To 3
   Set Cbx(i).GrCbx = Me("ComboBox" & i)
  Next i
  Set f = Sheets("exemple 1")
  For col = 1 To 3
    Set MonDico = CreateObject("Scripting.Dictionary")
    derlig = f.Cells(65000, col).End(xlUp).Row
    For Each C In Range(f.Cells(2, col), f.Cells(derlig, col))
      If C.Value <> "" Then MonDico.Item(C.Value) = ""
    Next C
    temp = MonDico.keys
    Call tri(temp, LBound(temp), UBound(temp))
    Me("ComboBox" & col).List = temp
  Next col
End Sub

Formulaire & classes
Création de classe

JB
 

Pièces jointes

  • Copie de Copie de FormListeTrieeVidesSD2.xls
    133 KB · Affichages: 74
Dernière édition:

modus57

XLDnaute Occasionnel
Re : Liste combobox triée par ordre alphabétique excluant les doublons et les vides

Bonjour BOISGONTIER, bonjour Eric C. :D

Je vous adresse tardivement mes remerciements, à BOISGONTIER pour la réponse à ma question et à Eric C pour le lien qui me permettra de me familiariser avec les modules de classes.

Cordiales salutations.
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 848
dernier inscrit
Djigbenou