1

我一直在寻找一段时间,但我在这里看不到问题:

Option Compare Database
Option Explicit

Private Sub cmd_Refresh_Click()

Dim sSQL_Select                     As String
Dim Qdb                             As Database
Dim Qry                             As QueryDef    

sSQL_Select = "SELECT * FROM T_TIME_SCHEDULE"

Set Qdb = CurrentDb
Set Qry = Qdb.CreateQueryDef("QTS", sSQL_Select)
DoCmd.OpenQuery "QTS", acViewNormal
Me.F_Child_Result.Form.RecordSource = "QTS"
Me.F_Child_Result.Requery

Qdb.QueryDefs.Delete ("QTS")
Set Qdb = Nothing

End Sub

这一行:

Me.F_Child_Result.Form.RecordSource = "QTS"

导致以下错误:
运行时错误“2467”:您输入的表达式引用了已关闭或不存在的对象。
应该正确构造语法,并且我仔细检查了子表单的名称。
Desipte,错误仍然存​​在。

4

1 回答 1

3

不要将记录源设置为查询,只设置 SQL 字符串。

sSQL_Select = "SELECT * FROM T_TIME_SCHEDULE"

''Set Qdb = CurrentDb
''Set Qry = Qdb.CreateQueryDef("QTS", sSQL_Select)
''DoCmd.OpenQuery "QTS", acViewNormal
Me.F_Child_Result.Form.RecordSource = sSQL
''Me.F_Child_Result.Requery

不需要重新查询,当记录源改变时会重新查询表单。

请注意,即使您可以将记录源设置为查询(您不能),它也不会被引用。

来自聊天

这个问题似乎有两条混合线。所需要的是一种Source Object将子窗体控件设置为查询的方法,而不是Record Source子窗体控件包含的窗体的方法。

源对象可以这样设置:

Me.F_Child_Result.SourceObject="Query." & sQueryName

如果 Source Object 已经设置为只用于此表单的已保存查询的名称,则无需重新设置,只需修改查询的 sql 即可:

Set qdf = CurrentDB.QueryDefs("JunkQuery")
qdf.SQL = sSQL
于 2012-08-07T10:22:02.160 回答