2010-06-22 14 views
33

J'utilise souvent le Get External Data de MS Excel pour créer des rapports simples - exécuter des requêtes sur des bases de données et les afficher correctement dans Excel. Les excellentes fonctionnalités d'Excel, telles que le filtrage et les tableaux croisés dynamiques, ainsi que l'interface familière pour les utilisateurs, en font une solution idéale. Cependant, une limitation avec Microsoft Query est que vous ne pouvez pas ajouter de paramètres aux requêtes qui ne peuvent pas être affichées graphiquement, ce qui limite considérablement le SQL que vous pouvez écrire.Comment ajouter des paramètres à une requête de données externe dans Excel qui ne peut pas être affichée graphiquement?

Y at-il une solution à l'erreur "les paramètres ne sont pas autorisés dans les requêtes qui ne peuvent pas être affichées graphiquement"?

Répondre

5

Si vous avez Excel 2007, vous pouvez écrire VBA pour modifier les connexions (c'est-à-dire les requêtes de données externes) dans un classeur et mettre à jour la propriété CommandText. Si vous ajoutez simplement ? où vous voulez un paramètre, la prochaine fois que vous actualiserez les données, les valeurs des connexions seront demandées! la magie. Lorsque vous regardez les propriétés de la connexion, le bouton Paramètres sera maintenant actif et utilisable normalement.

E.g. J'écrirais une macro, je la ferais dans le débogueur et je la ferais définir correctement le CommandText. Une fois que vous avez fait cela, vous pouvez supprimer la macro - c'est juste un moyen de mettre à jour la requête.

Sub UpdateQuery 
    Dim cn As WorkbookConnection 
    Dim odbcCn As ODBCConnection, oledbCn As OLEDBConnection 
    For Each cn In ThisWorkbook.Connections 
     If cn.Type = xlConnectionTypeODBC Then 
      Set odbcCn = cn.ODBCConnection 

      ' If you do have multiple connections you would want to modify 
      ' the line below each time you run through the loop. 
      odbcCn.CommandText = "select blah from someTable where blah like ?" 

     ElseIf cn.Type = xlConnectionTypeOLEDB Then 
      Set oledbCn = cn.OLEDBConnection 
      oledbCn.CommandText = "select blah from someTable where blah like ?" 
     End If 
    Next 
End Sub 
-1

OUI - solution consiste à enregistrer le classeur dans un fichier XML (par exemple, « XML Spreadsheet 2003 ».) Et de modifier ce fichier sous forme de texte dans le bloc-notes! utilisez la fonction "RECHERCHE" du bloc-notes pour trouver le texte de la requête et modifier vos données à "?".

enregistrer et ouvrir en Excel, essayez actualiser les données et Excel sera monit sur les paramètres.

22

Solution facile (pas VBA requis)

  1. Clic droit Table, développez contexte "Tableau" MANU, sélectionnez "Propriétés de données externes"
  2. cliquez sur le bouton "Propriétés de connexion" (étiquetés uniquement dans infobulle)
  3. Aller à l'onglet « Définition »

A partir de là, modifier le SQL directement en ajoutant '? où vous voulez un paramètre. Fonctionne de la même manière que précédemment, sauf que vous ne soyez pas harcelé.

+2

Merci! C'est une excellente solution --- rapide, facile, pas de bourrelets, et permet de sélectionner directement la cellule Excel qui va contenir le paramètre. ** Je pense que cela devrait être la réponse acceptée ** –

+0

Il ya quelques pas de plus que ce que j'ai trouvé, mais j'ai trouvé cette réponse très utile. D'ici, je pourrais jouer avec ça. Merci! –

+0

Chaque fois que j'essaie cette solution, Excel se bloque. Si je spécifie des valeurs explicites, cela fonctionne bien. Mais ensuite, en essayant d'ajouter les paramètres, il se bloque et finit par s'écraser! – jamiebarrow

45

Excel ' L'interface   pour les requêtes SQL Server ne vous permet pas d'avoir un paramètre personnalisé.   Un moyen de contourner ce problème est de créer une requête Microsoft   générique, puis d'ajouter des paramètres, puis de coller votre requête paramétrée dans les propriétés ' de la connexion.   Voici les étapes détaillées pour Excel 2010:

  1. Ouvrez Excel
  2. Aller données onglet
  3. De l'De Autres sources bouton choisir partir de Microsoft Query
  4. Le " Choisissez la source de données " La fenêtre apparaîtra.   Choisissez une source de données et cliquez sur OK.
  5. Le Qery de requête
    1. Choisir une colonne: une fenêtre apparaît.   L'objectif est de créer une requête générique. Je recommande de choisir une colonne d'une petite table.
    2. Filtre de données: Il suffit de cliquer sur Suivant
    3. Ordre de tri: il suffit de cliquer Suivant
    4. Finition: Il suffit de cliquer sur Terminer .
  6. La fenêtre " Importer des données " apparaît:
    1. Cliquez sur le bouton Propriétés ... .
      1. Choisissez la Définition onglet
      2. Dans le texte " de commande: " section ajouter une clause   OU     qui inclut les paramètres Excel.   Il ' s important d'ajouter   tous les paramètres que vous voulez   maintenant.   Par exemple, si je veux deux paramètres, je pourrais ajouter ceci:
        O WH 1 =? et 2 =?
      3. Cliquez OK pour revenir à la fenêtre Importer des données " "
    2. Choisissez tableau croisé dynamique Rapport
    3. Cliquez OK
  7. Vous serez invité à entrer la valeur des paramètres pour chaque paramètre .
  8. Une fois que vous avez entrer les paramètres que vous serez à votre tableau croisé dynamique
  9. Go batck à l'onglet Données et cliquez sur les connexions Propriétés bouton
    1. Cliquez sur le Définition onglet
    2. Dans le " Texte de commande: " section, Collez la requête SQL réelle que vous souhaitez avec le même nombre de paramètres que vous avez défini précédemment.
    3. Cliquez sur le bouton Paramètres ...  
      1. entrer les valeurs d'invite pour chaque paramètre
      2. Cliquez sur OK
    4. Cliquez sur OK pour fermer la fenêtre Propriétés
  10. Félicitations, vous avez maintenant des paramètres.
+0

Pouvez-vous faire cela pour ajouter des paramètres à une requête SQL Server? c'est-à-dire une connexion à une base de données SQL Server? – Dan

+0

Fantastique. Je me suis toujours demandé comment obtenir ces paramètres. –

+0

Fonctionne bien, mais a quelques problèmes avec LIKE. Si je mets du texte, ça fonctionne bien, imaginez-vous? dans le texte de la commande et 'foobar' dans la cellule, mais l'utilisation de foo% ne fonctionne pas –