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 :

Importer un fichier excel dans access avec découpage en tables


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 27
    Points : 16
    Points
    16
    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

  2. #2
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    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

  4. #4
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    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 : 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
    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 ?

  5. #5
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    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

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

Discussions similaires

  1. [AC-2003] Importation d'un fichier excel dans Access avec traitement
    Par Mishe dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/03/2013, 16h23
  2. Réponses: 5
    Dernier message: 23/11/2010, 12h36
  3. importer des fichiers excel dans access
    Par skillipo dans le forum Access
    Réponses: 1
    Dernier message: 12/11/2007, 16h53
  4. Pb Importation de fichiers Excel dans Access
    Par elkhy dans le forum Access
    Réponses: 8
    Dernier message: 22/05/2006, 17h33
  5. [VBA-A] Importation de fichiers Excel dans Access
    Par elkhy dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/05/2006, 17h57

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