comment rédiger une requête SQL dans un fichier excel?

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Répondre
n
nicopat
Membre fidèle
Membre fidèle
Messages : 258
Inscrit le : 28 mars 2015
Version d'Excel : 2007 FR

Message par nicopat » 28 juin 2018, 11:27

Bonjour,

Je ne connais pas grand chose au language SQL, donc pardon si je dis des inepties.
J'ai bcp de données à stocker pour qu'elles soient de temps en temps appelée par un fichier excel et je cherche une solution. Les stocker dans une base séparée Access montre ses limites (la base dépasse 2GB). Donc je cherche s'il y a d'autres solutions de stockage des données.

Imaginons que depuis un fichier excel, je souhaite appeler une donnée qui figure dans une base de données SQL.
Imaginons que la table SQL comporte 3 champs : ID, Valeur1, Valeur2
1/ est-il possible via une formule VBA d'éxécuter ce type de requête?
2/ si oui, comment se rédigerait par exemple la requête qui appelle la Valeur1 associée à l'ID "X" ?

Merci de votre aide
Avatar du membre
78chris
Passionné d'Excel
Passionné d'Excel
Messages : 5'613
Appréciations reçues : 422
Inscrit le : 9 juillet 2017
Version d'Excel : 2010 à 2019 + 365

Message par 78chris » 28 juin 2018, 11:37

Bonjour

Oui c'est possible en VBA

Pour dépasser 2GO il faut vraiment un très gros volume de données : combien d'enregistrements dans ta table ?
Chris
Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
Confucius
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 9'464
Appréciations reçues : 428
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 28 juin 2018, 11:39

Bonjour,
1/ est-il possible via une formule VBA d'éxécuter ce type de requête?
à ma connaissance, ce n'est pas possibles avec les fonctions standards. Il faudra passer par une fonction personnalisée.
2/ si oui, comment se rédigerait par exemple la requête qui appelle la Valeur1 associée à l'ID "X" ?
la syntaxe de la requête SQL pourrait ressembler à ceci
select value1 from table where id='X'
B
Braters
Membre dévoué
Membre dévoué
Messages : 579
Appréciations reçues : 10
Inscrit le : 23 décembre 2015
Version d'Excel : 2013 FR

Message par Braters » 28 juin 2018, 11:42

Bonjour à tous,

Je pense que le tutoriel de "tatiak" pourrai bien t'orienter, ici : http://tatiak.canalblog.com/archives/20 ... 05283.html.

Personnellement, je ne pourrai pas t'aider plus que ça au vu de mes capacités désolé :lole:
Je laisse donc la main aux personnes plus compétentes 8-)

A plus !
:btres:
Avatar du membre
pierrep56
Membre impliqué
Membre impliqué
Messages : 1'206
Appréciations reçues : 198
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 28 juin 2018, 13:24

Bonjour à tous,

Pour info, pour les requêtes de base, le langage SQL n'est pas très compliqué à apprendre.
LE Site à se garder en marque-page/favoris est : http://sql.sh/

Ensuite, depuis Excel c'est assez simple d'exécuter des requêtes vers des bases SQL-Server / MySQl / Access , ou autres formats. Il faut simplement être attentif à ne pas mélanger langage VBA et langage SQL.

Pour compléter les excellentes sources de Braters (merci au passage) la page suivante donne aussi pas mal d'information => http://tatiak.canalblog.com/archives/ex ... index.html

Pour répondre précisément à la question 2 de Nicopat la requête en VBA pourrait être du genre :
Dim Requete As String, Id As String

    Id = "X" ' ça pourrait être un truc genre Id = Sheets("Machin").Range("A1").Value
    Requete = "SELECT Valeur1, Valeur2 FROM [LaTable] WHERE ID=" & Id
Autre exemple, avec jointure de plusieurs tables voici une requete copiée d'une de mes appli (écrite sous Excel):
    Req = "SELECT MAX(V.Date_visite), M.Freq, R.Responsable, M.Id, M.Denomination, " & _
          " M.Reference, M.Emplacement, M.Batiment, M.Etage, M.Info1  " & _
          " FROM ([" & Materiel & "] AS M " & _
          " LEFT JOIN [" & Verif & "] AS V On M.Id=V.Id)" & _
          " LEFT JOIN [" & Responsables & "] AS R On R.Id_Resp=M.Id_Resp" & _
          " WHERE (dateadd('m',12/M.freq, V.Date_visite)<=" & CLng(Date) & _
          " OR V.Date_visite>=" & derJ & _
          " OR ISNULL(V.Date_visite)) "
NB : ici 'dateadd' est bien une fonction SQL valide, interprétée par le moteur SQL (ce n'est pas la fonction 'dateadd' du VBA)

Ensuite pour exécuter la requête, un script de connexion avec le bon driver, et on récupère le résultat de la requête dans un tableau. Çà peut donner un code du genre :
Dim Rst As Object, T As Variant

    Set Rst = CreateObject("ADODB.Recordset")
    Rst.Open Requete, Cnx, adOpenStatic
    Rst.MoveFirst
    T = Rst.GetRows
Pour finir, le SQL depuis Excel : Mangez-en! : c'est possible, c'est puissant et ce n'est pas si dur à mettre en place.
(Mais comme toujours, au préalable prenez le temps de bien concevoir la structure des tables!!)

Pierre (tatiak)

PS : pour du concret et comme exemple de code, ci-joint une démo Excel de synchronisation avec n'importe quelle base Access (non protégée).
Dans le code, plusieurs requêtes SQL : SELECT, INSERT, UPDATE le tout parfaitement fonctionnel (pour base de taille modeste : ce n'est qu'une démo).

PS2 : NB pour certaines bases SQL (par exemple MySql), il faut disposer d'un serveur.

PS3 : Ben dis-donc il faut déjà y aller pour atteindre les 2Go avec une base Access !!?!! Il n'y a pas de redondances dans les tables???
Synchro_Access_v0.6.xlsm
(42.08 Kio) Téléchargé 390 fois
1 membre du forum aime ce message.
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message