如何让我的 VBA Outlook 脚本更有效率
How can I make my VBA Outlook script more efficient
这是我在 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 个项目的文件夹中,这需要很长时间。
所以我的问题是:我可以做些什么来提高性能?
在此先感谢您的帮助
效率最低的代码行如下:
For Each eitem In Ns.Session.Folders.Item(12).Items
您需要打破 属性 和方法调用的链条,并在单独的行中声明它们。因此每个 属性 或方法都将在单独的代码行中声明。因此,您将能够立即释放底层 COM 对象。在 Visual Basic 中将变量设置为 Nothing 以释放对该对象的引用。
遍历文件夹中的所有项目是一项耗时的任务。相反,我建议使用 Items class 的 Find
/FindNext
或 Restrict
方法来处理符合您条件的项目。在以下文章中阅读有关这些方法的更多信息:
- How To: Use Restrict method to retrieve Outlook mail items from a folder
- How To: Use Find and FindNext methods to retrieve Outlook mail items from a folder (C#, VB.NET)
您也可以考虑使用文件夹 class 的 GetTable 方法,该方法允许获取 Table
对象,其中包含由 Filter
过滤的项目。如果 Filter 是空字符串或省略 Filter 参数,GetTable
returns 一个 Table
行代表文件夹中的所有项目。
这是我在 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 个项目的文件夹中,这需要很长时间。
所以我的问题是:我可以做些什么来提高性能?
在此先感谢您的帮助
效率最低的代码行如下:
For Each eitem In Ns.Session.Folders.Item(12).Items
您需要打破 属性 和方法调用的链条,并在单独的行中声明它们。因此每个 属性 或方法都将在单独的代码行中声明。因此,您将能够立即释放底层 COM 对象。在 Visual Basic 中将变量设置为 Nothing 以释放对该对象的引用。
遍历文件夹中的所有项目是一项耗时的任务。相反,我建议使用 Items class 的 Find
/FindNext
或 Restrict
方法来处理符合您条件的项目。在以下文章中阅读有关这些方法的更多信息:
- How To: Use Restrict method to retrieve Outlook mail items from a folder
- How To: Use Find and FindNext methods to retrieve Outlook mail items from a folder (C#, VB.NET)
您也可以考虑使用文件夹 class 的 GetTable 方法,该方法允许获取 Table
对象,其中包含由 Filter
过滤的项目。如果 Filter 是空字符串或省略 Filter 参数,GetTable
returns 一个 Table
行代表文件夹中的所有项目。