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

  1. #1
    Membre du Club
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Points : 45
    Points
    45
    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
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 585
    Points : 34 244
    Points
    34 244
    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 :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

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

    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 averti 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
    Points : 356
    Points
    356
    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 du Club
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Points : 45
    Points
    45
    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 averti 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
    Points : 356
    Points
    356
    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 du Club
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Points : 45
    Points
    45
    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

  7. #7
    Membre averti 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
    Points : 356
    Points
    356
    Par défaut
    Pourriez vous préciser le texte affiché dans le message d'erreur?
    Cela en dépend en fait.

    Vous l'auriez peut être remarqué dans mon code, mais je dois vous rappeler de quelques régles SQL à retenir:

    Les variables String se mettent entre Guillemets: Insert Into Ventes Values (' " & StrDesc & " ' ")
    Les variables Date Entre Diéses: Insert Into Ventes Values (# " & StrDate & " #)
    Les variables Numériques elles, restent telles qu'elle sont sans symbole spécifique: Insert Into Ventes Values (" & StrDesc & ")

    Donc prêtez attention à cet effet.

    Bon courage.
    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/

  8. #8
    Membre du Club
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Points : 45
    Points
    45
    Par défaut
    Bonjour,


    Le message est le suivant:
    "Your network access was interrupted. To continue, close the database, and then open it again. "

    Je ne l'avais pas vu, mais même en ayant corrigé le problème, j'ai toujours le même message.
    J'ai corrigé ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     oCm.CommandText = "Insert Into Loan Values (" & champ1 & ",'" & champ2 & "')"

  9. #9
    Membre averti 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
    Points : 356
    Points
    356
    Par défaut
    Je viens de le remarquer, mais dans votre code vous déclarez la variable Strchamp1 en double et en types de données différents.
    Donc vous devez corriger le texte de votre commande qui doit ressembler à ce qui suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim StrChamps1 as string
    Dim StrChamps2 as integer
     
    Insert Into Table Values (' " & StrChamps1 & " '," & StrChamps2 & ") ' Remarquez les guillemets de la variable String StrChamp1, Tandis que StrChamps2 en est dépourvue
    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/

  10. #10
    Membre du Club
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    Merci encore pour l'aide, je n'ai plus tellement de problème à présent.

    Pour autant, imaginons que j'ai une table avec trois champs, dont un "AutoNumber". Celui là je ne veux pas le récupérer sur Excel, je veux juste qu'il s'incrémente à chaque ligne rentrée sur Access.
    Puis je le faire avec ADO ? Quand je ne remplis pas exactement tous les champs de la table, un message d'erreur s'affiche.
    Comment faire dans ce cas ?

    De plus, quand je lance le code (même en ayant supprimé la colonne "AutoNumber" du fichier Access), le message d'erreur suivant s'affiche :
    "You cannot add or change a record because a related ecord is required in table 'Tab2' (en effet, mon champ 2 est une clef étrangère da la table Tab2.. Pour autant, je ne fais référence dans ma table à aucune clef qui n'existe pas déjà dans la table Tab2...)

  11. #11
    Membre averti 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
    Points : 356
    Points
    356
    Par défaut
    Dans ce cas,
    Vous feriez mieux de citer nommément les noms de champs de votre table entre barres dans la requête d'insertion, MS Access se chargera du reste.
    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Set oCm = New ADODB.Command
        oCm.ActiveConnection = Cn
        oCm.CommandText = "Insert Into Ventes ([Date_Vente], [Article], [PU],[Quantité],[Total],[Payé OUI/NON]) Values (#" & StrDate & "#,'" & StrDesc & "'," & StrPU & "," & StrQuant & "," & StrTot & ",'" & StrEtat & "')"
        oCm.Execute nLigneRecup
        End If
        Next
    Et puis Voilà quoi.

    Bon courage.
    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/

  12. #12
    Membre du Club
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    Merci encore pour les explications.
    J'ai réussi à importer des données simples.

    Pour autant, si cela ne vous ennuie pas, je laisse la discussion ouverte, car je vais bientôt passer à un niveau d'importation plus important, et j'aurais certainement des difficultés.

    Merci encore, je cherchais depuis longtemps un moyen !

  13. #13
    Membre averti 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
    Points : 356
    Points
    356
    Par défaut
    Avec plaisir , je vous recommande quand même de consulter la FAQ avant de poster, car il y a plein de truc dedans qui peuvent vous aider.

    N'oubliez pas de voter, et de marquer "Résolu" des que vous estimiez avoir résolu le problème.

    Bon vent.
    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/

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

    Je préférerais créer un programme qui soient indépendants du nombre de tables, du nombre de champs dans ces tables, et des types de données dans ces tables. J'ai donc créé un code, mais il ne marche pas. Je ne comprends pas... Mon programme étant très général, je pense qu'il aidera d'autres utilisateurs du forum également.

    J'ai créé sur un second onglet intitulé "BoundBDD" le nom de chaque champ dans Excel, en dessous le nom des tables et des champs correspondants dans Access.

    Le voici :

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    Sub Import()
     
    Dim rng As Range
    Dim Cn As ADODB.Connection
    Dim oCm As ADODB.Command
    Dim IntData As Long
    Dim StrData As String
    Dim DateData As Date
    Dim NameTablesBDD() As Variant
    Dim NameField() As Variant
    Dim NameFieldBDD() As Variant
    IDBDD() As Variant
     
    ' Enregistrements des tables de la BDD auxquelles correspondent chaque champ du Spreadsheet
    ' Enregistrements du nom des champs de la BDD auxquelles correspondent chaque champ du Spreadsheet
     
    Worksheets("BoundBDD").Activate
    NbFields = Range(Cells(1, 2), Cells(1, 2).End(xlToRight)).Cells.Count
     
    ReDim NameTablesBDD(NbFields)
    ReDim NameField(NbFields)
    ReDim NameFieldBDD(NbFields)
    ReDim ColField(NbFields + 1)
     
     
    For Col = 2 To NbFields + 1
        NameTablesBDD(Col - 1) = Cells(2, Col)
        NameField(Col - 1) = Cells(1, Col)
        NameFieldBDD(Col - 1) = Cells(3, Col)
    Next Col
     
    'Liaison de la connexion avec le fichier Access
        On Error GoTo ADO_ERROR
        Set Cn = New ADODB.Connection
        'Add adress path
        Cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=XXX ;Persist Security Info=False"
        Cn.ConnectionTimeout = 40
        Cn.Open
      '-------------------
     
        Worksheets("OriginImport").Activate
        'récupération du nombre d'éléments à importer
        NbImport = Range(Cells(2, 2), Cells(2, 2).End(xlDown)).Cells.Count
        ReDim IDBDD(NbImport)
     
        'Pour chacun des champs utilisés dans la base de données
        For FieldBDD = 1 To NbFields
     
            'Récupération de la colonne dans la feuille "Origin Import" qui correspond au champ récupéré dans la feuille "BoundBDD"
            Col = 0
            Do
                Col = Col + 1
            Loop While Cells(1, Col) <> NameField(FieldBDD)
     
            'Procédure d'importation si ce champ est un nombre
            If IsNumeric(Cells(2, Col)) Then
     
                For Row = 2 To NbImport + 1
                    IntData = Cells(Row, Col).Value
                    Set oCm = New ADODB.Command
                    oCm.ActiveConnection = Cn
     
                    'Si l'enregistrement est nouveau, on crée le nouvel enregistrement, puis on récupère l'id de cet enregistrement dans la base de données
                    If FieldBDD = 1 Then
                            oCm.CommandText = "INSERT INTO" & NameTablesBDD(FieldBDD) & "([" & NameFieldBDD(FieldBDD) & "]) VALUES" & "(" & IntData & ")"
                            oCm.CommandText = "$..=MYSQL_QUERY($toninsert)"
                            oCm.CommandText = "$UID=mysql_insert_id()"
                    'Si l'enregistrement est déjà créé, on le modifie simplement (en utilisant l'id récupéré lors du premier enregistrement)
                    Else
                        oCm.CommandText = "UPDATE" & NameTablesBDD(FieldBDD) & "SET" & NameFieldBDD(FieldBDD) & "=" & IntData & " WHERE id = " & UID
                    End If
     
                    oCm.Execute nLigneRecup
                Next Row
     
           'Procédure d'importation si ce champ est une date
            ElseIf IsDate(Cells(2, Col)) Then
                For Row = 2 To NbImport + 1
                        DateData = CDate(Cells(Row, Col).Value)
                         Set oCm = New ADODB.Command
                         oCm.ActiveConnection = Cn
     
                        'Si l'enregistrement est nouveau, on crée le nouvel enregistrement, puis on récupère l'id de cet enregistrement dans la base de données
                        If FieldBDD = 1 Then
                                oCm.CommandText = "INSERT INTO" & NameTablesBDD(FieldBDD) & "([" & NameFieldBDD(FieldBDD) & "]) VALUES" & "(#" & DateData & "#)"
                                oCm.CommandText = "$..=MYSQL_QUERY($toninsert)"
                                oCm.CommandText = "$UID=mysql_insert_id()"
                        'Si l'enregistrement est déjà créé, on le modifie simplement (en utilisant l'id récupéré lors du premier enregistrement)
                        Else
                            oCm.CommandText = "UPDATE" & NameTablesBDD(FieldBDD) & "SET" & NameFieldBDD(FieldBDD) & "=#" & DateData & "# WHERE id = " & UID
                        End If
     
                         oCm.Execute nLigneRecup
                Next Row
     
            ' Procédure d'importation si ce champ est une  variable  texte
            Else
                For Row = 2 To NbImport + 1
                        StrData = Cells(Row, Col).Value
                         Set oCm = New ADODB.Command
                         oCm.ActiveConnection = Cn
     
                         'Si l'enregistrement est nouveau, on crée le nouvel enregistrement, puis on récupère l'id de cet enregistrement dans la base de données
                    If FieldBDD = 1 Then
                        oCm.CommandText = "INSERT INTO" & NameTablesBDD(FieldBDD) & "([" & NameFieldBDD(FieldBDD) & "]) VALUES" & "('" & StrData & "')"
                        oCm.CommandText = "$..=MYSQL_QUERY($toninsert)"
                        oCm.CommandText = "$UID=mysql_insert_id()"
                    'Si l'enregistrement est déjà créé, on le modifie simplement (en utilisant l'id récupéré lors du premier enregistrement)
                    Else
                        oCm.CommandText = "UPDATE" & NameTablesBDD(FieldBDD) & "SET" & NameFieldBDD(FieldBDD) & "=" ' & StrData & "' WHERE id = " & UID
                    End If
     
     
                Next Row
            End If
     
     
        Next FieldBDD
     
       '-------------------
        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 Terminé.", vbInformation
     
    ADO_ERROR:
    MsgBox Err.Description
    End Sub
    L'idée est de s'occuper de chaque champ les uns après les autres, au lieu de s'occuper de chaque enregistrement les uns après les autres, car alors il aurait été impossible d'automatiser le process, dans la mesure où le nombre de champs dans chaque table est variable.
    Pour cela, lorsqu'on regarde le premier champ, on crée des nouveaux enregistrements, et on enregistre les ID de ces enregistrements. Ensuite, on complète ces enregistrement grâce à la fonction UPDATE de SQl de manière à rajouter les colonnes manquantes.


    Merci beaucoup,
    Novice_vba

  15. #15
    Membre averti 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
    Points : 356
    Points
    356
    Par défaut
    Bonsoir,
    Il faudrait bien que j’implémente deux fichiers pour tester votre logique, mais en premier je vous signale que vous avez omis d’exécuter votre commande SQL UPDATE,
    Oui, vous l'avez mijoté, mis au four, poser à table, mais avez oublié de la croquer

    Donc essayez d'ajouter un joli petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oCm.Execute nLigneRecup
    à la ligne 112 c'est peut être ça qui vous empêche d'être content

    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/

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, 15h45
  2. Export donnée Excel vers Access
    Par roidurif dans le forum VBA Access
    Réponses: 9
    Dernier message: 25/06/2009, 13h33
  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, 16h56
  4. exporter d'excel vers access
    Par sash6 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/05/2008, 13h21
  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, 17h37

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