Code VBA pour effectuer un deuxième tri suite à un premier

Bonjour à tous,

A un certain moment de mon travail, j’arrive à la situation présentée dans le fichier ci-joint, après un premier tri basé sur la colonne I.

https://www.excel-pratique.com/~files/doc2/Demo20090508.xls

Il faudrait alors qu’un deuxième code trie les lignes suivantes en fonction de la colonne J (donc les lignes dont la colonne I est vide, après en avoir recherché la première).

Pouvez-vous m’aider ?

A vous relire.

Bonjour,

peut-être ainsi :

Sub Macro3()
With Range("A3:K" & [A65000].End(xlUp).Row)
    .Sort Key1:=Range("J3"), Order1:=xlDescending, Header:=xlGuess
    .Sort Key1:=Range("I3"), Order1:=xlDescending, Key2:=Range("B3") _
        , Order2:=xlAscending, Key3:=Range("C3"), Order3:=xlAscending, Header:= _
        xlGuess
End With
End Sub

Bonjour le Forum,

Salut Felix et merci beaucoup pour ta proposition.

Comme mon code de base - dont fait déjà partie le premier tri - est assez lourd et que je n'aurais plus voulu y apporter de modifications, j'aurais préféré, tel qu''indiqué directement dans le fichier joint à mon premier message, qu'un nouveau code ne traite que le deuxième tri.

Est-ce possible ? Quelqu'un peut-il encore m'aider ?

Bonne journée à tous.

Bonjour à tous,

Salut felix,

essaye:

Sub Tri()
Dim Lg As Long, DerLig As Long
    DerLig = Cells.Find("*", , , , xlByRows, xlPrevious).Row

    With Range("A3:K" & DerLig)
        .Sort Key1:=Range("J3"), Order1:=xlDescending, Header:=xlGuess
        .Sort Key1:=Range("I3"), Order1:=xlDescending, Key2:=Range("B3") _
            , Order2:=xlAscending, Key3:=Range("C3"), Order3:=xlAscending, Header:= _
            xlGuess
    End With

    Lg = [i65000].End(xlUp).Row + 1
    With Range(Range("a" & Lg), Range("k" & DerLig))
        .Sort Key1:=Range("i" & Lg), Order1:=xlDescending, Key2:=Range("j" & Lg) _
            , Order2:=xlAscending, Header:=xlGuess
    End With
End Sub

Bonne journée

Claude.

Salut Claude, Salut le Forum,

Désolé pour cette longue période sans nouvelle, mais j'ai été hospitalisé quelques jours !

Claude tu me proposes à nouveau un code avec deux tris (ou un tri à deux niveaux) alors que je désirerais vraiment un code uniquement pour le second tri (tel qu'indiqué dans mon dernier message et tel qu'indiqué dans mon fichier joint la première fois).

Si cela n'est pas possible, pourriez-vous m'indiquer un code afin de rechercher la première cellule vide en partant depuis le bas dans une colonne quelconque (par exemple A1 est vide, A2 n'est pas vide, A3 n'est pas vide, A4 à A65536 sont vides et le code trouverait A4) et je me débrouillerais pour le reste ?

A vous relire

Bonjour,

à toi de régler le 2ème tri !

Faut pas pousser.

Claude.

Désolé Claude, mais je crois que je suis un peu largué.

J'ai compris qu'avec le dernier code que tu proposes, tu sélectionnes toutes les lignes présentes depuis la ligne 3 - y compris les lignes qui sont déjà triées - et que tu (re)tries les premières lignes en premier, puis les suivantes selon une seconde clef. Ai-je bien compris ???

Comme je ne voudrais pas refaire ce premier tri, le code que je désirerais devrait chercher quelles sont les lignes non encore triées (à chaque fois à une ligne différente selon la quantité de lignes déjà triées par mon code déjà en place) et n'effectuer le tri que des lignes complémentaires.

Et ça, malgré toute l'aide que tu m'as déjà apportée, je ne sais pas le faire. Je ne comprends absolument pas ce que tu veux dire par "à toi de régler le 2ème tri". Crois-moi que j'en suis vraiment navré.

Cordialement.

re,

1) Rappelle-moi les colonnes à trier au 1er tri et dans quel ordre (toutes les lignes)

2) le 2ème tri ne pars que de la dernière ligne occupée en colonne "i"

c'est un réglage de colonnes à faire

précise qulle colonne du 2ème tri ?

Claude.

re,

Mets d'autres noms, car dans les tris, Nom10 passe avant Nom2

Fait le test manuellement sur une autre feuille.

Claude

édit: j'utilise là la colonne A

.Sub Tri()
Dim Lg As Long, DerLig As Long
    DerLig = Cells.Find("*", , , , xlByRows, xlPrevious).Row

    With Range("A3:K" & DerLig)
        .Sort Key1:=Range("J3"), Order1:=xlDescending, Header:=xlGuess
        .Sort Key1:=Range("I3"), Order1:=xlDescending, Key2:=Range("a3") _
            , Order2:=xlAscending, Key3:=Range("b3"), Order3:=xlAscending, Header:= _
            xlGuess
    End With

    Lg = [i65000].End(xlUp).Row + 1
    With Range(Range("a" & Lg), Range("k" & DerLig))
        .Sort Key1:=Range("i" & Lg), Order1:=xlDescending, Key2:=Range("j" & Lg) _
            , Order2:=xlAscending, Header:=xlGuess
    End With
End Sub

et j'obtiens le même résultat que tu demande

Sinon, je maintiens c'est du réglage colonnes

Claude.

Claude, merci de bien vouloir continuer à m'aider.

1) le premier tri est déjà fait (en fonction de la colonne I) et ne devrait plus être touché. Le nombre de lignes déjà triées est à chaque fois différent.

2) le code désiré devrait chercher quelle est la première cellule de la colonne I qui est vide afin de savoir d'où doit partir le second tri et l'effectuer de cette ligne à la dernière, sur la base de la colonne J. Attention, il y a des cellules vides dans la colonne I avant les lignes déjà triées selon chiffre 1) (lignes de titres).

Dans mon fichier joint tout au début, il y a l'état de ma feuille après le premier tri, des indications complémentaires ainsi qu'une feuille sur laquelle se trouve le résultat désiré.

Bonne journée

re,

Voir mon édit

Claude.

Claude,

Ton code trie vraiment les premières lignes qui ne doivent pas être triées.

Afin de préciser mes besoins, j'ai créé une deuxième fichier exemple :

https://www.excel-pratique.com/~files/doc2/Demo20090518.xls

Si tu veux bien y lire mes nouvelles informations, ça me dépannerait terriblement.

Bonnes salutations.

re,

Alors pourquoi tu embrouille le titre du Poste avec 2 filtres ?

Sub Tri()
Dim Lg As Long, DerLig As Long
    DerLig = Cells.Find("*", , , , xlByRows, xlPrevious).Row

        Lg = [i65000].End(xlUp).Row + 1
    With Range(Range("a" & Lg), Range("k" & DerLig))
        .Sort Key1:=Range("j" & Lg), Order1:=xlAscending, Key2:=Range("a" & Lg) _
            , Order2:=xlAscending, Header:=xlGuess
    End With
End Sub

Claude.

Claude,

On a fini par se comprendre ! Désolé que ça a pris tant de temps, mais je te promets que c'est parfois très compliqué de faire simple

Parfois il faut juste le temps de comprendre ce que l'autre n'a pas compris.

Merci infiniment pour ton aide. Ta solution correspond finalement exactement à mon attente.

Et désolé aussi de ne pouvoir malheureusement dire : "A charge de revanche !"

Salut

v25
Rechercher des sujets similaires à "code vba effectuer deuxieme tri suite premier"