Casser chaîne caractère

Bonjour,

J’ai un catalogue produit avec une colonne référence. Dans cette colonne , j’ai des références tel que FX450, BPA10, LC2905

Je veux savoir si il serait possible de séparer les chiffres et les lettres pour créer 2 colonnes supplémentaires, une colonne avec FX et BPA et la deuxième colonne avec chiffre correspondant.

Merci à vous

Sylvain

Bonsoir syl20, le forum,

Formules :

Pour les lettres : =STXT(cellule;1;2)

Pour les chiffres : =STXT(cellule;3;3)

Cordialement,

Bernard

Erreur : Ces deux formules ne fonctionnent que dans l'hypothèse ou les 2 premiers caractères sont des lettres.

Voir fichier ci-joint.

J'ai lu ta demande un peu trop vite.

Mille excuses

41syl20-1.xls (13.50 Ko)

Bonjour,

Compte tenu que le nombre de lettres peut être variable, une solution avec deux formules matricielles :

Ton code en A1.

En B1 :

=GAUCHE(A1;EQUIV(VRAI;ESTNUM(STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1)*1);0)-1)

En C1 :

=STXT(A1;EQUIV(VRAI;ESTNUM(STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1)*1);0);99)

Formules matricielles à valider par CTRL + MAJ + ENTREE

Je te laisse tester

@+

Bonjour

Tu peux faire l'économie de la seconde matricielle en C1 avec

=SUBSTITUE(A1;B1;"")

Cordialement

34syl20-2.xls (13.50 Ko)

Bonsoir à tous,

J'ai un peu souffert sur ce coup là ! mais c'est comme çà qu'on apprend

le code devrait pouvoir s'améliorer

Amicalement

Claude

30syl20.zip (13.00 Ko)

Bonsoir à tous,

Une autre méthode par vba combinant deux fonctions biens utiles dans ce cas-là : StrReverse (qui inverse une chaîne de caractères) et Val (qui renvoie le nombre contenu dans une chaîne de caractère). A savoir que la fonction Val arrête la lecture de la chaîne au premier caractère ne faisant apparemment pas partie d'un nombre. (Source : aide excel vba)

D'où l'utilisation de la fonction StrReverse :

Sub test()
Dim i As Integer, posChiffre As Byte, Cel As String, lettre As String, chiffre As String
    Application.ScreenUpdating = False
    For i = 1 To Range("A65536").End(xlUp).Row
        Cel = Cells(i, 1)
        If Cel <> "" Then
            posChiffre = InStr(Cel, StrReverse(Val(StrReverse(Cel)))) - 1
            lettre = Left(Cel, posChiffre)
            chiffre = Replace(Cel, lettre, "")
            Range("B" & i & ":C" & i).Value = Array(lettre, chiffre)
        End If
    Next i
End Sub

Les données à séparer se trouvent dans la colonne A et doivent commencer par une lettre.

Bonjour,

Pour le fun(...), 2 fonctions personnalisées avec des expressions régulières en guise d'apéritif

Function extrait_chiffres(ByRef texto As String) As Long
    Dim reg As Object
    Dim extraction As Object

    Set reg = CreateObject("vbscript.regexp")
    reg.Global = True
    reg.Pattern = "(\d?\d?\d)"
    Set extraction = reg.Execute(texto)
    For Each digit In extraction
        extrait_chiffres = extrait_chiffres & (digit.Value)
    Next digit
    Set extraction = Nothing
    Set reg = Nothing
End Function

Function extrait_lettres(ByRef texto As String) As String
Dim reg As Object
Dim extraction As Object
    Set reg = CreateObject("vbscript.regexp")
    reg.Global = True
    reg.Pattern = "(\D)"
    Set extraction = reg.Execute(texto)
    For Each digit In extraction
        extrait_lettres = extrait_lettres & (digit.Value)
    Next digit
    Set extraction = Nothing
    Set reg = Nothing
End Function

Bonjour michel,

Ton code a l'air intéressant ! Peux-tu y mettre 2-3 explications ?

re

Function extrait_chiffres(ByRef texto As String) As Long
    Dim reg As Object
    Dim extraction As Object

    Set reg = CreateObject("vbscript.regexp")
    'on travaille sur toute la cellule
    reg.Global = True
    'le modèle est des caractères "digitaux ("d") à n chiffres (d?\)
    reg.Pattern = "(\d?\d?\d)"
    ' éxécute l'extraction svt modèle (collection des digits...)
    Set extraction = reg.Execute(texto)
    For Each digit In extraction
        ' concaténète les membres de la collection "extraction"
        extrait_chiffres = extrait_chiffres & (digit.Value)
    Next digit
    Set extraction = Nothing
    Set reg = Nothing
End Function

pour extrait_lettre

D majuscule signifie "pas de caractères digitaux"

une utilisation intéressante des expressions régulières (ou relationnelles)est la vérification de la saisie de la syntaxe d'un e-mail (on les retrouve souvent sur les sites web mais pas en VBa!):

Private Function verifier_syntaxe_mel(mel As String) As Boolean
     Dim reg As Object
     Dim verif As Object

     Set reg = CreateObject("vbscript.regexp")
     reg.Global = False
     'admet les majuscules
     reg.IgnoreCase = True

     reg.Pattern = "^[a-z0-9_.-]+@[a-z0-9.-]{2,}\.[a-z]{2,3}$"
     Set verif = reg.Execute(mel)
     verifier_syntaxe_mel = (verif.Count = 1)

     Set verif = Nothing
     Set reg = Nothing
End Function

edit: code écrit à plusieurs sur XLD

Tu devines que la prise de tête est d'écrire un modèle "pattern" correct !

Bon WE

Merci pour toutes ces infos ! Encore une fois, très intéressant tout ça

listeder

Je vous remercie vraiment , j'apprécie beaucoup votre aide vous m'avez fais gagner un temps précieux (12000 références)

Bravo à vous tous

N'oublie pas

a resolu2
Rechercher des sujets similaires à "casser chaine caractere"