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 :

Querytables.add sur SQL server, problème de variables SQL


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Par défaut Querytables.add sur SQL server, problème de variables SQL
    Bonjour,

    je rencontre actuellement un gros problème de communication vba/SQL server.

    J'utilise querytables.add pour soumettre mes requêtes, ce qui ne pose jamais de soucis, SAUF dans le cas où la requête fait intervenir des variables SQL. Dans ce cas, une erreur est rejetée par vba, alors que la même requête exécutée directement en SQL ne pose pas de soucis.

    Exemple tout bête :
    DECLARE @liste varchar(3);set @liste='500';select @liste;

    Pas de problème SQL (bon, peut-être pas la syntaxe la plus professionnelle, ça je ne sais pas), mais impossible à exécuter en vba avec le bloc suivant :

    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
     
    requete_SQL="DECLARE @liste varchar(3);set @liste='500';select @liste;"
    With ActiveSheet.QueryTables.Add(Connection:= _
            "ODBC;DRIVER=SQL Server;SERVER=XXX;UID=XXX;PWD=XXX;APP=Microsoft Office 2003;WSID=ITEM-60109" _
            , Destination:=Range(rang))
            .CommandText = requete_SQL
            .Name = "Lancer la requête à partir de XXX"
            .FieldNames = False
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlOverwriteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .Refresh BackgroundQuery:=True
        End With
    bloc qui ne m'a jamais causé de problème sur de simples Select.

    L'utilisation de SQL server via vba autorise-t-elle la création de variables SQL?
    Si oui, où est mon erreur?

    Merci !

    ps : si le sujet a plus sa place dans le forum SQL server, merci de le déplacer !

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 105
    Par défaut
    peut-u décrire le message d'erreur en question? et sur quelle ligne le vba s'arrête?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Par défaut
    si je laisse l'option
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Refresh BackgroundQuery:=True
    pas d'erreur, mais la réponse affichée dans Excel est
    Lancer la requête à partir de XXX
    et pas le
    500
    auquel je m'attend

    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Refresh BackgroundQuery:=False
    le code s'arrête à cette ligne, avec une erreur d'exécution '1004', erreur définie par l'application ou par l'objet

  4. #4
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Bonjour,
    L'utilisation de SQL server via vba autorise-t-elle la création de variables SQL?
    A mon avis tu ne peux faire que du Select dans le As tu vraiment besoin de créer ces variables via VBA?

    Cordialement.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Par défaut
    Ma requête fait intervenir une concaténation des différents résultats, que je trouve bien plus pratique à faire directement en SQL qu'en vba.
    D'autant plus que je ne me suis pas intéressé à d'autres méthodes de requêtage que le querytable.

    Je ne vois pas de système de concaténation SQL sans passer par une variable.
    Soit je continue avec le querytable et je concatène différentes cases Excel en une, soit je passe en objet vba, que je ne maitrise absolument pas...

  6. #6
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Qu'appelles tu
    concaténation SQL
    Tu as un exemple sous la main?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Par défaut
    le but est de concaténer dans une chaine tous les résultats de la requête (donc les lignes, et non pas les différents champs d'un résultat=colonne)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE @liste varchar(8000);
    SET @liste = '';       
    select  @liste= @liste + cast(champ1  AS VARCHAR)+ ','
            FROM data1, data2 
           WHERE ...
    select @liste;

  8. #8
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Si j'ai bien compris tu veux transformer en Perso je ferais comme ça (en supposant que la concaténation ne peut pas se faire directement dans la requête SQL):
    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
    Dim plageData as Range
    Dim i as Long
    Dim strRes as String
    Dim Data as variant
     
    With ActiveSheet.QueryTables.Add(Connection:= _
            "ODBC;DRIVER=SQL Server;SERVER=XXX;UID=XXX;PWD=XXX;APP=Microsoft Office 2003;WSID=ITEM-60109" _
            , Destination:=Range(rang))
            .CommandText = requete_SQL
            .Name = "Lancer la requête à partir de XXX"
            ......
            .plageData = .ResultRange    'plage contenant le résultat de la requête
    End With
     
    strRes = ""
     
    If Not plageData Is Nothing Then
     
            Data = plageData.Value   ' Tes données sous forme d'un tableau
            For i = LBound(Data, 1) To UBound(Data, 1)   'pour toutes les lignes de la plage ie tous les enregistrements de la requête
                strRes = IIf(i = LBound(Data, 1), Data(i, 1), strRes & "," & Data(i, 1))
            Next i
    End If

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Par défaut
    exact.

    c'est ce que j'ai choisi de faire, mais assez déçu finalement du lien SQL VBA. Je ne suis pas expert en sql, mais j'espère qu'il y a des moyens de créer des variables sql dans des sessions virtuelles, sans utiliser l'outil propre à sql.

  10. #10
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Oui, il y' en a mais il faut "travailler" un petit peu plus... Jette un coup d’œil là dessus si tu as le temps.

    Cordialement.

    PS: Pense à mettre en "Résolu" si le sujet est clos pour toi.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Par défaut
    Merci pour le lien !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/03/2010, 10h22
  2. [D7][SQL Server]Exécuter un script SQL Server dans firebird
    Par aityahia dans le forum Bases de données
    Réponses: 4
    Dernier message: 16/04/2007, 08h44
  3. Réponses: 7
    Dernier message: 16/11/2006, 09h49
  4. Sauvegarde SQL-Server 2000 pour restauration SQL-Server 2005
    Par Harny dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 06/10/2006, 12h06
  5. Migration SQL Server 6.5 vers SQL Server 2000
    Par Douglas dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 27/10/2005, 12h44

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