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 :

Comment importer des données Excel vers Access avec VBA Access ?


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

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

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Par défaut Comment importer des données Excel vers Access avec VBA Access ?
    Bonjour a tous,

    Je vais vous exposer mon petit problème en bref :

    Je dois trouver un programme VBA Access qui analyse, dans un dossier général, des sous-dossiers en les identifiants par leur nom et ensuite analyse leur contenu.
    Dans chaque sous-dossier, il y a deux types de fichiers excel qui ont chacun une structure particulière. (type NAV et type Fonds où tous les fichiers excel NAV ont la mm structure et tous les fichiers Fonds aussi)
    Si le fichier excel comporte le nom NAV : en extraire les données dans une table d'une base de données Access, en évitant les doublons.
    Si le fichiers excel comporte le mot Fonds : en extraire les données dans une autre table de la même base de données, tout en évitant également les doublons.

    En fait je ne demande pas de me faire tout ça, je cherche juste un moyen d'extraire des données de plusieurs fichiers excel vers Access (a partir de VBA Access) vers une base de données déja existante (c'est a dire a la suite des données de la base de données). Et si possible en évitant les doublons.

    Je pensais faire une boucle avec la fonction TransferSpreadsheet, mais j'ai aucune idée de comment le faire ^^.

    Quelqu'un pourrait-il m'aider?

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Perso, je n'utiliserais pas de commande d'importation. Deux solutions de principe :

    1. Rst sur claseur fermé. Si tes classeurs contiennent des données disposées proprement en tableaux, tu peux ouvrir un jeu d'enregistrement ADO ou DAO sur chaque classeur XL qui peut rester fermer.

    La manipulation du jeu d'enregistrement te permettra de renseigner les tables.

    2. Variable tableau avec classeur ouvert. Si tes données sont un peu dispersées, tu ne couperas pas à l'ouverture de chaque classeur. Tu peux utiliser des variables tableaux à 2 dimensions pour charger des zones de données.

    La manipulation des variables tableaux te permettra de renseigner les tables.

    Cordialement,

    PGZ

  3. #3
    Membre confirmé

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

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Par défaut
    Ok, donc je pencherais plutôt vers la 1ère solution, les classeurs excel sont bien rangés par colonnes, chaque classeur ayant les mm colonnes (sauf pour les deux types différents bien sûr).
    Il faudrait effectivement que je puisse extraire toutes les données en laissant les classeurs fermés.
    Il faudrait alors que je fasse une boucle sur le nom du classeur(NAV ou Fond), en fonction de cela, les données seront placées dans l'une des deux tables Access. (en évitant les doublons dans les 2 cas)
    Ensuite entourer ça d'une boucle qui "boucle" sur les sous-dossiers.

    Dites-moi si vous voyez quelque chose qui n'irait pas dans mon raisonnement.

    Maintenant je dois donc essayer de comprendre comment fonctionne les plateformes DAO ou ADO ^^. Ou bien y aurait-il une solution générale existante que je n'aurais pas encore vue sur le net(avec ADO ou DAO bien sûr)? (j'ai déjà fait le tour des forums pour trouver un "simple" programme VBA Access qui extrait un ensemble de données de plusieurs fichiers Excel vers Access, pas moyen d'en trouver un correct...)

    Quelqu'un aurait-il déjà du code pour extraire un fichier? (ou plusieurs)

  4. #4
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Re,

    Sur DVP il y a beaucoup de ressources.
    Regarde le tuto de SilkyRoad Lire et écrire dans des classeurs fermés

    Reviens quand tu auras commencé ton code et si tu rencontres des pb.

    Cordialement,

    PGZ

  5. #5
    Membre confirmé

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

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Par défaut
    Bonjour,

    J'ai commencé a taper du code pour utiliser ADO mais là je reste bloqué, je ne sais pas comment prendre des données excel et les mettre dans access...

    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
     
    Sub ExtractDataFromExcel()
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        Fichier = "C:\Users\qdeutschle\Desktop\Work\Données\Folder\picmod2.xls"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "Sheet4"
     
        Set Cn = New ADODB.Connection
     
        '--- Connection ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Data Source=" & Fichier & _
                ";Extended Properties=Excel 8.0;"
            .Open
        End With
        '-----------------
     
        'Définit la requête.
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
        texte_SQL = "SELECT * FROM [" & Sheet4 & "$]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
     
     
        '--- Fermeture connexion ---
        Cn.Close
        Set Cn = Nothing
     
    End Sub
    J'aiemerais déja comprendre et réussir mon code pour une feuille excel après je réfléchirais comment faire avec plusieurs.

    Sinon j'avais trouvé une autre sorte de code pour extraire des données, mais là encore je suis bloqué car je n'arrive pas à sélectionner la colonne entière au lieu des cellules :

    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
     
    Private Sub importExcelData()
     
    Dim xlApp As Excel.Application
    Dim xlBk As Excel.Workbook
    Dim xlSht As Excel.Worksheet
    Dim dbRst As Recordset
    Dim dbs As Database
    Dim SQLStr As String
     
    Set dbs = CurrentDb
    Set xlApp = Excel.Application
    Set xlBk = xlApp.Workbooks.Open("C:\Users\qdeutschle\Desktop\Work\Données\Folder\picmod2.xls")
    Set xlSht = xlBk.Sheets(1)
     
    SQLStr = "CREATE TABLE excelData(columnOne TEXT, columnTwo TEXT)"
     
    DoCmd.SetWarnings False
     
    DoCmd.RunSQL (SQLStr)
     
    Set dbRst = dbs.OpenRecordset("excelData")
     
    dbRst.AddNew
     
    xlSht.Range("A2").Select
     
    dbRst.Fields(0).Value = xlSht.Range("A2").Value
     
    xlSht.Range("B2").Select
     
    dbRst.Fields(1).Value = xlSht.Range("B2").Value
     
    dbRst.Update
     
    dbRst.Close
     
    dbs.Close
     
    xlBk.Close
     
    End Sub

  6. #6
    Membre confirmé

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

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Par défaut
    Sinon j'ai trouvé cette procédure, mais je n'arrive pas à la faire tourner...
    Elle est censer faire ça :
    boucle sur tous les classeurs d'un répertoire sans les ouvrir et transfert les données de la Feuil1 vers une table Access (Table1).

    L'exemple suppose que
    Tous les onglets portent le même nom.
    Les classeurs sont structurés comme une vraie base (pas de données éparpillées) et de structure identique à la base Access (nombre de colonne et type de données adaptés:date,texte,numerique...etc...)

    la procédure nécessite d'activer la référence Microsoft ActiveX Data Objects x.x Library

    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
     
    Sub tranfertFeuilleClasseursFermes_VersAccess()
    Dim Cn As New ADODB.Connection
    Dim oProdRS As New ADODB.Recordset, oRS As ADODB.Recordset
    Dim oConn As ADODB.Connection
    Dim j As Integer
    Dim Fichier As String, Repertoire As String
     
    '------------------------------------------------------
    'Connection à la Base Access
    Set oConn = New ADODB.Connection
    oConn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
    "Data Source= 'C:\maBase.mdb';"
     
    'les données seront placés dans Table1
    Set oRS = New ADODB.Recordset
    oRS.Open "Select * from Table1", oConn, adOpenKeyset, adLockOptimistic
    '------------------------------------------------------
     
    'Boucle sur les classeurs Excel du répertoire cible
    Repertoire = "C:\Documents and Settings\mimi\dossier\general\excel\Nomdossier"
    Fichier = Dir(Repertoire & "\*.xls")
     
    Do While Fichier <> ""
        'Connection au classeur Excel
        Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & Repertoire & "\" & Fichier & ";" & _
        "Extended Properties=""Excel 8.0;"""
     
        'requête pour extraire les données de la Feuil1
        oProdRS.Open "SELECT * FROM [Feuil1$]", Cn, adOpenStatic
     
        ' --- Transfert des données dans la base ---
        Do While Not (oProdRS.EOF)
            oRS.addNew
                For j = 0 To oRS.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
     
    oRS.Close
    Set oRS = Nothing
    'Fermeture de la connection Access
    oConn.Close
    Set oConn = Nothing
    End Sub

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

Discussions similaires

  1. [WD7.5] Importation des données Excel vers HF tres long
    Par chuba dans le forum WinDev
    Réponses: 10
    Dernier message: 23/06/2010, 16h27
  2. [A-00] Importer des données Excel vers Access
    Par Slici dans le forum VBA Access
    Réponses: 4
    Dernier message: 06/03/2009, 12h56
  3. Importé des donnée Excel vers SAP (MM01)
    Par eddassiabdelhak dans le forum SAP
    Réponses: 3
    Dernier message: 02/02/2009, 12h36
  4. Importer des données Excel vers BD Access
    Par technopole dans le forum Access
    Réponses: 1
    Dernier message: 03/07/2006, 14h37
  5. Importer des données excel vers outlook
    Par faayy dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 17/10/2005, 09h30

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