Tri personnalisé et particularités

Bonjour Maîtres VBA,

J'ai un fichier qui comporte plus ou moins 2500 (affectation de pompiers), et sur le lot, certains n'ont pas leur affectation, et sont classées tout en bas du classeur avec la mention recrue, par exemple.

Or, quand une recrue reçoit son affectation, son statut est changé en lui affectant un groupe et une caserne (colonnes D et E). Et pour le classer dans la bonne section (groupe et caserne), on doit déplacer la ligne manuellement avec un couper/insérer. Le hic, c'est qu'on peut déplacer la ligne 2103 à la ligne 36, ce qui provoque souvent des erreurs et corrompt le fichier.

Alors, j'ai pensé inséré un bouton de reclassement (un tri), pour éviter les manipulations manuelles des lignes.

Voici le code du bouton, et je me demande s'il n'y a pas moyen de le simplifier et mieux l'adapter.

Idéalement, l'ordre de reclassement est : colonnes (E, D, C). Dans la colonne H, il y a cette formule =S(F#<=42004;1;"") qui n'est pas inscrite pour les recrues, mais qui doit être aussi intégrée une fois qu'un pompier est reclassé. Vous remarquerez également que la ligne de chaque capitaine est en bleue. Elle sert à démarquer la fonction de capitaine et le début de chaque groupe.

Merci d,avance pour votre aide.

Bonne fin de semaine.

 Bouton2_QuandClic()

Range("A4:W" & Range("E" & Rows.Count).End(xlUp).Row).Sort key1:=Range("E4"), order1:=xlAscending, dataoption1:=xlSortNormal, key2:=Range("D3"), order2:=xlAscending, dataoption2:=xlSortNormal, Header:=xlYes

    ActiveSheet.AutoFilterMode = False
    If Sheets("FIT TEST POMPIER 2017").Activate Then

        Range("A3:W3").Select
        Selection.AutoFilter

    End If
End Sub

https://www.cjoint.com/c/HGgpwPsyZTq

Bonsoir,

Sub Bouton1_QuandClic()
    Dim n%
    With ActiveSheet
        If .FilterMode Then .ShowAllData
        n = .Range("D" & .Rows.Count).End(xlUp).Row
        Application.ScreenUpdating = False
        With .Range("A3:W" & n)
            .Sort key1:=.Cells(1, 2), order1:=xlAscending, Header:=xlYes
            .Sort key1:=.Cells(1, 5), order1:=xlAscending, key2:=.Cells(1, 4), _
             order2:=xlAscending, key3:=.Cells(1, 3), order3:=xlAscending, Header:=xlYes
        End With
    End With
End Sub

Cordialement.

Bonjour MFerrand,

merci beaucoup pour la correction du code. C'est super.

Je remarque que si je n'indique pas de date lorsque j'affecte une recrue à un groupe et à une caserne, la formule en H ne se réplique pas.

Bon week-end, et merci encore.

Bonjour à tous

Bonjour MFerrand

Une variante.

Bye !

Bonsoir,

J'ai "modernisé" ton tri, on peut défiltrer sans supprimer le filtre, et ainsi pas besoin de le rétablir ensuite, dimensionner aussi la zone à trier sur D plutôt que E qui excluait une partie du tableau (ainsi qu'inclure la ligne d'en-tête puisque tu indiquais qu'il y en avait une), et d'autre part j'ai cru utile de compléter ton tri pour trier en plus sur la colonne nom de façon à mettre les pompiers en ordre alphabétique.

[gmb: on ne fait donc pas exactement le même tri...]

A noter que l'on peut trier "normalement" sur la colonne Grade dans la mesure ou Capitaine - Lieutenant - Pompier se succèdent dans l'ordre alphabétique. Mais si des problèmes de classement peuvent se poser, note que l'on peut définir un ordre de tri personnalisé.

Pour ta formule, je l'avais pour ma part laissée de côté car elle me posait quelques questions.

D'une part, la condition de date postérieure à 2014 : de fait lorsqu'il y a une date, elle est postérieure, ce qui conduit à n'éliminer que les cellules où il y a absence de date, donc était-ce la bonne condition ?

D'autre part, pour les recrues, rien n'empêchait que la formule soit mise préalablement, avec une condition supplémentaire, et fonctionne...

En 3e lieu, on peut le cas échéant servir la colonne H lors de modification affectant les colonnes D et F et en contrepartie supprimer toute formule en H.

Cordialement.

Bonjour à tous,

Pour commencer, je tiens à dire que j'apprécie beaucoup votre intérêt pour mes problèmes, et vos explications.

J'ai "modernisé" ton tri, on peut défiltrer sans supprimer le filtre, et ainsi pas besoin de le rétablir ensuite, dimensionner aussi la zone à trier sur D plutôt que E qui excluait une partie du tableau (ainsi qu'inclure la ligne d'en-tête puisque tu indiquais qu'il y en avait une), et d'autre part j'ai cru utile de compléter ton tri pour trier en plus sur la colonne nom de façon à mettre les pompiers en ordre alphabétique.

[gmb: on ne fait donc pas exactement le même tri...]

Bien vu et bien fait.

Mais si des problèmes de classement peuvent se poser, note que l'on peut définir un ordre de tri personnalisé.

Que voulez vous dire par problème de classement? Initialement, c'est vrai que j'ai demandé que le re-classement soit groupe D en premier et caserne (E) en second, parce que ce sont ces deux informations qui sont le plus susceptibles d'être modifiées. Mais, il est vrai aussi qu'un pompier pourrait changer de grade et/ou muter de caserne. Qui plus est, l'ordre capitaine-lieutenant-pompier est également pertinent. L'ordre alphabétique des noms un gros plus.

En ce qui concerne la formule, je dois avouer que ce fichier est récupéré d'un collègue dont j'ignore les intentions par rapport à la conditionnelle. D'ailleurs, mon bagage concernant les conditionnelles n'est pas très large. Or, le 42004 renvoie-t'il aux dates postérieures à 2014 ou est-ce lié au fait que je suis en Excel 2003. Pour ma part, la formule doit indiquer : s'il n'y pas de date en F, alors comptabiliser 1. Car, le total des lignes sans date indique le nombre de dossier à traiter. La formule sert à comptabiliser le nombre de cas à traiter.

La particularité de ce décompte, c'est que l'on attribue pas à tous une date de test à faire, comme pour les recrues. Je suis curieux de savoir qu'elle serait la conditionnelle qui tiendrait compte de cette particularité.

Merci encore.

Bonsoir,

S'agissant d'évocation d'ordre de tri personnalisé, cela résulte du constat de la présence de quelques Pompier EI, qui eux se placeront nécessairement après Pompier. Si cela est indifférent, on laisse ainsi, mais si on souhaite les placer avant, il faut alors passer par un ordre personnalisé.

42004 : tu peux faire l'expérience, tu tapes dans une cellule, jusque là c'est un nombre.

Ensuite tu modifies le format de cellule pour mettre par exemple j mmm aaaa en format personnalisé. Et à la place de 42004 tu verras apparaître 31 déc 2014.

Ce nombre peut donc être une date s'il est associé à un format de date.

Lorsque tu tapes une date dans une cellule, le plus souvent sous la forme classique : 31/12/2014, tu ne mets pas de signe = devant, donc ce n'est pas une formule, et les slashs entre les nombres ne peuvent donc être interprétés comme opérateur de division et sont donc identifiés comme caractères de texte, ce qui fait de ta saisie un texte...

Seulement dans cette saisie-texte, Excel va reconnaître l'un des formats de dates par défaut figurant dans tes paramètres régionaux Windows FR FR ! Et opérant cette reconnaissance, il convertit automatiquement ta saisie en nombre : 42004, pour le stocker et va appliquer le format jj/mm/aaaa à la cellule pour l'afficher au format de date par défaut. Le nombre 42004 est dès un numéro de série représentant une date. La date va se cadrer à droite dans la cellule, comme les nombres, alors que les textes se cadrent à gauche (lorsqu'on ne force pas l'alignement).

Ainsi, ta formule utilisant ce numéro comme élément de comparaison d'une colonne contenant des dates, peut réaliser la comparaison parce que chaque date est en réalité une valeur numérique assortie d'un format de date, mais la comparaison se fait sur la valeur.

Si la cellule est vide, elle va renvoyer 0 parce que tu effectues une comparaison numérique.

Si la mention 1 doit être portée dans la colonne H lorsque la date figurant en F est antérieure à une date limite ou qu'il n'y a pas de date, il est légitime de penser que cette date limite ne sera pas toujours le 31/12/2014 au fur et à mesure que le temps passe, il conviendrait alors de la définir en référence à la date du jour.

Si on se contente de ne détecter que l'absence de date, on peut par contre supprimer la date limite de la formule.

Quant à exclure les recrues de cette détection, cela peut s'incorporer à la formule.

On peut donc dans tous les cas définir une formule s'appliquant à tout le tableau.

Cordialement.

Bonjour MFerrand,

merci beaucoup pour votre temps et explication.

A+

Bonjour MFerrand,

Après révision et test avant de déployer la macro sur le fichier original, je constate qu'il y a une exception pour la caserne 19.

Certains pompiers de la caserne 19 ont une affectation temporaire à la caserne 2, et ceux-ci doivent quand même rester dans la section de leur caserne et groupe d'origine (la 19). En leur attribuant la caserne 2, le bouton de reclassement crée une nouvelle section, ce qui n'est pas souhaitable.

Dans la cellule, j'ai essayer différente inscription comme 19 (2), 19,2, mais je me retrouve avec la même situation.

Auriez vous une piste pour éviter cela et que ceux qu'on leur attribue la caserne 2 reste dans la section de la caserne 19.

Merci

Ce qu'on a fait jusqu'ici était un tri à partir des données inscrites... Dans ton fichier modèle, je n'ai pas vu de caserne 19 ?

Si tu mets une mention 19 en E ce sera trié... Alors que veux-tu mettre en E, et comment veux-tu que ce soit trié ?

Car si tu ne détailles pas un peu, je ne saisis pas ta problématique.

Cordialement.

Bonjour MFerrand,

Oui, désolé. Effectivement, je n'ai pas mis le fichier original, car trop volumineux et contient des données confidentielles. Le fichier fourni contient une infime partie des données, car dans l'original il y a 78 casernes.

Je tente de mieux vous exposer l’exception au tri. En référence au fichier que j'ai joint, disons que dans le classement de la caserne 2, j'affecte quelques pompiers à la caserne 19, je voudrais qu'exceptionnellement ces nouvelles affections ne soient pas triées lorsque j'utilise le bouton de reclassement. En fait, tous ceux qui ont une affectation 19 sont en réalité des 2. C'est pourquoi, j'aimerais que tous ceux qui reçoivent l'affectation 19 restent classés avec ceux de la caserne 2.

Merci encore.

En ce cas, pourquoi ne pas mettre 2 en E et "Affecté caserne 19" en notes ?

Bonjours MFerrand.

Oui, je crois que cela reste l'option la plus simple. Insérer un commentaire, c'est ce que les gens font déjà, mais renomme la cellule 19. Je tenterai de les convaincre de laisser le # de la caserne d'origine.

merci encore.

Rechercher des sujets similaires à "tri personnalise particularites"