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

Macros et VBA Excel Discussion :

Exporter de Excel vers Access


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Par défaut Exporter de Excel vers Access
    Bonjour,

    J'ai déjà posté ce message sur le forum Access, mais malheureusement personne n'a su m'aider, et on m'a redirigé vers ce forum ci.


    Je voudrais pouvoir lancer une macro à partir d'Excel, de manière à ce que les informations qui se trouvent dans mon fichier Excel soient envoyés vers mon fichier Access. Cependant, je ne veux récupérer que certaines lignes du fichier Excel, afin de les rajouter (à la suite des lignes déjà existantes des tables Access) dans différentes tables et différents champs.

    En surfant sur votre forum, j'ai trouvé ce code :

    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
    Private Sub Commande0_Click()
    Dim oApp As Excel.Application
    Dim oWkb As Excel.Workbook
    Dim oWSht As Excel.Worksheet
     
    Set oApp = CreateObject("excel.application")
    Set oWkb = oApp.Workbooks.Open("NOM DE TON FICHIER EXCEL")
    Set oWSht = oWkb.Worksheets("NOM DE TA FEUILLE")
    'première ligne ou tu commence ton import
    i = 2
     
    'pour éviter les messages lors de l'ajout des enregistrements
    DoCmd.SetWarnings False
     
    'tant que la cellule n'est pas vide
    While oWSht.Range("B" & i).Value <> ""
     
      cSQL = "insert into [NOM TABLE] ( [Nom Champs]) values (" & Chr(34) & oWSht.Cells(i, 7) & Chr(34) & ", " & Chr(34) & oWSht.Cells(i, 8) & Chr(34) & ", " & Chr(34) & oWSht.Cells(i, 10) & Chr(34) & ", " & Chr(34) & oWSht.Cells(i, 11) & Chr(34) & ", " & Chr(34) & oWSht.Cells(i, 14) & Chr(34) & ")"
    'La fonction chr(34) est une fonction VBA qui renvoie un caractère en fonction du code ASCII. ici 34. Chr(34) nous renvoie un guillemet.
    ' Utile au cas où une cellule serai vide et ainsi importer une chaine vide "". sinon ca générerait une violation SQL.
     
     
    'exécute la requète
      DoCmd.RunSQL cSQL
     
     
      i = i + 1
    Wend
     
    DoCmd.SetWarnings True
    End Sub
    Si j'ai bien compris, ce code permet d'importer à partir d'Access des informations provenant de Excel. Moi, je voudrais pouvoir avec un code SQL faire cela dans l'autre sens: rajouter dans ma base Access (sans l'ouvrir nécessairement) les informations que j'aurais dans ma feuille Excel. N'étant pas très familier avec Access en plus, je m'y perds vraiment...

    Comment faire ?
    Quelqu'un aurait-il une idée ?

    Merci d'avance !

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 681
    Par défaut
    SAlut,

    si ton objectif est bien de coder dans Excel un bout de code qui transfert les données d'Excel dans Access, la procédure Access qui t'intéressera est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Docmd.TransferSpreadSheet
    La syntaxe est disponible avec l'aide en ligne Access :f:
    Sinon la te donne bon nombre d'exemples, comme par exemple celui-ci :
    http://access.developpez.com/faq/?pa...l#ImpFichExcel
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre très actif Avatar de XLRATOR
    Homme Profil pro
    Comptable Analyste
    Inscrit en
    Août 2012
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Comptable Analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 226
    Par défaut
    Bonjour,
    Il est possible de faire appel à l'ADO (Référence: Microsoft ActiveX Data Objects x.x Library) l'idée est de:
    1. concevoir de maniére identique un tableau Excel et une table Access.
    2. Ajouter la référence ADO dans le projet VBA: Microsoft ActiveX Data Objects x.x Library.
    3. Rédiger un code qui à la fois récupére les lignes à transferer selon critére, ouvre une connexion vers la BDD Access, puis y tranfert ligne par ligne les données concernées, et ce dans un module standard Exemple:


    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
    Sub AjouterVente()
     
    Dim rng As Range
    Dim Cn As ADODB.Connection
    Dim oCm As ADODB.Command
    Dim StrDate As Date
    Dim StrDesc As String
    Dim StrPU As Double
    Dim StrQuant As Double
    Dim StrTot As Double
    Dim StrEtat As String
    Dim nLigneRecup As Integer
     
     
     
     
        On Error GoTo ADO_ERROR
        Set Cn = New ADODB.Connection
        Cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Database.mdb;Persist Security Info=False"
        Cn.ConnectionTimeout = 40
        Cn.Open
     
        For Each rng In Range("G5:G1000000").SpecialCells(xlCellTypeConstants).Cells 'Remplacer xlCellTypeConstants par xlCellTypeFormulas si les valeurs de la plage de condition sont des formules
        If rng.Value = "Oui" Then
        StrDate = CDate(rng.Offset(0, -5).Value)
        StrDesc = rng.Offset(0, -4).Value
        StrPU = rng.Offset(0, -3).Value
        StrQuant = rng.Offset(0, -2).Value
        StrTot = rng.Offset(0, -1).Value
        StrEtat = rng.Value
     
     
        Set oCm = New ADODB.Command
        oCm.ActiveConnection = Cn
        oCm.CommandText = "Insert Into Ventes Values (#" & StrDate & "#,'" & StrDesc & "'," & StrPU & "," & StrQuant & "," & StrTot & ",'" & StrEtat & "')"
        oCm.Execute nLigneRecup
        End If
        Next
     
     
        If nLigneRecup = 0 Then
        MsgBox "Pas de données à transférer"
        End If
     
        If Cn.State <> adStateClosed Then
        Cn.Close
        End If
     
        Application.StatusBar = False
     
        If Not oCm Is Nothing Then Set oCm = Nothing
        If Not Cn Is Nothing Then Set Cn = Nothing
       MsgBox "Transfert Términé.", vbInformation
    ADO_ERROR:
    'If Err <> 0 Then
    'Debug.Assert Err = 0
    MsgBox Err.Description
    'Err.Clear
    'Resume Next
    'End If
    End Sub
    Je vous attache des captures d’écran pour voir à quoi ressembleraient le tableau et la table access, grâce auxquels vous pourrez acquérir des idées quant à adapter le code à vos besoins.

    Bon courage.
    Karim
    Images attachées Images attachées   
    Entre la canne à pèche et le poisson c'est certainement la canne que je choisirais, puis apprendrais à m'en servir.
    Si on vous souffle une solution au complet c'est que vous n'auriez rien compris du problème.
    Consultez la , de forte chances que votre problème y figure et c'est plus vite que de poser une question et en attendre la réponse.
    FAQ Excel: http://excel.developpez.com/faq/

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Par défaut
    Bonjour jpcheck,

    Merci beaucoup pour ta réponse, effectivement mon objectif est bien de coder dans Excel un bout de code qui transfert les données d'Excel dans Access.

    L'exemple que tu m'as donné permet de créer une nouvelle table. Ce que j'aimerais c'est importer les données du fichier excel pour créer de nouveaux enregistrements dans une table Access déjà existante.
    De plus, dans la syntaxe, je vois le nom du fichier excel, mais non le nom du fichier Access. J'imagine donc que ce code doit être utilisé dans le fichier Access correspondant, non ?

    Même en parcourant la FAQ, je ne vois pas de code à utiliser dans Excel (à moins que je n'ai pas compris)

    Novice_vba


    Bonjour XLRATOR,

    La connexion ADO permet-elle d'alimenter une seule table access uniquement avec un seul fichier Excel ?
    Ne puis-je pas importer mon fichier Excel dans plusieurs tables Access ? J'ai l'impression que c'est possible, mais je vais devoir recréer une nouvelle connexion pour chaque table que je vais remplir, c'est cela ?
    Par exemple :
    - colonne G => on la met dans la table Vente, champs "Article"
    - Colonne H => mise dans la table Facture, champs "Numéro_Facture"
    Serait-ce possible ?

    Peux-tu me dire si les commentaires suivants que j'ai rajouté dans ton code résume bien ce dernier ?

    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
    Sub AjouterVente()
     
    Dim rng As Range
    Dim Cn As ADODB.Connection
    Dim oCm As ADODB.Command
    Dim StrDate As Date
    Dim StrDesc As String
    Dim StrPU As Double
    Dim StrQuant As Double
    Dim StrTot As Double
    Dim StrEtat As String
    Dim nLigneRecup As Integer
     
        On Error GoTo ADO_ERROR
        Set Cn = New ADODB.Connection
    ' chemin d'accès et nom de la base de données Access à changer seulement (sinon code à mettre tel quel)
        Cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Database.mdb;Persist Security Info=False"    
        Cn.ConnectionTimeout = 40
        Cn.Open
     
    'Pour toutes les valeurs Excel présentes dans la feuille :
        For Each rng In Range("G5:G1000000").SpecialCells(xlCellTypeConstants).Cells 'Remplacer xlCellTypeConstants par xlCellTypeFormulas si les valeurs de la plage de condition sont des formules
    ' Récupération de chaque champ un à un sur la table excel
        If rng.Value = "Oui" Then
        StrDate = CDate(rng.Offset(0, -5).Value)
        StrDesc = rng.Offset(0, -4).Value
        StrPU = rng.Offset(0, -3).Value
        StrQuant = rng.Offset(0, -2).Value
        StrTot = rng.Offset(0, -1).Value
        StrEtat = rng.Value
     
        Set oCm = New ADODB.Command
        oCm.ActiveConnection = Cn
     
    'Placement des champs récupérés dans la table Access correspondante
        oCm.CommandText = "Insert Into Ventes Values (#" & StrDate & "#,'" & StrDesc & "'," & StrPU & "," & StrQuant & "," & StrTot & ",'" & StrEtat & "')"
    ' Est-ce normal que le nombre de lignes récupérées soit enregistré ici ? J'avoue ne pas bien comprendre ce que signifie nLigneRecup : c'est un input ou un output ? 
        oCm.Execute nLigneRecup
        End If
        Next
     
    'Code à mettre tel quel   
        If nLigneRecup = 0 Then
        MsgBox "Pas de données à transférer"
        End If
     
        If Cn.State <> adStateClosed Then
        Cn.Close
        End If
     
        Application.StatusBar = False
     
        If Not oCm Is Nothing Then Set oCm = Nothing
        If Not Cn Is Nothing Then Set Cn = Nothing
       MsgBox "Transfert Términé.", vbInformation
    ADO_ERROR:
    'If Err <> 0 Then
    'Debug.Assert Err = 0
    MsgBox Err.Description
    'Err.Clear
    'Resume Next
    'End If
    End Sub

  5. #5
    Membre très actif Avatar de XLRATOR
    Homme Profil pro
    Comptable Analyste
    Inscrit en
    Août 2012
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Comptable Analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 226
    Par défaut
    Dans ce cas,
    Pas la peine de créer une autre connexion, mais une deuxième boucle For Each de la même manière que la première, puis autant de boucle que vous en avez de tables.
    Exemple:

    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
    72
    Sub AjouterVente()
     
    Dim rng As Range
    Dim Cn As ADODB.Connection
    Dim oCm As ADODB.Command
    Dim StrDate As Date
    Dim StrDesc As String
    Dim StrPU As Double
    Dim StrQuant As Double
    Dim StrTot As Double
    Dim StrEtat As String
    Dim nLigneRecup As Integer
     
     
        On Error GoTo ADO_ERROR
        Set Cn = New ADODB.Connection
        Cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Database.mdb;Persist Security Info=False"
        Cn.ConnectionTimeout = 40
        Cn.Open
     
        '---------------------------------- Transferts des Ventes ------------------------
        For Each rng In Sheets(1).Range("G5:G1000000").SpecialCells(xlCellTypeConstants).Cells
        If rng.Value = "Oui" Then
        StrDate = CDate(rng.Offset(0, -5).Value)
        StrDesc = rng.Offset(0, -4).Value
        StrPU = rng.Offset(0, -3).Value
        StrQuant = rng.Offset(0, -2).Value
        StrTot = rng.Offset(0, -1).Value
        StrEtat = rng.Value
     
        Set oCm = New ADODB.Command
        oCm.ActiveConnection = Cn
        oCm.CommandText = "Insert Into Ventes Values (#" & StrDate & "#,'" & StrDesc & "'," & StrPU & "," & StrQuant & "," & StrTot & ",'" & StrEtat & "')"
        oCm.Execute nLigneRecup
        End If
        Next
     
        '-------------------------------------- Transfert des Factures --------------------------
        For Each rng In Sheets(1).Range("O5:O1000000").SpecialCells(xlCellTypeConstants).Cells
        If rng.Value = "Oui" Then
        StrDate = CDate(rng.Offset(0, -5).Value)
        StrDesc = rng.Offset(0, -4).Value
        StrPU = rng.Offset(0, -3).Value
        StrQuant = rng.Offset(0, -2).Value
        StrTot = rng.Offset(0, -1).Value
        StrEtat = rng.Value
     
        Set oCm = New ADODB.Command
        oCm.ActiveConnection = Cn
        oCm.CommandText = "Insert Into Factures Values (#" & StrDate & "#,'" & StrDesc & "'," & StrPU & "," & StrQuant & "," & StrTot & ",'" & StrEtat & "')"
        oCm.Execute nLigneRecup
        End If
        Next
     
     
        If nLigneRecup = 0 Then
        MsgBox "Pas de données à transférer"
        End If
     
        If Cn.State <> adStateClosed Then
        Cn.Close
        End If
     
        Application.StatusBar = False
     
        If Not oCm Is Nothing Then Set oCm = Nothing
        If Not Cn Is Nothing Then Set Cn = Nothing
       MsgBox "Transfert Términé.", vbInformation
     
    ADO_ERROR:
    MsgBox Err.Description
    End Sub
    Avec ce code les deux tables Access Ventes et Factures sont toutes les deux alimentées au même temps.

    NB. Il serait plus pratique d'implémenter une Routine Standard que de tout entasser dans une seule procédure qui risque de devenir énorme et parfois même illisible.

    Cordialement.
    Karim.
    Entre la canne à pèche et le poisson c'est certainement la canne que je choisirais, puis apprendrais à m'en servir.
    Si on vous souffle une solution au complet c'est que vous n'auriez rien compris du problème.
    Consultez la , de forte chances que votre problème y figure et c'est plus vite que de poser une question et en attendre la réponse.
    FAQ Excel: http://excel.developpez.com/faq/

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Par défaut
    Bonjour XLRATOR,

    Merci encore pour ton aide. j'aurais encore deux questions :

    Quand j'essaie de lancer ton programme (en l'ayant adapté à mon cas simplifié), le programme va tout de suite sur ADO_ERROR. Je ne comprends pas pourquoi. Visiblement, il retrouve la base de données (j'ai changé le chemin), et j'ai changé les noms des variables à récupérer.
    Saurais-tu pourquoi ?

    A présent, voici mon programme:
    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
     
    Sub Ajouterchamps()
     
    Dim rng As Range
    Dim Cn As ADODB.Connection
    Dim oCm As ADODB.Command
    Dim Strchamp1 As Integer
    Dim Strchamp1 As String
    Dim nLigneRecup As Integer
     
     
        On Error GoTo ADO_ERROR
        Set Cn = New ADODB.Connection
        Cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=*\chemin\BaseDonnées.accdb;Persist Security Info=False"
        Cn.ConnectionTimeout = 40
        Cn.Open
     
        '---------------------------------- Transferts des champs------------------------
        For Each rng In Sheets(1).Range("A5:A1000000").SpecialCells(xlCellTypeConstants).Cells
           Strchamp1= rng.Value
           Strchamp2= rng.Offset(0, 1).Value
     
           Set oCm = New ADODB.Command
           oCm.ActiveConnection = Cn
           oCm.CommandText = "Insert Into Table Values (#""#,'" & Strchamp1 & "'," & Strchamp2 & "')"
           oCm.Execute nLigneRecup
        Next
     
        If nLigneRecup = 0 Then
            MsgBox "Pas de données à transférer"
        End If
     
        If Cn.State <> adStateClosed Then
            Cn.Close
        End If
     
        Application.StatusBar = False
     
        If Not oCm Is Nothing Then Set oCm = Nothing
        If Not Cn Is Nothing Then Set Cn = Nothing
       MsgBox "Transfert Términé.", vbInformation
     
    ADO_ERROR:
    MsgBox Err.Description
    End Sub

Discussions similaires

  1. [XL-2010] Comment exporter de Excel vers Access ?
    Par Jojo02600 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/01/2013, 14h45
  2. Export donnée Excel vers Access
    Par roidurif dans le forum VBA Access
    Réponses: 9
    Dernier message: 25/06/2009, 12h33
  3. [AC-2007] Export d' Excel vers Access avec VBA depuis Access
    Par rabihm81 dans le forum VBA Access
    Réponses: 1
    Dernier message: 09/06/2009, 15h56
  4. exporter d'excel vers access
    Par sash6 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/05/2008, 12h21
  5. Exportation d'un fichier excel vers Access
    Par Alkemist dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/01/2006, 16h37

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