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
IMG_6894.jpeg
 

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 !👏👏👏
 

Statistiques des forums

Discussions
315 092
Messages
2 116 118
Membres
112 665
dernier inscrit
JPHD