Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Tri date impossible

moanin

XLDnaute Accro
Bonjour à tous



Dans une colonne j’ai des dates sous la forme :

03.04.1998

J’aimerais faire un tri par année.

Je n’arrive pas à les trier et dans "format" / date je n’ai pas l’équivalent.

Comment puis-je faire ?

Merci
 

njhub

XLDnaute Occasionnel
Bonjour moanin,

dans une colonne à part, recréez vos date à partir de la formule suivante :
Code:
=DATE(DROITE(A2;4);DROITE(GAUCHE(A2;5);2);GAUCHE(A2;2))

puis retranscrivez les résultats obtenus en colonne A

 

ThierryP

XLDnaute Occasionnel
Bonjour moanin, bonjour le forum !

J'arrive un peu après la bataille ......

J'ai exactement la même problème avec des exports de données d'un ERP dans Excel. Du coup, je me suis fait une petite macro qui met au bon format des dates du style 29.01.2023 :
VB:
Sub Format_Dates()
Dim Ligne As Long
Dim Rep As String
Dim Colonne As Variant
Dim A, B, T

Colonne = ActiveCell.Column
Colonne = Split(Columns(Colonne).Address(ColumnAbsolute:=False), ":")(1)
Ligne = ActiveCell.Row
Application.ScreenUpdating = False
With ActiveSheet 'Mise au format des dates d'échéance
    With .Range(Colonne & Ligne & ":" & Colonne & Range(Colonne & Rows.Count).End(xlUp).Row)
        T = .Value
        For A = 1 To UBound(T, 1)
            For B = 1 To UBound(T, 2)
                T(A, B) = Replace(T(A, B), ".", "/")
                .Item(A) = CDate(T(A, B))
            Next
        Next
    End With
End With
End Sub

Il suffit de se placer sur la première ligne de la colonne à modifier et de lancer cette macro.
 

Dranreb

XLDnaute Barbatruc
Bonjour @ThierryP
Mieux optimisée ainsi :
VB:
Sub FormatDates()
   Dim RngCol As Range, T(), L As Long
   Set RngCol = ActiveCell
   Set RngCol = RngCol.Resize(RngCol(1000000, 1).End(xlUp).Row - RngCol.Row + 1)
   T = RngCol.Value
   For L = 1 To UBound(T, 1)
      T(L, 1) = CDate(Replace(T(L, 1), ".", "/"))
      Next L
   RngCol.Value = T
   End Sub
 

ThierryP

XLDnaute Occasionnel
Bonjour Dranreb,

Effectivement, beaucoup mois de lignes ..... mais j'ai une erreur "Incompatibilité de type" sur la ligne
VB:
 T = RngCol.Value
du coup, ça marche beaucoup moins bien
Les valeurs dans les cellules sont des dates au format : 01.01.2023
 

Dranreb

XLDnaute Barbatruc
Corrigez comme suit :
VB:
Sub FormatDates()
   Dim RngCol As Range, T(), L As Long
   Set RngCol = ActiveCell
   Set RngCol = RngCol.Resize(RngCol(1000000, 1).End(xlUp).Row - RngCol.Row + 1)
   If RngCol.Rows.Count = 1 Then
      ReDim T(1 To 1, 1 To 1): T(1, 1) = RngCol.Value
   Else: T = RngCol.Value: End If
   For L = 1 To UBound(T, 1)
      T(L, 1) = CDate(Replace(T(L, 1), ".", "/"))
      Next L
   RngCol.Value = T
   End Sub
 

ThierryP

XLDnaute Occasionnel
Merci pour le retour !
J'ai dû changer cette ligne
VB:
Set RngCol = RngCol.Resize(RngCol(1000000, 1).End(xlUp).Row - RngCol.Row + 1)
qui ne renvoie que la première cellule, par :
Code:
Set RngCol = RngCol.Resize(Range("A" & Cells.Rows.Count).End(xlUp).Row - RngCol.Row + 1)
pour prendre en compte toute la plage.

Ta solution est effectivement bien plus efficace, le temps de traitement de 1 million de lignes passe de 38 secondes avec ma solution à 6 secondes !
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…