在 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 Recordset
和Set 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 2013 vba - 清除表单的控件,绕过计算的控件