2017-01-24 27 views
1

OutlookでVBAスクリプトを実行していて、特定の件名の受信メールをOutlook内のサブフォルダに移動し、 TXTファイル。OutlookでVBAスクリプトを実行しているときに実行時エラー '-2147221241(80040107)が発生する

これは大部分は機能していますが、いくつかの電子メールをエクスポートした後、「実行時エラー '-2147221241(80040107)」:操作が失敗しました。浮き出る。私はそれをデバッグし、それがコードの行をハイライト表示されます。このエラーが表示されます

RevdDate = Item.ReceivedTime 

たら私はOutlookを再起動することができ、それは通常は問題なく電子メールの残りの部分をエクスポートします。しかし、私たちはこれを完全に自動化する必要があるので、このエラーを取り除く必要があります。以下は

は、コードの全体です:

Option Explicit 
Private WithEvents Items As Outlook.Items 
Private Sub Application_Startup() 
    Dim olNs As Outlook.NameSpace 
    Dim Inbox As Outlook.MAPIFolder 

    Set olNs = Application.GetNamespace("MAPI") 
    Set Inbox = olNs.GetDefaultFolder(olFolderInbox) 
    Set Items = Inbox.Items 
End Sub 

Private Sub Items_ItemAdd(ByVal Item As Object) 
    If TypeOf Item Is Outlook.MailItem Then 
     SaveMailAsFile Item ' call sub 
    End If 
End Sub 
Public Sub SaveMailAsFile(ByVal Item As Object) 
    Dim olNs As Outlook.NameSpace 
    Dim Inbox As Outlook.MAPIFolder 
    Dim SubFolder As Outlook.MAPIFolder 
    Dim Items As Outlook.Items 
    Dim ItemSubject As String 
    Dim NewName As String 
    Dim RevdDate As Date 
    Dim Path As String 
    Dim Ext As String 
    Dim i As Long 

    Set olNs = Application.GetNamespace("MAPI") 
    Set Inbox = olNs.GetDefaultFolder(olFolderInbox) 
    Set Items = Inbox.Items.Restrict("[Subject] = 'VVAnalyze Results'") 

    Path = Environ("ltvstatus") & "C:\Users\ltvstatus\Desktop\Backup Reports\" 
    ItemSubject = Item.Subject 
    RevdDate = Item.ReceivedTime 
    Ext = "txt" 

    For i = Items.Count To 1 Step -1 
     Set Item = Items.Item(i) 

     DoEvents 

     If Item.Class = olMail Then 
      Debug.Print Item.Subject ' Immediate Window 
      Set SubFolder = Inbox.Folders("Reports") ' <--- Update Fldr Name 

      ItemSubject = Format(RevdDate, "YYYYMMDD-HHNNSS") _ 
                & " - " & _ 
              Item.Subject & Ext 

      ItemSubject = FileNameUnique(Path, ItemSubject, Ext) 

      Item.SaveAs Path & ItemSubject, olTXT 
      Item.Move SubFolder 
     End If 
    Next 

    Set olNs = Nothing 
    Set Inbox = Nothing 
    Set SubFolder = Nothing 
    Set Items = Nothing 

End Sub 


'// Check if the file exists 
Private Function FileExists(FullName As String) As Boolean 
Dim fso As Object 
    Set fso = CreateObject("Scripting.FileSystemObject") 

    If fso.FileExists(FullName) Then 
     FileExists = True 
    Else 
     FileExists = False 
    End If 

    Exit Function 
End Function 

'// If the same file name exist then add (1) 
Private Function FileNameUnique(Path As String, _ 
           FileName As String, _ 
           Ext As String) As String 
Dim lngF As Long 
Dim lngName As Long 
    lngF = 1 
    lngName = Len(FileName) - (Len(Ext) + 1) 
    FileName = Left(FileName, lngName) 

    Do While FileExists(Path & FileName & Chr(46) & Ext) = True 
     FileName = Left(FileName, lngName) & " (" & lngF & ")" 
     lngF = lngF + 1 
    Loop 

    FileNameUnique = FileName & Chr(46) & Ext 

    Exit Function 
End Function 

私はこれで任意の助けをいただければ幸いです。

答えて

1

この行は、ItemAddコードによって渡されたItemを受け入れます。

Public Sub SaveMailAsFile(ByVal Item As Object) 

複数のアイテムを処理するコードと1つのコードを処理するコードが混在しています。

最初に1つのアイテムを処理してから、以前には見逃していた可能性があり、受信トレイで未処理のメールを探すことができます。

Private Sub SaveMailAsFile(ByVal Item As Object) 

    Dim olNs As Outlook.NameSpace 
    Dim Inbox As Outlook.MAPIFolder 
    Dim SubFolder As Outlook.MAPIFolder 

    Dim Items As Outlook.Items 
    Dim ItemSubject As String 

    Dim RevdDate As Date 
    Dim Path As String 
    Dim Ext As String 

    Set olNs = Application.GetNamespace("MAPI") 
    Set Inbox = olNs.GetDefaultFolder(olFolderInbox) 

    If Item.Subject = "VVAnalyze Results" Then 

     Path = Environ("ltvstatus") & "C:\Users\ltvstatus\Desktop\Backup Reports\" 
     ItemSubject = Item.Subject 
     RevdDate = Item.ReceivedTime 
     Ext = "txt" 

     Debug.Print Item.Subject ' Immediate Window 

     Set SubFolder = Inbox.Folders("Reports") ' <--- Update Fldr Name 

     ItemSubject = Format(RevdDate, "YYYYMMDD-HHNNSS") _ 
               & " - " & _ 
             Item.Subject & Ext 

     ItemSubject = FileNameUnique(Path, ItemSubject, Ext) 

     Item.SaveAs Path & ItemSubject, olTXT 
     Item.Move SubFolder 

    End If 

    SaveMailAsFile_Standalone ' Comment out to run separately if needed 

ExitRoutine: 
    Set olNs = Nothing 
    Set SubFolder = Nothing 
    Set Inbox = Nothing 
    Set Items = Nothing 

End Sub 

Public Sub SaveMailAsFile_Standalone() 

    Dim olNs As NameSpace 
    Dim Inbox As Folder 
    Dim SubFolder As Folder 

    Dim resItems As Items 
    Dim unprocessedItem As Object 

    Dim ItemSubject As String 
    Dim RevdDate As Date 
    Dim Path As String 
    Dim Ext As String 

    Dim i As Long 

    Set olNs = Application.GetNamespace("MAPI") 
    Set Inbox = olNs.GetDefaultFolder(olFolderInbox) 

    Set resItems = Inbox.Items.Restrict("[Subject] = 'VVAnalyze Results'") 

    Path = Environ("ltvstatus") & "C:\Users\ltvstatus\Desktop\Backup Reports\" 
    'ItemSubject = Item.Subject 
    'RevdDate = Item.ReceivedTime 
    Ext = "txt" 

    For i = resItems.count To 1 Step -1 

     Set unprocessedItem = resItems.Item(i) 

     DoEvents 

     If unprocessedItem.Class = olMail Then 

      ItemSubject = unprocessedItem.Subject 
      RevdDate = unprocessedItem.ReceivedTime 

      Debug.Print unprocessedItem.Subject ' Immediate Window 

      Set SubFolder = Inbox.Folders("Reports") ' <--- Update Fldr Name 

      ItemSubject = Format(RevdDate, "YYYYMMDD-HHNNSS") _ 
                & " - " & _ 
            unprocessedItem.Subject & Ext 

      ItemSubject = FileNameUnique(Path, ItemSubject, Ext) 

      unprocessedItem.SaveAs Path & ItemSubject, olTXT 
      unprocessedItem.Move SubFolder 

     End If 
    Next 

ExitRoutine: 
    Set olNs = Nothing 
    Set Inbox = Nothing 
    Set SubFolder = Nothing 
    Set resItems = Nothing 
    Set unprocessedItem = Nothing 

End Sub 
+0

これは修正されたようですね、ありがとう! – jhugenroth

0

エラーはMAPI_E_INVALID_ENTRYIDです。これは、通常、Namespace.GetItemfromIDに渡されたエントリIDを認識できないことを意味します。

エラーの場所が正しいですか?スクリプトがSubjectプロパティを正常に取得してからReceivedTimeで失敗する可能性はありますか?

+0

私はこれまでかなり新しいですが、私はエラーメッセージを受け取った後、私は、デバッグを実行したときには、RevdDate = Item.ReceivedTimeだけ強調しています。問題を特定するためにチェックする必要があるものはありますか? – jhugenroth

+0

MainItemオブジェクトを取得してもよろしいですか? SaveMailAsFileサブのパラメータとして渡されたItemオブジェクトを無視し、特定のフォルダ内の一致するすべてのアイテムをループするように見えます。それはあなたがすることを意味しますか? –

+0

これは、項目をサブフォルダに移動し、サブフォルダに追加された電子メールをエクスポートすることになっています。私は決してプログラマーではないので、いくつかの異なる人たちと仕事をしてきました。古いリビジョンのうちの1つが残っているかもしれません。 – jhugenroth

関連する問題