Excel VBA trier selon la date ( sans textbox)

Fermé
Odeatho - 13 nov. 2008 à 10:57
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 - 17 déc. 2008 à 12:34
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 ?
A voir également:

11 réponses

lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
13 nov. 2008 à 11:25
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
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
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
19 nov. 2008 à 10:05
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
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
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
19 nov. 2008 à 13:09
CVdate?

Ne serait ce pas plutôt Cdate ?

0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
19 nov. 2008 à 13:46
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
19 nov. 2008 à 14:50
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
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
Odeatho > Odeatho
28 nov. 2008 à 12:03
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
28 nov. 2008 à 13:03
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
28 nov. 2008 à 13:11
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
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
4 déc. 2008 à 11:50
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
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
5 déc. 2008 à 13:02
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
5 déc. 2008 à 13:18
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
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
17 déc. 2008 à 12:34
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