【问题标题】:How can I make my VBA Outlook script more efficient如何使我的 VBA Outlook 脚本更高效
【发布时间】:2017-04-20 08:44:50
【问题描述】:

这是我在 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 个项目的文件夹中运行它,这需要很长时间。

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

提前感谢您的帮助

【问题讨论】:

  • 实际需要多长时间?请删除On Error resume Next 部分以查看是否有任何错误导致延迟。如果是这样,请在此处发布错误消息。
  • Items 集合分配给一个局部变量。这避免了在 For Each 循环中重新评估完整的对象链。
  • On Error Resume Next 仅应在有特定目的绕过错误然后使用 On Error GoTo 0 关闭的情况下使用。请参阅stackoverflow.com/questions/31753201/…stackoverflow.com/questions/29390673/…
  • 感谢您的回复。 resume next 语句有其用途,因为列表中有大约 100 个项目由于某种原因已损坏且无法读取。
  • 感谢本地化项目集合的想法。我会试试这个并衡量性能。

标签: vba performance outlook-2010


【解决方案1】:

效率最低的代码行如下:

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

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

遍历文件夹中的所有项目是一项耗时的任务。相反,我建议使用 Items 类的 Find/FindNextRestrict 方法来处理与您的条件相对应的项目。在以下文章中详细了解这些方法:

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

【讨论】:

    猜你喜欢
    • 2019-01-01
    • 2018-03-08
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多