运行 禁用 Report 的 FilterOn 属性 时出现时间错误 -2147417848 (80010108)
Run time error -2147417848 (80010108) when disabling FilterOn property of Report
我正在创建包含在子表单容器中的 myReport 的过滤选项。
我使用了这个问题中描述的解决方案:
来自 HansUp。使用描述的代码过滤器成功创建、存储和应用 apllyFilterButton 的 OnClick 事件。
然后我创建了 disableFilterButton 并在 OnClick 事件中我将建议的代码放入前面提到的线程中。测试时,出现此错误:
"运行-时间错误'-2147417848 (80010108)':
对象“_Report_myReport”的方法 'FilterOn' 失败“
如果我 enable/disable 使用 Access Ribbon(切换过滤器按钮 on/off)过滤,一切正常,没有错误。所以我的错误可能很简单,即使在语法上也是如此,但我找不到来源。
代码:
Private Sub disableFilterButton_Click()
Forms![myForm]![myReport].Report.FilterOn = False
Forms![myForm]![myReport].Report.Filter = ""
Forms![myForm]![myReport].Requery
End Sub
崩溃后,使用"Debug"选项,上面的第一行代码被高亮显示。我在这里和网络周围的研究建议添加 "blank filter" 行,以及注册表问题或代码中的现有循环,这会导致崩溃。但是由于使用功能区按钮一切正常,我认为它很简单,我错过了。我还是初学者。
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
非常感谢您的帮助!托马斯
托马斯,
由于您示例中的所有代码都在 myForm class 中,让我解释一些 Access 编码基础知识。
[Forms]![Form]![Control]
语法真正适用于查询、表单和报告事件和属性以及宏。虽然在 VBA 中有效,但 没有 此语法的编译时验证!因此,VBA 行如:
varValue = [Forms]![Blah]![BlahBlah] ' doesn't exist
编译正常,但在运行时失败。
具有 class 模块的表单中的控件成为表单 class 的 public 成员。以您的表单 myForm 为例:您可以使用以下代码在代码中引用其控件:
varValue = Form_myForm.filterOptionOne.Value
Form_myForm
是表格的名称 class。如果 filterOptionOne
被重命名或删除,这行代码 将 抛出错误。
在任何VBAclass中,Me
指的是那个class的public接口。 "Public interface" 仅表示 class 中定义的所有 public 函数、子例程和属性。所以,如果你在 myForm 中使用上面的代码行,最好的样式应该是这样的:
varValue = Me.filterOptionOne.Value
Me
在此上下文中约束 filterOptionOne
在 class 中实际定义,提供进一步的编译时检查。
所以,鉴于这三点,我会像这样重构你的代码:
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 表单代码方面有一个更坚实的基础。
我正在创建包含在子表单容器中的 myReport 的过滤选项。
我使用了这个问题中描述的解决方案:
来自 HansUp。使用描述的代码过滤器成功创建、存储和应用 apllyFilterButton 的 OnClick 事件。
然后我创建了 disableFilterButton 并在 OnClick 事件中我将建议的代码放入前面提到的线程中。测试时,出现此错误:
"运行-时间错误'-2147417848 (80010108)':
对象“_Report_myReport”的方法 'FilterOn' 失败“
如果我 enable/disable 使用 Access Ribbon(切换过滤器按钮 on/off)过滤,一切正常,没有错误。所以我的错误可能很简单,即使在语法上也是如此,但我找不到来源。
代码:
Private Sub disableFilterButton_Click()
Forms![myForm]![myReport].Report.FilterOn = False
Forms![myForm]![myReport].Report.Filter = ""
Forms![myForm]![myReport].Requery
End Sub
崩溃后,使用"Debug"选项,上面的第一行代码被高亮显示。我在这里和网络周围的研究建议添加 "blank filter" 行,以及注册表问题或代码中的现有循环,这会导致崩溃。但是由于使用功能区按钮一切正常,我认为它很简单,我错过了。我还是初学者。
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
非常感谢您的帮助!托马斯
托马斯,
由于您示例中的所有代码都在 myForm class 中,让我解释一些 Access 编码基础知识。
[Forms]![Form]![Control]
语法真正适用于查询、表单和报告事件和属性以及宏。虽然在 VBA 中有效,但 没有 此语法的编译时验证!因此,VBA 行如:varValue = [Forms]![Blah]![BlahBlah] ' doesn't exist
编译正常,但在运行时失败。
具有 class 模块的表单中的控件成为表单 class 的 public 成员。以您的表单 myForm 为例:您可以使用以下代码在代码中引用其控件:
varValue = Form_myForm.filterOptionOne.Value
Form_myForm
是表格的名称 class。如果filterOptionOne
被重命名或删除,这行代码 将 抛出错误。在任何VBAclass中,
Me
指的是那个class的public接口。 "Public interface" 仅表示 class 中定义的所有 public 函数、子例程和属性。所以,如果你在 myForm 中使用上面的代码行,最好的样式应该是这样的:varValue = Me.filterOptionOne.Value
Me
在此上下文中约束filterOptionOne
在 class 中实际定义,提供进一步的编译时检查。
所以,鉴于这三点,我会像这样重构你的代码:
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 表单代码方面有一个更坚实的基础。