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 :

Alimenter des tables Access en lisant dans des fichiers Csv


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut Alimenter des tables Access en lisant dans des fichiers Csv
    Bonjour à tous!

    J'aimerai importer plusieurs fichiers csv dans plusieurs tables access en faisant des tests dans chaque fichier csv
    et en fonction du premier champ trouvé dans la ligne qu elle soit envoyé dans une table définie.

    J'ai commencé avec ç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
    44
     
    Sub TransfertAllCsvInDir()
     
     Dim Repertoire As String
     Dim Dossier As String
     Dim Nom_Tbl1, Nom_Tbl2, Nom_Tbl3, Nom_Tbl4 As String
     
     'obtient le premier fichier ou répertoire qui est dans "C:\Documents and Settings\"
     Dossier = "C:\Documents and Settings\"
     RepFic = Dir(Dossier & "*.CSV", vbDirectory)
     
     'boucle tant que le répertoire n'a pas été entièrement parcouru
     On Error GoTo Erreur
     Do While (RepFic = "")
         'teste si c'est un fichier ou un répertoire
         If (GetAttr(Dossier & Repertoire) And vbDirectory) = vbDirectory Then
             'MsgBox "Répertoire " & rep
         'Else
             Nom_Tbl1 = "Table1"
             Nom_Tbl2 = "Table2"
             Nom_Tbl3 = "Table3"
             Nom_Tbl4 = "Table4"
     
             'On attache le fichier trouvé
             DoCmd.TransferText acLinkDelim, , Nom_Tbl, Dossier & Repertoire, True
     
             'On Ajoute les données dans la table de destination
             DoCmd.RunSQL "INSERT INTO Tabledest ( Champ1, Champ2, Champ3,Champ4 )SELECT Champ1 AS Expr1, Champ2 AS Expr2, Champ3 AS Expr3, Champ4 AS Expr4 FROM [" & Nom_Tbl1 & "];"
             DoCmd.RunSQL "INSERT INTO Tabledest ( Champ1, Champ2, Champ3,Champ4 )SELECT Champ1 AS Expr1, Champ2 AS Expr2, Champ3 AS Expr3, Champ4 AS Expr4 FROM [" & Nom_Tbl2 & "];"
             DoCmd.RunSQL "INSERT INTO Tabledest ( Champ1, Champ2, Champ3,Champ4 )SELECT Champ1 AS Expr1, Champ2 AS Expr2, Champ3 AS Expr3, Champ4 AS Expr4 FROM [" & Nom_Tbl3 & "];"
             DoCmd.RunSQL "INSERT INTO Tabledest ( Champ1, Champ2, Champ3,Champ4 )SELECT Champ1 AS Expr1, Champ2 AS Expr2, Champ3 AS Expr3, Champ4 AS Expr4 FROM [" & Nom_Tbl4 & "];"
     
             'On libère le fichier
             DoCmd.DeleteObject acTable, Nom_Tbl
     
         End If
    Suite:
         'passe à l'élément suivant
         Repertoire = Dir
     Loop
     GoTo Fin
    Erreur:
    Fin:
     End Sub
    Mais bon c est a travailler... Le code ne marche pas du tout! j ai beaucoup de mal avec le vba. On m a conseille de travailler avec les ADO aussi.
    Qu en pensez vous?

  2. #2
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    Bonsoir,
    Une fois le format d'importation enregistré
    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
     
    Sub TransfertAllCsvInDir()
     On Error GoTo Erreur
     Dim Fic As String
     
     Dossier = "C:\Documents and Settings\"
     Fic = Dir(Dossier & "*.CSV", vbNormal)
     
     Do While (Fic = "")
         DoCmd.TransferText acLinkDelim, "FormatImportFic", Tabledest, Dossier & Repertoire, True
         Fic = Dir
     Loop
     
    Exit Sub
    Erreur:
     
    End Sub
    ce code devrait suffir

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup de ta réponse!

    J' ai enregistré un format d'importation qui correspond à ce que je veux(avec la delimitation par ";") mais ensuite je ne sais pas ou il est stocké dans mon disque... Je n'ai pas le choix du chemin pour l'enregistrement.

    Est ce qu'avec cette solution je peux regarder à l intérieur du fichier et en fonction du premier champ de la ligne importer toute la ligne dans une table ou une autre??
    Merci

  4. #4
    Membre du Club
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Mai 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Electrotechnicien
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2010
    Messages : 47
    Points : 63
    Points
    63
    Par défaut
    Bonjour,

    j'ai eu le même problème et n'étant un pro du vb, j'ai trouvé une solution en récupérant des bouts de codes sur les forums.

    il s'agit de faire l'importation du fichier csv dans une table temporaire, puis appliquer une requête ajout avec des conditions pour sélectionner les lignes à ajouter dans la table désirée.
    après ça on supprime la table temporaire
    enfin si plusieurs fichiers sont à importer il suffit de faire une boucle.

    j'espère que cela t’apportera un peu d'aide

  5. #5
    Membre du Club
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Mai 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Electrotechnicien
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2010
    Messages : 47
    Points : 63
    Points
    63
    Par défaut
    j'ai retrouvé le code que j'ai utilisé:
    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
    Public Function ImportCsv()
    On Error GoTo err_ImportCsv
     
        Dim fileSearch As Variant, file As Variant, repSearch As Variant
        Dim tbaName As String, repApp As String
        Dim SQL As String
        Dim fso As Object, db As DAO.Database, tbaD As DAO.TableDef, fld As DAO.Field
     
        repApp = "C:\Documents and Settings\"
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set db = CurrentDb()
     
    ' creation d'une table temporaire
        Set tbaD = db.CreateTableDef("tba_Tmp")
        Set fld = tbaD.CreateField("numSave", DAO.dbLong)
            fld.OrdinalPosition = 1
            fld.Attributes = DAO.dbAutoIncrField
            tbaD.Fields.Append fld
        Set fld = tbaD.CreateField("F1", DAO.dbDate) :' DAO.dbDate défini le type de champ
            fld.OrdinalPosition = 2
            tbaD.Fields.Append fld
        Set fld = tbaD.CreateField("F2", DAO.dbDouble)
            fld.OrdinalPosition = 3
            tbaD.Fields.Append fld
        Set fld = tbaD.CreateField("F3", DAO.dbLong)
            fld.OrdinalPosition = 4
            tbaD.Fields.Append fld
        db.TableDefs.Append tbaD
        RefreshDatabaseWindow
        Set fld = Nothing
        Set tbaD = Nothing
     
    ' importation des fichiers
    	repSearch = fso.GetFolder(repApp)
        For Each fileSearch In repSearch.files
            file = repapp & fileSearch.Name
            DoCmd.TransferText acImportDelim, "SpecifImport", "tba_Tmp", file, False
     
    ' requête ajout avec sélection
    		tbaName="Table1" :' par exemple
            SQL = "INSERT INTO " & tbaName & "( F1, F2, F3 )SELECT [F1], [F2], [F3] " _
                & "FROM [tba_Tmp] WHERE (((tba_Tmp.F1)>[Formulaires]![frm_start]![datemax]))" _  :' exemple de condition
                & "ORDER BY tba_Tmp.F1;"
     
            DoCmd.SetWarnings False
            DoCmd.RunSQL SQL
            DoCmd.RunSQL "DROP TABLE tba_Tmp;" :' supprime la table temporaire
            DoCmd.SetWarnings True
        Next
     
    exit_ImportCsv:
        MsgBox "Importation des données terminée"
        Exit Function
     
    err_ImportCsv:
        MsgBox Err.Description
        MsgBox Err.Number
        Resume exit_ImportCsv
     
    End Function

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Merci pour ta réponse! il est top ton code !!!

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

Discussions similaires

  1. [Toutes versions] Lire et intégrer le contenu de fichiers dans des tables Access
    Par khaibet dans le forum VBA Access
    Réponses: 14
    Dernier message: 27/05/2015, 14h48
  2. Réponses: 1
    Dernier message: 04/07/2014, 09h15
  3. Réponses: 0
    Dernier message: 02/04/2014, 11h21
  4. Réponses: 7
    Dernier message: 18/12/2013, 14h29
  5. Réponses: 2
    Dernier message: 11/05/2004, 11h17

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