Excel VBA trier selon la date ( sans textbox)

Bonjour à tous,
J'ai parcouru pas mal de forums qui donnent des réponses qui me conviennent presque mais que je n'arrive pas a adapter.
J ai un tableur excel avec une colonne remplie de dates et j'aimerais simplement faire un tri selon la date.
J'ai lu que la solution uiliserait surement la conversion en mode standard de la colonne.

J'ai trouvé un code qui marche presque :

Dim ColDates As Integer
Dim f1 As Worksheet
Set f1 = Worksheets("sheet")
ColDates = 40
'1.Columns(ColDates).NumberFormat = "0"
f1.Range("A1").CurrentRegion.Sort Key1:=Range("I250"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
' ', _DataOption1:=xlSortNormal
'1.Columns(ColDates).NumberFormat = "dd/mm/yyyy"

Seulement il y a deux problemes que je n'arrive pas à regler.
Le premier c est que pour renseigner sur le contenu de mes colonnes la premiere case est une string donc quand ca trie ca le met en automatique a la fin, ce que je ne veux pas. J'ai essayé de changer ca en nombre pendant la période du tri mais je n ai pas réussi.

deuxieme souci , j ai cru comprendre qu'Excel avait des souci entre dates jj/mm/aaaa et mm/jj/aaaa , aussi quand je passe la colonne en format standard j ai certaines cases qui ne changent pas ( que je n arrive pas a formater en Date)

Auriez vous des idées ?

11 réponses

  1. Contributeur
    Re,
    Même en texte ça devrait changer sauf !! s'il y a des espaces dans les cellules.
    Pour tester met dans un colonne vide =NBCAR(..) et contrôle s'il affiche le nombre de caractères que tu vois.
    Si plus, tu dit, je te passerai une macro qui rectifie ça
    0
    1. Contributeur
      Un peu plus automatique...
      Sub TrieDate()
      Dim Plage As Range
      Dim Col As Byte, LigDeb As Long, DerLig As Long
          Sheets("TriDate").Select
          Col = 6 'pour la colonne F
          LigDeb = 5 '1ère ligne de tri
          DerLig = Cells(65536, Col).End(xlUp).Row
          Set Plage = Range(Cells(LigDeb, Col), Cells(DerLig, Col))
          Plage.NumberFormat = "0"
          Plage.Sort Key1:=Cells(LigDeb, Col), Order1:=xlAscending, Header:=xlGuess, _
              OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
          Plage.NumberFormat = "dd/mm/yyyy"
      End Sub


      0
      1. Merci les gens , ca avance bien , il manque presque plus rien.

        J'ai encore un souci en fait, j'ai pris ta macro lermitte22 et quand je l execute, mes dates sont rangées d'abord par jour puis par mois j obtiens ca en fait :

        01/01/2008
        01/03/2009
        01/07/2008
        01/08/2008
        01/08/2008
        01/09/2008
        01/11/2008
        02/10/2008
        02/10/2008
        03/09/2008
        03/10/2008
        03/10/2008
        03/11/2008
        (la liste est longue mais je vous donner un exemple simple)
        du coup je me suis dit je vais enlerver la derniere ligne pour voir comment se passe le formatage et en fait y a que la case 3 qui passe en mode standard ( ma premiere ligne est la ligne 2)
        Je pense que tout le problème vient fait que ma case 1 dans la colonne des dates est un texte , ca doit poser probleme pour formater toute la colonne.
        C'est pour ca qu'au début j essayais de copier ma colonne dans la colonne AN(vide) et que je mettais 1 comme valeur en standard dans la case 1 pour que la ligne 1 bouge pas.
        C'est compliqué :s
        0
    2. Contributeur
      Pourtant avec l'idée de changer le format ça fonctionne impec...
      Sub TrieDate()
      Dim Plage As Range
      Dim Col As Byte, LigDeb As Long, DerLig As Long
          Sheets("TriDate").Select
          Col = 6 'pour la colonne F
          LigDeb = 5 '1ère ligne de tri
          DerLig = 14
          Set Plage = Range(Cells(LigDeb, Col), Cells(DerLig, Col))
          Plage.Select
          Selection.NumberFormat = "0"
          Selection.Sort Key1:=Range("F5"), Order1:=xlAscending, Header:=xlGuess, _
              OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
          Selection.NumberFormat = "dd/mm/yyyy"
          Range("F17").Select
      End Sub

      Résultat...
      26/10/2007
      10/08/2008
      15/10/2008
      15/10/2008
      15/10/2008
      31/10/2008
      31/10/2008
      31/10/2008
      15/11/2008
      15/05/2009

      J'ai tester avec l'exemple que tu donne..
      A+
      0
      1. Contributeur
        Bonjour,
        S, je pense que ça vient du formatage,
        Tu met d'abord en format standard ou nombre (je sais plus) ce qui, vu qu'excel traitre les dates par des nombres traduit tes dates en nombres et le tri se fait donc sur des nombres.
        Ensuite tu remet le format en date
        Tu ne le vois pas parce que ça va trop vite.
        Mais c'est une bonne idée à retenir pour des tri sur date.
        A+
        EDIT:
        Que veux-tu dire par "ne trie pas dans le bon ordre" si tu veux changer le sens suffit de changer xlAscending par xlDescending
        0
        1. Oui Lermitte22, c était le principe a la base recopier la colonne date , transformatage en format date , puis en standard faire un tri du plus petit au plus grand puis reformater en date.

          quand je te dis dans le mauvais ordre c est genre ca :

          15/11/2008
          15/10/2008
          15/05/2009
          31/10/2008
          10/08/2008
          31/10/2008
          31/10/2008
          26/10/2007
          15/10/2008
          15/10/2008

          du coup je pige pas trop ce qui ne va pas , y a pas plus simple que ce que j ai écrit audessus juste pour trier les nombres ? j ai pas besoin de reformater en date a la fin vu que je copie dans une colonne inutilisée.
          0
      2. Contributeur
        essaye plutôt avec...
        Sub ChangerT_D()
        Dim Lig As Long, Col As Integer
            Col = 2 ' Pour la colonne B .. à adapter. Note: pour la colonne AN c'est 40
            On Error resume Next
            For Lig = 2 To 250 'adapter les lignes
                Cells(Lig, Col) = CVDate(Cells(Lig, Col))
            Next Lig
        
        End Sub

        tu dit.
        0
        1. Merci Lermitte22,
          je sens que ca avance beacoup je te remercie ( j oublie pas les autres hein :) )
          alors disons que ca me les trie pas par ordre croissant ( mais ca ca vient pas du formatage je pense)
          Je vais vous filer le code exact de la macro
          et aussi dans les case ou il n y a rien ( j ai mis 250 pour etre sur de pas en louper mais je crois qu il y a que 150 cellules remplies environ) il y a présent 00/01/1900 mais je pense que c est parce qu il considere que la case vide représente 0.

          Juste je voudrais comprendre maintenant pourquoi ca trie pas dans le bon ordre.

          Sub TrierSelonLaDate()
          Dim f1 As Worksheet
          Set f1 = Worksheets("Actions GO")

          Dim Lig As Long, Col As Integer, ColDep As Integer

          Col = 40 ' Pour la colonne B .. à adapter. Note: pour la colonne AN c'est 40
          ColDep = 12

          On Error Resume Next
          For Lig = 2 To 250 'adapter les lignes
          Cells(Lig, Col).Value = Cells(Lig, ColDep).Value
          Cells(Lig, Col) = CVDate(Cells(Lig, Col))
          Next Lig

          Cells(1, Col) = 1

          Dim A As Long
          For A = 2 To 250

          Next A
          Cells(40, 1).Value = "1000"
          Dim ColDates As Integer

          ColDates = 40
          f1.Columns(ColDates).NumberFormat = "0"
          f1.Range("A1").CurrentRegion.Sort Key1:=Range("I250"), Order1:=xlAscending, Header:=xlGuess, _
          OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
          ', _DataOption1:=xlSortNormal
          f1.Columns(ColDates).NumberFormat = "dd/mm/yyyy"
          End Sub

          Elle est surement mal écrite ou pas écrire comme un vrai codeaur , je m en excuse d avance.
          Je vous remercie a tous
          0
      3. Contributeur
        Re,
        Probablement parce qu'il y a un mélange de format,
        essaye en mettant toute la colonne en Texte.. si va pas essaye en Standard..
        Tu dit.
        A+
        EDIT:
        Négatif, ça va pas en changeant le format.
        0
        1. Contributeur
          Je vais quand même répondre à ta 2ém question avant ta réponse,
          Key1:=Range("I250"), ça m'étonnerais que ce soit bon,
          Key c'est le "mot" à rechercher, donc si par exemple ce que tu cherche est dans une liste de prénoms tu tape en A1 ...Marcel
          et ce devrait-être alors Key=range("A1"), recherchera toute les ligne où le prénom Marcel est écrit.
          0
          1. Bonjour les gens,
            Merci je vais tester tout ca ( d ici a mercredi soir de la semaine prochaine et oui vive l alternance :p)
            je vous tiens au courant.

            Ouais donc en fait la fonction que j ai écris dans mon premier post ne trie pas du tout par date alors !
            Ou peut etre que c est prévu pour qu il n y a rien dans la case en question auquel cas le tri se ferait par ordre croissant ?
            Enfin la ce ne sont que des suppositions. Bizarre quand même, j ai pris cette fonction sur un forum qui donnait des fonctions pour trier par date.

            Merci beaucoup !
            0
          2. @OdeathoSaut les gens ( désolé du retard :) )

            Désolé pour vous mais
            Cells(Lig, Col) = CVDate(Cells(Lig, Col))
            me retourne Type Mismatch

            Je comprends pas pourquoi d ailleurs
            0
        2. Contributeur
          Bonjour, bonjour Michel, ça y est, je suis révéillé... :-)
          Non, c'est bien CVDate...
          Et commencons par le début, changer ta colonne Textre en date...
          1°) avec Range tu met d'abord la colonne ET ENSUITE la ligne.. Genre B5
          Mais avec Cells c'est l'inverse, Cells(Ligne,Colonne)
          donc quand tu met...
          Cells(40, A).Value = Cells(12, A).Value
          Les adresses sont pas bonnes.
          Exécute d'abord cette petite fonction
          Sub ChangerT_D()
          Dim Lig As Long, Col As Integer
              Col = 2 ' Pour la colonne B .. à adapter. Note: pour la colonne AN c'est 40
              For Lig = 2 To 250 'adapter les lignes
                  Cells(Lig, Col) = CVDate(Cells(Lig, Col))
              Next Lig
          
          End Sub

          Tu dit..
          Et ont verras pour la suite
          EDIT:
          Evite d'employer des variables abstraites tel que A, B, C etc, si tu traite des lignes met une varaible qui te fait penser à des lignes, moi j'emploi Lig et Col pour des colonnes.
          Esssaye aussi de mettre une ou plusieur majuscule dans le nom de la variable mais quand tu la retranscrit TU NE MET PAS DE majuscule, comme ça tu peu détecter immédiatement une erreur de syntaxe si le mot que tu vient de taper ne se transforme pas tout seul avec une ou des majuscules. (des ptit trucs)
          0
          1. Contributeur
            CVdate?

            Ne serait ce pas plutôt Cdate ?

            0
            1. Contributeur
              Bonjour,

              en atttendant notre ami Louis (bonjour, Lhermite c'est l'heure!) ;-)

              ta variable A etant un nombre désignant une colonne tu ne peux que difficilement employé l'objet "range"

              donc il te faut employer cells(12,A)

              si ta variable X désignait une ligne dans la colonne B tu pourrais écrire
              range("B:" & X)

              0
              1. Merci michel =)
                J'ai essayé de faire ce que tu m'as dit mais cela n'a pas fonctionné , j ai l impression par contre que c est moi qui pige pas lol
                je voudrais en fait parcourir ma colonnne L ou AN au choix de 1 a 250
                j ai testé ca(dans une boucle de 1 a 250 avec a en variable incrémentée) :

                f1.Range("AN:" & A) = CVDate(f1.Range("AN:" & A))
                ca me dit "method range of object worsheet failed"

                et ca :
                f1.Cells("AN:" & A) = CVDate(f1.Cells("AN:" & A))
                ca me dit " Type mismatch"

                je comprends pas ce qui ne va pas
                0
            2. Contributeur
              Bonjour,
              Effectivement il n'est pas possible de changer une date entrée en texte par du format date.
              Cause, Excel traite les dates par des nombre '1 = 1/1/1900
              le 13/11/2008 = 39765
              Ce qui revient à dire que dans la cellule il n'y a pas une date mais un nombre qu'excel AFFICHE sous le format désigné.
              Mais dans une cellule texte, c'est poas un nombre qui est mais un string.
              et il n'y à pas de problème avec les format.
              Pour y remédier tu peu faire une boucle sur ta colonne pour tout remettre en date avec..
                  Worksheets("Feuil2").Range("A7") = CVDate(Worksheets("Feuil2").Range("A7"))

              Adapter les adresses bien sûr.
              Quand c'est fait, ton filtre fonctionnera normalement.
              A+
              0
              1. Merci =)
                Par contre j'ai pas un super niveau en VBA et j'ai du mal a gérer les Range

                Tu vois dans le morceau de code que j ai cité dans mon premier post , je comprends pas pourquoi c'est Range (A1) puis Key(I250).

                Et j'ai essayé d'utiliser ta formule mais c'est pareil , j arrive pas a lui dire de prendre de la case 1 a 250.

                Autre question comment on fait pour mettre la colonne AN dans un range ? j ai pas réussi non plus.

                Voila le code que j'ai mis mais le range est pas bon .

                Dim A As Long
                For A = 2 To 250

                Cells(40, A).Value = Cells(12, A).Value
                f1.Range(12, A) = CVDate(f1.Range(12, A))
                Next A

                C'est surement des questions faciles que je pose désolé :)
                0