Access中DoCmd调用动态SQL查询报错:找不到对象SKbyYrByMo
解决Access VBA中
DoCmd.TransferSpreadsheet找不到动态SQL对象的问题 问题场景
你编写的VBA代码通过动态SQL生成了透视查询,但直接把字符串变量名SKbyYrByMo传给TransferSpreadsheet时,出现报错:
'Microsoft数据库引擎找不到对象'SKbyYrByMo'。
原代码如下:
Dim SKbyYrByMo As String SKbyYrByMo = "TRANSFORM Sum([1ACTMasterQuery].Extension) AS SumOfExtension" & _ " SELECT [1ACTMasterQuery].Year, [1ACTMasterQuery].Sku, Sum([1ACTMasterQuery].Extension) AS [Total Of Extension]" & _ " FROM 1ACTMasterQuery" & _ " GROUP BY [1ACTMasterQuery].Year, [1ACTMasterQuery].Sku" & _ " PIVOT [1ACTMasterQuery].MonthNo" DoCmd.TransferSpreadsheet _ acExport, _ acSpreadsheetTypeExcel12Xml, _ "SKbyYrByMo", _ "C:\Users\John\Desktop\RSExcel.xlsx", _ True
问题原因
DoCmd.TransferSpreadsheet的第三个参数要求传入的是Access数据库中已保存的查询名称,而你这里传入的"SKbyYrByMo"只是一个存储SQL语句的字符串变量名,并不是数据库里实际存在的查询对象,所以引擎找不到它。
解决方案:先创建临时查询再导出
最直接的办法是把动态生成的SQL语句保存为一个临时查询,再用这个查询名执行导出操作,完成后还可以删除临时查询保持数据库整洁。修改后的代码如下:
Dim SKbyYrByMoSQL As String Dim tempQuery As QueryDef ' 1. 构建动态SQL语句(变量名改为更清晰的SKbyYrByMoSQL) SKbyYrByMoSQL = "TRANSFORM Sum([1ACTMasterQuery].Extension) AS SumOfExtension" & _ " SELECT [1ACTMasterQuery].Year, [1ACTMasterQuery].Sku, Sum([1ACTMasterQuery].Extension) AS [Total Of Extension]" & _ " FROM 1ACTMasterQuery" & _ " GROUP BY [1ACTMasterQuery].Year, [1ACTMasterQuery].Sku" & _ " PIVOT [1ACTMasterQuery].MonthNo" ' 2. 先清理可能存在的同名临时查询(避免重复创建报错) On Error Resume Next CurrentDb.QueryDefs.Delete "Temp_SKbyYrByMo" On Error GoTo 0 ' 3. 创建临时查询对象 Set tempQuery = CurrentDb.CreateQueryDef("Temp_SKbyYrByMo", SKbyYrByMoSQL) ' 4. 导出临时查询到Excel DoCmd.TransferSpreadsheet _ acExport, _ acSpreadsheetTypeExcel12Xml, _ "Temp_SKbyYrByMo", _ "C:\Users\John\Desktop\RSExcel.xlsx", _ True ' 5. 可选:删除临时查询,清理数据库 CurrentDb.QueryDefs.Delete "Temp_SKbyYrByMo" Set tempQuery = Nothing
关键说明
- 临时查询名称加了
Temp_前缀,避免和你已有的查询重名; - 用
On Error Resume Next跳过删除不存在的查询时的报错,保证代码流畅运行; - 导出完成后删除临时查询,不会在数据库里留下无用对象。
如果你不想创建临时查询,也可以通过Excel对象模型直接把Recordset写入Excel,但这种方法代码量更大,不如临时查询方案简洁高效。
内容的提问来源于stack exchange,提问作者jpl458
相关产品推荐
相关产品推荐

