Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Autres(RESOLU)Extraire une année composée de quatre chiffres ("aaaa")
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
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
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
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.
J'essayer de me passer de la boucle for each sans y arrivé et je viens de comprendre le modèle de son fonctionnement pour m'en passer les prochaine fois ci-besoin.
Et non j'ai pas zappé votre code en Poste #31 et je vous en Remercie
Et surtout je remercie @patricktoulon pour son expertise qui m'a permis de comprendre quelques choses d'autres ce soir. Le code a @patricktoulon est parfait
@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.
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
Tu as raison : souvent l'efficience (c'est ti pas beau ce mot là ) des méthodes dépend aussi de la quantité à traiter voire de la composition des données elles-mêmes. Restons agiles (autre beau mot des présentations powerpoint ou teams), soyons adaptatifs, soyons lean (autres mots à la mode ou qui le furent).
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.