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 :

[VBA-E]Récupérer une partie d'un nom


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut [VBA-E]Récupérer une partie d'un nom
    coucou,

    dans la continuité de ce que je veux faire (message "gestion de tableaux"), j'aurais besoin de récupérer une partie d'un texte.

    Or cette partie n'est pas toujours au meme endroit (donc la fonction mid, elle suffira pas à elle seule).

    La seule chose que je sache est que le nom est de ce type

    U24.AAAA.TTE.AK24WSDF.E0012Q00

    je veux récupérer le "0012". ce nom change chaque semaine. la semaine prochaine ce serai 0013 etc... mais le reste ne change pas (pour ce nom biensur... il y a une quarantaine de nom de ce type mais certains ont quelques caracteres en moins, c'est pour cela que je ne peux pas utiliser mid uniquement).

    J'ai une piste mais alors là c'est jsute une piste
    le seul "moyen" que j'ai repéré est que c'est une suite de 4 chiffres, la seule du nom (et de tous les autre noms que j'ai). donc peut etre qu'avec le code ascii...

    si quelqu'un a une autre idée... ou peut simplifier la mienne je suis preneur

    mon idée je l'ai pas clairement expiquée , c'est de regarder chaque caractere et des que l'on repere un chiffre on regarde les 3 suivant et si ce sont 3 chiffre alors on garde la position du premeir.
    ensuite on extrait à l'aide de mid les 4 caractere à partir de la position gardée.

    ca parait assez simple comme ca mais ca sera hyper lourd en code (en tout cas si c'est moi qui le code ce sera super long c'est sur )

  2. #2
    Membre émérite
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Par défaut
    Ceci devrait permet de résoudre le problème. Il reste à gérer les exceptions.

    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
     Public Sub Main()
        MsgBox DetecterSequence("U24.AAAA.TTE.AK24WSDF.E0012Q00", 4)
    End Sub
     
     
    Public Function DetecterSequence(Expression As String, TailleSequence As Long) As String
        Dim Index As Long
        Dim seq As Long
     
        For Index = 1 To Len(Expression)
            If IsNumeric(Mid(Expression, Index, 1)) Then
                DetecterSequence = DetecterSequence & Mid(Expression, Index, 1)
                seq = seq + 1
            Else
                DetecterSequence = vbNullString
                seq = 0
            End If
     
            If seq = TailleSequence Then Exit Function
        Next
     
        DetecterSequence = vbNullString
    End Function

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Waouh,

    pas mal le "IsNumeric", je pensais devoir comparer les caracteres avec 0,....,9 (grace à l'asci) mais là ca simplifie largement !!

    Citation Envoyé par Catbull
    Il reste à gérer les exceptions.
    je vois pas trop quelles sont les exceptions, un exemple?


    en tout cas merci !!

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Coucou,

    Voilà j'ai modifié un peu le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Public Function DetecterNumero(Expression As String, TailleSequence As Long) As String
    Dim Index As Long
    On Error GoTo fin
        For Index = 1 To Len(Expression) - 3
            If IsNumeric(Mid(Expression, Index, TailleSequence)) Then
                DetecterNumero = Mid(Expression, Index, TailleSequence)
                Exit Function
            End If
        Next
        If DetecterNumero = "" Then DetecterNumero = "Nom non reconnu"
    fin:
    If Err <> 0 Then MsgBox "Nom non reconnu"
    End Function
    dis moi ouskel, j'ai toujours du mal avec les "on error"...
    ton :
    je comprend qu'en cas d'erreur il va à "fin:" mais il se produit quand??
    car si par exemple j'ai une chaine mais qui ne contient pas 4 chiffres à la suite, avec ton code j'avais un message blanc. j'ai donc rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If DetecterNumero = "" Then DetecterNumero = "Nom non reconnu"

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    beuh, te tape pas la tete comme ca mon dodo !!



    voilà :

    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
     
    Public Sub Main()
        MsgBox DetecterNumero("U124.AAAA.TTE.AK24WSDF.E102Q00", 4)
    End Sub
     
    Public Function DetecterNumero(Expression As String, TailleSequence As Long) As String
    Dim Index As Long
    On Error GoTo fin
        For Index = 1 To Len(Expression)
            If IsNumeric(Mid(Expression, Index, TailleSequence)) Then
                DetecterNumero = Mid(Expression, Index, TailleSequence)
                Exit Function
            End If
        Next
        If DetecterNumero = "" Then DetecterNumero = "Nom non reconnu"
    fin:
    If Err <> 0 Then MsgBox "Nom non reconnu!"
    End Function
    ca me renvoit : "00" (2 derniers chiffres)
    donc je vire ton "error" et je laisse mon -3 non? ou pour faire mieux, TailleSequence -1

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    tiens on s'est croisé

    oui j'essaye quand meme de comprendre car ca m'a l'air d'etre assze utilisé et assez utile le "on error" et aussi j'aurais un oral sur ce que je fais alors si je dis "bah, allez demander à ouskel !!" je sais pas si ca sera apprécié (ni compris)

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    T'as raison, j'ai simplifié.
    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
     
    Public Sub Main()
        MsgBox DetecterNumero("U124.AAAA.TTE.AK24WSDF.E102Q00", 4)
    End Sub
    Public Function DetecterNumero(Expression As String, TailleSequence As Long) As String
    Dim Index As Long
        For Index = 1 To Len(Expression)
            If IsNumeric(Mid(Expression, Index, TailleSequence)) And Len(Mid(Expression, Index, TailleSequence)) = TailleSequence Then
                DetecterNumero = Mid(Expression, Index, TailleSequence)
                Exit Function
            End If
        Next
    DetecterNumero = ""
    MsgBox "Nom non reconnu! "
    End Function
    Mon erreur ? Je croyais qu'avec Mid, une longueur de chaîne n'existant pas provoquait une erreur. Ce n'est pas le cas.
    Donc, plus besoin de On error, juste un test sur la longueur de la chaîne

    A+

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Ok ca roule
    fallait pas t'embeter à tout refaire pour ca !!

    de toute facon j'ai deja remodifié la fonction car ce qui m'interessait n'est pas de voir les 4 caracteres mais de trouver l'indice du caractere qui precede ces 4 caractere

    en tout cas merci

  9. #9
    Membre émérite
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Par défaut
    Ta solution ouskel'n'or, peut sembler plus élégante, mais reste malheureusement moins complete.

    Les séquences suivantes peuvent être repérées à tord :-123 ou 24.2

    IsNumeric ne fait pas attention à la nature de la valeur numérique (entier, décimal et/ou négatif).

    Si on assuré qu'un tel cas ne se présente pas, ça passe, dans le cas contraire, ça coince

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Olala,
    il me dit des conneries alors le dodo !!

    merci de m'avoir précisé ca catbull mais bon dans mon cas la solution d'ouskel convient car le nombre est toujours compris entre 2 lettres (FESF.U9999U.ERTSE) donc aucune chance d'avoir les cas que t'as cité

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu as raison, CatBull. Je n'ai jamais trouvée ma solution plus élégante, seulement plus courte. Mais dans les cas de figures que tu évoques elle est effectivement caduque.
    La prochaine fois... Y'aura pas de prochaine fois...

  12. #12
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    tiens histoire de mettre mon grain de sel une autre méthode en utilisant l'opérateur Like :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Function ExtraitNumero(st As String) As String
    Dim i As Integer
    Dim stT As String
     For i = 1 To Len(st) - 4
        stT = Mid(st, i, 4)
        If stT Like "####" Then
            ExtraitNumero = stT
            Exit Function
        End If
     Next
    ExtraitNumero = "***** ERREUR NUMERO INTROUVABLE ***"
    End Function

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Ok pas mal

    par contre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For i = 1 To Len(st) - 4
    ce ne serait aps plutot -3 ??

    exemple : si ma chaine fait 5 caracteres, il va faire pour i=1 jusque 5-4 (donc 1 !! ) et donc ensuite il ne regardera que Mid(st, 1, 4) qui contient les caracteres 1,2,3 et 4 aors quil devrait aussi regarder Mid(st, 2, 4) qui contient les caracteres 2,3,4 et 5.

    Non?



    Je reviens pour faire encore plus simple. si ma chaine fait 4 caracteres.... for i=1 to 0

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ok pas mal

    par contre

    Code :
    For i = 1 To Len(st) - 4


    ce ne serait aps plutot -3 ??

    exemple : si ma chaine fait 5 caracteres, il va faire pour i=1 jusque 5-4 (donc 1 !! ) et donc ensuite il ne regardera que Mid(st, 1, 4) qui contient les caracteres 1,2,3 et 4 aors quil devrait aussi regarder Mid(st, 2, 4) qui contient les caracteres 2,3,4 et 5.

    Non?



    Je reviens pour faire encore plus simple. si ma chaine fait 4 caracteres.... for i=1 to 0 Aujourd'hui 13h59
    Enlève le -4 et qu'on en parle plus

  15. #15
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    RESOLU ?
    AVEC QUELLE ASSURANCE ?
    Pour moi, ce ne sera vraiment RESOLU avec certitude que lorsque Elstak aura bien voulu remplacer ses conditions premières, à savoir :
    La seule chose que je sache est que le nom est de ce type

    U24.AAAA.TTE.AK24WSDF.E0012Q00
    par ce qui ne laisserait aucun doute, du genre :
    La seule chose que je sache est que le nom est de ce type

    A##.AAAA.AAA.AA##WAAAA.A####AAA
    ou A représente une lettre et # un chiffre
    car, dans l'"'état actuel des choses, je ne vois rien qui interdirait l'existence d'une chaîne telle :
    U24.AAA.TTE.AK2568DF.E0012Q00
    d'où vous extrairiez 2568 !
    En résumé : à moins d'avoir des explications claires et ne laissant place à aucun doute sur la construction de la chaîne, je crains fort que ce ne soit que de l'à peu près ....
    Il me semble qu'ont de l'importance : le point et le fait que (oui ou non ?) le groupe de 4 chiffres est suivi (à coup sur ?) d'une lettre ...
    Voilà !!!!!!

  16. #16
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par Elstak
    le seul "moyen" que j'ai repéré est que c'est une suite de 4 chiffres, la seule du nom (et de tous les autre noms que j'ai). donc peut etre qu'avec le code ascii...
    bon nous on s'en tiens la si d'autre cas ce présente Elstask sera nous le dire

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Coucou,
    ne t'inquiètes pas comme ca pour moi jmf !!

    il n'y a q'une suite de 4 chiffres comme je l'ai dit car le reste correspond au nom fixe du fichier (ce nom peut varier mais je sais les valeurs qu'il peut avoir et ce ne sont que des lettres donc pas de panique !)

    voilà donc ce sujet est bien résolu

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/09/2008, 18h51
  2. Récupérer une partie d'un nom de fichier
    Par ben_harper dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 25/06/2008, 07h19
  3. Réponses: 4
    Dernier message: 27/09/2007, 15h05
  4. Récupérer une partie d'une adresse (VBA)
    Par jackfred dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/08/2007, 13h12
  5. [VBA]Récupérer une partie du chemin d'un fichier
    Par poivre dans le forum VBA Access
    Réponses: 1
    Dernier message: 12/04/2007, 19h34

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