vba - 从报告中打开表格
问题描述
我在模块中的 2 个不同的 VBA 函数中有以下代码行,它们都有相同的目的,即打开特定记录的表单;
stLinkCriteria = "[ID]=" & Reports![Rpt_Manufacture].[ID]
DoCmd.OpenForm stDocName, , , stLinkCriteria
和
stLinkCriteria = "[ID]=" & Forms![frmManufactureList]![frm_Products].[ID]
DoCmd.OpenForm stDocName, , , stLinkCriteria
我该如何更改这一点,所以我只有一个可以从报告或表单中调用的函数,它会将表单打开到特定记录。我已经试过了!报告上的版本,但我得到一个“无效使用 Me 关键字”,我猜这是因为我无法从模块中使用它。
更新 #1 根据 Thomas GI 下面的回答,使用了这个代码;
Option Compare Database
Public Function CmdOpenProductDetails(ByRef theObject As Object)
On Error GoTo Err_CmdOpenProductDetails
Dim stDocName As String
Dim stLinkCriteria As String
stDocName = "FrmProductDetails"
stLinkCriteria = "[ProductID]=" & theObject![ProductID]
DoCmd.OpenForm stDocName, , , stLinkCriteria
Exit_CmdOpenProductDetails:
Exit Function
Err_CmdOpenProductDetails:
MsgBox Err.Description
Resume Exit_CmdOpenProductDetails
End Function
从产品名称的表格和报告中,我有一个 onClick 事件:
=CmdOpenProductDetails()
但是,如果我单击表单上的产品名称,我会收到错误消息;
您作为事件属性设置输入的 express On Click 产生了以下错误。您输入的表达式的函数包含错误数量的参数。(表达式可能不会产生宏、UDF 或 Event Proc 的名称)(评估函数时可能出错)。
如果我从报告中单击,我会收到错误消息;
MS Access 找不到对象“CmdOpenProductDetails()。确保您已保存它并且输入正确。
解决方案
在 sub 中传递表单 byref
就像是
Public Sub Open_Form(ByRef theForm As Form)
Dim stLinkCriteria As String
stLinkCriteria = "[ID]=" & theForm![ID]
DoCmd.OpenForm theForm, , , stLinkCriteria
End Sub
Private Sub TestIt()
Open_Form Forms![frmManufactureList]![frm_Products]
End Sub
请注意,您可能需要稍微调整一下,因为我不知道确切的上下文。也许你有一个子表单,所以你应该传递主表单
但是这个想法是存在的
更新埃里克提议:
您可以将表单或报表作为对象传递,以使其适用于两者
Public Sub Open_Form_or_Report(ByRef theObject As Object)
Dim stLinkCriteria As String
stLinkCriteria = "[ID]=" & theObject![ID]
If TypeOf theObject Is Form Then
DoCmd.OpenForm theObject , , , stLinkCriteria
ElseIf TypeOf theObject Is Report Then
DoCmd.OpenReport theObject , , , stLinkCriteria
Else
MsgBox "Error : the type should be a Form or a Report"
End
End Sub
Private Sub TestIt()
Open_Form_or_Report Forms![frmManufactureList]![frm_Products]
End Sub