首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Outlook宏运行250次迭代,然后出现错误。

Outlook宏运行250次迭代,然后出现错误。
EN

Stack Overflow用户
提问于 2012-11-09 16:11:34
回答 2查看 1.9K关注 0票数 0

描述:

我有一个Outlook宏,它在文件夹中遍历选定的电子邮件,并将一些信息写入.csv文件。在失败之前,它会一直工作到250岁。下面是一些代码:

代码语言:javascript
复制
Open strSaveAsFilename For Append As #1

CountVar = 0
For Each objItem In Application.ActiveExplorer.Selection
    DoEvents
    If objItem.VotingResponse <> "" Then
        CountVar = CountVar + 1
        Debug.Print "   " & CountVar & ". " & objItem.SenderName
        Print #1,  & objItem.SenderName & "," &  objItem.VotingResponse
    Else
        CountVar = CountVar + 1
        Debug.Print "   " & CountVar & ". " & "Moving email from: " & Chr(34) & objItem.SenderName & Chr(34) & " to: Special Cases sub-folder"
        objItem.Move CurrentFolderVar.Folders("Special Cases")
    End If
Next
Close #1

问题

在这段代码通过250封电子邮件后,弹出以下屏幕截图:

http://i.stack.imgur.com/yt9P8.jpg

--我尝试添加了一个“等待”函数,以便给服务器一个休息,这样我就不会这么快地查询它,但是我在同一点得到了相同的错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-13 15:51:21

感谢@76 for,感谢他对另一个问题的回答,我大量引用了这个问题。我发现,在Outlook中有一个内置的限制(来源),您不能打开超过250个项目,并且Outlook会将它们全部保存在内存中,直到宏结束为止。解决方法,而不是遍历所选内容中的每一项:

代码语言:javascript
复制
For Each objItem In Application.ActiveExplorer.Selection

您可以循环遍历父文件夹。我想我可以做这样的事:

代码语言:javascript
复制
For Each objItem In oFolder.Items

但是,事实证明,当你删除或移动一封电子邮件时,它会将列表向上移动,这样它就会跳过电子邮件。迭代在另一个答案中找到的文件夹的最佳方法是这样做:

代码语言:javascript
复制
For i = oFolder.Items.Count To 1 Step -1 'Iterates from the end backwards
Set objItem = oFolder.Items(i)

下面是整个代码,提示要选择解析的文件夹,在该文件夹中创建“离开办公室”回复的子目录,以及“特殊情况”,其中将所有以"RE:“开头的电子邮件放在其中。

代码语言:javascript
复制
Sub SaveItemsToExcel()
    Debug.Print "Begin SaveItemsToExcel"

    Dim oNameSpace As Outlook.NameSpace
    Set oNameSpace = Application.GetNamespace("MAPI")
    Dim oFolder As Outlook.MAPIFolder
    Set oFolder = oNameSpace.PickFolder
    Dim IsFolderSpecialCase As Boolean
    Dim IsFolderOutofOffice As Boolean
    IsFolderSpecialCase = False
    IsFolderOutofOffice = False

    'If they don't check a folder, exit.
    If oFolder Is Nothing Then
        GoTo ErrorHandlerExit
    ElseIf oFolder.DefaultItemType <> olMailItem Then 'Make sure folder is not empty
        MsgBox "Folder does not contain mail messages"
        GoTo ErrorHandlerExit
    End If

    'Checks to see if Special Cases Folder and Out of Office folders exists. If not, create them
    For i = 1 To oFolder.Folders.Count
        If oFolder.Folders.Item(i).name = "Special Cases" Then IsFolderSpecialCase = True
        If oFolder.Folders.Item(i).name = "Out of Office" Then IsFolderOutofOffice = True
    Next
    If Not IsFolderSpecialCase Then oFolder.Folders.Add ("Special Cases")
    If Not IsFolderOutofOffice Then oFolder.Folders.Add ("Out of Office")

    'Asks user for name and location to save the export
    objOutputFile = CreateObject("Excel.application").GetSaveAsFilename(InitialFileName:="TestExport" & Format(Now, "_yyyymmdd"), fileFilter:="Outlook Message (*.csv), *.csv", Title:="Export data to:")
    If objOutputFile = False Then Exit Sub
    Debug.Print "   Will save to: " & objOutputFile & Chr(10)

    'Overwrite outputfile, with new headers.
    Open objOutputFile For Output As #1
    Print #1, "User ID,Last Name,First Name,Company Name,Subject,Vote Response,Recived"

    ProcessFolderItems oFolder, objOutputFile

    Close #1

    Set oFolder = Nothing
    Set oNameSpace = Nothing
    Set objOutputFile = Nothing
    Set objFS = Nothing

    MsgBox "All complete! Emails requiring attention are in the " & Chr(34) & "Special Cases" & Chr(34) & " subdirectory."
    Debug.Print "End SaveItemsToExcel."
    Exit Sub
ErrorHandlerExit:
    Debug.Print "Error in code."
End Sub

Sub ProcessFolderItems(oParentFolder, ByRef objOutputFile)
    Dim oCount As Integer
    Dim oFolder As Outlook.MAPIFolder
    Dim MessageVar As String
    oCount = oParentFolder.Items.Count
    Dim CountVar As Integer
    Dim objItem As Outlook.MailItem

    CountVar = 0

    For i = oParentFolder.Items.Count To 1 Step -1 'Iterates from the end backwards
    Set objItem = oParentFolder.Items(i)
        DoEvents
        If objItem.Class = olMail Then
            If objItem.VotingResponse <> "" Then
                CountVar = CountVar + 1
                Debug.Print "   " & CountVar & ". " & GetUsername(objItem.SenderName, objItem.SenderEmailAddress) & "," & objItem.SenderName & "," & GetCompany(objItem.SenderName) & "," & Replace(objItem.Subject, ",", "") & "," & objItem.VotingResponse & "," & objItem.ReceivedTime
                Print #1, GetUsername(objItem.SenderName, objItem.SenderEmailAddress) & "," & objItem.SenderName & "," & GetCompany(objItem.SenderName) & "," & Replace(objItem.Subject, ",", "") & "," & objItem.VotingResponse & "," & objItem.ReceivedTime
            ElseIf objItem.Subject Like "*Out of Office*" Then
                CountVar = CountVar + 1
                Debug.Print "   " & CountVar & ". " & "Moving email from: " & Chr(34) & objItem.SenderName & Chr(34) & " to the, " & Chr(34) & "Out of Office" & Chr(34) & " sub-folder"
                objItem.Move oParentFolder.Folders("Out of Office")
            Else
                CountVar = CountVar + 1
                Debug.Print "   " & CountVar & ". " & "Moving email from: " & Chr(34) & objItem.SenderName & Chr(34) & " to the, " & Chr(34) & "Special Cases" & Chr(34) & " sub-folder"
                objItem.Move oParentFolder.Folders("Special Cases")
            End If
        End If
    Next i
    Set objItem = Nothing
End Sub

Function GetUsername(SenderNameVar As String, SenderEmailVar As String) As String
    On Error Resume Next
    GetUsername = ""
    GetUsername = CreateObject("Outlook.Application").CreateItem(olMailItem).Recipients.Add(SenderNameVar).AddressEntry.GetExchangeUser.Alias
    If GetUsername = "" Then GetUsername = Mid(SenderEmailVar, InStrRev(SenderEmailVar, "=", -1) + 1)
End Function

Function GetCompany(SenderNameVar)
    On Error Resume Next
    GetCompany = ""
    GetCompany = CreateObject("Outlook.Application").CreateItem(olMailItem).Recipients.Add(SenderNameVar).AddressEntry.GetExchangeUser.CompanyName
End Function
票数 2
EN

Stack Overflow用户

发布于 2016-10-17 17:38:45

为了解决这个问题,我使用了以下规则:

"objOutlook.ActiveExplorer“的范围有限(250个对象)。

但是,为每封电子邮件创建对象是无限的。

例如:

代码语言:javascript
复制
sub Over250()

  Total = objOutlook.ActiveExplorer.Selection.Count

  For X = 1 to Total

    Set objOutlook = CreateObject("Outlook.Application")
    Set ObjExplorer = objOutlook.ActiveExplorer     

   '**** DO YOU THINGS****

    Set objOutlook = Nothing
    Set ObjExplorer = Nothing

  Next X

end sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13311774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档