Excel VBA trier selon la date ( sans textbox)

Odeatho -  
lermite222 Messages postés 9042 Statut Contributeur -
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. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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. Odeatho
       
      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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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. Odeatho
       
      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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    CVdate?

    Ne serait ce pas plutôt Cdate ?

    0
  4. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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. Odeatho
       
      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
      1. Odeatho > Odeatho
         
        Saut 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
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  8. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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. Odeatho
       
      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
  9. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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. Odeatho
       
      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
  10. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  11. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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. Odeatho
       
      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
  12. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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