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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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

+ 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