[VBA] Lire certaines données d'un fichier XML
Le
HD

Bonjour,
J'ai un fichier XML qui doit me revenir régulièrement. Dans ce fichier,
seules quelques données m'intéresse. J'ai cherché à lire le fichier XML
pour ne faire ressortir que certaines données mais je n'y suis pas
parvenue. J'arrive soit à importer sur Excel la liste des balises du
fichier, soit à importer les valeurs de toutes les données du fichier
mais sans les balises et donc sans savoir quoi correspond à quelle
donnée.
J'ai ajouté la référence à "Microsoft XML, v3.0".
J'ai essayé ce script :
Sub ReadXMLFileXMLIndent()
Dim oXML As MSXML2.DOMDocument
Dim oNode As MSXML2.IXMLDOMNode
Set oXML = New MSXML2.DOMDocument
oXML.async = False
oXML.Load "Z:MatricesComptaannexe.XML"
i = 1
For Each oNode In oXML.DocumentElement.ChildNodes
For Each oSubNode In oNode.ChildNodes
Cells(i, 1).Value = oSubNode.BaseName
Cells(i, 2).Value = oSubNode.Text
i = i + 1
Next
Next
End Sub
Mais cela ne m'importe rien du tout Il doit également probablement
y'avoir une solution pour importer plus directement la valeur d'une
donnée.
Voici à quoi ressemble mon fichier XML:
<?xml version="1.0" standalone="yes" ?>
- <ANBA>
<ANXCV NOM_NUM_DOSS="SAWARAP" TITRE_DU_DOCUMENT="DETTES"
DATES_DE_L_EXERCICE="Du 01/07/2013 au 30/06/2014"
VA-EMP.OBLIG.CONVERT="0" EMP.OBLIG.CONV._1_AN="0"
EMP.OBLIGAT.CONV.__1A_-5A="0" EMP.OBLIGAT.CONVERTI._5AN="0"
VB-AUTRES_EMP.OBLIG.="0" AUTR.EMP.OBLIG._1_AN="0"
AUT.EMP.OBLIGAT.__1A_-5A="0" AUT.EMP.OBLIGATAIRES__5AN="0"
EMPR._ET_DETTES_2_ANS_MAX="0" EMP._2_ANS_-__1_AN="43708,38"
EMP_DET.A_2A_MAX__1A_-5A="0" EMP_DET_2A_MAX_ORIG._5AN="0" M1="1"
EMP._2_ANS_-_BRUT="186852,67" EMP_DET.A__2A_OR__1A_-5A="123686,18"
EMP_DET__2A_A_L_ORIG._5AN="19458,11" VE-EMP_DETT.FINANC.="2803,96"
EMP_DETT.FINANC._1AN="2803,96" EMP_DET.FINA.DIV._1A_-5A="0"
EMP.__DET.FINANC.DIV._5AN="0" VF-FOURNISSEURS="14726,81"
FOURNISSEURS__1_AN="14726,81" FRS_CPTES_RATTAC._1A_-5A="0"
FRS___CPTES_RATTACHES__5A="0" VG-PERSONNEL="0" PERSONNEL__1_AN="0"
PERS_CPTES_RATTAC._1A_-5A="0" PERS.__CPTES_RATTACHE__5A="0"
ORGANISM_SOCIAUX="16169" M.S.A.__1_AN="16169"
SS___ORGAN.SOCIAU__1A_-5A="0" SS___ORGANISM.SOCIAUX__5A="0"
ETAT-TAXES_C.A.="6749,55" T.V.A.__1_AN="6749,55" ETAT_TVA__1A_-5A="0"
ETAT_TVA__5ANS="0" _6J-AUTRES_I._ET_T.="0" AUTRES_I._ET_T._1_AN="0"
AUT_IMP.TAX_ASSIM._1A_-5A="0" AUT.IMPOTS_TAXES__5ANS="0"
DW-DETTES_IMMOBILIS.="0" DETT_IMMOB.__1_AN="0"
DET_IMMO.__CPT_RAT._1A_-5="0" DET_IMMOS___CPTES_RAT__5A="0"
_6L-GROUPE__ASSOCIES="0" GROUPE__ASSOCIES__1A="0"
GROUP.COMMU.AASOC._1A_-5A="0" GROUP_COMMU.ASSOCIES__5AN="0"
_6M-AUTRES_DETTES="5138,14" AUTRES_DETTES__1_AN="5138,14"
AUTRES_DETTES__1A_-5A="0" AUTRES_DETTES__5AN="0"
DY-PROD.CONSTAT.D_AV="0" PROD.CONSTAT.AV._1AN="0"
PROD.CONST.D_AVANC._1A_-5="0" PROD.CONSTATES_D_AVANC._5="0"
_6P-TOTAL_DETTES="232440,13" TOTAL_DETTES__1_AN="89295,84"
TOTAL_DETTES_1_AN_5="123686,18" TOTAL_DETTES__5_ANS="19458,11"
EMP.SOUSCRITS_EN_CRS_EXER="113800" EMP.REMBOURSES_EN_CRS_EXE="39793,05"
DIV.EMP_DET_CONT.AUP.ASSO="0" NUMEROTATION_DE_LA_PAGE="1" />
</ANBA>
Je cherche à récupérer les valeurs des données:
TOTAL_DETTES__1_AN
TOTAL_DETTES_1_AN_5
TOTAL_DETTES__5_ANS
Auriez vous un bout de script me permettant de comprendre comment l'on
peut importer ces valeurs ?
Merci d'avance pour votre aide,
@+
HD
J'ai un fichier XML qui doit me revenir régulièrement. Dans ce fichier,
seules quelques données m'intéresse. J'ai cherché à lire le fichier XML
pour ne faire ressortir que certaines données mais je n'y suis pas
parvenue. J'arrive soit à importer sur Excel la liste des balises du
fichier, soit à importer les valeurs de toutes les données du fichier
mais sans les balises et donc sans savoir quoi correspond à quelle
donnée.
J'ai ajouté la référence à "Microsoft XML, v3.0".
J'ai essayé ce script :
Sub ReadXMLFileXMLIndent()
Dim oXML As MSXML2.DOMDocument
Dim oNode As MSXML2.IXMLDOMNode
Set oXML = New MSXML2.DOMDocument
oXML.async = False
oXML.Load "Z:MatricesComptaannexe.XML"
i = 1
For Each oNode In oXML.DocumentElement.ChildNodes
For Each oSubNode In oNode.ChildNodes
Cells(i, 1).Value = oSubNode.BaseName
Cells(i, 2).Value = oSubNode.Text
i = i + 1
Next
Next
End Sub
Mais cela ne m'importe rien du tout Il doit également probablement
y'avoir une solution pour importer plus directement la valeur d'une
donnée.
Voici à quoi ressemble mon fichier XML:
<?xml version="1.0" standalone="yes" ?>
- <ANBA>
<ANXCV NOM_NUM_DOSS="SAWARAP" TITRE_DU_DOCUMENT="DETTES"
DATES_DE_L_EXERCICE="Du 01/07/2013 au 30/06/2014"
VA-EMP.OBLIG.CONVERT="0" EMP.OBLIG.CONV._1_AN="0"
EMP.OBLIGAT.CONV.__1A_-5A="0" EMP.OBLIGAT.CONVERTI._5AN="0"
VB-AUTRES_EMP.OBLIG.="0" AUTR.EMP.OBLIG._1_AN="0"
AUT.EMP.OBLIGAT.__1A_-5A="0" AUT.EMP.OBLIGATAIRES__5AN="0"
EMPR._ET_DETTES_2_ANS_MAX="0" EMP._2_ANS_-__1_AN="43708,38"
EMP_DET.A_2A_MAX__1A_-5A="0" EMP_DET_2A_MAX_ORIG._5AN="0" M1="1"
EMP._2_ANS_-_BRUT="186852,67" EMP_DET.A__2A_OR__1A_-5A="123686,18"
EMP_DET__2A_A_L_ORIG._5AN="19458,11" VE-EMP_DETT.FINANC.="2803,96"
EMP_DETT.FINANC._1AN="2803,96" EMP_DET.FINA.DIV._1A_-5A="0"
EMP.__DET.FINANC.DIV._5AN="0" VF-FOURNISSEURS="14726,81"
FOURNISSEURS__1_AN="14726,81" FRS_CPTES_RATTAC._1A_-5A="0"
FRS___CPTES_RATTACHES__5A="0" VG-PERSONNEL="0" PERSONNEL__1_AN="0"
PERS_CPTES_RATTAC._1A_-5A="0" PERS.__CPTES_RATTACHE__5A="0"
ORGANISM_SOCIAUX="16169" M.S.A.__1_AN="16169"
SS___ORGAN.SOCIAU__1A_-5A="0" SS___ORGANISM.SOCIAUX__5A="0"
ETAT-TAXES_C.A.="6749,55" T.V.A.__1_AN="6749,55" ETAT_TVA__1A_-5A="0"
ETAT_TVA__5ANS="0" _6J-AUTRES_I._ET_T.="0" AUTRES_I._ET_T._1_AN="0"
AUT_IMP.TAX_ASSIM._1A_-5A="0" AUT.IMPOTS_TAXES__5ANS="0"
DW-DETTES_IMMOBILIS.="0" DETT_IMMOB.__1_AN="0"
DET_IMMO.__CPT_RAT._1A_-5="0" DET_IMMOS___CPTES_RAT__5A="0"
_6L-GROUPE__ASSOCIES="0" GROUPE__ASSOCIES__1A="0"
GROUP.COMMU.AASOC._1A_-5A="0" GROUP_COMMU.ASSOCIES__5AN="0"
_6M-AUTRES_DETTES="5138,14" AUTRES_DETTES__1_AN="5138,14"
AUTRES_DETTES__1A_-5A="0" AUTRES_DETTES__5AN="0"
DY-PROD.CONSTAT.D_AV="0" PROD.CONSTAT.AV._1AN="0"
PROD.CONST.D_AVANC._1A_-5="0" PROD.CONSTATES_D_AVANC._5="0"
_6P-TOTAL_DETTES="232440,13" TOTAL_DETTES__1_AN="89295,84"
TOTAL_DETTES_1_AN_5="123686,18" TOTAL_DETTES__5_ANS="19458,11"
EMP.SOUSCRITS_EN_CRS_EXER="113800" EMP.REMBOURSES_EN_CRS_EXE="39793,05"
DIV.EMP_DET_CONT.AUP.ASSO="0" NUMEROTATION_DE_LA_PAGE="1" />
</ANBA>
Je cherche à récupérer les valeurs des données:
TOTAL_DETTES__1_AN
TOTAL_DETTES_1_AN_5
TOTAL_DETTES__5_ANS
Auriez vous un bout de script me permettant de comprendre comment l'on
peut importer ces valeurs ?
Merci d'avance pour votre aide,
@+
HD
As-tu regardé ceci :
https://support.office.com/en-us/article/Import-XML-data-6eca3906-d6c9-4f0d-b911-c736da817fa4?ui=fr-fr&rs=en-US&ad=US
http://support.microsoft.com/kb/305795/fr
Ce lien me donne la manip à faire manuellement. Mais je cherche à
pouvoir récupérer certaines données d'un fichier XML en VBA.
Lorsque j'ai tenté au tout début d'importer un fichier XML avec
enregistrement de macro VBA pour voir le résultat je n'ai
malheureusement pas obtenu grand chose...
@+
HD
s'affichent pas ?
Tu peux créer un fichier Excel sans modifier le fichier XML original. Pour
ce faire, ce type de macro. La feuille de ton fichier .xml va se retrouve
dans un classeur "standard". À partir de ce dernier, tu peux extraire toutes
les données que tu désires... Où est le problème?
'--------------------------------------
Sub Test()
'En adaptant le nom des objets
With workbooks("Classeur1.xml")
With Worksheets("Feuil1")
.Copy
End With
End With
End Sub
'--------------------------------------
Bonjour,
En fait, ces trois infos sont des attributs du noeud <ANXCV>.
Pour les récupérer, il faut faire quelque chose du genre :
Dim oXML As MSXML2.DOMDocument
Dim td1 as double, td1s as double, td5 as double
Set oXML = New MSXML2.DOMDocument
oXML.async = False
oXML.Load "D:test.XML"
td1=oXML.getElementsByTagName("ANXCV").Item(0).Attributes.getNamedItem("TOTAL_DETTES__1_AN").NodeValue
td1s=oXML.getElementsByTagName("ANXCV").Item(0).Attributes.getNamedItem("TOTAL_DETTES_1_AN_S").NodeValue
td5=oXML.getElementsByTagName("ANXCV").Item(0).Attributes.getNamedItem("TOTAL_DETTES__5_ANS").NodeValue
Set oXml=nothing
db
Si j'essaie d'ouvrir le fichier XML directement via Excel, il me
propose:
1) en tant que tableau XML
2) en tant que classeur en lecture seule
3) utiliser le volet Office Source XML
La solution 1 ne m'intéresse pas puisque cela me récupère toutes les
données en vrac sans que je puisse savoir exactement où se trouve mes
données.
La solution 2 pourrait m'intéresser... par contre tout est récupéré sur
deux lignes de plusieurs centaines de colonnes (lorsque j'utilise un
fichier XML complet). C'est envisageable. L'ouverture se fait via
Workbooks.Open Filename:=monFicXML. Y'a-t-il moyen d'ouvrir le fichier
non en 2 lignes mais en 2 colonnes ? Si les données sont ouvertes en 2
lignes (avec autant de colonnes que de données) J'ai peur d'être un jour
limité par le nombre de données qui ne doit (avec xlsb) pas dépasser les
16384...
La solution 3 sera bien plus propre car je peux sélectionner les données
que je veux pour les placer sur les cellules que je souhaite et faire
apparaître le nom de la variable... par contre, je ne sais
malheureusement pas le manipuler en VBA.
Pour l'ouvrir:
Workbooks.OpenXML Filename:=MonFicXML, LoadOption:=xlXmlLoadMapXml
Puis... pour placer les cellules là je ne sais pas...
Sinon, je pensais qu'il était directement possible d'attaquer un fichier
XML en VBA pour ne récupérer que quelques données ?
@+
HD
feuille :
Dim oXML As MSXML2.DOMDocument, i As Byte
Set oXML = New MSXML2.DOMDocument
Dim oNode As MSXML2.IXMLDOMNode
oXML.async = False
oXML.Load "...XML"
Set oNode = oXML.getElementsByTagName("ANXCV").Item(0)
For i = 1 To oNode.Attributes.Length
Cells(i, 1) = oNode.Attributes.Item(i - 1).BaseName
Cells(i, 2) = oNode.Attributes.Item(i - 1).NodeValue
Next
Set oNode = Nothing
Set oXML = Nothing
db
Impeccable !!! C'est ce que je recherchais. Je l'ai testé sur plusieurs
fichiers XML avec plusieurs n½uds et données différentes.
Un grand MERCI à vous deux pour m'avoir permis d'avancer à ce sujet.
Cela me sera d'un grand secours.
@+
HD
ça va mieux quand il y a des n½uds .... -))
Jacquouille
" Le vin est au repas ce que le parfum est à la femme."
"HD" a écrit dans le message de groupe de discussion :
m54l8c$q9$
Impeccable !!! C'est ce que je recherchais. Je l'ai testé sur plusieurs
fichiers XML avec plusieurs n½uds et données différentes.
Un grand MERCI à vous deux pour m'avoir permis d'avancer à ce sujet.
Cela me sera d'un grand secours.
@+
HD
---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection avast! Antivirus est active.
http://www.avast.com