Tri date sur listbox

Bonjour, voila quelques heures que je planche sur le tri date d'un listbox dont les données sources se situent sur deux feuilles. Je souhaite me servir de ce userform pour réaliser une vue sur une gestion de stock.

La fonction quick sort m'a bien aidé, mais le tri n'est pas complet, voir désordonnée. Je souhaiterais réaliser un tri chronologique mais sans succés....auriez vous des pistes ? Peut être que ma déclaration de variable n'est pas bonne,....je me demande si je n'ai pas également un probléme avec les formats de date américains.....merci

Sébastien

38listboxtridate.xlsm (19.38 Ko)

Bonjour,

  • Ne modifie pas la BD
  • Temps pour 10.000 lignes : 0,7s contre 2.1 s avec ArrayList
Private Sub UserForm_Initialize()
  Set f = Sheets("vente")
  a = f.Range("a1:c" & f.[A65000].End(xlUp).Row).Value
  For i = LBound(a) To UBound(a): a(i, 1) = CDate(a(i, 1)): Next i
  Tri a, 1, LBound(a, 1), UBound(a, 1)
  Me.ListBox3.List = a
End Sub

Ceuzin

140listboxtridate.zip (13.35 Ko)

Bonsoir,

ci-dessous autre proposition

118listboxtridate1.xlsm (22.86 Ko)

Bonjour à tous,

Un autre essai :

Private Sub UserForm_Initialize()
    Dim wst As Worksheet, na%, nv%, TT
    Set wst = Worksheets("Feuil3")
    With Worksheets("achat")
        na = .Cells(.Rows.Count, 1).End(xlUp).Row
        wst.Cells(1, 1).Resize(na, 3).Value = .Cells(1, 1).Resize(na, 3).Value
    End With
    With Worksheets("vente")
        nv = .Cells(.Rows.Count, 1).End(xlUp).Row
        wst.Cells(na + 1, 1).Resize(nv, 3).Value = .Cells(1, 1).Resize(nv, 3).Value
    End With
    With wst
        With .Cells(1, 1).Resize(na + nv, 3)
            .Sort key1:=.Cells(1, 1), order1:=xlAscending, key2:=.Cells(1, 2), _
             order2:=xlAscending, key3:=.Cells(1, 3), order3:=xlAscending, Header:=xlNo
            TT = .Value
            .ClearContents
        End With
    End With
    ListBox3.List = TT
End Sub

Cordialement.

Bonjour à tous, un grand merci pour vos propositions !

Il faut bien faire un choix , je vais donc imbriquer la solution de thev même si je ne suis pas trop familier avec la manipulation des objets, néanmoins je trouve cette option intéressante.

J'ai donc avancé sur mon projet :

Mon code s'initialise sur une première listbox1 avec les données issues de ma feuille "stock", la deuxième listbox2 est conditionnée par la sélection d'une ligne sur la listbox1 et affiche les données issues des onglets "achat" et "vente". Le critére de controle de la listbox 2 est une comparaison entre la colonne E de la feuille "stock" et la 1ere colonne de listbox1

If Ws.Range("E" & j) = ListBox1.Column(1) Then

La listbox2 est triée correctement, mais il me reste deux bug à régler...

1. lorsque la listbox2 ne doit afficher qu'une ligne, l''affichage se fait en colonnes et pas en lignes....je n'ai pas le problème dans les autres cas (exemple avec la 4em ligne sélectionnée sur listbox 1)

2. lorsque listbox2, n'a pas de données à afficher, j'ai une erreur d'incompatibilité de type (exemple avec la 8em ligne sélectionnée sur listbox 1)

J'ai tenté plusieurs solutions mais sans succés. Peut être avez vous une piste SVP ?

Merci

Sébastien

65listboxtridate.xlsm (29.74 Ko)

Bonsoir,

Pas de ListBox2, cependant :

  • si pas de données à affecter => erreur = logique ! Il faut tester avant.
  • une seule ligne affectée avec List ne fonctionnera pas également (en principe Additem... si un seul élément...)
mais concurremment à List on peut utiliser Column pour affecter une liste, le tableau affecté se trouve transposé :

exemple : si on affecte un tableau :

ListBox2.List = WorksheetFunction.Transpose(Tablo)
'on obtient le même résultat avec
ListBox2.Column = Tablo

'et :
ListBox2.List = Tablo
'est équivalent à
ListBox2.Column = WorksheetFunction.Transpose(Tablo)

Si donc on a une ligne seulement à affecter, il est possible que cela fonctionne en utilisant Column (je ne peux l'affirmer, ne l'ayant jamais testé dans un tel cas...)

Cordialement.

Bonsoir,

Pour transposer un tableau en lignes, il faut appliquer 2 fois la fonction "transpose"

    'transposition du tableau en colonnes
    ListBox2.List = Application.Transpose(Tablo)
    'transposition du tableau en lignes
    ListBox2.List = Application.Transpose(Application.Transpose(Tablo))

Merci à vous deux, j'ai finalement affecter la liste avec .column et cela à réglé le cas d'un ligne unique

Merci

Bonne soirée

Rechercher des sujets similaires à "tri date listbox"