禁用Report的FilterOn属性时,运行时错误-2147417848(80010108)

时间:2018-06-06 08:20:15

标签: ms-access access-vba ms-access-2010

我正在创建子窗体容器中包含的 myReport 的过滤选项。 我使用过这个问题中描述的解决方案: Filtering Report

来自HansUp的

使用描述的代码过滤器成功创建,存储和应用apllyFilterButton的OnClick事件。

然后我创建disableFilterButton并在OnClick事件中我把代码提到前面提到的线程。在测试时,我收到此错误:

“运行时错误'-2147417848(80010108)':

对象'_Report_myReport'的方法'FilterOn'失败“

如果我使用Access Ribbon启用/禁用过滤器(开关过滤器按钮打开/关闭)一切正常,没有错误。所以我的错误可能很简单,即使在语法方面也是如此,但我找不到来源。

代码:

Private Sub disableFilterButton_Click()
Forms![myForm]![myReport].Report.FilterOn = False
Forms![myForm]![myReport].Report.Filter = ""
Forms![myForm]![myReport].Requery
End Sub

崩溃后,使用“Debug”选项,突出显示上面第一行代码。我在这里和网络上的研究建议添加“空白过滤器”行,以及注册表问题或代码中的现有循环,这会产生崩溃。但是,由于使用功能区按钮一切正常,我认为它很简单,我缺少。我还是个初学者。

myFilterButton中用于创建过滤器的代码未完全完成,但应该正常工作:

Private Sub applyFilterButton_Click()

Dim ctl As Control
Dim varVyber As Variant
Dim filtrVolba As String
Dim filtrUplny As String

'Criteria creation for filter SQL
 Set ctl = Forms![myForm]![filterOptionOne]
 If ctl.ItemsSelected.Count <> 0 Then
    For Each varVyber In ctl.ItemsSelected
    filtrVolba = filtrVolba & ctl.Column(0, varVyber) & """ OR (sourceQuery.sourceColumn) = """
    Next varVyber

filtrVolba = Left$(filtrVolba, Len(filtrVolba) - Len(" OR (qry_sourceQuery.sourceColumn) = "))
    Forms![myForm]![myReport].Report.Filter = "(((sourceQuery.fieldBoundToMyReport)=[Forms]![myForm]![TextBoxBoundToMyReport]) AND ((sourceQuery.filterOptionOneSourceField) = """ & filtrVolba & "))"
 Forms![myForm]![myReport].Report.FilterOn = True

Else

MsgBox "Not yet"
End If
End Sub

非常感谢帮助!托马斯

1 个答案:

答案 0 :(得分:1)

托马斯

由于您示例中的所有代码都在 myForm 类中,因此我将解释一些Access编码基础知识。

  1. [Forms]![Form]![Control]语法实际上适用于Queries,Form&amp;举报活动&amp;属性和宏。虽然在VBA中有效,但没有此语法的编译时验证!所以,像VBA这样的行:

    varValue = [Forms]![Blah]![BlahBlah]  ' doesn't exist
    

    将编译好,但在运行时失败。

  2. 带有类模块的表单中的控件将成为表单类的公共成员。使用表单 myForm :您可以使用以下代码在代码中引用其控件:

    varValue = Form_myForm.filterOptionOne.Value 
    

    Form_myForm是表单类的名称。如果重命名或删除filterOptionOne,则此行代码抛出错误。

  3. 在任何VBA类中,Me指的是该类的公共接口。 “公共接口”仅表示类中定义的所有公共函数,子例程和属性。所以,如果您在 myForm 中使用上面的代码行,那么最佳样式将如下所示:

    varValue = Me.filterOptionOne.Value 
    
    在此上下文中,

    Me约束filterOptionOne实际在类中定义,提供进一步的编译时检查。

  4. 所以,鉴于这三点,我会像这样重构你的代码:

    Private Sub disableFilterButton_Click()
         Me.myReport.Report.FilterOn = False
         Me.myReport.Report.Filter = ""
         Me.myReport.Requery
    End Sub
    

    同样:

    Private Sub applyFilterButton_Click()
    
        Dim ctl As Control
        Dim varVyber As Variant
        Dim filtrVolba As String
        Dim filtrUplny As String
    
        'Criteria creation for filter SQL
        Set ctl = Me.filterOptionOne
        If ctl.ItemsSelected.Count <> 0 Then
            For Each varVyber In ctl.ItemsSelected
                filtrVolba = filtrVolba & ctl.Column(0, varVyber) & """ OR (sourceQuery.sourceColumn) = """
            Next varVyber
    
            filtrVolba = Left$(filtrVolba, Len(filtrVolba) - Len(" OR (qry_sourceQuery.sourceColumn) = "))
            Me.myReport.Report.Filter = "(((sourceQuery.fieldBoundToMyReport)=" & Me.TextBoxBoundToMyReport.Value & ") AND ((sourceQuery.filterOptionOneSourceField) = """ & filtrVolba & "))"
            Me.myReport.Report.FilterOn = True
        Else
            MsgBox "Not yet"
        End If
    
    End Sub
    

    这可能无法解决您的所有问题,但这应该让您在理解如何编写Access表单方面处于更加稳固的基础。