Extraction de nombres au milieu d'un texte [Résolu]

solnsoln 4 Messages postés jeudi 10 janvier 2008Date d'inscription 15 février 2012 Dernière intervention - 9 févr. 2012 à 11:05 - Dernière réponse : solnsoln 4 Messages postés jeudi 10 janvier 2008Date d'inscription 15 février 2012 Dernière intervention
- 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 ^^
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
solnsoln 4 Messages postés jeudi 10 janvier 2008Date d'inscription 15 février 2012 Dernière intervention - 15 févr. 2012 à 15:13
3
Merci
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

Merci solnsoln 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 132 internautes ce mois-ci

Commenter la réponse de solnsoln
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 9 févr. 2012 à 11:17
0
Merci
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
Commenter la réponse de ucfoutu
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 9 févr. 2012 à 11:37
0
Merci
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
Commenter la réponse de Renfield
solnsoln 4 Messages postés jeudi 10 janvier 2008Date d'inscription 15 février 2012 Dernière intervention - 9 févr. 2012 à 12:36
0
Merci
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		
Commenter la réponse de solnsoln
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 9 févr. 2012 à 12:41
0
Merci
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
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 9 févr. 2012 à 12:48
0
Merci
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
Commenter la réponse de ucfoutu
solnsoln 4 Messages postés jeudi 10 janvier 2008Date d'inscription 15 février 2012 Dernière intervention - 9 févr. 2012 à 13:14
0
Merci
@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
Commenter la réponse de solnsoln
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 9 févr. 2012 à 13:19
0
Merci
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
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 9 févr. 2012 à 13:26
0
Merci
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
Commenter la réponse de ucfoutu
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 9 févr. 2012 à 13:46
0
Merci
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
Commenter la réponse de Renfield

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.