Extraction de nombres au milieu d'un texte

Résolu
solnsoln Messages postés 4 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 15 février 2012 - 9 févr. 2012 à 11:05
solnsoln Messages postés 4 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 15 février 2012 - 15 févr. 2012 à 15:13
bonjour,

je cherche depuis hier mais je tourne en rond. J'ai une base données de plus de 6000 lignes et en colonne J j'ai un commentaire qui contient des nombres. Je souhaite extraire uniquement les nombres mais plusieurs pb :
-le nombre de caractère total n'est jamais le meme
-la place du nombre dans le commentaire n'est jamais le meme
-il peut y avoir plusieurs nombres
-les nombres ne font pas toujours la meme longueur

j'ai essayé avec une fonction :
=STXT($J169;EQUIV(0;(ESTERREUR(STXT($J169;LIGNE(INDIRECT("1:"&NBCAR($J169)));1)*1)*1);0);NBCAR($J169)-SOMME((ESTERREUR(STXT($J169;LIGNE(INDIRECT("1:"&NBCAR($J169)));1)*1)*1)))

mais ça ne marche que partiellement, je pense donc qu'un code VBA serait mieu mais je n'ai pas le niveau suffisant pour le construire.

quelqu'un peut il m'aider?

merci ^^

10 réponses

solnsoln Messages postés 4 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 15 février 2012
15 févr. 2012 à 15:13
Bon au final j'ai plutot utilisé GetNbr :
Function GetNbr(str As String, mypattern As String, separateur As String) As String
Dim i As Integer
resul = ""
i = 0
c = ""
GetNbr = ""
While i < Len(str)
    i = i + 1
    c = Mid(str, i, 1)
    If c Like mypattern Then
        GetNbr = GetNbr + c
    ElseIf Len(GetNbr) > 0 Then
        If Mid(GetNbr, Len(GetNbr), 1) <> separateur Then
            GetNbr = GetNbr + separateur
        End If
    End If
Wend
End Function



merci pour votre aide
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 févr. 2012 à 11:17
Bonjour,
Avant toute autre chose :
Tu ne développes donc pas sous VB.Net (la présente setion du forum), mais sous VBA (le VBA/Excel) !
Nous te serions reconnaisants de bien vouloir dorénavant (un administrateur déplacera la présente discussion) veiller au choix de la section dans laquelle tu ouvres une discussion (celle-ci aurait du être ouverte dans la section Langages dérivés > VBA) !

Un code VBA, oui, mais encore faudrait-il plus de précisions sur :
1) la chaîne à traiter (exemples de chaines)
2) ce que tu veux en extraire (en regard de chaque exemple)
en précisant au besoin ce qui est éventuellement immuable (rang, chaines, etc..) afin d'éviter d'entrer dans un jeu (trop fréquent) de questions/réponses à n'en plus finir.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 févr. 2012 à 11:37
je verrai bien une procédure VBA qui ferai cette extraction...

avec une regexp, ca doit etre très simple

a voir un exemple de contenu

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
solnsoln Messages postés 4 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 15 février 2012
9 févr. 2012 à 12:36
tout d'abord mes excuses pour avoir selectionné le mauvais emplacement pour mon message...

par exemple je peux avoir :

J2 : "Your Warranty claim N° 8524"

J3 : "Thanks to find the credit memo regarding/the labour for your warranty claim ://10077 , 25, 1068"

et je voudrais :

K2 : 8524
K3 : 10077/10425/10568
(ou qqch dans le genre : nombres séparés par nimporte quel séparateur...)

j'ai trouvé ce code, qui je pense va dans le bon sens :
Sub extraireValeursNumeriques_DansChaine()
    Dim i As Byte, Nb As Byte
    Dim Cible As String, Resultat As String
    Dim Nombre As Double
    
    Cible = "12,3azerty23,5 67"
    'Pour que fonction Val puisse reconnaitre les décimales: Remplacement des
    'virgules par des points
    Cible = Replace(Cible, ",", ".")
    'Pour gérer deux nombres qui se suivent: remplacement des espaces
    'par un caractère Alpha
    Cible = Replace(Cible, " ", "x")
    
    For i = 1 To Len(Cible)
        If IsNumeric(Mid(Cible, i, 1)) Then
        Nombre = Val(Mid(Cible, i, Len(Cible) - i + 1))
        Nb = Nb + 1
        Resultat = Resultat & Nombre & vbLf
        i = i + Len(Str(Nombre)) - 1
        End If
    Next
    
    MsgBox "Il y a " & Nb & " valeurs numériques dans la cellule " & vbLf & Resultat
End Sub		
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 févr. 2012 à 12:41
Bonjour,
peux-tu nous expliquer ce mystère :
J3 : "Thanks to find the credit memo regarding/the labour for your warranty claim ://10077 , 25, 1068"
et je voudrais
K3 : 10077/10425/10568

car là ... explique par quel coup de baguette magique, sinon de logique du mécanisme !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 févr. 2012 à 12:48
Bref ...
(Le jour où les demandeurs sauront s'efforcer de se relire et de décoyuvrir leurs ;;; plus qu'imprécisions ...n'est pas arrivé ! )

A l'arrache :

toto = "zzzzz22jgjgjj5jkjkjkkj8fffff"
 titi = toto
 resul = ""
 Do While Len(titi) > 0
   Do While Not titi Like "#*"
     titi = Mid(titi, 2)
     If titi = "" Then Exit Do
   Loop
   If titi <> "" Then resul = resul & " " & Val(titi) Else Exit Do
   Do While titi Like "#*"
     titi = Mid(titi, 2)
   Loop
 Loop
MsgBox resul



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
solnsoln Messages postés 4 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 15 février 2012
9 févr. 2012 à 13:14
@ucfoutu : en effet je corrige :
J3 : "Thanks to find the credit memo regarding/the labour for your warranty claim ://10077 , 25, 1068"
et je voudrais
K3 : 10077/25/1068

j'ai modifié J3 apres l'avoir collé ici pour que vous puissiez voir que les N° ne sont pas tous de la meme longueur


et oui la relecture est importante mais on ne prend pas toujours le temps...quand on est dérangé toutes les 3 secondes c pas évident et à ce propos, je te cite :
"(Le jour où les demandeurs sauront s'efforcer de se relire et de décoyuvrir leurs ;;; plus qu'imprécisions ...n'est pas arrivé ! ) "

si tu t'étais relu tu aurai enlever le "y" à découvrir je pense... et peut etre meme remplacé tes 3";" par des ...

tout ça pour dire qu'on fait pas toujours ce qu'on veut au boulot


ton code m'a l'air de répondre à ma demande mais je n'arrive pas à l'adapter à mon besoin pour le tester vraiment : à savoir qu'il traite toutes les lignes de la colonne J et renvoi les nombres non pas dans un msgbox mais dans la colonne K...

je vais essayer de me pencher la dessus, je devrais etre moins dérangée cet aprem je pourrai mieu me concentrer


merci pour ton aide, si ça fonctionne je cloturerai le message
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 févr. 2012 à 13:19
ton code m'a l'air de répondre à ma demande mais je n'arrive pas à l'adapter à mon besoin pour le tester vraiment : à savoir qu'il traite toutes les lignes de la colonne J et renvoi les nombres non pas dans un msgbox mais dans la colonne K...

Pardi !
C'est à toi (et c'est tout de même élémentaire, là) de parcourir ta colonne et d'appliquer ce code à chaque valeur .
et oui la relecture est importante mais on ne prend pas toujours le temps...quand on est dérangé toutes les 3 secondes c pas évident

et moi, bénévole ici, j'ai maintenant autre chose à faire === >> je vais dormir et reviendrai après ma siestita voir ce que tu as été capable de commencer à commencer à commencer à faire

C'est comme ça, vois-tu ?
Bon TRAVAIL !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 févr. 2012 à 13:26
Sans compter que (puisque toi, tu es payé pour travailler) tu n'as même pas besoin de "boucler".
Encore te faudrait-il urgemment de pencher sur ce que sont les fonctions personnalisées, alors utilisables de la même manière que les formule Excel.
Bonne chance à toi (et ne te casse pas trop les méninges, hein ... c'est fatigant ...).
Moi, je vais jouir de ma siestita tranquillement.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 févr. 2012 à 13:46
A mettre dans un module VBA dans ton classeur

Public Function ExtNum(ByVal vsCellContent As String, Optional ByRef vsSep As String = "/") As String
Dim Match As Object
    With CreateObject("VbScript.Regexp")
        .Pattern = "\d+"
        .Global = True
        For Each Match In .Execute(vsCellContent)
            If LenB(ExtNum) Then
                ExtNum = ExtNum & vsSep
            End If
            ExtNum = ExtNum & Match.Value
        Next
    End With
End Function


et dans ta Cell :

=ExtNum(J2)

ou

=ExtNum(J3; ";")



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
Rejoignez-nous