【问题标题】:Parameterized queries + DoCmd.TransferSpreadsheet acExport参数化查询 + DoCmd.TransferSpreadsheet acExport
【发布时间】:2017-04-21 22:13:49
【问题描述】:

我需要将大量复杂数据导出到 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 代码中,尽管我认为如果没有解决方案存在总比没有好。

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

【问题讨论】:

  • 研究使用TempVars 或公共函数将参数传递给查询。

标签: sql ms-access


【解决方案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

【讨论】:

  • 这不是我最喜欢的解决方案,但它是我最终选择的解决方案。我不得不重新进行几个查询,因为它们叠加在子查询之上,但至少可以完成工作。
  • AFAIK 你可以设置dq.Parameters() 而不是编辑查询。
  • @ivan_pozdeev:如果 querydef 对象是打开的,那就可以了;但不是DoCmd.TransferSpreadsheet 导出它(按其字面名称)。
【解决方案2】:

选项:

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

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

【讨论】:

    猜你喜欢
    • 2017-08-31
    • 2012-08-16
    • 2021-09-29
    • 2016-08-03
    • 2012-06-09
    相关资源
    最近更新 更多