在Access 2013 VBA中从子窗体动态设置SourceObject和RecordSource

在Access 2013 VBA中从子窗体动态设置SourceObject和RecordSource,vba,ms-access,Vba,Ms Access,我使用以下函数返回结果数据集: Function Dynamic_Connection_SQL(ByVal SQL As String) Dim qdf As DAO.QueryDef, rst As DAO.Recordset Set qdf = CurrentDb.CreateQueryDef("") qdf.Connect = "ODBC;Driver=SQL Server;Server=XXXX;DATABASE=XX;Trusted_Connection=Yes;" qdf.SQL

我使用以下函数返回结果数据集:

Function Dynamic_Connection_SQL(ByVal SQL As String)

Dim qdf As DAO.QueryDef, rst As DAO.Recordset
Set qdf = CurrentDb.CreateQueryDef("")
qdf.Connect = "ODBC;Driver=SQL Server;Server=XXXX;DATABASE=XX;Trusted_Connection=Yes;"
qdf.SQL = SQL
qdf.ReturnsRecords = True
Set rst = qdf.OpenRecordset
rst.Close
Set rst = Nothing
Set qdf = Nothing

End Function
在父窗体中,我有一个命令按钮,其onClick事件具有以下代码:

Private Sub Command0_Click()

Dim strSQL As String
strSQL = "SELECT ID, EmployeeID, EmployeeName " & _
         "FROM XYZ " & _
         "ORDER BY EmployeeName;"
Dynamic_Connection_SQL (strSQL)
Me.ChildSubForm.Form.RecordSource = Dynamic_Connection_SQL(strSQL)

End Sub
我在按钮下有一个子窗体名为ChildForm

我的目标是“当用户单击命令按钮时,执行查询并在子窗体中显示结果数据集”

我被困在这一点上,不知道如何进一步进行。如果我执行此代码并单击按钮,我将得到一个错误运行时错误2467。您输入的表达式引用的对象已关闭或在此行中不存在

Me.ChildSubForm.Form.RecordSource = Dynamic_Connection_SQL(strSQL)
Me.ChildSubForm.Form.Recordset = rstRet.OpenRecordset

更新

我已将代码更新为:

Function Dynamic_Connection_SQL(ByVal SQL As String) As DAO.Recordset

Dim qdf As DAO.QueryDef, rst As DAO.Recordset
Set qdf = CurrentDb.CreateQueryDef("")
qdf.Connect = "ODBC;Driver=SQL    Server;Server=xxxx;DATABASE=xx;Trusted_Connection=Yes;"
qdf.SQL = SQL
qdf.ReturnsRecords = True
Set rst = qdf.OpenRecordset
Set Dynamic_Connection_SQL = rst

End Function

messagebox正确地显示了ID。因此,上面的代码正在工作。现在的问题是,我仍然得到一个错误运行时错误2467。您输入的表达式引用的对象已关闭或在此行中不存在

Me.ChildSubForm.Form.RecordSource = Dynamic_Connection_SQL(strSQL)
Me.ChildSubForm.Form.Recordset = rstRet.OpenRecordset

您所做的与我以前所做的有很大不同,因此我可能离这里很远,但我相信问题在于您的
Dynamic\u Connection\u SQL(strSQL)
函数没有返回值,因此它无法将该值分配给recordsource。现在,函数创建并填充记录集,然后终止并清除检索到的记录,而不将其返回给调用命令

第一段是正确的。OP函数不返回任何内容,例如,它需要
作为记录集
设置动态连接\u SQL=rst
。第二段是错误的。表单的RecordSource属性将是对它的引用,因此它不会“消失”,感谢您的更正。我想这正是我一贯的做法,所以这似乎是必要的。我已经从我的答案中删除了它。谢谢你们的回复。伙计们。我同意我需要返回一些东西。但是无法正确地编码。有人能帮我吗从某个函数返回一些东西语法是:functionName=returnValue例如:
function getTvaValue()作为Double getTvaValue=20/100 End函数
在行上设置一个断点,并尝试检查值ChildSubForm和ChildSubForm.Form。还有你为什么打电话给ooenrecordse?这还不够吗?我同意康拉德的观点。您不能将有问题的行更改为
Me.ChildSubForm.Form.Recordset=rstRet
?您不必重新打开它来将其绑定到表单。