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 :

Exécuter une requête SQL à partir d'une feuille Excel [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut Exécuter une requête SQL à partir d'une feuille Excel
    Bonjour
    Depuis quelques années, j'exécute des requêtes Access à partir d'une feuille Excel (cf code vba ci dessous). Et cela fonctionne à merveille.
    Or depuis quelques temps, mes requêtes sont de plus en plus complexe et j'utilise donc non plus Access mais "SQl server management Studio" pour créer mes requêtes.
    Or j'aimerais toujours pourvoir exécuter mes requêtes Sql à partir d'Excel mais mes connaissance ne sont pas aussi poussées.

    Est il possible, de créer un code vba du même type que celui ci dessous où je ferais appelle non pas à une requête Access mais à une requête SQL Server
    je précise que mes requetes SQL Server sont déjà créer dans SQl server management Studio.

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Sub test()
     
    Dim sql As String
    Dim GenereCSTRING As String
    Dim Debut As Object
     
    Dim Fin As Object
    Dim Cm As Object 'Pour utiliser une requête parametrés il faut utiliser l'oblet Command!
    Dim cn As Object 'Pour ce connecter à un base de données Access il faut utiliser l'objet Connection!
    Dim rs As Object
     
    Dim i As Integer
     
    Sheets("feuil1").Select
     
     
    sql = "SELECT  * FROM requete" ' je détermine une requête sql qui pointe sur ta requête Acces."
     
     
    Set cn = CreateObject("ADODB.Connection")
    Set Cm = CreateObject("Adodb.Command")
      'MsgBox ThisWorkbook.Path
     GenereCSTRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=chemin\BaseDonnee_Access.accdb;;Persist Security Info=False" 'Je defini un chêne de texte qui contient les information de ma connection.
     
     
     
     cn.Open GenereCSTRING 'J'ouvre ma connection.
     
     
    Cm.CommandText = sql 'je passe ma requête à mon objet command
    Cm.ActiveConnection = cn 'j'affecte ma connection à ma commande
     
    Const adDate = 7 'defini le type de parametre
     
     
    Set Debut = CreateObject("ADODB.Parameter")
    Debut.Name = "debut": Debut.Type = adDate: Debut.Value = CDate(Format(ThisWorkbook.Sheets("feuil2").Range("B97").Value, "yyyy-mm-dd hh:mm")): Cm.Parameters.Append Debut
     
    Set Fin = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    Fin.Name = "Fin": Fin.Type = adDate: Fin.Value = CDate(Format(ThisWorkbook.Sheets("Feuil2").Range("G97").Value, "yyyy-mm-dd hh:mm")): Cm.Parameters.Append Fin
     
     
     
    Set rs = Cm.Execute 'on recupere le résultat de la requête.
     
     
    With ThisWorkbook.Sheets("Feuil1")
     
     
         For i = 0 To rs.Fields.Count - 1 'On place le nom des champs sur la ligne 4 de ma feuille Excel
                   .Range("A1").Offset(0, i) = rs(i).Name
         Next
     
            .Range("A2").CopyFromRecordset rs 'la on copie le résultat de la requête!

  2. #2
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 419
    Points : 2 178
    Points
    2 178
    Par défaut
    bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GenereCSTRING = "Provider=SQLOLEDB.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Initial Catalog=" & Base & ";Data Source=" & Server
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sql = "SELECT  * FROM Mytable where debut=?"
     Set Debut = CreateObject("ADODB.Parameter")
    Debut.Name = "debut": Debut.Type = adDate: Debut.Value = CDate(Format(ThisWorkbook.Sheets("feuil2").Range("B97").Value, "yyyy-mm-dd hh:mm")): Cm.Parameters.Append Debut

  3. #3
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour Thumb down

    J'étais en vacances , c'est pourquoi je n'aie pas pu répondre plutôt.
    Merci pour ces lignes de codes.
    je vais les tester et je reviens vers toi pour te tenir au courant

  4. #4
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 756
    Points : 2 990
    Points
    2 990
    Par défaut
    Bonjour

    Jette un œil à mon code OpenSource; il faut exactement ce que tu demandes : https://github.com/cavo789/vba_excel_sql

    Bonne soirée.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  5. #5
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour
    Je souhaiterais réouvrire ma discussion concernant l'exécution d'une requête sql server à partir d'une feuille Excel.
    Je n'aie pas eu le temps ces derniers mois pour mettre en application la réponse de Thumb down. Je reviens donc à la charge

    cavo789: j'ai ouvert ton lien et si je ne me suis pas trop penché sur tes lignes de code ; c'est que les lignes de codes envoyés Thumb down ressemblent à mes lignes de codes donc plus simple pour moi de m'y retrouver.

    Thumb down:j'aimerais voir avec toi en détaille la ligne ci dessous que tu m'as envoyé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GenereCSTRING = "Provider=SQLOLEDB.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Initial Catalog=" & Base & ";Data Source=" & Server
    je bloque sur 4 paramétres où je ne sais pas quoi y insérer
    Password ?
    User ?
    Base ?
    Server ?

    Voici ce que j'ai lorsque j'ouvre SQL server pour excécuter mes requêtes SQL( pour des raisons de confidentialité, j'ai changé certains parametres
    Nom : Capture.PNG
Affichages : 4544
Taille : 11,1 Ko
    Thumb down: comment insérer ces informations dans le bout de code que tu m'as envoyé
    Les bases de données où se trouvent mes requêtes SQL sont dans deux base de données différentes : Archive et Customer

  6. #6
    Membre chevronné Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Points : 1 971
    Points
    1 971
    Par défaut
    Bonjour,

    Le plus simple, selon moi, pour récupérer des bases sql, access,... est power query.
    Celui-permet même en amont de l'import d'effectuer bon nombre de traitement de type ETL, et ce sans aucune ligne de code.

    Bat,
    MFoxy
    Michaël

    Si mon aide/avis vous a été profitable , n'hésitez pas à cliquer sur , ça fait toujours plaisir...
    _________________________________________________________________________________________________________________

    "Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu'il est stupide..."
    Albert Einstein

  7. #7
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 756
    Points : 2 990
    Points
    2 990
    Par défaut
    Bonsoir

    Citation Envoyé par facteur Voir le message
    cavo789: j'ai ouvert ton lien et si je ne me suis pas trop penché sur tes lignes de code ; c'est que les lignes de codes envoyés Thumb down ressemblent à mes lignes de codes donc plus simple pour moi de m'y retrouver.
    Oui mais les miennes (par rapport aux tiennes) fonctionnent . C'est juste un clin d'oeil bien sûr mais oui, le code que je propose est prêt à l'emploi; faut juste lire la doc pour savoir comment utiliser le code.


    Par rapport au query string ci-dessous; à priori, voici la réponse à ta question:

    GenereCSTRING = "Provider=SQLOLEDB.1;Password=TON_PASSWORD;Persist Security Info=True;User ID=tintin;Initial Catalog=NOM_DE_TA_DB;Data Source=10.20.30.40.50

    Bonne soirée.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  8. #8
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 419
    Points : 2 178
    Points
    2 178
    Par défaut
    Citation Envoyé par mfoxy Voir le message
    Bonjour,

    Le plus simple, selon moi, pour récupérer des bases sql, access,... est power query.
    Celui-permet même en amont de l'import d'effectuer bon nombre de traitement de type ETL, et ce sans aucune ligne de code.

    Bat,
    MFoxy
    Bonjour,
    power query implique de réécrire tout le programme !

    Et si d'aventure le programme fait des insert, update et delete comment le gères tu avec power query?

    power query c'est une sorte de tableau dynamique croisé rien à voir avec du SQL à exécution direct

  9. #9
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour cavo789
    Ma requête sql se nomme (c'est un exemple)
    et lorsque je l'intègre
    dans la ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql = "SELECT  * FROM SQL_requete1.sql
    j'ai un message d'erreur qui s'affiche

    nom objet SQL_requete1.sql non valide

  10. #10
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    L'execution d'une table entière fonctionne trés bien avec le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql = "select * from dbo.parcel"
    mais lorsque je souhaite executer une requete sql que j'ai crée , j'ai ce message d'erreur qui s'affiche
    nom objet SQL_requete1.sql non valide

  11. #11
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 419
    Points : 2 178
    Points
    2 178
    Par défaut
    Les points [.] Sont interdits dans une requête SQL il te faut remplacer le point par dièse [#]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql = "SELECT  * FROM SQL_requete1#sql]"
    Tu peux écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbo.[SQL_requete1#sql]"
    Si ta requête est dans le schéma par défaut [dbo]

    Le point représente une séparation entre les informations pertinentes !
    [Base de Données].[Dbo].[Table].[Champ]

  12. #12
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    je suis en train de faire n'importe quoi
    mes requete sql se trouve dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Users\nom\Documents\SQL Server Management Studio
    Donc dans ce cas là, que faire ?????

  13. #13
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Thumb down, tes deux solutions ne fonctionnent pas.
    Comme je l'aie écris plus haut, est ce c'est l'emplacement de mes requêtes sql qui posent problème ?

  14. #14
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 419
    Points : 2 178
    Points
    2 178
    Par défaut
    Pourquoi tu n'as pas créer une vue dans SQL serveur ?

  15. #15
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    J'ai compris l'erreur mais je n'arrive pas à trouver la solution.
    Lorsque j'écris la requete en entière dans le code vba, le programme fonctionne très bien.
    Le soucis vient lorsque j'essaie d'éxecuter la requête en l'appelant par son nom.

    la grande question est
    : y a t il une écriture spécifique pour appeler une requête SQL dans vba
    cette écriture ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql = "SELECT *from SQL_requete1#sql"
    merci d'avance de votre aide

  16. #16
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 419
    Points : 2 178
    Points
    2 178
    Par défaut
    SQL_requete1.sql c'est un fichier qui contient ta requête mais ce n'e pas un vue!

    tu ne sais pas créer des vue dan Sql manager?

    Nom : Sans titre.png
Affichages : 4472
Taille : 22,7 Ko

  17. #17
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Thumb down
    effectivement, je ne me suis jamais penché sur cette fonctionnalité de vue.
    Je n'envoyais pas l'utilité jusqu'à aujourd'hui
    Je vais donc m'y mettre mai j'aurais sans doute besoin d'un coup de main...

  18. #18
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 419
    Points : 2 178
    Points
    2 178
    Par défaut
    Citation Envoyé par facteur Voir le message
    Thumb down
    effectivement, je ne me suis jamais penché sur cette fonctionnalité de vue.
    Je n'envoyais pas l'utilité jusqu'à aujourd'hui
    Je vais donc m'y mettre mai j'aurais sans doute besoin d'un coup de main...
    Une vue c'est l'équivalent d'une requête dans Access !

  19. #19
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Thumb down
    demain au boulot, j'essaie de céer une vue t je me permettrais de d'interpeler pour savoir si c'est bien cela.

  20. #20
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 419
    Points : 2 178
    Points
    2 178
    Par défaut
    Ok pas de problème

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/12/2010, 12h42
  2. Construire une requête SQL à partir d'un fichier properties
    Par GabriHell dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 07/04/2010, 13h15
  3. Réponses: 1
    Dernier message: 07/12/2009, 09h25
  4. Récupérer une requête sql à partir d'un Form
    Par Yaponchik dans le forum VBA Access
    Réponses: 2
    Dernier message: 06/03/2008, 10h55
  5. exécuter deux requêtes SQL à partir d'un bouton de commande
    Par Platon93 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/12/2006, 17h57

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