Forms 在MS Access中使用封闭窗体的公共方法

Forms 在MS Access中使用封闭窗体的公共方法,forms,ms-access,vba,Forms,Ms Access,Vba,我试图使用一个公共方法,该方法来自一个在我试图调用它时恰好未打开的表单。我发现: Private Sub cmdPersonelEmail() Forms!frmSwitchboard.cmdEmail_Click EndSub 仅当表单frmSwitchboard当时处于打开状态时才有效。据说这是因为形式!只是一个开放式表单的汇编(错误的单词,但记不住正确的单词)。我想知道是否有任何方法可以在不打开表单的情况下调用该公共方法。您可以通过使用表单的代码模块的名称来限定过程调用来执行所需操作

我试图使用一个公共方法,该方法来自一个在我试图调用它时恰好未打开的表单。我发现:

Private Sub cmdPersonelEmail()

Forms!frmSwitchboard.cmdEmail_Click

EndSub

仅当表单frmSwitchboard当时处于打开状态时才有效。据说这是因为形式!只是一个开放式表单的汇编(错误的单词,但记不住正确的单词)。我想知道是否有任何方法可以在不打开表单的情况下调用该公共方法。

您可以通过使用表单的代码模块的名称来限定过程调用来执行所需操作

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

MsgBox“你好”&CurrentUser
正如你所知,当表单像这样打开时,我可以调用该过程

表单!早上好
当表单关闭时,我仍然可以像这样调用过程

Form_Form7.SayHello
虽然表单不显示,但这种方法确实将其添加到
表单
集合中,然后将其保留在那里。所以我必须明确地删除它

DoCmd.Close acForm,“Form7”
但是,如果该方法符合您的目的,则可能不起作用,具体取决于您程序的具体细节。我的是琐碎的,所以没问题

在实际操作中,当表单关闭到标准模块时,我更愿意移动我想要的任何可用过程


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

您可以修改表单
frmSwitchboard.cmdEmail\u中的代码,然后单击
输出到模块。但仅当代码不从frmSwitchboard表单访问任何内容时才有效

听起来好像命令按钮会发送电子邮件。我将创建一个名为
FormShared
的新模块,并放置一个带有参数的新子模块。比如:

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

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

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

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

正如HansUp所说,您可以直接参考
表单7.SayHello
,但在这种情况下,Access将自动创建表单的实例,这意味着无论表单做什么,它都可能有不必要的副作用。此外,您将负责关闭该实例化表单

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

因此,在您的情况下,例如,在
Utils
模块中创建一个公共方法
sendmail()
,并将当前驻留在
frmSwitchboard.cmdEmail\u单击该方法中的

然后您可以从所有表单中调用
sendmail

当然,您将遇到的一个问题是,您肯定需要将相关信息传递到
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
在FRM开关板中:

Private Sub cmdEmail_Click()
    Utils.SendEmail txtRecipient, txtMessage
End Sub
在其他形式中:

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