Enregistrer données feuille Excel vers une table Access
Bonjour tout le monde,
Je fais appel à votre aide à travers ce post.
J'ai un fichier Excel "test.xlsm" et la feuille "FeuilleTest" de ce fichier contient des données clients sous forme de table avec en colonne le N°, Date, Nom et le Montant.
J'aimerais effectuer une commande en VBA (sur Excel) qui, à partir d'une feuille du fichier, et en cliquant sur un bouton :
- établit une liaison entre Excel et ma base Access
- enregistre les données de la feuille "FeuilleTest" vers une table "TableTest" de ma base Access
- et définit la ou les clé(s) primaire(s) de la table Access
De plus, si la feuille "FeuilleTest" contient de nouvelles données, il faut qu'en cliquant sur le bouton, ces nouvelles données s'enregistrent aussi dans la table Access existante et sans doublons.
Merci d'avance
Bonjour à tous,
Sur mon blog, il y a une démo d'interactions entre Excel et des tables .accdb ou .mdb en lecture et/ou écriture avec explications =>
http://tatiak.canalblog.com/archives/2016/05/25/33865554.html
A noter, pour les index/clé , la numérotation doit se faire via vba (la numérotation 'automatique' n'est pas opérante à partir d'xl).
Pour ce faire, si besoin, il suffit de récupérer le dernier id de la base (genre select max(id) ... ) puis de l'incrémenter.
Si la base est vide, il suffit de numéroter les données dans une colonne d'xl
Bonne lecture
Pierre
Bonjour,
Merci beaucoup, c'est exactement ce type de code que je recherche pour répondre à mon problème !
Je vais regarder cette démo de plus près.
Pourriez-vous aussi m'indiquer dans quelle partie le problème des doublons est traité ?
Concernant les champs de la table et clé primaire, je vais le faire directement via Access.
Merci encore
Sub ImportExcelToAccess()
' Transfert les données de la feuille Excel vers une table Access
' Activer référence Microsoft ActiveX Data Objects 6.1 Library
Dim Cn As ADODB.Connection
Dim Cmd As ADODB.Command
Dim rs As ADODB.Recordset
Dim CheminBase As String, strCn As String, strInsert As String, strUpdate As String
Dim r As Long
ActiveWorkbook.Sheets("FeuilleTest").Select
CheminBase = "C:\Documents\Database1.accdb"
' Connection à la base Access
Set Cn = New ADODB.Connection
strCn = "Provider=Microsoft.ACE.OLEDB.12.0; " & "Data Source=" & CheminBase & ";"
Cn.Open strCn
' Ouverture recordset / table
' Objet Recordset représente les enregistrements d'une table
Set rs = New ADODB.Recordset
rs.Open "SELECT * FROM TableTest", Cn, adOpenKeyset, adLockOptimistic
Range("A1").Select
derniere_ligne = Range("A1").End(xlDown).Row
' Si on a déjà un enregistrement, on met à jour l'enregistrement sinon on l'insert
If rs.EOF = True Then ' Si aucun enregistrement
For i = 1 To derniere_ligne - 1
strInsert = "INSERT INTO TableTest (No, Date, Nom, Montant) VALUES ('" & Range("A1").Offset(i, 0).Value & "', #" & Range("A1").Offset(i, 1).Value & "#, '" & Range("A1").Offset(i, 2).Value & "', '" & Range("A1").Offset(i, 3).Value & "') "
Cn.Execute strInsert
Next i
Else
For i = 1 To derniere_ligne - 1
strUpdate = "UPDATE TableTest SET Date = #" & Range("A1").Offset(i, 1).Value & "#, Nom = '" & Range("A1").Offset(i, 2).Value & "', Montant = '" & Range("A1").Offset(i, 3).Value & "' WHERE No = '" & Range("A1").Offset(i, 0).Value & "' "
Cn.Execute strUpdate
Next i
End If
' Fermeture recordset et connection
rs.Close
Set rs = Nothing
Cn.Close
Set Cn = Nothing
End Sub
Hello,
J'ai donc fais ce code pour enregistrer les données de ma feuille à l'aide de requêtes sql.
Cependant j'ai encore un problème pour l'enregistrement de nouvelles données.
Mon code fonctionne et update bien les données de la base access lorsque je modifie les données de la feuille excel. C'est à dire que si l'enregistrement existe alors UPDATE sinon il faut l'INSERT. Mais quand je rentre une nouvelle ligne de données sur la feuille excel et que je lance la macro, il n'y a pas de nouvel enregistrement dans ma base access. Auriez-vous une explication ?
Merci