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
 

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
 

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+
 

Pièces jointes

  • Extraire date(1).xlsm
    18.2 KB · Affichages: 10

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+
 

Pièces jointes

  • Extraire date(2).xlsm
    18 KB · Affichages: 4
Dernière édition:

Discussions similaires

Réponses
3
Affichages
517
Réponses
11
Affichages
1 K