Microsoft 365 Extraire une valeur d'une phrase

Wyrox51

XLDnaute Nouveau
Bonjour,
Les exemples seront en gras pour faciliter la lecture

Pour commencer, voici un exemple : Je suis footballeur et j'ai joué 20 matchs et marqué 54 buts.

Cette phrase se trouve dans une cellule, et ce que j'aimerai faire, c'est extraire le 54 pour le mettre dans une autre cellule. Le problème sur lequel je tombe c'est que parfois il pourrait y avoir des phrases avec aucun espace comme par exemple 54buts ou encore marqué54 buts. Les 2 programmes que j'ai fait ont leur limite, l'un récupère tous les nombres de la phrase mais je n'arrive pas à faire en sorte que ce soit que 54 et l'autre récupère l'avant dernière valeur mais parfois s'il manque un espace, l'avant dernière valeur n'est pas la valeur chiffré que je recherche.

Je sais pas si j'ai été assez clair pour vous, alors n'hésitez pas à me poser des questions pour vous éclaircir.

PS : je veux que cela se fasse en VBA sous excel évidemment.

Merci à ceux qui prendront de leur temps pour me lire et me répondre !
 

jmfmarques

XLDnaute Accro
Bonjour
Je sais pas si j'ai été assez clair pour vous, alors n'hésitez pas à me poser des questions pour vous éclaircir.
je considère personnellement anormal d'avoir à poser à un demandeur des questions sur des précisions qu'il doit prendre le soin de donner lui-même d'emblée
C'est à toi, qu'il appartient de faire cet effort.
regarde par exemple ton premier exposé --> il est "bâti" de telle manière (puisque non précisé) que le mot "buts" (et nul autre) suit toujours un nombre.
Prends s'il te plait ton temps et montre-toi clair et exhaustif.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour tout le monde,
Un exemple avec une fonction, et la macro de test;
Evidemment la fonction pourrait s'intégrer dans la macro. Question de choix.
L'avantage de la fonction est qu'elle peut être appelée dans la feuille ( =Nbuts("A1") )

VB:
Function NbButs(Phrase)
    tablo = Split(Phrase, "marqué")
    Nbuts = Split(tablo(1), "buts")
    NbButs = Val(Nbuts(0))
End Function

Sub Test()
N = NbButs(Range("A1"))
End Sub

NB : Ne couvre pas tout, en particulier les fautes d'orthographe ou buts au singulier. Mais peut être améliorée.
 

Wyrox51

XLDnaute Nouveau
Bonjour

je considère personnellement anormal d'avoir à poser à un demandeur des questions sur des précisions qu'il doit prendre le soin de donner lui-même d'emblée
C'est à toi, qu'il appartient de faire cet effort.
regarde par exemple ton premier exposé --> il est "bâti" de telle manière (puisque non précisé) que le mot "buts" (et nul autre) suit toujours un nombre.
Prends s'il te plait ton temps et montre-toi clair et exhaustif.

Bonjour,
Sache une chose, chacun a sa façon d'expliquer les choses, malgré tout, certaines personnes peuvent ne pas comprendre, ce qui est normal, alors oui pour moi je suis clair dans ce que je demande car je sais où je suis bloqué, mais une personne lambda qui essaie de m'aider et qui le veut, peut ne pas comprendre exactement ce que je demande. Ici c'est un forum pour aider les personnes en difficultées, alors si tu es là seulement pour critiquer la manière dont j'ai tourné ma demande et non pas pour m'aider ou me donner une piste, je te demande gentillement de passer ton chemin et d'aller faire tes réflexions désagréables et inutiles pour mon cas ailleurs !

Malgré tout merci bien de m'avoir lu et répondu.
 

jmfmarques

XLDnaute Accro
excuse-moi, mais je continue à attendre la précision nécessaire et ne ferai aucun autre effort sans le tien dans ce sens.
si tu estimes vraiment l'avoir été (précis), tu as alors la solution que t'a donnée sylvanu !!!

A toi de voir, maintenant. Je ne "libèrerai" le code que je viens d'écrire à tout hasard que si tu fais toi-même l'effort qui t'est demandé. Du "donnant donnant", donc ...:cool:
 

Wyrox51

XLDnaute Nouveau
Bonjour tout le monde,
Un exemple avec une fonction, et la macro de test;
Evidemment la fonction pourrait s'intégrer dans la macro. Question de choix.
L'avantage de la fonction est qu'elle peut être appelée dans la feuille ( =Nbuts("A1") )

VB:
Function NbButs(Phrase)
    tablo = Split(Phrase, "marqué")
    Nbuts = Split(tablo(1), "buts")
    NbButs = Val(Nbuts(0))
End Function

Sub Test()
N = NbButs(Range("A1"))
End Sub

NB : Ne couvre pas tout, en particulier les fautes d'orthographe ou buts au singulier. Mais peut être améliorée.

Alors merci beaucoup de ta réponse, un autre exemple (qui n'aura pas de sens), si je te dis que je veux le 54 dans la phrase Tension 500V = 54 patates

En sachant que j'ai toujours les problèmes d'espaces annoncer au départ d'une ligne à une autre que ce n'est pas tout le temps = qui apparait mais parfois > ou <.

NB : V Apparait tout le temps !
 

Wyrox51

XLDnaute Nouveau
excuse-moi, mais je continue à attendre la précision nécessaire et ne ferai aucun autre effort sans le tien dans ce sens.
si tu estimes vraiment l'avoir été (précis), tu as alors la solution que t'a donnée sylvanu !!!

A toi de voir, maintenant. Je ne "libèrerai" le code que je viens d'écrire à tout hasard que si tu fais toi-même l'effort qui t'est demandé. Du "donnant donnant", donc ...:cool:

La fameuse phrase est là si jamais dans ce que j'ai dit, une chose n'a pas été comprise. Maintenant comme Sylvanu l'a dit en fonction des réponses reçues (d'ailleurs encore merci a sylvanu car cela ma déjà un peu débloqué), il y a peaufinage par la suite. Si tu souhaites m'aider, je t'en remercie sinon passe à autre chose, personnellement je pense avoir donner les indications suffisantes, plus ma réponse à Sylvanu, je pense que tout y est.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous :),

Une autre fonction (VBA ou pour Exel) assez permissive :
VB:
Function Combien(ByVal x As String, deQuoi As String) As Long
Dim n&, i&, s$
   x = Replace(x, " ", "")
   n = InStr(1, x, deQuoi, vbTextCompare)
   If n = 0 Then Exit Function
   For i = n - 1 To 1 Step -1
      If Not (Mid(x, i, 1) Like "#") Then Exit For Else s = Mid(x, i, 1) & s
   Next i
   Combien = Val(s)
End Function
 

Pièces jointes

  • Wyrox51- combien- v1.xlsm
    16.4 KB · Affichages: 10

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Un exemple ci dessous.
Ce genre de manip demande toujours un peaufinage dû au contexte.
Qu'est ce que je cherche ? Qu'est ce qu'est invariant ou pas ? ....
Ici l'astuce est de repérer le V (invariant) et "sauter" le signe (variant).

VB:
Function Extrait(Phrase)
    Pos = InStr(1, Phrase, "V")                 ' où se trouve le V ?
    tablo = Split(Mid(Phrase, Pos + 2), " ")    ' split sur Pos plus deux caractères
    Extrait = tablo(1)                          ' renvoie valeur
End Function

Sub Test()
N = Val(Extrait("Tension 500V = 54 patates"))
End Sub
On trouve N=54 en format nombre.
On aurait pu aussi garder le simple Split :
Code:
Function Extrait(Phrase)
    tablo = Split(Phrase, " ")
    Extrait = tablo(UBound(tablo) - 1)
End Function
Mais ça dépend de ce qu'il y a derrière la valeur.
 

patricktoulon

XLDnaute Barbatruc
bonjour
dans un module standard(comme ça vite fait;à perfectionner)

à perfectionner dans le sens ou il serait judicieux vu que l'utilisation est en formule de mettre un test instr pour "exp" histoire de ne pas choper un nombre qui n'aurait rien avoir avec l'expression qui est sensé l'accompagner

VB:
Function GetNumericBeforExpression(str$, exp$)
x = Mid(str, 1, InStrRev(str, exp) - 1)
For i = Len(x) To 1 Step -1: t = IIf(IsNumeric(Trim(Mid(x, i))), Trim(Mid(x, i)), t): Next
GetNumericBeforExpression = t
End Function

exemple d'utilisation en formule a etendre
=SI(A2<>"";GetNumericBeforExpression(A2;"match");"")
=SI(A2<>"";GetNumericBeforExpression(A2;"but");"")

demo
demo4.gif
 

jmfmarques

XLDnaute Accro
Ouais, on en est ainsi (n'est-ce pas ?) à 12 messages et précisions "rajoutées" là où une solution pouvait être donnée dès le second message.... pour autant qu'étaient exposés sans "flou" les tenants et les aboutissants.
bref --->>
VB:
ch = "Je suis footballeur et j'ai joué 20 matchs et blabla54patatipatata."
For k = Len(ch) To 2 Step -1
 cc = Mid(ch, k)
 If Not Left(cc, 1) Like "#" And Mid(cc, 2, 1) Like "#" Then
   cc = Val(Mid(cc, 2)): Exit For
 End If
Next
MsgBox cc
 

Wyrox51

XLDnaute Nouveau
Ouais, on en est ainsi (n'est-ce pas ?) à 12 messages et précisions "rajoutées" là où une solution pouvait être donnée dès le second message.... pour autant qu'étaient exposés sans "flou" les tenants et les aboutissants.
bref --->>
VB:
ch = "Je suis footballeur et j'ai joué 20 matchs et blabla54patatipatata."
For k = Len(ch) To 2 Step -1
cc = Mid(ch, k)
If Not Left(cc, 1) Like "#" And Mid(cc, 2, 1) Like "#" Then
   cc = Val(Mid(cc, 2)): Exit For
End If
Next
MsgBox cc

Merci beaucoup pour ton programme ! J'ai une dernière erreur qui pour moi n'aurait pas eu d'importance, mais pourrais m'aider à adapter ton code lorsque le 54 de l'exemple se transforme en 5.45 par exemple ?

Merci d'avance !
 

patricktoulon

XLDnaute Barbatruc
re
pourquoi tester le mid(str,x,1)??????
tester plutot d'un coup le val(mid(str,x)) directementen jumpant le x du len(val....)

sinon tu les choppe tous et tu choisi celui que tu veux par son index de 1 a ubound(t)

et tu n'aura pas de souci avec les décimale puisque val te les sortira quand meme


VB:
Function GetNumericByIndex(str$, index)
Dim z&, t()
ReDim Preserve t(1000)
z = 1
For i = 1 To Len(str)
If Val(Mid(str, i)) > 0 Then t(z) = Val(Mid(str, i)): i = i + Len(CStr(Val(Mid(str, i)))) + 1: z = z + 1
Next
ReDim Preserve t(z)
GetNumericByIndex = t
End Function

Sub test2()
MsgBox GetNumericByIndex("je suis footballeur et j'ai joué 20 matchs et marqué 54 buts.")(2)
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 195
Messages
2 086 079
Membres
103 112
dernier inscrit
cuq-laet