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 :

Aide sur MS QUERY


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut Aide sur MS QUERY
    Bonjour à tous,

    Je me confronte en ce moment à un petit problème avec Microsoft QUERY.

    J'ai une requette SQL (pointant sur une base Oracle 9i) du type:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT "DONNEE"
    FROM "MA_TABLE"
    WHERE DATE = 'date';

    Je dois exécuter cette requête sur 5 dates différentes et retourner le resultat dans mon classeur Excel.

    Le but étant que mon classeur Excel soit quasi-automatique, dans l'état actuel, je dois exécuter à la main ces 5 requêtes.

    Est-il possible de passer en tant que variable dans une requête SQL sous MS QUERY, le contenu d'une cellule?

    Exemple:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT "DONNEE"
    FROM "MA_TABLE"
    WHERE DATE = 'Feuille1-Cel A1';
    Après pas mal de recherche sur Google, je n'arrive toujours pas à savoir si cela est possible .

    Si quelqu'un a une petite idée, je suis preneur.


    Merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Il faut reconstruire la chaine de commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    feuil1.querytables(1).commandtext=replace(feuil1.querytables(1).commandtext,TexeAModifier, TexteModifie)
    feuil1.querytables(1)..refresh
    Vu que ta date n'est pas forcément connue au moment de la modif, il est probablement utile de stocker le texte générique de la requête quelque part dans le fichier, ou dans une constante. Le texte à sauvegarder pourrait être du genre
    select ... where DATE = [DateSelection]
    de façon à pouvoir utiliser [DateSelection] dans le Replace

    Attention que choisir Date comme nom de champ, ce n'est pas le top du top, car ce mot est réservé par beaucoup de langage comme étant une fonction...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut
    Merci pour ta réponse Pierre Fauconnier mais j'avoue être débutant et je ne comprends pas trop ta réponse.

    Je vais essayer de reprendre du début.

    J'essaye en VBA d'exécuter une requête SQL qui me retourne une erreur:
    "Erreur d'exécution 13, Incompatiblité de type"

    Cette requête fonctionne sous MS QUERY.

    Après recherche sur Google, je n'arrive pas à trouver d'où vient l'erreur.

    J'ai donc voulu passer par MS QUERY.
    Dans 5 cellules différentes je mets ma requête MS QUERY et elle est actualisé au lancement du fichier.

    Mon problème est que la date est variable (5 dates différentes).
    Je ne sais pas la passer en "variable" dans ma requête qui s'exécute sous MS QUERY.

    Exemple de mon code VBA avec la requête:
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Worksheets("TEST").Activate
    ActiveSheet.Cells.Clear
     
    Dim sql As String
     
    sql = "SELECT DISTINCT publi.publication FROM " & _
    "(SELECT ctlo.CODE_ISIN FROM PERF.T_CTL_OPCVM ctlo MINUS SELECT o.CODE_ISIN FROM PERF.T_OPCVM o WHERE o.D_DATE = '12/01/2010') T1, " & _
    "PERF.T_CTL_OPCVM T2, (select distinct C.ll_codif as publication, P.cd_isin_1 AS code_isin, " & _
    "PE.libelle AS nom_europerf from user_ref.t_produit P, user_ref.t_prod_publi PP, user_ref.t_codif C, " & _
    "perf.t_opcvm PE where PP.id_publication = C.id_codif and P.id_produit = PP.id_produit and P.cd_isin_1 = PE.code_isin) publi " & _
    "WHERE T1.code_isin = T2.code_isin AND T2.code_isin = publi.code_isin"
     
    With ActiveSheet.QueryTables.Add(Connection:= _
            "ODBC;DSN=xxx;UID=xxx;PWD=xxx;SERVER=xxx;", Destination:=Sheets("TEST").Range("B1"))
            .CommandText = Array( _
            sql)
            .Name = "Lancer la requête à partir de santorin"
            .FieldNames = False
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = True
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .Refresh BackgroundQuery:=True
        End With
    Il s'agit d'un requête de type "imbriqué" et je ne sais pas si cela est acceptée en langage VBA.

    Je ne sais pas si tu arrives à comprendre ma problèmatique? J'ai un peu du mal à m'expliquer :s

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    La première clause WHERE
    WHERE o.D_DATE = '12/01/2010')
    risque de mal interpréter la date passée de cette façon et il y a de fortes chances qu'elle lise 01 décembre 2010...

    Si la colonne D_Date est de type date, tu as intérêt à lui passer l'entier correspondant. Il faut réaliser cela par concaténation afin de recréer une chaine valide, et il est préférable d'utiliser une variable pour cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim ChoixDate as date
     
    choixdate = ... ' une date valide, la valeur d'un contrôle ou d'un champ...
     
    sql = "SELECT DISTINCT publi.publication FROM " & _
    "(SELECT ctlo.CODE_ISIN FROM PERF.T_CTL_OPCVM ctlo MINUS SELECT o.CODE_ISIN FROM PERF.T_OPCVM o WHERE o.D_DATE = " & clng(choixdate) & ") T1, " & _
    ...
    Je note également que tu crées la requête en MSQuery via du VBA, ce qui n'est pas trivial. Si tu veux passer pas MSQuery, tu aurais intérêt à créer la requête MSQuery via l'interface, puis à modifier la clause WHERE par code comme je l'ai dit plus haut.

    Dernière chose: Contourner la "difficulté" comme tu l'as fait n'est pas souvent la meilleure technique. Ton incompatibilité de type venait peut-être d'une mauvaise interprétation de la date...

    A toi de voir
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut
    De base ma variable de date est contenue dans un variable.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Date1 As String
     
    Date1 = Sheets("Date").Range("A2").Value
    Et j'utilise cette variable dans mes requêtes SQL.

    Tout fonctionne sauf pour la requête que j'ai mise sur ce topic.

    C'est pour cela que j'essaye de passer par un autre moyen

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Je pense que le problème vient de là, pourtant.

    Ta variable est déclarée as string, elle devrait être déclarée as date, et tu dois convertir la saisie dans le contrôle en date valide pour la passer à cette variable, par exemple avec cDate(TextBox1.Value). Vérifie le résultat obtenu en saisissant des dates différents et ambiguës
    01/02/09 et 02/01/09 par exemple, ainsi que des dates non valides pour bloquer sur les dates non valides avant le lancement de la requête.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut
    J'ai déclaré mes dates en "String" car en base elles sont déclarées en "VARCHAR2".

    Je viens de tester de les déclarer en "date" mais j'ai toujours le même message d'erreur

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Alors, c'est correct que ta variable soit en string .

    La date saisie dans la cellule, c'est une date ou du texte?

    Si c'est une date, tu devras la convertir en texte pour respecter le format de stockage de la date dans la base.


    Je suppose que le format de stockage est AAAAMMJJ et que la date saisie en A2 est une date (au sens Excel du terme). Si c'est le cas, tu dois passer la saisie de la cellule à la variable comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Date1 = format(Sheets("Date").Range("A2").Value,"YYYYMMDD")
    et tu peux alors concaténer comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sql = "SELECT DISTINCT publi.publication FROM " & _
    "(SELECT ctlo.CODE_ISIN FROM PERF.T_CTL_OPCVM ctlo MINUS SELECT o.CODE_ISIN FROM PERF.T_OPCVM o WHERE o.D_DATE = '" & date1 & "') T1, " & _
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut
    Les dates sont extraites de la base de donnée (à l'aide d'une requête) au préalable.

    Elles sont insérées dans une feuille Excel sous ce format:
    13/01/2010 00:00 (le format en base est du type jj/mm/aaaa hh:mm)

    J'ai essayé de changer le format des cellules Excel (type date,texte, personnalisé) mais rien y fait !!!

    Ce que je ne comprends pas c'est que même quand je mets la date "en dur" dans ma requête, cela ne fonctionne pas non plus

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Je ne comprends pas que tes date se trouvent en varchar dans ta table et arrivent dans Excel en 13/01/2010 00:00

    Je ne comprends pas ce que tu veux dire par
    le format en base est du type jj/mm/aaaa hh:mm
    alors que précédemment, tu m'as dit qu'elles étaient en varchar...

    Quoi qu'il en soit, la réflexion à mener est la suivante:
    1) T'assurer de la façon dont les dates sont stockées dans la base:
    - varchar => vérifier que le "format" est conforme
    - Date
    - Numérique

    Attention que ce que tu vois ne te donnes pas forcément l'indication. Tu dois t'en assurer en regardant la structure de la table.

    Lorsque tu as cela, tu dois alors t'arranger pour que la saisie dans Excel soit convertie en une variable du même type et du même "format" que dans la base...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut
    Le format d'horodatage de la base est en jj/mm/aaaa hh:mm

    Ma variable o.D_DATE est déclaré en tant que varchar2.

    Je pense que c'est pour ca qu'à l'extraction dans la feuille Excel, il marque
    13/01/2010 00:00

    Je vais regarder ça ce soir et faire plusieurs essais et je reviendrai vers toi


    En tout cas un grand merci pour l'aide que tu m'apportes

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Je ne comprends pas ces deux lignes
    Le format d'horodatage de la base est en jj/mm/aaaa hh:mm

    Ma variable o.D_DATE est déclaré en tant que varchar2.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Aide sur Query et Delete
    Par flo291288 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/06/2008, 08h09
  2. [MS Query] neophyte demande aide sur jointures SQL
    Par thorgal972 dans le forum Langage SQL
    Réponses: 19
    Dernier message: 27/11/2006, 17h13
  3. Réponses: 2
    Dernier message: 27/02/2003, 01h33
  4. [Kylix] Aide sur BitBlt
    Par mic006 dans le forum EDI
    Réponses: 1
    Dernier message: 10/12/2002, 22h54
  5. Aide sur une fenetre
    Par Ray-j dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 29/11/2002, 08h51

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