Convertir des dates texte en format date rapidement en VBA [Résolu]

cyllou 8 Messages postés jeudi 26 février 2009Date d'inscription 14 décembre 2011 Dernière intervention - 26 févr. 2009 à 16:47 - Dernière réponse : Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention
- 26 févr. 2009 à 19:20
Bonjour,

Je cherche à convertir des dates en format texte (type 20090226 par ex) en dates 'lisibles" (ici 26 février 2009).

Mon problème est que le code que j'utilise est TRES lent , alors que je dois faire cette opération pour environ 500 données à chaque fois. 

Voilà ce que j'utilisais (je demandais à l'ulisateur de selectionner la plage de données à convertir avec une Application.inputbox): 

Sub essai()


Dim annee, mois, jour As String
Dim dates As Range
Dim la_date As Date
Dim i As Integer


On Error Resume Next


Set dates = Application.InputBox( _
prompt:="selectionnez la plage de dates à convertir", _
Title:="dates à transformer", _
Type:=8)


If Err > 0 Then Exit Sub 
On Error GoTo 0


Dim derniere As Integer
derniere = 7 + dates.Rows.Count

Application.ScreenUpdating = False
For i = 8 To derniere
annee = Mid(Cells(i, 5).Value, 1, 4)
mois = Mid(Cells(i, 5).Value, 5, 2)
jour = Mid(Cells(i, 5).Value, 7, 2)
la_date = CDate(jour & "/" & mois & "/" & annee)
Cells(i, 8) = la_date


Next


Application.ScreenUpdating = True
End Sub


Quelqu'un aurait il une idée ?






"L'homme de génie est celui qui m'en donne"
Afficher la suite 

Votre réponse

6 réponses

cyllou 8 Messages postés jeudi 26 février 2009Date d'inscription 14 décembre 2011 Dernière intervention - 26 févr. 2009 à 18:48
+3
Utile
Merci pour ta réponse, effectivement ta synthaxe fonctionne également (je l'ai juste légèrement modifiée pour que ça passe sur mes données du point de vue des indices que tu avais mis en particulier ta 1ère ligne: strDate = Mid(Cells(i, 5).Value, 1 , 8) )pour que VB se place sur le 1er chiffre et prenne les 8 caractères) et ça améliore la rapidité du code, malheureusement vrt pas assez .

Je viens de touver une solution qui fonctionne très bien en utilisant un enregistrement de macro. En voici le code, les dates sont calculées en 2s chrono (pour 500 données qd meme!):

Sub autre()
Dim annee, mois, jour As String
Dim dates As Range
Dim la_date As Date
Dim i As Integer



On Error Resume Next



Set dates = Application.InputBox( _
prompt:="selectionnez la plage de dates à convertir", _
Title:="dates à transformer", _
Type:=8)



If Err > 0 Then Exit Sub           
On Error GoTo 0



Dim derniere As Integer           
dates.Select



derniere = 7 + dates.Rows.Count     'total nbr de lignes



Dim objcell As Range
Set objcell = Range("H8 : H" & derniere & "")



Dim cell As Range



'objcell.Cells.FormulaR1C1 = "=DATE(LEFT(RC[-3],4),RIGHT(LEFT(RC[-3],6),2),RIGHT(RC[-3],2))"
objcell.FormulaR1C1 = _
        "=DATE(LEFT(RC[-3],4),RIGHT(LEFT(RC[-3],6),2),RIGHT(RC[-3],2))"

End Sub


Merci à tous pour le coup de main

"L'homme de génie est celui qui m'en donne"
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cyllou
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 26 févr. 2009 à 16:56
0
Utile
ne pas utiliser :
CDate(jour & "/" & mois & "/" & annee)

mais utiliser DateSerial
Commenter la réponse de Renfield
cyllou 8 Messages postés jeudi 26 février 2009Date d'inscription 14 décembre 2011 Dernière intervention - 26 févr. 2009 à 17:03
0
Utile
Merci pour la réponse. J'ai essayé mais le Dateserial n'est pas reconnu dans le code.

J'ai peut etre mal expliqué mon problème mais en fait mon code actuel FONCTIONNE mais est BCP trop lent. Je pense que ça vient du fait que VB vient lire 3 fois chaque cellule de la colonne selectionnée pour trouver 1 seule date (il vient chercher l'année, puis le mois, puis le jour à chaque fois). J'aimerai accélérer tout ça...

"L'homme de génie est celui qui m'en donne"
Commenter la réponse de cyllou
cs_Orohena 578 Messages postés vendredi 26 septembre 2008Date d'inscription 20 novembre 2010 Dernière intervention - 26 févr. 2009 à 18:23
0
Utile
Bonjour

Peux-tu essayer ce code ?

strDate = Mid(Cells(i, 5).Value, 4, 8)
Cells(i, 8).Value = cDate(Right(strDate, 2) & "/" & Mid(strDate, 5, 2) & "/" & Left(strDate, 4))

Amicalement
Commenter la réponse de cs_Orohena
cs_Orohena 578 Messages postés vendredi 26 septembre 2008Date d'inscription 20 novembre 2010 Dernière intervention - 26 févr. 2009 à 18:28
0
Utile
Non, c'est plutôt strDate = Left(Cells(i, 5).Value, 8)
Commenter la réponse de cs_Orohena
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 26 févr. 2009 à 19:20
0
Utile
pas reconnu...

étrange...

Function DateSerial(Year As Integer, Month As Integer, Day As Integer)
Membre de VBA.DateTime
Commenter la réponse de Renfield

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.