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

Requêtes et SQL. Discussion :

Optimisation d'une requete SQL>Access depuis Excel


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Optimisation d'une requete SQL>Access depuis Excel
    Bonjour,

    je fais appel à une base de données access depuis excel à l'aide d'une requete sql dans un code vba.
    En gros j'ai une feuille excel contenant une liste de codes article à analyser, déterminée à l'avance par une macro.
    Puis je cherche par la requete SQL à récupérer la liste des données de ces articles en interrogeant une table dans la base access, pour ces codes article.
    Le problème est que j'obtiens le message "erreur d' execution 3360 - la requete est trop complexe" à partir d'un certain nombre de codes article (environ 100 valeurs)
    En effet cette requete est construite en utilisant la clause WHERE en parcourant la liste des codes articles à analyser.

    Voici le code correspondant vous comprendrez mieux:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    requete = "SELECT * FROM donnees_article WHERE id_article  like" & " '" & Sheets("perimetre_analyse_article").Cells(i, 1).Value & "*'"
     
    While Sheets("perimetre_analyse_article").Cells(i + 1, 1).Value <> ""
    requete = requete & " OR id_article=" & "'" & Sheets("perimetre_analyse_article").Cells(i + 1, 1).Value & "'"
    i = i + 1
    Wend
     
    Set db = DAO.OpenDatabase(DB_Path, False, False)
     
    Set rec = db.OpenRecordset(requete, DAO.dbOpenSnapshot)
     
    Worksheets("import_articles").Range("A2").CopyFromRecordset rec

    Evidemment la requete peut vite devenir trop complexe puisqu'elle contient autant de OR que de codes articles et j'ai alors le message d'erreur cité précédemment.
    J'imagine qu'il y a un moyen plus simple de faire en indiquant dans la requete qu'on souhaite récupérer les données de tous les codes articles de la liste,
    sans avoir à les indiquer 1 par 1 avec la clause WHERE, mais je ne sais pas comment faire..(sauf à tout faire dans access, mais mon fichier de départ est sous excel donc je souhaiterais continuer d'utiliser cette méthode de requête si cela est possible).

    Avez-vous une idée?
    merci par avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub TEST()
    Sql = "select * frorm [Feuille1$]  as xls1 inner join  (Select * from [donnees_article]  in 'C:\MyRepertoire2\base.accdb' ) as bdd on bdd.id_article=xls1.id_article"
    With CreateObject("ADODB.Connection")
       .Open = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES;"""
     Set Rs = .Execute(Sql)
     .Close
     End With
    End Sub

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    merci pour votre réponse.
    J'ai repris ce code en essayant de l'adapter (et en mettant bien sûr mon chemin de base de données dans DB_Path)
    mais j'ai une erreur "erreur de syntaxe dans la clause FROM"
    Voilà le code adapté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub TEST()
    Dim sql As String
    Dim rs As DAO.Recordset
    Dim DB_Path as string
    DB_Path="C:\MyRepertoire2\base.accdb"
     
    sql = "select * from [perimetre_analyse_article$]  as xls1 inner join  (Select * from [donnees_article]  in " & DB_Path & " ) as bdd on bdd.id_article=xls1.id_article"
    With CreateObject("ADODB.Connection")
       .Open = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES;"""
     Set rs = .Execute(sql)
     Worksheets("import_articles").Range("A2").CopyFromRecordset rs
     rs.Close
     End With
    End Sub

    Est ce que ce serait lié à la syntaxe de [perimetre_analyse_article$] ? (nom de la feuille excel contenant les codes articles à rechercher).
    J'ai essayé en enlevant le $ mais j'ai alors le message "le moteur de base de données Microsoft Access n'a pas pu trouvé l'objet perimetre_analyse_article"

    merci d'avance si vous pouvez m'aider à corriger ce code.

  4. #4
    Invité
    Invité(e)
    Par défaut
    La base c'est un string [']du point de vues sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DB_Path=" 'C:\MyRepertoire2\base.accdb' "

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    merci mais j'ai rajouté les string ' et maintenant j'ai l'erreur
    "le moteur de base de données Microsoft Access n'a pas pu trouvé l'objet perimetre_analyse_article"

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    rectificatif j'avais oublié de remettre le $ dans [perimetre_analyse_article$]
    c'est chose faite mais ça bloque maintenant sur Set rs = .Execute(sql), j'ai le message "incompabilité de type"
    si j'affiche la requete sql avec un msgbox je vois que c'est

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from [perimetre_analyse_article$]  as xls1 inner join  (Select * from [donnees_article]  in ''C:\MyRepertoire2\base.accdb' ) as bdd on bdd.id_article=xls1.id_article


    j'ai mis "id_article" en entete de la colonne A sur la feuille de données "perimetre_analyse_article"
    c'est bien du texte qu'il y a dans cette colonne, et id_article est également un champ texte dans la table access donnees_article

    donc je ne vois pas ce qui peut poser probleme?

    merci si vous pouvez m'aider à solutionner ça..

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Essais comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;"""

  8. #8
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 949
    Points : 4 876
    Points
    4 876
    Par défaut
    Bonjour,
    Set rs = .Execute(sql), j'ai le message "incompabilité de type"
    Il vaut mieux ne pas mélanger DAO et ADO. Choisit ton camp camarade

    CDLT

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bien vue micniv, j'avais pas fait gaffe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Dim rs As object
    Worksheets("import_articles").Range("A2").CopyFromRecordset  .execute(Sql)
    Dernière modification par Invité ; 19/04/2018 à 00h09.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    en effet c'était la mauvaise déclaration de rs qui posait problème.
    cela fonctionne maintenant, un grand merci à tous les 2, bravo !

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

Discussions similaires

  1. [Excel 2003-2007] requêtes SQL vers une base access depuis Excel
    Par .Spirit dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/10/2010, 18h03
  2. Changement types de données dans une requete SQL ACCESS
    Par Moutonstar dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/11/2008, 13h14
  3. optimisation d'une requete sql
    Par friedamichelle dans le forum Développement
    Réponses: 1
    Dernier message: 03/06/2008, 15h24
  4. Récuperation d'une valeur d'une requete access depuis excel
    Par titeZ dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/04/2008, 12h15
  5. Réponses: 2
    Dernier message: 03/09/2006, 12h02

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