2017-11-13 19 views
1

MailItemで何が変更されたのかを知りたい。PropertyChangeイベントを実装するにはどうすればよいですか?

私は、Application.Session.Folders( "TargetFolder")に基づいて、変数に次のようにItemChangeをトリガーすることができました: Private Sub olInvMbxItems_ItemChange(ByVal X As Object)

Xで変更されたプロパティを知りたいと思います。 XPrivate Sub X_PropertyChange(ByVal x As Object)のグローバル変数に渡すと、Xが最初のパスItemChangeで初期化されなかったため、最初の繰り返しが欠落します。

カテゴリ変更を検出するMailItemsのフォルダを監視するにはどうすればよいですか。 ItemChangeはこれを行いながら、私は特定のカテゴリを探している場合、ここで述べたように、多くの変更がItemChangeをトリガーとして、それは、アクションの重複を与える:

Handle ItemChange event when outlook appointments are dismissed

、ここで:

Outlook Macro that will copy an email I flag and put it in a folder

バイナリ2番目の項目のUserPropertiesのフラグは、1回限りのイベントではないため機能しません。

Outlook Events VBAはにPropertyChangeを使用することを言いますが、実装するための技術を提供していません。

+0

。特に、他のシステムがアイテムを変更する可能性がある場合は、おそらくユーザー定義フィールドに古いカテゴリコードを保存し、アイテムを定期的にループする必要があります(30分ごとにコードを実行します)(https://stackoverflow.com/questions/12257985/outlook-vba-run-a-code-each-hour-hour-hour)、またはリマインダをトリガして、現在のcatコードが一致するかどうかを確認します。 – niton

+0

私はこの問題を解決するために家に帰るときにその方向性を学んでいます。 ItemChangedがトリガされたときにローカルコピーを登録して変更をチェックすることができます。UserPropertyとしてキャッシュされたカテゴリのコピーは、理想的には動作します。私は進歩するように物事を更新します。 – EFH

+0

あなたはまだ項目を変更しようとするかもしれませんが、他のシステムで行われたItemChangeやPropertyChangeを認識できないことをお勧めします。この場合、現在のcatコードと保存されたcatコードを定期的に比較します。 – niton

答えて

0

これを行う方法はありません。MAPIレベルであっても、ストアプロバイダーは変更された内容を追跡しません。あなたの唯一の解決策は、古いもの(あなたの別の場所に保存されている)と新しい値を比較して何が変わったのかを見ることです。

0

ここでは、1つの選択に対して機能する方法があります。改良がまだ必要ですが、これは出発点である:

Private WithEvents olExplorer As Outlook.Explorer 
Private olCurSel As Selection 
Private WithEvents olCurSelItem As Outlook.MailItem 

Private Sub olExplorer_SelectionChange() 
    Set olCurSel = olExplorer.Selection 
    Set olCurSelItem = Nothing 
    Dim i As Long 
    For i = 1 To olCurSel.Count 
    If TypeName(olCurSel.Item(i)) = "MailItem" Then 
     Set olCurSelItem = olCurSel.Item(i) 
    End If 
    Next i 
End Sub 

Private Sub olCurSelItem_PropertyChange(ByVal Name As String) 
    Debug.Print Name; " is what changed!" 
End Sub 

我々はアイテムが選択されていることを知ることができるOutlook.Explorer.Selectionを使用します。その後、そのアイテムをOutlook.MailItemに条件付きで割り当て、PropertyChangeというイベントを使用してOutlook.MailItemというイベントを実行します。

問題:

  1. が複数選択
  2. SelectionChangeを処理しませんが、同様の各選択に閲覧ウィンドウによってトリガーされます。したがって、読み取りウィンドウが開いている場合は、2回起動されます。上記のように、olCurSelItemは、それぞれSelectionChangeの2回設定されています。
  3. これは、ローカル変更によってのみトリガーされます。メールボックスにアクセスできる他のシステムではアイテムが変更される可能性があり、アクションは実行されません。不完全な自己答えは、あなたがあなたのソリューションを再考する必要が表示された場合は合理的であるべきで、さらに質問から
関連する問題