我正在尝试编写一个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。
任何建议表示赞赏。
感谢。
答案 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