1

以下は、Excel でパラメーター化されたクエリを作成するために必要なコードです。MS Excel 2013 を実行しています。SQL Server データベースに接続しようとしています。ここから、列の値を入力する単一のセルを使用してこのデータベースにクエリを実行し、その列のすべての行をデータベースにクエリします (WHERE 句)。このセルは動的であると想定されているため、その値を変更すると、クエリの結果が変更されます。ここに私が持っているコードがあります

Sub ParameterQueryExample()
'---creates a ListObject-QueryTable on Sheet1 that uses the value in 
'        Cell Z1 as the ProductID Parameter for an SQL Query
'        Once created, the query will refresh upon changes to Z1. 

Dim sSQL As String
Dim qt As QueryTable
Dim rDest As Range


'--build connection string-must use ODBC to allow parameters
Const sConnect = "ODBC;" & _
    "Driver={SQL Server Native Client 10.0};" & _
    "Server=.\SQLEXPRESS;" & _
    "Database=TSQL2012;" & _
    "Trusted_Connection=yes"


'--build SQL statement
sSQL = "SELECT *" & _
        " FROM TSQL2012.Production.Products Products" & _
        " WHERE Products.productid = ?;"


'--create ListObject and get QueryTable
Set rDest = Sheets("Sheet1").Range("A1")
rDest.CurrentRegion.Clear  'optional- delete existing table


Set qt = rDest.Parent.ListObjects.Add(SourceType:=xlSrcExternal, _
    Source:=Array(sConnect), Destination:=rDest).QueryTable


'--add Parameter to QueryTable-use Cell Z1 as parameter
With qt.Parameters.Add("ProductID", xlParamTypeVarChar)
    .SetParam xlRange, Sheets("Sheet1").Range("Z1")
    .RefreshOnChange = True
End With


'--populate QueryTable
With qt
    .CommandText = sSQL
    .CommandType = xlCmdSql
    .AdjustColumnWidth = True  'add any other table properties here
    .BackgroundQuery = False
    .Refresh
End With


Set qt = Nothing
Set rDest = Nothing
End Sub

で:

    With qt
    .CommandText = sSQL
    .CommandType = xlCmdSql
    .AdjustColumnWidth = True  'add any other table properties here
    .BackgroundQuery = False
    .Refresh
    End With

.Refresh セクションでエラーが発生し続けます。誰でも助けることができますか?ここに私のDBデータベースリンクへのリンクがあります

SQL Server Express を実行しており、サーバーは .\SQLEXPRESS です。誰かが助けることができれば、それは大歓迎です。

4

1 に答える 1

1

AdventureWorksDW2012 に対して動的にパラメーター化されたクエリを生成する VBA コード。

たとえばUSD、パラメータをセル A1 に入力します。

Sub DynamicParameterizedQuery()
    Dim lo As ListObject
    Set lo = ActiveSheet.ListObjects.Add(xlSrcExternal, "ODBC;Driver={SQL Server Native Client 11.0};Server=.;Database=AdventureWorksDW2012;Trusted_Connection=yes", True, xlYes, Range("A2"))

    lo.QueryTable.CommandType = xlCmdSql
    lo.QueryTable.CommandText = "SELECT * FROM DimCurrency WHERE CurrencyAlternateKey = ?"

    With lo.QueryTable.Parameters.Add("Currency code", xlParamTypeVarChar)
        .SetParam xlRange, ActiveSheet.Range("A1")
        .RefreshOnChange = True
    End With

    lo.QueryTable.Refresh BackgroundQuery:=False
End Sub

AdventureWorksDW2012 がインストールされていない場合は、次のコードを使用して、数行のみを含む DimCurrency テーブルのミニ バージョンでデータベースを作成できます...

USE master
GO

CREATE DATABASE AdventureWorksDW2012
GO

USE AdventureWorksDW2012

CREATE TABLE DimCurrency(
    CurrencyKey int NOT NULL,
    CurrencyAlternateKey nchar(3) NOT NULL,
    CurrencyName nvarchar(50) NOT NULL
)

INSERT INTO DimCurrency
VALUES (36, 'EUR', 'EURO'), (100, 'USD', 'US Dollar'), (91, 'SEK', 'Swedish Krona')

スプレッドシート パラメータに基づいて動的クエリを作成する場合は、ODBC ドライバが唯一のオプションと思われるため、必ず ODBC ドライバを使用してください。OLE DB ドライバーを使用することはできないと思います。しかし、いつか誰かが私が間違っていることを証明してくれることを願っています.

結果がありません?USD(EURまたは) をセル A1に入れることを忘れないでくださいSEK。クエリは自動的に更新されます。

于 2015-07-21T16:59:59.270 に答える