web-dev-qa-db-ja.com

SQLでクエリにパラメーターを渡す方法(Excel)

ExcelをSqlに「リンク」し、正常に動作しました-いくつかのSQLスクリプトを作成し、うまく動作しました。クエリにパラメーターを渡すだけです。更新するたびに、SQLクエリにパラメーター(フィルター条件)を渡すことができるようにします。 [接続プロパティ]の[パラメーター]ボタンは無効になっています。そのため、パラメータークエリを作成できません。誰でも私を助けることができますか?

25
scatterbraiin

接続しようとしているデータベース、接続を作成した方法、使用しているExcelのバージョンによって異なります。 (また、ほとんどの場合、コンピュータ上の関連するODBCドライバのバージョン。)

次の例では、どちらもローカルマシンでSQL Server 2008とExcel 2007を使用しています。

データ接続Wizard(リボンの[データ]タブで、[外部データの取得]セクションの[他のソースから])を使用したとき、同じことを確認しました:[パラメーター]ボタン無効になり、クエリにパラメータを追加しました。select field from table where field2 = ?により、Excelはパラメーターの値が指定されておらず、変更が保存されなかったことを訴えました。

Microsoft Query(データ接続ウィザードと同じ場所)を使用すると、パラメーターを作成し、それらの表示名を指定し、クエリを実行するたびに値を入力することができました。その接続の接続プロパティを表示し、[パラメーター...]ボタンを有効にします。パラメーターは、必要に応じて変更および使用できます。

Accessデータベースを使用してこれを行うこともできました。 Microsoft Queryを使用して、他の種類のデータベースにヒットするパラメーター化されたクエリを作成できることは理にかなっていますが、今のところ簡単にテストすることはできません。

9
Dave DuPlantis

この投稿は古く、この回答はおそらくOPにはほとんど役に立たないでしょうが、私はこの同じ質問に答えようと永遠に費やしたので、調査結果でそれを更新すると思いました。

この回答は、Excelドキュメント内にSQLクエリが既に機能していることを前提としています。 Web上でこれを達成する方法を示すチュートリアルがたくさんあり、パラメータ化されたクエリを追加する方法を説明するチュートリアルがたくさんありますが、existing、OLE DBクエリ。

だから、あなたが私のように、作業クエリを備えたレガシーExcelドキュメントを渡されたが、ユーザーがデータベースフィールドの1つに基づいて結果をフィルタリングできるようにしたい場合、そしてあなたが私のようにExcelでもなければSQLの第一人者、これはあなたを助けることができるかもしれません。

この質問に対するほとんどのWeb回答では、クエリに「?」を追加して、Excelにカスタムパラメータの入力を求めるか、パラメータが存在する[角かっこ]にプロンプ​​トまたはセル参照を配置する必要があると言われているようです。これは、ODBCクエリに対しては動作しますが、OLE DB、1つ以上の必須パラメータに値が指定されていません]に対しては動作しないようです。前者の場合、および後者の2つの「無効な列名「xxxx」」または「不明なオブジェクト「xxxx」」。同様に、神話の「パラメータ...」または「クエリの編集...」ボタンを使用することもオプションではないこのインスタンスでは永久にグレー表示されているようです(参考として、Excel 2010を使用していますが、Excel 97-2003ワークブック(* .xls)を使用しています)

ただし、クエリテキストをプログラムで更新するための簡単なルーチンを備えたパラメーターセルとボタンを追加します。

最初に、空のセルとボタンの隣にパラメータープロンプトを配置できる外部データテーブル(またはどこでも)の上に行を追加します(開発者->挿入->ボタン(フォームコントロール)–開発者タブを有効にする必要がある場合があります、しかし、あなたは他の場所でそれを行う方法を見つけることができます)、そのように:

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

次に、外部データ(青色)領域でセルを選択し、[データ]-> [すべて更新](ドロップダウン)-> [接続プロパティ]を選択して、クエリを確認します。次のセクションのコードは、「WHERE(DB_TABLE_NAME.Field_Name = ‘Default Query Parameter')」(括弧を含む)の形式でクエリ(接続プロパティ->定義->コマンドテキスト)にパラメータがあることを前提としています。明らかに、「DB_TABLE_NAME.Field_Name」と「Default Query Parameter」は、データベーステーブル名、データベース値フィールド(列)名、およびドキュメントを開いたときに検索するデフォルト値に基づいて、コード内で異なる必要があります(if自動更新が設定されています)。次のセクションで必要になる「DB_TABLE_NAME.Field_Name」値と、ダイアログの上部にあるクエリの「接続名」をメモします。

接続プロパティを閉じ、Alt + F11を押してVBAエディターを開きます。まだ開いていない場合は、[プロジェクト]ウィンドウでボタンを含むシートの名前を右クリックし、[コードの表示]を選択します。次のコードをコードウィンドウに貼り付けます(一重引用符または二重引用符は危険で必要なので、コピーすることをお勧めします)。

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

「DB_TABLE_NAME.Field_Name」と「接続名」(2つの場所)を値に置き換えます(二重引用符とスペースと等号を含める必要があります)。

「セル参照」をパラメーターが配置されるセル(先頭から空のセル)に置き換えます-私のものは最初の行の2番目のセルだったので、「B1」を入力します(ここでも二重引用符が必要です)。

VBAエディターを保存して閉じます。

適切なセルにパラメーターを入力します。

ボタンを右クリックして、マクロとしてRefreshQueryサブを割り当て、ボタンをクリックします。クエリは更新され、正しいデータが表示されるはずです!

注:フィルターパラメーター名全体( "DB_TABLE_NAME.Field_Name =")を使用する必要があるのは、クエリに等号の結合またはその他の出現がある場合のみです。そうでない場合は、等号だけで十分であり、Len()計算は不要です。パラメータがテーブルの結合にも使用されているフィールドに含まれている場合、コードの「paramPosition = InStr(queryPreText、valueToFilter)+ Len(valueToFilter)-1」行を「paramPosition = InStr( Right(.CommandText、Len(.CommandText)-InStrRev(.CommandText、 "WHERE"))、valueToFilter)+ Len(valueToFilter)-1 + InStr(.CommandText、 "WHERE") "valueToFilterのみを検索するように「どこ」。

この回答は、クエリ更新の基本コードを見つけたdatapigの「BaconBits」を使用して作成されました。

27
mono código