参数化查询+ DoCmd.TransferSpreadsheet acExport

时间:2017-04-21 22:13:50

标签: sql ms-access

我需要将大量复杂数据导出到Excel电子表格中。为此,我创建了几个大型查询。现在我想根据日期范围和其他一些信息过滤这些查询,但我不确定该怎么做。

  

DoCmd.TransferSpreadsheet acExport ,,“Overview_Agents_Query”,xlsxPath,True,“Agents”

这就是我目前将查询导出到Excel电子表格的方式。我没有意识到在形成这些查询时我无法传递Recordset,只能传递Table或Query的字符串名称。我的第二次尝试看起来像:

StrAgents = "SELECT * FROM Overview_Agents_Query" 

# Build a WHERE clause here

Set qdfAgents = CurrentDb.CreateQueryDef("Temp_Agents_Query", StrAgents)

DoCmd.TransferSpreadsheet acExport, , qdfAgents.Name, xlsxPath, True, "Agents"

CurrentDb.QueryDefs.Delete qdfAgents.Name

这适用于两个简单查询,但由于使用嵌套查询,连接和联合,对于一些更复杂的查询是不切实际的。我会真的喜欢避免将大块SQL报告字符串直接硬编码到我的VBA代码中,尽管如果没有解决方案,我认为这比没有好。

关于如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:1)

您可以修改查询以允许插入where子句:

' SQL of query:
' Select * From SomeTable Where {0}

Dim SQL As String
Dim Filter As String

Filter = "(SomeField = '" & YourSearchString & "')"

Set qd = CurrentDb.QueryDefs("YourQuery")
SQL = qd.SQL
qd.SQL = Replace(SQL, "{0}", Filter)
qd.Close

DoCmd.TransferSpreadsheet acExport, , qd.Name, xlsxPath, True, "Agents"

' Restore original SQL.
Set qd = CurrentDb.QueryDefs("YourQuery")
qd.SQL = SQL
qd.Close

答案 1 :(得分:0)

选项:

  1. 动态参数化查询 - 参数可以是表单上的输入弹出窗口或引用控件(我从不使用动态参数化查询)

  2. 构建报告 - 通过引用表单上的控件构建包含VBA的过滤字符串,并在打开时应用过滤条件进行报告,然后使用DoCmd.OutputTo导出报告