【问题标题】:Run-time error '-2147221241 (80040107) while running VBA script in Outlook在 Outlook 中运行 VBA 脚本时出现运行时错误 '-2147221241 (80040107)
【发布时间】:2017-06-09 09:29:35
【问题描述】:

我有一个在 Outlook 中运行的 VBA 脚本,它应该将带有特定主题的传入电子邮件移动到 Outlook 中的子文件夹,然后将这些电子邮件导出到 TXT 文件。

这在大多数情况下都有效,但在导出了几封电子邮件后,消息:“运行时错误 '-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

我将不胜感激。

【问题讨论】:

    标签: vba outlook


    【解决方案1】:

    此行接受 ItemAdd 代码传递给它的 Item。

    Public Sub SaveMailAsFile(ByVal Item As Object)
    

    你有混合代码来处理一个项目和代码来处理许多项目。

    您可以先处理一个项目,然后查找以前可能丢失但现在收件箱中未处理的邮件。

    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
    

    【讨论】:

      【解决方案2】:

      错误是MAPI_E_INVALID_ENTRYID,这通常意味着传递给Namespace.GetItemfromID的条目id无法识别。

      您确定错误位置正确吗?您的脚本如何成功检索 Subject 属性,然后在 ReceivedTime 上失败?

      【讨论】:

      • 我对此很陌生,但是当我在收到错误消息后运行调试时,它仅突出显示 RevdDate = Item.ReceivedTime。我还需要检查什么以隔离问题吗?
      • 你确定你得到一个 MainItem 对象吗?看起来您忽略了作为参数传递给 SaveMailAsFile 子的 Item 对象,而只是循环遍历特定文件夹中的所有匹配项。这就是你的意思吗?
      • 它应该将项目移动到子文件夹,然后导出那些添加到子文件夹的电子邮件。我曾与几个不同的人就这方面的不同方面进行过合作,因为我绝不是程序员,所以可能会留下旧版本中的某些内容。
      • 但是您的代码将在每次将新项目添加到收件箱时处理所有个匹配项目,而不仅仅是添加的项目。
      • 就在"RevdDate = Item.ReceivedTime"这行之前,可以添加如下MsgBox Item.Class
      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 2021-03-17
      • 2019-08-23
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多