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

Messages postés
8
Date d'inscription
jeudi 26 février 2009
Dernière intervention
14 décembre 2011
- 26 févr. 2009 à 16:47 - Dernière réponse :
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 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

Meilleure réponse
Messages postés
8
Date d'inscription
jeudi 26 février 2009
Dernière intervention
14 décembre 2011
- 26 févr. 2009 à 18:48
3
Merci
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"

Merci cyllou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de cyllou
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 26 févr. 2009 à 16:56
0
Merci
ne pas utiliser :
CDate(jour & "/" & mois & "/" & annee)

mais utiliser DateSerial
Commenter la réponse de Renfield
Messages postés
8
Date d'inscription
jeudi 26 février 2009
Dernière intervention
14 décembre 2011
- 26 févr. 2009 à 17:03
0
Merci
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
Messages postés
578
Date d'inscription
vendredi 26 septembre 2008
Dernière intervention
20 novembre 2010
- 26 févr. 2009 à 18:23
0
Merci
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
Messages postés
578
Date d'inscription
vendredi 26 septembre 2008
Dernière intervention
20 novembre 2010
- 26 févr. 2009 à 18:28
0
Merci
Non, c'est plutôt strDate = Left(Cells(i, 5).Value, 8)
Commenter la réponse de cs_Orohena
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 26 févr. 2009 à 19:20
0
Merci
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.