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 :

Différencier 1 et 10 dans une formule [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 11
    Par défaut Différencier 1 et 10 dans une formule
    Bonjour,

    dans mon programme j'ai besoin d'extraire uniquement le chiffre contenu dans une cellule qui elle contient lettres et chiffres.

    voici comment je procède :

    Je fait une boucle pour "scanner" les cellules en question et j'applique cette formule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pos = InStr(Range("N" & j).Value, i)
     
                If pos > 0 Then
     
                contenu = Range("N" & j).Value
                pos2 = Mid(contenu, pos, 1)
     
                End If
    celà fonctionne bien pour un chiffre de 1 à 9, pos2 me renvoi le bon chiffre mais lorsque j'ai 10 dans la cellule scannée, le prgomme prends également le 1..

    Auriez-vous une astuce?

    Merci!

  2. #2
    Membre éprouvé
    Inscrit en
    Mai 2011
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 85
    Par défaut
    Je suis pas sûr d'avoir bien compris, mais si tu veux extraire un chiffre d'une chaine de caractere tu as la fonction val() qui fait le boulot toute seule.

    En tout cas cette fonction devrait te simplifier la tache.

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

    Avec une fonction à condition que les chiffres se suivent. S'il y a plusieurs séries de chiffres, c'est la première qui sera prise en compte.

    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
     
    Function RechercheDeNombres(Cellule As Range)
     
    Dim NbChiffres As Integer
    Dim I As Integer
    Dim J As Integer
     
        RechercheDeNombres = 0
     
        If Len(Cellule) > 0 Then
     
            NbChiffres = 0
     
            For I = 1 To Len(Cellule)
                Select Case Mid(Cellule, I, 1)
                    Case 0 To 9
                        NbChiffres = NbChiffres + 1
                End Select
            Next I
     
            Select Case NbChiffres
                Case 1
                     For I = 1 To Len(Cellule)
                        Select Case Mid(Cellule, I, 1)
                           Case 0 To 9
                               RechercheDeNombres = Val(Mid(Cellule, I, 1))
                        End Select
                     Next I
                 Case Len(Cellule)
                        RechercheDeNombres = Val(Cellule)
                 Case Else
                      For J = NbChiffres To 1 Step -1
                          For I = 1 To (Len(Cellule) - J)
                              Select Case Val(Mid(Cellule, I, J))
                                 Case Is > 0
                                      RechercheDeNombres = Val(Mid(Cellule, I, J))
                                      Exit For
                              End Select
                          Next I
                          If RechercheDeNombres > 0 Then Exit For
                      Next J
     
            End Select
     
        End If
     
    End Function

    Cordialement.
    Dernière modification par Invité ; 22/05/2013 à 12h44.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 11
    Par défaut
    merci pour ta réponse mais ce n'est pas trop ce que je recherche (je vais quand même essayer de gratter avec val())

    Je résume grossomodo ce sur quoi je bute..

    En faite je peux avoir plusieurs chiffres dans une cellule. Et contrairement à la fonction val() qui extrait tous les chiffres je veux que chaque chiffre de la cellule soit extrait de la manière suivante :

    J'ai une boucle i = 1 à 50 par exemple et ce qu'il me faut c'est lorsque i est dans la cellules, mettre la valeur de i dans une "variable" ou une autre cellule.

    seulement quand par exemple il y a 10 dans la celulle scannée et que i = 1, ca me renvoi quand même la valeur puisque je ne peux pas différencier le chiffre 1 du 1 du nombre 10...

    C'est plus clair? Je mettrais un exemple en PJ sinon.

    Merci!

    pardon Erik je n'avais pas vu ta réponse avant de poster...

    J'étudie ce que tu me propose. Merci en tout cas!

  5. #5
    Membre éprouvé
    Inscrit en
    Mai 2011
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 85
    Par défaut
    Ok. En gros il faut que tu parcours ta chaine de caractère jusqu'à trouvé un chiffre, puis une fois que tu as trouvé un chiffre que tu cherche si le prochain caractère est un chiffre jusqu'à ce que ça n'en soit pas un.

    Un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for i=1 to len(cells(...).value)
        if isnumeric(mid(cells(...).value,i,i)) then
             finchiffre=i
             while isnumeric(mid(cells(...).value,finchiffre+1,finchiffre+1)) then
                 finchiffre=finchiffre+1
             wend
        end if
        chiffre=mid(cells(...).value,i,finchiffre)
        i=finchiffre
    Next i
    Après tu préfererais peut-être récupérer tes chiffres dans un tableau. Enfin la structure doit fonctionner.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    389
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 389
    Par défaut
    Bonjour,

    Si j'ai bien compris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function sc(Cellule As Range) 
    Dim Matches
        With CreateObject("vbscript.regexp")
        .Global = False
        .Pattern = "\d{1,}"
        Set Matches = .Execute(Cellule.Text)
            If Matches.Count >= 1 Then sc = Matches(0) * 1  
        End With
    End Function
    JP

  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
    Billets dans le blog
    8
    Par défaut heu
    bonjour
    essaie ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub recup_le_chiffres()
    MsgBox resultat([a5])' adapte la cellule a ton cas 
    End Sub
    Public Function resultat(cel As Range)
    Do
    i = i + 1
    If IsNumeric(Mid(cel.Value, i, 1)) Then resultat = resultat & Mid(cel.Value, i, 1)
    Loop Until i = Len(cel.Value)
    End Function
    Au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut differencier 1 et 10 dans une formule
    bonjour Patrick et Pmp87,

    Patrick :
    La cellule testée contient chiffre et lettre d'après le premier message.

    Par conséquent si la cellule contient "a10bc25d" taproposition renverra "1025".

    je pense que Pmp87 souhaite n'extraire que 10 et 25 (chaque série de chiffre qui se suivent).

    JPierreM :
    Ton code répond bien au problème tel que je l'ai compris.

    j'aimerai bien, pour ma culture, que tu explique un peu ce code que je ne comprend pas.

    cordialement.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    389
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 389
    Par défaut
    Bonsoir,

    J’ai utilisé les expressions régulières, d’autres diront rationnelles.

    Dans l’expression « \d{1,} »
    \d signifie n’importe quel chiffre,
    {1,} signifie ce qui précède se répète 1 fois ou plus
    Donc en fait on demande de rechercher n’importe quel chiffre qui peut être suivi d’autant de chiffres que l’on veut

    « \d{1,} » peut aussi s’écrire « [0-9]+ »
    Dans ce cas [0-9] signifie un chiffre compris entre 0 et 9
    Le + signifie ce qui précède se répète 1 fois ou plus

    Sur le net on trouve des explications plus claires que ce que je pourrai dire
    Quelques liens

    http://cafeine.developpez.com/access/tutoriel/regexp/
    http://www.regular-expressions.info/dates.html

    Bon courage

    JP

  10. #10
    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
    Billets dans le blog
    8
    Par défaut re
    Citation Envoyé par nibledispo Voir le message
    bonjour Patrick et Pmp87,

    Patrick :
    La cellule testée contient chiffre et lettre d'après le premier message.

    Par conséquent si la cellule contient "a10bc25d" taproposition renverra "1025".

    je pense que Pmp87 souhaite n'extraire que 10 et 25 (chaque série de chiffre qui se suivent).

    cordialement.
    ok et que veut il faire avec 10 et 25 ???????
    il les veut separés??
    comment??,
    par quoi??
    dans deux variables différentes ???
    etc....

    Edit:
    je viens d'essayer la version de jpierre elle ne donne que la 1 ere serie de chiffre de la chaine de caractères en gros "val" fait la meme chose
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut differencier 1 et 10 dans une formule
    bonjour,

    JPierreM : merci pour tes explications que je vais approfondir en regardant les deux adresses auxquelles tu me renvoies.

    Patrick : j'ai bien écrit "tel que je l'ai compris". Comme toi, je ne sais exactement ce qui est demandé ne connaissant pas la composition de la variable analysée.

    Ton code convient si cette variable ne peut contenir 2 séries de chiffres séparées.
    Quant à la fonction val, elle demeure pour moi un mystère :
    D'après mon livre, elle devrait extraire 10 de ("a10bc20g"), or elle me renvoie 0.
    Par contre, elle extrait bien 10 si je supprime le a de la chaine.
    Mieux encore : Si j'écris val (b3) en supposant que la chaine soit dans la cellule b3, elle me renvoie 0 dans les deux cas.

    cordialement.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 11
    Par défaut
    Bonsoir,

    Nibledispo à bien compris ce que je recherche. J'ai essayé la fonction de JPierreM
    et cela fonctionne mais seulement pour le premier chiffre (si j'ai sd21 sd54 dans une même cellule seul le21 s'affiche)

    j'ai résolu mon problème. J'ai réussi à mettre un "." collé à chaque chiffre ou nombre dans mes cellules à scanner (par exemlpe : dsf1. sdf10.) puis en utilisant la fonction len(i) avec i pouvant être 1 comme 10 cela m’extrait correctement le bon chiffre.


    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
    For j = 2 To 7
     
        For i = 1 To 15
     
            pos = InStr(Range("N" & j).Value, i & ".")
     
                If pos > 0 Then
     
                contenu = Range("N" & j).Value
                pos2 = Mid(contenu, pos, Len(i))
     
                    If Range("R" & pos2 + 1).Value = 0 Then
                    Range("R" & pos2 + 1).Value = TEMP
                    TEMP = TEMP + 1
                    End If
     
                End If
     
        Next i
     
    Next j

    Merci de vos réponses , cela m'a bien aiguillé et me permettra surement d'optimiser mon code quand je finaliserai le tout car trop de code tue le code

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    389
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 389
    Par défaut
    Bonjour,

    Pour la fonction Val, l'aide nous dit :
    "La fonction Val arrête la lecture de la chaîne au premier caractère ne faisant apparemment pas partie d'un nombre."

    Dans le cas où l'on a : ("a10bc20g") le premier caractère rencontré n'est pas un nombre donc la recherche s'arrête tout de suite

    "Si j'écris val (b3) en supposant que la chaine soit dans la cellule b3, elle me renvoie 0 dans les deux cas."
    Normal il faut écrire Val(Range("B3"))

    JP

  14. #14
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut differencier 1 et 10 dans une formule
    bonjour JPierreM,

    merci pour l'information.

    il est quand même embettant de ne pouvoir se fier à un ouvrage bien utile par ailleurs. En l’occurrence "VBA pour EXCEL" de JP Mester qui écrit :

    - val("123abcd456") renvoie la valeur 123
    - val("abcd123ghjkl") renvoie la valeur 123
    - Si A5 contient "115 pièce", la fonction val(A5) renvoie 115.

    Cordialement.

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

Discussions similaires

  1. [VBA]Passer une variable dans une formule Excel
    Par David1974 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/01/2006, 16h52
  2. concaténation en vba dans une formule de cellule Excel
    Par kernel57 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/12/2005, 22h58
  3. Réponses: 8
    Dernier message: 13/04/2005, 15h40
  4. Réponses: 6
    Dernier message: 18/01/2005, 16h24
  5. problème de guillemets dans une formule shell
    Par dim_italia dans le forum VBA Access
    Réponses: 7
    Dernier message: 18/08/2003, 12h46

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