Publicité
Tatiak
10 juillet 2021

Le format Date dans Excel à l'international.

En fonction de la configuration de langue de Windows et d'Office, Excel propose divers formats de date en fonction des habitudes du pays d'utilisation.
Ce qui peux poser problème dans vos développements pour l'affichage de date ou le calcul de durées par exemple. En effet si la date s'affiche à l'américaine "mm-dd-yyyy" et que votre code attend une date au format Fr "jj/mm/aaaa", c'est le bug assuré.
Pour se prémunir de cet effet, 2 détails sont à considérer :
1/ le séparateur : slash ou tiret (/ ou -)
2/ L'ordre jour, mois, année

Pour le séparateur, c'est simple il est repéré par l'instruction : Application.International(xlDateSeparator)
L'ordre est indiqué par : Application.International(xlDateOrder)

Avec ces 2 instructions on peut donc afficher une date dans un format toujours adapté au pays avec la fonction suivante :

Function DtFrmt() As String
Dim Sp As String

    Sp = Application.International(xlDateSeparator)
    Select Case Application.International(xlDateOrder)
        Case 0: DtFrmt = "mm" & Sp & "dd" & Sp & "yyyy" ' 0 = month-day-year
        Case 1: DtFrmt = "dd" & Sp & "mm" & Sp & "yyyy" ' 1 = day-month-year
        Case 2: DtFrmt = "yyyy" & Sp & "mm" & Sp & "dd" ' 2 = year-month-day
    End Select
End Function
L'appel est simple, par exemple pour la date du jour : Me.Textbox1.Value = Format(Date, DtFrmt)

Ensuite pour un traitement quelconque sur des dates (un calcul de durée par exemple) il est simple de faire l'opération inverse quelque soit son format en repérant le séparateur et l'ordre de la même façon. Voici ma version d'une fonction de décodage :

Function ttk_Date(Sdt As Variant) As Double
Dim T As Variant

    If Sdt = "" Then
        ttk_Date = CDbl(Date)
    Else
        If IsNumeric(Sdt) Then
            ttk_Date = CDbl(Sdt)
        Else
            T = Split(Sdt, Application.International(xlDateSeparator))
            Select Case Application.International(xlDateOrder)
                Case 0: ttk_Date = DateSerial(CInt(T(2)), CInt(T(0)), CInt(T(1))) ' 0 = month-day-year
                Case 1: ttk_Date = DateSerial(CInt(T(2)), CInt(T(1)), CInt(T(0))) ' 1 = day-month-year
                Case 2: ttk_Date = DateSerial(CInt(T(0)), CInt(T(1)), CInt(T(2))) ' 2 = year-month-day
            End Select
        End If
    End If
End Function
L'appel étant du genre : Debut = ttk_Date(Me.TextBox1.value)
Le retour étant un entier double, il est facile de faire le calcul dont vous avez besoin par la suite.

Ainsi plus besoin de multiplier les versions de vos appli FR/US/Quebec/... , les dates seront toujours dans le bon format avec des calculs justes, et vous pourrez partager vos appli à l'international!

Pierre

Pour aller plus loin : https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.international


Publicité
Commentaires
Publicité