我正在尝试使用一种表单中的Public方法,这种方法在我尝试调用它时恰好不会打开。我发现了:
Private Sub cmdPersonelEmail()
Forms!frmSwitchboard.cmdEmail_Click
EndSub
仅在表格frmSwitchboard当时打开时才能使用。据说这是因为表格!开放形式只是一个汇编(错误的词,但不记得正确的一个)。我想知道是否有办法在没有打开表单的情况下调用Public方法。
答案 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