首页 > 解决方案 > 从报告中打开表格

问题描述

我在模块中的 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()。确保您已保存它并且输入正确。

标签: vbams-access

解决方案


在 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

推荐阅读