在MS Access中使用已关闭表单的公共方法

时间:2013-08-15 00:42:07

标签: forms vba ms-access access-vba

我正在尝试使用一种表单中的Public方法,这种方法在我尝试调用它时恰好不会打开。我发现了:

Private Sub cmdPersonelEmail()

Forms!frmSwitchboard.cmdEmail_Click

EndSub

仅在表格frmSwitchboard当时打开时才能使用。据说这是因为表格!开放形式只是一个汇编(错误的词,但不记得正确的一个)。我想知道是否有办法在没有打开表单的情况下调用Public方法。

3 个答案:

答案 0 :(得分:2)

您可以使用表单代码模块的名称来完成您想要的操作。

例如,我的 Form7 包含一个公共子 SayHello ,它只是...

MsgBox "Hello " & CurrentUser

如您所知,我可以在表格打开时调用该程序......

Forms!Form7.SayHello

当表单关闭时,我仍然可以调用这样的程序......

Form_Form7.SayHello

虽然未显示表单,但该方法会将其添加到Forms集合中,然后将其保留在那里。所以我必须明确删除它。

DoCmd.Close acForm, "Form7"

但是,如果您的方法可以接受,则可能不起作用,具体取决于您的程序的具体细节。我很琐碎,所以没问题。

在实际操作中,我倾向于在表单关闭到标准模块时移动我想要的任何过程。

另一种可能性是打开隐藏的表单---隐藏时仍可从Forms集合访问该表单。

答案 1 :(得分:2)

您可以做的是将frmSwitchboard.cmdEmail_Click格式的代码修改为模块。但只有在代码不能从Form frmSwitchboard访问任何内容时才有效。

听起来像命令按钮会发送电子邮件。我将创建一个名为FormShared的新模块,并使用参数放置一个新的Sub。类似的东西:

Sub SendEmail(sEmailAddress As String, sSubject As String, sBody As String)
    ' ... email codes from cmdEmail_Click without anything in the frmSwitchboard
End Sub

在cmdEmail_Click中移动代码的电子邮件部分,然后修改它以调用此SendEmail Sub。修改后的cmdEmail_Click应准备参数并将它们传递给SendEmail。这允许您在加载或不加载表单的情况下使用它。

答案 2 :(得分:1)

您不能直接调用表单的成员,原因很简单,Form实际上是一个Class。

为了能够调用表单的方法和属性,必须将其实例化,即必须创建并存在于内存中。

正如HansUp所说,您可以直接引用Form_Form7.SayHello,但在这种情况下,Access会自动创建表单实例,这意味着无论表单形式如何,它都可能会产生不必要的副作用。此外,您将负责关闭该实例化表单。

另一方面,您可以将独立的VBA模块视为某种始终存在且始终可访问的全局静态对象(假设该成员被定义为公共)。

因此,在您的情况下,例如在SendEmail()模块中创建一个公共方法Utils,并将当前位于frmSwitchboard.cmdEmail_Click的所有代码放在该方法中。
然后,您可以从所有表单中拨打SendEmail

当然,您遇到的一个问题是您肯定需要将相关信息传递给SendMail,例如电子邮件地址和可能的消息,因此您可能还需要添加这些参数或者从其他地方获取数据。

在Utils模块中:

'Send the given message to the given recipient by email
Public Sub SendEmail(recipient As String, message as String)
    '... all your code currently in frmSwitchboard.cmdEmail_Click ...
End Sub

在你的frmSwitchboard中:

Private Sub cmdEmail_Click()
    Utils.SendEmail txtRecipient, txtMessage
End Sub

以您的其他形式:

Private Sub cmdPersonelEmail()
    Utils.SendEmail txtRecipient, txtMessage
End Sub