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
    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
  2. 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
  3. Contributeur
    CVdate?

    Ne serait ce pas plutôt Cdate ?

    0
    1. 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
        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
        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
          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
        2. 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
        3. 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
            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
            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