2017-01-25 4 views
1

J'ai une macro Outlook qui a du code pour récupérer les règles, qui fonctionne sur Outlook 2013 mais ne fonctionne pas sur une autre machine qui exécute Outlook 2016.Outlook 2016 vba Application.Session.DefaultStore.GetRules() ne retourne pas de règles

Le code est:

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 

Le problème selon mon débogage, est dans l'objet colRules retour. En 2016, il montre qu'il a 26 articles, mais contient aucun: (debug view image in 2016)

enter image description here

sur les perspectives 2013, ce même objet affiche tous les 26 éléments (règles): (debug view image in 2013)

enter image description here

Autres observations:

  • L'assistant de règles affiche correctement toutes les 26 règles sur les deux machines;
  • Certaines des règles ont été définies sur l'ordinateur exécutant Outlook 2013; elles affichent donc (pour les autres ordinateurs) dans l'assistant de règles 2016;
  • OutlookSpy Store -> Fonctions -> getRules renvoie le même résultat: (ne peut pas poster encore d'image ... pas assez réputation)

EDIT - J'ai trouvé la raison du problème, mais pas la solution ... La raison pour laquelle les choses ne marchent pas est que l'objet rules contient des règles "provenant d'un autre ordinateur". J'ai supprimé toutes les règles marquées «d'un autre ordinateur» pour tester et réexécuter la macro. Maintenant, il a trouvé toutes les règles restantes. Idem pour OutlookSpy. Donc, quelque chose est cassé dans la mise en œuvre des règles de Microsoft. Bien sûr, je ne peux pas rester comme ça parce que, comme c'est une boîte aux lettres d'échange, elle a effectivement supprimé les règles de l'autre ordinateur ... J'ai testé cela sur un autre compte et j'ai obtenu le même résultat qui prouve que l'API Outlook ne peut pas gérer les règles. Quelqu'un at-il des solutions de rechange ou des solutions de rechange? @Dmitry?

+0

Voyez-vous les règles sur le niveau MAPI dans OutlookSpy (http://www.dimastr.com/outspy)? Accédez au dossier Boîte de réception, cliquez sur le bouton IMAPIFolder, accédez à l'onglet PR_RULES_TABLE (si visible). –

+0

Dmitry, je ne suis pas familier avec OutlookSpy, mais je l'ai ajouté et suivi vos instructions, mais dans la fenêtre qui apparaît il n'y a pas d'onglet avec ce nom. –

+0

J'ai tripoté plus avec OutlookSpy. Si je clique sur "Store" puis sur l'onglet "Functions" je clique sur "GetRules", j'obtiens une fenêtre qui dit qu'il y a 26 règles, mais aucune d'entre elles n'apparaît. Donc, fondamentalement, c'est la même chose. Je vais ajouter cette capture d'écran au message original. –

Répondre

0

Veuillez essayer la macro ci-dessous que j'ai créée, après un combat, pour m'aider à comprendre où se trouvent mes règles dans mon installation d'Outlook 2016, car elles ne correspondaient pas à ce que je pensais.

Tous sauf deux de mes magasins génèrent le message suivant: "440 Ce magasin ne prend pas en charge les règles. Impossible de terminer l'opération. "Pour tous ces magasins, les règles sont dans le magasin par défaut" fichier de données Outlook ". Mais un magasin contient ses propres règles.

Avec mon installation Outlook, le magasin avec ses propres règles a une extension de "OST" indiquant qu'il s'agit d'un magasin hors ligne. "Outlook data file" et tous les autres magasins ont une extension de "PST".

Je voudrais savoir ce que cette macro génère pour vous. Vos règles sont-elles dans un magasin OST et non dans le magasin par défaut, comme prévu?

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

J'ai utilisé quelque chose de similaire pour boucler les magasins et obtenir les règles de chacun et cela n'a toujours pas fonctionné. J'ai 3 magasins et l'un d'eux échoue complètement quand j'essaye d'obtenir les règles, l'autre a 0 règles et le premier dit qu'il a 26 règles mais il n'y a aucun article. Je vous dois au moins essayer votre code - ainsi posterai sous peu résultats ... –

+0

Donc, je l'ai essayé et a eu une erreur d'exécution - il était prévu: le code échoue dans la ligne: Pour chaque RuleCrnt Dans ColRules. Cela parce que ColRules est vide, mais le nombre est 26. –

+0

Jetez un oeil à l'image que j'ai fourni à partir du débogueur.Il montre la structure de colRules. C'est évidemment un bug de Microsoft. La question est: existe-t-il un autre moyen de l'afficher? –