Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

9 réponses
Avatar
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:\Matrices\Compta\annexe.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

9 réponses

Avatar
MichD
Bonjour,

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
Avatar
MichD
Tu peux regarder ceci aussi :

http://support.microsoft.com/kb/305795/fr
Avatar
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



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
Avatar
MichD
Qu'est-ce qui se passe lorsque tu ouvres ton fichier XML ? Les données ne
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
'--------------------------------------
Avatar
db
Le 26/11/2014 11:49, HD a écrit :
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.
Je cherche à récupérer les valeurs des données:
TOTAL_DETTES__1_AN
TOTAL_DETTES_1_AN_5
TOTAL_DETTES__5_ANS



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
Avatar
HD
Qu'est-ce qui se passe lorsque tu ouvres ton fichier XML ? Les données
ne 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?



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
Avatar
db
En version longue : tous les attributs et leurs valeurs affichés dans la
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
Avatar
HD
En fait, ces trois infos sont des attributs du noeud <ANXCV>.
Pour les récupérer, il faut faire quelque chose du genre :


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
Avatar
Jacquouille
Avec beaucoup d'humour: c'est bien la première fois que j'entends dire que
ç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$

En fait, ces trois infos sont des attributs du noeud <ANXCV>.
Pour les récupérer, il faut faire quelque chose du genre :


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