Filtre myItems.Restrict Outlook VBA

Bonjour,

Je souhaite faire un tri sur les emails dans la boite de réception Outlook. Je veux les emails catégorisés (par exemple DANEMARK) qui sont lus et qui sont dans la boite de réception depuis plus de 5 jours (Date Actuelle - Date de réception Email > 5 jours).

Le dernier filtre j'ai du mal... Voici le code :

Set Mes_Emails_Categorises = myItems.Restrict("[Categories] = " & CStr(MaCategorie) & " AND [UnRead] = False AND " & CDbl(DateDiff("dd:mm:yyyy hh:mm", Now, "dd:mm:yyyy hh:mm", [ReceivedTime])) & " > 5")

Pouvez-vous m'aider ?

Je vous remercie d'avance

Bonjour yoelto,

Je pense que tu as mal utilisé la fonction DateDiff, de cette manière le résultat devrait être plus concluant :

Set Mes_Emails_Categorises = myItems.Restrict("[Categories] = " & CStr(MaCategorie) & " AND [UnRead] = False AND " & CDbl(DateDiff("d", [ReceivedTime], Now)) & " > 5")

J'avoue ne pas avoir essayer les filtres directement, j'ai juste corrigé le DateDiff(). Est-ce que de cette manière ça marche chez toi ?

Bonne fin de journée,

Baboutz

Bonjour,

Merci pour ta réponse.

J'ai une Incompatibilité de Type...

Bonjour yoelto,

Je me suis plongé dans le sujet, voici ce qui devrait marcher chez toi, ça marche chez moi :

Set Mes_Emails_Categorises = myItems.Restrict("[Categories] = " & CStr(MaCategorie) & " AND [UnRead] = False AND [ReceivedTime] < '" & DateValue(DateAdd("d", -5, Now())) & "'")

Si cela répond à ta problématique, n'hésite pas à clore le sujet :

Bonne journée,

Baboutz

Merci, ça fonctionne hyper bien. merci !!!

Merci pour ton aide ! J'ai un dernier problème. C'est à dire qu'il va appliquer le filtre (la restriction sur les emails) pour chaque catégorie car il parcourt une colonne où il y a les différentes catégories.

Pour chaque catégories il doit me ranger les emails en question sauf que dans ma fonctiond e rangement ça marche que pour une seule catégorie... dès qu'il change de catégorie ca ne fonctionne pas.

Global myFolderDestination As Outlook.MAPIFolder

Set myFolderDestination = myFolder.Folders(CStr(WS_Parametres.Cells(ligne, 2))).Folders(CStr(WS_Parametres.Cells(ligne, 3)))

Ca bloque par rapport a cette ligne... et j'ai ce message "Impossible de trouver l'objet"... comme si l'objet n'était pas vidé et restait avec l'ancienne catégorie..

pb

Merci pour votre aide !

Top !

Tu lances cette macro depuis Outlook ou depuis un fichier Excel ?

Peux-tu me redonner le code complet pour effectuer l'opération ?

PS: Si tu es sur Excel, pourquoi lancer la macro depuis Excel et non pas directement depuis Outlook ???

Merci ! Ca bloque dans la fonction pour la catégorie Bulgarie chez moi car j'ai des emails catégorisés AZQORE.

Global myFolderDestination As Outlook.MAPIFolder

Set myFolderDestination = myFolder.Folders(CStr(WS_Parametres.Cells(ligne, 2))).Folders(CStr(WS_Parametres.Cells(ligne, 3)))

J'ai mis la macro sur Excel pour pouvoir partager le fichier a l'ensemble des collaborateurs comme ca ils pourront aussi executer cette macro !

Merci pour ton aide :)

Re,

Premièrement quelques remarques par rapport à la gestion de ta macro : je ne pense vraiment pas qu'utiliser Excel pour exécuter cette macro soit le plus optimal. Il faudra ouvrir un fichier Excel à chaque fois pour exécuter la macro, si quelqu'un est déjà dessus, ça ne marchera pas...

Je pense que le plus simple, est de créer une mini procédure en expliquant à l'utilisateur comment installer la macro, une fois installée, elle peut être lancée depuis Outlook très facilement... Il suffit de créer un bouton dans le bandeau, l'opérateur n'aura qu'à cliquer sur le bouton pour trier ses mails.

Exemple de bouton :

image

Mais il faut tout de même une base de donnée pour pouvoir trier correctement les mails dans les bons dossiers. C'est pourquoi, je garderai un fichier Excel avec un tableau connaissant l'arborescence des dossiers.

J'ai re-écrite ta macro, voilà comment j'ai procédé :

  • J'ai gardé ton fichier Excel avec un tableau pour l'arborescence.
    • Avoir ce fichier sans lancer la macro dessus permet d'avoir une maintenance aisée de celui-ci. Ainsi, si un jour tu dois rajouter des dossiers, il ne te reste qu'à les rajouter dans ton tableau.
    • Tu mets ce fichier Excel sur le réseau de ton entreprise et le tour est joué...
  • J'ai créé une macro sur outlook
    • Cette macro ne fait que lire les données du tableau Excel puis le ferme
    • Cette macro filtre et trie les mails aux bons endroits
    • Voilà, c'est terminé !

La macro VBA pour Outlook à placer dans un nouveau module :

Sub Rgmt()

    Dim oNs As Outlook.NameSpace
    Dim oBoiteRecpt As Outlook.MAPIFolder
    Dim oFiltre As Outlook.Items
    Dim oDossierDest As Outlook.MAPIFolder
    Dim eSrc As Workbook
    Dim arr() As Variant
    Dim i As Integer, j As Integer

    Set eSrc = Workbooks.Open("C:\Users\XXXX\Downloads\rangement-emails.xlsm", True, True) 'À modifier

    arr() = eSrc.Worksheets("Feuil1").Range("Tbl_Paramètres2").Value 'À modifier
    eSrc.Close False

    Set eSrc = Nothing

    Set oNs = Application.GetNamespace("MAPI")
    Set oBoiteRecpt = oNs.GetDefaultFolder(olFolderInbox)

    For i = 1 To UBound(arr)
       Set oFiltre = oBoiteRecpt.Items.Restrict("[Categories] = '" & arr(i, 1) & "' AND [UnRead] = False AND [ReceivedTime] < '" & DateValue(DateAdd("d", -5, Now())) & "'")

        For j = oFiltre.Count To 1 Step -1
            If arr(i, 3) = "" Then
                Set oDossierDest = oBoiteRecpt.Folders(arr(i, 2))
            ElseIf arr(i, 4) = "" Then
                Set oDossierDest = oBoiteRecpt.Folders(arr(i, 2)).Folders(arr(i, 3))
            Else
                Set oDossierDest = oBoiteRecpt.Folders(arr(i, 2)).Folders(arr(i, 3)).Folders(arr(i, 4))
            End If
            oFiltre(j).Move oDossierDest
        Next j

    Next

    Set oDossierDest = Nothing
    Set Items = Nothing
    Set oFolder = Nothing
    Set oNs = Nothing

End Sub

Le fichier Excel :

J'ai créé un tableau plus petit pour faire des essais en interne, je l'ai laissé pour te donner une idée.

J'ai utilisé des tableaux structurés, il faut vraiment avoir le reflexe d'utiliser cet outil qui est vraiment très pratique.

Dis moi si ça marche

Bonne journée,

Baboutz

PS: Si la macro marche, je ne pense pas pour autant qu'elle soit terminée.. Que se passe-t-il si un dossier ou sous-dossier n'est pas créer chez l'opérateur qui exécute la macro ? Que se passe t'il si la catégorie n'existe pas ? Ça risque deplanter...

Merci pour ton aide. Je vois ce que tu veux dire mais c'est un choix de passer par fichier Excel. la macro s'executera sur une boite email partagee. Tout le monde aura la meme arborescence dans les dossiers.

Je pensais utiliser ce que j'ai fait.

En fait, je ne comprends pas pourquoi dès la deuxième catégorie qui est traitée dès que j'ai cette ligne qui est execute

Set myFolderDestination = myFolder.Folders(CStr(WS_Parametres.Cells(ligne, 2))).Folders(CStr(WS_Parametres.Cells(ligne, 3)))

j'ai une erreur... Il indique "Echec de l'opération. Impossible de trouver un objet".

A ce moment la "myFolderDestination" vaut toujours ce qui lui a ete deja passé à la premiere catégorie...

Sais-tu comment je peux résoudre ce problème ? Merci :)

Aurez-vous une réponse à ma question? Merci bien :)

Bonjour,

Je suis un humain comme beaucoup, j'aide bénévolement, ai-je le droit de me reposer ?

Ça aurait été bien de s'intéresser un minimum à ce que j'ai fait hier, j'ai mis un peu de temps. En regardant 5min, tu aurais peut-être remarqué que c'est très rapidement modifiable pour faire tourner cette macro sur Excel...

Voilà ton fichier, la macro est dans le module Rangement_mails. Il suffit de modifier le nom de ta feuille et le nom du tableau structuré pour adapter ça à ton besoin.

Elle fonctionne chez moi avec le petit tableau que j'avais créé pour l'occasion.

Bonne journée,

Baboutz

Re,

Un retour ? As-tu réussi à utiliser la macro ou bien ça bloque toujours ?

Bonjour Merci pour le retour.

Je vais tester là et je te dis :)

Bonjour,

Merci pour ton explication,

J'ai le même problème. A la deuxième categorie qu'il va traiter il plante sur cette ligne lors de l'assignation du dossier de rangement :

Set myFolderDestination = myFolder.Folders(CStr(WS_Parametres.Cells(ligne, 2))).Folders(CStr(WS_Parametres.Cells(ligne, 3)))

Il affiche :

image

J'ai l'impression que l'objet est déjà rempli par l'ancien dossier de rangement pour la premiere categorie qui a ete traitée...

Comment faire ?

Merci bien !

Re,

Set myFolderDestination = myFolder.Folders(CStr(WS_Parametres.Cells(ligne, 2))).Folders(CStr(WS_Parametres.Cells(ligne, 3)))

Cette ligne de code n'existe pas dans la macro que j'ai écrite.

Il te suffit d'utiliser la macro dans le module qui s'appelle Rangement_mails. C'est cette macro que j'ai écrite. Mais avant de l'utiliser, il faut modifier le code à cet endroit :

arr() = ThisWorkbook.Worksheets("Feuil1").Range("Tbl_Paramètres2").Value

Tu remplaces "Feuil1" par le nom de ta feuille ou il y a ton tableau, et tu remplaces "Tbl_Paramètres2" par le nom du tableau structuré correspondant.

Une fois fait, tu peux exécuter la macro et me dire si c'est ok

Merci.

Je viens de retester. Il affiche :

image

Et l'erreur est a cette ligne :

Set oDossierDest = oBoiteRecpt.Folders(arr(i, 2))

C'est le même problème. Merci à toi.

Saurais-tu me dire sur quelle catégorie il bloque ? Toujours "BULGARIE" ?

Pourrais-tu me réexpliquer cette phrase que tu as dis un peu plus tôt :

Merci ! Ca bloque dans la fonction pour la catégorie Bulgarie chez moi car j'ai des emails catégorisés AZQORE.

Oui c'est exactement ca j'ai des emails qui sont catégorises AZQORE et d'autres BULGARIE pour mon test (qui sont pris en compte par le filtre).

Quand j'executais ma macro, la mienne j'arrive a executer le code pour la premiere categorie AZQORE. La deuxième n'a aucun email donc pas de traitement. La troisième catégorie Bulgarie, comme j'ai un email, c'est la que ca bloque avec le message comme quoi aucun objet n'est trouvé.

Sur ta macro je n'arrive pas a executer le code pour la premiere categorie AZQORE.

Voila le souci...

Je pense que c'est du à la variable du dossier de rangement... ? Comme si l'objet etait deja assigné et qu'on ne pouvait plus lui donner une nouvelle valeur...

Je viens de comprendre mon erreur. Problème de paramètrage du dossier dans la boite de réception.

Un grand merci à toi pour ton aide et ton temps !

C'est très gentil

Rechercher des sujets similaires à "filtre myitems restrict outlook vba"