Export de données Excel vers Acces par code VBA
Bonjour
J'aimerais savoir si il existe une macro simple pour exporter, supprimer et mettre à jour une base données Access à partir d'un fichier Excel.
Je m'explique :
Il est facile d'importer l'ensemble d'une table access nommée " BDD2 " dans une feuille Excel.
Mais l'inverse est plus compliqué lorsqu'on veut remettre les données modifiées dans la BDD Excel et la macro sur laquelle je travaille est très longue.
Il manque d'autre part la possibilité d'avoir 3 options
"Tout supprimer dans la base Access
"Mettre à jour dans la base Access
"Ajouter dans la base Access
Voici le travail en cours qui fonctionne mais qui est très long, donc à remplacer par une requètes plus simple.
'-----------------
Sub RetourDonnéesVersAccesBDD2AvecFonctionExportGeneriqueV4()
Dim chemin_bd As String 'Chemin de la Base
Dim Societes_Id_Li As String
Dim SSocietes_Nom_Li As String
Dim Societes_Activite_li As String
Dim ligne As String
chemin_bd = ThisWorkbook.Path & "\sortiesRetour.accdb"
For ligne = 9 To 2000
Societes_Id_Li = Cells(ligne, 2).Value
Societes_Nom_Li = Cells(ligne, 3).Value
Societes_Activite_li = Cells(ligne, 4).Value
TransfertExcelVersAccess = ExportGenerique(chemin_bd, "Societes", "Societes_Id", Societes_Id_Li, "Societes_Nom", Societes_Nom_Li, "Societes_Activite", Societes_Activite_li)
ligne = ligne + 1
Next ligne
End Sub 'Fin de RetourDonnéesVersAcces()
Function ExportGenerique(Fichier As String, NomDeTable As String, Colonne_1 As String, Valeur_1 As Variant, Colonne_2 As String, Valeur_2 As Variant, Colonne_3 As String, Valeur_3 As Variant)
Dim MonFichierAccess As Database
Dim MaTableDansAccess As DAO.Recordset
Set MonFichierAccess = OpenDatabase(Fichier)
Set MaTableDansAccess = MonFichierAccess.OpenRecordset(NomDeTable, dbOpenTable)
On Error Resume Next 'Pour ne pas tenir compte des messages d'erreur
MaTableDansAccess.AddNew
MaTableDansAccess.Fields(Colonne_1) = Valeur_1
MaTableDansAccess.Fields(Colonne_2) = Valeur_2
MaTableDansAccess.Fields(Colonne_3) = Valeur_3
MaTableDansAccess.Update 'ligne bogue quand double clé
MaTableDansAccess.Close 'Fermer la Table
MonFichierAccess.Close 'Fermer le fichier
End Function 'Fin de la fonction "ExportGenerique" pour la macro suivante
'-----------------
D'avance merci
Bonjour Bob67
Perso, j'aurais 2 questions :
- pourquoi ne pas lier ton fichier Excel à ta base Access
- Quel intérêt de piloter Access depuis Excel ?
Bonjour Bruno
Merci pour la suggestion de lier avec Access qui semble adaptée à ce sujet pour copier un fichier client global.
Toutefois Excel propose des formules de calcul plus évoluées que Access et je dispose dans Excel de macros capables de traiter des fonctions évoluées que ne propose pas Access, comme les formules d'amortissement, ou l'impression et envoi automatisé par mail de pdf, etc ...
Une fiche client excel ne doit reprendre qu'une ligne spécifique de la table globale des clients ACCESS.
J'ai trouvé par exemple ci dessous un code qui permet de faire l'export Access vers Excel en moins d'un seconde. mais l'inverse (renvoyer les données vers access après modification est plus difficile.
' EXTRAIRE TOUS LES CHAMPS ACCESS POUR LES METTRE DANS EXCEL
Sub extraireTOUT()
Dim chemin_bd As String
Dim ligne As Integer
Dim enr As Recordset
Dim base As Database
chemin_bd = ThisWorkbook.Path & "\BDD.accdb"
ligne = 9 'Première ligne du tableau Excel
'INITIALISATION DE LA BASE DE DONNEES
Set base = DBEngine.OpenDatabase(chemin_bd) 'dans sa globalité
Set enr = base.OpenRecordset("SELECT * FROM societes", dbOpenDynaset)
'RECUPERATION DES INFORMATION DES CHAMPS POUR LES RESTITUER EN ZONE D EXTRACTION
enr.MoveFirst
Do 'On commence par la colonne 2 en recupérant l'info de champ nommé société-1 pour la clé primaire de la table
Cells(ligne, 2).Value = enr.Fields("societes_1").Value
Cells(ligne, 3).Value = enr.Fields("societes_2").Value
Cells(ligne, 4).Value = enr.Fields("societes_3").Value
ligne = ligne + 1
enr.MoveNext
Loop Until enr.EOF = True
End Sub 'extraireTOUT()