Vba 从报告中打开表单

Vba 从报告中打开表单,vba,ms-access,Vba,Ms Access,我在一个模块中的两个不同VBA函数中有以下代码行,它们都有相同的目标,即打开一个表单以获取特定记录 stLinkCriteria = "[ID]=" & Reports![Rpt_Manufacture].[ID] DoCmd.OpenForm stDocName, , , stLinkCriteria 及 如何更改此设置,使我只能从报表或表单调用一个函数,并将表单打开到特定记录。我已经试过了!但我得到了一个“无效使用我的关键字”,我猜这是因为我不能从模块中使用它 更新#1 根据下面T

我在一个模块中的两个不同VBA函数中有以下代码行,它们都有相同的目标,即打开一个表单以获取特定记录

stLinkCriteria = "[ID]=" & Reports![Rpt_Manufacture].[ID]
DoCmd.OpenForm stDocName, , , stLinkCriteria

如何更改此设置,使我只能从报表或表单调用一个函数,并将表单打开到特定记录。我已经试过了!但我得到了一个“无效使用我的关键字”,我猜这是因为我不能从模块中使用它

更新#1 根据下面Thomas G的回答,我使用了这个代码

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()
但是,如果我在表单上单击一个产品名称,我会收到错误消息

作为事件属性设置输入的“单击时快速显示” 产生了以下错误。您输入的表达式具有 函数包含错误数量的参数。(该表达可能是: 不会导致宏、UDF或事件过程的名称)(可能有 评估函数时出现错误)

如果我从报告中单击,我会收到错误消息

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
请注意,您可能需要对其进行一些调整,因为我不知道确切的上下文。也许你有一个子表单,所以你应该传递主表单

但想法是存在的


更新以下Erik提案:

您可以将窗体或报表作为对象传递,以使其同时工作

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

这不适用于报表,只适用于表单。您可能需要调整它,使其同时适用于这两种情况。另外,
Open\u Report
对于一个只打开表单的sub来说是一个糟糕的名字。我完全同意这个糟糕的名字:)至于其余的,我缺少了一些上下文来让它在所有情况下都能工作……正如我说的,我刚刚给出了这个想法!如果你用
Object
而不是
Form
作为你的论点,它只会对我有用think@ErikvonAsmuth这里是yago,加上一个类型检查:)呃。。。在传递参数时,您需要实际使用VBA。。。您几乎不应该将按钮指定给UDF,而是始终添加调用UDF@ErikvonAsmuth我为调用CmdOpenProductDetails UDF的代码创建了一个单击事件,但现在我收到一条“参数非可选”消息,您应该将
Me
作为参数传递…我尝试了“Private Sub-ProductID\u click(Me)”但我得到了一个预期的标识符错误。您可能需要阅读VBA教程。这不是将参数传递给sub的方式,也是无效的。你应该像
Open\u Form Me
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