Problème de tri par VBA

Bonjour,

Afin de répondre à une demande sur un autre fil, je me suis à nouveau cassé la figure sur un problème de tri par macro.

Pour le fichier ci-joint, j’avais enregistré une macro sur Excel 2007. Le code généré est assez compliqué, mais au moins ça fonctionnait sur Excel 2007. A un certain moment de l’enregistrement, ça me demandait s’il fallait considérer les textes comme des dates, ce que j’ai confirmé.

En essayant ce même fichier sur Excel 2003, ça ne passe bien entendu plus. J’ai donc tenté d’enregistrer à nouveau un code avec l’enregistreur d’Excel 2003. A nouveau la question m’est posée, pendant l’enregistrement, afin de savoir s’il faut considérer tous les textes comme des dates. Si le tri est correctement fait pendant l’enregistrement, l’utilisation du code n’est par contre plus possible par la suite, lorsqu’il est lancé par l’intermédiaire du bouton correspondant.

Comme j’avais déjà eu un problème semblable sur le fil https://forum.excel-pratique.com/excel/probleme-de-tri-t27993.html, j’ai d’abord regardé du coté du format des cellules de la colonne A - mais c’est bien des dates - et j’ai encore voulu contrôler s’il n’y avait pas d’espace après ces dates.

Et là, j’ai découvert un truc que je n’avais encore jamais vu : je sélectionne par exemple la cellule A2, je clique derrière la date dans la barre de formule afin de voir s’il n’y a pas d’espace, comme il n’y en a pas je tape la touche « Enter » et alors le texte est automatiquement transformé en date (la date écrite tout d’abord à gauche est déplacée à droite). Si je répète cela dans toutes les cellules de la colonne A, le tri par le bouton est finalement possible !!!!

Savez-vous aussi comment je pourrais transformer au préalable, dans mon code « Tri », les cellules de la colonne A afin qu’elles soient triées correctement ?

Cordialement.

22probleme-de-tri.zip (14.84 Ko)

Bonjour

D'après ce que j'ai compris

Tes dates sont au format texte

Je te propose un code car il faut changer le séparateur dans la date

Tu n'as peut-être pas besoin de faire cette substitution

Ensuite il te faut faire un copier/collage spécial ---> Multiplication pour transformer tes textes en nombre

Vérifies si c'est bon

Sub Tri()

'''''''''''''''''''''''''''''''''''''''''Enregistré avec Excel 2003
  With Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)
    .Replace What:=".", Replacement:="/", LookAt:=xlPart, SearchOrder:=xlByRows, _
        MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    Range("N1") = 1
    Range("N1").Copy
    .PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
                     SkipBlanks:=False, Transpose:=False
    .NumberFormat = "m/d/yyyy"
    .Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortTextAsNumbers
    Range("N1").ClearContents
  End With
End Sub

Salut Banzai et merci pour ton aide,

Banzai64 a écrit :

Tes dates sont au format texte

C'est bien ce que je pensais, mais je ne comprends pas pourquoi - lorsque je veux voir quel format ont mes cellules - ça m'indique que ce sont déjà des dates

J'ai testé ton code et j'obtiens le résultat suivant :

24 04

Les dates ne sont pas triées comme désiré (dans la cellule A2 il s'agit en fait du 2 mai au format anglo-saxon) et en plus il faudrait que le format soit jj.mm.aaaa et non pas jj/mm/aaaa (mais ça j'y arriverais peut-être tout seul par la suite).

Peux-tu encore m'aider ?

Bonjour

D'après l'image on dirait que la cellule A2 n'a pas été modifiée

Tu peux m'en dire plus

Si, elle a été modifiée de

02.05.2012 (Alignement à gauche, probablement format "Texte", genre de date francophone) à

05.02.2012 (Alignement à droite, format "Date", genre anglo-saxon).

Bonjour

Pourquoi alors elle n'a pas les / ?

Re,

Je ne peux pas te dire pourquoi

Mais j’ai trouvé une solution à mon problème ; je multiplie la colonne A par 1 dans une colonne adjacente et j’obtiens un format de date utilisable pour mon tri.

Pour moi on peut considérer ce post comme liquidé et je l’indique donc comme tel. Mais si tu désires absolument comprendre le « pourquoi du comment », je serais d’accord de faire encore des essais.

Dans tous les cas, merci encore une fois pour ton aide.

Cordialement.

Salut Banzai,

Je te remercie pour ton message privé. J'ai bien essayé d'y répondre hier, mais il m'a fallu un moment pour comprendre pourquoi je n'arrivais pas à t'envoyer également un message privé ; d'après ce que j'ai compris, tu as désactivé cette option et l'on ne peut pas te répondre de cette manière. De toute façon je trouve que notre discussion peut intéresser d'autres membres et je réactive volontiers ce fil.

Alors pour répondre à ta question, j'utilise ton code selon l'exemple dans le fichier ci-joint. Entre hier et aujourd'hui, on est passé de la version Excel 2003 à Excel 2010 au boulot. Mes essais de ce matin avec Exel 2010 donnent exactement le même résultat qu'hier :

25 04

Cordialement.

Je me réfère à notre discussion sur le fil de René.

Je ne vois pas ce que je pourrais modifier au code que tu m'as fourni et qui est utilisé dans le dernier fichier joint ci-dessus afin que ce problème de "dates suisses" soit résolu.

Peux-tu éventuellement me fournir une copie d'écran des colonnes A et F de ce fichier après que la macro ait été lancée chez toi ?

Voici ce que ça donne chez moi

25 04 bis

Cordialement.

Bonjour

A l'ouverture du fichier

yvouille v001

La cellule A2 est déjà en date

Les autres sont au format texte

Après la macro

yvouille v002

Même chose qu'à l'arrivée

Désolé mais j'abandonne

Edit: Un dernier essai regardes cette macro

Option Explicit

Sub Tri()
Dim Lg As Long

  Lg = Range("A" & Rows.Count).End(xlUp).Row
  Columns("A").Insert
  With Range("A2:A" & Lg)
    .Formula = "=IF(ISNUMBER(RC2),RC2,(LEFT(RC2,2) & ""/"" & MID(RC2,4,2) & ""/"" &  RIGHT(RC2,2))*1)"
    .Value = .Value
    .NumberFormat = "m/d/yyyy"
  End With
  Range("A1") = Range("B1")
  Columns("B").Delete
  Range("A2:D" & Lg).Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlNo, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortTextAsNumbers
End Sub

Bonjour à tous,

Essaie cette macro de tri Yvouille :

Sub tri_seb()

    der_ligne = Range("A1").End(xlDown).Row

    'Conversion en dates
     For i = 2 To der_ligne
        Cells(i, 1) = CDate(Replace(Cells(i, 1), ".", "/"))
    Next

    'Tri
     Range("A2:D" & der_ligne).Sort Key1:=Range("A2"), Order1:=xlAscending

End Sub

Résultat :

tri

Cordialement,

Bonsoir à tous deux,

J'ai testé vos deux macros et toutes deux fonctionnent bien chez moi. Merci beaucoup pour votre aide. La solution de Sébastien serait cependant - selon moi - un peu plus simple.

Comme j'ai eu un problème sur un autre fil avec la suissitude de mes dates (https://forum.excel-pratique.com/excel/modification-de-macro-t30007.html), j'espère que la solution de Sébastien ne vaille pas que pour notre pays. Banzai, pourrais-tu tester sa solution ?

Cordialement.

Bonsoir

Pas de souci la macro fonctionne très bien et est beaucoup plus simple

Merci

Beaucoup plus simple, non, mais au moins je sais qu'elle fonctionne également hors de nos frontières

Selon ce que répondra René sur l'autre fil, je verrai si la solution trouvée ici conviendra aussi là-bas.

Merci encore une fois à Sébastien et à toi

Rechercher des sujets similaires à "probleme tri vba"