Macro tri tableau - pb-

Résolu
Bonjour à tous et toutes,

j'espère que vous allez bien.
je poste ce message car j'ai un souci avec l'éxécution de ma macro.
cherchant à faire un tri dans le sens plus petit plus gard, j'ai trouvé cette macro que j'ai mis sur ma woorkdsheet :

rivate Sub Worksheet_Change(ByVal Target As Range)
Static EnCours As Boolean 'Evite l'effet de boucle sur l'évènement Change()
If EnCours Then Exit Sub
If Not Application.Intersect(Target, Range("k3:l35")) Is Nothing Then
EnCours = True
Range("k3:l35").Sort Key1:=Range("l2"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
EnCours = False
End If
End Sub

le hic, c'est que ne s'applique pas..."Ah ! voila les petits futés qui vont "piqué" les macros des autres et quine savent pas l'utiliser :-)"

je suis sur que parmi vous il y a des petits "bisons" qui auront la solution..

je joins le fichier histoire que je sois compris par le plus grand nombre : https://www.cjoint.com/?3GttaIk1ewU

merci de votre aide et très bonne soirée à vous,

cdlmnt,

berni///

10 réponses

  • Votes
  • Date
  • Date décroissante
  1. bonjour eriiic,

    super ! ça marche !
    un tout grand merci pour votre réponse et de votre patience.

    je vous souhaite une belle journée...

    cdlmnt,

    berni///
    1. Contributeur
      Bonsoir,,

      mais celle-ci ne marche" pas car j'ai des formules dans ma colonne L.
      correct ?

      Tout à fait, l'évènement Change n'est déclenché que sur une saisie. Et tes saisies nécessitant un recalcul se font en D.
      Et Order1:=xlDescending

      soit et là j'ai pas compris, je "revalide une des cellule de K3:L35" qu'entendez-vous par revalidez ?
      Tu double-cliques en K3 comme si tu voulais l'éditer et tu valides. Ca déclenche l'évènement Change comme c'est une saisie.

      Mais surveille D :
      Private Sub Worksheet_Change(ByVal Target As Range)
          Static EnCours As Boolean       'Evite l'effet de boucle sur l'évènement Change()
          If EnCours Then Exit Sub
          If Not Application.Intersect(Target, Range("D:D")) Is Nothing Then
              EnCours = True
              Range("K3:L35").Sort Key1:=Range("L3"), Order1:=xlDescending, Header:=xlNo
              EnCours = False
          End If
      End Sub

      Dès que tu saisiras une commune le classement se refera.

      eric

      1. bonjour eriiic,

        merci de votre réponse. désolé de répondre seulement maintenant mais j'ai eu des souci d'accès à l'internet (mon pc me lâche).

        j'ai bine compris votre message. en résumé si je comprends bien ma macro doit devenir :

        Private Sub Worksheet_Change(ByVal Target As Range)
        Static EnCours As Boolean 'Evite l'effet de boucle sur l'évènement Change()
        If EnCours Then Exit Sub
        If Not Application.Intersect(Target, Range("K3:L35")) Is Nothing Then
        EnCours = True
        Range("K3:L35").Sort Key1:=Range("L3"), Order1:=Descending, Header:=xlNo, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
        EnCours = False
        End If
        End Sub

        mais celle-ci ne marche" pas car j'ai des formules dans ma colonne L.
        correct ?

        si je veux appliquer une macro je dois :
        soit créer un bouton pour mettre la macro,
        soit je passe par une autre colonne pour appliquer la macro
        soit et là j'ai pas compris, je "revalide une des cellule de K3:L35" qu'entendez-vous par revalidez ?

        je reposte le fichier : https://www.cjoint.com/?3GvtcSBdX0Z
        mais je crois que les carottes sont cuites :-) (comme ça je le sais pour la prochaine)

        très cdlmnt,

        berni///
        1. Contributeur
          Bonjour à tous,

          voici le fichier avec la modification proposé par eriiic
          Non, j'avais mis Key1:=Range("L3") et tu as laissé Key1:=Range("L2")

          sauf que le classement ne se fait pas du plus élevé au moins élevé mais du mois élevé au plus élevé.
          Ca trie dans l'ordre que tu lui indiques : Order1:=xlAscending
          Si tu te mettais sur .Sort et que tu faisais F1 ?

          Et comme dit michel :
          L'événement "change" ne réagit que sur saisie et non sur calcul d'une cellule...
          Donc soit tu revalides une des cellule de K3:L35 (mets tes ref en majuscule stp), soit tu mets ta macro sur un bouton, soit tu supervises les cellules nécessitant un nouveau tri (colonnes D et/ou E sans doute)

          eric
          1. Contributeur
            Bonjour,

            dans la colonne L (difficile de savoir si c'est I majuscule ou L miniscule!!!) tu as
            une formule

            L'événement "change" ne réagit que sur saisie et non sur calcul d'une cellule...

            1. le problème pourrait-il provenir du fait qu'il y a des les cellules k3:k35 une formule ?
              j'ai essayé sur un autre tableau et sans formule et ça semble sauf que le classement ne se fait pas du plus élevé au moins élevé mais du mois élevé au plus élevé.
              1. bonjour eriiic, bonjour à tous,

                merci à vous de m'avoir répondu. mais visiblement il y a qq chose que j'ai pas compris car cela ne fonctionne pas. voici le macro que je placé :

                Private Sub Worksheet_Change(ByVal Target As Range)
                Static EnCours As Boolean 'Evite l'effet de boucle sur l'évènement Change()
                If EnCours Then Exit Sub
                If Not Application.Intersect(Target, Range("k3:l35")) Is Nothing Then
                EnCours = True
                Range("k3:l35").Sort Key1:=Range("L3"), Order1:=xlAscending, Header:=xlNo
                EnCours = False
                End If
                End Sub

                mais ,cela n'a pas d'effet.. :-(

                je ne comprends pas...

                l'objectif es de trier la tableau sur base de la colonne L mais ça prends pas...

                aurai-je commis une erreur ?

                merci de votre aide...

                cdlmnt,

                berni//
                1. Contributeur
                  Bonjour,

                  Range("k3:l35").Sort Key1:=Range("l2"), Order1:=xlAscending, Header:=xlYes, _
                  OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                  DataOption1:=xlSortNormal

                  Key1:=Range("l2") : non, c'est en dehors de ta plage. Donc L3 (ou K3 si tu veux trier par nom)
                  Header:=xlYes : non, tu n'as pas de ligne de titre, donc xlno

                  Range("k3:l35").Sort Key1:=Range("L3"), Order1:=xlAscending, Header:=xlNo
                  devrait suffire.

                  eric
                  1. bonjour eriiic, bonjour à tous,

                    merci à vous de m'avoir répondu. mais visiblement il y a qq chose que j'ai pas compris car cela ne fonctionne pas. voici le macro que je placé :

                    Private Sub Worksheet_Change(ByVal Target As Range)
                    Static EnCours As Boolean 'Evite l'effet de boucle sur l'évènement Change()
                    If EnCours Then Exit Sub
                    If Not Application.Intersect(Target, Range("k3:l35")) Is Nothing Then
                    EnCours = True
                    Range("k3:l35").Sort Key1:=Range("L3"), Order1:=xlAscending, Header:=xlNo
                    EnCours = False
                    End If
                    End Sub

                    mais ,cela n'a pas d'effet.. :-(

                    je ne comprends pas...

                    l'objectif es de trier la tableau sur base de la colonne L mais ça prends pas...

                    aurai-je commis une erreur ?

                    merci de votre aide...

                    cdlmnt,

                    berni///