Tri de colonne automatique et dynamique de date en VBA

Bonjour,

je suis débutant en vba et je veux faire un tri automatique et dynamique de la colonne date en VBA.

pour être un peut plus explicite, mon code VBA m'affiche la liste des documents recherchés à partir d'une date donnée.

les champs sont les suivants sous excel: C11(NOM), ...D11(DATE) mon tri devra s'effectuer selon la colonne D11(Date).

Merci

bonjour,

une proposition de code à adapter, (nom de feuille, colonnes à trier)

Sub tri()
' adapter éventuellement feuil1
    dl = Worksheets("feuil1").Range("D" & Rows.Count).End(xlUp).Row
    With Worksheets("feuil1").Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("D12:D" & dl) _
                             , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
'adapter éventuellement colonnes A et F
        .SetRange Range("A11:F" & dl)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Bonjour H2So4,

Merci pour ton aide, je ne comprends pas la deuxième partie du code (adapter éventuellement colonne A et F).

A la place du .SetRange Range("A11:F" & dl) j'ai mis .SetRange Range("D12:D" & dl) c'est dire la colonne date qui doit être triée,cette colonne est effectivement triée. le pb c'est que les autres colonnes ne suivent pas le tri effectué sur la date. as tu une idée?

Merci

le tri se fait sur la colonne D, tu dois mettre l'ensemble des colonnes qui doivent suivre le tri. En mettant A11 à F x le tableau A11 à Fx est trié sur base de la colonne D. (Concernant le 11, les paramètres du tri indiquent qu'il y a des entêtes de colonnes( ces entêtes sont en ligne 11). Il vaut donc mieux ne pas y toucher.

ok ça marche merci beaucoup

Encore moi H2so4; si mon tri doit se faire sur plusieurs feuilles comment m'y prendre sachant que les données s'affichent dans feuil1 mais aussi en cas de dépassement de capacité (32000) elles s'affichent sur les feuilles suivantes prévues à cet effet.

comment faire mon tri en vba sur l'ensemble des feuilles? merci pour ton aide

la macro se complexifie beaucoup plus. je regarde.

Bonjour,

à quoi ressemble tes feuilles supplémentaires ? sont-elles identiques à la première feuille ?

Bonjour h2so4,

Elles sont identiques à la première feuille.c'est en fait la suite des données qu'elles contiennent.elles sont limitées chacune a 32000.

Merci pour ton aide.

et elle commence toutes avec un entête en ligne 11 et des données à partir de la ligne 12 ?

Non, que la premiere avec un entête en ligne 11 et des données à partir de la ligne 12 mais les suivantes elles commencent avec une entete en ligne 1 et les données à partir ligne 2.

bonjour,

un code à tester (j'ai fait l'hypothèse que le tableau à trier contient les colonnes A à G)

Sub testtri()
For i = 1 To Worksheets.Count
With Worksheets(i)
   .Sort.SortFields.Clear
   If i = 1 Then
   .Sort.SortFields.Add Key:=.Range("D12:D48011") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SetRange Range("A12:G48012")
    Else
       .Sort.SortFields.Add Key:=.Range("D2:D48011") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SetRange Range("A2:G48011")
        End If
        .Sort.Header = xlNo
        .Sort.MatchCase = False
        .Sort.Orientation = xlTopToBottom
        .Sort.SortMethod = xlPinYin
    End With
Next i
If Worksheets.Count = 1 Then Worksheets(1).Sort.Apply: fin = True Else fin = False
While Not fin
c = 0
For i = 1 To Worksheets.Count - 1
If i = 1 Then ll = 32001: pl = 16002 Else ll = 32011: pl = 16012
If Worksheets(i).Range("D" & ll) <= Worksheets(i + 1).Range("D2") Then c = c + 1
Worksheets(i).Sort.Apply
Worksheets(i).Range("A" & pl & ":G" & ll).Copy Worksheets(i + 1).Range("A32001")
Worksheets(i + 1).Sort.Apply
Worksheets(i + 1).Range("A2:G16001").Copy Worksheets(i).Range("A" & pl)
Worksheets(i + 1).Range("A2:G16001").Delete shift:=xlUp
Next i
If c = Worksheets.Count - 1 Then fin = True
Wend
Application.ScreenUpdating = True
End Sub

Merci beaucoup H2So4, je vais tester.

J'ai testé en partie la macro, je ne comprends pas la deuxième boucle for.sur quoi t'es tu basé pour fixer les valeurs 48011 ,16002 entre autres?

Si tu pouvais commenter un peu le code ce serait génial.

Je te remercie beaucoup

bonjour,

quelques commentaires ajoutés, ainsi que quelques corrections

Sub testtri()
' tri d'une liste continue sur plusieurs feuilles, (première feuille les lignes contenant les données vont de 12 à 32011, sur les autres feuilles les données vont de la ligne 2 à 32001
' on prépare pour chaque feuille les paramètres de tri, sans faire le tri
For i = 1 To Worksheets.Count
With Worksheets(i)
   .Sort.SortFields.Clear
   If i = 1 Then ' paramètres pour la première feuille tri sur 32000 lignes
   .Sort.SortFields.Add Key:=.Range("D12:D32011") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SetRange Range("A12:G32011")
    Else ' paramètres pour les feuilles suivantes le tri se fera sur 48000 lignes
       .Sort.SortFields.Add Key:=.Range("D2:D48001") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SetRange Range("A2:G48001")
        End If
        .Sort.Header = xlNo
        .Sort.MatchCase = False
        .Sort.Orientation = xlTopToBottom
        .Sort.SortMethod = xlPinYin
    End With
Next i
' s'il n'y a qu'une seule feuille on lance un simple tri sur la feuille et c'est fini
If Worksheets.Count = 1 Then Worksheets(1).Sort.Apply: fin = True Else fin = False
' sinon on lance un tri multifeuille jusqu'à ce que le tri soit fini
While Not fin
c = 0 ' compteur qui sert à determiner si le tri est fini
' algorithme de tri sur plusieurs feuilles
' on vérifie le statut du tri sur la feuille en cours et suivante et on positionne l'indicateur c, si les feuilles sont triées
' on trie la premiere feuille, on copie la moitié supérieure des lignes sur la feuille suivante (donnant 48000 lignes à trier)
' on trie la seconde feuille, on en copie le tiers inférieur (16000 lignes) vers la page précédente
' on répéte ce mécanisme pour toutes les feuilles
For i = 1 To Worksheets.Count - 1
If i <> 1 Then ll = 32001: pl = 16002 Else ll = 32011: pl = 16012
' si la valeur de la dernière ligne de la feuille en cours est inférieure à la valeur de la première ligne de la feuille suivante, on incrémente C (les feuilles en cours et suivante, sont dans le bon ordre)
If Worksheets(i).Range("D" & ll) <= Worksheets(i + 1).Range("D2") Then c = c + 1
' on trie la feuille en cours
Worksheets(i).Sort.Apply
'on copie les 16000 dernieres lignes de la feuille en cours à la fin de la feuille suivante
Worksheets(i).Range("A" & pl & ":G" & ll).Copy Worksheets(i + 1).Range("A32001")
' on trie la feuille suivante
Worksheets(i + 1).Sort.Apply
' on copie les 16000 premières lignes sur la feuille précédente
Worksheets(i + 1).Range("A2:G16001").Copy Worksheets(i).Range("A" & pl)
' on supprime les lignes copiées
Worksheets(i + 1).Range("A2:G16001").Delete shift:=xlUp
Next i
' si toutes les feuilles sont telles dans l'ordre, on a fini
If c = Worksheets.Count - 1 Then fin = True
Wend
Application.ScreenUpdating = True
End Sub

Merci beaucoup H2So4, tes explications m'éclairent un peu plus.

Rechercher des sujets similaires à "tri colonne automatique dynamique date vba"