2

我正在尝试使用在我尝试调用它时碰巧未打开的表单中的公共方法。我发现:

Private Sub cmdPersonelEmail()

Forms!frmSwitchboard.cmdEmail_Click

EndSub

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

4

3 回答 3

2

您可以通过使用表单代码模块的名称来限定过程调用来做您想做的事情。

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

MsgBox "Hello " & CurrentUser

如您所知,当表单像这样打开时,我可以调用该过程......

Forms!Form7.SayHello

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

Form_Form7.SayHello

尽管没有显示表单,但该方法确实将其添加到Forms集合中并随后将其保留在那里。所以我必须明确删除它。

DoCmd.Close acForm, "Form7"

但是,如果该方法对于您的目的是可以接受的,它可能不起作用,具体取决于您的程序的具体细节。我的是微不足道的,所以没问题。

在实际实践中,我更喜欢在表单关闭到标准模块时将我想要的任何程序移动到标准模块中。

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

于 2013-08-15T01:53:39.457 回答
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 中移动代码的 Email 部分,然后修改它以调用此 SendEmail Sub。修改后的 cmdEmail_Click 应该准备参数并将它们传递给 SendEmail。这使您可以让它在加载或不加载表单的情况下工作。

于 2013-08-15T02:29:56.977 回答
1

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

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

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

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

SendEmail()因此,在您的情况下,例如在模块中创建一个公共方法,Utils并将当前驻留在您frmSwitchboard.cmdEmail_Click的所有代码中。
然后,您可以SendEmail从所有表格中调用。

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

在实用程序模块中:

'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
于 2013-08-16T10:47:58.657 回答