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 :

Déconcaténer une liste [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Août 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 141
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut Déconcaténer une liste
    Bonjour à tous
    cela fait maintenant une semaine que je me triture les méninges à essayer de déconcaténer une liste qui peut-être courte ou longue voir très longue.
    La liste est tjs formé de la même façon (NOM Prénom - Numéro à 7chiffres suivi d'une lettre; et ainsi de suite).
    Je souhaiterais récupérer uniquement les 7 chiffres et la lettre qui suit pour copie dans la case de la ligne suivante.
    En fait je n'arrive pas à récupérer ces données, je m'y prends peut-être mal mais comme la longueur des NOM Prénom est différente à chaque fois....
    Je souhaiterais chercher le - puis décaler d'une case vers la droite et récupérer les 8 caractères suivants.
    Mon souci est que je n'arrive pas à faire la recherche de ce - puisqu'il fait partie de la case et que ce n'est pas le seul...
    Une fois les premiers caractères récupérés et copier dans la ligne suivante, il faut chercher le tiret suivant et ainsi de suite....
    Je ne sais pas si je me suis bien fait comprendre ?
    Si quelqu'un voit un bout de solution, je lui en serais très reconnaissant.
    Merci

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 095
    Points : 9 581
    Points
    9 581
    Par défaut
    hello,
    peux tu nous montrer un exemple de ce qu'il y a en entrée? est-ce du genre TAIRIEUR Alain - 1234567 G ? . Il me semble que les expressions régulières pourraient être une solution pour ton problème.
    [EDIT] deedolith a répondu presqu'en même temps que moi et te montre alors comment faire.
    Ami calmant, J.P

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 389
    Points : 2 022
    Points
    2 022
    Par défaut
    Salut,

    Rechercher le tiret est une fausse bonne idée, pour la simple raison qu'il existe des noms ou prénoms composés qui comportent un tiret.
    Une solution plus fiable est de passer par les expressions régulières.
    Par exemple:
    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
    Public Function ExtractRegexValues(ByVal Pattern As String, ByVal Target As String) As Collection
        Dim Results As Collection
        Set Results = New Collection
     
        Dim Rx As VBScript_RegExp_55.RegExp
        Set Rx = CreateObject("VBScript.RegExp")
        Rx.Pattern = Pattern
        Rx.Global = True
        Rx.MultiLine = True
     
        Dim Matchs As VBScript_RegExp_55.MatchCollection
        Set Matchs = Rx.Execute(Target)
     
        Dim Match As VBScript_RegExp_55.Match
        For Each Match In Matchs
            Results.Add Match.Value
        Next
        Set ExtractRegexValues = Results
    End Function
     
    Public Sub test()
        Const data As String = "Luc Mont-Motma - 1234567" & vbCrLf & "Lea - Mal a droite - 4598761"
        Dim Results As Collection
        Set Results = ExtractRegexValues("\d{7}", data)
     
        Dim Item As Variant
        For Each Item In Results
            Debug.Print Item
        Next
    End Sub

  4. #4
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 523
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 523
    Points : 16 459
    Points
    16 459
    Par défaut
    Bonjour

    Probablement faisable aussi par PowerQuery intégré à Excel

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Août 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 141
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut
    Ouh laaa
    vous allez très vite pour moi...
    C'est quoi les expressions régulières déjà??
    Deedolith dans ton exemple ce qui est en rouge ça représente quoi??
    Voici un petit exemple de ce que je souhaiterais à la sortie. Ligne 1 la liste complète et dessous la récupération demandée...
    Possible???

    Exemple VBA.xlsx

  6. #6
    Membre émérite
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 133
    Points : 2 685
    Points
    2 685
    Par défaut
    Bonjour

    Avec les dernières fonctions d'Excel 365

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =TRANSPOSE(TEXTE.APRES(FRACTIONNER.TEXTE(A1;";");"- ";;;1))
    FRACTIONNER.TEXTE pour couper le texte sur les ;
    TEXTE.APRES( ...."- "... -1) pour extraire ce qu'il y a après le dernier tiret
    TRANSPOSE pour mettre le résultat en colonne

    Stéphane

  7. #7
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 095
    Points : 9 581
    Points
    9 581
    Par défaut
    En reprenant le code de deedolith et en le modifiant légèrement ce qui suit devrait fonctionner avec ton classeur :
    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
    Public Function ExtractRegexValues(ByVal Pattern As String, ByVal Target As String) As Collection
        Dim Results As Collection
        Set Results = New Collection
     
        Dim Rx As Object
        Set Rx = CreateObject("VBScript.RegExp")
        Rx.Pattern = Pattern
        Rx.Global = True
        Rx.MultiLine = True
     
        Dim Matchs As Object
        Set Matchs = Rx.Execute(Target)
     
        Dim Match As Object
        For Each Match In Matchs
            Results.Add Match.Value
        Next
        Set ExtractRegexValues = Results
    End Function
     
    Public Sub test()
        Dim Results As Collection
        Dim data As String, x As Integer
        data = ActiveSheet.Range("A1").Value
        Set Results = ExtractRegexValues("\d{7}[A-Z]", data)
        Dim Item As Variant
        x = 1
        For Each Item In Results
            Debug.Print Item
            ActiveSheet.Range("A1").Offset(x, 0).Value = Item
            x = x + 1
        Next
    End Sub

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Août 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 141
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut
    Désolé Raccourcix ça ne fonctionne pas mais je viens de voir que je suis encore en Office 2016 alors que ma boite passe doucement en O365...
    Peut-être que...

  9. #9
    Membre régulier

    Profil pro
    Inscrit en
    Août 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 141
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut
    Merci Jurrassic Pork cela fonctionne
    Je vais étudier ta méthodologie pour la comprendre mieux
    Merci encore à tous pour l'aide

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 389
    Points : 2 022
    Points
    2 022
    Par défaut
    Deedolith dans ton exemple ce qui est en rouge ça représente quoi??
    Réponse méchante: Google est ton ami.
    Réponse réaliste: Google est ton ami.
    Quand on ne sait pas, on se renseigne.
    CreateObject: https://learn.microsoft.com/fr-fr/of...bject-function.
    Les expressions régulières: https://www.automateexcel.com/fr/vba...nnelles-regex/

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

Discussions similaires

  1. [MFC] Retourner une liste d'objets
    Par 1cado dans le forum MFC
    Réponses: 10
    Dernier message: 28/07/2003, 13h11
  2. Faire une liste de device??
    Par jackjack dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2003, 15h43
  3. Réponses: 4
    Dernier message: 24/04/2003, 23h28
  4. Générer une liste
    Par pfredin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/04/2003, 16h30
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 19h08

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