Supprimer le texte d'une chaîne

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Je voudrais supprimer le texte d'une chaîne et ne conserver que les chiffres (s'il y en a).
Les chiffres sont dispersés dans la chaîne. Ils peuvent être isolés ou groupés, par exemple :
"Romina007 a rencontré 1 seul zèbre & 133 antilopes dans la savane aux 36 baobabs"
J'ai trouvé sur le net cette fonction intéressante, que j'ai modifiée pour n'extraire que les chiffres (à l'origine il ne s'agissait que des lettres) :
VB:
Function GetOnlyNumbers(ByRef maChaine As String) As String
'Extraie uniquement les nombres d'une chaîne
'JPierre M

Dim rationelleExp As Object, trouve As Object, i

    Set rationelleExp = CreateObject("vbscript.regexp")
    rationelleExp.Global = True
    rationelleExp.Pattern = "\d"
    
    Set trouve = rationelleExp.Execute(maChaine)

    For i = 0 To trouve.Count - 1
        GetOnlyNumbers = GetOnlyNumbers & trouve(i)
    Next
    Set rationelleExp = Nothing
End Function
La fonction me renvoie bien tous les chiffres : 007113336

En fait, ce que je voudrais, c'est que la fonction me renvoie tous les chiffres, mais que deux groupes de chiffres de la chaîne (un singleton étant assimilé lui aussi à un groupe) soient séparés par un intervalle.
Autrement dit (bien relire la phrase), je voudrais obtenir : 007 1 133 36
Les couleurs ne servant ici que pour mieux distinguer chaque groupe de chiffres.
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Bonjour,

Je voudrais supprimer le texte d'une chaîne et ne conserver que les chiffres (s'il y en a).
Les chiffres sont dispersés dans la chaîne. Ils peuvent être isolés ou groupés, par exemple :
"Romina007 a rencontré 1 seul zèbre & 133 antilopes dans la savane aux 36 baobabs"
J'ai trouvé sur le net cette fonction intéressante, que j'ai modifiée pour n'extraire que les chiffres (à l'origine il ne s'agissait que des lettres) :
VB:
Function GetOnlyNumbers(ByRef maChaine As String) As String
'Extraie uniquement les nombres d'une chaîne
'JPierre M

Dim rationelleExp As Object, trouve As Object, i

    Set rationelleExp = CreateObject("vbscript.regexp")
    rationelleExp.Global = True
    rationelleExp.Pattern = "\d"
 
    Set trouve = rationelleExp.Execute(maChaine)

    For i = 0 To trouve.Count - 1
        GetOnlyNumbers = GetOnlyNumbers & trouve(i)
    Next
    Set rationelleExp = Nothing
End Function
La fonction me renvoie bien tous les chiffres : 007113336

En fait, ce que je voudrais, c'est que la fonction me renvoie tous les chiffres, mais que deux groupes de chiffres de la chaîne (un singleton étant assimilé lui aussi à un groupe) soient séparés par un intervalle.
Autrement dit (bien relire la phrase), je voudrais obtenir : 007 1 133 36
Les couleurs ne servant ici que pour distinguer chaque groupe de chiffres.
Modifier cette partie ainsi :
For i = 0 To trouve.Count - 1
GetOnlyNumbers = GetOnlyNumbers & trouve(i) &" "
Next
GetOnlyNumbers = Application.Trim(GetOnlyNumbers)
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Bonjour Modeste geedee,

Merci pour ta réponse.
J'avais essayé quelque chose qui ressemblait à ta suggestion.
Le problème est que la fonction me renvoie : 0 0 7 1 1 3 3 3 6
Autrement dit, tous les chiffres sont séparés par un espace.
D'autre part, qu'il y ait ou pas la sentence GetOnlyNumbers = Application.Trim(GetOnlyNumbers), c'est pareil.
Je pense qu'il faut qu'il y ait une boucle dans la boucle.
La boucle "englobante" analyse toute la chaîne.
La boucle "inclue", elle, analyse tous les groupes de chiffres séparés par du texte pour les séparer par un espace.
Ça me semble plus compliqué qu'il n'y paraît.
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Merci pour ta réponse.
J'avais essayé quelque chose qui ressemblait à ta suggestion.
Le problème est que la fonction me renvoie : 0 0 7 1 1 3 3 3 6
Autrement dit, tous les chiffres sont séparés par un espace.
Oupsssss... en effet
essaie plutot ceci :
Code:
Function OnlyNumbers(ByRef maChaine As String) As String
Dim Idx As Integer, trouve As String
    For Idx = 1 To Len(maChaine)
    trouve = Mid(maChaine, Idx, 1)
        OnlyNumbers = OnlyNumbers & IIf(IsNumeric(trouve), trouve, " ")
    Next
    OnlyNumbers = Application.Trim(OnlyNumbers)
End Function
 

VIARD

XLDnaute Impliqué
Re,

Merci Modeste, c'est tout à fait ça.
Bonjour Modeste, Magic_Doctor et à tous

Peut-être une autre solution, enfin ce que j'utilise pour décomposer l'adresse d'une cellule.
pour une chaîne de caractère je n'ai pas fait d'essai.

le code
Dim Obj As Object
Adr = range("ABB110").address
'------- Sélect Alpha (A) -------
Set Obj = CreateObject("vbscript.regexp")
Obj.Global = True
Obj.Pattern = "[0-9]"
A = Obj.Replace(Adr, "")
'------- Sélect Numérique (N) -------
Obj.Pattern = "[a-z,A-Z]"
N = Obj.Replace(Adr, "")
'------------------------------------

A+ Jean-Paul
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum

Pour continuer dans le RegExp (bien que la fonction de Modeste fasse le job)
Une version avec séparateur paramétrable (le séparateur par défaut étant ici l'espace)
Syntaxe:
=NOMBRESP(A1)
ou
=NOMBRESP(A1;"/")
VB:
Function NOMBRESP(ByVal text As String, Optional sep As String = " ") As String
Dim i&, j&, Nombres$, vMatchs As Object
With CreateObject("vbscript.regexp")
.Pattern = "(\d+)": .Global = True: Set vMatchs = .Execute(text)
For i = 0 To vMatchs.Count - 1
    For j = 0 To vMatchs.Item(i).Submatches.Count - 1
        Nombres = Nombres & sep & vMatchs.Item(i).Submatches.Item(j)
    Next
Next
End With
NOMBRESP = Right(Nombres, Len(Nombres) - Len(sep))
End Function
 

Statistiques des forums

Discussions
312 236
Messages
2 086 477
Membres
103 232
dernier inscrit
logan035