2017-09-01 2 views
1

カレンダーリマインダに基づいてリマインダーメールを送信するVBAスクリプトを作成しようとしていますが、開始することはできません。私はVBAマクロがOutlookイベントが発生したことを認識するのに問題があります。私はクラスモジュールにこのコードを入れて試してみた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 

私はトラストセンターで「すべてのマクロを有効にする」にマクロの設定があります。

私はgoogle、stackoverflow、他のウェブサイトを検索し、Microsoft.comのドキュメントを読んでいます。私は何が欠けているのか分かりません。

私はプログラマーではありません(明らかに)。私のコードで単純なものが欠落しているのか、これを不可能にしている私の設定の何らかの設定が欠けているのかどうかはわかりません。

私はWindows 10 Enterpriseを実行しているPCでOutlook 2016を使用しています。

感謝の意を表します。

ありがとうございました。

答えて

0

、多くの場合、マニュアルで使用されて、手動でInitialize_handlerを実行します起動時に特殊クラスモジュールThisOutlookSessionで実行してください。

Private Sub Application_Startup() 
    Initialize_handler 
End Sub 
0

リマインダーイベントを処理するためには、あなたが「Application_Reminder」という名前のサブでコードを囲む必要があり

これを試してみてください。この方法については

Option Explicit 

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

ThisOutlookSessionにコードが入ることを示すのを忘れてしまった。 – niton

0

クラスモジュールはオブジェクトのためだけ青写真あります。クラスモジュールはそれ自身ではすべて存在しません。実行時にクラスモジュールはタイプであり、オブジェクト変数として宣言できます。

あなたのコードは大丈夫です(パブリックフィールドは別として漏れています)。

このクラスのインスタンスが欠落しています。それのインスタンスを作成するクラスを維持し、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 

VBAクラスは、作成時に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 Application_Reminder(ByVal Item As Object) 
    'TODO handle app event 
End Sub 

'...more handlers... 

それだ - 今、あなたはそこにすべてのイベントハンドラの核心ザラザラ詳細をThisOutlookSessionを汚染せずに、専用のクラスでOutlook.Applicationイベントを処理しています。

関連する問題