Conversion de dates
J’importe des données d’un autre système informatique, et mes dates sont au format
20080701
(pour le01/07/2008
). Comment les convertir en dates Access ?
La fonction de conversion
Recopiez la fonction VBA ci-dessous dans un module standard de votre base de données.
1 2 3 4 5 6 7 8 9 10 11 12 |
Function TransformerEnDate(ByVal strDateDepart As String) As Date Dim strJour As String Dim strMois As String Dim strAnnee As String ' Extraire les 3 parties de la date strAnnee = Left(strDateDepart, 4) strMois = Mid(strDateDepart, 5, 2) strJour = Right(strDateDepart, 2) TransformerEnDate = DateSerial(strAnnee, strMois, strJour) End Function |
Utilliser la fonction
Dans une requête, vous utilisez la fonction dans un champ calculé, de la manière suivante :
1 |
Date Access: TransformerEnDate(Nz([Nom du champ Date de départ]; "20000101")) |
Comme la fonction attend une chaîne de caractères, il faut éviter de lui passer des dates vides (Null
). D’où l’appel préalable de la fonction Nz()
pour convertir un Null
éventuel en une date valide (telle qu’elle est attendue par la fonction VBA). Je pars du principe qu’en l’absence de valeur, la date par défaut sera 01/01/2000
. Vous pouvez aménager selon vos besoins !
En VBA, la fonction s’utilisera de cette manière :
1 2 3 4 5 6 |
Dim strDateDepart As String Dim dtDateFinale As Date strDateDepart = "20080701" dtDateFinale = TransformerEnDate(strDateDepart) Msgbox "Date après conversion : " & strDateFinale |
Salut,
j’ai essayé de reprendre cette fonction pour faciliter la saisie de la date dans une textbox où 25092014 represente la date 25/09/2014:
dans un formulaire ajouter deux textbox (txtDate et txtAutreTex)t pour tester la tabulation:
Option Compare Database
Option Explicit
Private Sub txtDate_Exit(Cancel As Integer)
If txtDate = vbNullString Then Exit Sub
If TransformerEnDate(txtDate) Then
txtDate = TransformerEnDate(txtDate)
Else
MsgBox « Non valid date »
SelectionTexte Me.txtDate
Cancel = True
End If
End Sub
et la fonction utile:
‘—————————————————————————————
‘ Module : basTransformerEnDate
‘ Author : Hervé Inisan modified by Focus3D
‘ Date : 06/10/2014
‘ Purpose : Convert string numbers to Date for easy user input
‘—————————————————————————————
Option Compare Database
Option Explicit
‘ —
‘ SELECTION DU CONTENU ENTIER D’UNE ZONE DE TEXTE
‘ —
‘
Sub SelectionTexte(txt As Access.TextBox)
txt.SelStart = 0
txt.SelLength = Len(txt.Text)
End Sub
‘ —
‘ Teste si année est bissextile
‘ —
‘
Public Function IsLeapYear(ByVal lngYear As Long) As Boolean
IsLeapYear = ((lngYear Mod 4 = 0) And (lngYear Mod 100 0)) _
Or (lngYear Mod 400 = 0)
End Function
‘ —
‘ Transforme 25092014 en 25/09/2014
‘ —
‘
Function TransformerEnDate(ByVal strDateDepart As String) As Date
Dim strJour As String
Dim strMois As String
Dim strAnnee As String
If Len(strDateDepart) 8 Then
Exit Function
End If
‘ Extraire les 3 parties de la date
strJour = Left(strDateDepart, 2)
strMois = Mid(strDateDepart, 3, 2)
strAnnee = Right(strDateDepart, 4)
Select Case strMois
Case « 01 », « 03 », « 05 », « 07 », « 08 », « 10 », « 12 »
If strJour > « 31 » Then
Exit Function
End If
Case « 04 », « 06 », « 09 », « 11 »
If strJour > « 30 » Then
Exit Function
End If
Case « 02 »
If strJour > « 29 » Then
Exit Function
Else
If (strJour = « 29 ») And (IsLeapYear(strAnnee) = False) Then
Exit Function
End If
End If
Case Else
Exit Function
End Select
TransformerEnDate = DateSerial(strAnnee, strMois, strJour)
End Function
Merci encore pour cette mine d’infos.
Merci pour le code. Par contre, je me dis qu’un masque de saisie sur le champ de table (ou la zone de texte) devrait faire l’affaire, y compris éviter la saisie des /.