Macro Excel: Couper des donnees d'une cellule

Résolu/Fermé
Braco_Nico Messages postés 5 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 12 mai 2008 - 28 avril 2008 à 15:59
mimosa@rp Messages postés 1 Date d'inscription samedi 11 janvier 2014 Statut Membre Dernière intervention 11 janvier 2014 - 11 janv. 2014 à 12:10
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>?
A voir également:

9 réponses

Ajbol Messages postés 3014 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 23 janvier 2012 403
28 avril 2008 à 16:04
Bonjour,

Il y a une menu qui permet de transformer du texte en colonnes (menu : data)
0
Braco_Nico Messages postés 5 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 12 mai 2008
28 avril 2008 à 16:11
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
Ajbol Messages postés 3014 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 23 janvier 2012 403
28 avril 2008 à 16:13
En 2 étapes, tu y arrives : une coupure à > et une coupure à <
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
28 avril 2008 à 16:14
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
Braco_Nico Messages postés 5 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 12 mai 2008
28 avril 2008 à 16:35
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190 > Braco_Nico Messages postés 5 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 12 mai 2008
28 avril 2008 à 18:42
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
Braco_Nico > lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020
29 avril 2008 à 11:35
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
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
Le Pingou Messages postés 12042 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 24 avril 2024 1 426
29 avril 2008 à 22:50
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
30 avril 2008 à 10:24
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
Le Pingou Messages postés 12042 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 24 avril 2024 1 426
30 avril 2008 à 10:35
Bonjour lermite222,
Merci pour la remarque.
Je sais aussi que le VBA est super.
0
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
30 avril 2008 à 11:07
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
Oui, dans T(1), il y a subsrcipt out of range

Mais, ce n'est pas une erreur de syntaxe, j'ai verifie...
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
30 avril 2008 à 11:28
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
J'obtiens L=1024
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190 > Braco_Nico
30 avril 2008 à 12:09
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
Le Pingou Messages postés 12042 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 24 avril 2024 1 426 > lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020
30 avril 2008 à 17:43
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190 > Le Pingou Messages postés 12042 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 24 avril 2024
30 avril 2008 à 19:04
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
Le Pingou Messages postés 12042 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 24 avril 2024 1 426 > lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020
30 avril 2008 à 21:51
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
1 mai 2008 à 11:50
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
Braco_Nico Messages postés 5 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 12 mai 2008
1 mai 2008 à 13:46
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190 > Braco_Nico Messages postés 5 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 12 mai 2008
1 mai 2008 à 13:50
ont fait s'qu'ont pneu
0
mimosa@rp Messages postés 1 Date d'inscription samedi 11 janvier 2014 Statut Membre Dernière intervention 11 janvier 2014
11 janv. 2014 à 12:10
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