Excel Querytable:添加范围参数

时间:2018-11-26 13:24:44

标签: excel vba

我正在尝试创建链接到单元格值的查询表。
Querytable的创建工作正常,我设法找到了如何添加参数,但现在找不到如何更改SQL语句。
当我运行下面的示例时,它不会产生任何错误,但是如果我更改D1中的值,则会收到消息“没有为一个或多个必需参数提供值”。

Sub AddParam()
    Dim qt As QueryTable
    Dim prm As Parameter
    Set qt = ActiveSheet.QueryTables("705547512")
    qt.Parameters.Delete    'reset params
    Set prm = qt.Parameters.Add("dbk")
    prm.SetParam xlRange, Sheet2.Range("D1")
    prm.RefreshOnChange = True
    qt.CommandText = "select top 10 * from [Ledger account entries$b8:l300] where Daybook = ?"
End Sub

Querytable本身从D3开始。
我也尝试使用where Daybook = dbk来运行以上命令,同样的错误。 如果删除where子句或使用常量(='somestring'),则可以刷新QT而不会出现问题。


注意:QT本身是使用以下代码创建的:

    sConn = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;;Password=;User ID=Admin;Data Source=" & _
        ThisWorkbook.FullName & ";" & _
        "Mode=Share Deny Write;Extended Properties=""Excel 12.0 Xml;HDR=YES"";"

    Set qt = ActiveCell.Worksheet.QueryTables.Add(Connection:=sConn, Destination:=ActiveCell)
    With qt
        .CommandType = xlCmdSql
        .CommandText = SQL
        .Name = Int((1000000000 - 1 + 1) * Rnd + 1)
        .RefreshStyle = xlOverwriteCells
        .Refresh BackgroundQuery:=False
    End With

1 个答案:

答案 0 :(得分:0)

使参数正常工作的技巧是使用ODBC连接而不是OLEDB连接。换句话说,只需将示例中的连接字符串替换为:

sConn = "ODBC;Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & ThisWorkbook.FullName & ";"

和参数添加代码就像魔术一样工作。

编辑:仍然不是很完美...似乎容易出现长路径问题,当然还有文件移动时的问题。不知道我会朝那个方向走。