2008-09-17 2 views
8

私は、OutlookのVisual Basic(私たちはOutlook 2003とExchange Serverを使用しています)にメッセージハンドラ関数を書いて、受信メールを整列させるのに役立ちました。MailItemがMailItemでないのはいつですか?

時々ルールが失敗し、Outlookがそれを無効にすることを除いて、私にとってはうまくいっています。

次に、ルールを元に戻して手動で受信トレイで実行して追いつきます。ルールは自然に失敗し、1日に数回非アクティブになります。

私はこれを一度修正したいと思います。

答えて

1

は、OutlookのVisual Basic(私たちはOutlook 2003とExchange Serverを使用しています)にメッセージハンドラ関数を書き込んで、受信メールを並べ替えるのに役立ちました。時にはルールが失敗し、Outlookがそれを無効にすることを除いて、私のために働いています。その後、ルールを元に戻して手動で受信トレイで実行して追いつきます。ルールは自然に失敗し、1日に数回非アクティブになります。私はこれを一度だけ修正したいと思っています。ここで

は、機能性を剥奪コードですが、あなたにそれがどのように見えるかのアイデアを与える:私が得る

Public WithEvents myOlItems As Outlook.Items 

    Public Sub Application_Startup() 
     ' Reference the items in the Inbox. Because myOlItems is declared 
     ' "WithEvents" the ItemAdd event will fire below. 
     ' Set myOlItems = Outlook.Session.GetDefaultFolder(olFolderInbox).Items 
     Set myOlItems = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items 
    End Sub 

    Private Sub myOlItems_ItemAdd(ByVal Item As Object) 
     On Error Resume Next 
     If TypeName(Item) = "MailItem" Then 
      MyMessageHandler Item 
     End If 
    End Sub 

    Public Sub MyMessageHandler(ByRef Item As MailItem) 
     Dim strSender As String 
     Dim strSubject As String 

     If TypeName(Item) <> "MailItem" Then 
      Exit Sub 
     End If 

     strSender = LCase(Item.SenderEmailAddress) 
     strSubject = Item.Subject 

     rem do stuff 
     rem do stuff 
     rem do stuff 
    End Sub 

一つのエラーは、VBは、その項目がMailItemない文句を言いMyMessageHandlerを呼び出し、「型が一致しません」です。 OK、しかしTypeName(Item)は "MailItem"を返すので、ItemはどのようにMailItemになりませんか?

もう1つは、空白の件名のメールが届く場所です。行

strSubject = Item.Subject 

私にはエラーが発生します。私はItem.Subjectは空白でなければならないが、なぜそれはエラーですか?

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

+1

タイプ名は、人間が判読できるバージョンのタイプを調べます。同じ名前を持つ2つの異なる型が存在する可能性があるため、型名を使用して型チェックを行うと、偽陽性/陰性が発生します。代わりに "TypeOf Item is MailItem"を試してください – rpetrich

+0

'TypeName(Item)=" MailItem "'ならば、MailItemsだけを受け入れるだけでなく、その項目がMailItemかどうかを確認するプロシージャを呼び出します。 – JimmyPena

2

私の記憶はこれでやや曇っていますが、MailItemは読取りレシートのようなものであればMailItemではないと思います。 (残念ながら、これを実証したVBAコードは別の仕事で書かれていて、今のところはありません)

私は、またはルールウィザードにとっては複雑すぎるルール)、あなたが書いたようなものでそれらをキャッチしていたにもかかわらず、あなたが持っているのと同じ問題に走っていることを思い出しているようです。

具体的な例が得られるかどうかを確認します。デフォルトの受信トレイに見ることができるアイテムの多くの種類があり

Public Sub GetTypeNamesInbox() 
Dim myOlItems As Outlook.Items 
Set myOlItems = application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items 
Dim msg As Object 

For Each msg In myOlItems 
    Debug.Print TypeName(msg) 
    'emails are typename MailItem 
    'Meeting responses are typename MeetingItem 
    'Delivery receipts are typename ReportItem 
Next msg 

End Sub 

HTH

8

このコードは、私に私の受信トレイにあった別の型名を示しました。

着信アイテムをObject型変数に割り当てます。次に、TypeOfまたはTypeNameを使用して、それがMailItemであるかどうかを判断します。それでは、あなたのコードが電子メールに適用されるアクションを実行する必要があります。

すなわち

Dim obj As Object 

If TypeName(obj) = "MailItem" Then 
    ' your code for mail items here 
End If 
1
Dim objInboxFolder As MAPIFolder 
Dim oItem As MailItem 
Set objInboxFolder = GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) 

For Each Item In objInboxFolder.Items 
    If TypeName(Item) = "MailItem" Then 
    Set oItem = Item 

next 
+0

コードに説明を追加してください。 – nalply

3

は、私は、Outlookライブラリを直接参照されている他のOfficeアプリケーションでは、次のVBAのコードスニペットを使用します。コードのための単純なエラーハンドラを使用しない理由

' Outlook Variables 

    Dim objOutlook As Outlook.Application: Set objOutlook = New Outlook.Application 
    Dim objNameSpace As Outlook.NameSpace: Set objNameSpace = objOutlook.GetNamespace("MAPI") 
    Dim objFolder As MAPIFolder: Set objFolder = objNameSpace.PickFolder() 
    Dim objMailItem As Outlook.MailItem 

    Dim iCounter As Integer: iCounter = objFolder.Items.Count 
    Dim i As Integer 

    For i = iCounter To 1 Step -1 
    If TypeOf objFolder.Items(i) Is MailItem Then 
     Set objMailItem = objFolder.Items(i) 
     With objMailItem 

など

+0

私は文字列として "MailItem"をハードコーディングするよりも 'TypeOf'が好きです。 –

0

?真剣に。失敗したと思われるプロパティまたはオブジェクトの読み取りごとにエラーを書き込むことができます。それでは、それを再開させてください。複雑なエラー処理の必要はありません。空白の主題を示すテストを考えてみましょう。空白の空白の被写体では、どの値が返され、それがエラーになるかわからないので、単純なテストとしてエラーが発生する可能性があります。テストをifステートメント(エラーが発生する場合)で実行し、エラー時にプログラムを再開させます。

On Error Resume Next 
If object.subject = Null 'produces an error when subject is null, otherwise allows a good read 
    strSubject = "" 'sets the subject grab string to a null or empty string as a string 
Else 
strSubject = object.subject 'Sets the subject grab string to the subject of the message\item 
End If 
関連する問題