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 :

Extraire une partie du texte d'une cellule.


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 163
    Points : 72
    Points
    72
    Par défaut Extraire une partie du texte d'une cellule.
    Bonjour, j'ai un souci de traitement de données...En fait dans une colonne j'ai plusieurs cellules avec des données comme suit:


    '{4:

    :20:6728307693

    :21:ABC1615741

    :25:112630195

    :32A:0710EUR15000,68

    -}
    ce que j aurai voulu c'est isoler la ligne :32A:0710EUR15000,68 de la cellule et la coller dans une autre colonne. Au début j'avais pensé a convertir les données texte en colonne (conversion) ms ca ne marche pas.
    Il faut peut être passer par un code VBA mais j'en ai aucune idée

    Merci pour votre aide.

    Arnaud

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Bonjour,

    Il y a quelques questions importantes qui peuvent changer la manière de faire vu que tu veux répéter ce mode opératoire sur différentes cellules. Tout d'abord, est-ce que la chaîne à extraire est toujours à la fin de la cellule ?
    Est-ce que les différentes lignes comportent toujours le même nombre de caractères ?

    Un peu plus de précisions serait nécessaire mais tu peux déjà commencer à lorgner tu côté des fonctions Mid, Left, Right et tout ce qui concerne le traitement des chaînes de caractères.

    En tout cas, ça se fait plutôt bien par VBA
    DeaD

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 163
    Points : 72
    Points
    72
    Par défaut
    En fait, le problème c'est que ce n'est pas toujours à la dernière position et que la chaine de caractère n'est pas toujours de la même longueur, mais çà commence par toujours 32A.

  4. #4
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonjour arnold95 DeaD78 le forum peut être comme cela copy sur la 2 feuille
    Option Explicit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    Dim c As Range
    For Each c In Range("A1", Range("A65536").End(xlUp))
    If Left([c], 3) = "32A" Then
    c.EntireRow.Copy Destination:=Sheets(2).Range("A65536").End(xlUp)(2)
    End If: Next
    End Sub
    SALUTATIONS

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    La marche à suivre est donc la suivante.

    Dans un premier temps,tu utilises la fonction InStr qui va te permettre de chercher la postion de 32A dans la chaîne globale. Appelons Pos cette postion.

    Ensuite, tu utilises la fonction Mid sur la même chaîne globale avec comme position souhaitée de début d'extraction Pos. Cependant, tu as besoin de la longueur de ta chaîne. Donc, soit la ligne 32A a toujours la même longueur soit...

    Soit ça complique tout. Je pense qu'il va falloir d'abord connaître la longueur de la chaîne globale avec Len, extraire tout à partir de 32A jusqu'à la fin avec Mid (longueur de la chaîne Len-Mid). Là-dessus, il faut refaire un InStr pour trouver le premier espace apreès 32A. Enfin, tu trouves la longueur de ta chaîne à extraire puis tu peux enfin réaliser ton extraction grâce à Mid.

    Voilà le raisonnement. Ca peut paraître pas vraiment clair, je dois l'admettre Je te propose de te laisser jeter un oeil et, si tu n'y arrives pas, je te ferai un petit truc.

    EDIT : Bonjour laetitia. En même temps Par contre, ta technique ne marche que si les 3 premiers caractères de la cellule sont 32A. Si la chaîne se retrouve au milieu de la cellule, c'est raté. De plus, tout est copié et non seulement la ligne commençant par 32A. Je crois que ce n'est pas ce qu'arnold95 souhaite mais c'est à vérifier
    DeaD

  6. #6
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    re si comme le pense DeaD78 alors comme cela peut être !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    Dim c As Range
    For Each c In Range("A1", Range("A65536").End(xlUp))
    If [c] Like "*32A*" Then
    Range("b65536").End(xlUp).Offset(1, 0) = c
    End If: Next
    End Sub
    copy en colonne b
    SALUTATIONS

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Je n'avais pas pensé au Like pour vérifier la présence de 32A ! Pour moi, c'était toujours là Bien joué

    Par contre, ce n'est toujours pas ce qu'attend arnold95 je crois.

    D'après ce que j'ai compris, si 32A existe dans la cellule, il ne veut pas récupérer toute la cellule. Il veut récupérer seulement la chaîne de caractères commençant par 32A et se terminant au prochain "espace vide". C'est pour ça que j'étais parti sur des Mid, Len, InStr pour bien récupérer la chaîne de caractères nécessaire. Je ne vois pas vraiment comment résoudre ça sans fonctions qui permettent de la traiter.

    J'ai donné "l'algo" permettant de résoudre le problème mais je n'ai pas trop le temps de "pondre" quelque chose pour le moment. Je coderai quelque chose dès que j'aurai un peu de temps si laetitia ne l'a pas fait avant
    DeaD

  8. #8
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    re , extraire a partir de 32A on peut faire cela en souhaitant qu'il apparaissent qu'une fois dans la chaine par contre comme le dit l'ami DeaD78 arrêter au prochain " espace vide" plus compliquer a réaliser. enfin pour moi en tout les cas!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
    Dim c As Range
    For Each c In Range("A1", Range("A65536").End(xlUp))
    If [c] Like "*32A*" Then
    Range("b65536").End(xlUp)(2) = _
    Right([c], Len([c]) - InStr([c], "32A") + 1)
    End If: Next
    End Sub
    SALUTATIONS

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Bon, j'ai fait ça à la va vite. C'est pas beau, on comprend rien aux variables etc. mais ça marche

    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 lg As Long
    Dim pos1 As Long
    Dim pos2 as Long
    Dim temp As String
    Dim fin As String
     
    For Each c In Range("A1", Range("A65536").End(xlUp))
    If [c] Like "*32A*" Then
        lg = Len(c.Value)
        pos1 = InStr(c.Value, "32A")
        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
     
    End Sub
    Dans ta colonne A tu mets toutes tes données comme tu le souhaites. Ca te copie dans la colonne C, en face, exactement ce que tu souhaites.

    Pour laetitia : en sachant que Chr(10) représente un "espace vide" (retour à la ligne), ça te parapit moins compliqué à réaliser tout d'un coup non ? En tout cas, je me suis basé sur ton code pour le départ
    DeaD

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 163
    Points : 72
    Points
    72
    Par défaut
    Merci à vous deux...par rapport au code de Dead78, le début est bon, mais il faudrait que le "32A:" et que les espaces à la fin soient retirés (j'ai utilisé la fonction Trim, mais ils restent) c'est tout et après c'est nickel.

    Merci.

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Citation Envoyé par arnold95 Voir le message
    et que les espaces à la fin soient retirés (j'ai utilisé la fonction Trim, mais ils restent) c'est tout et après c'est nickel.

    Merci.
    probablement parce que ce ne sont pas des espaces ...
    Pour savoir ce que c'est, tu peux peut-être en afficher le code ASCII !
    soit chaine la chaine résultante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Msgbox asc(right(chaine,1))

  12. #12
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    re, trés bien ton code DeaD78 bravo!! c est pas trop mon truc extraction de caractéres je profites du fil pour faire un gros bisous a mon ami ucfoutu bonne soirée a tous leti
    SALUTATIONS

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Pour que le 32A soit retiré, tu remplaces
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    temp = Mid((c.Value), pos1, lg - pos + 1)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    temp = Mid((c.Value), pos1+3, lg - pos + 1)
    Qu'entends-tu par "espaces à la fin" ? Est-ce un saut de ligne avec Alt + Entrée lorsque tu es dans ta cellule ? Si c'est le cas, il est représenté par Chr(10) dans mon code, c'est ce que je recherche. J'ai testé ça marche.

    En gros tu as quelques comme ça dans ta cellule :

    aabbcc
    32abcd
    gghhjj

    Pour mon code, après chacune des chaînes, tu n'as pas de " " mais un Chr(10) qui correspond à un Alt + Entrée. Tu obtiens 32abcd comme résultat et pas "d'espace" donc vu que ça n'en est pas un.

    Par contre, si après chacune des chaînes tu as mis un " " (barre d'espace) avant de sauter une ligne, cet espace va être pris dans le résultat. Dans ce cas, tu remplaces
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pos2 = InStr(temp, Chr(10))
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pos2 = InStr(temp, " ")
    et le tour est joué. Si ça ne marche pas non plus, je te propose de mettre en lien ton fichier que je vois sous quelle forme c'est présenté.

    Bonne soirée

    EDIT : merci laetitia
    DeaD

  14. #14
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonsoir,

    je suggère cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Function extraire(chaine As String, quoi As String) As String
       Dim ou As Integer, couic As String
       ou = InStr(chaine, quoi)
       If ou = 0 Then Exit Function
       couic = Mid(chaine, ou + Len(quoi))
       Do While Asc(Left(couic, 1)) > 31
         extraire = extraire & Left(couic, 1)
         couic = Mid(couic, 2)
       Loop
       extraire = Trim(extraire)
    End Function
    Utilisable ainsi (où toto est la chaine, donc le contenu d'une cellule, à analyser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox extraire(toto, ":32A:")
    Qui affichera ce qui vient après ":32A:" et jusqu'au 1er caractère non imprimable ou retour/charriot.... ou rien si la chaîne ":32A:" est absente

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 163
    Points : 72
    Points
    72
    Par défaut
    Désolé du temps de réaction, mais je n'étais pas là hier soir...d'ailleurs je vois qu'il y a des privilégiés qui ont le droit à des bisous.lol. Alors en ce qui concerne mon problème c'est que chaque chaine de caractère je dois retirer deux blancs à la fin. Merci.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pos2 = InStr(temp, "  ")
    Le 32A c'est bon sinon ?
    DeaD

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 163
    Points : 72
    Points
    72
    Par défaut
    Non...en fait c'est tout bête j'ai remplacé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fin = Mid(temp, 1, pos2)
    par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fin = Mid(temp, 1, pos2 - 2)
    Et du coup mà c'est bon...

    Merci bcp & bonne journée.

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

Discussions similaires

  1. [XL-2010] Extraction d'une partie de texte d'une cellule
    Par didousama dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/09/2014, 17h23
  2. [XL-2010] Recuperer une partie de texte dans une cellule
    Par Mimosa777 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/06/2013, 17h00
  3. Réponses: 4
    Dernier message: 20/06/2008, 15h19
  4. [VBA-E] Mettre en gras une partie du texte d'une cellule
    Par clochardevobsy dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 05/05/2006, 16h25
  5. [VBA][Excel]Supprimer une partie du texte d'une grosse liste
    Par annedeblois dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/09/2005, 17h15

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