Remplacer les plages par des plages dynamiques

Bonsoir à tous,

J'ai créer une macro pour trier un tableau avec l'enregistreur de macros mais je n'arrive pas à adapter le code de façon à prendre en compte mes plages dynamiques (Insertion - Nom - Définir).

Mon tableau s'étend de A4 à Dx (la ligne 4 étant la ligne d'entête) et je veux trier mon tableau par la colonne C nommée "Classement".

Toutes les colonnes sont nommées dynamiquement. Voici le code brut de pomme que je n'arrive pas à adapter :

    Sub Macro1()
    '
    ' Macro1 Macro
    '

    '
       Range("A5").Select
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("C5:C20") _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Feuil1").Sort
            .SetRange Range("A4:D20")
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End Sub

Ma dernière ligne de données est la ligne 20 mais elle est susceptible d'augmenter ou de diminuer.

Merci pour vos lumières VBéistes et bonne soirée à tous.

Bonjour,

A essayer..

Sub Macro2()
Dim DerLig As Long
    DerLig = Sheets("Feuil1").Cells(Rows.Count, 3).End(xlUp).Row
    Range("A5").Select
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("C5:C" & DerLig) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Feuil1").Sort
        .SetRange Range("A4:D" & DerLig)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

A+

Salut,

Voici une solution simple :

Option Explicit

Sub tri_x()
Range("A4:D" & Range("C" & Rows.Count).End(xlUp).Row).Sort Key1:=Range("C4"), Order1:=xlAscending, Header:=xlYes
End Sub

Cordialement.

EDIT : Salut Lermite J'arrive à nouveau un peu comme la grêle après la vendange ??

32criscris.xlsx (10.29 Ko)

Bonsoir à tous les deux,

Merci pour vos solutions.

@ Yvouille : rien ne sert de courir, tu le sais bien...On ne peut plus simple ton code mais tout aussi efficace.

Maintenant, c'est moi qui arrive après la tempête car il va falloir choisir

Bonne soirée à tous les deux et à tous.

Re, Salut Yvouille,

Y a pas photo, le code d'Yvouille est plus dépouillé.

Mais je mettrais quand même ces deux lignes en début de macro

    On Error Resume Next
    sheets("Feuil1").Sort.SortFields.Clear

Semble me souvenir que si ont crée un tri et qu'il y en a déjà un ça bug, et l'inverse aussi.

Re,

Merci lermite pour cette précision des plus importante.

Bonne soirée.

Bonjour tout le monde,

J'avais déjà remarqué que l'enregistreur de macro place à chaque fois le code proposé par Lermite en premier lieu, mais à chaque fois que je l'ai supprimé, je n'ai pas pu constater de problème. Si vous faites aller le code ci-dessous au pas-à-pas, les trois tris successifs se font sans problème :

Sub tri_x()
Range("A4:D" & Range("C" & Rows.Count).End(xlUp).Row).Sort Key1:=Range("C4"), Order1:=xlAscending, Header:=xlYes
Range("A4:D" & Range("C" & Rows.Count).End(xlUp).Row).Sort Key1:=Range("A4"), Order1:=xlAscending, Header:=xlYes
Range("A4:D" & Range("C" & Rows.Count).End(xlUp).Row).Sort Key1:=Range("B4"), Order1:=xlAscending, Header:=xlYes
End Sub

Donc faut-il quand même laisser ce code par sécurité ou non ??

Amicalement.

30criscris-v2.xlsm (16.86 Ko)

Re à tous les deux,

Finalement, j'ai opté pour le code de lermite : n'y vois rien de personnel Yvouille.

Mais comme un plan ne se déroule sans accros, j'aurais besoin encore d'un petit coup de main.

Dans le fichier-joint, le classement se fait automatiquement par évènementielle mais je dois prévoir l'éventualité où je dois couper-coller une ligne manuellement et insérer les cellules copiées mais je voudrais que le classement bouge automatiquement.

Exemple dans le fichier du cas qu'il faut prévoir.

Merci d'avance et bonne soirée.

PS : j'ai désactivé l'évènement pour l'instant.

Re,

Pas très clair ton truc..

Ajoute une deuxième feuille avec le résultat souhaiter.

A+

Bonjour lermite, le forum,

Le fichier modifié avec ce que je souhaite obtenir en espérant que mes explications soient un peu plus explicites.

Par contre, il risque d'avoir un problème au moment de couper la ligne car cela va supprimer la formule de la ligne coupée en colonne N et je ne vois pas comment remédier à cela : si tu as une idée, elle sera la bienvenue.

Merci d'avance et bonne journée.

Re,

A tester..

A+

Re lermite,

Ta solution me convient bien sauf que le classement ne bouge pas (en colonne C) la valeur 8 (classement de Christophe avant) ne prend pas la valeur 3 (nouvelle position).

Merci en attendant et bonne journée.

@+.

RE,

REGARDE BIEN TON FICHIER MODELE

Bonsoir lermite, le forum,

Le souci est que dans la partie "Après" j'ai laissé le chiffre 8 pour Christophe alors qu'il est remonté en troisième position ou que le classement se fait par une liste de validation ? Dans ce dernier cas, je peux modifier la liste de validation en autorisant la saisie entre le chiffre 1 et la cellule K2 afin de pouvoir décaler le classement dans l'ordre des lignes du tableau.

J'espère être assez clair et si tu veux modifier les formules existantes par du VBA, tu as toute latitude pour le faire.

Merci pour ta patience et bonne soirée.

Le classeur rectifier..

A+

Bonjour lermite, le forum,

Tout d'abord merci pour ton retour et ton investissement personnel.

Je me suis permis de faire quelques modifs (pour éviter que le code se déclenche avant ma ligne 5 par exemple) et j'ai remis l'évènement (Workshhet Change en colonne C) et là, bien sûr c'est la cata : il y a conflit avec l'évènement du clic droit d'où ma question du jour. Peut on modifier le code afin que les 2 évènements fonctionnent correctement ?

Sinon pour les reste RAS sauf qu'il ne faut pas classer les AT : le classement commence à 1 (bien sûr) et finit par la valeur de en G2.

Merci d'avance et bon week-end.

Bonjour,

La procédure de tri ne sert à rien suivant ce que tu à demandé, la numérotation linéaire se fait déjà quand tu déplace une ligne et ta procédure de tri veux rétablir un ordre qui existe déjà !!

Tu dis.

A+

lermite,

Je suis bien conscient de tes remarques. Je te confirme que c'est ce que je veux : dans un premier temps, mon classement se fait automatiquement au fur et à mesure des saisies mais je veux garder l'évènement de pouvoir déplacer les données et refaire le classement en conséquence si besoin : vois tu l'idée ? Si c'est pas clair, n'hésites pas à me le faire savoir.

En clair, la saisie initiale des données de classement ne se font pas par le déplacement des lignes mais je dois garder cette éventualité.

Attention toutefois, les gens classés AT en colonne B ne doivent pas être classés : merci d'avance.

Bonne journée.

criscris11 a écrit :

lermite,

dans un premier temps, mon classement se fait automatiquement au fur et à mesure des saisies mais je veux garder l'évènement de pouvoir déplacer les données et refaire le classement en conséquence si besoin :

En clair, la saisie initiale des données de classement ne se font pas par le déplacement des lignes mais je dois garder cette éventualité.

Attention toutefois, les gens classés AT en colonne B ne doivent pas être classés

Bien compris mais je confirme (et j'adhère ) à ma première impression, ta procédure Tri ne sert à rien.

Je peu modifier pour que les "AT" ne soit pas pris en compte dans la réinitialisation des N°.

Fait quelque test (sans te servir du tri) et tu dis..

A+

Ok lermite, je vais suivre tes conseils : je vais laisser tomber le tri.

Par contre comme tu l'as dis, je veux bien que tu modifies ton code afin de ne pas prendre en compte les AT dans le réinitialisation des numéros.

Merci d'avance et bonne journée.

Rechercher des sujets similaires à "remplacer plages dynamiques"