2016-04-26 2 views
1

Я просто обновился с Outlook 2010 до 2013 года, и у меня возникла проблема. У меня был, используя приведенный ниже код, настроить его так, чтобы все, что я удаляю или перемещаю в папку мусора, автоматически помечено как прочитанное.Перспектива 2013: Отметить элементы как прочитанные при удалении/перемещении в корзину

Option Explicit 
Dim WithEvents DeletedItems As Outlook.Items 

Private Sub Application_Startup() 
    Set DeletedItems = Session.GetDefaultFolder(olFolderDeletedItems).Items 
End Sub 

Private Sub DeletedItems_ItemAdd(ByVal Item As Object) 
    If Item.UnRead = True Then 
     Item.UnRead = False 
     Item.Save 
    End If 
End Sub 

Он работал как шарм в 2010 году в течение многих лет, но не работает на всех в 2013 году я не много удачи найти непосредственно применимый ответ, и я тоже новичок в VBA, чтобы иметь хорошая картина о том, как применить некоторые ответы, которые я встретил, поэтому любая помощь будет оценена по достоинству.

Cheers.

Редактировать: Вот код, который я использую, чтобы проверить, как Outlook видит прочитанный/непрочитанный статус удаленных писем. Я снял функцию Pause с here.

Private Sub DeletedItems_ItemAdd(ByVal Item As Object) 
    RememberItem Item 'Remember which email this is 
    Debug.Print "At start: " & Item.UnRead 'Should be True 
    If Item.UnRead = True Then 
     Item.UnRead = False 
     Item.Save 
    End If 
    Debug.Print "After mark read: " & Item.UnRead 'Should be False 
    Pause 10 'In separate module. Code from https://stackoverflow.com/a/30196332/2623367 
    Debug.Print "After pause: " & Item.UnRead 'Should be False unless item has become Unread 
End Sub 

Private Function RememberItem(Optional ByVal Item As Object) As Object 
'Allows check-up on the deleted item after event-handler is done with it. 
    Static oDeleted As Object 
    If Not Item Is Nothing Then Set oDeleted = Item 
    Set RememberItem = oDeleted 
End Function 

Private Sub CheckStatus() 
    Dim CheckItem As Object 
    Set CheckItem = RememberItem 
    Debug.Print "Follow-up check: " & CheckItem.UnRead 'Should be False 
End Sub 

Выход я получаю от этого:
- При запуске: True (пункт непрочитанные - это правильно)
- После того, как метка чтения: Ложные (пункт читается - это может быть или не быть правильно)
- После паузы: Ложные (пункт читается - это неправильно)
- Последующий контроль: Ложные (пункт читается - это неверно)


UPDATE:

Следуя за этим на случай, если кто-нибудь встретит его позже. Ответ, отмеченный как работа, разрешил мою проблему, хотя я иногда все еще видел какое-то странное поведение. Немного больше копаний показал, что основной причиной моей проблемы была проблема синхронизации между Outlook и сервером электронной почты. Outlook удалит что-то, но синхронизация будет ужасной, и похоже, что Outlook вытаскивал обновления с сервера, прежде чем отправлять свои собственные обновления. Похоже, что эти расхождения заставили Outlook потерять информацию о том, какие данные должны быть удалены.

Мое рабочее место использует Google Apps в качестве своего поставщика электронной почты, и я настроил все в Outlook с правильными настройками IMAP, но Google и Outlook не играет хорошо. Удалось устранить все непредсказуемое поведение, используя выбранный ответ и Outlook syncing tool for Google Apps. Также подтвердил, что мой исходный код ведет себя так же, как и при использовании в сочетании с инструментом синхронизации Google Apps.

Я должен был осознать намного раньше, что проблема может заключаться в том, что проблема с Google и Outlook в основном связана с ошибкой, но мне это даже не приходило в голову, поэтому я ранее не упомянул компонент Google этого уравнения. Надеемся, это обновление спасет кого-то еще, что проблема!

+0

Есть ли какие-либо сообщения об ошибках? Что происходит, когда элемент помещается в папку удаленных элементов? Выполняется ли код? – OpiesDad

+0

Я тестировал этот код в Outlook 2013, и он работал на меня. – OpiesDad

+0

Не забыли ли вы включить макросы при открытии Outlook? – OpiesDad

ответ

0

Я не был в состоянии выяснить точный вопрос вы имеете, как я не могу повторить его, но попробуйте это:

Option Explicit 

Dim WithEvents MainFolder As Outlook.Folder 

Private Sub Application_Startup() 
    Set MainFolder = Session.GetDefaultFolder(olFolderInbox) 
End Sub 


Private Sub MainFolder_BeforeItemMove(ByVal Item As Object, ByVal MoveTo As MAPIFolder, Cancel As Boolean) 

    If MoveTo.Name = Session.GetDefaultFolder(olFolderDeletedItems).Name And Item.UnRead = True Then 
     Item.UnRead = False 
     Item.Save 
    End If 
End Sub 
+0

Это похоже на трюк! Огромное спасибо. Я очень ценю, что вы тратите время и силы, чтобы помочь мне. –

0

Это слишком длинный комментарий, но я смущен этой проблемой, поэтому я буду повторять ее своими словами, чтобы прояснить и показать процесс в шагах.

  1. Элемент будет удален, и может или не может быть прочитано.

  2. Процедура DeletedItems_ItemAdd автоматически вызывается.

    • Похоже, что у вас могут возникать проблемы с этим вызовом иногда, но это не ваша главная проблема.
  3. Item.UnRead - выход. Кажется, это работает.

  4. Сообщение проверено, не видно ли оно, используя свойство Item.UnRead. Это вернет False, если прочитано, и True, если не прочитано. Item.UnRead затем устанавливается в False если было True. Если он уже был False, он остается False. На этом этапе сообщение EVERY должно иметь свойство Item.UnRead, равное False, что фактически указывает, что элемент был прочитан.

  5. Item.UnRead - выход.

    • То, что я интерпретирую из вашего вопроса, состоит в том, что это всегда False, что означает, что элемент читается. На шаг 4, я считаю, что ДОЛЖЕН быть False.
    • Ваше примечание предполагает, что это «может быть или не быть правильным», но я не понимаю, когда это неверно.
  6. Существует пауза.

  7. Item.UnRead - выход.

    • Ваше примечание предполагает, что оно имеет значение False, указывая, что элемент был прочитан. Вы считаете, что это неверно. Я не понимаю, почему.
  8. Выполняется последующая проверка, за пределами обычной процедуры. Я буду считать, что код работает правильно и что проверено правильное сообщение. Снова отметим, что Item.UnRead - False, показывая, что сообщение было прочитано, и укажите, что это неверно. Опять же, я не понимаю, почему это неверно.

Если мой анализ ошибочен, пожалуйста, поправьте, так что я могу помочь. Как и я, я не могу понять проблему. Кажется, что код пытается установить каждое сообщение для чтения, установив для свойства Item.UnRead значение False. Каждая проверка, которую я вижу, возвращает False. Какое поведение ожидается?

+0

Ваш анализ верный; Я просто не очень хорошо объясняю себя, и ваше терпение и помощь очень ценятся. Причина, по которой я говорю, что возврат неверен, заключается в том, что при проверке Item.UnRead программно возвращает FALSE - элемент читается - пользовательский интерфейс показывает его как непрочитанный: выделено жирным шрифтом при поиске в корзине мусора и добавлен в счетчик непрочитанных элементов в Панель навигации. Если я открою элемент или выделите его и пометьте вручную как прочитанный, пользовательский интерфейс затем изменится, чтобы показать элемент как прочитанный. –

+0

Причина, по которой я написал «может быть, а может и не быть правильно», состоит в том, что в момент, когда элемент перемещается в корзину, количество экземпляров непрочитанных элементов для этой папки не увеличивается, но это неизбежно. Я говорю «может или не могу», потому что я не уверен, что это означает, что он был перемещен, помечен как прочитанный, чтобы он не отображался в счетчике, а затем вернулся к непрочитанному состоянию или если эта небольшая задержка является результатом задержки в обновлении счетчика. –

Смежные вопросы