XL 2013 Extrait d'une date dans une autre cellule au format JJ/MM/AA

mapapiotmi

XLDnaute Nouveau
Bonjour,

Je m'arrache les cheveux pour trouver une formule pour extraire une date à l'intérieur d'un texte

Exemple du texte : la date est entre parenthèse sur la 2ème ligne du texte

1590239393356.png

Merci à vous pour vos merveilleuses propositions

Prenez soin de vous

Marine
 

jmfmarques

XLDnaute Accro
Bonjour
efforçons-nous si tu veux bien d'être d'emblée beaucoup plus précis et exhaustif et d'éviter ainsi de multiplier le nombre de messages de cette discussion.
Questions (entre autres) que ton exposé, tel qu'il est, conduit à se poser :
- la chaîne contenant cette date ne contient-elle qu'une date ou peut-elle en contenir d'autres ?
- la sous-chaîne date :
---- revêt-elle toujours la même forme (dd mmm. yyyy) en français et toujours en minuscules ? et si non : quelles autres formes possibles ?
---- apparaît-elle toujours en même position (N° de ligne)
---- mérite-t-elle de faire l'objet d'autres exemples (et lesquels) ?
 

mapapiotmi

XLDnaute Nouveau
Bonjour,

La date est toujours au même endroit (ligne 2 et entre parenthèse)
Les mois sont notés Janv. Fév. mars avr. mai juin juill. août, sept. oct. nov. déc. (je pourrai modifier la formule si nécessaire mais les mois n'ont pas le même nombre de caractère et ne sont pas toujours suivis par un point mais par un espace)
Toujours en français et en minuscule pour ce que j'ai vu. Ce sont des extraits d'avis Facebook et je n'ai pas de recul sur tous les mois car la campagne ne fait que commencer.

J'ai essayé la formule si.multiple pour les noms des mois
Merci à vous
Martine
 

Dranreb

XLDnaute Barbatruc
Bonjour.
En A1 :
Code:
(Témoignage du 2 avr. 2020)
En A2 :
Code:
=DATEVAL(SUBSTITUE(SUBSTITUE(STXT(A1;CHERCHE(" du ";A1)+4;20);".";"");")";""))
Format de Date.
 

mapapiotmi

XLDnaute Nouveau
Bonjour,

Merci à vous
Cela marche si il n'y a que ce texte dans la cellule mais avec le texte complet le résultat de la formule est #valeur!.
La cellule ne contient pas que (expérience du ….) mais tout le texte sur plusieurs lignes
Faut-il passer par une étape intermédiaire pour extraire cette ligne de tout le texte

Merci encore de prendre du temps pour moi mais je n'aurais jamais penser à cette formulation

Prenez soin de vous
Marine
 

Dranreb

XLDnaute Barbatruc
Pour ne pas écrire deux fois dans la formule corrigée l'extraction de la partie à gauche de la ")", oui, il faudrait le faire à part ou sinon écrire une fonction personnalisée en VBA.
 

jmfmarques

XLDnaute Accro
Compte tenu de toutes les "formes" que l'on peut envisager, ce que conforte en outre :
Ce sont des extraits d'avis Facebook et je n'ai pas de recul sur tous les mois car la campagne ne fait que commencer.
je ne vois personnellement pas d'autre solution que l'utilisation de VBA (que ce soit directement ou via une formule personnalisée)
Je veux bien m'y mettre (ce sera "tiré par les cheveux") mais n'en ferai rien tant que n'auront pas été exposées ou corrigées les anomalies dénoncées en mon message #5 (différences entre les tenants exposés et ce qui est donné en exemple).
-
 

job75

XLDnaute Barbatruc
Bonjour mapapiotmi, jmfmarques, Bernard,

Voyez le fichier joint et cette fonction VBA :
VB:
Function ExtractDate(txt$)
'La date est toujours dans un texte entre parenthèses
Dim a, i%, x$, flag As Boolean, t$, j%
a = Array("janv", "fév", "mars", "avr", "mai", "juin", "juil", "août", "sept", "oct", "nov", "déc")
ExtractDate = ""
For i = 1 To Len(txt)
    x = Mid(txt, i, 1)
    If x = "(" Then flag = True: i = i + 1
    If x = ")" Then
        For j = 0 To UBound(a)
            If InStr(LCase(t), a(j)) Then t = Replace(t, a(j), "/" & Format(j + 1, "00") & "/"): Exit For
        Next j
        For j = Len(t) To 1 Step -1
            x = Mid(t, j, 1)
            If Not IsNumeric(x) And x <> "/" Then t = Left(t, j - 1) & Mid(t, j + 1)
        Next j
        If IsDate(t) Then ExtractDate = CDate(t)
        Exit For
    End If
    If flag Then t = t & x
Next i
End Function
La casse n'a pas d'importance.

A+
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
VB:
Function DateParthDu(ByVal Txt As String) As Date
   Txt = Split(Split(Split(Txt, "(")(1), " du ")(1), ")")(0)
   DateParthDu = DateValue(Txt)
   End Function
En A1 :
Code:
toto titi (Broutille du 2 avr. 2020) tata
En A2 :
Code:
=DateParthDu(A1)
Toujours avec format Date.
 

Dranreb

XLDnaute Barbatruc
Si ça peut être plus tordu :
VB:
Function DateParth(ByVal Txt As String) As Date
   Dim TsE() As String, TsS(0 To 3) As String, LE&, UE&, P&
   TsE = Split(Split(Split(Replace(Txt, "'", " "), "(")(1), ")")(0), " ")
   LE = LBound(TsE): UE = UBound(TsE): If UE - LE > 2 Then LE = UE - 2
   For P = UE To LE Step -1: TsS(P - UE + 2) = TsE(P): Next P
   If Not IsNumeric(TsE(0)) Then TsS(0) = "1"
   DateParth = DateValue(Join(TsS, IIf(IsNumeric(TsS(1)), "/", " ")))
   End Function
En A1 :
Code:
(Quiproquo d'octob. 20) c'est pas rien
En A2 :
Code:
=DateParth(A1)
Trouve 01/10/2020 avec format Date.
 

jmfmarques

XLDnaute Accro
Bonjour à tous
J'aime beaucoup la frugalité du code montré par Dranreb en son message #11
Le code en question part du principe d'une date, précédée d'un "du", au sein d'une chaîne encadrée de parenthèses (ce qui correspond aux tenants exposés, tels qu'exposés jusqu'à présent.
J'attends toutefois les réactions de mapapiotmi, dont je ne serais malheureusement pas surpris qu'il nous annonce que finalement rien ne permet d'affirmer avec certitude ni la présence entre parenthèses, ni l'existence d'un "du" avant la date, puisque, rappelons-le :
Ce sont des extraits d'avis Facebook et je n'ai pas de recul sur tous les mois car la campagne ne fait que commencer.
Il suffirait par exemple (et entre autres) que Facebook décide un jour de modifier la présentation de ses "avis", pour que tout soit compromis.
Il en va de même en ce qui concerne le rang (N° de ligne) contenant l'expression de la date à extraire. Que Facebook change sa "présentation" et tout est compromis.

Il est possible de s'affranchir de telles "dépendances". Je l'ai fait, mais souhaite vraiment, avant d'en montrer le code, que @mapapiotmi nous confirme de manière indubitable que :
- la chaîne dont une date est à extraire ne contient qu'une seule expression de date
 

job75

XLDnaute Barbatruc
Bonjour le fil, le forum,

Fichier (2) avec une fonction un peu plus simple :
VB:
Function ExtractDate(t$)
'La date est toujours dans un texte entre parenthèses
Dim a, i%, j%, x$, y$
a = Array("janv", "fév", "mars", "avr", "mai", "juin", "juil", "août", "sept", "oct", "nov", "déc")
ExtractDate = ""
i = InStr(t, "("): j = InStr(t, ")"): If i >= j Then Exit Function
t = LCase(Mid(t, i + 1, j - i - 1))
For i = 0 To UBound(a)
    If InStr(t, a(i)) Then t = Replace(t, a(i), Format(i + 1, "\/00\/")): Exit For
Next
For i = 1 To Len(t)
    x = Mid(t, i, 1)
    If IsNumeric(x) Or x = "/" Then y = y & x
Next
If IsDate(y) Then ExtractDate = CDate(y)
End Function
A+
 

Fichiers joints

Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
@job75, dans ta version d'Excel, ne sont-ils pas reconnus, les mois en lettres français, dans les String soumis aux fonctions CDate et DateValue ?
 

job75

XLDnaute Barbatruc
@Bernard dans toutes les versions les dates sont reconnues en VBA dans la langue de l'ordi.

Si je transforme "avr" en "/04/" c'est pour pouvoir supprimer facilement les autres caractères.
 

Dranreb

XLDnaute Barbatruc
Ben parce que tu t'obstine à chercher la présence de mois en lettres français dans le texte au lieu de laisser faire la fonction CDate
 

jmfmarques

XLDnaute Accro
Salut Job75
Voilà qui illustre ce sur quoi Dranreb appelle ton attention :
VB:
MsgBox CDate("1 avri. 2020")
MsgBox CDate("21 avr 2020")
MsgBox CDate("12 septem. 2020")
et si, par ailleurs, CDate est en erreur, la cellule le sera également.
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas