IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Outlook Discussion :

Déplacement des mails et répertoires d'un dossier vers la boite de réception [OL-2016]


Sujet :

VBA Outlook

  1. #1
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut Déplacement des mails et répertoires d'un dossier vers la boite de réception
    Bonjour,

    Suite à la migration de la messagerie d'une entreprise vers Exchange, je rencontre énormément de soucis de mapping... C'est infernal et j'ai des centaines de boites à migrer. J'ai réussi en bricolant de gauche à droite mais là, je suis sur un souci dont la solution urgente réside dans le faite de faire une macro.
    La migration d'un compte me créé systématiquement un dossier Mailbox au lieu de me migrer les mails de Mailbox dans Inbox correspondant à la boite de réception. Le logiciel de migration est bogué et les mapping sont H.S.

    Je cherche donc une macro quitte à la réadapter (j'en ai fais une pour résoudre des soucis sur les contacts) qui me permettrait de :
    1. déplacer tout le contenu de Mailbox (mails et dossiers) dans le répertoire de réception de mail par défaut (Inbox ou boite de réception en fonction de la langue) ;
    2. de supprimer le répertoire Mailbox ;
    3. déplacer tout le contenu de send Items (mails et dossiers) dans le répertoire des messages envoyés de mail par défaut (send Items ou éléments envoyés en fonction de la langue) car des fois je me retrouve avec deux send Items ;
    4. de supprimer le répertoire send Items en trop.


    Merci d'avance, cela me sauvera la vie et me fera gagner énormément de temps.

    N.B. Certains me diront pourquoi ne pas le faire depuis le client lourd chez chaque utilisateur ? La réponse est que nous n'utiliserons pas de suite le client lourd pour d'autres soucis, donc ce sera qu'une utilisation par l'interface Web d'outlook sur laquelle il est impossible de faire un déplacement de tous les mails d'un dossier en une fois.

    Encore merci d'avance.

  2. #2
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Salut,

    Une macro VBA nécessitera la configuration de OUTLOOK pour le compte en question, ou du moins d'un compte qui aura les droits sur le ou les comptes en question.

  3. #3
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Mets cela dans Un Module d'un fichier Excel Avec une référence à "Microsoft Outlook 1x.0 Object Library"

    Dans la feuille active tu mets les noms des comptes dans la colonne A à partir de A2

    Il faut que ton compte ait les droits sur ces BOITES.

    La première boucle va servir à changer de boite (ta liste excel)
    la seconde traite "mailbox" puis "send items"
    ensuite il y a un traitement recursif sur les sous dossiers puis les éléments des dossiers pour les déplacer vers le bon dossier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
     
    Option Explicit
    Public myNewFolder As Outlook.MAPIFolder
    Public Tour As Double
     
    Sub MoveFolders()
    '---------------------------------------------------------------------------------------
    ' Procedure : MoveFolders
    ' Author    : Oliv
    ' Date      : 15/02/2018
    ' Purpose   :
    '---------------------------------------------------------------------------------------
    '
     
        Dim olFolder As Outlook.Folder
        Dim OL As Object
        Dim u, i, User, UserRecip As Recipient, UserStore
        If UCase(Application) = "OUTLOOK" Then
            Set OL = Application
        Else
            Set OL = CreateObject("outlook.application")
        End If
     
        Dim objNS As Outlook.Namespace
        Dim objFolderOrigine As Outlook.MAPIFolder
        Dim DossiersOrigine As Variant
        Dim DossiersCible As Variant
     
        DossiersOrigine = Array("Mailbox", "send Items")
        DossiersCible = Array(olFolderInbox, olFolderSentMail)
     
        Set objNS = OL.GetNamespace("MAPI")
     
        For u = 2 To Cells(Rows.Count, 1).End(xlUp).Row
     
            MsgBox Cells(u, 1).Value
            User = Cells(u, 1).Value
     
           On Error Resume Next
            Set UserRecip = objNS.CreateRecipient(User)
            Set UserStore = objNS.GetSharedDefaultFolder(UserRecip, olFolderInbox).Parent.Store
     
            If UserStore Is Nothing Or IsEmpty(UserStore) Then
                '            Set myNewFolder = UserStore.GetDefaultFolder(olFolderInbox)
                '            MsgBox myNewFolder.FolderPath
                Debug.Print User & ": inaccessible"
    Else
     
     
                For i = 0 To UBound(DossiersOrigine)
                    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderInbox).Parent.Folders(DossiersOrigine(i))
                    Set myNewFolder = UserStore.GetDefaultFolder(DossiersCible(i))
     
                    If objFolderOrigine Is Nothing Then Debug.Print DossiersOrigine(i) & ":Non trouvé dans " & objNS.GetDefaultFolder(olFolderInbox).Parent
                    If myNewFolder Is Nothing Then Debug.Print DossiersCible(i) & ":Non trouvé dans " & objNS.DefaultStore
     
                    If objFolderOrigine Is Nothing Or myNewFolder Is Nothing Then
     
                    Else
                        'MsgBox objFolderOrigine.FolderPath & vbCr & myNewFolder.FolderPath
     
                        Call ProcessFolderMove(objFolderOrigine, objFolderOrigine, myNewFolder, myNewFolder)
     
                    End If
                    Set objFolderOrigine = Nothing
                    Set myNewFolder = Nothing
                Next i
     
            End If
            Set UserRecip = Nothing
            Set UserStore = Nothing
        Next u
     
        Set objNS = Nothing
        Set objFolderOrigine = Nothing
        Set myNewFolder = Nothing
     
    End Sub
     
    Sub ProcessFolderMove(StartFolder As Outlook.MAPIFolder, objFolderOrigine As Outlook.MAPIFolder, DestinationParentFolder As Outlook.MAPIFolder, DestinationOrigine As Outlook.MAPIFolder)
        Tour = Tour + 1
        Dim objFolder As Outlook.MAPIFolder
        Dim destFolder As Outlook.MAPIFolder
        Dim myItem
        Dim n
        'Dim objItem As Object
        On Error Resume Next
     
        ' do something specific with this folder
        Debug.Print StartFolder.FolderPath, StartFolder.Folders.Count, StartFolder.Items.Count
        Debug.Print
     
        'on teste si on est à la racine de la BAL
        If InStr(3, StartFolder.FolderPath, "\") = 0 Then GoTo racine
        If StartFolder.FolderPath = objFolderOrigine.FolderPath Then GoTo racine
        If StartFolder.DefaultItemType = olMailItem Then
     
            '  MsgBox StartFolder.Name
     
     
            Set destFolder = DestinationParentFolder.Folders(StartFolder.Name)
            On Error GoTo 0
     
            If Not IsEmpty(destFolder) And Not destFolder Is Nothing Then
                For Each objFolder In StartFolder.Folders
                    On Error GoTo 0
                    Call ProcessFolderMove(objFolder, objFolderOrigine, destFolder, DestinationOrigine)
                Next
                For n = StartFolder.Items.Count To 1 Step -1
                    Set myItem = StartFolder.Items(n)
                    If myItem.Class <> olMail And myItem.Class <> olReport Then Stop: myItem.Display
     
                    myItem.Move destFolder
                Next n
                Debug.Print "Move " & StartFolder.FolderPath & " vers " & DestinationParentFolder.FolderPath
     
                If StartFolder.Items.Count = 0 Then StartFolder.Delete
     
            Else
                On Error Resume Next
                StartFolder.MoveTo DestinationParentFolder
                Debug.Print "Move " & StartFolder.FolderPath & " vers " & DestinationParentFolder.FolderPath
            End If
        End If
     
        Exit Sub
    racine:
        ' process all the subfolders of this folder
     
        For n = StartFolder.Folders.Count To 1 Step -1
            Set objFolder = StartFolder.Folders(n)
            On Error GoTo 0
            Call ProcessFolderMove(objFolder, objFolderOrigine, DestinationParentFolder, DestinationOrigine)
        Next n
        'process items
        For n = StartFolder.Items.Count To 1 Step -1
            Set myItem = StartFolder.Items(n)
            If myItem.Class <> olMail And myItem.Class <> olReport Then Stop: myItem.Display
     
            myItem.Move DestinationParentFolder
        Next n
        Set objFolder = Nothing
    End Sub

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Merci pour ton aide. Hier j'ai bricolé une fonction code qui est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    ' Fonction de déplacer le contenu de Mailbox dans la boite de réception
    Function DeplacementMailsDossiers(DossierFrom As String) As Boolean
        Dim NombreMailsDeplaces As Integer
        Dim NombreMailsDossiers As Integer
        Dim NombreAutres As Integer
     
        NombreMailsDeplaces = 0
        NombreMailsDossiers = 0
     
        Set myNameSpace = Application.GetNamespace("MAPI")
        Set myFolder = _
        myNameSpace.GetDefaultFolder(olFolderInbox).Parent.Folders(DossierFrom)
     
        Dim RepertoiresAVider As Outlook.Folder
     
        ' Déplacement des sous répertoires de From vers la boite de réception
        For Each RepertoiresAVider In myFolder.Folders
            ' MsgBox ("Nom dossier : " & RepertoiresAVider.Name)
            NombreMailsDossiers = NombreMailsDossiers + 1
            RepertoiresAVider.MoveTo myNameSpace.GetDefaultFolder(olFolderInbox)
        Next
     
     
        ' Déplacements des mails vers la boite de réception
        Dim i As Long
        Set RepertoireMailsAVider = myNameSpace.GetDefaultFolder(olFolderInbox).Parent.Folders(DossierFrom)
        Set Items = RepertoireMailsAVider.Items
        For i = Items.Count To 1 Step -1
            If TypeOf Items(i) Is MailItem Then
                NombreMailsDeplaces = NombreMailsDeplaces + 1
                Set Item = Items(i)
                Item.Move myNameSpace.GetDefaultFolder(olFolderInbox)
            Else
                NombreAutres = NombreAutres + 1
                Set Item = Items(i)
                Item.Move myNameSpace.GetDefaultFolder(olFolderInbox)
            End If
        Next
     
        MsgBox ("Nombre de mails déplacés : " & NombreMailsDeplaces & Chr(13) & _
                "Nombre de dossiers déplacés : " & NombreMailsDossiers & Chr(13) & _
                "Nombre autres éléments que mails déplacés : " & NombreAutres)
     
        If Items.Count = 0 Then
            MsgBox ("Le répertoire « " & DossierFrom & " » est vide, il va être supprimé")
            RepertoireMailsAVider.Delete
        End If
     
        DeplacementMailsDossiers = True
    End Function
    Néanmoins, pour le moment et tu l'as bien dit, la problématique est également que je dois me connecter sur un PC qui est sur le domaine ActiveDirectory (pas encore déployé sur mon réseau), me connecter sur chaque compte individuellement et reparametrer outlook pour lancer la macro. C'est lourd.
    Ta solution me plait bien, je vais regarder ton code et ton conseil de paramétrage. Je peux utiliser le compte administrateur normalement non ? Sinon, j'ai le mot de passe de tous les comptes à triturer, on peux les utiliser également ?


  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Bon, j'ai vu que je pouvais donner les full access à l'administrateur sur toutes les boites de mon exchange en powershell. Je vais faire cela et ainsi me connecter sur un compte avec admin pour tester la macro sur x comptes.

  6. #6
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    ok tiens moi au courant

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Bonjour,

    J'arrive à avancer, je bloque sur un dernier point. durant mes migrations, j'ai un Calendar qui se créé et je souhaite copier son contenu dans Calendrier.
    Le problème est que je n'arrive pas en VBA à lire son contenu.
    Mon Calendar est dans cette location : Location:\\NOM PRENOM\Calendrier\Calendar Mais impossible d'y accéder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderCalendar).Parent.Folders("Calendar")
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderCalendar).Folders("Calendar")
    ne donnent rien.

    Une idée ?

  8. #8
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Bonjour,
    Essaye cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderCalendar).Folders("Calendar")
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderCalendar).Parent.Folders("Calendrier").Folders("Calendar")
    quand tu cliques bouton droit sur le dossier/propriétés tu obtiens l'emplacement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "\\mabal\Calendrier" +" \ nom du dossier"

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Ni l'un ni l'autre ne fonctionne.

    Clic droit sur Calendar =>

    Type: Folder containing Calendar Items
    Location: \\NOM PRENOM\Calendrier
    C'est étrange

  10. #10
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderInbox).Parent.Folders("Calendrier").Folders("Calendar")

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Rien à faire, j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderCalendar).Folders("Calendrier").Folders("Calendar")
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderCalendar).Parent.Folders("Calendrier").Folders("Calendar")
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderCalendar).Folders("Calendar")
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderCalendar).Parent.Folders("Calendar")
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderInbox).Parent.Folders("Calendrier").Folders("Calendar") 
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderInbox).Parent.Folders("Calendar") 
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderInbox).Folders("Calendar")
    sans aucun succès et pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderCalendar)
     MsgBox (objFolderOrigine.Name)
    donne
    Calendrier

  12. #12
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    ca donne quoi cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderCalendar)
     
    for each truc in objFolderOrigine .folders
    debug.print  truc & vbcr & "[" & truc.folderpath & "]"
     MsgBox truc & vbcr & "[" & truc.folderpath & "]"
     
    next truc

    edit ps: dans mon code initial attention à cette ligne qui n'est pas compatible avec les calendriers ou contacts
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If StartFolder.DefaultItemType = olMailItem Then

  13. #13
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Il ne se passe rien. ça ne passe pas dans le for each.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Set objFolderOrigine = UserStore.GetDefaultFolder(olFolderCalendar)
    Dim truc As Outlook.Folder
    For Each truc In objFolderOrigine.Folders
        'Debug.Print truc & vbCr & "[" & truc.FolderPath & "]"
        MsgBox truc & vbCr & "[" & truc.FolderPath & "]"
    Next truc
     
     MsgBox (objFolderOrigine.Name)
     MsgBox (objFolderOrigine.Items.Count)
     Exit Sub

  14. #14
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Bonjour,

    Est-ce que le souci peut venir du fait de lancer la macro dans Excel ?


  15. #15
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Bonjour,
    A priori non,

    avec ce code tu obtiendras tous les dossiers de ton compte dans la feuille active de EXCEL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    Option Explicit
    Dim r
     
    Sub Lance_Traitement()
    '---------------------------------------------------------------------------------------
    ' Procedure : Lance_Traitement
    ' Author    : Oliv
    ' Date      : 12/02/2016
    ' Purpose   :
    '---------------------------------------------------------------------------------------
    '
        Dim OL As Outlook.Application
        Dim olNS As Outlook.Namespace
        Dim olFolder As Outlook.Folder
     
        If UCase(Application) = "OUTLOOK" Then
            Set OL = Application
        Else
            Set OL = CreateObject("outlook.application")
        End If
     
        Set olNS = OL.GetNamespace("MAPI")
     
        'soit on connait le dossier
        'Set olFolder = olNS.GetDefaultFolder(olFolderInbox).folders
        r = 1
        ActiveSheet.Cells(r, 1).Value = ".FolderPath"
        ActiveSheet.Cells(r, 2).Value = ".DefaultItemType"
        ActiveSheet.Cells(r, 3).Value = ".Items.Count"
        r = 2
        'soit on le choisi
        Set olFolder = olNS.PickFolder
     
        Call ProcessFolders(olFolder, True)
        MsgBox "Traitement terminé"
    End Sub
     
    Sub ProcessFolders(StartFolder As Outlook.MAPIFolder, SubFolder As Boolean)
    '---------------------------------------------------------------------------------------
    ' Procedure : ProcessFolder
    ' Author    : Oliv'
    ' Date      : 12/02/2016
    ' Purpose   : Traitement récursif sur les dossiers OUTLOOK
    '---------------------------------------------------------------------------------------
    '
        Dim objFolder As Outlook.MAPIFolder
        Dim objitem As Object
     
        'Dim objItem As Object
        On Error Resume Next
     
        ' do something specific with this folder
        Debug.Print StartFolder.FolderPath, StartFolder.Items.Count
     
        ActiveSheet.Cells(r, 1).Value = StartFolder.FolderPath
        ActiveSheet.Cells(r, 2).Value = StartFolder.DefaultItemType
        ActiveSheet.Cells(r, 3).Value = StartFolder.Items.Count
        r = r + 1
        ' process all the subfolders of this folder
        'on traite tous les sous dossiers
        If SubFolder Then
            For Each objFolder In StartFolder.Folders
                Call ProcessFolders(objFolder, SubFolder)
            Next
        End If
     
        Set objFolder = Nothing
    End Sub

  16. #16
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Il y a peut être une autre solution,

    si ton dossier "Mailbox" contient tout les Mails qui devraient se trouver dans inbox (Boite de réception) et que INBOX est donc vide!

    Avec REDEMPTION tu as une méthode SetAsDefaultFolder

    http://www.dimastr.com/redemption/RDOFolder.htm

    combiné avec un rename du folder ou l'utilisation du commutateur de ligne de commande avec OUTLOOk.exe /resetfoldernames

    tu dois pouvoir arriver plus vite à ton but.

  17. #17
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    En effet, tu as bien décrit ma problématique.
    Les dossiers Inbox sont systématiquement vides et tous les mails sont dans le répertoire Mailbox.

    Autres problématiques constatés :
    - j'ai des centaines de comptes et le tout atteint pratiquement un téra octets de données. Donc quand j'ouvre outlook Admin (sur un poste en client lourd) à qui j'ai donné les full access sur les boites, outlook patine.
    - j'ai aussi constaté qu'outlook n'affiche par défaut qu'un an de mail, de ce fait, la macro ne fonctionne pas correctement non plus et si je change le paramétrage de un an à 5 ans par exemple, bah c'est tout qui plante.

    Bref, c'est ingérable.

    Avec ta solution reminder, quelles sont mes contraintes ?

  18. #18
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Pour la problème de lenteur, il faut désactiver "le mode Exchange mis en cache" dans les paramètres du compte.
    tu auras de ce fait là aussi accès aux mail plus anciens.

    Pour la solution avec REDEMPTION, cela semble fonctionner, mais il faut bien désactiver le mode mis en cache

    http://www.dimastr.com/redemption/Redemption.zip

    Je suis parti d'un des exemples avec une boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Option Explicit
     
    Sub ChangeDefaultCalendrierAndDelete()
    '---------------------------------------------------------------------------------------
    ' Procedure : ChangeDefaultCalendrierAndDelete
    ' Author    : Oliv
    ' Date      : 20/02/2018
    ' Purpose   :
    '---------------------------------------------------------------------------------------
    '
     
        Dim Session, store, folder, FolderOld
     
        Const olFolderCalendar = 9
        Const olFolderInbox = 6
        Const olFolderSentMail = 5
     
        Dim DossiersOrigine, DossiersCible
     
        Set Session = CreateObject("Redemption.RDOSession")
        Session.Logon
        '    Set store = Session.Stores("pst_vide")
        Set store = Session.Stores("mabal@toto.com")
     
        Err.Clear
        On Error Resume Next
     
        DossiersOrigine = Array(olFolderInbox, olFolderSentMail, olFolderCalendar)
        DossiersCible = Array("Mailbox", "send Items", "Calendrier")
     
        For i = 0 To UBound(DossiersOrigine)
            'does the store already have a default Calendar folder?
            Set FolderOld = store.GetDefaultFolder(DossiersOrigine(i))
            If Err.Number <> 0 Then
                'no default Calendar folder. Check if there is a folder named "Calendrier"
                'and if not, create one
                Err.Clear
                Set folder = store.IPMRootFolder.Folders(DossiersCible(i))
                If (Err.Number <> 0) Or (folder Is Nothing) Then
                    'create a new folder
                    Err.Clear
                    Set folder = store.IPMRootFolder.Folders.Add(DossiersCible(i))
                End If
                folder.SetAsDefaultFolder (DossiersOrigine(i))
                If Err.Number = 0 Then
                    FolderOld.Delete
                End If
            End If
            Set folder = Nothing
            Set FolderOld = Nothing
        Next i
     
    End Sub

  19. #19
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Bonjour,

    Juste pour donner des nouvelles. J'ai pu corriger tous mes soucis de contacts, donc c'est déjà un point très important pour la migration, l'idée de passer par un compte m'a bien aidé et ton code m'a permis d'en concevoir pour. Par contre, en plus du cache, il ne faut pas donner l'autorisation à trop de comptes en même temps, sinon c'est le bogue assuré. Il a fallu donner des droits par groupe de 10 personnes au fur et à mesure (et on les enlève). Donc ce premier point est réglé.

    En ce qui concerne les déplacements des mails, avec la mise en cache Outlook, tout s'affiche correctement sans lenteur dans Outlook. Le programme de déplacement hors calendrier fonctionne mais est lent.

    Il me reste à tester ta solution Redemption.

  20. #20
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Deux petites questions :
    Ton redemption, je l'installe uniquement sur le poste où je lance ma macro, ok ? Pas besoin de toucher au serveur exchange.
    Quand tu fais le renommage, comment tu fais pour renommer le vrai Inbox en autre chose, vu que c'est un dossier système ?
    Y a aucun risque ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [OL-2010] Macro permettant le déplacement des mails d'après un fichier excel
    Par nunoandre dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 07/04/2017, 14h12
  2. [OL-2010] Enregistrement automatique des Mails en .msg dans un dossier
    Par Rch_Dcrt dans le forum VBA Outlook
    Réponses: 2
    Dernier message: 02/08/2016, 10h56
  3. Réponses: 2
    Dernier message: 16/06/2014, 11h10
  4. Réponses: 1
    Dernier message: 07/11/2008, 20h03
  5. Addresse physique des mails et dossiers ?
    Par forca dans le forum Outlook
    Réponses: 4
    Dernier message: 23/06/2008, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo