Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/12/2011, 17h47   #1
Invité de passage
 
Femme
Inscription : novembre 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : novembre 2011
Messages : 20
Points : 1
Points : 1
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 :
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?
Nestea est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2011, 18h18   #2
Membre Expert
 
Inscription : août 2006
Messages : 1 435
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 435
Points : 1 756
Points : 1 756
Bonsoir,
Une fois le format d'importation enregistré
Code :
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
helas est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/12/2011, 22h15   #3
Invité de passage
 
Femme
Inscription : novembre 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : novembre 2011
Messages : 20
Points : 1
Points : 1
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
Nestea est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 12h34   #4
Invité régulier
 
Inscription : mai 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 14
Points : 9
Points : 9
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
Ovr19 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 13h14   #5
Invité régulier
 
Inscription : mai 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 14
Points : 9
Points : 9
j'ai retrouvé le code que j'ai utilisé:
Code :
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
Ovr19 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/01/2012, 18h38   #6
Invité de passage
 
Femme
Inscription : novembre 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : novembre 2011
Messages : 20
Points : 1
Points : 1
Merci pour ta réponse! il est top ton code !!!
Nestea est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h18.


 
 
 
 
Partenaires

Hébergement Web