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 :

comment exploiter un fichier xml


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Par défaut comment exploiter un fichier xml

    Bonjour , je voudrais savoir si il est possible en vba de créer des structures ou des listes chainées et si oui commentle faire , car je dois exploiter des fichiers xml et cela me prend trop de temps en utilisant une méthode avec un parseur qui analyse mon fichier xml et récupère les données dans mes balises souhaitées pour les recopier dans des feuilles excel.

    je suis débutant et j'ai vu qu'on pouvait optimiser un code en utilisant des listes ou structures qui travaille sur la mémoire directement au lieu de travailler avec des variables qui travaillent sur le disque dur.

    Merci de votre aide.

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 203
    Par défaut
    Bonjour,

    je ne suis pas expert XML, mais il me semble avoir vu qu'Excel sait lire un fichier XML, surtout si tu as le schéma...
    et cela sans faire de code VBA!
    Les fonctionnalités XML, excepté pour l'enregistrement de fichiers au format Feuille de calcul XML, ne sont disponibles que dans Microsoft Office Édition Professionnelle 2003 et Microsoft Office Excel 2003.

    Dans le menu Données, pointez sur XML, puis cliquez sur Source XML pour ouvrir le volet Office Source XML.
    Pour mapper un ou plusieurs éléments non adjacents, vous devez d'abord sélectionner ceux-ci dans le volet Office Source XML. Pour sélectionner des éléments non adjacents, cliquez sur le premier élément, puis maintenez la touche CTRL enfoncée et cliquez sur les éléments suivants.
    Faites glisser les éléments sélectionnés vers l'emplacement de votre choix sur la feuille de calcul.

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Par défaut
    Merci de ta réponse mais je ne pense pas que le mappage puisse traiter exactement ce dont j'ai besoin.
    Car avec le code que j'utilise je vais récupérer directement les informations que je désire dans mon arbre XML.


  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je ne sais pas si j'ai bien compris votre problème, mais vous pouvez regarder ici si par hasard ce serait ce que vous cherchez :

    http://silkyroad.developpez.com/vba/tableaux/

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Par défaut
    Donc si j'ai bien compris d'aprés toi tu pense que je peux utiliser un tableaux??

    je t'envois mon code pour que tu y jette un oeil

    comme je suis débutant et que je ne maitrise pas tous les concept de la programmation je ne sais pas par ou chercher pour rendre mon code plus rapide.

    car pour traiter un fichier xml je met 6-7s
    j'en est 96 a traiter !!!
    hier j'ai fait un test avec 48 fichier sa m'a pris 25 min

    c'était trop long!!!
    voici le code :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    Sub IMPORT_XML_File()
     
     
     
     
    'Déclaration des  Variables et des objets  DOMXML
     
    Dim ParsDoc As MSXML2.DOMDocument
     
    Dim ListeEnfants_de_md As MSXML2.IXMLDOMNodeList
    Dim ListeEnfants_de_mi As MSXML2.IXMLDOMNodeList
    Dim ListeEnfants_de_mv As MSXML2.IXMLDOMNodeList
    Dim Liste_md As MSXML2.IXMLDOMNodeList
     
    Dim Noeud_mi As MSXML2.IXMLDOMNode
    Dim Noeud_mts As MSXML2.IXMLDOMNode
    Dim Noeud_gp As MSXML2.IXMLDOMNode
    Dim Noeud_mt As MSXML2.IXMLDOMNode
    Dim Noeud_mv As MSXML2.IXMLDOMNode
    Dim Noeud_moid As MSXML2.IXMLDOMNode
    Dim Noeud_r As MSXML2.IXMLDOMNode
    Dim Noeud_md As MSXML2.IXMLDOMNode
     
    '**********noeud de la ligne 3 à supprimer...***************
    Dim Noeud_line3   As String
    'Dim Noeud3 As MSXML2.IXMLDOMDocumentType
    Dim Noeud3 As MSXML2.IXMLDOMNotation
     
    Dim N3 As MSXML2.IXMLDOMNode
    '*****************************************
     
     
     
     
     
    Dim Enfants_de_md As MSXML2.IXMLDOMNode
    Dim Enfants_de_mi As MSXML2.IXMLDOMNode
    Dim Enfants_de_mv As MSXML2.IXMLDOMNode
     
     
    Dim racine_mdc As MSXML2.IXMLDOMNode
     
    Dim Objet_Erreur As MSXML2.IXMLDOMParseError
    Dim intI As Integer
    Dim Nom_moid As String
    Dim file_xml As String
    Dim objet_node As String
    Dim data As String
     
    'permet de ne pas voir se qui se passe
    Application.ScreenUpdating = False
     
     
    'Pour nettoyer les cellules à chaque renouvellement du programme
    'Worksheets("IMPORT_XML").Activate
    'Cells.ClearContents
     
     
    file_xml = Worksheets("Sheet1").Cells(15, 5).Value
    ' mettre en commentaire la ligne du dessus, puis mettre en argument de la fonction.
     
     
    'Initialisation du Parseur
    'la fonction permet de faire la référence entre la variable et le DOC_XML
    Set ParsDoc = New MSXML2.DOMDocument
     
     
     
    'Chargement du Document de manière synchrone
    ParsDoc.async = False
     
     
     
    'on charge le document en mémoire
     
    If ParsDoc.Load(file_xml) Then
     
            MsgBox "Document XML correctement chargé"
        Else
     
    '****************************supression de la ligne 3 des XML Files...*************************
    'Noeud_line3 = ParsDoc.Xml
    'MsgBox (Noeud_line3)
    'MsgBox (objet_node)
     'data = "<!DOCTYPE mdc SYSTEM "MeasDataCollection.dtd">"
     
     'Set Noeud3 = ParsDoc.createCDATASection(<![DOCTYPE mdc SYSTEM ["MeasDataCollection.dtd"]]>)
     
     
     'data = Noeud3.baseName
     
     'Set Noeud3 = ParsDoc.doctype
     
      'data = Noeud3.nodeTypedValue
     
     
     
    'MsgBox (data)
    '********************************************************************************************
     
     
     
              MsgBox "Erreur de lecture du document XML"
     
     
    '                           ****************************
    '    ******************Partie concernant la gestion des erreurs**********************
     
       'instancier le fichier xml pour la gestion des erreurs
    Set Objet_Erreur = ParsDoc.parseError
     
     
    ' contient le code de l'erreur da la dernière erreur d'analyse, en lecture seule.
    code = Objet_Erreur.errorCode
    MsgBox (code)
     
     
    'fournit une explication à propos de l'erreur, en lecture seule.
     raison = Objet_Erreur.reason
     MsgBox (raison)
     
     
    'contient la position du fichier absolue où l'erreur s'est produite, en lecture seule.
    position_fichier = Objet_Erreur.filepos
    MsgBox (position)
     
     
    'spécifie le numéro de la ligne contenant l'erreur, en lecture seule.
     position_ligne = Objet_Erreur.Line
     MsgBox (position_ligne)
     
     
     'contient la position du caractère à l'intérieur de la ligne où l'erreur s'est produite, en lecture seule.
     Position_carac_ligne = Objet_Erreur.linepos
     MsgBox (Position_carac_ligne)
     
     'retourne le texte complet de la ligne contenant l'erreur, en lecture seule.
     chaine = Objet_Erreur.srcText
     MsgBox (chaine)
     
     'contient l'adresse URL du document XML contenant la dernière erreur, en lecture seule.
     adr_url = Objet_Erreur.URL
     MsgBox (adr_url)
     
     '                      ****************************************
     
        End If
     
     
    '***************************FONCTIONS GESTION DES ERREURS*******************************
     
    'Quand on instancie la gestion des erreurs il faut déclarer l'objet juste avant les méthodes
    'Ce n'est pas nécessaire de déclarer les varaibles pour la gestion des erreurs
    'mais c'est recommandé
     
    ' lorsque je supprime la ligne 3 qui contient ceci
    ' <!DOCTYPE mdc SYSTEM "MeasDataCollection.dtd">
    ' le document est correctement charger.
     
     
     
     
     '******************************FIN GESTION DES ERREURS********************************
     
     
     '*****************************TRAITEMENT DU FICHIER XML******************************
     
     Set racine_mdc = ParsDoc.documentElement
     
     
     For Each Noeud_md In racine_mdc.childNodes
     
      If Noeud_md.nodeName = "md" Then
     
     Set ListeEnfants_de_md = Noeud_md.childNodes
     
     
                For Each Noeud_mi In ListeEnfants_de_md
                If Noeud_mi.nodeName = "mi" Then
                '*******************************Création d'une nouvelle feuille******************
                Worksheets.Add After:=Worksheets("IMPORT_XML")
               '****************************************************************************
               ActiveSheet.Cells(4, 1) = "Measurement Times"
                ActiveSheet.Cells(4, 2) = "MOID"
                ActiveSheet.Cells(4, 3) = "COMPTEURS"
     
               'Range("B4").HorizontalAlignment = xlCenter
               Range("A4").Font.Bold = True
               Range("B4").Font.Bold = True
               Range("C4").Font.Bold = True
     
     
     intI = 5
     intK = 3
     intL = 7
     intR = 3
     intMT = 5
     intrr = 6
     
     
     
     
     
     
                Set ListeEnfants_de_mi = Noeud_mi.childNodes
     
                        For Each Enfants_de_mi In ListeEnfants_de_mi
                'je peux incrémenter intR ici
                'intR = 3
                            If Enfants_de_mi.nodeName = "mts" Then
                            ActiveSheet.Cells(intI, 1).Value = Enfants_de_mi.nodeTypedValue
                            End If
     
                            If Enfants_de_mi.nodeName = "mt" Then
                             ActiveSheet.Cells(intMT, intK).Value = Enfants_de_mi.nodeTypedValue
                            intK = intK + 1
                            End If
     
     
                          ActiveSheet.Columns.AutoFit
                                    If Enfants_de_mi.nodeName = "mv" Then
     
                                    Set Noeud_mv = Enfants_de_mi
     
                                    Set ListeEnfants_de_mv = Noeud_mv.childNodes
     
                                   '******************************************
     
                                        For Each Enfants_de_mv In ListeEnfants_de_mv
     
                                                If Enfants_de_mv.nodeName = "moid" Then
                                                 ActiveSheet.Cells(intL, 2).Value = Enfants_de_mv.nodeTypedValue
                                                 'intL = intL + 4
                                                 intL = intL + 1
     
                                                End If
     
                                                If Enfants_de_mv.nodeName = "r" Then
                                                'ActiveSheet.Cells(intL - 4, intR).Value = Enfants_de_mv.nodeTypedValue
                                                ActiveSheet.Cells(intL - 1, intR).Value = Enfants_de_mv.nodeTypedValue
                                                intR = intR + 1
                                                End If
     
                                        '**************balise indiquant un fichier faux************
                                        If Enfants_de_mv.nodeName = "sf" Then
                                        'ActiveSheet.Cells(intL - 4, 1).Value = Enfants_de_mv.nodeTypedValue
                                        ActiveSheet.Cells(intL - 1, 1).Value = Enfants_de_mv.nodeTypedValue
                                        End If
                                        '****************************************************************
     
                                       ActiveSheet.Columns.AutoFit
                                        Next Enfants_de_mv
     
                                        '**********on reset  intR sur la ligne du dessous***********
                                        intR = 3
                                        '***************************************************************
                                    End If
     
                        'pb quand on a fini la boucle dans les noeudenfant_mv on reste toujours sur le meme noeud_mi
                        Next Enfants_de_mi
     
                        intMT = intMT + 1
     
                End If
                Next Noeud_mi
     
     
        End If
     Next Noeud_md
     
     
     
    '********************************FIN TRAITEMENT FICHIER XML*****************************
     
    '****************Fonctions permettant de décharger les objets instanciés****************
     
     
    Set ParsDoc = Nothing
     
     
    Set racine_mdc = Nothing
     
    Set ListeEnfants_de_md = Nothing
    Set ListeEnfants_de_mi = Nothing
    Set ListeEnfants_de_mv = Nothing
    Set Liste_md = Nothing
    Set Enfants_de_md = Nothing
    Set Enfants_de_mi = Nothing
    Set Enfants_de_mv = Nothing
     
    Set Objet_Erreur = Nothing
     
    Set Noeud_md = Nothing
    Set Noeud_mi = Nothing
    Set Noeud_mts = Nothing
    Set Noeud_gp = Nothing
    Set Noeud_mt = Nothing
    Set Noeud_mv = Nothing
    Set Noeud_moid = Nothing
    Set Noeud_r = Nothing
    'Set Noeud_line3 = Nothing
     
    ' on reactive la méthode
    Application.ScreenUpdating = True
     
    End Sub

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je vous ai proposé ce lien en pensant que cela pouvait être une solution à explorer en fonction des éléments précisés dans votre question mais je ne connais pas les fichiers XML et pour tester les possibilités il faudrait posséder un de ces fichiers et que la structure soit conforme aux vôtres.

    Mais d'autres intervenants plus expérimentés sur le sujet pourraient sans doute vous répondre et vous pourriez aussi exposer votre problème ici par exemple :

    http://www.developpez.net/forums/forumdisplay.php?f=194

  7. #7
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Bonjour tlm,

    Je n'ai pas la moindre idée de ce que tu veux faire mais tu trouveras peut-être ton bonheur dans la FAQ

    Manipuler les fichiers XML
    .

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Par défaut
    et bien ce que je fais avec le code et mes fichiers xml et que j'extrait certaines données du fichiers pour les copier dans des feuilles excel mais comme je dois le faire pour plusieurs fichiers sa me prend énormément de temps je voudrais donc savoir si il n'y avait pas un autre moyen de traiter mes fichiers xml plus rapidement je vous envois un exemple de fichier xml.
    Fichiers attachés Fichiers attachés

  9. #9
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    J'ai tenté une approche différente, sans tenir compte qu'il s'agit d'un fichier xml mais le traîter comme s'il s'agissait d'un fichier texte et cela à l'air de fonctionner.

    En pièce jointe je te met le fichier Excel et le fichier xml (à coller dans un même répertoire pour le test). Depuis Excel j'extrait les adresses URL du fichier xml

    Pièce jointe 32872
    .

Discussions similaires

  1. [D7] Comment exploiter le fichier .wab ?
    Par plante20100 dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 15/11/2005, 16h22
  2. Comment Exploiter un fichier MDF
    Par Actarus69 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 02/11/2005, 14h32
  3. Comment lire un fichier XML ?
    Par jeromelef dans le forum Débuter
    Réponses: 6
    Dernier message: 29/06/2005, 15h52
  4. Réponses: 4
    Dernier message: 23/06/2005, 12h44
  5. [C#] [XML] Comment créer un fichier XML
    Par pc152 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 28/09/2004, 13h41

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