如何使我的VBA Outlook脚本更有效

时间:2017-04-20 08:44:50

标签: vba performance outlook-2010

这是我在StackExchange上的第一个问题:-) 我在MS Outlook VBA中运行以下脚本

Sub export()

    On Error resume Next

    Dim Ns As Outlook.NameSpace
    Dim eitem
    Dim oFile As Object
    Dim fso As Object

    Set Ns = Application.GetNamespace("MAPI")
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set oFile = fso.CreateTextFile("C:\Users\chakkalakka\Desktop\mails.txt")

    'Code
    For Each eitem In Ns.Session.Folders.Item(12).Items
        oFile.WriteLine eitem.SenderName & "§" & eitem.SentOnBehalfOfName & "§" & eitem.ReceivedTime
    Next

    oFile.Close
    Set Ns = Nothing
    Set fso = Nothing
    Set oFile = Nothing

    Debug.Print "Completed!"

End Sub

脚本一般工作正常,输出正确。我的问题是:我需要在一个包含>的文件夹中运行它95000件物品,需要很长时间。

所以我的问题是:我可以做些什么来提高绩效?

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

效率最低的代码行如下:

For Each eitem In Ns.Session.Folders.Item(12).Items

您需要打破属性和方法调用链并在单独的行上声明它们。因此,每个属性或方法将在单独的代码行上声明。因此,您将能够立即释放基础COM对象。在Visual Basic中将变量设置为Nothing以释放对该对象的引用。

迭代文件夹中的所有项目是一项非常耗时的任务。相反,我建议您使用Items类的Find / FindNextRestrict方法来处理与您的条件相对应的项目。请阅读以下文章中有关这些方法的更多信息:

此外,您可以考虑使用Folder类的GetTable方法,该方法允许获取包含由Table过滤的项目的Filter对象。如果Filter是空字符串或省略Filter参数,GetTable将返回Table,其中的行代表文件夹中的所有项目。