OVH Cloud OVH Cloud

doublons et tri dans 1 combo

1 réponse
Avatar
srogeau
bonsoir a tous
j'utilise cette ligne de code pour remplir une combo
ComboBox1.RowSource = "N1:N" & ActiveSheet.UsedRange.Rows.Count
que faut il rajouter pour qu'il ne m'affiche pas les doublons et que la liste
affichee
soit trier par ordre alphabetique
merci pour vos conseils

1 réponse

Avatar
michdenis
Bonjour Srogeau,

Voici une façon de faire qui peut sembler un peu compliquer mais qui est très efficace... tu n'as qu'à suivre les
indications...

TU NE DOIS PAS UTILISER LA PROPRIÉTÉ ROWSOURCE DU COMBOBOX ...laisse-la vide ...

À l'aide d'une fonction utilisant ADO (activex data objet), il est
possible de combiner plusieurs opérations dans la même :

A ) Éliminer les doublons
B ) Trier les items du combobox par ordre croissant
C ) Éliminer les lignes(entrées) vides si il y en a dans la plage de cellules.

Pour ce faire, ajouter la bibliothèque suivante à ton projet :
"Microsoft Activex Data Object 2.0 Librairy"

Le nom de la feuille et la plage de cellules doivent être adapté
selon ton projet.

Selon que ta plage de cellules a une étiquette de colonne tu devras
utiliser dans cette ligne de code qui fait référence à une fonction différente...

Me.ComboBox1.List = MaListe(Rg, Fichier) 'Avec étiquette

OU

Me.ComboBox1.List = MaListe1(Rg, Fichier) 'Sans étiquette


à copier dans le module du formulaire
'---------------------------------------------
Private Sub UserForm_Initialize()

Dim Rg As Range, Fichier As Workbook

Set Fichier = ThisWorkbook

With Worksheets("Denis")
Set Rg = Range("A1:A" & .Range("A65536").End(xlUp).Row)
End With

Me.ComboBox1.List = MaListe(Rg, Fichier)

Set Fichier = Nothing: Set Rg = Nothing

End Sub
'---------------------------------------------

'à copier dans un modules standard
'Si ta plage de cellules CONTIENT une étiquette de colonne, utilise ceci :
'---------------------------------------------
Public Function MaListe(Rg As Range, Fichier As Workbook)

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomColonne As String

Rg.Name = Rg(1, 1).Text
NomColonne = Fichier.Names(Rg(1, 1).Text).Name

Requete = "SELECT " & NomColonne & " From " & NomColonne & "" _
& vbCrLf & "Where " & NomColonne & " <> Null " & vbCrLf & _
"Group By " & NomColonne & " ORDER By " & NomColonne & ""

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=Yes;"""

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

MaListe = Application.Transpose(Rst.GetRows)
ThisWorkbook.Names(Rg(1, 1).Text).Delete
Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Function
'---------------------------------------------

'à copier dans un modules standard
'Si ta plage de cellules NE CONTIENT PAS d'étiquette de colonne, utilise ceci :
'---------------------------------------------
Public Function MaListe1(Rg As Range, Fichier As Workbook)

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String

Rg.Name = "NomColonne"

Requete = "SELECT f1 From NomColonne " & vbCrLf & _
"Where f1 <> Null " & vbCrLf & _
"Group By f1 ORDER By f1"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;"""

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

MaListe1 = Application.Transpose(Rst.GetRows)
Fichier.Names("NomColonne").Delete

Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Function
'---------------------------------------------


Salutations!



"Srogeau" a écrit dans le message de news:
bonsoir a tous
j'utilise cette ligne de code pour remplir une combo
ComboBox1.RowSource = "N1:N" & ActiveSheet.UsedRange.Rows.Count
que faut il rajouter pour qu'il ne m'affiche pas les doublons et que la liste
affichee
soit trier par ordre alphabetique
merci pour vos conseils