39

私はよく MS ExcelGet External Dataを使用して単純なレポートを作成します。データベースに対してクエリを実行し、Excel で適切に表示します。フィルタリングやピボット テーブルなどの Excel の優れた機能と、ユーザーにとって使い慣れたインターフェイスは、これに非常に適しています。ただし、Microsoft Query の 1 つの制限は、グラフィカルに表示できないクエリにパラメーターを追加できないことです。これにより、記述できる SQL が大幅に制限されます。

「グラフィカルに表示できないクエリではパラメーターは許可されていません」というエラーの解決策はありますか?

4

5 に答える 5

55

SQL Server クエリ用の Excel のインターフェイスでは、カスタム パラメーターを使用できません。これを回避するには、一般的な Microsoft クエリを作成し、パラメータを追加して、パラメータ化されたクエリを接続のプロパティに貼り付けます。Excel 2010 の詳細な手順は次のとおりです。

  1. エクセルを開く
  2. [データ] タブに移動
  3. [他のソースから]ボタンから [ Microsoft Query から] を選択します。
  4. 「データ ソースの選択」ウィンドウが表示されます。  データソースを選択し、[ OK ] をクリックします。
  5. クエリ・キザード
    1. 列の選択: ウィンドウが表示されます。目標は、一般的なクエリを作成することです。小さなテーブルから 1 つの列を選択することをお勧めします。
    2. データのフィルタリング: [次へ] をクリックするだけです
    3. 並べ替え順序: [次へ] をクリックするだけです
    4. 終了: [終了] をクリックするだけです。
  6. [データのインポート] ウィンドウが表示されます。
    1. [プロパティ... ] ボタンをクリックします。
      1. [定義] タブを選択します
      2. 「コマンド テキスト:」セクション で、Excel パラメーターを含むWHERE 句を追加します。必要なパラメーターをすべて追加することが重要です。たとえば、2 つのパラメーターが必要な場合は、次のように追加できます:
        WHERE 1 = ? および 2 = ?
      3. [ OK ] をクリックして [データのインポート] ウィンドウに戻ります。
    2. ピボットテーブル レポートの選択
    3. [ OK] をクリックします。
  7. 各パラメータのパラメータ値を入力するよう求められます。
  8. パラメータを入力すると、ピボット テーブルが表示されます
  9. [データ] タブに戻り、接続の [プロパティ] ボタンをクリックします
    1. [定義] タブをクリックします。
    2. 「コマンド テキスト:」セクションで、以前に定義したのと同じ数のパラメーターを使用して、必要な実際の SQL クエリを貼り付けます。
    3. パラメータ...ボタンを クリックします。
      1. 各パラメータのプロンプト値を入力します
      2. [ OK] をクリックします。
    4. [ OK ] をクリックして、プロパティ ウィンドウを閉じます。
  10. おめでとう、これでパラメータができました。
于 2012-08-21T13:30:52.960 に答える
25

簡単な回避策 (VBA は不要)

  1. テーブルを右クリックし、[テーブル] コンテキスト メニューを展開し、[外部データ プロパティ] を選択します。
  2. [接続プロパティ] ボタンをクリックします (ツールチップのみに表示されます)。
  3. 移動タブ「定義」

ここから、「?」を追加して SQL を直接編集します。パラメータが必要な場所。しつこくならないことを除いて、以前と同じように機能します。

于 2012-07-04T18:29:25.983 に答える
7

Excel 2007 を使用している場合は、VBA を記述してワークブック内の接続 (つまり、外部データ クエリ) を変更し、CommandText プロパティを更新できます。パラメータが必要な場所に単純に追加すると?、次にデータを更新するときに、接続の値を求めるプロンプトが表示されます! マジック。接続のプロパティを見ると、[パラメータ] ボタンがアクティブになり、通常どおり使用できるようになります。

たとえば、マクロを作成し、デバッガーでステップ実行し、CommandText を適切に設定します。これが完了したら、マクロを削除できます。これは、クエリを更新する手段にすぎません。

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
于 2010-06-22T09:44:49.390 に答える
0

Excel 2013 の場合、接続ダイアログの [パラメーター] ボタンは、クエリ テキストに "?" などのパラメーターが含まれていても無効のままです。

次のようにパラメータをクエリ テキストに挿入します。

declare @sd datetime, @ed datetime
set @sd = '2022-01-01' 
set @ed = '2022-01-31' 

select * 
from dbo.Table1 
where date between @sd and @ed

VBA で次を追加します。

Public SQLParams As New Dictionary 'Requred Reference "Microsoft Scripting Runtime"

Sub Button1_Click()
  SQLParams("sd") = "'2022-02-01'"
  SQLParams("ed") = "'2022-02-28'"
      
  UpdateQuery SQLParams
End Sub

'Update params in all Query
Sub UpdateQuery(ByRef SQLParams As Dictionary)
  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
      odbcCn.CommandText = SetParamValues(odbcCn.CommandText, SQLParams)
      odbcCn.Refresh
    ElseIf cn.Type = xlConnectionTypeOLEDB Then
      Set oledbCn = cn.OLEDBConnection
      oledbCn.CommandText = SetParamValues(oledbCn.CommandText, SQLParams)
      oledbCn.Refresh
    End If
  Next
End Sub

Function SetParamValues(SQL As String, ByRef Params As Dictionary) As String
  Dim re As New RegExp, Matches 'Requred Reference "Microsoft VBScript Regular Expressions 5.5"
  
  Dim paramName As Variant, paramValue As String
     
  SetParamValues = SQL
  
  re.IgnoreCase = True
  re.MultiLine = True
  
  For Each paramName In Params.Keys()
    re.Pattern = "(set\s+\@" + paramName + "\s*=\s*)(\'[^\']*\')"
    
    paramValue = Params(paramName)
     
    SetParamValues = re.Replace(SetParamValues, "$1" + paramValue)
  Next 'For Each paramName In Params.Keys()
End Function
于 2022-02-02T10:14:48.310 に答える
-1

はい - 解決策は、ワークブックを XML ファイル (例: 'XML Spreadsheet 2003') に保存し、このファイルをメモ帳でテキストとして編集することです。メモ帳の「検索」機能を使用してクエリ テキストを検索し、データを「?」に変更します。

Excelで保存して開き、データを更新してみてください.Excelはパラメータについて監視します.

于 2011-07-26T12:01:06.743 に答える