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 :

Import fichier XML dans tableau variable très long


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 44
    Par défaut Import fichier XML dans tableau variable très long
    Bonjour à tous,

    je me permets d'ouvrir une discussion car je ne trouve pas de solution à mon problème.

    Je souhaite importer un fichier xml dans un tableau variable pour y travailler les données (fichier que je serai amenée à importer régulièrement pour des contrôles). Le fichier en question fait (aujourd'hui) 25 mo, et la macro important ces données met 20 minutes... J'essaie donc de trouver des solutions à ce problème :

    - Puis-je optimiser le code ci-dessous pour diminuer le temps d'exécution?

    - Par ailleurs, puis-je n'importer qu'une partie du fichier xml, c'est-à-dire prendre toutes les balises, mais seulement les "lignes" répondant à des conditions? Je n'ai pas réussi à le faire.

    Merci d'avance pour vos conseils !

    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
    Option Explicit
    Option Base 1
     
    Function InverseTab(T, Optional Base As Byte = 1) 'Permet de transposer les dimensions d'un tableau
    Dim Temp()
    Dim i As Long
    Dim j As Long
    ReDim Temp(Base To UBound(T, 2), Base To UBound(T))
    For i = LBound(T, 2) To UBound(T, 2)
        For j = LBound(T) To UBound(T)
            Temp(i, j) = T(j, i)
        Next j
    Next i
    InverseTab = Temp
    End Function
     
     
    Sub lecture_contrat()
     
        ActiveWorkbook.PrecisionAsDisplayed = False
        Application.DisplayAlerts = False 'Désactive/Active les fenêtres Windows (pour éviter d'avoir une fenêtre de confirmation àla suppression de feuilles par exemple)
        Application.ScreenUpdating = False 'Désactive la mise à jour de l'écran
        Application.DisplayStatusBar = False 'Désactive la barre d'état
        Application.Calculation = xlCalculationManual 'Calcul manuel
        Application.EnableEvents = False 'Désactive les évènements
        ActiveSheet.DisplayPageBreaks = False 'Désactive les sauts de page
        Application.Cursor = xlWait 'sablier
     
     
     
    Dim recolte As String
    recolte = Worksheets("Paramètres").Range("A6")
     
    Dim sDossier As String
    Dim sFichier As String
    Dim sDossierFichier As String
     
    Dim colonne As Long
    Dim ligne As Long
    Dim i As Long
    Dim j As Long
     
    Dim tabDonnees() As Variant
     
    Dim oXML As MSXML2.DOMDocument
    Dim oNode As MSXML2.IXMLDOMNode
    Dim childNode As MSXML2.IXMLDOMNode
    Dim oSubNode As MSXML2.IXMLDOMNode
     
    Dim xmlRecolte
     
     
    '1. Ouverture du fichier xml et lecture du contenu
     
    'Nom fichier à lire
    Worksheets("Paramètres").Activate
    sDossier = Range("B9") & "/"
    sFichier = "Contrat.xml"
    sDossierFichier = sDossier & sFichier
     
    'Chargement du fichier
    Set oXML = New MSXML2.DOMDocument
    oXML.async = False
    oXML.Load sDossierFichier
     
     
    'Lecture du contenu
    ligne = 0
    For Each oNode In oXML.DocumentElement.ChildNodes
     
        ligne = ligne + 1
        ReDim Preserve tabDonnees(55, ligne)
     
        colonne = 0
        If ligne = 1 Then
            For Each oSubNode In oNode.ChildNodes
                colonne = colonne + 1
                tabDonnees(colonne, ligne) = oSubNode.BaseName
            Next
        Else
            For Each oSubNode In oNode.ChildNodes
                colonne = colonne + 1
                tabDonnees(colonne, ligne) = oSubNode.Text
            Next
        End If
    Next
     
    '2. Affichage des données dans Excel
     
    Worksheets("Contrat").Activate
     
    'Nettoyage des données précédentes
     
    Range("A2:BC" & Range("A2").End(xlDown).Row).Clear
     
    'Affichage des nouvelles données
     
    Range("A1:BC" & UBound(tabDonnees, 2)) = InverseTab(tabDonnees)
     
     
        ActiveWorkbook.PrecisionAsDisplayed = True
        Application.DisplayAlerts = True 'Désactive/Active les fenêtres Windows (pour éviter d'avoir une fenêtre de confirmation à la suppression de feuilles par exemple)
        Application.ScreenUpdating = True 'Désactive la mise à jour de l'écran
        Application.DisplayStatusBar = True 'Désactive la barre d'état
        Application.Calculation = xlCalculationAutomatic 'Calcul manuel
        Application.EnableEvents = True 'Désactive les évènements
        ActiveSheet.DisplayPageBreaks = True 'Désactive les sauts de page
        Application.Cursor = xlDefault 'sablier
     
    End Sub

  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 Heu
    Bonjour un fichier xml de 20mega c'est impensable.! Tu en es sur ! de sa taille ?
    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 averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 44
    Par défaut
    Bonjour,

    22,498 mo... et le problème c'est qu'il va augmenter au fur et à mesure...

    Pour le contexte, nous échangeons des données entre SAP et notre site internet, des contrats que les utilisateurs :
    - peuvent créer sur internet : import des contrats vers SAP
    - peuvent voir même si le contrat est créé directement sur SAP : export des contrats de SAP vers le site

    L'éditeur a mis à disposition des "administrateurs" des fichiers xml contenant les infos des bases de données du site.

    J'ai besoin de récupérer ces fichiers pour les comparer à mes extractions SAP, et dans le cas présent, la quantité de données est énorme : il s'agit de l'ensemble des contrats apparaissant sur le site (15000 pour l'instant), dont je dois vérifier la majorité des informations (55 champs...) pour confirmer que le site reprend bien les infos de SAP.

    J'ai besoin de récupérer ce contenu dans un tableau variable pour y extraire les données qui m'intéresse, et travailler certaines données pour retrouver le même format que mes données SAP.

    Peut-être y a-t-il un moyen de limiter les données importées dès le départ?

  4. #4
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    De ce que je me souvient de ma période SAP et ABAP tu peux faire des BAPI qui permette d'interagir avec SAP.
    Pourquoi ne pas essaye de faire ce traitement via interrogation par BAPI voir webservice entre les deux ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 44
    Par défaut
    Bonjour,

    Merci de votre réponse. Je ne suis pas sûre de la comprendre par contre, ne touchant pas du tout à la programmation SAP ...

    Néanmoins, côté SAP je n'ai pas de problème puisque j'exporte les données en xls. Je parlais de SAP pour expliquer le contexte (et la nécessité de contrôler mes données dans le détail, ligne par ligne, d'où la taille des fichiers), mais les données extraites de SAP sont justement celles que je dois comparer à mes données XML. La comparaison sera faite dans Excel via un code vba.

    Mon problème vient plutôt de la récupération des données XML qui met une vingtaine de minutes, et qui n'ira pas en s'arrangeant puisque le nombre de données va augmenter.

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Est ce que tu peux manuellement importer ton xml (Données > données externes...etc)

    Avec l'enregistreur de macro
    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
    Sub LaMacro()
    Dim Fichier As String
     
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    With ThisWorkbook
        Fichier = .Worksheets("Paramètres").Range("B9") & "/Contrat.xml"
        With .XmlMaps.Add(Fichier, "Ta racine de ton xml")    '>>>> à adapter avec la racine de ton fichier xml
            .ShowImportExportValidationErrors = True
            .DataBinding.ClearSettings
            .AdjustColumnWidth = True
            .PreserveColumnFilter = True
            .PreserveNumberFormatting = True
            .AppendOnImport = False
        End With
        .Worksheets("Contrat").UsedRange.Clear
        .XmlImport URL:=Fichier, ImportMap:=Nothing, Overwrite:=True, Destination:=.Worksheets("Contrat").Range("A1")
        .Connections(.Connections.Count).Delete
    End With
    Application.DisplayAlerts = True
    End Sub
    Qu'est ce que ça donne?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 44
    Par défaut
    Bonjour,

    Merci de ton retour.

    en passant par Données --> Autres sources --> Provenance "Importation de données XML" ou en exécutant ta macro, l'import est effectivement beaucoup plus rapide (1 à 2 minutes). Mais du coup je ne peux pas l'intégrer dans un tableau variable?

  8. #8
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Tu récupère à partir de la feuille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim Tb
     
    Tb=worksheets("Contrat").usedrange

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

Discussions similaires

  1. import fichier XML dans un fichier TXT ou XLS
    Par logiclogic dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 11/01/2013, 11h19
  2. Réponses: 0
    Dernier message: 04/01/2011, 19h45
  3. Import fichier XML dans table Transact SQL
    Par chicken92000 dans le forum Développement
    Réponses: 8
    Dernier message: 17/06/2009, 09h41
  4. [SSIS] [2K8] importer fichier xml dans une table
    Par Tankian dans le forum SSIS
    Réponses: 1
    Dernier message: 15/04/2009, 12h34
  5. import fichier XML dans une table oracle 10g
    Par aijedelachance dans le forum Import/Export
    Réponses: 0
    Dernier message: 08/02/2009, 21h52

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