Moving mail items into an "Archive" folder

  • Thread starter Thread starter Corey Thompson
  • Start date Start date
C

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,
"INVALID FOLDER"
End If

If Application.ActiveExplorer.Selection.Count = 0 Then
'Require that this procedure be called only when a message is
selected
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
Else
objItem.Move objFolder
End If
End If
End If
Next

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

Corey Thompson
 
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.
 
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
 
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?

Corey
 
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
 
Back
Top