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 :

Extrait des chaînes dans une cellule ligne par ligne


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    net
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée-Bissao

    Informations professionnelles :
    Activité : net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Extrait des chaînes dans une cellule ligne par ligne
    Nom : cel.PNG
Affichages : 217
Taille : 14,2 Ko
    Bonjour,

    je me permets de vous écrire pour solliciter votre aide.

    je m'explique:
    Je voudrais récupérer pour chaque ligne de la cellule de ma colonne "C" les identifiants des utilisateurs et les copier dans la cellule de la colonne "D" juste a cote sachant que pour certains les identifiants leur ID commencent par ALxxxxx et autres par XLxxxxx. Je voudrais éventuellement éliminer mes doublons pour les id que se repentent.

    Voila comment je voudrais que les données se présentent dans les colonnes

    Colonne C Colonne D
    Bernard RAVIER | AL0468115 AL0468115
    FAURE Gabriell (A) | AL0466693 AL0466693
    Mendes Francois | XL0466693 XL0466693
    DG-RM-ITOPFctRolesManagers
    RUELLE Fabien (A) | AL046613 AL046613
    Testud Fabrice | XL0466451 XL0466451
    DG-RM-ITOPFctRolesManagers

    Voila mon code d'essaie mais que récupère juste un seul occurrence de l'ID pour chaque cellule

    exemple : L0468115 sans le A

    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
    Sub test() 
     
    Dim c As Range 
    Dim lg As Long 
    Dim pos1 As Long 
    Dim pos2 As Long 
    Dim temp As String 
    Dim fin As String 
     
     Set Range = Worksheets("Group Infos").Range("C4").Row 
    For Each c In Range("C4", Range("C65536").End(xlUp)) 
    If [c] Like "*L0*" Then 
     lg = Len(c.Value) 
     pos1 = InStr(c.Value, "L0") 
     temp = Mid((c.Value), pos1, lg - pos + 1) 
     pos2 = InStr(temp, Chr(10)) 
     fin = Mid(temp, 1, pos2) 
     c.Offset(0, 2).Value = fin 
    End If: Next
    Merci d'avance

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 085
    Points : 9 873
    Points
    9 873
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    si le besoin n'est pas unique et doit être réutilisé, une fonction personnalisée serait une bonne option ?

    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
    ' Cellule est une plage composée d'une seulle cellule
    ' TailleId représente la taille standard des identifiants
    ' Le Separateur est la caractère (entouré d'espaces) qui sépare l'utilisateur de son identifiant
    Function ExtraireID(Cellule As Range, TailleId As Long, Optional Separateur As String = "|") As String
        With Cellule
            If .Cells.Count > 1 Then ExtraireID = "#CelluleNonUnique": Exit Function
            For i = 1 To Len(.Value)
                If .Characters(i, 1).Text = Separateur Then
                    Result = Result & vbLf & Mid(.Value, i + 2, TailleId)
                    i = i + TailleId + 2
                End If
            Next i
            ExtraireID = Result
        End With
    End Function
    Exemple d'appel, issu de ton print écran

    en D2, on peut écrire l'une des deux solutions :

    =ExtraireID(C2;4)
    Ou en précisant le séparateur (utile s'il est différent de "|")

    =ExtraireID(C1;4;"|")
    A toi maintenant d'adapter la souplesse de cette fonction suivant tes besoins

    si tu n'as pas besoin de réutiliser, et que c'est une conversion "one shoot" ... il te suffit de convertir la fonction en procédure, et de la lancer dans une boucle parcourant les cellules de ta colonne C

  3. #3
    Futur Membre du Club
    Homme Profil pro
    net
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée-Bissao

    Informations professionnelles :
    Activité : net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci joe.levrai pour ton aide.

    Voila mon code d'essai, ma ca ne marche toujours pas comme je veux

    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
    Sub test()
    Dim c As Range
    Dim TailleId As Long
    Dim Separateur As String
    Dim Result As String
     
     
     
    Separateur = "|"
     
    For Each c In Range("C4", Range("C65536").End(xlUp))
     
            For i = 1 To Len(c.Value)
                If c.Characters(i, 1).Text = Separateur Then
                    Result = Result & vbLf & Mid(c.Value, i + 2, TailleId)
                    i = i + TailleId + 2
                End If
            Next i
            Range("d65536").End(xlUp)(2) = Result
     Next
    Un petit coup de main ca pourra aller

    Merci d'avance

  4. #4
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 085
    Points : 9 873
    Points
    9 873
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    TailleId (variable qui contient la longueur de tes identifiants) n'était pas associée à une valeur, il vaut 0

    donc, à chaque fois qu'il trouve un "|", il extrait, deux caractères après le séparateur, une chaine de longueur nulle

    autant dire que tu ne me surprendras pas en déclarant que le résultat est que chaque cellule de résultat est vide ?

    de plus, la façon dont tu gères la cellule de résultat est malvenue, et source d'erreurs

    tu travailles sur c qui est la cellule en colonne C. Si tu décalles c d'une colonne (c.Offset(0,1)) alors tu es dans la colonne D sur la même ligne que c

  5. #5
    Futur Membre du Club
    Homme Profil pro
    net
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée-Bissao

    Informations professionnelles :
    Activité : net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    J'ai essayé celui ci mais ça ne donne toujours rien

    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
    Sub test()
    Dim c As Range
    Dim TailleId As Long
    Dim Separateur As String
     
     
     TailleId = 0
    Separateur = "|"
     
    For Each c In Range("C4", Range("C65536").End(xlUp))
     
            For i = 1 To Len(c.Value)
                If c.Characters(i, 1).Text = Separateur Then
                    Result = Result & vbLf & Mid(c.Value, i + 2, TailleId)
                    i = i + TailleId + 2
                End If
            Next i
            c.Offset(0, 1).Value = Result
     
     Next
     
    End Sub

  6. #6
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 085
    Points : 9 873
    Points
    9 873
    Billets dans le blog
    5
    Par défaut
    Je ne vois pas comment l'expliquer plus simplement pour que tu comprennes ce qu'il se passe

    donc : dans ta copie écran, les identifiants font 9 caractères. alors TailleId = 9 !

  7. #7
    Futur Membre du Club
    Homme Profil pro
    net
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée-Bissao

    Informations professionnelles :
    Activité : net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Salut, merci pour ton aide !

    Voila le printscreen du résultat, mais il se trouve que je veux ignorer la dernier ligne et récupérer juste les Ids.

    Et sur la deuxième ligne les données se répètent

    Nom : sortie.PNG
Affichages : 157
Taille : 17,0 Ko

  8. #8
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 085
    Points : 9 873
    Points
    9 873
    Billets dans le blog
    5
    Par défaut
    quand tu as testé directement la fonction personnalisée que j'ai proposé, est-ce que ça fonctionnait ?

  9. #9
    Futur Membre du Club
    Homme Profil pro
    net
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée-Bissao

    Informations professionnelles :
    Activité : net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Non, je n'ai testé puisque j'ai choisi de le faire sous forme de procédure afin d'exécuter sur l'ensemble des lignes de la colonne C

  10. #10
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 085
    Points : 9 873
    Points
    9 873
    Billets dans le blog
    5
    Par défaut
    Ca aurait été pas mal que tu y mettes du tiens et teste

    tu aurais probablement obtenu le bon résultat (je pense ... car j'ai testé plusieurs cas)

    et j'aurai pu t'aider à comprendre que dans ta procédure ... si tu n'effaces pas Result après le traitement d'une cellule, tu vas cumuler les résultats au fur et à mesure

    cependant, cela ne semble pas être le comportement de ta copie écran, qui semble doubler le résultat d'une cellule
    on verra bien, corrige déjà ce point ...et profites-en pour déclarer ta variable en temps que String

  11. #11
    Futur Membre du Club
    Homme Profil pro
    net
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée-Bissao

    Informations professionnelles :
    Activité : net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Je n'ai pas pu faire marcher la fonction personnalisée car ne renvoi aucun résultat...

    Et mon problème de doublon sur la ligne 2 persiste toujours, malheureusement !

    mon but maintenant consiste a récupérer tout le texte qui se trouve devant le caractère séparateur " | ", quelque soit la taille de la chaine, et coller cette chaine dans une cellule de la colonne D séparément.



    En fait, je travaille sur un petit projet avec beaucoup de données mélangés dans les colonnes et je cherche a les mettre en forme afin de faciliter mon travail, autant te dire que je suis débutant en dev, surtout en vba, donc ton aide serait très pertinent !

  12. #12
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour.

    L'utilisation de SPLIT peut simplifier considérablement les choses.

    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
    Sub test()
    'Feuil1.Activate
     
     Columns("D:E").Clear
     
     For ligne = 4 To Cells(Rows.Count, "C").End(xlUp).Row
     
      Call DemoSplit(Cells(ligne, "C"))
     
     Next
     
    End Sub
     
    Sub DemoSplit(c)
     
     'c.Select
     
     ligneDest = c.Row
     
     Separ1 = Chr(10)
     
     Separ2 = "|"
     
     t = Split(c.Value, Separ1)
     
     For i = LBound(t) To UBound(t)
     
       e = Split(t(i), Separ2)
     
       If UBound(e) > 0 Then
        Cells(ligneDest, "D") = e(0)
        Cells(ligneDest, "E") = e(1)
       End If
     
       ligneDest = ligneDest + 1
     
     Next
     
    End Sub
    Cordialement

    Docmarti.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    net
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée-Bissao

    Informations professionnelles :
    Activité : net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci Docmarti,

    c'est génial ton code marche nikel

  14. #14
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Oui Split() c'est génial.
    Cordialement

    Docmarti.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/12/2015, 11h58
  2. Réponses: 0
    Dernier message: 02/07/2013, 17h51
  3. Réponses: 12
    Dernier message: 14/05/2008, 17h15
  4. [VBA]Rechercher une chaine dans une cellule?
    Par ZIED dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/01/2006, 05h31

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