XL 2016 Problème Formule Excel

Dymouille

XLDnaute Nouveau
Hello le Forum,

Je galère sur une formule, j'aimerais extraire un nombre de 14 chiffres présent dans une chaine de caractère,
le problème est que ce nombre peut commencer soit par "07", "05" , "08" et "03" (en rouge)
et j'aimerais aussi extraire la chaine de caractère présente après ce fameux nombre (en vert)

Par Exemple :

aazaLALALALALAzezez 05901120025539 corriger le poids
eteLALALALALddA 07900023225528 corriger le poids pls
LALLALAzdaz 08900020025531 fausse hauteur
wswLALALALALA 03908020025531 attention poids

j'ai déjà réussi a extraire le nombre avec ceci :
Code:
=SIERREUR(STXT(A2;CHERCHE("07";A2);14);"")
mais ca prend en compte que les nombres commencant par "07", j'ai essayé avec la fonction "=OU" mais je plante!

merci !
 

Etoto

XLDnaute Barbatruc
Bonjour,

Fonction personnalisée publiée par @Magic_Doctor ;) et crée par @job75 qui extrait les nombres d'une chaine de caractères :

VB:
Function ExtractNumber(txt As String, Optional n As Byte = 1)
'Renvoie un nombre contenu dans une chaîne
'- txt : une chaîne contenant un ou plusieurs nombres
'- n   : numéro d'ordre du nombre recherché. Si omis, le 1er
' Ex : Combo208  -33,15 romina4 | n = 1 (ou omis) --> 208
'                                 n = 2 --> -33,15
'                                 n = 3 --> 4
'job75

Dim i%, t As String, u As String, s
    txt = Replace(txt, ",", ".")
    For i = 1 To Len(txt)
        t = Mid(txt, i, 1): u = Mid(txt, i, 2)
        If t <> "." And Not (t Like "#" Or u Like "-#") Then txt = Application.Replace(txt, i, 1, " ") 'fonction REMPLACER
    Next
    s = Split(Application.Trim(txt)) 'SUPPRESPACE
    If n - 1 > UBound(s) Then ExtractNumber = "" Else ExtractNumber = Val(s(n - 1))
End Function

Ou celle de @patricktoulon en collaboration avec @Yeahou et sur une base de @job75 qui est plus complète :

VB:
'******************************************************
'            FONCTION GetNumOnText
'auteur:Patricktoulon sur ExcelDownloads
'Date:19/09/2021
'la fonction retourne une matrice ou un item(NUMERIQUE!!!) du split d'une chaine Alphanumerique
'la matrice retourné peut etre un array ou un tableau 2 dim (vertical ou horizontal) ou une valeur de la matrice
'Attention a l'heure actuelle la matrice est en base 0 !!!!!
'------------------------------------------
'argument:
'argument(T) attend un string
'argument(Index) attend un chiffre)
'argument(ConvertNum) attend un boolean ou 0/1 en formule
'cet argument active la conversion numerique si virgule ou point  en separateur decimal dans l'item trouvé
'------------------------------------------

'-----------------------les formules:--------------------------
'--------------------------------------------------------------
'en matricielle horizontal ou vertical est la meme
' =GetNumOnText(SOURCE)| etendu sur x cellule verticalement ou horizontalement et VALIDE PAR CTRL+MAJ+ENTER
'SOURCE etant l'adresse d'une !! cellule
'--------------------------------------------------------------
'en mode unitaire
'=GetNumOnText(SOURCE;index)
'SOURCE étant l'adresse d'une cellule
'index etant un nombre correspondant a l index recherché
'ex: =GetNumOnText(A4:2) --->> la 3 eme valeur numerique dans la chaine qui se trouve en A4
'--------------------------------------------------------------


'test vba en matrice ou la  valeur d'un item
Sub test2()
    T$ = ",45/6bonj.our0,123"
    MsgBox GetNumOnText(T, 1)    'exemple récupération du 3eme nombre(le tableau est en base(0))
    MsgBox GetNumOnText(T)(1)    'exemple récupération du 2d item dans le !!!tableau complet !!!! en prenant l'index du 2d (base(0))
End Sub

Function GetNumOnText(ByVal T As String, Optional Index As Long = -1, Optional ConvertNum As Boolean = False)
    Dim I&, TbL
    If ConvertNum Then T = Replace(T, ",", ".")
    I = 1
    For I = I To Len(T)
        If Mid(T, I, 1) Like "[!0-9|.|,]" Then Mid(T, I, 1) = " "
        If Mid(T, I, 1) Like "[.|,]" Then If Mid(T, I - IIf(I > 1, 1, 0), 1) Like "[!0-9|]" Or Mid(T, I, 1) Like "[!0-9,.]" Then Mid(T, I, 1) = " "
 
    Next

    With Application
        If TypeName(.Caller) = "Range" Then
            'si la fonction a été appelée par une formule
            If Index = -1 Then 'si pas d'index demandé c'est une matricielle
                If .ThisCell.Offset(1).Formula = .ThisCell.Formula Then 'si matricielle verticale
                    GetNumOnText = .Transpose(Split(Application.Trim(T) & Application.Rept(" ", 1000)))
                Else
                    GetNumOnText = Split(Application.Trim(T) & Application.Rept(" ", 1000), " ") ' si matricielle horizontal

                End If
            Else
                'si index demandé et si le text n'est pas vide  return  de l'item demandé
                If T = "" Then GetNumOnText = "" Else GetNumOnText = Split(Application.Trim(T) & Application.Rept(" ", 1000), " ")(Index)
            End If

        Else
            ' si la fonction a été appelée par VBA
            If Index = -1 Then
                GetNumOnText = Split(Application.Trim(T), " ")
            Else
                GetNumOnText = Split(Application.Trim(T), " ")(Index)
            End If

        End If
    End With
End Function
 
Dernière édition:

Etoto

XLDnaute Barbatruc
Bonjour Etoto,

Merci pour tes solutions, mais j'ai oublié de précisé que parfois il peut y avoir des chiffres dans les chaines de caractères avant et après comme par exemple :


atatsiyq 999x12 tyzaa 05901120025539 corriger le poids
Alors si tes nombres commencent toujours par 0, ceci fonctionnera non ?
VB:
=SIERREUR(STXT(A2;CHERCHE("0";A2);14);"")
Et si y a un espace entre les nombres et les lettres :
VB:
=SIERREUR(STXT(A2;CHERCHE(" ";A2);14);"")
 
Dernière édition:

Statistiques des forums

Discussions
312 215
Messages
2 086 326
Membres
103 180
dernier inscrit
Vcr