Moving mail items into an "Archive" folder


Corey Thompson

I have created a button that is linked to a macro. The maco goes
through and moves the item to my archive folder.

However, when I have a message that has a completed flag, it fails. It
provides an error message about not being able to move unsent,
completed-flagged items (or something like that). I found this
completely bizzare.

Anyway, I figured that I'd be able to workaround it by unflagging it,
moving it, then re-flagging it as completed. The move now works, but
the mark-as-flagged does not.

Any ideas?

Code follows:
Sub MoveSelectedMessagesToFolder()
On Error Resume Next

Dim objFolder As Outlook.MAPIFolder, objInbox As Outlook.MAPIFolder
Dim objNS As Outlook.NameSpace, objItem As Outlook.MailItem

Set objNS = Application.GetNamespace("MAPI")
Set objInbox = objNS.GetDefaultFolder(olFolderInbox)
Set objFolder = objInbox.Parent.Folders("Archive") 'Assume this is
a mail folder

If objFolder Is Nothing Then
MsgBox "This folder doesn't exist!", vbOKOnly + vbExclamation,
End If

If Application.ActiveExplorer.Selection.Count = 0 Then
'Require that this procedure be called only when a message is
Exit Sub
End If

For Each objItem In Application.ActiveExplorer.Selection
If objFolder.DefaultItemType = olMailItem Then
If objItem.Class = olMail Then
If objItem.FlagStatus = olFlagComplete Then
objItem.FlagStatus = olFlagMarked
' objItem.FlagIcon = olPurpleFlagIcon
objItem.Move objFolder
objItem.FlagStatus = olFlagComplete
objItem.FlagIcon = olNoFlagIcon
objItem.Move objFolder
End If
End If
End If

Set objItem = Nothing
Set objFolder = Nothing
Set objInbox = Nothing
Set objNS = Nothing
End Sub

Corey Thompson

Michael Bauer

Am 14 Jun 2006 20:16:09 -0700 schrieb Corey Thompson:

You´re right, flagged completed messages can´t be moved.

First, for moving an item off the list you must use a backwards loop. Then,
the Move function returns the new object, use that and call its Save method
after changes.

BTW: What do you do if objFolder is Nothing? After the message box the code
goes on and will cause errors.

Sue Mosher [MVP-Outlook]

He can also use the Namespace.GetSharedDefaultFolder method to return the other user's Inbox, a bit easier than walking the folder tree.
Sue Mosher, Outlook MVP
Author of Configuring Microsoft Outlook 2003

and Microsoft Outlook Programming - Jumpstart for
Administrators, Power Users, and Developers

Corey Thompson

Thanks for the reply!

I'm not sure what a backwards loop is. You mean I should use something
other than a for each loop? Can I just call .save after the move?


Michael Bauer

Am 16 Jun 2006 07:02:03 -0700 schrieb Corey Thompson:

Just copied from another thread, please replace the variable names by yours:

The loop starts with Items.Count and counts down to 1. (A For Each loops
from 1 to Count.)

intCount = objInbox.Items.Count
For i = intCount To 1 Step -1
Set objItem = objInbox.Items(i)
If objItem.Class = olMail Then
Set objMail = objItem

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question