这是我在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件物品,需要很长时间。
所以我的问题是:我可以做些什么来提高绩效?
提前感谢您的帮助
答案 0 :(得分:0)
效率最低的代码行如下:
For Each eitem In Ns.Session.Folders.Item(12).Items
您需要打破属性和方法调用链并在单独的行上声明它们。因此,每个属性或方法将在单独的代码行上声明。因此,您将能够立即释放基础COM对象。在Visual Basic中将变量设置为Nothing以释放对该对象的引用。
迭代文件夹中的所有项目是一项非常耗时的任务。相反,我建议您使用Items类的Find
/ FindNext
或Restrict
方法来处理与您的条件相对应的项目。请阅读以下文章中有关这些方法的更多信息:
此外,您可以考虑使用Folder类的GetTable方法,该方法允许获取包含由Table
过滤的项目的Filter
对象。如果Filter是空字符串或省略Filter参数,GetTable
将返回Table
,其中的行代表文件夹中的所有项目。