IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Mapper les éléments d'un XML sur une feuille via VBA [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2015
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Automaticien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 84
    Par défaut Mapper les éléments d'un XML sur une feuille via VBA
    Bonjour,

    Je bute sans trouver de solution à mon problème depuis plusieurs heures donc je fini par poster ici, je m'excuse par avance si ce sujet a pu déjà être abordé par le passé mais je n'ai rien trouvé.

    Voilà, j'ai un fichier XML qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?xml version="1.0" encoding="UTF-8"?>
    <Logics version="1000" productid="93" productrevision="1" softversion="4591" options="1,2,3,4,5,12,13,17,22,24,27,32,48,58,60,61,62,63,93,108,110" hardware="4,6,8,22,29,39,61,66,76,77,78,81,82,83,84,85,86">
      <Logic name="Logic 1" offset="1" eventa="0" eventb="0" eventc="0" operators="21" relayout="0" relaydelay="4" collapsed="false" description="test"/>
      <Logic name="Logic 2" offset="7" eventa="0" eventb="0" eventc="0" operators="4" relayout="0" relaydelay="0" collapsed="true"/>
      <Logic name="Logic 3" offset="13" eventa="0" eventb="0" eventc="0" operators="16" relayout="0" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 4" offset="19" eventa="0" eventb="0" eventc="0" operators="2" relayout="192" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 5" offset="25" eventa="0" eventb="0" eventc="0" operators="8" relayout="193" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 6" offset="31" eventa="0" eventb="0" eventc="0" operators="32" relayout="194" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 7" offset="37" eventa="0" eventb="0" eventc="0" operators="10" relayout="559" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 8" offset="43" eventa="0" eventb="0" eventc="0" operators="40" relayout="311" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 9" offset="49" eventa="0" eventb="0" eventc="0" operators="34" relayout="312" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 10" offset="55" eventa="0" eventb="0" eventc="0" operators="42" relayout="434" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 11" offset="61" eventa="0" eventb="0" eventc="0" operators="22" relayout="509" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 12" offset="67" eventa="0" eventb="0" eventc="0" operators="28" relayout="510" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 13" offset="73" eventa="0" eventb="0" eventc="0" operators="52" relayout="510" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 14" offset="79" eventa="0" eventb="0" eventc="0" operators="30" relayout="510" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 15" offset="85" eventa="0" eventb="0" eventc="0" operators="60" relayout="510" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 16" offset="91" eventa="0" eventb="0" eventc="0" operators="62" relayout="510" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 17" offset="97" eventa="0" eventb="0" eventc="0" operators="0" relayout="515" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 18" offset="103" eventa="0" eventb="0" eventc="0" operators="0" relayout="516" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 19" offset="109" eventa="0" eventb="0" eventc="0" operators="0" relayout="517" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 20" offset="115" eventa="0" eventb="0" eventc="0" operators="0" relayout="518" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 21" offset="121" eventa="0" eventb="0" eventc="0" operators="0" relayout="519" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 22" offset="127" eventa="0" eventb="0" eventc="0" operators="0" relayout="563" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 23" offset="133" eventa="0" eventb="0" eventc="0" operators="0" relayout="564" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 24" offset="139" eventa="0" eventb="0" eventc="0" operators="0" relayout="565" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 25" offset="145" eventa="0" eventb="0" eventc="0" operators="0" relayout="566" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 26" offset="151" eventa="0" eventb="0" eventc="0" operators="0" relayout="567" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 27" offset="157" eventa="0" eventb="0" eventc="0" operators="0" relayout="568" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 28" offset="163" eventa="0" eventb="0" eventc="0" operators="0" relayout="573" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 29" offset="169" eventa="0" eventb="0" eventc="0" operators="0" relayout="578" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 30" offset="175" eventa="0" eventb="0" eventc="0" operators="0" relayout="587" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 31" offset="181" eventa="0" eventb="0" eventc="0" operators="0" relayout="0" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 32" offset="187" eventa="0" eventb="0" eventc="0" operators="0" relayout="0" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 33" offset="193" eventa="0" eventb="0" eventc="0" operators="0" relayout="0" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 34" offset="199" eventa="0" eventb="0" eventc="0" operators="0" relayout="0" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 35" offset="205" eventa="0" eventb="0" eventc="0" operators="0" relayout="0" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 36" offset="211" eventa="0" eventb="0" eventc="0" operators="0" relayout="0" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 37" offset="217" eventa="0" eventb="0" eventc="0" operators="0" relayout="0" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 38" offset="223" eventa="0" eventb="0" eventc="0" operators="0" relayout="0" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 39" offset="229" eventa="0" eventb="0" eventc="0" operators="0" relayout="0" relaydelay="0" collapsed="false"/>
      <Logic name="Logic 40" offset="235" eventa="0" eventb="0" eventc="0" operators="0" relayout="0" relaydelay="0" collapsed="false"/>
    </Logics>
    Et mon but est d'obtenir ce résultat, via VBA :
    Nom : XML.PNG
Affichages : 407
Taille : 86,6 Ko

    J'ai essayé de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Dim objMapMLogic As XmlMap
     
     
        Set objMapMLogic = ActiveWorkbook.XmlMaps("MLogic")
     
        ThisWorkbook.XmlImport _
            URL:="D:\M-Logic.xml", _
            ImportMap:=objMapMLogic, _
            Overwrite:=True, _
            Destination:=Worksheets("MLogic_XML").Range("$A$1")
    Mais le résultat escompté n'est pas celui obtenu puisque les attributs de "Logics" sont répétés autant de fois qu'il y a de lignes "Logic" et ça rend le xml non exportable...

    Je me suis orienté dans ce sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
        Dim objxmlMap As XmlMap
     
        Dim objlstMLogic As ListObject
        Dim objlstCol As ListColumn
     
        Dim strPath As String
     
        Dim blnMapMLogicExiste As Boolean
     
        For Each objxmlMap In ActiveWorkbook.XmlMaps
            If objxmlMap = "MLogic" Then
                blnMapMLogicExiste = True
                Exit For
            End If
        Next
     
        If blnMapMLogicExiste = False Then
            Set objxmlMap = ActiveWorkbook.XmlMaps.Add("D:\M-Logic.xml" , "Logics")
            objxmlMap.Name = "MLogic"
        End If
     
        Set objlstMLogic = ActiveSheet.ListObjects.Add
     
        strPath = "/Logics/Logic/name"
     
        objlstMLogic.ListColumns(1).XPath.SetValue objxmlMap, strPath
    Puis je comptais ajouter les autres colonnes à la suite... Sauf que la dernière ligne me génère l'erreur :
    Run-time error '-2147467259 (80004005):

    The XPath is not valid because either the XPath syntax is incorrect or not supported by Excel.


    Je ne doit pas être trop loin de la solution, je pense que c'est juste ma syntaxe à la ligne :
    strPath = "/Logics/Logic/name"

    Si quelqu'un pouvait me donner un petit coup de pouce...

    Merci d'avoir pris le temps de me lire, et merci de votre aide

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    comme ca vite fait je dirais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Sub test()
        Dim Onodes, objXML, Onoeud
        Dim fichier As String, x As Integer, i As Long
        Set objXML = CreateObject("Msxml2.DOMDocument")
        objXML.async = True
        objXML.Load "C:\Users\polux\Desktop\test.xml"
        Set noeuds = objXML.getElementsByTagName("Logic")    'on collectionne tout les balise "pdv"
       ' MsgBox noeuds.Length
        lig = 1
        For Each Onoeud In noeuds
            lig = lig + 1
            Set atbs = Onoeud.Attributes
            For c = 0 To atbs.Length - 1
                Cells(lig, c + 1) = atbs(c).Value
                Cells(1, c + 1) = atbs(c).BaseName
            Next
        Next
        'maintenant la ligne "logic(S)"
        Set noeud = objXML.getElementsByTagName("Logics")(0)
        Set atbs = noeud.Attributes
        For c = 0 To atbs.Length - 1
            Cells(c + 1, "L") = atbs(c).Value
        Next
    End Sub
    Nom : demo5.gif
Affichages : 384
Taille : 269,4 Ko

    je te laise faire le centrage du texte et autre joyeusetés a faire dans les cellules
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre confirmé
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2015
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Automaticien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 84
    Par défaut
    Merci beaucoup, super boulot !

    En fait, je pensais conserver les liens vers le fichier XML pour pouvoir faire des exports et réécrire vers mon fichier.

    Mais finalement cette solution me semble beaucoup plus souple.
    Et ça me permettra de travailler sur des fichiers XML plus complexes qu'Excel n'est pas en mesure d'exploiter correctement (à partir du moment où j'essaye d'exporter des fichiers qui contiennent des listes de listes il me jette mais avec ta solution tout a l'air possible ).

    Bon sur ce, je m'en vais me documenter sur le XML et sur ce qui peut être fait via MSXML2.DOMDocument !

    Encore une fois, un grand merci !

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    En fait, je pensais conserver les liens vers le fichier XML pour pouvoir faire des exports et réécrire vers mon fichier.
    avec la methode DOM tu peux faire l'ecriture aussi
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Import d'un fichier XML sur une feuille de calcul existante
    Par Crysta17 dans le forum Excel
    Réponses: 0
    Dernier message: 22/04/2014, 10h55
  2. Recopier les éléments d'un vecteur sur une feuille excel
    Par bsangoku dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/05/2013, 16h32
  3. [XL-2007] Déselectionner les pointillés qui se trouve sur une feuille aperçu avant impression
    Par maxval18 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/01/2012, 17h09
  4. [XL-2003] déplacer une image sur une feuille en vba
    Par hobine dans le forum Excel
    Réponses: 3
    Dernier message: 14/12/2011, 11h34
  5. [VBA EXCEL]comment utiliser les boites a outils control sur une feuille excel
    Par EvaristeGaloisBis dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/02/2007, 19h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo