Problème listbox trier par ordre, enlever la ligne vide puis les doublons

Salut,

Quelqu'un peut m'aider pour resoudre mes problèmes.

Vous trouverez ci-joint le détail et je vous remercie par avance

17testlistbox.xlsm (15.23 Ko)
listbox

Bonjour AJcomboman

Un sujet de 2018 qui traite des doublons
https://forum.excel-pratique.com/s/goto/714462

Un code pour trier les ListBox

Private Sub UserForm_Initialize()
  Dim Ar As Variant, Elmt
  Me.ListBox1.List = Sheets("Feuil1").Range("C2:C15").Value
  With Me.ListBox1
    Ar = .List
    With CreateObject("System.Collections.ArrayList")
      For Each Elmt In Ar
        .Add Elmt
      Next
      .Sort
      Ar = .ToArray
    End With
    .List = Ar
  End With
End Sub

En revanche, il faudra supprimer les valeurs des "RowSource"

image

A+

bonjour Bruno, AJcomboman, le fil,

pour les 2 en même temps

Private Sub UserForm_Initialize()
     Dim Ar    As Variant, SCA, i, j
     Set SCA = CreateObject("System.Collections.ArrayList")

     Ar = Sheets("Feuil1").Range("A1").CurrentRegion.Value2     'la plage dynamique
     For j = 3 To 4     'boucle ces colonnes
          SCA.Clear     'RAZ
          For i = 2 To UBound(Ar)     'boucle les données
               If Len(Ar(i, j)) Then SCA.Add Ar(i, j)     'ajouter si ne pas vide
          Next
          SCA.Sort     'trier ascendant
          If j = 3 Then ListBox1.List = SCA.toarray Else ListBox2.List = SCA.toarray     'ajouter au bon listbox
     Next
End Sub
12testlistbox.xlsm (26.54 Ko)

Bonjour Bruno,

A noter que cette classe : System.Collections.ArrayList nécessite le logiciel .NET Framework 3.5 qui n'est plus installé par défaut depuis Windows 10. Si l'on veut utiliser cette classe, il faut aller dans les fonctionnalités avancés de Windows 10/11 et cocher .NET Framework 3.5 pour l'installer.

Bonjour

Première chose à faire utiliser des tableaux structurés. Vous ne dites rien de l'usage de ce formulaire donc difficile de quelque conseil mais cela ne me semble pas optimum.

@yal_excel

Oui vous avez raison, désolé pour l'infos manquantes. En fait, le formulaire est utilisé par une personne (utilisateur) et pour eviter l'erreur de saisie surtout au niveau des noms des articles et le fournisseur, je vais créer une formulaire afin qu'il puisse faire le choix à partir de listbox.

Sinon, peut-tu m'aider pour le bouton "ajouter", si par exemple le fournisseur "A" livre 2 articles différents (BLE, BLA, BLU par exemples). comment fait-on pour avoir 3 lignes dans la base

bonjour, un essai

10testlistbox.xlsm (32.55 Ko)

Salut @Thev

Bonjour Bruno,

A noter que cette classe : System.Collections.ArrayList nécessite le logiciel .NET Framework 3.5 qui n'est plus installé par défaut depuis Windows 10. Si l'on veut utiliser cette classe, il faut aller dans les fonctionnalités avancés de Windows 10/11 et cocher .NET Framework 3.5 pour l'installer.

Tu es sûr de toi

Car sur mon poste je ne l'ai pas activé et le code que j'ai trouvé fonctionne

A+

bonjour Bruno,

oui, c'est sûr https://excelmacromastery.com/vba-arraylist/

image

Une version plus aboutie.

Bonjour BsAlv

bonjour Bruno,

oui, c'est sûr https://excelmacromastery.com/vba-arraylist/

image

Effectivement, sauf que sur W10 .Net Framework est installé (jamais rien fait perso), certainement par d'autres programmes

image

Bref, je trouvais ce code intéressant, mais j'ai bien compris qu'il ne fallait plus l'utiliser

@Bruno,

Bref, je trouvais ce code intéressant, mais j'ai bien compris qu'il ne fallait plus l'utiliser

J'utilise cet outil très souvent et la majorité n'a pas de complaints concernant cet erreur. Et s'ils l'ont, voilà la remedi avec le 3.5 ...

pour VBA < 2021-365 : SCA avec données unique trié

Private Sub UserForm_Initialize()
     Dim Ar As Variant, SCA, i, j, c As Range
     Set SCA = CreateObject("System.Collections.ArrayList")

     With Sheets("Feuil1").Range("A1").CurrentRegion
          On Error Resume Next
          Set c = .Offset(1).Resize(.Rows.Count - 1)    'la plage dynamique
          On Error GoTo 0
     End With
     If Not c Is Nothing Then
          Ar = c.Value2
          For j = 3 To 4     'boucle ces colonnes
               SCA.Clear     'RAZ
               For i = 1 To UBound(Ar)     'boucle les données
                    If Len(Ar(i, j)) Then If Not SCA.contains(Ar(i, j)) Then SCA.Add Ar(i, j)    'ajouter si ne pas vide
               Next
               SCA.Sort     'trier ascendant
               If j = 3 Then ListBox1.List = SCA.toarray Else ListBox2.List = SCA.toarray     'ajouter au bon listbox
          Next
     End If
     TextBox1.Text = Format(Date, "dd/mm/yyyy")
     TextBox2.Text = ""
     TextBox3.Text = ""

End Sub

avec excel >= 2021-365, trier la matrice

Private Sub UserForm_Initialize()
     Dim Ar As Variant, SCA, i, j, c As Range

     Set dict = CreateObject("scripting.dictionary")
     dict.comparemode = vbTextCompare

     With Sheets("Feuil1").Range("A1").CurrentRegion
          On Error Resume Next
          Set c = .Offset(1).Resize(.Rows.Count - 1)    'la plage dynamique
          On Error GoTo 0
     End With
     If Not c Is Nothing Then
          Ar = c.Value2
          For j = 3 To 4     'boucle ces colonnes
               ar1 = Application.Sort(Ar, j) 'nouvelle matrice trié sur la colonne j
               dict.RemoveAll
               For i = 1 To UBound(Ar)     'boucle les données
                    If Len(ar1(i, j)) Then dict(ar1(i, j)) = 0
               Next
                If j = 3 Then ListBox1.List = dict.keys Else ListBox2.List = dict.keys   'ajouter au bon listbox
          Next
     End If

     TextBox1.Text = Format(Date, "dd/mm/yyyy")
     TextBox2.Text = ""
     TextBox3.Text = ""

End Sub

Bonsoir Bruno,

Effectivement, sauf que sur W10 .Net Framework est installé (jamais rien fait perso), certainement par d'autres programmes

Oui, effectivement certaines applications en ont toujours besoin et l'installent donc automatiquement.

@yal_excel
oui, ça marche ton truc mais juste une remarque.
Pour la colonne B "CODE", il s'agit d'un choix à partir du code present dans la feuille mais pas automatique.
J'ai essayé d'ajouter le code "useform_Initialize" mais ça ne marche pas:

Set Ws = Sheets("Feuil1")
i = Ws.Range("A" & Rows.Count).End(xlUp).Row

For J = 2 To i
With Me.ComboBox1
.AddItem Ws.Range("A" & J)

End With
Next J

Edit modo : code mis entre balises

Bonjour AJcomboman,

Merci de mettre le code posté entre balises SVP

Vous avez le bouton en haut prévu à cet effet

image

A+

Bonjour
Erreur d'interprétation de ma part. J'avais pensé qu'il s'agissait d'un identificateur unique. Voici la version corrigée.

Salut,

Dernière question

il nous reste le classement par ordre au niveau de listbox2. Sinon OK pour le reste.

Merci

Bonjour

Ca va tu n'as pas trop mal au crâne d'avoir tant cherché?

Tu devrais peut être faire un effort sur la communication.

Merci beaucoup yal_excel.

Je prends bonne note de tes remarques.

A+

Rechercher des sujets similaires à "probleme listbox trier ordre enlever ligne vide puis doublons"