2017-01-25 3 views
1

У меня есть макрос перспективы, который имеет код для извлечения правил, который работает в Outlook 2010, но не работает на другой машине с перспективой 2016.Outlook 2016 vba Application.Session.DefaultStore.GetRules() не возвращает правила

код:

Set colRules = Session.DefaultStore.GetRules() 

    For Each oRule In colRules 
     ruleName = oRule.Name 
     If Left(ruleName, 21) = "AutoCategorize into *" Then 
      oRule.Execute (True) 
     End If 
    Next 

проблема в соответствии с моей отладки, в объект возвращаемые colRules. В 2016 году, это показывает, что он имеет 26 элементов, но содержит ни одно: (debug view image in 2016)

enter image description here

В Outlook 2013, тот же объект показывает все 26 элементов (правила): (debug view image in 2013)

enter image description here

Прочие наблюдения:

  • Мастер правил действительно корректно отображает все 26 правил на обеих машинах;
  • Некоторые из правил были определены на компьютере с перспективой 2013 года, поэтому они отображаются как (для другого компьютера) в мастере правил 2016;
  • OutlookSpy Магазин -> Функции -> GetRules возвращает тот же результат: (Не можете размещать изображения еще ... не хватает репутации)

EDIT - я нашел причину проблемы, но а не решение ... Причина не в том, что объект правил содержит правила «с другого компьютера». Я удалил все правила, отмеченные «с другого компьютера», чтобы протестировать, и перезапустите макрос. Теперь он нашел все остальные правила. То же самое для OutlookSpy. Так что что-то нарушается в реализации Microsoft правил. Конечно, я не могу оставаться таким, потому что, поскольку это почтовый ящик обмена, он фактически удалил правила с другого компьютера, а также ... Я протестировал это на другой учетной записи и получил тот же результат, который доказывает, что API перспективы не может обрабатывать правила. У кого-нибудь есть альтернативные решения или обходные пути? @Dmitry?

+0

Вы видите правила на уровне MAPI в OutlookSpy (http://www.dimastr.com/outspy)? Перейдите в папку «Входящие», нажмите кнопку «IMAPIFolder», перейдите на вкладку PR_RULES_TABLE (если она видна). –

+0

Dmitry, я не знаком с OutlookSpy, но я добавил его и выполнил ваши инструкции, однако в появившемся окне нет вкладки с этим именем. –

+0

Я больше поработал с OutlookSpy. Если я нажимаю «Сохранить», а затем на вкладке «Функции» я нажимаю «GetRules», я получаю окно, в котором говорится, что существует 26 правил, но ни один из них не появляется. Так что в основном это одно и то же. Я добавлю этот снимок экрана к исходному сообщению. –

ответ

0

Пожалуйста, попробуйте макрокоманду, под которой я создал после борьбы, чтобы помочь мне понять, где мои правила хранятся в моей установке Outlook 2016, потому что они не были там, где я думал.

Все, кроме двух моих магазинов, генерируют сообщение: «440 Этот магазин не поддерживает правила. Не удалось выполнить операцию ». Для всех этих магазинов правила находятся в хранилище данных« файл данных Outlook »по умолчанию. Но один магазин содержит свои собственные правила.

С моей установкой Outlook магазин со своими собственными правилами имеет расширение «OST», указывающее, что это автономный магазин. «Файл данных Outlook» и все другие магазины имеют расширение «PST».

Я хотел бы знать, что этот макрос генерирует для вас. Являются ли ваши правила в магазине OST, а не по умолчанию, как вы ожидаете?

Public Sub DemoRules() 

    Dim ColRules As Outlook.Rules 
    Dim ErrDesc As String 
    Dim ErrNum As Long 
    Dim InxStoreCrnt As Long 
    Dim RuleCrnt As Outlook.Rule 

    With Session 
    For InxStoreCrnt = 1 To .Stores.Count 
     With .Stores(InxStoreCrnt) 
     Debug.Print .DisplayName 
     Set ColRules = Nothing 
     On Error Resume Next 
     Set ColRules = .GetRules() 
     ErrNum = Err.Number 
     ErrDesc = Err.Description 
     On Error GoTo 0 
     If ErrNum <> 0 Then 
      Debug.Print " " & ErrNum & " " & ErrDesc 
     Else 
      If Not ColRules Is Nothing Then 
      If ColRules.Count = 0 Then 
       Debug.Print " no rules in this store" 
      Else 
       For Each RuleCrnt In ColRules 
       Debug.Print " " & RuleCrnt.Name 
       Next 
      End If 
      Else 
      Debug.Print " No error but GetRules returned Nothing" 
      End If 
     End If 
     End With 
     Set ColRules = Nothing 
    Next 
    End With 

End Sub 
+0

Я использовал что-то похожее на цикл над магазинами и получил правила каждого из них, и он все еще не работал. У меня есть 3 магазина, и один из них полностью терпит неудачу, когда я пытаюсь получить правила, а другой имеет 0 правил, а первый говорит, что у него есть 26 правил, но нет элементов. Я, по крайней мере, должен вам попробовать ваш код - так будет опубликован в скором времени результаты ... –

+0

Итак, я попробовал и получил ошибку времени выполнения - ожидалось: код не работает в строке: для каждого RuleCrnt в ColRules. Это потому, что ColRules пуст, но счет равен 26. –

+0

Взгляните на изображение, которое я предоставил от отладчика. Он показывает структуру colRules. Это, очевидно, ошибка Microsoft. Вопрос в следующем: есть ли другой способ заставить его отображать правила? –

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