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