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 :

Excel et Access : Requêtes en VBA [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Logistics & Quality Manager
    Inscrit en
    Octobre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Logistics & Quality Manager
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2013
    Messages : 10
    Par défaut Excel et Access : Requêtes en VBA
    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 :

    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"));
    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".

    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 :

    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
    Mais sans succès car dès le Set DataB.OpenDatabase j'ai une erreur "3343" qui stoppe l'exécution du code.

    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.

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    bonjour,

    qu'elle est la version de DAO (voir liste références ) utilisée...

    regarde ensuite ta requête il me semble qu'il manque des espaces entre tes clauses Insert, Select , from et where

  3. #3
    Membre averti
    Homme Profil pro
    Logistics & Quality Manager
    Inscrit en
    Octobre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Logistics & Quality Manager
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2013
    Messages : 10
    Par défaut
    Bonjour bbil,

    La version de DAO est la 3.6.

    Effectivement pour l'exécution de la requête il faudra que je pense à rajouter des espaces avant de concaténer les strings, j'avais pas vu ça, merci.

  4. #4
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    il faudrait passer sous :

    Microsoft Office 12.0 (14.0) Access Database Engine Object

    voir :
    http://warin.developpez.com/access/d...ge=partie_1#L1

  5. #5
    Invité
    Invité(e)
    Par défaut Bonjour,test ça
    regarde le fichier joint:
    Fichiers attachés Fichiers attachés

  6. #6
    Invité
    Invité(e)
    Par défaut Bonsoir,
    dans mon poste précédant, je t'ai mis un fichier joint qui vas te permettre de te connecter à ta base de données Access!

    maintenant en ce qui concerne ta requête, tu as me semble-t-il récupérer le scripte SQL d'une requête élabore par le requêteur intégré d'Access. mais ce dernier relise un scripte pas exactement conforme à la norme SQL. il encadre les strinng par des double cote ["] mais cette formulation n'est pas bonne il faut encadrer les string par des simple cote ['].

    je te suggère de reprendre le scripte Access qui lui doit fonctionner et replacer les " par des '
    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
    Sql="E_COD_PART, E_QTY_MOVEMENT, E_NUM_PUTAWAY, E_COD_WAREHOUSE ) "
    Sql=Sql & "SELECT DISTINCT Month([E_DAT_UPDATE]) AS Mois, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_PLANT_ID, "
    Sql=Sql & "DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_TRANSACTION_TYPE, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_DAT_UPDATE, "
    Sql=Sql & "DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_ADJ_REASON, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_NUM_TRANSACTION, "
    Sql=Sql & "DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_PART, "
    Sql=Sql & "DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_QTY_MOVEMENT, DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_NUM_PUTAWAY, "
    Sql=Sql & "DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_WAREHOUSE "
    Sql=Sql & "FROM DWRL1_DWT_MF001_INVENTORY_MOVEMENTS "
    Sql=Sql & "WHERE (((Month([E_DAT_UPDATE]))=[INDIQUER MOIS]) "
    Sql=Sql & "AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_PLANT_ID)='F1') "
    Sql=Sql & "AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_TRANSACTION_TYPE)='TRN') "
    Sql=Sql & "AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_DAT_UPDATE)>#1/1/2014#) "
    Sql=Sql & "AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_ADJ_REASON) Like '%009%') "
    Sql=Sql & "AND ((DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)='ZZ_CEVALEP1' "
    Sql=Sql & "Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)='ZZ_CEVALEP2' "
    Sql=Sql & "Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)='ZZ_VELEP1' "
    Sql=Sql & "Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)='ZZ_VELEP2' "
    Sql=Sql & "Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)='ZZ_PACK_20' "
    Sql=Sql & "Or (DWRL1_DWT_MF001_INVENTORY_MOVEMENTS.E_COD_LOCATION)='ZZ_LEP1_LEP2'));"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Source][VBA-E] Remplir une zone de liste Excel par une requête Access
    Par cafeine dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/01/2007, 13h26
  2. [VBA-A]Travailler dans un fichier Excel dans Access
    Par pilou0013 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/05/2006, 12h21
  3. [VBA-A/E]gen doc avec images ref. ds excell ou access
    Par tinous dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/03/2006, 13h46
  4. [VBA-E] Application Excel ou Access
    Par Observatoire dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/03/2006, 12h00
  5. Récupérer une sheets dans excel vers access sous vba
    Par odbee dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/10/2005, 00h30

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