Ms access Access 2007 VBA-报告过滤器不使用';在重新加载报告之前,不能工作

Ms access Access 2007 VBA-报告过滤器不使用';在重新加载报告之前,不能工作,ms-access,filter,vba,ms-access-2007,Ms Access,Filter,Vba,Ms Access 2007,我正在使用VBA动态加载报表的内容,根据从我构建的控制面板窗体中选择的报表,报表的查询可能会被过滤 在我的Report_Open函数的开头,我有以下内容: Private Sub Report_Open(Cancel As Integer) Me.Filter = "VIP=True" Me.FilterOnLoad = True 现在,当我开始这个项目的时候,这是有效的-我已经注释掉了这些行,当取消注释它们时,发现这不再正常工作了。在加载报表时,我必须重新加载报表,以使筛选器

我正在使用VBA动态加载报表的内容,根据从我构建的控制面板窗体中选择的报表,报表的查询可能会被过滤

在我的Report_Open函数的开头,我有以下内容:

Private Sub Report_Open(Cancel As Integer)
    Me.Filter = "VIP=True"
    Me.FilterOnLoad = True
现在,当我开始这个项目的时候,这是有效的-我已经注释掉了这些行,当取消注释它们时,发现这不再正常工作了。在加载报表时,我必须重新加载报表,以使筛选器正常工作,而不是应用筛选器—或者切换到打印预览并切换回报表视图,或者切换到设计视图,然后再切换回报表视图(在设计视图中,所选筛选器确实显示在属性窗格中)

我使用允许用户查看、导出为PDF或打印(在打印预览中打开)的命令按钮加载报告。这些命令都不会导致报告在应用过滤器的情况下打开-必须重新加载

我用于加载报告的命令如下所示,以供参考:

If (Action = "View") Then
    DoCmd.OpenReport "Test", acViewReport
ElseIf (Action = "PDF") Then
    DoCmd.OutputTo acOutputReport, "Test", acFormatPDF
ElseIf (Action = "Print") Then
    DoCmd.OpenReport "Test", acViewPreview
End If

好的,我不知道为什么
Me.Filter
Me.FilterOnLoad
不起作用,因为从我在MSDN和其他地方看到的一切来看,它应该起作用。话虽如此,我发现我可以使用
DoCmd.ApplyFilter

'Check if VIP - add filter if necessary
If (getGlobal(1) = True) Then
    DoCmd.ApplyFilter , "VIP = True"
End If

我仍然想知道为什么另一种方式表现得如此奇怪,如果有人有任何想法…

正如@David-W-Fenton所建议的,在OpenReport中使用where条件,而不是设置过滤器表达式。WhereCondition可以是用于筛选器表达式的相同字符串

另外,如果给OpenReport一个空字符串作为WhereCondition,其效果与no WhereCondition相同,因此无论
getGlobal(1)
是否返回True,此(未测试)代码都应该有效

Dim strWhereCondition As String
Dim strReport As String
strReport = "Test"
If (getGlobal(1) = True) Then
    strWhereCondition = "VIP = True"
End If

Select Case Action
Case "View"
    DoCmd.OpenReport strReport, acViewReport, , strWhereCondition
Case "PDF"
    DoCmd.OpenReport strReport, acViewReport, , strWhereCondition
    DoCmd.OutputTo acOutputReport, , acFormatPDF
Case "Print"
    DoCmd.OpenReport strReport, acViewPreview, , strWhereCondition
End Select

还请注意,DoCmd.OutputTo在没有ObjectName参数的情况下使用活动对象。。。这将是本例中的“测试”报告。

或者,由于您是在OnOpen事件中执行此操作,因此可以使用完整的WHERE子句设置Recordsource。我决不会像你所描述的那样胡乱使用过滤器——如果我在OnOpen事件中编写代码,我将使用Recordsource而不是过滤器属性。