Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Supprimer les doublons dans le ComboBox et ignorer les cellules masquées

INFINITY100

XLDnaute Occasionnel
Bonjour à tous

Voila j'ai un petit soucis d'affichage de la liste dans le ComboBox, en effet j'ai un ensemble de dates en colonne E et ce que je voudrai faire c'est quand je clique sur le ComBobox les dates en doublons ne s'affiche pas et de même quand je masque une ligne aussi

Pour les doublons le problème est presque résolu car j'ai déjà ce code qui supprime les doublons mais avec un léger défaut c'est qu'il ignore pas la cellule vide de liste des dates

Code:
'Déclaration de la variable
Dim ligne As Integer, c As Range, Dico As Object
Dim j As Integer

Private Sub UserForm_Initialize()
Set Dico = CreateObject("Scripting.Dictionary")
With Sheets("Feuil2")
    For Each c In .Range(.[f2], .Cells(.Rows.Count, 6).End(xlUp))
        If Not Dico.exists(c.Value) Then Dico.Add c.Value, c.Value
    Next c
    ComboBox1.Clear
    ComboBox1.List = Dico.items
End With
End Sub

Voila je joins le fichier pour être plus claire

Merci à vous tous

Cordialement
 

Pièces jointes

  • combobox sans doublons.xlsm
    20 KB · Affichages: 22

youky(BJ)

XLDnaute Barbatruc
Bonjour,
PB bien expliqué alors voici un code. . .
VB:
Private Sub UserForm_Initialize()
Set Dico = CreateObject("Scripting.Dictionary")
With Sheets("Feuil2")
    For Each c In .Range(.[E3], .Cells(.Rows.Count, 5).End(xlUp))
        If Not Dico.exists(c.Value) Then
        If c.Rows.Hidden = False And c.Value <> "" Then Dico.Add c.Value, c.Value
        End If
    Next c
   ' ComboBox1.Clear
    ComboBox1.List = Dico.items
End With
End Sub

Bruno
 

INFINITY100

XLDnaute Occasionnel
Merci infiniment ça marchez super bien

Si vous permettez j'ai un autre soucis disons coté esthétique exemple si j'ai une date qui est le 29/08/2017 avant la 28/08/2017 dans ma liste des dates, y a t-il un moyen d'ajouter à ce code le tri par ordre numérique ? de sorte que les dates seront automatiquement organisées dans le ComboBox

Et merci encore pour la macro c'est très gentil
 

youky(BJ)

XLDnaute Barbatruc
Bonjour,
Pour continuer sur la macro de Nicole
Juste un petit ajout pour ne pas mettre les lignes masquées (mis en gras)

Private Sub UserForm_Initialize()
Set f = Sheets("feuil2")
Set mondico = CreateObject("Scripting.Dictionary")
a = f.Range("e3:e" & f.[e65000].End(xlUp).Row).SpecialCells(xlCellTypeVisible)
et la suite . . . .
Bruno
 

INFINITY100

XLDnaute Occasionnel
Merci bcp Bisson Nicole et Bruno

On peux dire là c'est presque terminer mais juste quand je veux faire ça (Voir la macro dessous et le fichier joint) il me réclame de définir les variables

Comment y procéder ?

Merci pour l'aide

VB:
'Déclaration de la fonction pour le masquage du bouton de fermeture sur l'UserForm
'----------------------------------------------------------------------------------
Option Explicit

Private Declare Function GetWindowLongA Lib "user32" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib "user32" _
(ByVal hWnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long

Private Declare Function FindWindowA Lib "user32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'Variable qui va nous servir à Masquer le bouton de fermeture.
Dim hWnd As Long

'Macro qui rapporte la liste des dates et les transpose dans le ComboBox "Par_Date"
Private Sub UserForm_Initialize()
'Raffraichir pendant le code
  Application.ScreenUpdating = True
'Masquer le bouton de fermeture dès l'ouverture de l'UserForm
  hWnd = FindWindowA("Thunder" & IIf(Application.Version Like "8*", _
  "X", "D") & "Frame", Me.Caption)
  SetWindowLongA hWnd, -16, GetWindowLongA(hWnd, -16) And &HFFF7FFFF
'Curseur sur le ComboBox "Par_Date"
  ComboBox1.SetFocus
'Transposer les dates dans le Combobox et faire le tri
  Set f = Sheets("feuil2")
  Set mondico = CreateObject("Scripting.Dictionary")
  a = f.Range("e3:e" & f.[e65000].End(xlUp).Row).SpecialCells(xlCellTypeVisible) ' tableau a(n,1) pour rapidité
  For i = LBound(a) To UBound(a)
    If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
  Next i
  temp = mondico.keys
  Tri temp, LBound(temp), UBound(temp)
  Me.ComboBox1.List = temp
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

Private Sub CommandButton1_Click()
Unload UserForm1
End Sub
 

Pièces jointes

  • combobox sans doublons 2.xlsm
    19.2 KB · Affichages: 18

youky(BJ)

XLDnaute Barbatruc
Hello,
Le Set f n'est pas bien utile pour une ligne de code et prend beaucoup de mémoire
Je mets le fichier avec croix de fermeture bloquée.
Bruno
 

Pièces jointes

  • combobox sans doublons 3.xlsm
    24 KB · Affichages: 21

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…