Extraction Multiple
Bonjour,
J'ai un petit problème que je n'arrive pas à résoudre...
J'ai sur une même ligne de nombreuses informations (issue d'un fichier GPS) à partir desquelles je souhaite extraire les noms et adresses sur plusieurs lignes.
Ma ligne est de cette forme :
<name>Nom 1</name><desc><![CDATA[Adresse 1]]></desc><sym>Waypoint</sym><extensions><gpxx:WaypointExtension><gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode></gpxx:WaypointExtension></extensions></wpt><wpt lat="49.402042" lon="-1.535045"><ele>0.000000</ele><time>2020-05-13T07:15:54Z</time><name>Nom 2</name><desc><![CDATA[Adresse 2]]></desc><sym>Waypoint</sym><extensions><gpxx:WaypointExtension><gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode></gpxx:WaypointExtension></extensions></wpt><wpt lat="49.402281" lon="-1.533947"><ele>0.000000</ele><time>2020-05-13T07:15:54Z</time>
Et je souhaite donc extraire ici Nom 1, Adresse 1, Nom 2, Adresse 2 dans des cellules et sur des lignes distinctes, je peux avoir une centaine de noms et adresses, d'où la nécessité de trouver quelque chose qui se fasse rapidement.
J'arrive biensur à extraire le premier avec les fonctions suivantes :
=GAUCHE(STXT(A1;CHERCHE("<name>";A1)+6;100);CHERCHE("</name>";STXT(A1;CHERCHE("<name>";A1)+6;100))-1)
=GAUCHE(STXT(A1;CHERCHE("[CDATA[";A1)+7;100);CHERCHE("]]";STXT(A1;CHERCHE("[CDATA[";A1)+7;100))-1)
Mais comment faire pour les suivantes ?
Merci d'avance
Je joints un fichier exemple
Ou peut-être que ce serait plus simple de copier dans la cellule du dessous à chaque fois qu'on rencontre la balise <name> ce qui donnerait dans chaque cellule :
A1 : l'ensemble du texte
A2 :
<name>Nom 1</name><desc><![CDATA[Adresse 1]]></desc><sym>Waypoint</sym><extensions><gpxx:WaypointExtension><gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode></gpxx:WaypointExtension></extensions></wpt><wpt lat="49.000" lon="-1.5000"><ele>0.000000</ele><time>2020-05-13T07:15:54Z</time>
A3 :
<name>Nom 2</name><desc><![CDATA[Adresse 2]]></desc><sym>Waypoint</sym><extensions><gpxx:WaypointExtension><gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode></gpxx:WaypointExtension></extensions></wpt><wpt lat="49.000" lon="-1.5000"><ele>0.000000</ele><time>2020-05-13T07:15:54Z</time>
Et les extractions via les formules en colonne B et C ??
J'avance tout doucement en bidouillant, j'ai fait ce code pour pouvoir utiliser l'outil convertir d'excel :
En A1 :
<name>Nom 1</name><desc><![CDATA[Adresse 1]]></desc><sym>Waypoint</sym><extensions><gpxx:WaypointExtension><gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode></gpxx:WaypointExtension></extensions></wpt><wpt lat="49.000" lon="-1.5000"><ele>0.000000</ele><time>2020-05-13T11:03:06Z</time><name>Nom 2</name><desc><![CDATA[Adresse 2]]></desc><sym>Waypoint</sym><extensions><gpxx:WaypointExtension><gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode></gpxx:WaypointExtension></extensions></wpt><wpt lat="49.000" lon="-1.5000"><ele>0.000000</ele><time>2020-05-13T11:03:06Z</time><name>Nom 3</name><desc><![CDATA[Adresse 3]]></desc><sym>Waypoint</sym><extensions><gpxx:WaypointExtension><gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode></gpxx:WaypointExtension></extensions></wpt><wpt lat="49.000" lon="-1.5000"><ele>0.000000</ele><time>2020-05-13T11:03:06Z</time>
Et la macro
Sub Extract()
Range("A1").Select
Cells.Replace What:="</desc>", Replacement:="</desc>'", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.Replace What:="</name>", Replacement:="</name>'", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.Replace What:="<name>", Replacement:="'<name>", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:="'", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _
1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1)), _
TrailingMinusNumbers:=True
Rows("1:1").Select
Selection.Copy
Range("A2").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Rows("1:1").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlUp
Application.FormulaBarHeight = 2
ActiveCell.FormulaR1C1 = _
"=LEFT(MID(RC[-1],SEARCH(""<name>"",RC[-1])+6,100),SEARCH(""</name>"",MID(RC[-1],SEARCH(""<name>"",RC[-1])+6,100))-1)"
Range("B3").Select
ActiveCell.FormulaR1C1 = _
"=LEFT(MID(RC[-1],SEARCH(""[CDATA["",RC[-1])+7,100),SEARCH(""]]"",MID(RC[-1],SEARCH(""[CDATA["",RC[-1])+7,100))-1)"
Range("B4").Select
End Sub
Ce qui me permet d'extraire par ligne ce dont j'ai besoin, il faudrait maintenant que je supprime toutes les lignes inutiles (celles qui contiennent le texte sym par exemple
Personne pour m'eclairer ??
Bonjour,
Je comprends le casse-tête.
Mais tes donnés sont au format xml. Il existe des méthodes pour les transformer, genre ...
=SERVICEWEB("https://maps.googleapis.com/maps/api/geocode/xml?latlng=" & [Latitude] & "," & [Longitude] & "&key=" & 'API-KEY'!$A$1 )
=FILTRE.XML([Https];Tableau1[[#En-têtes];[/GeocodeResponse/status]])
exmple dans le fichier joint (fonctionnel si on a une clé api google)
Une aide ici ... https://support.office.com/fr-fr/article/importer-des-donn%C3%A9es-xml-6eca3906-d6c9-4f0d-b911-c736da817fa4
Néanmoins, ton sujet semble plus simple a priori, je vais regarder ce soir comment décortiquer tes données sans forcément passer par du décodage xml.
bonjour
un essai par matricielle mais que pour les noms afin de tester
cordialement
Une aide ici ... https://support.office.com/fr-fr/article/importer-des-donn%C3%A9es-xml-6eca3906-d6c9-4f0d-b911-c736da817fa4
Néanmoins, ton sujet semble plus simple a priori, je vais regarder ce soir comment décortiquer tes données sans forcément passer par du décodage xml.
Merci pour ton aide, je vais me pencher sur ce que tu as mis aussi histoire de voir si j'arrive à quelque chose.
bonjour
un essai par matricielle mais que pour les noms afin de tester
Ca ne semble pas fonctionner si je rajoute des champs à la suite des premiers en A1 (avec 10 <name> par exemple) ou alors je n'ai pas tout compris.
Proposition
Function elem(texte As String, cle As String, indice As Integer)
Application.Volatile
elem = Split(Split(texte, "<" & cle & ">")(indice), "</" & cle & ">")(0)
elem = Replace(Replace(elem, "<![CDATA[", ""), "]]>", "")
End Function
extensible aux autres "clés" xml
Bonjour Tulipe
re
avec une autre formule (attention pas plus de 255 caractères)
cordialement
Parfait, merci à vous deux