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

patricktoulon

XLDnaute Barbatruc
re
écoute c'est simple ce que l'on te demande
donne nous un fichier excel fait a la main avec ton tableau comme tu veux qu'il soit (quelque lignes)
et le fichier XML a quoi il correspond
que l'on voit déjà si c'est possible
c'est pas compliqué sinon on va y passer des plombes et on va pas s'en sortir
et perso je travaille en vba mais pas avec xpath ,je travaille a l'ancienne avec le DOM

Le Document Object Model (DOM) est une interface de programmation normalisée par le W3C, qui permet à des scripts(VB,VBA,VBS,Javascript,etc..) d'examiner et de modifier le contenu d'un document structuré avec des balises
 

StagExcelle

XLDnaute Junior
patricktoulon

Je ne sais pas faire un fichier XML à partir d'Excel
Si j'ouvre le fichier XML dans Excel et que je supprime des lignes et que je retire les données réelles, je ne peux pas ensuite l'exporter en XML.

C'est pour cela que je fais la méthode que tu m'as dit
L'afficher dans Internet Explorer (ce que j'ai fait)
Ensuite j'ai fait Afficher la source et je fais Edition/Remplacer pour remplacer tout ce je n'ai pas le droit de diffuser sur le forum.
Je mets ce que je vois dans Internet

Comme on me donne d'autres travaux à faire, je modifie le fichier XML quand j'ai fini.

Désolé, mais je n'ai pas vos compétences, j'essaie de m'en sortir comme je peux.
 

Pièces jointes

  • ModificationEnCours.png
    ModificationEnCours.png
    68.3 KB · Affichages: 23

StagExcelle

XLDnaute Junior
J'ai réussi à a faire un fichier xml raccourci


Donc à partir du fichier XML qui est dans le fichier ZIP, il faut par exemple ne garder que ces colonnes
ns4:NameColonne P
ns4:SIRETColonne Q
ns4:Name20Colonne AU
ns2:ChargeTotalAmountColonne CQ
ns2:CalculationPercentColonne DA
ns2:ReasonCodeColonne DB
ns3:NameColonne DF
 

Pièces jointes

  • ESPPADOM_TEST_5.zip
    3.5 KB · Affichages: 3
Dernière édition:

StagExcelle

XLDnaute Junior
patricktoulon,

Les colonnes indiquées dans le tableau du message #34 sont les colonnes EXCEL quand on ouvre le fichier dans EXCEL.
J'ai fait Données/Autres sources/Fichier XML
Après avoir répondu OK aux deux messages d'erreur, j'obtiens un tableau mise en forme automatiquement par EXCEL.
Ensuite, je mets les lignes du tableau même hauteur que la ligne 1.

C'est ensuite que je sais pas faire

Je me mélange avec Nodes, SingleNode , SelectNodes etc.

Je ne sais quels sont les noms des nœuds à utiliser dans le code VBA.

Merci si vous pouvez m'expliquez un peu comment fonctionne DOM.
 

StagExcelle

XLDnaute Junior
Bonjour Hasco

Voici le code de mes essais actuels en VBA
VB:
Sub ImportationFichierXML() ' version de septembre 2021
'Des portions de code sont issues ou adaptées du forum Excel Downloads,d'exemples lus sur des sites internet ou dans des livres VBA
Dim Fichier_XML As String, WBK As Workbook, Feuil As Worksheet
Dim Contenu_XML As Variant, colonnes
Fichier_XML = ThisWorkbook.Path & "\ESPPADOM_TEST_5.xml"
Application.ScreenUpdating = False
'Ouverture du fichier XML dans un nouveau classeur ne contenant qu'une feuille
With ActiveSheet.QueryTables.Add(Connection:="FINDER;" & Fichier_XML, Destination:=Workbooks.Add(1).Sheets(1).Cells(1))
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .BackgroundQuery = False
        .RefreshStyle = xlInsertDeleteCells
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .Refresh BackgroundQuery:=False
End With
'On définit le nouveau classeur
Set WBK = Workbooks(ActiveWorkbook.Name)
'On définit la feuille de travail
Set Feuil = WBK.Sheets(WBK.Sheets.Count)
Feuil.Activate
'Ajustement des lignes et nettoyage des données
Feuil.Rows("1:2").EntireRow.Delete
Feuil.Cells.RowHeight = 15
Feuil.Columns(105).Delete
'Remplissage du tableau en mémoire : Contenu_XML
Contenu_XML = Feuil.UsedRange.Value
'Effacement de la feuille
Feuil.UsedRange.ClearContents
'Choix des colonnes à garder dans un tableau en mémoire: colonnes
colonnes = Array(84, 87, 89, 85, 110, 116, 119, 123, 126)
'Restitution de la sélection des données issues du fichier XML initial
Feuil.Range("A1").Resize(UBound(Contenu_XML), 9).Value = Application.Index(Contenu_XML, Evaluate("Row(1:" & UBound(Contenu_XML) & ")"), colonnes)
'Mise en forme esthétique
Feuil.Range("E:F").NumberFormat = "0.00"
Feuil.UsedRange.EntireColumn.AutoFit
'reste à faire: Enregistrer sous => Format XLSX ou PDF puis envoi par mail
End Sub
N'hésitez pas à me dire ce que vous en pensez. Merci.

J'ai pris cette piste à cause de la grande taille de certains fichiers XML.

Et après réunion avec les encadrants, on s'oriente plus vers la diffusion du fichier Excel avec une macro VBA.
(comme celle de ce message)
Et c'est le client qui traite le fichier XML qu'on lui dépose dans le Cloud.
(ou par mail si petit taille)
 

StagExcelle

XLDnaute Junior
Bonjour Hasco

Comme promis, je fais le retour de mes tests avec votre code
VB:
Sub EssaisV3_DOM()
    Dim Ids As IXMLDOMSelection
    Dim Id As IXMLDOMElement
    Dim Data1() As Variant
    Dim Data2() As Variant
    Dim Data3() As Variant
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    If Ouvrir() Then
    SetNameSpace NS_PIE
        Set Ids = xmlDoc.SelectNodes("//pie:DefinedCITradeContact/pie:PersonName")
        ReDim Data1(1 To Ids.Length, 1 To 3)
        For Each Id In Ids
            i = i + 1
            Data1(i, 1) = Id.Text
        Next
       
        Set Ids = xmlDoc.SelectNodes("//pie:AdditionnalInformation/pie:Content")
        ReDim Data2(1 To Ids.Length, 1 To 3)
        For Each Id In Ids
            j = j + 1
            Data2(j, 1) = Id.Text
        Next
       
    SetNameSpace NS_RAM
    Set Ids = xmlDoc.SelectNodes("//ram:SpecifiedCIOLSupplyChainTradeSettlement/ram:SpecifiedCITradeAllowanceCharge/ram:CalculationPercent")
        ReDim Data3(1 To Ids.Length, 1 To 3)
        For Each Id In Ids
            k = k + 1
            Data3(k, 1) = Id.Text
        Next
     End If
    ThisWorkbook.Sheets("Feuil1").Range("C2").Resize(i) = Data1
    ThisWorkbook.Sheets("Feuil1").Range("D2").Resize(j) = Data2
    ThisWorkbook.Sheets("Feuil1").Range("E2").Resize(k) = Data3
    Set xmlDoc = Nothing
End Sub
Mais je n'arrive pas encore à bien comprendre la logique.
Ce que j'essaie d'avoir avec votre code c'est un résultat de ce genre
résultat_cherché.png

Cela j'arrive à le faire avec le code de mon message précédent.

Mais j'aimerais réussir à le faire avec votre code VBA.

Vous pouvez m'apportez votre aide, svp?
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

He bien donnez vous du mal, apprenez la structure de votre fichier xml, comment atteindre un ou des éléments particuliers par xpath, à manipuler les collections d'éléments et leurs attributs.

Ce n'est pas moi qui vais le faire à votre place.

Bon courage
 

StagExcelle

XLDnaute Junior
Bonjour Hasco

Je ne demande pas à ce que vous fassiez les choses à ma place.
Je suis débutant dans le traitement de fichier XLM avec DOM, donc je sollicite simplement aide et conseil auprès des membres "expert" tel que vous.

Je croyais que c'était l'essence des forums: aider et aiguiller les débutants

(Je vous remercie encore de m'avoir fait avancé avec vos exemples)

Dans le message # 41, j'ai fais des tests par moi-même non ? En partant de votre code.

Pouvez-vous me dire, svp, si faire plusieurs boucles est à faire ou pas ?

Je me connecte sur le forum juste quand je suis dans l'entreprise (mais jamais trop longtemps)
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

SelectNodes(xPath) retourne une collection d'éléments d'indice 0 à n.
Il faut donc faire une boucle sur la collection.

SelectSingleNode(xPath) retourne un seul élément, il n'y a donc pas de boucle à faire.
A vous de connaître la structure de votre document et de savoir ce que vous voulez retourner.

J'ai vu dans les pages précédentes de cette discussion que d'autres vous ont donné également des exemples.
Tirez-en profit.

Cordialement
 

Statistiques des forums

Discussions
315 094
Messages
2 116 157
Membres
112 673
dernier inscrit
ìntellisoft