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 24/05/2011, 11h23   #1
Invité de passage
 
Inscription : décembre 2006
Messages : 11
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 11
Points : 1
Points : 1
Par défaut Importer un fichier excel dans access avec découpage en tables

Bonjour,
après quelques recherches infructueuses, je m'adresse à vous pour essayer de résoudre mon problème.

Le contexte :
J'ai une extraction périodique de données de production (N°de lot, type de produit, couleur, résultat du contrôle qualité, etc...) dans un fichier excel (une colonne par caractéristique).

Je voudrais stocker ces résultats à chaque réception du fichier (tous les mois) dans une base access. J'ai donc créé ma base access avec différentes tables pour faire çà à peu près proprement.

Le souci que j'ai c'est que je ne sais pas comment gérer l'import de mon fichier excel dans ma base de manière simple.

Je prends l'exemple de ma table "Résultats contrôle" qui est liée à ma table "N° de lot" par une liaison 1-n. (Chaque résultat est lié à un lot, et un lot peut avoir plusieurs contrôles.

Pour importer, je vais donc parcourir toutes les lignes de mon fichier excel (1 ligne par résultat de contrôle) et c'est là que je bloque...

Comment poru chaque résultat :
- tester si oui ou non le N° de lot existe déjà dans la base (par exemple si un contrôel d'un autre typa a déjà été effectué sur ce lot)
- si ce lot existe, comment récupérer le N° associé dans la table poru faire ma correspondance
- s'il n'existe pas, comment l'ajouter dans la table N° de lot, et ensuite faire ma correspondance?

Voilà en substance mes soucis. je susi certain que cela doit se faire couramment, mais je ne connais pas trop le VB sosu Access.

Merci par avance de votre aide,

Taz
taz_wanted est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h38   #2
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Bonjour,

Alors j'ai déjà poster quelques discussions sur le sujet de l'import de données excel vers access, tu pourrais allé voir sur mon profil pour les trouver (j'imagine).

Je vais tout de même répondre aux différentes questions que tu poses ici.
J'utilise les plateformes ADO afin d'extraire chaque feuille de chaque fichier et cela par champs.
Il faudrait savoir si tes fichiers excel ont la même structure que ta base de données? (c'est-à-dire, les champs correspondent tous aux colonnes des feuilles excel)

Ensuite pour tester si oui ou non le numéro de lot existe dans la base j'utiliserais :

Code :
If IsNull(DLookup("[NomduchampNumérodelot]", "Nomdelatable", "[Champnumérolot] = '" & Numérolotexcel & "' ")) Then...
Et là tu insères la copie de ce nouveau numéro dans tes tables.

Tu mets à jour simplement ta table pour le numéro existant.

Bon j'ai galéré à trouver le code que tu demandes mais si tu as besoin d'aide quelque part, tu peux me demander :

http://www.developpez.net/forums/d10...eme-structure/

Ce n'est qu'un bout du code que j'utilise...regarde le déjà et on en reparle ^^
__________________
Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 13h56   #3
Invité de passage
 
Inscription : décembre 2006
Messages : 11
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 11
Points : 1
Points : 1
Merci de ta réponse.
En fait, la structure de mon fichier excel n'est pas la même que ma base de données.

Sous excel, je n'ai qu'un fichier global avec quinzaine de colonnes. Je souhaite le transférer dans une BDD avec 5 ou 6 tables pour faciliter la maintenance et l'ajout d'informations au cours du temps.

Je vais regarder dans la direction de ton code, il me semble que je vais déjà y trouver quelques billes.

En attenadnat d'éventuelles d'autres idées, je me mets à creuser ton code
taz_wanted est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 13h59   #4
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Bon voilà un peu de code qui te permettra sans doute de faire tout ce que tu veux faire ^^. (tu n'es pas obligé de prendre ça, il doit exister d'autres solutions plus simples mais c'est celle que j'utilise en bon débutant de VBA Access ^^)
Change juste certaines choses par rapport à tes données, je t'ai annoté les trucs que tu pourrais ne pas connaitre.
Attention avec les noms des champs, des tables et des feuilles excel, de préférence sans espace et sans accents avec des _ .
Si tu ne peux vraiment pas les changer par faute de je ne sais quoi, il faudra mettre des cotes à certains endroits il me semble.


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
61
62
63
64
65
66
67
68
69
70
71
Sub NomDeTaFonction()
 
Dim Cn As New ADODB.Connection
Dim oProdRS As New ADODB.Recordset, oRS As ADODB.Recordset, oPS As ADODB.Recordset
Dim oConn As ADODB.Connection
Dim j As Integer
Dim Fichier As String, Repertoire As String
 
Repertoire = "C:\NomRepertoireDeStockDesFichiersExcel"
'Tu stocke dans Fichier tous les noms de fichiers dans ton répertoire et se terminant par xls
Fichier = Dir(Repertoire & "\*.xls")
 
'Connection à la Base Access
Set oConn = CurrentProject.Connection
 
'Connection à ta table resultat_controle
Set oRS = New ADODB.Recordset
oRS.Open "Select * from resultat_controle", oConn, adOpenKeyset, adLockOptimistic
 
Set oPS = New ADODB.Recordset
oPS.Open "Select * from Num_de_lot", oConn, adOpenKeyset, adLockOptimistic
 
'Parcours de tous les fichiers xls du répertoire
Do While Fichier <> ""
 
    'Connection au classeur Excel
    Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & Repertoire & "\" & Fichier & ";" & _
    "Extended Properties=""Excel 8.0;"""
 
    'Connection à la feuille nommé FeuilName dans ton fichier excel, pour automatiser cela il serait préférable qu'a chaque nouveau fichier tes feuilles aient le même nom
    oProdRS.Open "SELECT * FROM [" & FeuilName & "] ", Cn, adOpenStatic
 
'Boucle sur les lignes de ta feuille excel
    Do While Not (oProdRS.EOF)
 
'On stocke le numéro du lot de la ligne excel dans une variable
           Num_lot = oProdRS.Fields(0)
 
'Test si le numéro de lot de ta ligne est dans ta table
           If Isnull(Dlookup("[ChampNumLot]","TableNumLot", "[ChampNumLot] = '" & Num_lot & "' ") then
 
'Donc si ce numéro de lot n'est pas dans ta table, tu crée une nouvelle ligne et tu le mets dedans
                 oPS.Addnew
                 oPS.Fields(0) = Num_lot
'Si d'autres infos à mettre dans la table Num_de_lot il suffit de remplacer le 0 par le numéro du champs -1 et d'y mettre ce que tu veux du genre :
 
                 'oPS.Fields(1) = oProdRS.Fields(1).value
            End If
 
'Maintenant on va prendre toutes les infos de ton fichier excel pour les mettre dans la table resultat_controle (seulement si ton fichier excel a la même structure que ta table, cad nom des champs en 1ère ligne, et les même champs avec les mêmes noms)
 
            For j = 0 To oProdRS.Fields.Count -1
                    oRS.Fields(j) = oProdRS.Fields(j).Value
            Next j
            oRS.Update
            oProdRS.MoveNext
        Loop
        oProdRS.Close
 
    'Fermeture de la connection au classeur Excel
    Cn.Close
Fichier = Dir
 
Loop
oConn.Close
Set oRS = Nothing
'Fermeture de la connection Access
Set oConn = Nothing
 
End Sub
N'hésite pas s'il y a un problème. Et bonne chance.
__________________
Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h06   #5
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Ok donc comme tu veux transférer tes infos dans différentes tables, tu devras faire une connexion à chaque table que tu veux compléter.
Et mettre les infos que tu sélectionnes de ta feuille excel dans les différentes tables du genre :

Code :
ops.fields(0) = OprodRs.fields(6)
Ce qui veut dire que tu mets dans ton champs numéro 0 de ta table ouverte oPS, la valeur de la colonne 6 (en partant de 0) de ta feuille excel, et cela à mettre dans ta boucle sur les lignes : Do While Not (oProdRS.EOF)...

En fait le fonctionnement est simple, tu parcours une ligne, tu manipules les données pour les stocker dans les différentes tables et tu passes à la ligne suivante (oProdRs.Movenext) et tu refais la même manip qu'a la ligne précédente.
__________________
Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 09h46   #6
Invité de passage
 
Inscription : décembre 2006
Messages : 11
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 11
Points : 1
Points : 1
Bonjour,
je me suis fortement inspiré de ton code et çà a l'air de fonctionner à peu près comme je le souhaitais, nickel.

Merci beaucoup pour ton aide

TAZ
taz_wanted 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 14h09.


 
 
 
 
Partenaires

Hébergement Web