IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

extraire les chiffres d'une cellule [Toutes versions]


Sujet :

Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Décembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Rédacteur technique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2013
    Messages : 19
    Points : 12
    Points
    12
    Par défaut extraire les chiffres d'une cellule
    Bonjour à tous,
    Il existe de nombreuses solutions mais aucune ne me va bien.

    Comment affecter à x la valeur de toutes les lettres de l’alphabet et les caractère "-" et "_"

    Je recherche les chiffres de droite dans une cellule et à les extraire dans la cellule suivante
    Ci-dessous des valeurs d'exemple
    s1 => extraire 1
    trz12 => extraire 12
    da-35 => extraire 35
    trv- 54 => extraire 54
    vtr2_10 => extraire 10
    bv2a-5 => extraire 5
    b2-4a => extraire 4a (pour ici pas grave si ça ne marche pas).

    Mon problème est que je n'ai pas toujours un espace ou un tiret ou autre chose comme repère, cela peut-être un caractère ou n'importe quelle lettre qui précède les chiffres, et je n'ai pas trouvé malqué de nombreuse recherche.
    Voici ma macro actuelle.
    Merci pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub ordre()
     
    Dim Cellule As Range
     Dim txt As String
     Dim x As Variant
     For Each Cellule In Selection
     
      txt = Cellule.Text
      x = Split(txt, "a") 'la macro ne cherche que la valeur a, je veux tout chercher sauf de 1 à 9
      Cellule.Offset(0, 1) = x(UBound(x))
     
     Next Cellule
     
    End Sub

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Function NumChaineDernOccur(chaine)
      longueur = Len(chaine): If longueur = 0 Then NumChaineDernOccur = 0: Exit Function
      temp = ""
      p = longueur
      Do While Not IsNumeric(Mid(chaine, p, 1)) And p > 1
        p = p - 1
      Loop
      Do While IsNumeric(Mid(chaine, p, 1)) And p > 0
        temp = Mid(chaine, p, 1) & temp
        p = p - 1: If p = 0 Then Exit Do
      Loop
      NumChaineDernOccur = Val(temp)
    End Function
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Function Num(chaine)
      Set obj = CreateObject("vbscript.regexp")
      obj.Global=True
      obj.Pattern = "\d+"
      Set a = obj.Execute(chaine)
      If a.Count > 0 Then Num = Val(a(a.Count - 1)) Else Num = 0
    End Function
    Jacques Boisgontier
    Fichiers attachés Fichiers attachés

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une autre solution que celle de Jacques mais moins compacte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Function RechercheChiffres(ByVal CelluleTestee As Range) As String
     
    Dim Ctr As Long
    Dim PositionPremierChiffre As Long
    Dim Continuer As Boolean
     
     Continuer = True
     RechercheChiffres = ""
     Select Case Len(CelluleTestee)
      Case 2
     
        For Ctr = Len(CelluleTestee) To 1 Step -1
            Select Case Mid(CelluleTestee, Ctr, 1)
                Case 0 To 9
                    PositionPremierChiffre = Ctr
                Case Else
                    Exit For
            End Select
        Next Ctr
        RechercheChiffres = Mid(CelluleTestee, PositionPremierChiffre)
     
      Case Is > 2
            ' Cas avec dernier caractère comme chiffre
            For Ctr = Len(CelluleTestee) To 1 Step -1
                Select Case Mid(CelluleTestee, Ctr, 1)
                    Case 0 To 9
                        PositionPremierChiffre = Ctr
                        Continuer = False
                    Case Else
                        Exit For
                End Select
            Next Ctr
            If Continuer = False Then
                RechercheChiffres = Mid(CelluleTestee, PositionPremierChiffre)
            Else
                ' Pour prendre en compte les cas d'une valeur alphanumérique en dernier caractère
                For Ctr = Len(CelluleTestee) - 1 To 1 Step -1
                    Select Case Mid(CelluleTestee, Ctr, 1)
                        Case 0 To 9
                            PositionPremierChiffre = Ctr
                        Case Else
                            Exit For
                    End Select
                Next Ctr
                RechercheChiffres = Mid(CelluleTestee, PositionPremierChiffre)
            End If
     End Select
     
    End Function
    Vous n'indiquez pas le cas 1S, ma fonction ne fonctionne pas pour ce cas.

    Cordialement.

  4. #4
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Il faudrait peut-être passer par le code ASCII des caractères, et faire une boucle sur tous les caractères en partant de la fin.

    Un truc dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub toto()
    For i = 1 To 2
        nb = 0
        For j = Len(Range("A" & i).Value) To 1 Step -1
            If Asc(Mid(Range("A" & i).Value, j, 1)) >= 48 And Asc(Mid(Range("A" & i).Value, j, 1)) <= 57 Then
                nb = nb + 1
            End If
        Next j
        Range("B" & i).Value = Right(Range("A" & i).Value, nb)
    Next i
    End Sub
    EDIT : quelle synchro, 3 réponses en meme temps
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Eric KERGRESSE Voir le message


    Vous n'indiquez pas le cas 1S, ma fonction ne fonctionne pas pour ce cas.

    Cordialement.
    Correction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Function RechercheChiffres(ByVal CelluleTestee As Range) As String
     
    Dim Ctr As Long
    Dim PositionPremierChiffre As Long
    Dim Continuer As Boolean
     
     Continuer = True
     RechercheChiffres = ""
     
            ' Cas avec dernier caractère comme chiffre
            For Ctr = Len(CelluleTestee) To 1 Step -1
                Select Case Mid(CelluleTestee, Ctr, 1)
                    Case 0 To 9
                        PositionPremierChiffre = Ctr
                        Continuer = False
                    Case Else
                        Exit For
                End Select
            Next Ctr
            If Continuer = False Then
                RechercheChiffres = Mid(CelluleTestee, PositionPremierChiffre)
            Else
                ' Pour prendre en compte les cas d'une valeur alphanumérique en dernier caractère
                For Ctr = Len(CelluleTestee) - 1 To 1 Step -1
                    Select Case Mid(CelluleTestee, Ctr, 1)
                        Case 0 To 9
                            PositionPremierChiffre = Ctr
                        Case Else
                            Exit For
                    End Select
                Next Ctr
                RechercheChiffres = Mid(CelluleTestee, PositionPremierChiffre)
            End If
     
    End Function

  6. #6
    Membre à l'essai
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Décembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Rédacteur technique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2013
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup pour toutes ces réponses et la rapidité.
    je vais éplucher et vous dire ce qui est bien pour moi.
    je valide résolu dès que c'est bon (peut-être pas ce jour) ...

  7. #7
    Membre à l'essai
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Décembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Rédacteur technique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2013
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Finalement je n’ai pas résisté à la tentation de tester.
    Je prends la solution d’Eric.
    Merci à tous.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Décembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Rédacteur technique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2013
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Encore moi,
    Bien, après pas mal de test je me suis fixé sur la solution de Jacques.
    Elle ne prends pas en compte l'éventuelle dernière lettre mais me permet un trie numérique à la suite.
    Et ne signale pas d'erreur si la cellule à convertir est vide.
    Dans tout les cas les deux sont top.
    Encore mille merci.
    Et tous mes voeux pour 2014.

  9. #9
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Bonjour,

    voici une autre fonction, prenant en compte la dernière lettre et ne renvoyant pas d'erreur si cellule vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function RightNum$(ByVal TX$)
        If TX = "" Then Exit Function
        TX = Trim$(Split(TX, "-")(UBound(Split(TX, "-"))))
        D$ = Right$(TX, 1):  If IsNumeric(D) Then D = "" Else TX = Left$(TX, Len(TX) - 1)
        L& = Len(TX)
     
        Do While C& < L And V& = 0
            C = C + 1:  V = Not IsNumeric(Right(TX, C))
        Loop
     
        If C + V > 0 Then RightNum = Right$(TX, C + V) & D
    End Function
    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  10. #10
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Désolé pour les modifications à rallonge (optimisation …) mais je désirais terminer l'année en beauté !






    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  11. #11
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Pour proposer ma grain de sel, les Regexp "mélangée" à StrReverse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function ExtractLastNumber(ByVal Tmp As String) As String    'As Integer
    Dim Rg As Object
     
    Set Rg = CreateObject("VBScript.RegExp")
    With Rg
        .Pattern = "(\D*)(\d+)(.*)"
        If .Test(Tmp) Then ExtractLastNumber = StrReverse(.Replace(StrReverse(Tmp), "$2"))
    End With
    Set Rg = Nothing
    End Function
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  12. #12
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Function DernierNum(chaine)
      Set obj = CreateObject("vbscript.regexp")
      obj.Global = True
      obj.Pattern = "\d+"
      Set a = obj.Execute(chaine)
      If a.Count > 0 Then DernierNum = Val(a(a.Count - 1)) Else DernierNum = 0
    End Function
    Jacques Boisgontier
    Fichiers attachés Fichiers attachés

  13. #13
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Ah la puissance des expressions régulières !

    J'ai respecté l'énoncé du départ :
    Citation Envoyé par Timi493 Voir le message
    b2-4a => extraire 4a
    Comment auriez-vous fait en utilisant les expressions régulières ?

    J'ai supposé de ne rien renvoyer si la cellule contient par exemple c3-b mais peut-être suis-je dans l'erreur …

    Quoiqu'il en soit avec cinq méthodes, il a le choix !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  14. #14
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    Comment auriez-vous fait en utilisant les expressions régulières ?
    Bonjour Marc et mes souhaits pour une nouvelle année pleine de bonnes choses et de paix

    Pour ta question ci-haut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function ExtractLastNumber(ByVal Tmp As String) As String
    Dim Rg As Object
     
    Set Rg = CreateObject("VBScript.RegExp")
    With Rg
        .Pattern = "([A-Z:a-z]*)(\d+)(.*)"
        If .Test(Tmp) Then ExtractLastNumber = StrReverse(.Replace(StrReverse(Tmp), "$1$2"))
    End With
    Set Rg = Nothing
    End Function
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  15. #15
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Merci !

    Dire que je les utilisais dans un autre langage (genre instruction GREP ?) mais cela fait des lustres !

    Je devrais bien m'y coller en VBA (de plus il y a un tutoriel ici) mais avant d'avoir le réflexe, les vieilles habitudes …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  16. #16
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonsoir,

    RegExp est puissant mais n'est pas très rapide (60 fois plus lent pour la fonction étudiée)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Function NumChaineDernOccur(chaine)
      longueur = Len(chaine): If longueur = 0 Then NumChaineDernOccur = 0: Exit Function
      temp = ""
      p = longueur
      Do While Not IsNumeric(Mid(chaine, p, 1)) And p > 1
        p = p - 1
      Loop
      Do While IsNumeric(Mid(chaine, p, 1)) And p > 0
        temp = Mid(chaine, p, 1) & temp
        p = p - 1: If p = 0 Then Exit Do
      Loop
      NumChaineDernOccur = Val(temp)
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Function DernierNum(chaine)
      Set obj = CreateObject("vbscript.regexp")
      obj.Global = True
      obj.Pattern = "\d+"
      Set a = obj.Execute(chaine)
      If a.Count > 0 Then DernierNum = Val(a(a.Count - 1)) Else DernierNum = 0
    End Function
    Jacques Boisgontier

  17. #17
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Merci Jacques de l'info !

    Donc je peux rester satisfait de la mienne ! …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  18. #18
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Pour la rapidité comme ça dans l'absolu des RegExp par rapport aux boucles sur chacun des caractères reste relative.

    Il suffit de refaire le test avec des données comportant beaucoup de caractères à boucler (ici les valeurs numériques).

    Bon dans la réalité de telles données sont peu probables.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. extraire uniquement les chiffres d'une cellule
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/08/2017, 18h25
  2. extraire les chiffres d'une chaine en bash
    Par zerros dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/12/2011, 21h40
  3. Réponses: 11
    Dernier message: 23/07/2010, 11h16
  4. [MySQL] extraire les chiffres d'une chaine
    Par megane dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/08/2006, 14h29
  5. [Tableaux] Extraire les chiffres dans une chaîne
    Par Digiduck dans le forum Langage
    Réponses: 8
    Dernier message: 16/08/2006, 14h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo