Tronquer une chaine

Bonjour à tous,

Je désire tronquer des chaînes du type :

"numéro : 452 il s'agit de TARTENPION Alain"

sachant que d'une part le nombre peut ne comporter que 1 chiffre, voire 2, voire 3, voire 4 et d'autre part les noms et prénoms sont différents donc le texte correspondant est de longueur différente suivant les cas
Mon but est d'en extraire le nombre, dans cet exemple 452
J'ai bien pensé à la fonction Mid(texte, 10, length ), mais c'est là que le bas blesse, que dois je renseigner pour l'élément "length" , certes 3 dans mon exemple, mais si le nombre est 22 ou 2564 ?
J'ai pensé me servir de l'espace situé à la suite du nombre pour indiquer que je veux arrêter là, mais comment faire ? je ne vois pas

Merci

je ne suis pas resté inactif et ai essayé de trouver une solution que voici :

texte = "numéro : 452 il s'agit de TARTENPION Alain"
fin = Instr(9, texte, " ")
mon nombre = Mid(texte, 9, fin-9)

Est ce correct ? mais ça semble fonctionner

bonjour

avec le texte en B2 de façon rustique

STXT(B2;MIN(SIERREUR(SI((CODE(STXT(B2;LIGNE($1:$200);1))>47)*(CODE(STXT(B2;LIGNE($1:$200);1))<=57);LIGNE($1:200);"");""));NB(SIERREUR(SI((CODE(STXT(B2;LIGNE($1:$200);1))>47)*(CODE(STXT(B2;LIGNE($1:200);1))<=57);LIGNE($1:$200);"");"")))

cordialement

Bonjour,

capture
Function TronquerChaine(ByVal ChaineATronquer As String) As Variant

    TronquerChaine = Split(ChaineATronquer, " ")(2)

End Function

Bonjour,

Vous pouvez utiliser les expressions régulières:;

Sub test()
    Dim REGEX As Object
    Set REGEX = CreateObject("vbscript.regexp")
    Texte = "numéro : 452 il s'agit de TARTENPION Alain"
    With REGEX
      .Pattern = "([A-Za-z:'é])" 'liste des expressions régulières à supprimer
      .IgnoreCase = True 'ignore la casse
      .Global = True
        Mon_Nombre = .Replace(Texte, "") * 1
    End With
End Sub

Cdlt

Un grand merci à vous trois,

Tulipe_4, ta formule, qui pour moi est complexe, doit j'en suis sur fonctionner mais je tiens à résoudre mon problème en VBA. Merci et bonne fin de journée

Arturo83 et Eric, je vous remercie également. Je vais regarder vos propositions de plus prêt afin de les comprendre

Bien cordialement à vous 3

Jacky

re

ok , reçu , pour le fun et pour d'autres en moins "complexe"

=STXT(B2;MIN(SI(ESTERREUR(STXT(B2;LIGNE($1:$200);1)*1);"";LIGNE($1:$200)));NB(SI(ESTERREUR(STXT(B2;LIGNE($1:$200);1)*1);"";LIGNE($1:$200))))

en gros , si on arrive a mulitiplier par 1 => ce sont des chiffres ; alors on demarre du premier , pour combien il y en a ;; bien entendu cela ne fonctionne que si il n'y a qu'une seule série de chiffres

cordialement

Je reviens vers vous,

Tulipe4, encore merci, mais je suis vraiment désolé je ne suis pas du tout à l'aise avec les formules, donc j'ai beaucoup de mal à comprendre ta formule

Eric, pour moi c'est parfait, je ne connaissais pas cette utilisation de la fonction "Split", surtout avec le petit plus (2) en fin d'écriture qui permet de ne considérer la 3ème partie tronquer grace aux " ", merci baeaucoup

Arturo83, ta proposition fonctionne également à merveille, mais je ne comprends pas le code, pourquoi dois-tu créer l'objet REGEX, pourquoi utiliser "Pattern" et "Global" et enfin je ne comprends pas la fonction replace qui selon moi a pour effet de remplacer une sous chaine par un autre, donc comment peut-elle extraire une partie de la chaîne ? également un grand merci

Bonjour à tous,

1) le 3ème paramètre de Mid() est optionnel. Si omis, c'est le reste de la chaine qui est prise.
(pense à utiliser F1 et l'aide des fonctions si tu débutes, on apprends pas mal par là)
2) Val() convertit en numérique uniquement les 1ers caractères numériques rencontrés.

Ce qui donne :

Dim s As String, a As Long
s = "numéro : 452 il s'agit de TARTENPION Alain"
a = Val(Mid(s, 10))

eric

Bonjour,

Arturo83, ta proposition fonctionne également à merveille, mais je ne comprends pas le code, pourquoi dois-tu créer l'objet REGEX, pourquoi utiliser "Pattern" et "Global" et enfin je ne comprends pas la fonction replace qui selon moi a pour effet de remplacer une sous chaine par un autre, donc comment peut-elle extraire une partie de la chaîne ? également un grand merci

Pour maîtriser les expressions régulières, il a plein de tutoriels qui traitent de ce sujet, je vous invite à faire des recherches si cela vous intéresse.

Je peux simplement vous dire(bien que mon exemple était commenté) que dans le pattern, j'ai saisi tout ce qui devait être supprimé et donc remplacé par des " ".

il suffit à la fin de remplacer ces espaces vides afin de ne conserver que les chiffres, mais le résultat obtenu étant du texte, je le multiplie par 1 pour le transformer en nombre.

C'est tout.

Cdlt

Bonjour Arturo,

Merci pour ces quelques explications supplémentaires.

Il est vrai qu'il existe de nombreux tutoriels traitant ce sujet, mais parmi tous ceux que j'ai trouvés je n'obtenais pas satiisfaction totale car je ne comprenais pas comment l'instruction "pattern" intervenait dans ce code (Pattern = "([A-Za-z:'é])")
Donc tous les caractères de A à Z, de a à z et le "é" seront remplacés par des espaces ce qui donnera par conséquent : " "452" "
Encore merci pour vos explications et croyez moi parfois il est préférable d'avoir un contact direct plutot que de faire des recherches souvent incomplètes et parfois nébuleuses.
Bon dimanche

Rechercher des sujets similaires à "tronquer chaine"