1 votes

Comment appliquer une macro sur plusieurs dossiers Outlook à partir du module ThisOutlookSession

En utilisant les informations de ce site, j'ai pu créer une macro pour trier les messages dans un sous-dossier "nom de l'expéditeur", lorsque je déplace le message dans le parent. par exemple:

  1. Je reçois un message dans ma boîte de réception.

  2. Je déplace le message dans le dossier "suivi"

  3. S'il n'y a pas de sous-dossier nommé nom de l'expéditeur il est créé

    3a. Le message est immédiatement déplacé dans le dossier suivi/nom de l'expéditeur

Le code ci-dessous effectue ces étapes parfaitement. Ce que je dois faire maintenant, c'est appliquer le code à d'autres dossiers. Pour l'instant, mon code se trouve dans le module "ThisOutlookSession", car je veux qu'il fonctionne automatiquement.

Ma question est: Comment appliquer la macro à plusieurs sous-dossiers de la boîte de réception ? c'est-à-dire:

boîte de réception - non appliquée ici

  suivi - appliqué ici
  équipe       - appliqué ici
  fournisseurs    - appliqué ici

Voici le code que j'ai jusqu'à présent:

Private WithEvents Items As Outlook.Items

Private Sub Application_Startup()
Dim olApp As Outlook.Application
Dim objNS As Outlook.NameSpace

  ' set object reference to default Inbox
  Set olApp = Outlook.Application
  Set objNS = olApp.GetNamespace("MAPI")
  Set Items = objNS.GetDefaultFolder(olFolderInbox).Folders("Follow-up").Items
End Sub

Private Sub Items_ItemAdd(ByVal item As Object)
' se déclenche lorsque un nouvel élément est ajouté à la boîte de réception par défaut
' (par Application_Startup)

  On Error GoTo ErrorHandler

  Dim Msg As Outlook.MailItem
  Dim olApp As Outlook.Application
  Dim objNS As Outlook.NameSpace
  Dim targetFolder As Outlook.MAPIFolder
  Dim senderName As String

  ' ne rien faire pour les éléments non-Mailitems
  If TypeName(item) <> "MailItem" Then GoTo ProgramExit

  Set Msg = item

  ' déplacer l'e-mail reçu vers le dossier cible en fonction du nom de l'expéditeur
  senderName = Msg.senderName

  If CheckForFolder(senderName) = False Then  ' Le dossier n'existe pas
    Set targetFolder = CreateSubFolder(senderName)
  Else
    Set olApp = Outlook.Application
    Set objNS = olApp.GetNamespace("MAPI")
    Set targetFolder = objNS.GetDefaultFolder(olFolderInbox).Folders("suivi").Folders(senderName)
  End If

  Msg.Move targetFolder

ProgramExit:
  Exit Sub
ErrorHandler:
  MsgBox Err.Number & " - " & Err.Description
  Resume ProgramExit
End Sub

Function CheckForFolder(strFolder As String) As Boolean
' recherche le sous-dossier du dossier spécifié, retourne TRUE si le dossier existe.
Dim olApp As Outlook.Application
Dim olNS As Outlook.NameSpace
Dim olInbox As Outlook.MAPIFolder
Dim FolderToCheck As Outlook.MAPIFolder

Set olApp = Outlook.Application
Set olNS = olApp.GetNamespace("MAPI")
Set olInbox = olNS.GetDefaultFolder(olFolderInbox).Folders("suivi")

' essayer de définir une référence d'objet au dossier spécifié
On Error Resume Next
Set FolderToCheck = olInbox.Folders(strFolder)
On Error GoTo 0

If Not FolderToCheck Is Nothing Then
  CheckForFolder = True
End If

ExitProc:
Set FolderToCheck = Nothing
Set olInbox = Nothing
Set olNS = Nothing
Set olApp = Nothing
End Function

Function CreateSubFolder(strFolder As String) As Outlook.MAPIFolder
' suppose que le dossier n'existe pas, donc n'appeler que si l'appelant sait que
' le dossier n'existe pas; renvoie un objet dossier à l'appelant
Dim olApp As Outlook.Application
Dim olNS As Outlook.NameSpace
Dim olInbox As Outlook.MAPIFolder

Set olApp = Outlook.Application
Set olNS = olApp.GetNamespace("MAPI")
Set olInbox = olNS.GetDefaultFolder(olFolderInbox).Folders("Suivi")

Set CreateSubFolder = olInbox.Folders.Add(strFolder)

ExitProc:
Set olInbox = Nothing
Set olNS = Nothing
Set olApp = Nothing
End Function

0voto

cowboyuser Points 11

Si quelqu'un trouve ceci et se demande, j'ai pu le comprendre par moi-même. Je suis encore assez nouveau dans ce domaine, et je ne savais pas que je pouvais modifier la balise "Items" pour définir ce que je regardais, puis définir la nouvelle variable pour pointer vers son propre dossier. Une fois que j'ai fait ça, j'ai pu ajouter une sous-routine pour chaque dossier et j'ai réussi.

Private WithEvents Corporate As Outlook.Items
Private WithEvents Subsidiary As Outlook.Items
Private WithEvents ServDsk As Outlook.Items
Private WithEvents Vendors As Outlook.Items

Public Sub Application_Startup()
Dim olApp As Outlook.Application
Dim objNS As Outlook.NameSpace

  ' définir la référence d'objet sur la boîte de réception par défaut
  Set olApp = Outlook.Application
  Set objNS = olApp.GetNamespace("MAPI")
  Set DefFol = objNS.GetDefaultFolder(olFolderInbox)
  Set Corporate = DefFol.Folders("Corporate Teammates").Items
  Set Subsidiary = DefFol.Folders("Subsidiary").Items
  Set ServDsk = DefFol.Folders("Service Desk").Items
  Set Vendors = DefFol.Folders("Vendors").Items

End Sub

Private Sub Corporate_ItemAdd(ByVal up As Object)

' se déclenche lorsque nouvel élément ajouté à la boîte de réception par défaut
' (par Application_Startup)

  On Error GoTo ErrorHandler

  Dim Msg As Outlook.MailItem
  Dim olApp As Outlook.Application
  Dim objNS As Outlook.NameSpace
  Dim targetFolder As Outlook.MAPIFolder
  Dim senderName As String
  Dim dirstr As String
  Dim strDomain As String

  ' ne rien faire pour les éléments non-Mailitems
  If TypeName(up) <> "MailItem" Then GoTo ProgramExit

  Set Msg = up

  Set olApp = Outlook.Application
  Set objNS = olApp.GetNamespace("MAPI")

  ' déplacer l'e-mail reçu vers le dossier cible en fonction du nom de l'expéditeur
  senderName = Msg.senderName
  dirstr = "Corporate Teammates"

  If CheckForFolder(senderName, dirstr) = False Then ' Le dossier n'existe pas
    Set targetFolder = CreateSubFolder(senderName, dirstr)
  Else
   ' Set olApp = Outlook.Application
   ' Set objNS = olApp.GetNamespace("MAPI")
    Set targetFolder = objNS.GetDefaultFolder(olFolderInbox).Folders(dirstr).Folders(senderName)
  End If

  Msg.UnRead = False
  Msg.Move targetFolder

ProgramExit:
  Exit Sub
ErrorHandler:
  MsgBox Err.Number & " - " & Err.Description & dirstr
  Resume ProgramExit
End Sub

Private Sub Subsidiary_ItemAdd(ByVal up As Object)

' se déclenche lorsque nouvel élément ajouté à la boîte de réception par défaut
' (par Application_Startup)

  On Error GoTo ErrorHandler

  Dim Msg As Outlook.MailItem
  Dim olApp As Outlook.Application
  Dim objNS As Outlook.NameSpace
  Dim targetFolder As Outlook.MAPIFolder
  Dim senderName As String
  Dim dirstr As String

  ' ne rien faire pour les éléments non-Mailitems
  If TypeName(up) <> "MailItem" Then GoTo ProgramExit

  Set Msg = up

  ' déplacer l'e-mail reçu vers le dossier cible en fonction du nom de l'expéditeur
  senderName = Msg.senderName
  dirstr = "Subsidiary"

  If CheckForFolder(senderName, dirstr) = False Then ' Le dossier n'existe pas
    Set targetFolder = CreateSubFolder(senderName, dirstr)
  Else
    Set olApp = Outlook.Application
    Set objNS = olApp.GetNamespace("MAPI")
    Set targetFolder = objNS.GetDefaultFolder(olFolderInbox).Folders(dirstr).Folders(senderName)
  End If

  Msg.UnRead = False
  Msg.Move targetFolder

ProgramExit:
  Exit Sub
ErrorHandler:
  MsgBox Err.Number & " - " & Err.Description & dirstr
  Resume ProgramExit
End Sub

Private Sub ServDsk_ItemAdd(ByVal up As Object)

' se déclenche lorsque nouvel élément ajouté à la boîte de réception par défaut
' (par Application_Startup)

  On Error GoTo ErrorHandler

  Dim Msg As Outlook.MailItem
  Dim olApp As Outlook.Application
  Dim objNS As Outlook.NameSpace
  Dim targetFolder As Outlook.MAPIFolder
  Dim folderName As String
  Dim dirstr As String

  ' ne rien faire pour les éléments non-Mailitems
  If TypeName(up) <> "MailItem" Then GoTo ProgramExit

  ' déplacer l'e-mail reçu vers le dossier cible en fonction du nom de l'expéditeur
  dirstr = "Service Desk"

' vérifie le sujet pour décider comment gérer le tri
Select Case True
   Case InStr(Msg.Subject, "Demande") > 0
    folderName = "Demandes"
   Case InStr(Msg.Subject, "Incident") > 0
    folderName = "Tickets"
   Case InStr(Msg.Subject, "Problème") > 0
    folderName = "Tickets"
   Case InStr(Msg.Subject, "Ouvert") > 0
    folderName = "Tickets"
   Case InStr(Msg.Subject, "tâche") > 0
    folderName = "Tâches"
   Case InStr(Msg.Subject, "Statut") > 0
    folderName = "Tickets"
   Case InStr(Msg.Subject, "APPROBATION") > 0
    folderName = "Demandes d'approbation OCH"
   Case InStr(Msg.Subject, "Demande") > 0
    folderName = "Demandes"
   Case InStr(Msg.Subject, "Maintenance") > 0
    folderName = "Maintenance"
   Case InStr(Msg.Subject, "Alerte") > 0
    folderName = "Alertes"
   Case InStr(Msg.Subject, "Avis") > 0
    folderName = "Alertes"
   Case InStr(Msg.Subject, "Rappel") > 0
    folderName = "Alertes"
End Select

  If CheckForFolder(folderName, dirstr) = False Then ' Le dossier n'existe pas
    Set targetFolder = CreateSubFolder(folderName, dirstr)
  Else
    Set olApp = Outlook.Application
    Set objNS = olApp.GetNamespace("MAPI")
    Set targetFolder = objNS.GetDefaultFolder(olFolderInbox).Folders(dirstr).Folders(folderName)
  End If

  Msg.UnRead = False
  Msg.Move targetFolder

ProgramExit:
  Exit Sub
ErrorHandler:
  MsgBox Err.Number & " - " & Err.Description & dirstr
  Resume ProgramExit
End Sub

Private Sub Vendors_ItemAdd(ByVal up As Object)

' se déclenche lorsque nouvel élément ajouté à la boîte de réception par défaut
' (per Application_Startup)

  On Error GoTo ErrorHandler

  Dim Msg As Outlook.MailItem
  Dim olApp As Outlook.Application
  Dim objNS As Outlook.NameSpace
  Dim targetFolder As Outlook.MAPIFolder
  Dim senderName As String
  Dim dirstr As String
  Dim strDomain As String

  ' ne rien faire pour les éléments non-Mailitems
  If TypeName(up) <> "MailItem" Then GoTo ProgramExit

  Set Msg = up

' supprime le nom de domaine de l'adresse de l'expéditeur
  If InStr(1, Msg.SenderEmailAddress, "@") > 0 Then
         strDomain = Right(Msg.SenderEmailAddress, Len(Msg.SenderEmailAddress) - InStr(Msg.SenderEmailAddress, "@"))
  End If

If CheckForFolder(senderName, strDomain) = False Then ' Le dossier n'existe pas
    Set targetFolder = CreateSubFolder(senderName, strDomain)
  Else
    Set olApp = Outlook.Application
    Set objNS = olApp.GetNamespace("MAPI")
    Set targetFolder = objNS.GetDefaultFolder(olFolderInbox).Folders("Vendors").Folders(strDomain)
End if

  Msg.UnRead = False
  Msg.Move targetFolder

ProgramExit:
  Exit Sub
ErrorHandler:
  MsgBox Err.Number & " - " & Err.Description & dirstr
  Resume ProgramExit
End Sub

Function CheckForFolder(strFolder As String, dirstr As String) As Boolean
' regarde le sous-dossier du dossier spécifié, renvoie TRUE si le dossier existe.
Dim olApp As Outlook.Application
Dim olNS As Outlook.NameSpace
Dim olInbox As Outlook.MAPIFolder
Dim FolderToCheck As Outlook.MAPIFolder

Set olApp = Outlook.Application
Set olNS = olApp.GetNamespace("MAPI")

Set olInbox = olNS.GetDefaultFolder(olFolderInbox).Folders(dirstr)

' essayer de définir une référence d'objet vers le dossier spécifié
On Error Resume Next
Set FolderToCheck = olInbox.Folders(strFolder)
On Error GoTo 0

If Not FolderToCheck Is Nothing Then
  CheckForFolder = True
End If

ExitProc:
Set FolderToCheck = Nothing
Set olInbox = Nothing
Set olNS = Nothing
Set olApp = Nothing

End Function

Function CreateSubFolder(strFolder As String, dirstr As String) As Outlook.MAPIFolder
' suppose que le dossier n'existe pas, donc appeler uniquement si l'appelant sait que
' le dossier n'existe pas ; renvoie un objet de dossier à l'appelant
Dim olApp As Outlook.Application
Dim olNS As Outlook.NameSpace
Dim olInbox As Outlook.MAPIFolder

Set olApp = Outlook.Application
Set olNS = olApp.GetNamespace("MAPI")

Set olInbox = olNS.GetDefaultFolder(olFolderInbox).Folders(dirstr)
Set CreateSubFolder = olInbox.Folders.Add(strFolder)

ExitProc:
Set olInbox = Nothing
Set olNS = Nothing
Set olApp = Nothing
End Function

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X