Récupérer une valeur numérique dans un texte

Bonjour le forum ,

Une petite question : j'ai dans une cellule un nom qui est changeant mais toujours sous la forme "TextNbr1XNbr2Text" j'aimerais récupérer le nombre 1 et le nombre 2 qui peuvent être des décimaux (exemple : 0,8) comment puis je faire pour ça ?

Bonne journée !!

Salut Man,

quelque chose ainsi, pêché sur le site de J. Boisgontier : je n'aurais jamais pu pondre un pareil truc dont j'ignorais l'existence !
Tu cliques sur la cellule à traiter...

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
Set obj = CreateObject("vbscript.regexp")
obj.Global = True
obj.Pattern = "[a-z]"
chaine = LCase(Target)
chaine = obj.Replace(chaine, "")
MsgBox chaine
'
End Sub
18man.xlsm (13.52 Ko)

A+

Bonjour Man.403030, Curulis57,

Voir des codes déjà proposés pour le même besoin.

Oter les lettres:

bonjour

une "contribution" pour le sport

cordialement

19man40.xlsx (8.63 Ko)

Bonjour à tous,

Voici une autre proposition utilisant les expressions régulières, mais sous forme de fonction personnalisée :

Function EXTRACT_DOUBLE(chaine As String) As String

Dim Expreg As Object, subdiv As Object
Dim modele$
Dim i%

modele = "\d+((,|\.){1}\d+)?"

Set Expreg = CreateObject("vbscript.regexp")

With Expreg
    .Global = True
    .Pattern = modele
    If .test(chaine) Then
        Set subdiv = .Execute(chaine)
        For i = 0 To subdiv.Count - 1
            EXTRACT_DOUBLE = EXTRACT_DOUBLE & subdiv(i).Value
        Next i
    End If
End With

End Function

A appeler ainsi sur excel :

=EXTRACT_DOUBLE(A1)

avec possibilité d'ajouter des séparateurs...

Cdlt,

Merci pour toutes vos réponses.

@curulis57 et @3GB j'admets que ne comprends pas vos codes et que je suis incapable de l'appliquer à mon projet ..

@X cellus malheureusement dans ce sujet ça propose d'extraire uniquement une valeur alors que pour ma part j'en ai deux

@tulipe_4 je cherche du VBA pas une formule Excel

Tulipe éliminé !

Les expressions régulières permettent de comparer des chaines avec un modèle.

Ici, j'ai proposé une fonction qui est utilisable aussi bien sur feuille que dans le code mais qui a pour effet d'extraire et de concatener de façon brute toutes les sous-chaines répondant au modèle pré-défini (le résultat est similaire au code de curulis57).

1bla0,5blo2.5bli45 renvoie 10,52.545...

Comme ta demande manque (un tout petit peu) de précision, j'ai fait au plus simple mais il est maintenant plus simple, une fois que le modèle est cadré, de faire autrement (cibler les occurrences, concatener avec un séparateur, sommer, ...).

Donc donne plusieurs exemples du résultat désiré en partant de différents cas et ce sera plus simple.

Bonjour Man.403030, le Forum,

@X cellus malheureusement dans ce sujet ça propose d'extraire uniquement une valeur alors que pour ma part j'en ai deux

Et bien c'est que tu as fermé un oeil...

Sub Enleve()
Der = Range("A" & Rows.Count).End(xlUp).Row
For Lig = 1 To Der
For C = 1 To Len(Range("A" & Lig))
Mot = Range("A" & Lig): ch = Mid(Mot, C, 1)
If ch < "A" Then Range("B" & Lig) = Range("B" & Lig) & ch
Next C
Next Lig
End Sub

Maintenant tu peux adapter pour séparer tes 2 chiffres.

Sub Enleve()
Der = Range("A" & Rows.Count).End(xlUp).Row
'Recherche 1ier nombre
For Lig = 1 To Der
For C = 1 To Len(Range("A" & Lig))
Mot = Range("A" & Lig): ch = Mid(Mot, C, 1)
If ch < "A" Then Range("B" & Lig) = Range("B" & Lig) & ch:Prem=1
if Prem=1 and ch>="A" then exit For
Next C
'Recherche 2ième nombre
ch=""
For D = C To Len(Range("A" & Lig))
Mot = Range("A" & Lig): ch = Mid(Mot, D, 1)
If ch < "A" Then Range("C" & Lig) = Range("C" & Lig) & ch
Next D
Next Lig
End Sub

Ceci en supposant que tes données sont en colonne A pour être récupérées modifiées en colonne B et C

Tulipe éliminé !

Les expressions régulières permettent de comparer des chaines avec un modèle.

Ici, j'ai proposé une fonction qui est utilisable aussi bien sur feuille que dans le code mais qui a pour effet d'extraire et de concatener de façon brute toutes les sous-chaines répondant au modèle pré-défini (le résultat est similaire au code de curulis57).

1bla0,5blo2.5bli45 renvoie 10,52.545...

Comme ta demande manque (un tout petit peu) de précision, j'ai fait au plus simple mais il est maintenant plus simple, une fois que le modèle est cadré, de faire autrement (cibler les occurrences, concatener avec un séparateur, sommer, ...).

Donc donne plusieurs exemples du résultat désiré en partant de différents cas et ce sera plus simple.

bonjour

peut etre pas , suffit de bourrer la fonction dans un code : " & "=...........................................") tu sais comment

Tulipe : C'est bien, on ne s'avoue jamais vaincu !

X Cellus : Décidément avec les extractions de nombres, on ne prend pas au sérieux nos solutions pourtant fonctionnelles ! J'en ai marre à la fin !

En aucun cas je ne prend pas au sérieux vos réponses sinon pourquoi poser des questions, je n'aime pas mettre du code pour mettre du code sans le comprendre donc je m'interroge sur le fonctionnement...

X cellus je travaille avec un tableau donc est ce que je peux remplacer les lettres par des noms de colonnes ? Je ne sais pas comment sélectionner une cellule de mon tableau de la même ligne que la cellule testée mais avec une colonne différente

Je taquinais seulement X Cellus en faisant référence au post sur lequel il t'a redirigé...

En tout cas, voici des commentaires expliquant un peu la fonction :

Function EXTRACT_DOUBLE(chaine As String) As String

Dim Expreg As Object, subdiv As Object
Dim modele$
Dim i%

modele = "\d+((,|\.){1}\d+)?" 'modèle : \d+ = chiffre (\d) apparaissant au moins une fois (+), suivi du bloc ((,|\.){1}\d+)?
'? signifiant que le bloc doit apparaitre 0 ou 1 fois
'dans ce bloc,  (,|\.){1} = "," ou "." apparait une seule fois ({1}), suivi de \d+ = un chiffre ou plus
'rq : on pourrait aussi limiter à 2 décimales après la virgule : ((,|\.){1}\d{1,2})?

'donc toute suite de caractères étant une succession d'entiers, contenant au plus 1 virgule ou 1 point est acceptée.
'si la virgule (ou le point) n'est pas suivie ou précédée d'un chiffre, seuls les chiffres sont extraits et pas la virgule...

Set Expreg = CreateObject("vbscript.regexp") 'instanciation expression régulière

With Expreg
    .Global = True 'recherche sur chaine entiere
    .Pattern = modele 'détermine modele à examiner dans la chaine
    If .test(chaine) Then 'si correspondance vrai (modele contenu dans la chaine)
        Set subdiv = .Execute(chaine) 'extraction de toutes les "sous-chaines" (toutes correspondances avec le modele)
        For i = 0 To subdiv.Count - 1 'pour chaque sous-chaine
            EXTRACT_DOUBLE = EXTRACT_DOUBLE & subdiv(i).Value 'fonction renvoie concaténation des valeurs
        Next i
    End If
End With

End Function

A plus,

Vous allez vous dire que je comprend rien et c'est effectivement le cas mais on a une fonction qui renvoie une valeur alors que je suis censée retourner deux valeurs numériques ??

D'accord, mais tu ne l'as pas bien précisé alors...

Function EXTRACT_NUMBER(chaine As String, Optional Occurrence As Integer) As String

Dim ExpReg As Object
Dim subdiv As Object 

Set ExpReg = CreateObject("vbscript.regexp")

With ExpReg
    .Global = True
    .Pattern = "\d+((,|\.){1}\d+)?"
    If .test(chaine) Then
        Set subdiv = .Execute(chaine)
        If subdiv.Count > 1 Then
            If Occurrence = 0 Then Occurrence = 1
            EXTRACT_NUMBER = subdiv(Occurrence - 1).Value
        Else
            EXTRACT_NUMBER = subdiv(0).Value
        End If
    End If
End With

End function

Cette fonction renvoie la valeur demandée

EXTRACT_NUMBER("aioizao123jajoa8,7584kghiug123hihoiho", 2) renvoie 8,7584

Possible effectivement mais du coup j'ai besoin vraiment de récupérer les deux valeurs dans tous les cas pas que 8,7584; mais 123 ET 8,7584

C'est un exemple mais pour récupérer les 2 valeurs, tu as

EXTRACT_NUMBER(chaine, 1)

EXTRACT_NUMBER(chaine, 2)

voilà...

A moins que tu ne veuilles récupérer sous forme d'array ?

Je vais replacer les valeurs sur la même ligne d'où elles ont été extraites du tableau mais dans une colonne avec un nom différent (exemple dans la colonne LARGEUR de la même ligne que le string analysé mais ça je ne sais pas faire ) . Au moins maintenant je sais récupérer les valeurs mdr

Vous voudriez un fichier exemple pour mieux comprendre ? Cette après midi j'ai l'impression de parler en charabia

Pas forcément car je ne pourrais pas tester.

Supposons que tu aies un tableau avec 3 colonnes A, B, C et que tu aies en A les chaines avec les caractères alphanumériques.

=EXTRACT_NUMBER([@[A], 1) 'formule en B
=EXTRACT_NUMBER([@A], 2) 'formule en C

après avoir copié le code dans un module bien entendu...

C'est ça que tu veux non ?

Sinon, tu peux utiliser la fonction dans VBA mais je ne vois pas beaucoup d'intérêt vu que l'issue est de reporter les valeurs sur la feuille si j'ai bien compris.

Mais, bien sûr que oui : un fichier-exemple reprenant tous les cas rencontrés !!!

Serait temps, d'ailleurs !!


A+

Rechercher des sujets similaires à "recuperer valeur numerique texte"