VBA根据查询运行带有参数的访问报告

Posted

技术标签:

【中文标题】VBA根据查询运行带有参数的访问报告【英文标题】:VBA run Access Report with Parameter based on query 【发布时间】:2016-07-08 13:24:10 【问题描述】:

我想使用 VBA 脚本自动化我们的一些访问报告。但是当我想用DoCmd.OpenReport 运行它们时,我遇到的问题是每个报告都有一个来自底层查询的一些参数的弹出窗口。

这是参数在查询中的样子:

PARAMETERS [Time] Text ( 255 );

我搜索了很多并尝试了:

 DoCmd.OpenReport "B_My_Report", acViewPreview, , "[Time]= 423"

但这没有用;弹出窗口仍然出现,当我什么都不输入时,查询将失败,因为 Time 参数为空。

有没有办法可以使用参数值调用报告。我阅读了很多建议以完全删除参数并在OpenReport 中使用where 条件。但我无法更改这些查询,因为它们不是由我制作和维护的。我有时只需要运行它们。所以我很想有一个不接触报告或查询的解决方案。

【问题讨论】:

【参考方案1】:

如果您的 Access 版本 >= 2010,请考虑使用 DoCmd.SetParameter Method。

此查询是我的报告的记录来源

PARAMETERS which_id Long;
SELECT rmy.id, rmy.reportDate, rmy.gainOrLoss
FROM record_matYields AS rmy
WHERE rmy.id=[which_id] OR [which_id] Is Null;

然后我可以为参数分配一个值并打开只显示匹配记录的报告(id 是主键):

DoCmd.SetParameter "which_id", 4
DoCmd.OpenReport "rptFoo",acViewReport

或者,由于查询的WHERE 子句中的OR [which_id] Is Null 条件,如果我希望包含所有记录而不管它们的id 值如何,我可以在打开报告之前将Null 分配给参数:

DoCmd.SetParameter "which_id", Null

【讨论】:

非常酷,我不知道这个。 (我猜是老狗和新把戏) 在我注意到SetParameter 之前,我已经使用Access 2010 几年了。它仅在少数情况下有用,但这是其中之一。 :-) 好建议!我从来不知道那个命令。对未来的观众来说还有一个想法:我需要将报告输出到使用带参数的查询的 PDF 中。如果不先打开文件,我无法直接输出文件。因此,我为每个参数调用了DoCmd.SetParameter,然后调用DoCmd.OpenReport "reportName", acViewPreview, , , acHidden 以在隐藏时打开报表,然后DoCmd.OutputTo acOutputReport, "reportName", acFormatPDF, filePath 将其输出为PDF。【参考方案2】:

你不能。如果要在 VBA 中打开查询,则可以提供参数。但由于报表是唯一调用查询的人,因此查询将要求提供其参数。

如果您无法更改查询,您将不得不忍受它。

【讨论】:

【参考方案3】:

您可以使用语法 Forms![form name]![control name] 从将打开此报告的表单中引用参数值,因此需要更改查询,例如 Select * from [table name] where time_id= Forms![form name]![control name] 这将确保查询从表单的控件中获取参数,并且不会提示参数。 但它只有在此表单保持打开/加载状态时打开该查询才有效...否则它将再次提示类似参数。

Access 2010 中的 Docmd.set 参数似乎是一个很好的建议,它可以保持灵活性和良好的编程。

【讨论】:

以上是关于VBA根据查询运行带有参数的访问报告的主要内容,如果未能解决你的问题,请参考以下文章

使用生成的 RecordSet 中的数据打开报表

访问:使用从另一个查询中选择的 DAO.recordset 运行查询

对报表运行多个查询

使用 vba 在访问查询中传递参数值

如何过滤 3 个文本框,然后在 MS Access VBA 中根据它们运行报告

带有子查询的 SQL 查询上的 MS Access VBA 运行时错误 3075