Je suis un novice en XML et Excel aussi, je dois constituer un fichier csv basé sur un XML afin de faire correspondre les données du XML dans la colonne/position attendue.
Le fichier XML contient des "name" et des "value". chaque "name" à une "value" associée et séparé par un "TLE"
Comment puis je faire pour que chaque "name" puisse être identifiée comme une zone de mappage et qu'ainsi les "value" soient positionnées
re
c'est pas une ligne qu'il faut changer
on garde le moteur on met un carbu double corps on remplace les cable par l'hydrolique
on modifie un peu ici et là
on la transform en fonction
on ajoute une sub de pilotage (grand guidon)
choisi le dossier dans la boite de dialogue
VB:
Sub test()
Dim sfolder$, fichier, header$, y&, file$
fichier = ThisWorkbook.Path & "\compilation.csv"
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = -1 Then ' if OK is pressed
sfolder = .SelectedItems(1)
Else: Exit Sub
End If
End With
header = "NumeroCient;NumeroContrat;NumeroSinistre;Identifiant Unique document;Code Maquette;Date de creation Document;Civilité;Nom;Prenom;" & _...
Vu que tu as Excel 2016, tu peux donc utiliser PowerQuery pour récupérer les informations de ton fichier XML sous cette forme :
Avec cette requête :
PowerQuery:
let
pathXml = "C:\...\FichierSource.xml",
SourceXml = Xml.Tables(File.Contents(pathXml)),
TLE = SourceXml{0}[TLE],
ValueDéveloppée = Table.ExpandTableColumn(TLE, "Value", {"Element:Text"}, {"Value"}),
ValueNettoyée = Table.TransformColumns(ValueDéveloppée,{{"Value", Text.Trim, type text}}),
PivotColumn = Table.Pivot(ValueNettoyée, List.Distinct(ValueNettoyée[Name]), "Name", "Value")
in
PivotColumn
Tu peux aussi supprimer la dernière étape PivotColumn si tu préfères récupérer tes données ainsi :
C'est un début, peut-être que ça t'aidera à arriver à ton but.
Sinon, n'hésite pas à donner plus d'infos et des fichiers exemples.
@FS69 :
Je t'avoue ne pas trop comprendre ce que tu veux quand tu dis :
Vu que tu as Excel 2016, tu peux donc utiliser PowerQuery pour récupérer les informations de ton fichier XML sous cette forme : Regarde la pièce jointe 1201548
Avec cette requête :
PowerQuery:
let
pathXml = "C:\...\FichierSource.xml",
SourceXml = Xml.Tables(File.Contents(pathXml)),
TLE = SourceXml{0}[TLE],
ValueDéveloppée = Table.ExpandTableColumn(TLE, "Value", {"Element:Text"}, {"Value"}),
ValueNettoyée = Table.TransformColumns(ValueDéveloppée,{{"Value", Text.Trim, type text}}),
PivotColumn = Table.Pivot(ValueNettoyée, List.Distinct(ValueNettoyée[Name]), "Name", "Value")
in
PivotColumn
Tu peux aussi supprimer la dernière étape PivotColumn si tu préfères récupérer tes données ainsi : Regarde la pièce jointe 1201549
C'est un début, peut-être que ça t'aidera à arriver à ton but.
Sinon, n'hésite pas à donner plus d'infos et des fichiers exemples.
Tout d'abord merci pour votre réponse, je vais essayer votre proposition.
Concernant ma demande, je vais essayer de l'expliciter plus clairement :
Je vais recevoir dans différents répertoires des fichiers au format XML, chaque répertoire peu avoir des fichiers avec des balises spécifiques.
La façon dont sont constitués les XML sont :
une balise "name"
et une autre "value".
Or, pour mon besoin, la valeur présente dans la balise "name" devrait être une balise et la "value" la valeur associée à cette balise.
Sub test()
Dim t$, Nodexs As Object
With CreateObject("microsoft.xmldom")
.Load "C:\Users\patricktoulon\Desktop\exemple.xml"
Set Nodexs = .getelementsbytagname("Name")
For i = 0 To Nodexs.Length - 1
t = t & Nodexs(i).Text & ":" & vbTab & Nodexs(i).NextSibling.Text & vbCrLf
Next
End With
MsgBox t
End Sub
parti de là il est facile d'organiser une restitution dans un ordre particulier et d'en faire une fonction générique
qui pourrait scruter tout un dossier et prendre tout les fichiers en un seul coup
Sub test()
Dim t$, Nodexs As Object
With CreateObject("microsoft.xmldom")
.Load "C:\Users\patricktoulon\Desktop\exemple.xml"
Set Nodexs = .getelementsbytagname("Name")
For i = 0 To Nodexs.Length - 1
t = t & Nodexs(i).Text & ":" & vbTab & Nodexs(i).NextSibling.Text & vbCrLf
Next
End With
MsgBox t
End Sub
parti de là il est facile d'organiser une restitution dans un ordre particulier et d'en faire une fonction générique
qui pourrait scruter tout un dossier et prendre tout les fichiers en un seul coup Regarde la pièce jointe 1201553
Merci pour votre proposition de lecture des données mais je dois inclure les données dans un csv au format contraint ainsi au delà de la lecture je dois réussir à positionner les valeurs dans une zone attendue
par exemple la civilité CCIV devra aller en colonne H
les entêtes ,tu peux nous les donner en texte que l'on soit pas obligé de se le taper
2d question chaque xml aura son csv ou le csv contiendra tout les xml?
bon je l'ai fait
voici un exemple qui te transforme ton xml en csv
VB:
Sub test()
Dim t, Nodexs As Object, x&, header, tabhead, tb$(), i, myfile$, myfileCsV$
header = "NumeroCient;NumeroContrat;NumeroSinistre;Identifiant Unique document;Code Maquette;Date de creation Document;Civilité;Nom;Prenom;" & _
"branche;famille;Sous famille;Sous Famille2;Libellé Produit;Univers;sendflux;sourceged;libelléstatut;docencrys;" & _
"IDAQUISIT;IDAQUISIT;IDAQUISIT;Chemin d'acces au fichier"
tabhead = Split(header, ";")
ReDim tb(UBound(tabhead))
myfile = "C:\Users\patricktoulon\Desktop\exemple.xml"'chemin à adapter'
myfileCsV = Replace(myfile, ".xml", ".csv")'chemin à adapter'
With CreateObject("microsoft.xmldom")
.Load myfile
Set Nodexs = .getelementsbytagname("Name")
For i = 0 To Nodexs.Length - 1
' t = t & Nodexs(i).Text & ":" & vbTab & Nodexs(i).NextSibling.Text & vbCrLf
Select Case Nodexs(i).Text
Case "datedoc": tb(5) = Nodexs(i).NextSibling.Text
Case "numadh": tb(1) = Nodexs(i).NextSibling.Text
Case "numcli": tb(0) = Nodexs(i).NextSibling.Text
Case "cciv": tb(6) = Nodexs(i).NextSibling.Text
Case "nom1": tb(8) = Nodexs(i).NextSibling.Text
Case "nom2": tb(7) = Nodexs(i).NextSibling.Text
Case "cetat": tb(4) = Nodexs(i).NextSibling.Text
End Select
Next
tb(UBound(tb)) = .getelementsbytagname("*")(1).Text
x = FreeFile: Open myfileCsV For Output As #x: Print #x, header & vbCrLf & Join(tb, ";"): Close #x
End With
End Sub
bon je l'ai fait
voici un exemple qui te transforme ton xml en csv
VB:
Sub test()
Dim t, Nodexs As Object, x&, header, tabhead, tb$(), i, myfile$, myfileCsV$
header = "NumeroCient;NumeroContrat;NumeroSinistre;Identifiant Unique document;Code Maquette;Date de creation Document;Civilité;Nom;Prenom;" & _
"branche;famille;Sous famille;Sous Famille2;Libellé Produit;Univers;sendflux;sourceged;libelléstatut;docencrys;" & _
"IDAQUISIT;IDAQUISIT;IDAQUISIT;Chemin d'acces au fichier"
tabhead = Split(header, ";")
ReDim tb(UBound(tabhead))
myfile = "C:\Users\patricktoulon\Desktop\exemple.xml"'chemin à adapter'
myfileCsV = Replace(myfile, ".xml", ".csv")'chemin à adapter'
With CreateObject("microsoft.xmldom")
.Load myfile
Set Nodexs = .getelementsbytagname("Name")
For i = 0 To Nodexs.Length - 1
' t = t & Nodexs(i).Text & ":" & vbTab & Nodexs(i).NextSibling.Text & vbCrLf
Select Case Nodexs(i).Text
Case "datedoc": tb(5) = Nodexs(i).NextSibling.Text
Case "numadh": tb(1) = Nodexs(i).NextSibling.Text
Case "numcli": tb(0) = Nodexs(i).NextSibling.Text
Case "cciv": tb(6) = Nodexs(i).NextSibling.Text
Case "nom1": tb(8) = Nodexs(i).NextSibling.Text
Case "nom2": tb(7) = Nodexs(i).NextSibling.Text
Case "cetat": tb(4) = Nodexs(i).NextSibling.Text
End Select
Next
tb(UBound(tb)) = .getelementsbytagname("*")(1).Text
x = FreeFile: Open myfileCsV For Output As #x: Print #x, header & vbCrLf & Join(tb, ";"): Close #x
End With
End Sub
C'est presque parfait, j'ai fait le test sur un fichier XML mais je n'ai qu'une seule ligne correspondant à la dernière ligne et dans chemin d'accès figure le filename + les lignes de la 1e ligne
heu... c'est quoi cette capture c'est pas le résultat que tu doit avoir
alors il y a deux solutions
soit tes xmls n'ont pas tout a fait la même structure
soit ben je sais
donne moi quelques xml pour vérifier