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

Macros et VBA Excel Discussion :

Extraction des chiffres pour créer un nombre dans une chaîne alphanumérique


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Extraction des chiffres pour créer un nombre dans une chaîne alphanumérique
    Bonjour,

    Je souhaiterais extraire uniquement les chiffres contenu dans plusieurs cellules pour ensuite pouvoir les comparer.
    Je souhaite intégrer cela dans une macro VBA.

    par exemple, j'ai ARF234 et df234 dans deux cellules différentes. Le but étant que si le nombre créé par les chiffres extraits dans les 2 cellules sont les mêmes (ici ce sera donc 234) alors la condition est vrai et donc action.

    Quelqu'un peut-il m'aider pour effectuer cette extraction et surtout bien obtenir deux chiffres à comparer (sachant qu'il faut aussi que je considère peut-etre le cas où certaines cellules ne contiennent pas de chiffres)?

    Bonne journée

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    Une solution consiste a se créer sa propre fonction

    Cette proposition retourne EGAL si identique sinon PAS EGAL

    A mettre dans un module
    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
    Function CompareNombre(rg1 As Range, rg2 As Range) As String
     
    Dim Lng1 As Long
    Dim Lng2 As Long
     
    Dim i As Integer
     
    For i = 1 To Len(rg1.Value)
        If IsNumeric(Mid(rg1.Value, i, 1)) Then Lng1 = Lng1 & Mid(rg1.Value, i, 1)
    Next i
    For i = 1 To Len(rg2.Value)
        If IsNumeric(Mid(rg2.Value, i, 1)) Then Lng2 = Lng2 & Mid(rg2.Value, i, 1)
    Next i
     
    CompareNombre = IIf(Lng1 = Lng2, "EGAL", "PAS EGAL")
     
    End Function
    A utiliser en formule

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut heu...!!!
    bonjour nimiquel

    pour jfontaine

    ca marche mieux comme ca

    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
     
     
    Function CompareNombre(rg1, rg2) As String
     
    Dim Lng1 As Long
    Dim Lng2 As Long
     
    Dim i As Integer
     
    For i = 1 To Len(rg1.Value)
        If IsNumeric(Mid(rg1.Value, i, 1)) Then Lng1 = Lng1 & Mid(rg1.Value, i, 1)
    Next i
    For i = 1 To Len(rg2.Value)
        If IsNumeric(Mid(rg2.Value, i, 1)) Then Lng2 = Lng2 & Mid(rg2.Value, i, 1)
    Next i
     
    CompareNombre = IIf(Lng1 = Lng2, "EGAL", "PAS EGAL")
     
    End Function
    Sub voyons_si_c_est_egal()
    lareponse = CompareNombre(Range("A1"), Range("A2"))
    MsgBox lareponse
    End Sub

    au plaisir

  4. #4
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Salut Patrick

    Que veux tu dire par
    ca marche mieux comme ca

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bon je suis mauvais en codage mais comment intégrer votre fonction dans mon if?

    Voici le code alors le if de départ qui ne marchait pas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        For nw = 2 To Nb_Lignes
            For nz = 2 To Nb_LigneC
     
    If (Sheets("Global").Range("G" & nw) Like Sheets("EPR").Range("F" & nz)) Then
     
    Sheets("Global").Range("P" & nw) = Sheets("EPR").Range("F" & nz)
    Sheets("Global").Range("Q" & nw) = Sheets("EPR").Range("G" & nz)
    Sheets("Global").Range("R" & nw) = Sheets("EPR").Range("H" & nz)
    Sheets("Global").Range("S" & nw) = Sheets("EPR").Range("AX" & nz)
     
    End If
     
            Next nz
        Next nw
    Merci encore pour l'aide.

  6. #6
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Essais comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If CompareNombre(Sheets("Global").Range("G" & nw),Sheets("EPR").Range("F" & nz)) = "EGAL" then

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonjour jfontaine

    j'ai essayer ton code comme tu l'a donné et visiblement les variables

    n'etait pas pris en compte comme elle devait l'etre
    d'ou le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lareponse = CompareNombre(Range("A1"), Range("A2"))
    a la place de ta version

    en ayant le type de variable dans la fonction et non dans l'appel a la fonction

    au plaisir

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Il me sort une "incompatibilté de type" sur la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 1 To Len(rg1.Value)
    Je crois comprendre que cela arrive lorsque je n'ai pas de chiffre dans ma chaîne de caractère ou que la cellule est vide.
    Sinon je crois que ça marche sans problème.
    Ca mérite une condition supplémentaire c'est ça? Vous avez une piste?

  9. #9
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Ca mérite une condition supplémentaire c'est ça?
    Dans le cas une cellule vide on aura
    D'ou un problème car le pas d'avancement d'une boucle For est + 1

    Ajoutes un test de contrôle que tes cellules sont bien pleines
    Ce test peut être ajouté à la fonction

  10. #10
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    Tu peux utiliser aussi la fonction val et t'inspirer de la partie "Extraire toutes les valeurs numériques (entiers et décimales) contenues dans une chaîne" de ce tutoriel sur la manipulation des chaines de caractères: http://silkyroad.developpez.com/VBA/...racteres/#LI-P

    Cordialement.

  11. #11
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    La fonction de Jérôme marche très bien, une variante avec "Instr" :
    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
     
    Function CompareNombre(rg1 As Range, rg2 As Range) As String
     
        Dim Lng1 As Long
        Dim Lng2 As Long
     
        Dim i As Integer
     
        For i = 1 To Len(rg1.Value)
            If InStr("0123456789", (Mid(rg1.Value, i, 1))) <> 0 Then Lng1 = Lng1 & Mid(rg1.Value, i, 1)
        Next i
     
        For i = 1 To Len(rg2.Value)
            If InStr("0123456789", (Mid(rg2.Value, i, 1))) <> 0 Then Lng2 = Lng2 & Mid(rg2.Value, i, 1)
        Next i
     
        CompareNombre = IIf(Lng1 = Lng2, "EGAL", "PAS EGAL")
     
    End Function
    Hervé.

  12. #12
    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
    Bonjour un tous
    Une autre proposition utilisant les expressions régulières (Nécessite l'activation de la référence VBScript Regular Expressions 5.5)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'Nécessite l'activation de la référence VBScript Regular Expressions 5.5
    Function Comp(ByVal MotA As String, ByVal MotB) As Boolean
    Dim Reg As New VBScript_RegExp_55.RegExp
     
    With Reg
        .Pattern = "\D"
        .Global = True
        MotA = .Replace(MotA, "")
        MotB = .Replace(MotB, "")
    End With
    Set Reg = Nothing
    Comp = MotA = MotB
    End Function
    La fonction Comp retourne True si MotA et MotB contiennent le même nombre après élimination de tous les autres caractères.

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonjour

    pour mercatog

    waouahh!! ca c'est du costaud je garde!!!

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Je viens d'essayer la méthode de Theze (et de Jérome) et ça marche mieux mais pas lorsqu'une des cellules est vide.
    Pour la méthode de mercatog, je crois tout simplement que je n'ai pas la possibilité d'activer VBScript_RegExp_55.RegExp ... dommage!
    Mais merci pour tout.

  15. #15
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Je viens d'essayer la méthode de Theze (et de Jérome) et ça marche mieux mais pas lorsqu'une des cellules est vide.
    Adapte le code pour prendre en compte ce cas.
    Soit dans la fonction, soit avant l'appel de la fonction

  16. #16
    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
    Bonjour
    Pour ne pas activer la référence, la même fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function Comp(ByVal MotA As String, ByVal MotB) As Boolean
    Dim Reg As Object
     
    Set Reg = CreateObject("vbscript.regexp")
    With Reg
        .Pattern = "\D"
        .Global = True
        MotA = .Replace(MotA, "")
        MotB = .Replace(MotB, "")
    End With
    Set Reg = Nothing
    Comp = MotA = MotB
    End Function

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Salut Mercatog,

    Comment intégrer ta fonction dans ma macro ?
    Je suppose que c'est du genre:
    mais je ne vois pas ce que la fonction renvoie.

    Merci

  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
    Relis plus haut
    La fonction Comp retourne True si MotA et MotB contiennent le même nombre après élimination de tous les autres caractères.
    Type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim Str1 as string, Str2 as string
    Str1="élém2_ 36 B 5"
    Str2="2AB3_vg65Mta"
    If Comp(Str1,Str2) Then
       Msgbox "Même nombres contenus dans les 2 chaînes"
    else
       Msgbox "Nombres contenus sont différents"
    end if
    Remarque, Si les 2 chaines ne contiennent pas de chiffres ou l'une ne contient pas de chiffres et l'autre vide alors Comp est aussi true

  19. #19
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonjour mercatog

    purrée ci avec ca il ne s'en sort pas !

    une question, a quoi sert le "\D" .moi vouloir apprendre

    au plaisir

  20. #20
    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
    Bonjour Patrick
    Plutôt je donnerai un lien intéressant: Les Expressions Rationnelles appliquées en VBA Access Par Charles A

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [RDF] Extraction des concepts pour un terme à partir d'une ontologie ODP
    Par khaled87 dans le forum Ontologies
    Réponses: 0
    Dernier message: 05/03/2014, 10h11
  2. Incrémenter des nombres dans une chaîne
    Par shaun_the_sheep dans le forum SQL
    Réponses: 19
    Dernier message: 25/04/2012, 10h46
  3. Récupérer un nombre dans une chaîne de caractères
    Par yougoudai dans le forum Général Python
    Réponses: 9
    Dernier message: 23/09/2007, 21h01
  4. [MySQL] Récupérer un nombre dans une chaîne
    Par Phenol dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/03/2007, 21h28
  5. Réponses: 2
    Dernier message: 15/10/2005, 23h29

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