IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Tri automatique multi-colonnes [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 47
    Par défaut Tri automatique multi-colonnes
    Bonjour,

    Ci joint, un classeur excel (version simplifiée du classeur original) contenant 3 colonnes (Contenu - Echeance - Statut).

    J'aimerais que le classeur soit trié automatiquement selon les règles suivantes :
    • Si Statut = "Signé" alors la ligne entière va en bas et est triée par Echeance (de la date la plus éloignée à la date la plus proche)
    • Si Statut = "A faire" alors la ligne entière va en haut et est triée par Echeance (de la date la plus proche à la date la plus éloignée)
    • Si Statut = "" alors la ligne entière va en entre les "A faire" et les "Signé" et est triée par Echeance (de la date la plus proche à la date la plus éloignée)


    Pour résumer, le but de l'opération est de trier automatiquement un échéancier dès qu'un statut où une date est inséré/modifié. On veut voir apparaitre en premier lieu les lignes "A faire" triées par priorité (i.e par date d'échéance la plus proche)

    Je ne suis pas un champion des macros et j'ai eu beau chercher je n'ai pas trouvé de cas similaires.

    Je vous remercie donc d'avance pour votre aide !
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Bonjour,
    Le fait qu'il y ait des valeurs vide dans la colonne Statut est embetant pour un tri automatique, le plus simple je pense serait de creer un colonne a la fin du tableau qui prend pour valeurs 1 si statut = "a faire", 2 si "" et 3 si "signé", ensuite tu peux trier ton tableau par cette colonne puis echéance. Tu peux obtenir la syntaxe vba du tri via l'enregistreur de maccro

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 47
    Par défaut
    Merci pour ta réponse.

    Je n'ai pas encore testé ta solution mais j'ai une question qui me vient directement à l'esprit :

    Selon que le statut est "A faire" ou "Signé" les dates d'échéance sont triées dans un ordre contraire (une fois "ascending" et l'autre fois "descending").

    Comment marquer cette différence (ce "if") dans la macro ?

    Merci d'avance.

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Hello,

    si tu fais ton tri en vba, tu vas utiliser la méthode Range.Sort
    expression .Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)

    et tu fais du tri ascendant/descendant en réglant Order1, Order2 ou Order 3

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Ha, j'avais mal lu et pas vu cette distinction, ça complique encore un peu la chose.
    Dans ce cas il faut travailler en deux fois, je pense.
    A ta place, comme "a faire" et "" sont triés dans le même ordre je trirai tout dans cet ordre.
    Puis boucle while sur la la premiere colonne pour trouver le premier "signé" puis tri du premier signé jusque la dernière ligne dans l'ordre inverse

  6. #6
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    bonjour,
    essaye ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub Tri()
    Dim Der_L As Long, Signe As Range
     
    Application.ScreenUpdating = False
     
    With Feuil1
    Der_L = .UsedRange.Rows.Count
     
        .UsedRange.Offset(1).Resize(.UsedRange.Count - 1).Sort Key1:=.Range("C:C"), Order1:=xlAscending, _
        Key2:=.Range("B:B"), Order2:=xlAscending, Header:=xlNo
     
        Set Signe = .Columns(3).Find("Signé", LookIn:=xlValues)
     
        .Range("A" & Signe.Row & ":" & "C" & Der_L).Sort Key1:=.Range("B:B"), Order1:=xlDescending, Header:=xlNo
    End With
     
    Application.ScreenUpdating = True
     
    End Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 47
    Par défaut
    Merci pour vos réponses.

    J'ai essayé la méthode de halaster08 (en utilisant l'enregistreur de macro et en ignorant le tri "contraire" pour le statut "Signé")

    Je viens également de tester le code de RyuAutodidacte que je remercie car cela répond parfaitement à ma demande initiale

    Les deux méthodes fonctionnent donc mais j'ai encore une question : comment faire en sorte que le tri soit automatique ? Pour l'instant, je suis obligé d'exécuter la macro pour trier.

    J'aimerais que le tri se fasse automatiquement dès qu'une valeur est insérée ou modifiée dans les colonnes concernées par le tri.

    Merci

  8. #8
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Tri auto au changement d'une cellule je ne sais pas par contre tu peux aller voir de ce côté là :
    http://silkyroad.developpez.com/VBA/...lasseur/#LII-7 => Workbook_BeforeSave
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo