VBA Outlook 用户窗体提示

VBA Outlook userform prompt

我有一个用户表单,在我发送电子邮件时会提示(效果很好。不是问题),当我单击表单上的按钮时,它会从那里将电子邮件移动到相应的文件夹。

我现在想要的是当收件箱中的邮件从未读变为已读时提示相同的用户表单(而不是重复的)。用户窗体上的按钮然后将该消息移动到相应的文件夹。

发送电子邮件时调出用户表单的代码:

Private Sub Application_ItemSend(ByVal Item As Object, cancel As Boolean)

     UserForm1.Show vbModal
   cancel = False       

结束子

用户表单按钮的代码片段:

Private Sub CommandButton1_Click()
On Error GoTo error_movemessage

Dim myolapp As New Outlook.Application
Dim mynamespace As Outlook.NameSpace
Dim myinbox As Outlook.MAPIFolder
Dim mydestfolder As Outlook.MAPIFolder
Dim myitems As Outlook.Items
Dim myItem As Object

Set mynamespace = myolapp.GetNamespace("MAPI")
Set myinbox = Session.GetDefaultFolder(olFolderInbox).Parent.Folders("RetainPermanently")
Set myitems = myinbox.Items
Set mydestfolder = myinbox
Set myItem = Application.ActiveInspector.CurrentItem

myItem.Move mydestfolder
Unload Me

exit_CommandButton1_Click:
Exit Sub
error_movemessage:
MsgBox "ERROR! " & Err.Description
Resume exit_CommandButton1_Click

End Sub

我四处寻找这个难题的碎片,但最终没有成功。提前致谢!

更新:

Private Sub getselecteditem_click()

Dim oApp As New Outlook.Application
Dim oExp As Outlook.Explorer
Dim oSel As Outlook.Selection
Dim oItem As Object

    Set oExp = oApp.Application
    Set oSel = oExp.Selection

        For i = 1 To oSel.Count

            Set oItem = oSel.Item(i)
                If oItem.Class = olMail Then
                End If
         Next i

End Sub

Sub oItem_PropertyChange(ByVal Name As String)
    Select Case Name
    Case "UnRead"
        If oItem.UnRead = False Then
        UserForm2.Show vbModal
        End If
    End Select
End Sub

但是还是不行。

我意识到我一直在使这比需要的更难。每当我加载恰好未读的邮件项目时,我可以简单地让它拉出提示。这是更新:

Private Sub Application_ItemLoad(ByVal Item As Object)
    If Item.Class = olMail Then
        If Item.UnRead Then
            UserForm2.Show vbModal
        End If
    End If
End Sub

首先,如果在发送邮件时将项目移动到不同的文件夹,那是自找麻烦 - 如果您希望将邮件保存在已发送邮件以外的文件夹中,请设置 MailItem.SaveSentMessageFolder 属性.

要在消息的阅读状态发生变化时移动消息,请跟踪 Explorer.SelectionChange 事件。当 SelectionChange 事件触发时,开始跟踪来自 Explorer.Selection 集合的多条消息的事件(可以有多个,但您可以只用第一个作为概念证明)。当 MailItem.PropertyChange 事件在未读 属性 上触发时,显示您的提示并移动消息。