在 Access 2013 VBA 中从 Subform 动态设置 SourceObject 和 RecordSource

Posted

技术标签:

【中文标题】在 Access 2013 VBA 中从 Subform 动态设置 SourceObject 和 RecordSource【英文标题】:Dynamically set the SourceObject and RecordSource from Subform in Access 2013 VBA 【发布时间】:2014-06-17 21:26:06 【问题描述】:

我有以下函数来返回结果数据集:

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

在 ParentForm 中,我有一个命令按钮,其 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 的子表单。

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

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

Me.ChildSubForm.Form.RecordSource = Dynamic_Connection_SQL(strSQL)

更新

我已将代码更新为:

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

还有

Private Sub Command0_Click()

Dim strSQL As String
Dim intCounter As Integer
Dim rstRet As DAO.Recordset

strSQL = "SELECT ID, ClientID, SDP_CategorySK, EmployeeID, RollupToEmployeeID, Allocation " & _
         "FROM ShiftCurrentStaffing " & _
         "ORDER BY EmployeeID;"

Set rstRet = Dynamic_Connection_SQL(strSQL)

With rstRet
  Do While Not rstRet.EOF
    Debug.Print ![ID] & " " & ![EmployeeID] & ", (" & ![EmployeeName] & ")"
    MsgBox ![ID] & " "
   .MoveNext
  Loop
End With
Me.ChildSubForm.Form.Recordset = rstRet.OpenRecordset
Me.Requery
rstRet.Close
Set rstRet = Nothing

End Sub

消息框正确显示了 ID..所以上面的代码正在运行..现在问题是我仍然收到错误 运行时错误 2467。您输入的表达式指的是关闭的对象或此行不存在

Me.ChildSubForm.Form.Recordset = rstRet.OpenRecordset

【问题讨论】:

在该行设置断点并尝试检查 ChildSubForm 和 ChildSubForm.Form 的值。还有你为什么叫ooenrecordse? = rstRet 不应该足够吗? 我同意康拉德的观点。你不能把有问题的行改成Me.ChildSubForm.Form.Recordset = rstRet吗?您不必重新打开它即可将其绑定到表单。 【参考方案1】:

你做的这件事和我以前有很大不同,所以我可能会离开这里,但我相信问题是你的Dynamic_Connection_SQL(strSQL) 函数没有返回值,所以它不能将它分配给记录源。就目前而言,您的函数创建记录集并填充它,然后终止并清除检索到的记录,而不将其返回给您的调用命令。

【讨论】:

第一段是正确的。 OP 的函数不返回任何内容,例如它需要As RecordsetSet Dynamic_Connection_SQL = rst。第二段是错误的。表单的 RecordSource 属性将是对它的引用,因此它不会“消失” 感谢指正。我想这就是我一直这样做的方式,所以看起来它一定是必要的。我已将其从我的答案中删除。 谢谢大家的回复..我同意我需要返回一些东西..但无法正确编码..有人可以帮我吗 要从某个函数返回一些东西,语法是:functionName = returnValue 例如:Function getTvaValue() As Double getTvaValue = 20 / 100 End Function

以上是关于在 Access 2013 VBA 中从 Subform 动态设置 SourceObject 和 RecordSource的主要内容,如果未能解决你的问题,请参考以下文章

如何在MS ACCESS中从另一个查询中传递PARAMETERS到查询中(不用VBA)?

在 Access 中从另一个表的数据创建一个表

在vba中从查询填充数组然后将数据插入表中

Access 2013 vba - 清除表单的控件,绕过计算的控件

Access 2013 - VBA - 记录集插入获取 ID

Access 2013 VBA - 后续 SELECT 查询未找到来自 INSERT INTO 的新记录