Excel 如何将每个未读邮件从默认收件箱复制到共享文件夹?

Excel 如何将每个未读邮件从默认收件箱复制到共享文件夹?,excel,vba,email,outlook,Excel,Vba,Email,Outlook,我正在尝试组织10多个不同的邮箱 问题在于未移动。我希望每次打开Outlook时都能在默认收件箱中查找未读邮件,将其复制并将其中一个副本移动到共享收件箱 如果有一封邮件要移动,它就可以工作,但当有更多邮件时,我会收到一个错误 “-2147221241-客户端操作失败” 或者类似的东西。我的窗户不是英文的 当我在“失败”窗口上按“确定”时,邮件仍被复制并移动到正确的文件夹中,因此我不知道错误的含义。有些邮件复制了两次,这可能就是错误的含义 MoveAndCopy:传入邮件被复制并发送到共享收件箱,

我正在尝试组织10多个不同的邮箱

问题在于未移动。我希望每次打开Outlook时都能在默认收件箱中查找未读邮件,将其复制并将其中一个副本移动到共享收件箱

如果有一封邮件要移动,它就可以工作,但当有更多邮件时,我会收到一个错误

“-2147221241-客户端操作失败”

或者类似的东西。我的窗户不是英文的

当我在“失败”窗口上按“确定”时,邮件仍被复制并移动到正确的文件夹中,因此我不知道错误的含义。有些邮件复制了两次,这可能就是错误的含义

MoveAndCopy:传入邮件被复制并发送到共享收件箱,并在原始文件夹中标记为已读(此功能正常)。
未删除邮件:当Outlook有一段时间未打开且原始收件箱收到新邮件时,应使用该选项。然后,我希望复制未读的电子邮件,并将其标记为已读,然后将副本发送到共享收件箱,该收件箱不应标记为已读

本次展望会

专用子应用程序\u启动()
Dim olApp作为Outlook.Application
将对象设置为Outlook.NameSpace
设置olApp=Outlook.Application
Set objNS=olApp.GetNamespace(“MAPI”)
Set Items=objNS.GetDefaultFolder(olFolderInbox).Items
端接头
私有子项\u未移动(ByVal项作为对象)
将消息作为Outlook.mailtim
如果Item.Exists=True,则
设置msg=Item
呼叫未移动(项目)
如果结束
端接头
私有子项\u ItemAdd(ByVal项作为对象)
关于错误转到错误处理程序
将消息作为Outlook.mailtim
如果TypeName(Item)=“MailItem”,则
设置msg=Item
调用MoveAndCopy(项目)
如果结束
程序退出:
出口接头
错误处理程序:
MsgBox错误编号&“-”&错误说明
恢复程序退出
端接头
对于这两个模块:

Sub UnreadMove(Item As Outlook.MailItem)

Dim Inbox As Outlook.Folder
Dim ns As Outlook.NameSpace
Dim MailDest As Outlook.Folder
Dim CopiedItem As Outlook.MailItem

Set Inbox = ns.GetDefaultFolder(olFolderInbox)

For Each Item In Inbox
    If Item.UnRead = True Then
        Set CopiedItem = Item.Copy
        Item.UnRead = False
        Item.Save
        Set ns = Outlook.Application.GetNamespace("MAPI")
        Set MailDest = ns.Folders("myemail@test.com").Folders("MyInbox")
        CopiedItem.Move MailDest
    End If
Next Item

End Sub
Sub MoveAndCopy(Item As Outlook.MailItem)

Dim ns As Outlook.NameSpace
Dim MailDest As Outlook.Folder
Dim CopiedItem As Outlook.MailItem
    
    If Item.Class = olMail Then
        Set CopiedItem = Item.Copy
        Item.UnRead = False
        Item.Save
        Set ns = Outlook.Application.GetNamespace("MAPI")
        Set MailDest = ns.Folders("myemail@test.com").Folders("MyInbox")
        CopiedItem.Move MailDest
    End If
    
End Sub

UnreadMove
在受监视的文件夹中创建一个副本。它将调用
Items\u ItemAdd
MoveAndCopy
也一样

无论这是否是您现在看到的错误的原因,这都应该满足您的要求

“代码>选项显式”考虑此强制 “工具|选项|编辑器”选项卡 '需要变量声明 “如果是,请声明为变体 Private with Events monitoredItems作为项目 私有子应用程序_启动() 未移动 设置monitoredItems=Session.GetDefaultFolder(olFolderInbox).Items 端接头 子未移动() 将收件箱设置为文件夹 Dim MailDest As文件夹 将复制项设置为邮件项 作为对象的Dim objItem 设置收件箱=会话.GetDefaultFolder(olFolderInbox) 设置MailDest=Session.folders(“myemail@test.com)文件夹(“我的收件箱”) '复制调用itemAdd '如果手动运行此操作, '在启动中设置monitoredItems后 “-关闭itemAdd的技巧 设置monitoredItems=Nothing ' '对于收件箱中的每个objItem.Items '如果objItem.Class=olMail,则 '如果objItem.UnRead=True,则 'Debug.Print objItem.subject ' 'Set CopiedItem=objItem.copy 'objItem.UnRead=False “objItem,救命 “CopiedItem.移动邮件目的地” "完" "完" “下一个objItem '如果由于复制和移动而混淆了每个索引的 “那么,下一步需要一个相反的方向。 “反向循环在所有情况下都有效。 我想我会坚持多久 对于i=Inbox.Items.count到1步骤-1 设置objItem=Inbox.Items(i) 如果objItem.Class=olMail,则 如果objItem.UnRead=True,则 Debug.Print objItem.subject 设置CopiedItem=objItem.copy objItem.UnRead=False objItem,救命 复制项,移动邮件目的地 如果结束 如果结束 下一个 '重置要使用itemAdd监视的项目 设置monitoredItems=Session.GetDefaultFolder(olFolderInbox).Items 端接头 要临时停止监视,请在受监视文件夹中创建副本

Private Sub monitoredItems_ItemAdd(ByVal Item As Object)

    Dim msg As MailItem

    If TypeName(Item) = "MailItem" Then
        Set msg = Item
        Set monitoredItems = Nothing
        
        'Call MoveAndCopy(Item)
                
        Call MoveAndCopy(msg)
        ' or
        ' MoveAndCopy msg
        Set monitoredItems = Session.GetDefaultFolder(olFolderInbox).Items

    End If

End Sub

如果您想更具体一些,您可以在
移动和复制
中停止监视。

她在outlook中是否有运行的规则?@RicardoDiaz没有,我没有发现适用于此情况的规则。因为我想复制邮件并将其标记为已读,然后将原始邮件移动到共享文件夹并保持未读状态。因此,她不必每次都导航到原始收件箱并将其标记为已读。为了安全起见,我还想在原始收件箱中保存一份副本。谢谢,在应用程序启动时,您的代码可以很好地从默认收件箱中移动未读邮件。现在我还要弄清楚如何实时完成。但在你分享这个之后,我可能真的可以自己设置它了!但实际上我可能只是修正了一个规则。不建议在规则中运行脚本。谢谢你告诉我,我不知道。我刚刚在regedit中添加了“运行脚本”,但将定义。然后尝试让脚本正常工作。实际上,代码现在也没有真正按照预期工作。启动应用程序时,只有来自一个收件箱的邮件才会移动到共享文件夹“MyInbox”。与输入电子邮件相同,我当前测试的3封电子邮件中只有一封被复制并移动到“MyInbox”文件夹。除了
GetDefaultFolder(olFolderInbox)
中的默认收件箱外,每个非默认收件箱还需要一个
ItemAdd
。也请看这里