Macro Excel: Couper des donnees d'une cellule

Résolu
Braco_Nico Messages postés 5 Statut Membre -  
mimosa@rp Messages postés 1 Statut Membre -
Bonjour,
J'ai un fichier excel dans lequel une cellule regroupe toutes mes donnees.
Je souhaiterais extraire une partie de celle-ci.
ex du contenu de la cellule :
"BLABLABLABLABLABLA <READINGS>123 456 789</READINGS> BLABLABLABLABLABLA"
La partie qui m'interresse est "123 456 789".

Quelqu'un pourrait il donner un exemple de macro a utiliser pour ne garder que les donnees comprises dans la partie <READINGS>....</READINGS>?
Configuration: Windows XP
Internet Explorer 7.0

9 réponses

  1. Ajbol Messages postés 3034 Statut Membre 403
     
    Bonjour,

    Il y a une menu qui permet de transformer du texte en colonnes (menu : data)
    0
    1. Braco_Nico Messages postés 5 Statut Membre
       
      Oui, je sais mais dans cette cellule, j'ai beaucoup de donnes innutiles.
      Je dois donc garder seulement la partie interressante.
      C'est pourquoi, je pensais a l'utilisation d'une macro

      Merci
      0
  2. Ajbol Messages postés 3034 Statut Membre 403
     
    En 2 étapes, tu y arrives : une coupure à > et une coupure à <
    0
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour,
    Une solution parmi d'autre

    Sub Macro1()
    dim T
        sheets("Feuil1").Activate
        T = Split(Range("D1").Text, "READING", -1)
        'La clé dans T(1)
        T(1) = Mid(T(1), 2, 11)
    End Sub

    A+
    PS: pour autant que le clé ai toujours la même longueur, sinon..
    Sub Macro2()
    dim T, D
        sheets("Feuil1").Activate
        T = Split(Range("D1").Text, "<", -1)
        D = Split(T(1), "\>, -1)
        'La clé dans D(0)
    End Sub
    0
    1. Braco_Nico Messages postés 5 Statut Membre
       
      Merci pour vos reponse,
      le probleme est que j'obtiens une erreur du type "Subsript out of range"
      Cela vient-il du fait que ma cellule contient trop de donnees?
      0
      1. lermite222 Messages postés 9042 Statut Contributeur 1 199 > Braco_Nico Messages postés 5 Statut Membre
         
        si tu à fait une macro, met le texte dans un poste.

        PS: Bien entendu il faut adapter les macros présentées avec les noms de TES feuilles et l'adresse de ta cellule.
        0
      2. Braco_Nico > lermite222 Messages postés 9042 Statut Contributeur
         
        Je m'excuse car mes connaissance de VBA sont tres limitees
        J'ai adapte la macro a mon besoin (nom de ma cellule et de la feuille)

        Peux tu m'expliquer ce qu'est un "Poste"? J'ai mis le code dans une fenetre Microsoft VBA liee a mon fichier excel
        Aussi, qu'est ce que la fonction "T(1) = Mid(T(1), 2, 11)"?

        Merci d'avance. J'espere que j'y arriverai avec ton aide ;-)
        0
    2. Braco_Nico
       
      Si j'ai bien compris ta solution, on supprime la partie avant < et apres \>.
      Apres tentative de modification, voici le resultat :

      Sub Macro3()
      Dim T, D
      Sheets("Sheet3").Activate
      T = Split(Range("A1").Text, "<READINGS>", -1)
      D = Split(T(1), "</READINGS>", -1)
      'La clé dans D(0)
      End Sub

      En gros, dans la cellule A1, je garde la partie situee entre <READINGS> et </READINGS>... C'est ce que je voudrais faire du moins! Car aucun changement n'apparait, je suppose qu'il faut coller D(0) dans une autre cellule mais comment???

      Est ce que ma modification te parais juste?

      Merci
      0
  4. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
     
    Bonsoir,
    Il est possible de le faire avec les fonctions à dispositions.
    Votre texte ("BLABLABLABLABLA.......") se trouve dans la cellule "A2".
    Vous mettez dans la cellule "B2" cette formule :
    =STXT(A2;CHERCHE(">";A2;1)+1;CHERCHE("</";A2;1)-CHERCHE(">";A2;1)-1)
    et le résultat sera : 123 456 789.
    0
    1. Braco_Nico
       
      Merci de votre reponse,
      Le fait est que ma cellule contient enormement de caractere de ce types "< ou > ...." puisqu'elle est le resultat d'une importation de fichier xml (Il s'agit donc de nombreuses balises)

      Mes donnees a recuperer sont comprises dans les balises <READINGS>.....</READINGS>
      De plus, j'ai essaye votre solution mais elle ne fonctionne pas...

      C'est pourquoi, j'aimerai automatiser l'exraction de ces donnees par une Macro VBA

      Cordialement
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour,
    Pour Le pingou, je sais que beaucoups de fonctions peuvent êtres résolues par formules dans les feuilles, mais c'est charger les fichiers quelques fois de facon astronomique, alors qu'avec le VBA ce n'est écrit qu'une fois.

    Pour Braco-nico, effectivement la réponse est dans D(0) et pour la sortie tu peu ajouter dans la macro...

        Sheets("Sheet3").Range("C2").Value = D(0)


    Sinon, pour suivre la progression d'une macro...
    1°) Mettre le curseur à l'intérieur de la macro.
    2°) taper F8 , la macro débute, la première ligne est surlignée en jaune.
    ensuite à chaque fois que tu tape F8, la macro avance d'une instruction, quant une instruction à été exécutée tu peu promené la souris sur une variable et une bulle apparaît avec sa valeur, ce qui permet de vérifier.
    A+

    PS: je vient de lire ton dernier poste (réponse) où tu dit qu'il y à de nombreux signes identique, tu peu affiner la recherche en mettant des critères plus précis tel que <READING> dans le premier test et <\READING> dans le second
    ensuite tu peu incérer ces formules dans une boucle For/next pour l'exécuter sur un grand nombre de cellules.
    0
    1. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
       
      Bonjour lermite222,
      Merci pour la remarque.
      Je sais aussi que le VBA est super.
      0
    2. Braco_Nico
       
      Merci lermite222,
      Ca fonctionne parfaitement pour une version raccourcie de ma cellule.
      Par contre, j'obtiens toujours une erreur quand je l'execute sur une cellule complete
      Run Time Error '9'
      Subscript out of range

      Cette erreur parvient lors de l'instruction "Sheets("Sheet3").Range("C2").Value = D(0)"
      Je crois que le nombre de donnees du type "123 456 789" est tres important.

      Aurais tu une idee? genre decouper la cellule...

      Merci encore pour vos reponses precieuses.
      Bien joue pour le pas a pas, tres utile!
      0
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Run Time Error '9'
    veux dire qu'il n'a pas trouvé l'occurence 0 du tableau D et donc que D(0) n'existe pas, vérifie tes balises, voit pour majuscule minuscule \ ou / etc.., Ca doit être juste.
    Qu'y a-t-il dans T(1) ? , en principe il devrait y avoir...
    123 456 789</READINGS> BLABLABLABLABLABLA
    Tu dit..
    0
    1. Braco_Nico
       
      Oui, dans T(1), il y a subsrcipt out of range

      Mais, ce n'est pas une erreur de syntaxe, j'ai verifie...
      0
  8. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Fait une autre macro pour tester...

    Sub Macro3()
    dim Txt as string, L as long
        sheets("Sheet3").Activate
        Txt = Range("A1").Text
        L = len(Txt) 'la longueur du texte de la cellule
    End Sub


    Quand la ligne en jaune est sur End Sub, met ta souris sur le L et dit-moi quel est le nombre que tu vois ?
    Si pas possible de lire..
    Dans la fenêtre en dessous (Execution) tu tape..
    Print L , et tu tape Enter
    0
    1. Braco_Nico
       
      J'obtiens L=1024
      0
    2. lermite222 Messages postés 9042 Statut Contributeur 1 199 > Braco_Nico
       
      OK, si le contenu de ta cellule n'est pas confidentiel affiche la, sinon éventuellement me la communiqué par MP, pour que je puisse tester, car cela devrait fonctionner.
      0
    3. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476 > lermite222 Messages postés 9042 Statut Contributeur
       
      Bonjour,
      J'ai vu en passant les différents postes et il me semble que la variable "D" n'est pas défini comme tableau et je pense que si vous avez cette instruction : Sheets("Sheet3").Range("C2").Value = D(0) il doit se produire une erreur ..!
      0
    4. lermite222 Messages postés 9042 Statut Contributeur 1 199 > Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention  
       
      bonjour le pingou,
      du fait de créer une variable en 'VARIANT' la fonction déclarée crée un tableau ... Voir ton aide a ce sujet...
      0
    5. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476 > lermite222 Messages postés 9042 Statut Contributeur
       
      Bonsoir lermite222,
      Merci infiniment de votre réponse et j'en ai profité en découvrant la fonctionalité de la fonction "Split".
      Excusez-moi de vous avoir dérangé pour rien.
      Bonne fin de semaine.
      0
  9. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour,
    Tu peu dire que tu m'a fait transpirer, il ressort qu'il est impossible d'assigner une variable plus longue que 1024 dans une cellule, j'ai essayé avec le presse papier mais le problème est le même, donc seule solution que j'ai trouvé c'est de la découpé et de la mettre dans plusieur cellules, j'ai mis en colonne mais si ca t'arrange tu peu les mettre en ligne.
    Si un autre intervenant a la solution....
    Sub Macro3()
    Dim T, D
    Dim i As Integer, e As Integer
    
        Sheets("Feuil1").Activate
        T = Split(Range("A1").Value, "<READINGS>", -1)
        D = Split(T(1), "</READINGS>", -1)
        'La clé dans D(0)
        'La variable est trop longue pour l'assigner directement dans une cellule
        'Max = 1024
        'La découper et mettre dans plusieur cellules.
        e = 1
        For i = 1 To Len(D(0)) Step 1024
            Cells(2 + e, 5).Value = Mid(D(0), i, 1024)
            e = e + 1
        Next i
    End Sub

    A+
    0
    1. Braco_Nico Messages postés 5 Statut Membre
       
      Salut lermite222 et un GRAND MERCI a toi,
      J'ai essaye et ca fonctionne tres bien... Je vais me debrouiller pour la suite.

      Je n'ai que deux mots a dire : "T'assure Chaussure!!!"
      0
      1. lermite222 Messages postés 9042 Statut Contributeur 1 199 > Braco_Nico Messages postés 5 Statut Membre
         
        ont fait s'qu'ont pneu
        0
  10. mimosa@rp Messages postés 1 Statut Membre
     
    Bonjour,

    Voici un fonction qui permet d'extraire une chaine dans une cellule comportant une liste de valeurs avec un séparateur :

    Function ElementListe(chaine As String, separateur As String, position As Long) As String
    'Fonction retournant une chaine provenant d'une liste de valeur avec un séparateur
    ' - Paramètre 1 : Chaine de caractère contenant la liste des valeurs
    ' - Paramètre 2 : Chaine ou caractère représentant le séparateur
    ' - Paramètre 3 : Position de la liste de la valeur à retourner
    '@Auteur: Rémi Porcedda

    ' Variables
    Dim tableau() As String

    ' Tableau recevant la liste de valeurs
    tableau = Split(chaine, separateur)

    ' Retour en fonction de la position demandée
    ElementListe = tableau(position - 1)

    End Function

    Elle permet d'utiliser la fonction "split" des macros Excel dans une formule.

    Exemple :
    La cellule A1 contient la chaine suivante : "valeur1;valeur2;valeur3"
    Si la cellule A2 contient la formule "=ElementListe(A1;";";1)" le résultat va être "valeur1"

    Bon courage.
    0