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 :

Requete SQL VBA Excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 69
    Par défaut
    Bonjour,

    j'ai un problème que nos ITs sont incapables de résoudre, j'espère trouver plus de réponses ici

    On aimerait faire des reportings via Excel et Vba. Ce ne sont pas des requetes compliqués mais nous ne savons pas comment connecter Oracle à VBA/Excel.

    Voici le code que j'ai réussi a construire grâce aux informations trouvées sur le net :

    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
    Sub Connection_Oracle()
     
    'Déclaration de la variable de connexion
    Dim cNx As ADODB.Connection
    Set cNx = New ADODB.Connection
     
    'Définition de la chaîne de connexion
    cNx.ConnectionString = "DSN=XxX" & NomDuDSN & ";UID=XxX" & NomUtilisateur & ";PWD=XxX" & MotDePasse & ";"
     
    Dim varSQL As String
     
    varSQL = "SELECT tr.trade_id FROM trade tr WHERE tr.trade_id = 123"
     
    With ActiveSheet.QueryTables.Add(Connection:=cNx, Destination:=ActiveSheet.Range("A1"), Sql:=varSQL)
        .Refresh
     
    End With
     
    End Sub
    A priori, il n'y a pas de souci au niveau de la connection avec le serveur. En tout cas dans microsoft Query, la connexion s'effectue correctement (il retrouve les tables de mon serveur). Je dis a priori, car je n'ai aucun moyen de tester la connexion dans VBA étant donné que je n'arrive meme pas a obtenir une réponse via un msgbox...

    Voilà,

    est ce que quelqu'un en saurait un peu plus sur le requetage sur VBA/Excel ?
    Comment savoir si la connexion est correct ?
    Comment faire une requete ?
    Et comment formater le résultat obtenu ?

    Je sais qu'il y a beaucoup de quesitons, mais si vous avez une réponse à l'unes de ces questions : n'hésiter pas !

    Merci beaucoup.

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Pour les premiers pas :
    tu ouvres une connexion ADO
    tu ouvres un Recordset ADO avec une requête simple
    Si oRst est ton recordse tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thisworkbook.Worksheets("Feuil1").Range("A1").Copyfromrecordset oRst
    Cela devrait t'éclairer. SI tu as ensuite d'autres pb, tu reviens.

    Cordialement,

    PGZ

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 69
    Par défaut
    Je ne suis pas sur de bien comprendre, quelle valeur devrait apparaitre dans ma cellule A1 ?

    A quoi correspond le recordset ?


    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
    Sub Connection_Oracle()
     
    'Déclaration de la variable de connexion
    Dim cNx As ADODB.Connection, oRS As ADODB.Recordset
    Set cNx = New ADODB.Connection
     
     
    'Définition de la chaîne de connexion
    cNx.ConnectionString = "DSN=XxX" & NomDuDSN & ";UID=XxX" & NomUtilisateur & ";PWD=XxX" & MotDePasse & ";"
     
    cNx.Open
     
    Dim varSQL As String
     
    varSQL = "SELECT tr.trade_id FROM trade tr WHERE tr.trade_id = 123"
     
    ThisWorkbook.Worksheets("Feuil1").Range("A1").CopyFromRecordset oRS
     
    'With ActiveSheet.QueryTables.Add(Connection:=cNx, Destination:=ActiveSheet.Range("A1"), Sql:=varSQL)
    '    .Refresh
    '
    'End With
     
    'With ActiveSheet.QueryTables.Add(Connection:=cNx, Destination:=Range("A1"))
    '.CommandText = SQLSTRING
    '.AdjustColumnWidth = False
    '.Refresh (False)
     
    'End With
    End Sub

  4. #4
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Re,

    CEla devrait ressembler à
    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
    Sub Connection_Oracle() 
    'Déclaration de la variable de connexion
    Dim cNx As ADODB.Connection, oRS As ADODB.Recordset, sSQL As String
    Dim NomDuDSN As String, NomUtilisateur As String, MotDePasse As String
     
    Set cNx = New ADODB.Connection
     
    'Définition de la chaîne de connexion
    cNx.ConnectionString = "DSN=XxX" & NomDuDSN & ";UID=XxX" & NomUtilisateur & ";PWD=XxX" & MotDePasse & ";"
    cNx.Open
     
    sSQL = "SELECT tr.trade_id FROM trade tr WHERE tr.trade_id = 123"
    Set oRS = New ADODB.Recordset
     
    oRS.Open sSQL, cNx, adOpenStatic
     
    With ThisWorkbook.Worksheets("Feuil1")
        .UsedRange.ClearContents
        .Range("A1").CopyFromRecordset oRS
    End With
     
    oRS.Close
    cNx.Close
    Set oRS = Nothing
    Set cNx = Nothing
    End Sub
    Cordialement,

    PGZ

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 69
    Par défaut
    La connection se fait bien. Si je mets les mauvais identifiants, le programme me renvoie un message d'erreur.
    En revanche toujours aucune écriture au niveau de la cellule A1.

    A quoi sert la commande recordset ?

    Aurais tu une alternative pour faire apparaitre le resultat de la requete ? (qui devrait etre "123")

    Si j'arrivais a faire apparaitre un résultat, j'aurais une base pour démarrer les recherches.

    Merci d'avance pour ton aide

  6. #6
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Si la requête renvoie au moins 1 enregistrement, il devrait être copié dans la feuille. Tu peux vérifier avec
    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
    Sub Connection_Oracle()
    'Déclaration de la variable de connexion
    Dim cNx As ADODB.Connection, oRS As ADODB.Recordset, sSQL As String
    Dim NomDuDSN As String, NomUtilisateur As String, MotDePasse As String
     
    Set cNx = New ADODB.Connection
     
    'Définition de la chaîne de connexion
    cNx.ConnectionString = "DSN=XxX" & NomDuDSN & ";UID=XxX" & NomUtilisateur & ";PWD=XxX" & MotDePasse & ";"
    cNx.Open
     
    sSQL = "SELECT tr.trade_id FROM trade as tr WHERE tr.trade_id = 123;"
    Set oRS = New ADODB.Recordset
     
    oRS.Open sSQL, cNx, adOpenStatic
     
    MsgBox IIf(oRS.EOF, "Il n'y a aucun enregistrement", "Il y a au moins un enregistrement")
     
    With ThisWorkbook.Worksheets("Feuil1")
        .UsedRange.ClearContents
        .Range("A1").CopyFromRecordset oRS
    End With
     
    oRS.Close
    cNx.Close
    Set oRS = Nothing
    Set cNx = Nothing
    End Sub
    Si le jeu est vide et qu'il n'y a pas d'erreur levée, essaie à nouveau en enlevant la clause WHERE.

    Cordialement,

    PGZ

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 69
    Par défaut
    En effet, j'ai eu un retour. Super début.

    Voici le code pour ceux que cela intéresse :

    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
    32
    33
    34
     
    Sub Connection_Oracle2()
     
    'Déclaration de la variable de connexion
    Dim cNx As ADODB.Connection, oRS As ADODB.Recordset
    Dim NomDuDSN As String, NomUtilisateur As String, MotDePasse As String, sSQL As String
     
    NomDuDSN = "XxX"
    NomUtilisateur = "XxX"
    MotDePasse = "XxX"
     
    Set cNx = New ADODB.Connection
     
    'Définition de la chaîne de connexion
    cNx.ConnectionString = "DSN=" & NomDuDSN & ";UID=" & NomUtilisateur & ";PWD=" & MotDePasse & ";"
    cNx.Open
     
    sSQL = "SELECT trade_id FROM trade ;"
    Set oRS = New ADODB.Recordset
     
    oRS.Open sSQL, cNx, adOpenStatic
     
    MsgBox IIf(oRS.EOF, "Il n'y a aucun enregistrement", "Il y a au moins un enregistrement")
     
    With ThisWorkbook.Worksheets("Feuil1")
        .UsedRange.ClearContents
        .Range("A1").CopyFromRecordset oRS
    End With
     
    oRS.Close
    cNx.Close
    Set oRS = Nothing
    Set cNx = Nothing
    End Sub

    Je vais étudier les commandes pour adapter la macro. j'essaierai de faire un tuto par la suite.

    Je te tiens au courant de l'avancement du projet. J'aurais probablement d'autres questions demain.

    Encore Merci !

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 69
    Par défaut
    Rebonjour pgz,

    Bon, je ne sais pas pourquoi mais le programme semble mieux lire la requete quand celle ci est en ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sSQL =  " SELECT * " & _
               " FROM trade tr " & _
               " WHERE tr.trade_id = '34101235' "
    Les strings étant limités à 255 caractères, si ma requete est trop longue est ce que je peux l'enregistrer sur deux variables comme cela :

    Requete1 = SQL1
    Requete2 = suite de SQL1

    et lancer la requete :

    oRS.Open Requete1 & requete2, cNx, adOpenStatic

    ?

    Merci pour ton aide, elle a été précieuse.

    Je ne cloture pas le sujet tout de suite si j'ai des problèmes d'éditions.

    FS

  9. #9
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Une chaîne de longueur variable peut contenir 2^31 caractères, soit plus de 2 10^9. Cela devrait être assez, non?

    C'est dans les tables access que ce type est limité à 255.

    Donc tu peux avoir sSQL aussi longue que de besoin.

    Cordialement,

    PGZ

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut précision
    Bonour à tous,

    Je déterre le sujet histoire de compléter la réponse maintenant que j'ai une solution.

    La requete sql envoyée depuis excel en vba vers la base de donnée est une chaine de caractères soit un string.

    Dans VB/Excel, il n'est pas possible de couper les bloc fonction mais on peut toujours couper une ligne de commande pour un retour à la ligne sous certaines règles. C'est souvent ce que fait l'éditeur de macro sans logique apparente.
    Il faut couper la ligne avant un bloc fontion. On termine alors la jonction par un espace+ underscore ( _). On revient à la ligne et on la commance alors avec la commande suivante (& par exemple)
    Pratique pour une requete sql souvent illisible car trop longue.
    Je corrige donc le bloc du post précédent dont le & est mal placé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sSQL =  " SELECT * " & _
    " FROM trade tr " & _
    " WHERE tr.trade_id = '34101235' "
    devient...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sSQL =    "SELECT * " _
               & "FROM trade tr " _
               & "WHERE tr.trade_id = '34101235' "
    Attention, l'utilisation de " _" ne supporte plus rien après. Pas question de rajouter des commentaires en fin de ligne.
    CQFE.

    J'ai mis 2 jours à trouver la réponse, j'espère que cela pourra en aider d'autres.

    See You all

Discussions similaires

  1. Exportation d'une requete SQL vers excel
    Par snooopy007 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 27/07/2006, 17h00
  2. cote requete SQL - VBA
    Par Sam 069 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 17/07/2006, 08h10
  3. [VBA-E] Requete SQL sous Excel
    Par climz dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/05/2006, 14h05
  4. Résultat d'une requete SQL vers Excel
    Par climz dans le forum Access
    Réponses: 6
    Dernier message: 09/05/2006, 15h44
  5. Exporter des données d'un requete SQL vers excel (csv)
    Par PrinceMaster77 dans le forum ASP
    Réponses: 9
    Dernier message: 08/10/2005, 22h28

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