我正在尝试使用 ADODB Excel 中的子查询从其他表中选择数据。这是我的代码:
Sub CopyData()
Dim cmd As String
If OpenConnection() = True Then 'The connection function already created in my module
cmd = "SELECT * FROM (SELECT [SheetName] FROM `Breakdown structure library$` WHERE [Name (Name *)]='WBS');"
Rcdset.Open cmd, Con, adOpenStatic, adLockBatchOptimistic
With shTemp
.Cells.Delete
.Range("A1").CopyFromRecordset Rcdset
End With
If Con.State Then Con.Close
End If
End Sub
结果是错误的:
运行时错误“-2147217904”(80040e10):没有为一个或多个参数给出值
我知道发生了什么事。您必须在工作表名称末尾添加“$”才能在 ADODB Excel 中执行查询,例如:
SELECT * FROM `MyTable` '(not working in ADODB Excel, but working in Access database)
SELECT * FROM `MyTable$` '(working in ADODB Excel)
我不知道如何让sql子查询自动识别表,我们要在其中选择数据。
不能使用子select来确定select的表名,使用2个查询。
Dim sTableName As String, SQL As String, rcdset As New ADODB.Recordset
If OpenConnection() = True Then 'The connection function already created in my module
SQL = " SELECT [SheetName] " & _
" FROM `Breakdown structure library$` " & _
" WHERE [Name (Name *)]='WBS';"
sTableName = con.Execute(SQL)(0)
SQL = " SELECT * FROM [" & sTableName & "$]"
rcdset.Open SQL, con, adOpenStatic, adLockBatchOptimistic
With shTemp
.Cells.Delete
.Range("A1").CopyFromRecordset rcdset
End With
If con.State Then con.Close
End If
我在从包含一些子查询的 VBA 执行查询时遇到问题。
我通过将查询(带有子查询)放入存储过程中解决了这个问题。
我还必须在连接字符串中向用户授予对该存储过程的仅执行权限。这是因为我用于连接字符串的 UID 具有数据库的只读权限,因为我与其他用户共享我创建的这些 XLSM 文件,而我不希望这些用户能够更新、删除、控制等。数据库中的任何内容。