Outlook事件未触发

时间:2017-09-01 14:06:20

标签: vba outlook outlook-vba

我正在尝试编写一个VBA脚本,根据日历提醒发送提醒电子邮件,但甚至无法启动。我无法让VBA宏识别Outlook事件已经发生。

我已尝试将此代码放入类模块中:

Public WithEvents myOlApp As Outlook.Application

Sub Initialize_handler()
    Set myOlApp = Outlook.Application 'also tried with double quotes around "Outlook.Application"
End Sub

Private Sub myOlApp_Reminder(ByVal Item As Object)
    MsgBox ("test")
End Sub

Private Sub myOlApp_NewMail()
    MsgBox ("test")
End Sub

当我收到新电子邮件或设置提醒时,没有任何反应。

我已经在普通模块中使用此宏测试了它的工作原理:

Sub MsgBoxTest()
    MsgBox ("test")
End Sub

我在信任中心的“启用所有宏”上进行了宏设置。

我搜索了谷歌,stackoverflow,一堆其他网站,并阅读了Microsoft.com上的文档,无法弄清楚我缺少什么。

我不是程序员(显然)。我不知道在我的代码中是否遗漏了一些简单的东西,或者我的设置中的一些设置使得这不可能。

我在运行Windows 10 Enterprise的PC上使用Outlook 2016。

任何建议表示赞赏。

感谢。

3 个答案:

答案 0 :(得分:2)

类模块只是对象的蓝图。类模块本身并不存在,在运行时,类模块只是一个类型,可以将对象变量声明为。

你的代码很好(泄露公共场地)。

您只是错过了该类的实例。保持该类并使PBKDF2KeyImpl.getEncoded()创建它的实例:

SecretKeyFactory factory = SecretKeyFactory.getInstance(pbkdf2Algorithm);
KeySpec spec = new PBEKeySpec(passphrase.toCharArray(), salt.getBytes(charset), iterationCount, keyStrength);
SecretKey secret = factory.generateSecret(spec);
SecretKeySpec key;
//noinspection SynchronizationOnLocalVariableOrMethodParameter
synchronized(secret) {
  key = new SecretKeySpec(secret.getEncoded(), keyAlgorithm);
}

VBA类在创建时触发ThisOutlookSession事件,在销毁时触发'[ThisOutlookSession] Option Explicit Private AppEvents As AppEventsHandler Private Sub Application_Startup() Set AppEvents = New AppEventsHandler End Sub Private Sub Application_Quit() Set AppEvents = Nothing End Sub 事件。处理它们以设置Initialize字段:

Terminate

就是这样 - 现在你正在一个专门的类中处理Private WithEvents个事件,而不会因为每个事件处理程序的详细信息而对'[AppEventsHandler] (class module) Option Explicit Private WithEvents app As Outlook.Application Private Sub Class_Initialize() Set app = Outlook.Application End Sub Private Sub Class_Terminate() Set app = Nothing End Sub Private Sub app_NewMail() 'TODO handle app event End Sub Private Sub app_Reminder(ByVal Item As Object) 'TODO handle app event End Sub '...more handlers... 造成污染。

答案 1 :(得分:0)

为了处理Reminder事件,您需要将代码包含在名为“Application_Reminder”的Sub中

试试这个:

Option Explicit

Private Sub Application_Reminder(ByVal Item As Object)
    MsgBox "Test"
End Sub

答案 2 :(得分:0)

对于通常在文档中使用的此方法,请手动运行Initialize_handler或在特殊类模块ThisOutlookSession中启动时运行它。

Private Sub Application_Startup()
    Initialize_handler
End Sub