Открытие диалогов Outlook без пометки их как прочитанных с помощью функции VBA MarkAsUnread - PullRequest
2 голосов
/ 20 октября 2019

Я несколько дней борюсь со следующей задачей:

Предполагается, что вы сгруппировали свои сообщения Outlook по беседам - ​​Как запретить помечать сообщениями из любой беседы read при двойном щелчке по главному заголовку разговора?

Код, который я до сих пор придумал:

  1. Я использую Application_ItemLoad, чтобы получить объект любой выбранной почты
  2. Затем myItem_Read для сохранения свойства UnRead выбранной почты, поскольку оно еще не доступно во время ItemLoad
  3. Наконец, я слушаю событие PropertyChange, чтобы изменить любоечитать почту непрочитано . Однако в ветви else ниже выражения mySelection.Item(1).GetConversation.MarkAsUnread происходит сбой неожиданно. Насколько я понимаю, mySelection.Item(1) выбирает объект заголовка беседы. Затем я пытаюсь получить объект беседы, используя GetConversation, и вызываю метод MarkAsUnread, который теоретически должен пометить все сообщения беседы как непрочитанные снова. Просто теория ... И я не знаю почему. Ваша помощь высоко ценится.

1.

Public WithEvents myItem As Outlook.mailItem

Private Sub Application_ItemLoad(ByVal Item As Object)
    If EventsDisable = True Then Exit Sub
    If Item.Class = olMail Then
            Set myItem = Item
     End If
End Sub

2.

Private Sub myItem_Read()
    If EventsDisable = True Then Exit Sub
    unReadWhenSelected = myItem.UnRead
End Sub

3.

Private Sub myItem_PropertyChange(ByVal Name As String)
    Dim mySelection As Selection
    Dim oConvHeader As Outlook.ConversationHeader
    Dim oConv As Outlook.Conversation

    If EventsDisable = True Then Exit Sub

    If Name = "UnRead" Then
        If unReadWhenSelected = True And myItem.UnRead = False Then

            Set mySelection = Outlook.ActiveExplorer.Selection.GetSelection(Outlook.OlSelectionContents.olConversationHeaders)


            If mySelection.Count = 0 Then

                myItem.UnRead = True
                myItem.Save

            Else         
                mySelection.Item(1).GetConversation.MarkAsUnread

            End If

        End If
    End If    
End Sub

Целая история для заинтересованных читателей:
Допустим, вы хотели открыть беседу, дважды щелкнув ее заголовок, при этом элементы беседы не были отмечены как read . Как сделать это самым элегантным способом? Я хочу использовать Outlook E-Mail в качестве задач и изменить смысл чтения почты, чтобы завершить задачу. Таким образом, я использую поисковые папки с опцией «показывать только непрочитанные сообщения». Как только я заканчиваю задание, я просто помечаю его как прочитанное макросом. Но для всех остальных случаев, когда я просто хочу читать почту и т. Д., Они должны оставаться непрочитанными.

До сих пор мне удалось написать макрос, чтобы выполнить это для отдельных сообщений электронной почты, которые не являются частьюразговоров. И когда дело доходит до разговоров, этот макрос работает для всех его элементов - но не для первого, также известного как запись заголовка основного разговора.

Редактировать:

Добавлено подтверждение концепциикод для фактической маркировки всех писем в разговоре как read . Не работает в моем сценарии, хотя. Итак, почему это не работает в моем примере кода выше?

Sub Testorino()

    Dim mySelection As Selection
    Set mySelection = Outlook.ActiveExplorer.Selection.GetSelection(Outlook.OlSelectionContents.olConversationHeaders)
    mySelection.Item(1).GetConversation.MarkAsUnread

End Sub

1 Ответ

1 голос
/ 21 октября 2019

Редактировать: MS говорит, что это не должно быть сделано вообще. Элементы Application.ItemLoad не предназначены для повторного использования. Обратите внимание на предупреждение: https://docs.microsoft.com/en-us/office/vba/api/outlook.application.itemload В нем говорится:

Объект Item, переданный в этом событии, не должен кэшироваться для любого использования вне области действия этого события.

Вместо этого вы сможете использовать события Items.ItemChange и Items.Add (после первоначальной установки его для элементов папки «Входящие») и игнорировать каждое непрочитанное изменение, если ваш макрос не запустил его.


СтарыйОтвет -> Кажется, это работает в Outlook 2016 в представлении беседы. Когда элемент закрыт, пометьте беседу как непрочитанную. Таким образом, он не пропускает первый элемент, который вы упомянули в своем комментарии. Если это мешает вашему макросу, я могу посмотреть, смогу ли я заставить его работать после открытия предмета, но я не продвинулся далеко с этим.

Public WithEvents myItem As Outlook.MailItem
Dim EventsDisable As Boolean
Dim UnreadWhenSelected As Boolean

Private Sub Application_ItemLoad(ByVal Item As Object)
    If EventsDisable = True Then Exit Sub
    If Item.Class = olMail Then
            Debug.Print ("Item_Load")
            Set myItem = Item
     End If
End Sub

Private Sub myItem_Close(Cancel As Boolean)
    If EventsDisable = True Then Exit Sub
    Debug.Print ("Item_Close")
    If UnreadWhenSelected Then
        ' Ignore all events fired while marking the conversation as unread
        EventsDisable = True
        myItem.GetConversation.MarkAsUnread
        EventsDisable = False
    Else
        ' Ignore all events fired while marking the conversation as read
        EventsDisable = True
        myItem.GetConversation.MarkAsRead
        EventsDisable = False
    End If
End Sub

Private Sub myItem_Read()
    If EventsDisable = True Then Exit Sub
    UnreadWhenSelected = myItem.UnRead
    Debug.Print ("Item_Read. Unread: " & UnreadWhenSelected)
End Sub
...