Bonjour à tous,
Généralement je trouve facilement les réponses à mes questions cependant là, je bloque.
Dans le cadre d'un projet au travail, le service qualité m'a demandé de créer sous Excel une macro qui permettrait de lancer automatiquement la mise à jour des tables d'une base de données Access (de type .accdb).
La base de donnée est dans le même répertoire que le fichier Excel sur lequel je dois travailler, la macro sera lancée via un bouton sur une nouvelle feuille dans ce fichier Excel.
La requête en SQL sur Access est de cette forme :
Lorsque je lance cette requête dans Access, il m'est demandé de rentrer le mot de passe de la base de donnée distante (Ici DWRL1_DWT) afin de me connecter, puis de renseigner le numéro du mois correspondant aux enregistrements que je souhaite ajouter dans la table "Reception RMC".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 INSERT INTO [Reception RMC] ( Mois, E_COD_PLANT_ID, E_COD_TRANSACTION_TYPE, E_DAT_UPDATE, E_COD_ADJ_REASON, E_NUM_TRANSACTION, E_COD_LOCATION, E_COD_PART, E_QTY_MOVEMENT, E_NUM_PUTAWAY, E_COD_WAREHOUSE ) SELECT DISTINCT Month([E_DAT_UPDATE]) AS Mois, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_PLANT_ID, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_TRANSACTION_TYPE, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_DAT_UPDATE, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_ADJ_REASON, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_NUM_TRANSACTION, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_PART, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_QTY_MOVEMENT, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_NUM_PUTAWAY, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_WAREHOUSE FROM DWRL1_DWT_MF001_INVENTORY_MOVEMENTS WHERE (((Month([E_DAT_UPDATE]))=[INDIQUER MOIS]) AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_PLANT_ID)="F1") AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_TRANSACTION_TYPE)="TRN") AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_DAT_UPDATE)>#1/1/2014#) AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_ADJ_REASON) Like "009") AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)="ZZ_CEVALEP1" Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)="ZZ_CEVALEP2" Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)="ZZ_VELEP1" Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)="ZZ_VELEP2" Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)="ZZ_PACK_20" Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)="ZZ_LEP1_LEP2"));
Le but sera de permettre aux personnes ayant accès à Excel de mettre à jour la BDD sans avoir à toucher à Access.
J'ai bien tenté quelque chose comme ça :
Mais sans succès car dès le Set DataB.OpenDatabase j'ai une erreur "3343" qui stoppe l'exécution du 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 Sub UpdateDB() Dim DataB As DAO.Database Dim InsertSQL, SelectSQL, FromSQL, WhereAndOrSQL As String Set DataB = OpenDatabase(ThisWorkbook.Path & "\PPM PACKAGERS.accdb") InsertSQL = "INSERT INTO [Reception RMC] ( Mois, E_COD_PLANT_ID, E_COD_TRANSACTION_TYPE, E_DAT_UPDATE, E_COD_ADJ_REASON, E_NUM_TRANSACTION, E_COD_LOCATION, E_COD_PART, E_QTY_MOVEMENT, E_NUM_PUTAWAY, E_COD_WAREHOUSE )" SelectSQL = "SELECT DISTINCT Month([E_DAT_UPDATE]) AS Mois, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_PLANT_ID, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_TRANSACTION_TYPE, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_DAT_UPDATE, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_ADJ_REASON, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_NUM_TRANSACTION, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_PART, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_QTY_MOVEMENT, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_NUM_PUTAWAY, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_WAREHOUSE" FromSQL = "FROM DWRL1_DWT_MF001_INVENTORY_MOVEMENTS" WhereAndOrSQL = "WHERE (((Month([E_DAT_UPDATE]))= MoisSelect) AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_PLANT_ID)=&Chr(34)&F1&Chr(34)&) AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_TRANSACTION_TYPE)=&Chr(34)&TRN&Chr(34)&) AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_DAT_UPDATE)>#1/1/2014#) AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_ADJ_REASON) Like &Chr(34)&009&Chr(34)&) AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)=&Chr(34)&ZZ_CEVALEP1&Chr(34)& Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)=&Chr(34)&ZZ_CEVALEP2&Chr(34)& Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)=&Chr(34)&ZZ_VELEP1&Chr(34)& Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)=&Chr(34)&ZZ_VELEP2&Chr(34)& Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)=&Chr(34)&ZZ_PACK_20&Chr(34)& Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)=&Chr(34)&ZZ_LEP1_LEP2&Chr(34)&));" DataB.Execute InsertSQL & SelectSQL & FromSQL & WhereAndOrSQL DataB.Close End Sub
Dans la requête SQL j'ai remplacé les guillemets trouvés par les &Chr(34)&, autrement j'avais des erreurs sur la définition de la chaîne.
Est-il possible de lancer cette requête depuis VBA ?
Merci pour votre aide,
Vincent.
Partager