Copy email to different folder, works in 2003 but not 2007

  • Thread starter Thread starter cirrus
  • Start date Start date
C

cirrus

Hi all, I've used the code below in 2003 to copy sent items into my
Inbox (and also mark deleted items as read, but that part is OK). I've
upgraded to 2007, and now when I send an emial it throws the error
"Run-time error '-2147221241 (80040107)" and the debugger takes me to
the line "Set objItemCopy = Item.Copy".

Some odd things: The first time I send an email after opening Outlook,
it gives the error but the email is moved to the inbox. Subsequent
emails don't seem to run the code. Also, if I put a breakpoint on the
line in question and step through the function, it works without any
errors - and it continues to work for the subsequent emails, as long
as I step through using the debugger.

Thanks for your help!!
Regards,
ES


Option Explicit
Dim objInbox As Outlook.MAPIFolder
Dim WithEvents objDeletedItems As Outlook.Items
Dim WithEvents objSentItems As Outlook.Items

Private Sub Application_Startup()

Dim objNS As Outlook.NameSpace
Set objNS = Application.GetNamespace("MAPI")

'objInbox was declared with module scope
Set objInbox = objNS.GetDefaultFolder(olFolderInbox)

Dim objDeleted As Outlook.MAPIFolder
Set objDeleted = objNS.GetDefaultFolder(olFolderDeletedItems)
Set objDeletedItems = objDeleted.Items

Dim objSent As Outlook.MAPIFolder
Set objSent = objNS.GetDefaultFolder(olFolderSentMail)
Set objSentItems = objSent.Items

End Sub


Private Sub objDeletedItems_ItemAdd(ByVal Item As Object)

Item.UnRead = False
Item.Save

End Sub

Private Sub objSentItems_ItemAdd(ByVal Item As Object)

Dim objItemCopy As Object
Set objItemCopy = Item.Copy
objItemCopy.Move objInbox

End Sub
 
See if it helps to add a DoEvents() call just before you do the copy.

Also, ItemAdd fires at different stages in the receiving process in
different versions of Outlook and depending on whether any rules are
defined. I usually would set up something to let ItemAdd() finish and then
let a timer or something alert a different procedure to do the copy/move.
 
See if it helps to add a DoEvents() call just before you do the copy.

Also, ItemAdd fires at different stages in the receiving process in
different versions of Outlook and depending on whether any rules are
defined. I usually would set up something to let ItemAdd() finish and then
let a timer or something alert a different procedure to do the copy/move.

Thanks Ken. Adding a DoEvents before the copy didn't help, but adding
one between the copy and the move appears to prevent the issue.

I'm wondering if the copy is not blocking, so in the next line it's
attempting to move the copied object before it exists. Is there any
way to make the copy statement blocking? I'm somewhat suprised that it
doesn't appear to behave that way by default. Otherwise, it seems like
there is no way to tell if you need to insert DoEvents procedures
between any two given operations other than trial and error, if it
isn't guaranteed that the first line will finish before the next line
executes.

If you have time, would you mind sketching out how you would implement
your solution of setting a timer in ItemAdd to launch a different
procedure to do the copy/move? I'm curious if one would run into the
same problem and have to insert a DoEvents() between the copy and the
move.

Thanks,
ES
 
It's not a blocking problem, just sometimes Outlook needs a little time, or
the message pump needs priming. I've seen it happen with Word, Excel, PPT
and other applications also. It happens less often in managed code, because
that's slower. But I have seen it there also.

It's also a matter of trial and error, plus experience. There aren't really
any hard and fast rules.

If DoEvents() solved it then the timer wouldn't fix things most likely.

For a timer in VBA I'd use a Win32 system timer, and set it up and work with
it using Win32 API calls. If you have VB6 installed you can also stick a
timer control from that onto a VBA UserForm and do the timer that way.




<snip>

Thanks Ken. Adding a DoEvents before the copy didn't help, but adding
one between the copy and the move appears to prevent the issue.

I'm wondering if the copy is not blocking, so in the next line it's
attempting to move the copied object before it exists. Is there any
way to make the copy statement blocking? I'm somewhat suprised that it
doesn't appear to behave that way by default. Otherwise, it seems like
there is no way to tell if you need to insert DoEvents procedures
between any two given operations other than trial and error, if it
isn't guaranteed that the first line will finish before the next line
executes.

If you have time, would you mind sketching out how you would implement
your solution of setting a timer in ItemAdd to launch a different
procedure to do the copy/move? I'm curious if one would run into the
same problem and have to insert a DoEvents() between the copy and the
move.

Thanks,
ES
 
Back
Top