Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 报告上的DoCmd.OutputTo未卸载_Ms Access_Ms Access 2007_Vba - Fatal编程技术网

Ms access 报告上的DoCmd.OutputTo未卸载

Ms access 报告上的DoCmd.OutputTo未卸载,ms-access,ms-access-2007,vba,Ms Access,Ms Access 2007,Vba,在Access 2007中,我设置了一个表单,允许预览和导出项目报告的选项 当处理模式属性设置为true的报告时,DoCmd.OutputTo的行为似乎很奇怪。对于我正在处理的所有报告,在Open事件中,Modal当前设置为True 如果我这样做 然后,焦点和控制被正常地返回到执行表单 如果我直接导出并使用 然后,报告被正确导出,但控件永远不会返回到执行表单。它完全失效了。如果我在打开报表时使用Modal=False,那么同样的代码也可以正常工作。我对报告的事件挂钩做了一些实验,试图找出区别,在

在Access 2007中,我设置了一个表单,允许预览和导出项目报告的选项

当处理模式属性设置为true的报告时,DoCmd.OutputTo的行为似乎很奇怪。对于我正在处理的所有报告,在Open事件中,Modal当前设置为True

如果我这样做

然后,焦点和控制被正常地返回到执行表单

如果我直接导出并使用

然后,报告被正确导出,但控件永远不会返回到执行表单。它完全失效了。如果我在打开报表时使用Modal=False,那么同样的代码也可以正常工作。我对报告的事件挂钩做了一些实验,试图找出区别,在调用OutputTo之后,OnUnload永远不会被命中

我知道我可以解决这个问题,只要在需要时将报表设置为模态,但是从报表代码内部而不是模块打开它肯定是最容易做到的,我真的认为我不应该有这个问题。我也没有问题从预览模式导出报告,而不是直接从VBA导出,但显然客户确实

因此,实际问题是:

OutputTo是否有充分的理由不触发卸载事件?如果这是正常的行为,那么很好,但我至少想了解原因。 是否有任何方法可以导出模式报告并重新控制其他窗口?或者,至少是一种非黑客方式来重新启用调用表单并将其作为焦点? 您的第一个代码:

  DoCmd.OpenReport szReportName, acViewPreview
  DoCmd.Close acReport, szReportName
…如果报告是模态的,则将出错。原因是,在第一行打开的报表关闭之前,无法执行第二行。因此,当您到达第二行时,就会出现一个错误,因为此时报告已不再打开

您需要做的不是在报告的属性表中设置模态,而是在DoCmd.OpenReport命令中:

  DoCmd.OpenReport szReportName, acViewPreview, , , acDialog 
acDialog开关以模式打开它,代码将暂停,直到报告关闭,然后继续

但是当您使用DoCmd.OutputTo时,它将正常运行,因为报告不是模态的

通常,在Access窗体和报表中,您根本不需要设置模态属性,因为您始终可以在运行时以模态方式打开它

我不知道您为什么认为需要在报表的OnOpen事件中设置模态属性。那里不需要任何代码,我认为这不是一个改变的好地方,而且我原本希望它不会工作,因为在窗口已经创建之后,您无法真正改变窗口模式;可能在创建可见窗口之前执行OnOpen


但从标准访问实践的角度来看,您是在倒退。我不知道为什么您拒绝在调用代码中设置窗口模式,因为这意味着您可以在任何上下文中使用报表,而不必在报表本身中使用担心问题的代码。我一直认为报告和表格应该尽可能地沉默,只知道自己,并且让调用上下文拥有所有的智能,尽管尽可能少地插入被调用表单/报表的内部内容。

我同意在报表代码中设置模式或任何属性是不可取的。老实说,我没有把它放在那里,我只是想保持以前的行为。我相信模态是用来代替acDialog的,因为我们不希望报告处于弹出模式。不管怎样,我拒绝使用acDialog,因为它的行为与Modal属性不同——它仍然允许我将焦点切换到调用窗体。我忘记了它实际上应该是相同的,因此我似乎应该寻找报告中的其他错误,导致acDialog无法以模式运行。Popup和Modal是两个完全不同的属性,使用acDialog打开表单或报表不会导致表单/报表处于弹出模式。基本上,据我所知,acDialog会导致模态和弹出属性被忽略。我只是用acDialog测试了一个从命令按钮打开的报告,模态/弹出属性设置为什么并不重要,在报表预览关闭之前,我无法将焦点设置回调用表单。请注意,无论是否使用acDialog打开带有acHidden的表单或报表,都会导致忽略该模式。在某些情况下,这可能很有用,因为当您再次使其可见时,将恢复模态。但是,如果您已经进入了调用上下文中的下一行代码,那么这并没有帮助,因此您必须适当地使用它。当我需要从使用acDialog打开的表单调用带有acDialog的表单时,我主要使用acDialog和acHidden之间的交互。除非将第一个窗体的Visible设置为False,否则它将无法工作。
  DoCmd.OpenReport szReportName, acViewPreview
  DoCmd.Close acReport, szReportName
  DoCmd.OpenReport szReportName, acViewPreview, , , acDialog