extraire un bout de texte et transformer en date

6 réponses
Avatar
mireille
Bonjour à tous !

J'utilise Excel 2003 en anglais.

J'ai dans ma cellule les infos suivantes :

CONSEIL / BOARD
MERCREDI 4 FEVRIER 2009, 9h00 / WEDNESDAY 4 FEBRUARY 2009, 9:00 am

Je veux créer une macro qui m'extrait le texte entre le 2ème slash et la
deuxième virgule, i.e. la date en anglais.
Ensuite, je veux transformer le texte "WEDNESDAY 4 FEBRUARY 2009" en date
avec le format d-mmm.

J'ai écrit le code suivant, mais ça bugue (Run-time Error "13" Type Mismatch)
En fait, j'y connais rien à Excel. moi, c'est SAS ...

Sub RAG()

For i = 2 To 200
If (Left(Cells(i, 1), 7)) = "CONSEIL" Then Cells(i, 9) =
Left(StrReverse(Cells(i, 1)), InStr(StrReverse(Cells(i, 1)) - 1, "/"))
Next i

End Sub

Vraiment, mreci pour votre aide !

6 réponses

Avatar
MichDenis
Je te propose ceci : Une fonction personnalisée :

Tu copies cette fonction dans un module STANDARD de ton classeur
'----------------------------------------
Function Extraire_Date(D As Range)
If InStr(1, D, "Conseil", vbTextCompare) > 0 Then
Extraire_Date = Split(Split(D, "/")(2), ",")(0)
Else
Extraire_Date = ""
End If
End Function
'----------------------------------------

Et pour accéder à cette fonction dans ta feuille de calcul,
dans la cellule où tu veux obtenir le résultat, tu inscris :
=Extraire_Date(A1) En supposant que A1 est la cellule
qui contient ledit texte. Tu peux recopier la fonction sur
une colonne si besoin.





"mireille" a écrit dans le message de groupe de
discussion :
Bonjour à tous !

J'utilise Excel 2003 en anglais.

J'ai dans ma cellule les infos suivantes :

CONSEIL / BOARD
MERCREDI 4 FEVRIER 2009, 9h00 / WEDNESDAY 4 FEBRUARY 2009, 9:00 am

Je veux créer une macro qui m'extrait le texte entre le 2ème slash et la
deuxième virgule, i.e. la date en anglais.
Ensuite, je veux transformer le texte "WEDNESDAY 4 FEBRUARY 2009" en date
avec le format d-mmm.

J'ai écrit le code suivant, mais ça bugue (Run-time Error "13" Type Mismatch)
En fait, j'y connais rien à Excel. moi, c'est SAS ...

Sub RAG()

For i = 2 To 200
If (Left(Cells(i, 1), 7)) = "CONSEIL" Then Cells(i, 9) Left(StrReverse(Cells(i, 1)), InStr(StrReverse(Cells(i, 1)) - 1, "/"))
Next i

End Sub

Vraiment, mreci pour votre aide !
Avatar
MichDenis
J'oubliais, la fonction Split requiert excel 2000 ou plus récent.
Avatar
Daniel.C
Bonjour.
La macro suivante lit la cellule active et écrit le résultat en A1 :

Sub test()
Dim deb, heure, txt As String, Tabl, An
An = Array("january", "february", "march", "april", "may", _
"june", "july", "august", "september", _
"october", "november", "december")
deb = InStrRev(ActiveCell, ("/"))
heure = InStrRev(ActiveCell, (","))
txt = Mid(Selection, deb + 2, heure - deb - 2)
txt = Right(txt, Len(txt) - InStr(txt, " "))
Tabl = Split(txt, " ")
mois = Application.Match(LCase(Tabl(1)), An, 0)
[A1] = DateSerial(Tabl(2), mois, Tabl(0))
[A1].NumberFormat = "d-mmm"
End Sub

Daniel

Bonjour à tous !

J'utilise Excel 2003 en anglais.

J'ai dans ma cellule les infos suivantes :

CONSEIL / BOARD
MERCREDI 4 FEVRIER 2009, 9h00 / WEDNESDAY 4 FEBRUARY 2009, 9:00 am

Je veux créer une macro qui m'extrait le texte entre le 2ème slash et la
deuxième virgule, i.e. la date en anglais.
Ensuite, je veux transformer le texte "WEDNESDAY 4 FEBRUARY 2009" en date
avec le format d-mmm.

J'ai écrit le code suivant, mais ça bugue (Run-time Error "13" Type Mismatch)
En fait, j'y connais rien à Excel. moi, c'est SAS ...

Sub RAG()

For i = 2 To 200
If (Left(Cells(i, 1), 7)) = "CONSEIL" Then Cells(i, 9) =
Left(StrReverse(Cells(i, 1)), InStr(StrReverse(Cells(i, 1)) - 1, "/"))
Next i

End Sub

Vraiment, mreci pour votre aide !


Avatar
MichDenis
Pour répondre à ta demande, il en manquait un bout dans la fonction proposée...;-))
'---------------------------------------
Function LaDate(D As Range)
Dim J As Integer, Mois As String
Dim Arr(), M As Integer
Arr = Array("January", "February", "Mars", "April", "Mai", "June" _
, "July", "August", "September", "October", "November", "December")

If InStr(1, D, "Conseil", vbTextCompare) > 0 Then
J = Split(Trim(Split(Split(D, "/")(2), ",")(0)), " ")(1)
Mois = Split(Trim(Split(Split(D, "/")(2), ",")(0)), " ")(2)
M = Application.Match(Mois, Arr, 0)
LaDate = Format(DateSerial(2009, M, J), "d-mmm")
Else
LaDate = ""
End If
End Function
'---------------------------------------



"MichDenis" a écrit dans le message de groupe de discussion :

J'oubliais, la fonction Split requiert excel 2000 ou plus récent.
Avatar
mireille
Merci beaucoup !
J'ai utilisé votre macro. Et j'ai même réussi à la modifier pour lire toutes
les cellules de la colonne A et écrire le résultat dans une autre colonne !

Je n'ai pas utilisé la solution de MichDenis parce que je ne sais pas
appeler une fonction dans une procédure ...

Merci encore à vous deux.

"Daniel.C" a écrit :

Bonjour.
La macro suivante lit la cellule active et écrit le résultat en A1 :

Sub test()
Dim deb, heure, txt As String, Tabl, An
An = Array("january", "february", "march", "april", "may", _
"june", "july", "august", "september", _
"october", "november", "december")
deb = InStrRev(ActiveCell, ("/"))
heure = InStrRev(ActiveCell, (","))
txt = Mid(Selection, deb + 2, heure - deb - 2)
txt = Right(txt, Len(txt) - InStr(txt, " "))
Tabl = Split(txt, " ")
mois = Application.Match(LCase(Tabl(1)), An, 0)
[A1] = DateSerial(Tabl(2), mois, Tabl(0))
[A1].NumberFormat = "d-mmm"
End Sub

Daniel

> Bonjour à tous !
>
> J'utilise Excel 2003 en anglais.
>
> J'ai dans ma cellule les infos suivantes :
>
> CONSEIL / BOARD
> MERCREDI 4 FEVRIER 2009, 9h00 / WEDNESDAY 4 FEBRUARY 2009, 9:00 am
>
> Je veux créer une macro qui m'extrait le texte entre le 2ème slash et la
> deuxième virgule, i.e. la date en anglais.
> Ensuite, je veux transformer le texte "WEDNESDAY 4 FEBRUARY 2009" en date
> avec le format d-mmm.
>
> J'ai écrit le code suivant, mais ça bugue (Run-time Error "13" Type Mismatch)
> En fait, j'y connais rien à Excel. moi, c'est SAS ...
>
> Sub RAG()
>
> For i = 2 To 200
> If (Left(Cells(i, 1), 7)) = "CONSEIL" Then Cells(i, 9) =
> Left(StrReverse(Cells(i, 1)), InStr(StrReverse(Cells(i, 1)) - 1, "/"))
> Next i
>
> End Sub
>
> Vraiment, mreci pour votre aide !





Avatar
MichDenis
Pour appeler ma fonction dans une procédure
A ) Place la fonction dans un module standard

B ) Un petit exemple :
'--------------------------
Dim C As range
For each C in Range("A1:A10")
C.value = LaDate(c)
Next
'--------------------------

C ) Mais tu peux utiliser la fonction directement dans une cellule
tu n'as qu'à écrire : = LaDate("A1") si A1 contient la chaîne de caractère
et tu peux recopier la formule sur l'étendue de la colonne si besoin. Tu
n'a pas besoin de macro.


'---------------------------------
Function LaDate(D As Range)
Dim J As Integer, Mois As String
Dim Arr(), M As Integer
Arr = Array("January", "February", "Mars", "April", "Mai", "June" _
, "July", "August", "September", "October", "November", "December")

If InStr(1, D, "Conseil", vbTextCompare) > 0 Then
J = Split(Trim(Split(Split(D, "/")(2), ",")(0)), " ")(1)
Mois = Split(Trim(Split(Split(D, "/")(2), ",")(0)), " ")(2)
M = Application.Match(Mois, Arr, 0)
LaDate = Format(DateSerial(2009, M, J), "d-mmm")
Else
LaDate = ""
End If
End Function
'---------------------