Autres [XML] Importer fichier XML dans Excel (uniquement certaines colonnes)

StagExcelle

XLDnaute Junior
Bonjour,

Dans le cadre de mon stage, je dois importer un fichier XML puis le rendre plus lisible
Je voudrais le faire par VBA.
Les recherches que j'ai faites sur internet m'ont dirigé sur cette piste : CreateObject("Microsoft.XMLDOM"), XPath SelecNodes etc..
Malheureusement, je ne comprends pas bien ce langage.

Actuellement, j'utilise cette macro construite avec ce que j'ai trouvé sur internet
VB:
Sub xEssai_Macro_XML()
'Déclarations des variables
Dim fd As Office.FileDialog
Dim strFile As String, WBK As Workbook
'Choisir le fichier avec une boite de dialogue
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
    .Filters.Clear
    .Filters.Add "FICHIER XML", "*.xml", 1
    .Title = "Choisir le fichier XML"
    .AllowMultiSelect = False
    If .Show = True Then
    strFile = .SelectedItems(1)
    End If
End With
Application.ScreenUpdating = False
'Importer le fichier dans un tableau dans Excel
strXML_Fic = strFile
Workbooks.OpenXML Filename:=strXML_Fic, LoadOption:=xlXmlLoadImportToList
End Sub
Mais cette macro importe tout le fichier XML alors que le besoin serait de n'importer que certaines colonnes.

Je vous joins un fichier XML dans le fichier ZIP attaché.

Le fichier XML exemple génère une erreur quand on l'importe manuellement ou par macro.
Je ne sais pas pourquoi.

Merci pour l'aide et explications que vous voudrez bien m'apporter.
 

Pièces jointes

  • orderv6.zip
    40.5 KB · Affichages: 13

StagExcelle

XLDnaute Junior
Bonjour patricktoulon

Pour commencer à apprendre, je voudrais récupérer le contenu des colonnes que j'ai mis en jaune dans le message #3.

Je n'arrive pas à faire un fichier XML avec plus de ligne.
Quand j'ajoute des lignes dans Excel et j'enregistre sous au format Données XML
Et que je rouvre ce nouveau fichier dans Excel, je n'ai qu'une seule ligne comme le fichier de départ.

J'ai fais une recherche sur le forum et j'ai trouvé ton code que j'ai voulu modifié pour créer un fichier XML à partir d'Excel
VB:
Sub convertxml()
    Dim xmldoc As Object, oCreation As Object, lig&, Racine As Object, tableau As Object, c&, a As Object, m As Object
    Dim head As Range, rang As Range, period As Object, X&, Fichier$
    Set xmldoc = CreateObject("Microsoft.XMLDOM")    'creation
    Set Racine = xmldoc.createelement("mouvements-balances")  'ajout de la racine "kml"
    Racine.setattribute "xmlns", "http://douane.finances.gouv.fr/app/ciel/dtiplus/v1"
    xmldoc.appendchild Racine    'insertion dans le document (append) de kml
    Set oCreation = xmldoc.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'")    'creation de l'entete du process
    xmldoc.InsertBefore oCreation, xmldoc.ChildNodes.Item(0)    'insertion parametre process
    Set period = xmldoc.createelement("periode-taxation")  'ajout de la racine "kml"
    Racine.appendchild period    'insertion dans le document (append) de kml
    Set head = Feuil1.ListObjects("Tableau3").HeaderRowRange
    Set structab = Feuil1.ListObjects("Tableau3").DataBodyRange
    Set m = xmldoc.createelement("mois"): m.Text = structab.Cells(1, 1).Text: period.appendchild m
    Set a = xmldoc.createelement("Annee"): a.Text = structab.Cells(1, 2).Text: period.appendchild a


    Set identredev = xmldoc.createelement("identification-redevable"): identredev.Text = structab.Cells(1, 3).Text
    Racine.appendchild identredev
    Set head = Feuil1.ListObjects("Tableau3").HeaderRowRange
    Set rang = Feuil1.ListObjects("Tableau3").DataBodyRange
    For lig = 1 To rang.Cells(rang.Cells.Count).Row - 1

        Set prod = xmldoc.createelement("produit"):
        identredev.appendchild prod

        For c = 4 To head.Cells(rang.Cells.Count).Column
            Set bal = xmldoc.createelement(Replace(head.Cells(c).Value, "ns1:", "")): bal.Text = rang.Cells(lig, c).Text
            prod.appendchild bal
        Next


    Next
    Fichier = Environ("userprofile") & "\Desktop\sortie.xml"
    X = FreeFile
    Open Fichier For Output As #X: Print #X, Replace(xmldoc.XML, "><", ">" & vbCrLf & "<"): Close #X
    With CreateObject("internetexplorer.application")
        .navigate Fichier

        .Visible = True
    End With
    Debug.Print Replace(xmldoc.XML, "><", ">" & vbCrLf & "<")
End Sub

Dans les autres discussions qui parlent d'XML, on parle de convertisseur en ligne.
Cela n'a pas marché avec le fichier original.

J'ajoute les lettres des colonnes correspondantes quand on le fichier XML dans Excel
F , G , J , K , Q , R , S , T , V et W

Est-ce que c'est mieux expliqué?
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour
heu avant de te lancer dans la production de XML il faut en connaitre un peu plus quand même
mais ta question portait sur l'import (restons sur ça si tu veux bien)

ma question était claire quel élément veux tu récupérer
c'est facile ils ont un tag (entre les "<" et "</>" )
exemple (ce que tu vois en gras c'est le tagname
<UNECE_RAM_8p0:IssueDateTime>2013-05-01T00:00:00Z</UNECE_RAM_8p0:IssueDateTime>
 

StagExcelle

XLDnaute Junior
Je me suis mal exprimé

Je ne sais pas comment copier le nom des "noeuds" à partir de l'onglet Source XML pour t'indiquer les noms des colonnes désirées.
C'est pour cela que j'ai fait une copie écran de cet onglet dans le message #3
Je mets une autre copie d'un extrait du fichier original
exempleForum.png

(Je voudrais donc récupérer les colonnes à jaune par exemple)

Quand j'ouvre le fichier XML dans Excel, et que j'essaie de supprimer les colonnes qu'il ne faut pas, c'est très long et parfois Excel se fige.

C'est pour cela que je voudrais pouvoir choisir les noeuds (je ne sais si c'est comme cela qu'on dit) à l'ouverture du fichier XML dans Excel
 

StagExcelle

XLDnaute Junior
Si j'ai bien compris, c'est ces infos qu'il te faut patricktoulon?

</rsm:CIOHExchangedDocument>
<rsm:CIOHSupplyChainTradeTransaction>
<ram:ApplicableCIOHSupplyChainTradeAgreement>
<ram:SellerCITradeParty>
<pie:ID schemeAgencyName="token" schemeID="token">367230</pie:ID>
<pie:Name>DEMO TEST</pie:Name>
<pie:SIRET>99999995500038</pie:SIRET>

<pie:postalCITradeAddress>
<pie:LineOne>15 Rue THEODORE MONOD</pie:LineOne>
<pie:LineTwo> </pie:LineTwo>
<pie:postcodeCode>75000</pie:postcodeCode>
<pie:CityName>PARIS</pie:CityName>

<pie:CountryID>FR</pie:CountryID>
</pie:postalCITradeAddress>
</ram:SellerCITradeParty>

Voila par exemple 5 colonnes que je voudrais récupérer en passant par la méthode CreateObject("Microsoft.XMLDOM")

Merci de me dire si il faut d'autres explications.

Je ne sais pas comment on retire les smileys qui se sont mis tout seul.
 

patricktoulon

XLDnaute Barbatruc
re
et en plus je viens de tester sur celui que tu a donné dans le zip il y a certain ensemble qui n'ont pas la city ou la LineOne
parti de là je te le dis tu perds ton temps a vouloir automatiser
et pour peu que d'autres xml ai encore d'autres erreurs c'est la bérézina
oublie ça crois moi
désolé
 

StagExcelle

XLDnaute Junior
Bonjour

Je fais essayer de joindre un fichier XML sans les données réelles.
Mais je ne sais pas faire les modifications autrement que dans le bloc-notes avec Edition/Remplacer.
Ca me prend donc du temps

Je ne sais pas comment faire dans Excel pour modifier un fichier XML puis l'enregistrer sous Données.xml
(Cela affiche des messages d'erreurs)

Dans le fichier ZIP, il y a document Word qui explique un peu la norme ESPPADOM
Est-ce que cela peut aider ?

Sinon, est-ce qu'on peut me conseiller des sites ou des livres pour apprendre XML ?
 

StagExcelle

XLDnaute Junior
Bonjour Etoto, patricktoulon

J'ai été voir sur l'autre forum
J'ai trouvé ce code
Sub parseXML()
Dim xmlDoc As Object
Set xmlDoc = New MSXML2.DOMDocument60
xmlDoc.async = False
Dim strPathToXMLFile As String
strPathToXMLFile = ThisWorkbook.Path & "\ESPPADOM_ORDER_TEST2.xml"
xmlDoc.validateOnParse = True
If Not xmlDoc.Load(strPathToXMLFile) Then
MsgBox "Problème !"
Exit Sub
End If
Dim niveau As Integer, ligne As Integer
niveau = 0
ligne = 2
Call exploreXML(xmlDoc, niveau, ligne)
End Sub

Function exploreXML(noeud As Object, niveau As Integer, ligne As Integer)
If noeud.ChildNodes.Length = 0 Then Exit Function
Dim xNode As Object
For Each xNode In noeud.ChildNodes
If xNode.NodeType <> 3 Then
'Debug.Print niveau, xNode.nodeName, xNode.Text
Cells(ligne, niveau + 1) = xNode.nodeName
Cells(ligne, niveau + 2) = xNode.Text
ligne = ligne + 1
End If
niveau = niveau + 1
Call exploreXML(xNode, niveau, ligne)
niveau = niveau - 1
Next
End Function
(mais il ne fait pas ce que je cherche)

je suis toujours bloqué

Personne ne peut m'aider ?

j'ai essayé plusieurs codes VBA, mais quand on ne connait pas c'est difficile
Dans celui-la, il ne se passe rein (pas d'erreur)
Sub Tester()
Dim xDoc As DOMDocument
Set xDoc = New DOMDocument
xDoc.Load ThisWorkbook.Path & "\ESPPADOM_ORDER_TEST2.xml"
Dim i As Integer
Dim list As IXMLDOMNodeList
Set list = xDoc.SelectNodes("ApplicableCIOHSupplyChainTradeDelivery")
Dim node As IXMLDOMNode, nd As IXMLDOMNode
Dim childNode As IXMLDOMNode
Dim price As IXMLDOMNode
i = 2
For Each node In list
i = i + 1
With Sheets(1).Rows(i)
.Cells(1).Value = GetNodeValue(node, "pie:Name")
End With
Next node
End Sub

Function GetNodeValue(node As IXMLDOMNode, xp As String)
Dim n As IXMLDOMNode, nv
Set n = node.SelectSingleNode(xp)
If Not n Is Nothing Then nv = n.nodeTypedValue
GetNodeValue = nv
End Function
Je ne sais pas quel nom il faut mettre pour Set list
ou sur la ligne Cells(1).value=GetNodeValue(node, "pie:Name")

J'ai presque fini de créer le fichier XML Exemple à partir du vrai.
 

StagExcelle

XLDnaute Junior
Suite aux informations de Roblochon et patricktoulon, je mets les explications pour traiter une seule colonne

Quand on ouvre le fichier XML dans Excel, le titre de la colonne P est : ns4:Name
qui je crois correspond dans le XML affiché dans Internet (comme me l'a conseillé patricktoulon) à:
Code:
<rsm:CIOHSupplyChainTradeTransaction>                                                                                            
        <ram:ApplicableCIOHSupplyChainTradeAgreement>                                                                                  
          <ram:SellerCITradeParty>                                                                                                     
            <pie:ID schemeAgencyName="token" schemeID="token">367230</pie:ID>                                   
            <pie:Name>SAAD TEST</pie:Name>                                                                          
            <pie:SIRET>99999999900038</pie:SIRET>                                                                      
            <pie:postalCITradeAddress>                                                                                                 
              <pie:LineOne>50 Rue THEODORE MONOD</pie:LineOne>                                                                                     
              <pie:LineTwo>  </pie:LineTwo>                                                                                              
              <pie:postcodeCode>35400</pie:postcodeCode>                                                                               
              <pie:CityName>PARIS</pie:CityName>                                                                     
              <pie:CountryID>FR</pie:CountryID>                                                                                          
            </pie:postalCITradeAddress>                                                                                                
          </ram:SellerCITradeParty>
Le début du fichier XML est :
Code:
<?xml version="1.0" encoding="UTF-8"?>
<rsm:eek:rder 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xsi:noNamespaceSchemaLocation="order.root.xsd" 
xmlns:pie="urn:un:unece:uncefact:data:standard:personInformationEntity:1"
xmlns:qdt="urn:un:unece:uncefact:data:standard:QualifiedDataType:8"
xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:9"
xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:8"
xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryOrder:1"
versionID="1.2"
>
Je teste dans les macros trouvées sur internet de modifier en mettant le nom de colonnes

Ici quand je teste avec pie:Name, il ne se passe rien
Voila le code que j'ai tenté de modifié
VB:
[/B]
Sub Tester()
Dim xDoc As DOMDocument
Set xDoc = New DOMDocument
xDoc.Load ThisWorkbook.Path & "\ESPPADOM_ORDER_TEST2.xml"
Dim i As Integer
Dim list As IXMLDOMNodeList
Set list = xDoc.SelectNodes("ApplicableCIOHSupplyChainTradeDelivery")
Dim node As IXMLDOMNode, nd As IXMLDOMNode
Dim childNode As IXMLDOMNode
Dim price As IXMLDOMNode
i = 2
    For Each node In list
        i = i + 1
        With Sheets(1).Rows(i)
            .Cells(1).Value = GetNodeValue(node, "pie:Name")
        End With
    Next node
End Sub

Function GetNodeValue(node As IXMLDOMNode, xp As String)
    Dim n As IXMLDOMNode, nv
    Set n = node.SelectSingleNode(xp)
    If Not n Is Nothing Then nv = n.nodeTypedValue
    GetNodeValue = nv
End Function
 

Statistiques des forums

Discussions
315 094
Messages
2 116 156
Membres
112 672
dernier inscrit
djudju