web-dev-qa-db-fra.com

comment passer des paramètres pour interroger dans SQL (Excel)

J'ai "lié" Excel à Sql et cela a bien fonctionné - j'ai écrit un script SQL et cela a très bien fonctionné. Tout ce que je veux faire, c'est passer le paramètre à la requête. Comme chaque fois que je fais un rafraîchissement, je veux pouvoir passer un paramètre (condition de filtre) à Sql Query. Dans le bouton "Propriétés de la connexion", le bouton Paramètres est désactivé. Je ne peux donc pas faire de requête de paramètre. Quelqu'un peut-il m'aider?

25
scatterbraiin

Cela dépend de la base de données à laquelle vous essayez de vous connecter, de la méthode par laquelle vous avez créé la connexion et de la version d'Excel que vous utilisez. (En outre, très probablement, la version du pilote ODBC sur votre ordinateur.)

Les exemples suivants utilisent SQL Server 2008 et Excel 2007, tous deux sur ma machine locale.

Lorsque j'ai utilisé la connexion de données Wizard (sous l'onglet Données du ruban, dans la section Obtenir des données externes, sous À partir d'autres sources), j'ai vu la même chose que vous: le bouton Paramètres a été désactivé et l'ajout d'un paramètre à la requête, quelque chose comme select field from table where field2 = ?, Excel s'est plaint que la valeur du paramètre n'avait pas été spécifiée et que les modifications n'étaient pas enregistrées.

Lorsque j'ai utilisé Microsoft Query (au même endroit que l'assistant de connexion de données), j'ai pu créer des paramètres, leur spécifier un nom d'affichage et entrer des valeurs à chaque exécution de la requête. En affichant les propriétés de connexion pour cette connexion, le bouton Paramètres ... est activé et les paramètres peuvent être modifiés et utilisés comme je pense que vous le souhaitez.

J'ai également pu le faire avec une base de données Access. Il semble raisonnable que Microsoft Query puisse être utilisé pour créer des requêtes paramétrées touchant d'autres types de bases de données, mais je ne peux pas facilement tester cela pour le moment.

9
Dave DuPlantis

Ce message est assez ancien pour que cette réponse soit probablement peu utile à l'OP, mais j'ai passé une éternité à répondre à cette même question, alors j'ai pensé que je le mettrais à jour avec mes résultats.

Cette réponse suppose que vous disposez déjà d'une requête SQL fonctionnelle dans votre document Excel. Il existe de nombreux didacticiels pour vous montrer comment effectuer cette opération sur le Web et de nombreux autres expliquant comment ajouter une requête paramétrée à une, sauf qu'aucun ne semble fonctionner pour une existante, OLE DB requête.

Donc, si vous, comme moi, vous avez remis un document Excel hérité avec une requête de travail, mais l'utilisateur veut pouvoir filtrer les résultats en fonction de l'un des champs de la base de données, et si vous, comme moi, n'êtes ni Excel ni un gourou SQL, cela pourrait vous aider.

La plupart des réponses Web à cette question semblent indiquer que vous devez ajouter un "?" Dans votre requête pour qu'Excel vous invite à entrer un paramètre personnalisé, ou placer l'invite ou la référence de cellule entre [crochets] où le paramètre doit être. Cela peut fonctionner pour une requête ODBC, mais cela ne semble pas fonctionner pour une base de données OLE, renvoyant "Aucune valeur donnée pour un ou plusieurs paramètres requis"). dans le premier cas, et "Nom de colonne non valide" xxxx "" ou "Objet inconnu" xxxx "" dans les deux derniers. De même, l'utilisation des mythiques boutons "Paramètres…" ou "Modifier la requête ..." n'est pas non plus une option car ils semblent être grisés en permanence dans ce cas. (Pour référence, j'utilise Excel 2010, mais avec un classeur Excel 97-2003 (* .xls))

Ce que nous pouvons faire, cependant, est d'ajouter une cellule de paramètre et un bouton avec une routine simple pour mettre à jour par programme notre texte de requête.

Tout d'abord, ajoutez une ligne au-dessus de votre table de données externe (ou n'importe où) où vous pouvez placer un paramètre Prompt à côté d'une cellule vide et d'un bouton (Developer-> Insert-> Button (Form Control) - Vous devrez peut-être activer l'onglet Developer , mais vous pouvez découvrir comment faire cela ailleurs), comme ceci:

[Picture of a cell of Prompt (label) text, an empty cell, then a button.]

Ensuite, sélectionnez une cellule dans la zone Données externes (bleu), puis ouvrez Données-> Actualiser tout (liste déroulante) -> Propriétés de connexion… pour examiner votre requête. Le code de la section suivante suppose que vous avez déjà un paramètre dans votre requête (Propriétés de connexion-> Définition-> Texte de la commande) sous la forme "WHERE (DB_TABLE_NAME.Field_Name =‘ Default Query Parameter ') "(y compris les parenthèses). Il est clair que "DB_TABLE_NAME.Field_Name" et "Default Query Parameter" devront être différents dans votre code, en fonction du nom de la table de base de données, du nom du champ de valeur de la base de données (colonne) et d'une valeur par défaut à rechercher lorsque le document est ouvert (si vous avez un ensemble d'actualisation automatique). Notez la valeur "DB_TABLE_NAME.Field_Name" car vous en aurez besoin dans la section suivante, ainsi que le "nom de connexion" de votre requête, qui se trouve en haut de la boîte de dialogue.

Fermez les propriétés de connexion et appuyez sur Alt + F11 pour ouvrir l'éditeur VBA. Si vous n'y êtes pas déjà, faites un clic droit sur le nom de la feuille contenant votre bouton dans la fenêtre "Projet" et sélectionnez "Afficher le code". Collez le code suivant dans la fenêtre de code (la copie est recommandée, car les guillemets simples/doubles sont risqués et nécessaires).

Sub RefreshQuery()
 Dim queryPreText As String
 Dim queryPostText As String
 Dim valueToFilter As String
 Dim paramPosition As Integer
 valueToFilter = "DB_TABLE_NAME.Field_Name ="

 With ActiveWorkbook.Connections("Connection name").OLEDBConnection
     queryPreText = .CommandText
     paramPosition = InStr(queryPreText, valueToFilter) + Len(valueToFilter) - 1
     queryPreText = Left(queryPreText, paramPosition)
     queryPostText = .CommandText
     queryPostText = Right(queryPostText, Len(queryPostText) - paramPosition)
     queryPostText = Right(queryPostText, Len(queryPostText) - InStr(queryPostText, ")") + 1)
     .CommandText = queryPreText & " '" & Range("Cell reference").Value & "'" & queryPostText
 End With
 ActiveWorkbook.Connections("Connection name").Refresh
End Sub

Remplacez "DB_TABLE_NAME.Field_Name" et "Connection name" (à deux emplacements) par vos valeurs (les guillemets doubles et le signe espace et égal doivent être inclus).

Remplacez "Référence de cellule" par la cellule où ira votre paramètre (la cellule vide depuis le début) - la mienne était la deuxième cellule de la première ligne, donc je mets "B1" (encore une fois, les guillemets sont nécessaires).

Enregistrez et fermez l'éditeur VBA.

Saisissez votre paramètre dans la cellule appropriée.

Cliquez avec le bouton droit sur votre bouton pour attribuer le sous-menu RefreshQuery comme macro, puis cliquez sur votre bouton. La requête doit mettre à jour et afficher les bonnes données!

Remarques: L'utilisation du nom complet du paramètre de filtre ("DB_TABLE_NAME.Field_Name =") n'est nécessaire que si vous avez des jointures ou d'autres occurrences de signes égaux dans votre requête, sinon un seul signe égal serait suffisant et le calcul Len () serait superflu. Si votre paramètre est contenu dans un champ qui est également utilisé pour joindre des tables, vous devrez modifier la ligne "paramPosition = InStr (queryPreText, valueToFilter) + Len (valueToFilter) - 1" dans le code en "paramPosition = InStr ( Droite (.CommandText, Len (.CommandText) - InStrRev (.CommandText, "WHERE")), valueToFilter) + Len (valueToFilter) - 1 + InStr (.CommandText, "WHERE") "afin qu'il ne recherche que la valeurToFilter après le "OERE".

Cette réponse a été créée à l'aide des "BaconBits" de datapig où j'ai trouvé le code de base pour la mise à jour de la requête.

27
mono código