[VB] Import données Acces vers Excel

Fermé
Yapou - 3 juil. 2003 à 11:31
teebo Messages postés 33491 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 24 février 2011 - 3 juil. 2003 à 12:20
Bonjour,

Dans le cadre de mon stage je suis amené à travailler sous ACCESS et je rencontre un problème sur lequel vous pourriez peut être m’aider.
Je souhaite réaliser un import de type « mise à jour » de ma base de données Access avec des données provenant d’un fichier excel.

Pour cela j’utilise la macro Excel suivante qui me permet de copier les données d'une feuille de calcul Excel vers une table Access.

Définition des éléments utilisés :

Nom de la base de données --> bd2.mdb
Table recevant les données Excel --> bdtest
Champs de la table Factures --> Libellé Long, Catégorie COB, Garantie, Typologie IAF, Gestionnaire, Dépositaire/Emetteur, Rating LT Dépositaire, VL, Nb de parts
Feuille de calcul Excel d'où l'on exporte les données --> bd


Sub WritingWorksheetData_DAO()
Dim Plage As Range
Dim Array1 As Variant
Dim x As Variant
Dim Db1 As Database
Dim Rs1 As Recordset

' Ouverture de la base de données Commandes.mdb
Set Db1 = DBEngine.OpenDatabase(ThisWorkbook.Path & "\bd2.mdb")

' Ouverture de la table Factures
' Un objet Recordset représente les enregistrements d'une table

Set Rs1 = Db1.OpenRecordset("bdtest", dbOpenDynaset)

' Détermination de la taille de la plage à envoyer vers Access

Set Plage = Worksheets("bd").Range("A1").CurrentRegion.Offset(1, 0)
Set Plage = Plage.Resize(Plage.Rows.Count - 1, Plage.Columns.Count)
Plage.Select

' Lecture de la plage pour renvoyer une valeur contenant un tableau

Array1 = Plage.Value

' Ecriture des données depuis Excel vers les enregistrement de la table Factures

For x = 1 To UBound(Array1, 1)
With Rs1
.AddNew
.Fields("Libellé Long") = Array1(x, 1)
.Fields("Catégorie COB") = Array1(x, 2)
.Fields("Garantie") = Array1(x, 3)
.Fields("Typologie IAF") = Array1(x, 4)
.Fields("Gestionnaire") = Array1(x, 5)
.Fields("Dépositaire/Emetteur") = Array1(x, 6)
.Fields("Rating LT Dépositaire") = Array1(x, 7)
.Fields("VL") = Array1(x, 8)
.Fields("Nb de parts") = Array1(x, 9)
.Update
End With
Next

' Fermeture de la base Commandes.mdb

Db1.Close

' Effacement des données copiées vers la base (sauf les titres)

With Selection.CurrentRegion
Intersect(.Cells, .Offset(1)).Select
End With
Selection.ClearContents

End Sub


Cette marco s’exécute parfaitement mais me pose deux problèmes que je ne parviens pas à résoudre :

- des chaînes vides existent dans ma feuille Excel car certains champs peuvent ne pas être renseignés. En effet les données Excel qui servent à l’import proviennent d’une autre base de données (Europerformance) dont les états de sortie sont des fichiers Excel et dont certains champs sont vides.

Exemple : le champ Garantie est à « oui » quand il y a une garantie et n’est pas renseigné dans le cas inverse.

Est il possible de remédier à cela ?


- ensuite, comme je l’ai dit, l’import et de type « mise à jour », c’est à dire que toutes les semaines par exemple la macro s’exécute et va permettre de compléter la base ACCESS et de mettre à jour certaines données déjà importées la semaine précédentes.

Exemple : d’une importation à l’autre, les champs « nb de part », « gestionnaire ».. peuvent changé.

Ce qu’il faudrait c’est donc que ma macro permette la mise à jour des données. Actuellement, si je réalise deux imports avec les mêmes données mais avec quelques modifications, la macro va tout importer à la suite au lieu de mettre à jour les champs concernés. Je n’ai donc pas de mise à jour, mais plus grave, une redondance des informations.

Voilà, donc si quelqu’un peut m’aider je le remercie d’avance. Si vous avez une autre idée de macro ou de requete qui permette un import Excel/Access et une mise à jour des données entre deux imports je suis preneur.
A voir également:

1 réponse

teebo Messages postés 33491 Date d'inscription jeudi 14 octobre 2004 Statut Modérateur Dernière intervention 24 février 2011 1 793
3 juil. 2003 à 12:20
Salut, quelques idees en vracs:
Pour le oui/non, si tu mets une valeur par defaut dans ta colonne ca ne marche pas (dans Access)?
Pour l'execution automatique hebdomadaire par exemple, renseigne toi sur le /cmd de access, je pense que tu dois pouvoir lancer ta fonction de l'exterieur et donc utiliser le planificateur Windows
Pour le probleme de redondance, si tu choisis bien ta cle ca devrait pas poser probleme, sinon tu peux passer par une table temporaire et apres insere les enregistrements un a un en fonction de leur presence ou non (et aussi corriger en passant les valeurs absentes).
Tout cela depend aussi de la taille, des contraintes d'efficacite,...
Bon courage...

.  .
\_/
0