resident
resident

Reputation: 51

Outlook VBA - Bulk Move of Email Between Subfolders

I routinely have to move a decent amount of email (150+) from a subfolder to another. There are many folders in the mailbox that I perform this task on. It seems like it would be an easy macro to write, but what I have is substantially slower than doing a Ctrl+A, drag to destination folder.

I have reviewed previous questions about moving Outlook emails and Microsoft's documentation, but I am unable to figure out how to accomplish moving the emails in a a fast and reliable manner. I would appreciate any information on where I am going wrong and if there is another solution besides VBA.

My current code is below. My end goal would be to loop through a list of folder names (instead of me selecting the folder).

Thanks in advance.

Sub MoveEmailsToDone()

On Error Resume Next

Dim ns As Outlook.NameSpace
Dim AnalystFolder As Outlook.MAPIFolder
Dim MoveToFolder As Outlook.MAPIFolder

Set ns = Application.GetNamespace("MAPI")

Set AnalystFolder = Application.ActiveExplorer.CurrentFolder
Set MoveToFolder = ns.Folders("[email protected]").Folders(AnalystFolder.Name & "-DONE")

For i = AnalystFolder.Items.Count To 1 Step -1
    AnalystFolder.Items(i).Move MoveToFolder
Next i

Set ns = Nothing
Set AnalystFolder = Nothing
Set MoveToFolder = Nothing

End Sub

Upvotes: 2

Views: 1660

Answers (1)

niton
niton

Reputation: 9179

From experience Move and Delete are slow.

http://computer-programming-forum.com/1-vba/17216b85e9c096d3.htm

07 Jul 2003
The following code loops through each mail item in a specified folder and moves the item to another folder. For 1100 items, it takes more than 5 min. It doesn't move that slow when I select all and move in the user interface.

.

Outlook uses Extended MAPI to implement a move operation, namely
IMAPIFolder::CopyMessages() which takes a list of entryids, hence it does not
need to open each message. Store provider completes the whole operation on the
server without sending lots of data back and forth as apparently happens when
you run your code.

Dmitry Streblechenko

https://stackoverflow.com/users/332059/dmitry-streblechenko

DoEvents lets you use Outlook while the code runs.

For i = AnalystFolder.Items.Count To 1 Step -1

    DoEvents    
    AnalystFolder.Items(i).Move MoveToFolder      

Next i

MsgBox "MoveEmailsToDone is finally done."

Upvotes: 0

Related Questions