Convertir date au format texte us en numérique [Résolu/Fermé]

Signaler
-
 TonyLucky -
Bonjour à tous,

Je récupère des dates au format texte us (ex : May 19th 2015) et je voudrais les convertir en format date numérique.
Les fonctions Cdate et DateValue me retourne une erreur "incompatibilité de type". J'ai supprimé le "th" avec replace, mais cela ne change rien. Je suppose que cette erreur vient du fait que le mois est écrit en anglais. J'ai pensé faire une conversion des mois anglais en français, mais cela ne me semble pas très élégant.
Si quelqu'un a une idée, je suis preneur.

D'avance, merci
Tony


8 réponses

Messages postés
14655
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 février 2020
206
Quelle version de VB ?

Je pense qu'il faut que tu décompose manuellement la date et que tu la recréée.
Merci d'avoir regardé ma question.
Je travaille sous Excel XP & VBA.
Décomposer la date ne résout pas le problème du mois écrit en anglais.
Est-ce que je pourrais faire un tablo des mois en anglais, avec un autre tablo de concordance des mois en français ? et je vais chercher l'équivalence. Mais je ne sais pas comment faire. Pour l'instant, ma solution consiste à faire avec des if like "may" then replace "mai". Mais c'est lourd et bricolé. Je suis sûr qu'on peut trouver mieux.
NHenry
Messages postés
14655
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 février 2020
206
Non, plus simple, un tableau listant les noms anglais, l'index du texte correspondant te donnant le numéro du mois.
Messages postés
6578
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
26 février 2020
455
Bonjour,

voici un petite exercice de manipulation de caractères:

Option Explicit
Dim valeur As String
Dim jour As String
Dim mois As String
Dim annee As String
Private Sub CommandButton1_Click()
valeur = "May 19th 2015"
extractionMots
End Sub
'Extraire les données séparées par un espace dans une chaine de caractères
Sub extractionMots()
    Dim Tableau() As String
    Dim i As Integer
    
    'découpe la chaine en fonction des espaces " "
    'le résultat de la fonction Split est stocké dans un tableau
    Tableau = Split(valeur, " ")
    
    'boucle sur le tableau pour visualiser le résultat
    For i = 0 To UBound(Tableau)
        'Le résultat s'affiche dans la fenêtre d'execution de l'éditeur de macros
        Debug.Print Tableau(i)
    Next i
    mois = Tableau(0)
    convertir
    jour = Tableau(1)
    annee = Tableau(2)
    extraireValeursNumeriques_DansChaine
    valeur = jour & "/" & mois & "/" & annee
    MsgBox valeur
End Sub
Sub extraireValeursNumeriques_DansChaine()
    Dim i As Byte, Nb As Byte
    Dim Cible As String, Resultat As String
    Dim Nombre As Double
    
    Cible = jour
    'Pour que fonction Val puisse reconnaitre les décimales: Remplacement des
    'virgules par des points
    Cible = Replace(Cible, ",", ".")
    'Pour gérer deux nombres qui se suivent: remplacement des espaces
    'par un caractère Alpha
    Cible = Replace(Cible, " ", "x")
    
    For i = 1 To Len(Cible)
        If IsNumeric(Mid(Cible, i, 1)) Then
        Nombre = val(Mid(Cible, i, Len(Cible) - i + 1))
        Nb = Nb + 1
        Resultat = Resultat & Nombre & vbLf
        i = i + Len(Str(Nombre)) - 1
        End If
    Next
    jour = Nombre
    ' MsgBox "Il y a " & Nb & " valeurs numériques dans la cellule " & vbLf & Resultat
End Sub
Sub convertir()
mois = Left(mois, 3)
    Select Case mois
    Case Is = "Jan"
      mois = "01"
    Case Is = "Feb"
       mois = "02"
    Case Is = "Mar"
        mois = "03"
    Case Is = "Apr"
       mois = "04"
    Case Is = "May"
       mois = "05"
    Case Is = "Jun"
       mois = "06"
    Case Is = "Jul"
       mois = "07"
    Case Is = "Aug"
      mois = "08"
    Case Is = "Sep"
       mois = "09"
    Case Is = "Oct"
       mois = "10"
    Case Is = "Nov"
       mois = "11"
    Case Is = "Dec"
       mois = "12"
    End Select
End Sub


je reconnais que c'est un peu lourd, on peut peut-être raccourcir!

Merci à tous les deux pour vos suggestions.
A partir de la remarque de NHenry, voici le code que j'ai testé et qui fonctionne :

Option Explicit

Dim tablo1
Dim i As Byte
Dim mydate As String

Sub testdate()

tablo1 = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")

mydate = ActiveCell.Offset(-1, 0) 'sélectionne la date à convertir
mydate = Replace(mydate, "th", "")

For i = 0 To 11
If mydate Like "*" & tablo1(i) & "*" Then
mydate = Replace(mydate, tablo1(i), i + 1)
Exit For
End If

Next i

ActiveCell.Value = DateValue(mydate)

End Sub


Je vais pouvoir l'adapter à mon besoin.
Encore merci, et bonne fin d'après-midi.
Tony
cs_Le Pivert
Messages postés
6578
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
26 février 2020
455
là tu n'as fait que les chiffres se terminant par th, comment fais-tu quand les chiffres se terminent par st, nd et rd?

a revoir!

http://www.123anglais.fr/date-cours-anglais

@+
Bonjour,

Dans la même logique que qui a été fait par cs_LePivert, mais avec une fonction.

Function DateFR(s As String) As Date
Dim t() As String, jour As Integer, mois As Integer, an As Integer, i As Integer
Dim MoisUS() As Variant

MoisUS() = Array("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DIC")

t() = Split(s)

jour = Val(t(1)) ' jour

For i = 0 To 11
If UCase(Left(t(0), 3)) = MoisUS(i) Then Exit For
Next
mois = i + 1 ' mois

an = Val(t(2)) 'an

DateFR = CDate(jour & "/" & mois & "/" & an)

End Function


et l'appel à la fonction
Sub test()

Dim Madate As Date, DateUS As String

DateUS = "May 19th 2015"
Madate = DateFR(DateUS)
MsgBox DateUS & vbCrLf & Format(Madate, "D MMMM YYYY")

DateUS = "August 1st 2015"
Madate = DateFR(DateUS)
MsgBox DateUS & vbCrLf & Format(Madate, "D MMMM YYYY")


DateUS = "Dicember 2nd 2015"
Madate = DateFR(DateUS)
MsgBox DateUS & vbCrLf & Format(Madate, "D MMMM YYYY")


End Sub


Bonne soirée
Edit:

MoisUS() = Array("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC")

Avec mes excuses.
cs_Le Pivert
Messages postés
6578
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
26 février 2020
455 > Mosca
La demande:

je voudrais les convertir en format date numérique.

dans ton exemple, les mois sont en lettre!

@+ bonne journée
> cs_Le Pivert
Messages postés
6578
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
26 février 2020

Format(Madate, "D MMMM YYYY")
ce format est en lettres

Format(Madate, "dd/mm/yyyy")
cet autre format est en chiffres

ce qui compte c'est le type Date, après on l’écrit comme veut.
Ce que je voulais montrer, c'est que l'utilisation d'une fonction était plus judicieuse.
cs_Le Pivert
Messages postés
6578
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
26 février 2020
455 > Mosca
Impeccable!!!!

Merci
Bonjour à tous,

Eh bien ! Je ne pensais pas que ma petite question susciterait autant d'intérêt !

En réponse à chacune de vos remarques
Henry : bien vu, la question des th, st,... Je m'en suis aperçu en faisant mes tests. J'ai résolu la question avec un tableau et une boucle (voir mon code plus bas).
LePivert : merci pour votre proposition, mais je trouvais votre solution un peu lourde. Dans la mesure du possible, je préfère toujours une solution la plus simple possible (cf. mon code pour reformater une date du style 13.12.2015 par exemple)
Mosca : l'idée d'une formule était une bonne idée, que j'utilise régulièrement, mais dans ce cas-là, elle n'était pas adaptée à mon besoin.

====
déclaration des valeurs
Dim madate As String: Dim tablo1: Dim tablo2: Dim ii As Byte

valeurs des tableaux dans activation du UF
tablo1 = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
tablo2 = Array("th", "nd", "rd", "st")

routine intégrée dans ma procédure
madate = ActiveCell.Offset(9, 8)
For ii = 0 To 3 'remplace les th,st,...
If madate Like "*" & tablo2(ii) & "*" Then madate = Replace(madate, tablo2(ii), ""): Exit For
Next ii

For i = 0 To 11 'attribue une valeur numérique au mois
If madate Like "*" & tablo1(i) & "*" Then madate = Replace(madate, tablo1(i), i + 1): Exit For
Next i

ActiveCell.Offset(3, 8) = Format(madate, "dd/mm/yyyy")


====
exemple de reformatage d'une date du style : 13.12.2015

ActiveCell.Offset(3, 8) = Mid(ActiveCell.Offset(6, 8), 4, 2) & "/" & Left(ActiveCell.Offset(6, 8), 2) & "/" & Right(ActiveCell.Offset(6, 8), 4)
====

Encore merci, et bonne semaine à tous
Tony
Messages postés
6578
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
26 février 2020
455
C'est encore moi, navré de te décevoir, mais cela ne va pas du tout.
Essaie cela et tu verras le resultat:

'déclaration des valeurs
Dim madate As String: Dim tablo1: Dim tablo2: Dim ii As Byte
Dim i As Byte
'valeurs des tableaux dans activation du UF
tablo1 = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
tablo2 = Array("th", "nd", "rd", "st")

'routine intégrée dans ma procédure
madate = "December 3rd 2015"
For ii = 0 To 3 'remplace les th,st,...
If madate Like "*" & tablo2(ii) & "*" Then madate = Replace(madate, tablo2(ii), ""): Exit For
Next ii

For i = 0 To 11 'attribue une valeur numérique au mois
If madate Like "*" & tablo1(i) & "*" Then madate = Replace(madate, tablo1(i), i + 1): Exit For
Next i

MsgBox Format(madate, "dd/mm/yyyy")


12/03/2015 au lieu 03/12/2015

a revoir donc!


Bien tenté, mais non !
madate étant au format US, VBA la restitue au format us dans le msgbox. C'est donc normal.
Par contre, si vous copiez madate dans une cellule excel, excel, version française, vous restituera bien 03/12/15.