我正在尝试创建链接到单元格值的查询表。
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
答案 0 :(得分:0)
使参数正常工作的技巧是使用ODBC连接而不是OLEDB连接。换句话说,只需将示例中的连接字符串替换为:
sConn = "ODBC;Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & ThisWorkbook.FullName & ";"
和参数添加代码就像魔术一样工作。
编辑:仍然不是很完美...似乎容易出现长路径问题,当然还有文件移动时的问题。不知道我会朝那个方向走。