2017-04-20 121 views
0

這是我在StackExchange的第一個問題永遠:-) 我在MS Outlook VBA運行下面的腳本我怎樣才能讓我的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

實際需要多長時間?請刪除「On Error resume Next」部分,看看是否有任何錯誤導致延遲。如果是這樣,請在這裏發佈錯誤消息。 –

+0

將'Items'集合分配給一個局部變量。這可避免在For Each循環中重新評估完整的對象鏈。 –

+0

On Error Resume Next應該只用於存在繞過錯誤然後關閉On Error GoTo 0的特定目的。請參閱http://stackoverflow.com/questions/31753201/vba-how-long-does- on-error-resume-next-work/31753321#31753321 and http://stackoverflow.com/questions/29390673/error-handling-in-vba-on-error-resume-next/29390944#29390944 – niton

回答

0

的代碼最沒有效率的線是以下之一:

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

你需要打破的屬性和方法的調用鏈,宣佈它們在不同的行。因此,每個屬性或方法將在單獨的代碼行中聲明。因此,您將能夠立即發佈底層的COM對象。在Visual Basic中將變量設置爲Nothing以釋放對該對象的引用。

遍歷文件夾中的所有項目是一項耗時的任務。相反,我建議使用Items類的Find/FindNextRestrict方法來處理符合條件的項目。瞭解更多關於在下面的文章這些方法:

你也可以考慮使用文件夾類,允許獲得Table對象,其中包含過濾項目的GetTable方法通過Filter。如果Filter是空字符串或者省略了Filter參數,則GetTable將返回Table,其中的行代表文件夾中的所有項目。