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.
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)
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.
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.
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
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