Trier une colonne de date en ordre decroissant

Moreno076

XLDnaute Impliqué
Bonjour à tous.

Ci joint je n'arrive pas à trier la colonne date de rupture par ordre décroissant.
J'ai un bouton avec une macro. triage date.

Est ce qu'une personne pourrait me modifier ce fichier svp, je n'y arrive absolument pas.

D'autre part comment réinitialiser le fichier j'ai le gros bouton gris qui est en mode gestion terminée etje voudrais le déplacer et pouvoir avoir un bouton réinitialiser le fichier.

Merci pour votre aide.
 

Dranreb

XLDnaute Barbatruc
Elle sont bien saisies dans Excel vos dates au moins ?
Parce que si elles viennent d'un fichier texte, par exemple, sorti d'un autre logiciel, il faudrait voir à ce qu'elle soient bien interprétées à l'importation, sinon c'est normal qu'il laisse en texte les dates qu'il ne peut pas interpréter en dates avec la mauvaise la règle qu'il applique.
Mais alors même celle qu'il arrive à interprèter comme dates son fausses, puisque ce sont seulement celles où il peut y avoir confusion entre le jour et le mois (seulement les jours <= 12, lesquels sont interprétés comme le mois).
 

Dranreb

XLDnaute Barbatruc
Ça se confirme: dans un Test8.xlsm que vous avez joint dans une autre discussion, les données qu'il est arrivé à convertir en dates sont fausses, le jour ayant été interprété comme mois et vice versa. Celle qu'il n'a pas pu interpréter comme ça sont restées en textes.
C'est vraiment la source de ces dates qu'il faut revoir. Parce qu'à la saisie dans la barre de formule, Excel ne fait jamais de telles inversions.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Non, il sont déjà inversés bien avant cela dans les valeurs de cellules de type Date.
C'est le format spécial de cellule conventionnellement international "m/d/yyyy"qui les restitue dans leur forme française normale.
Enquêtez pour trouver la toute première origine de ces dates, et pourquoi et à quel moment elle sont mal codées.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Mettez dans deux colonnes de cellules à droite =JOUR(H3) et =MOIS(H3).
Peut être que vous comprendrez mieux.
Et sachez qu'une donnée de type Date n'a pas de jour, mois, an ni même de slashs :
C'est codé comme un nombre entier, celui du nombre de jours écoulés depuis le 1er janvier 1900.
Donc, si vous ne réparez pas ces dates à la source, vous ne pourrez jamais les classer correctement.
 

Dranreb

XLDnaute Barbatruc
Non ce n'est pas un problème de format de date. C'est un problème de codage faux d'un nombre de jours écoulés depuis le 1er janvier 1900.
Y a du y avoir un couac je ne sais pas où, tel que les jours ont été pris pour des mois et vice versa, et par dessus un format de cellule personnalisé MM/JJ/AAAA qui fait que ça ne se voit pas parce que ça ré-inverse l'apparence. Mais le type qui a fait ça à quand même encodé des dates fausses.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
C'est la Sub MiseEnAffichageRupEtRéa de Module1 que je soupçonne fortement de créer des dates fausses. Mais je ne comprends pas trop pourquoi. De toute façon elle est imbitable pour moi. Mais ça vaudrait peut être le coup d'essayer d'éviter de les transférer via une représentation String. Donc Int(Cel.Offset(0, 8).Value) pour enlever les heures de la feuille ExtractionReappro au lieu de Format(Cel.Offset(0, 8).Value, "dd/mm/yyyy"). Attention ça peut plantera si c'est fait sans précaution aussi sur les quelques cellules de 'ExtractionReappro'!I3:I23 qui apparaissent vides mais ne le sont pas, vu qu'elles contiennent un texte formé d'une chaine de caractères vide.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Je dirais même plus CDbl(Int(Cel.Offset(0, 8).Value))
C'est bien là que se situe le bogue. Je croyais qu'on en était enfin débarrassé, je vois que ce n'est pas le cas.
Essayez ça dans un nouveau classeur :
VB:
Option Explicit

Sub Test()
With CreateObject("Scripting.Dictionary")
  .Add "A", "12/07/2017"
  .Add "B", "13/07/2017"
  .Add "C", CDbl(DateSerial(2017, 7, 12))
  ActiveSheet.[A1:A3].Value = WorksheetFunction.Transpose(.Keys)
  ActiveSheet.[B1:B3].NumberFormat = "general"
  ActiveSheet.[B1:B3].Value = WorksheetFunction.Transpose(.Items)
  ActiveSheet.[C1:C3].FormulaR1C1 = "=DAY(RC[-1])&""/""&MONTH(RC[-1])"
  MsgBox "Avant application d'un format date.", vbInformation, "Test"
  ActiveSheet.[B1:B3].NumberFormat = "m/d/yyyy"
  End With
End Sub
 

Dranreb

XLDnaute Barbatruc
Alors faites d'autres essais jusqu'à ce que ça marche. Mais ça vient de là c'est sûr.
mettez On Error Resume Next devant, puis derrière On Error GoTo 0
Je vous avais prévenu que ça pouvait planter si c'était aussi appliqué aux textes vides.
Avez vous essayé ma Sub Test de démo ?
 
Dernière édition:

Moreno076

XLDnaute Impliqué
Par contre je n'ai pas encore testé

Option Explicit

Sub Test()
With CreateObject("Scripting.Dictionary")
.Add "A", "12/07/2017"
.Add "B", "13/07/2017"
.Add "C", CDbl(DateSerial(2017, 7, 12))
ActiveSheet.[A1:A3].Value = WorksheetFunction.Transpose(.Keys)
ActiveSheet.[B1:B3].NumberFormat = "general"
ActiveSheet.[B1:B3].Value = WorksheetFunction.Transpose(.Items)
ActiveSheet.[C1:C3].FormulaR1C1 = "=DAY(RC[-1])&""/""&MONTH(RC[-1])"
MsgBox "Avant application d'un format date.", vbInformation, "Test"
ActiveSheet.[B1:B3].NumberFormat = "m/d/yyyy"
End With
End Sub

Ca sert à quoi exactement? en remplacement de la macro du bouton date? Merci
 

Dranreb

XLDnaute Barbatruc
Non c'est une démonstration que le texte "12/07/2017" est interprété de travers quand il est mis comme Item dans un Dictionary, puis que les Items sont vidés dans des cellules. Donc il faut absolument éviter d'y mettre des dates mises sous forme de textes par la fonction Format. Le plus sûr c'est d'y mettre des Double.
 

Dranreb

XLDnaute Barbatruc
Essayez en ajoutant cette fonction derrière la Sub MiseEnAffichageRupEtRéa :
VB:
Function DateDélicate(ByVal V)
Select Case VarType(V)
   Case vbString: If V = "" Then DateDélicate = Empty Else DateDélicate = V
   Case vbDate: DateDélicate = Int(CDbl(V))
   Case Else: DateDélicate = V: End Select
End Function
Et dans MiseEnAffichageRupEtRéa :
VB:
DateRup.Item(Cel.Text) = DateDélicate(Cel.Offset(0, 8).Value)
 

Discussions similaires

Réponses
5
Affichages
750

Statistiques des forums

Discussions
312 176
Messages
2 085 961
Membres
103 066
dernier inscrit
bobfils