Autres (RESOLU)Extraire une année composée de quatre chiffres ("aaaa")

chaelie2015

XLDnaute Accro
Bonsoir Forum
J'ai un texte alphanumérique de longueur variable dans la cellule B5. Mon objectif est d'extraire une année composée de quatre chiffres ("aaaa") à partir de cette chaîne et de l'afficher dans la cellule C5.
Exemple : Dans B5=49/2021 KDLP/04 donc j'aurai Dans C5= 2021
Merci
 
Solution
Bonsoir,

je suppose que l'année peut être située n'importe où dans le texte alors je te propose cette fonction personnalisée à copier dans un module standard.
VB:
Public Function rec_an(txt) ' recherche année dans texte
Dim idx As Integer
Dim ann As String
    For idx = 1 To Len(txt) - 3
        ann = Mid(txt, idx, 4)
        If IsNumeric(ann) Then
            If ann < 2099 And ann > 1899 Then ' à adapter
                If IsDate(DateValue("1/1/" & ann)) Then rec_an = ann: Exit Function
            End If
        End If
    Next idx
    rec_an = "absent"
End Function

Staple1600

XLDnaute Barbatruc
Bonjour le

Histoire de tâter du pattern
Code:
Function YearInMyString(s As String) As String
Dim M As Variant
 With CreateObject("VBSCript.RegExp")
    .Global = True
    .Pattern = "(^|\D)(\d{4})(?=\D|$)"
    For Each M In .Execute(s)
      YearInMyString = YearInMyString & ", " & M.Submatches(1)
    Next M
  End With
YearInMyString = Mid(YearInMyString, 3)
End Function
REM: Code glané sur le net, au chaud dans mes archives depuis

NB: Je décline toute responsabilité si le string contient des nombres de 4 chiffres qui ne sont pas des ans. ;)

Testé avec ce string (en A1)
abcd EP RIP 16/08/1977 PF Atom... 02/10/1970 H2G2 2005/04/08

la formule en B1 =YearInMyString(A1) renvoie, 1977, 1970, 2005

PS:
je vous laisse trouver à quels événements correspondent ces dates.
Les gagnants se seront pas tirés au sort car je n'ai pas d'huissier sous le coude ;)
 

laurent950

XLDnaute Accro
Re @patricktoulon

Je te remercie pour ton code et surtout ton expertise qui me permet d'avancer à grands pas dans les modèles objet et la compréhension.

J'étais Bloqué en Poste #6 pour me passer de la boucle
For Each Match In Matches
et y récupérer la variable Objet : Match (Directement sans passer par cette boucle)
J'avais essayé cela
- Set Match = Matches
Pour récupérer cela
Debug.Print Match.Value
Mais impossible

car j'avais oublié que ce qui est stocké en mémoire dans la Pile commence à 0 et non a 1
C'est l'espion VBE qui m'a induit en erreur avec l' Item qui commence à 1 (En Lecture)

Set Matches = reg.Execute(Rng.Text)
Set Match = Matches.Item(Matches.Count - 1)
Effectivement l'Item commence a 0
et Donc
fourDigits = Match.Value C'est Ok cela Fonctionne

Par contre dans l'espion VBE la variable Match est consignée comme cela
pour son Type : Object/Match2
Je me suis donc dit pourquoi pas dimenssionné cette même variable comme cela
Set Match as Match2
Mais ce n'est pas correct, c'est surement une sous classe dans le modèle Object ?

L'idée est de se passer parfois de la boucle For each pour aller rechercher directement dans une collection l'objet sans tous boucler quand ont connait l'item (son Indice) ?

J'ai compris avec ton code mille mercis Patrick la brique qui me manquait
VB:
    Dim Matches As Object, Match As Object, reg As Object
    Set reg = CreateObject("VBScript.RegExp")
    Set Matches = reg.Execute(Rng.Text)
    ' VBE si Item = 1 L'indice commence à 0
    Set Match = Matches.Item(Matches.Count - 1) ' OU Matches.Item(0)
    Debug.Print Match.Value

Merci @patricktoulon je viens de comprendre quelques choses d'autres ce soir grâce à toi.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

@laurent950
La code de patrick ne renvoie que la 1er occurrence
Le "mien" renvoie toutes les occurrences (*)
(concaténées et séparées par une virgule)

C'est parce que j'avais testé le code de patrick, que j'ai posté le message#31 ;)

PS: Excel étant plus qu'imparfait, il n'y a de code parfait
Juste des VBA qui boguent un peu moins que les autres ;)
Précisions: je parle ici de manière générale
(pas des codes qui peuplent ce fil)

(*) charge à l'utilisateur de vérifier que les données sources ne contiennent que des nombres de 4 chiffres correspondant à des années réelles.
 

Staple1600

XLDnaute Barbatruc
Re

Pour le fun et pour les ceusses qui ont 365
Un type de formule que j'affectionne ;)
Code:
=JOINDRE.TEXTE(",";VRAI;TEXTE(FILTRE.XML("<t><s>"&SUBSTITUE(A1;" ";"</s><s>")&"</s></t>";"//s[contains(., '/')]");"aaaa"))
Ne fonctionne que si la cellule contient de vraies dates
(soit jj/mm/aaaa ou aaaa/mm/jj)

Test OK avec la chaine de caractère proposée au message#31 ;)
Pourlefun.png
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Staple1600 :) ,

Histoire de ne pas tâter du pattern, une fonction qui extrait la liste des suites de 4 chiffres ;):
VB:
Function TousNNNN(xtxt$)
Dim i&, s$, ss$, r$
   xtxt = xtxt & Chr(0): i = 1
   Do While i <= Len(xtxt)
      s = Mid(xtxt, i, 1): i = i + 1
      If s Like "#" Then
         ss = ss & s
      Else
         If Len(ss) = 4 Then r = r & ", " & ss
         ss = ""
      End If
   Loop
   TousNNNN = Mid(r, 3)
End Function
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Au niveau des durées d'exécution :
  • La méthode VBA est plus rapide pour des petites chaines de caractères.
  • On atteint une équivalence aux alentours d'une chaine de 4 000 caractères.
  • Au delà, il n'y a plus photo, Regex est de plus en plus rapide par rapport à VBA seul qui rame dur.
Le fichier joint permet de tester sur votre bécane (colonnes E et F).
En colonnes C et D, j'ai laissé mes propres durées.

Cliquer sur le bouton bleu.
 

Pièces jointes

  • chaelie2015- extraire année- v4.xlsm
    29.2 KB · Affichages: 3
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 207
Messages
2 086 248
Membres
103 164
dernier inscrit
axelheili2