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

5extraction.xlsx (10.20 Ko)

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

76paulox.xlsx (10.51 Ko)

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

4xml-split.xlsm (16.21 Ko)

Bonjour Tulipe

re

avec une autre formule (attention pas plus de 255 caractères)

77paulox2.xlsx (10.51 Ko)

cordialement

Parfait, merci à vous deux

Rechercher des sujets similaires à "extraction multiple"