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

VBA Access Discussion :

Import XML dans Access par lot [AC-2019]


Sujet :

VBA Access

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 21
    Par défaut Import XML dans Access par lot
    Bonjour,

    Jusqu'à ce jour j'utilisais une macro pour importer sur excel une dizaine de fichiers xml identiques.

    Un nouveau besoin se fait sentir pour importer maintenant, chaque semaine environ 1000 fichiers xml.

    Je souhaite donc passer sur access.

    J'ai adapté la macro excel et le problème est que :

    1 / une table se crée à chaque fichier XML importé alors que je veux tout dans une table déjà existante

    2 / la table se crée vide

    Voila la 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
    22
    23
    24
    25
    26
    27
    Sub importxmldansaccess()
        DoCmd.OpenTable ("REJET")
        Dim xStrPath As String
        Dim xFileDialog As Office.FileDialog
        Dim xFile As String
        Dim xCount As Long
        'On Error GoTo ErrHandler
        Set xFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
        xFileDialog.AllowMultiSelect = False
        xFileDialog.Title = "Select a folder"
        If xFileDialog.Show = -1 Then
            xStrPath = xFileDialog.SelectedItems(1)
        End If
        If xStrPath = "" Then Exit Sub
        xFile = Dir(xStrPath & "\*.xml")
     
    Do While xFile <> ""
    Application.importxml _
    datasource:=(xStrPath & "\" & xFile), _
    importoptions:=acappendata
    xFile = Dir()
     
    Loop
    'ErrHandler:
    '    MsgBox "no files xml", , " "
     
    End Sub

  2. #2
    Membre Expert Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Par défaut
    Pour ajouter les données à une table existante, il vaut mieux utiliser la fonction "ImportExcelSpreadsheet" qui va alimenter une table temporaire.
    Ensuite, utiliser "Append" pour alimenter la grande table destinataire. La table temporaire peut être supprimée à la fin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ' Import dans la  table temporaire :
    ImportExcelSpreadsheet("filename.xlsx", "temp_table")   'ou filename.xml
    ' Alimenter la table de destination :
    DoCmd.RunSQL "INSERT INTO destination_table SELECT * FROM temp_table"
    ' Supprimer la table temporaire
    DoCmd.DeleteObject acTable, "temp_table"
    Si vous mettez une boucle sur les fichiers xml, le temps de prendre un café, le travail sera fait.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 21
    Par défaut
    Bonjour,

    J'ai réussi à faire fonctionner la macro suivante, à ceci près :

    - j'ai beau spécifier DoCmd.OpenTable ("REJET") , l'import se fait toujours dans une autre table

    - le xml est encodé en ISO-8859-1, ce qui fait que certains caractères sont mal interprétés (par exemple € devient â‚)


    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 importxmldansaccess()
        DoCmd.OpenTable ("REJET")
        Dim xStrPath As String
        Dim xFileDialog As Office.FileDialog
        Dim xFile As String
        Dim xCount As Long
     
        Set xFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
        xFileDialog.AllowMultiSelect = False
        xFileDialog.Title = "Select a folder"
        If xFileDialog.Show = -1 Then
            xStrPath = xFileDialog.SelectedItems(1)
        End If
        If xStrPath = "" Then Exit Sub
        xFile = Dir(xStrPath & "\*.xml")
     
    Do While xFile <> ""
    Application.importxml (xStrPath & "\" & xFile), acAppendData
     
    xFile = Dir()
     
    Loop
     
    End Sub

  4. #4
    Membre Expert Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Par défaut
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.importxml (xStrPath & "\" & xFile), acAppendData
    vous n'indiquez nulle part la table de destination, et vous ouvrez la table "Rejet" dès le départ alors que c'est elle la table cible, j'imagine.
    En outre, vous n'avez pas suivi le conseil donné précédemment !!
    "€ devient â": il y a moyen de remédier à ça après avoir réussi l'import, via la fonction 'Replace' par exemple. Regarder les paramètres d'import également.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 21
    Par défaut
    Bonjour,

    En effet je n'indique pas la table de destination car je ne sais pas où l'indiquer, c'est l'objet de ma question.

    Votre proposition ne fonctionne pas, la fonction ImportExcelSpreadsheet n'existe pas sous access.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 21
    Par défaut
    Bonjour,

    Après recherche il s'avère que le fichier XML est importé dans la table correspondant au nom indiqué dans ce même fichier, cela ne peut donc pas être modifié à ce moment là, la solution consiste à copier les éléments après import dans la table souhaitée.

    Reste la question de l'encodage des fichiers à l'import.

  7. #7
    Membre Expert Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Par défaut
    Version testée:
    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
    Sub ImportExcelSpreadsheet()
        'Créer 2 tables:
        'TmpTable destinée à recevoir les données XL, avec la même structure que le fichier XL.
        'tableDestination destinée à consolider toutes les données des différents fichiers XL, avec la même structure que tmpTable
     
        Dim myFile As String
        myFile = "C:\Users\........\NomDeFichier.xlsx"      'à adapter
     
        DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "TmpTable", myFile, True
        ' Alimenter la table de destination :
        DoCmd.RunSQL "INSERT INTO tableDestination SELECT * FROM tmptable"
        ' Supprimer la table temporaire, si nécessaire
        'DoCmd.DeleteObject acTable, tmpTbl
     
    End Sub

  8. #8
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 110
    Par défaut
    Bonjour
    En effet l'exportxml stocke la définition de la structure dans le fichier XML (ou xsd si on utilise l'option).
    Solutions
    On peut au moment de l'export utiliser une requête pour faire un substitut du nom de la table.
    Ou éditer le fichier XML ou xsd pour remplacer le nom, tout ceci en vba bien sûr.
    Cordialement
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

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

Discussions similaires

  1. [AC-2010] Problème import XML dans Access: Elements manquants.
    Par Djey13250 dans le forum Access
    Réponses: 8
    Dernier message: 01/08/2014, 16h00
  2. [AC-2002] Importation de XML dans access
    Par momo33 dans le forum Access
    Réponses: 3
    Dernier message: 20/06/2009, 23h35
  3. import de plusieurs fichiers XML dans Access 2003
    Par frdek dans le forum Access
    Réponses: 7
    Dernier message: 09/08/2008, 19h39
  4. Import d'un fichier CSV dans access par VB
    Par Shoezman13 dans le forum VBA Access
    Réponses: 3
    Dernier message: 18/06/2008, 10h43
  5. Import XML dans Access
    Par migutz dans le forum VB.NET
    Réponses: 2
    Dernier message: 28/05/2008, 15h31

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