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 :

Sauvegarde des pièces jointes d'un nouveau message


Sujet :

VBA Outlook

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 111
    Points : 48
    Points
    48
    Par défaut Sauvegarde des pièces jointes d'un nouveau message
    http://www.developpez.net/forums/d29...utlook-2000-a/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Private Sub Application_NewMail()
    Dim MaDatabase As NameSpace, Folder As MAPIFolder, Mail As MailItem
     
    Set MaDatabase = Application.GetNamespace("MAPI")
    Set Folder = MaDatabase.GetDefaultFolder(olFolderInbox)
    Set Mail = Folder.Items(Folder.Items.Count)
     
    For Each Attachment In Mail.Attachments
        Attachment.SaveAsFile "C:\tmp\" & Attachment.FileName
     
    Next
     
    End Sub
    Bonjour,
    J'essaie d'utiliser la macro ci-dessus détaillée avec outlook 2003, mais lorsque je reçois un nouveau mail c'est toujours une PJ déjà présente dans ma boite de réception qui est sauvegardée dans le répertoire choisi et non pas la ou les dernières pj reçue(s) !

    En fait je reçois tous les jours des mails avec des PJ. Ces mails sont sous 3 catégories différenciées par l'objet du message (objet1, objet2, objet3), je souhaiterai qu'à la réception des messages, les PJ liées à des messages dont l'objet est "objet1" soient copiées sous "c:\toto", que les PJ liées à des messages dont l'objet est "objet2" soient copiées sous "c:\tata" etc.

    J'ai par ailleurs cru comprendre que la fonction NewMail ne marche pas lorsqu'on reçoit plusieurs mails en même temps ...

    auriez vous une solution ?
    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 64
    Points : 40
    Points
    40
    Par défaut
    Salut !

    Moi j'utilise les règles pour trier mes mail selon l'objet du mail. Ensuite, a partir de ces même regles, je demare mon script VBA (dans les regles tu as l'option pour demarrer un script) pour traiter les mail recu.

    Effectivement NewMail ne marche pas vraiment, aussi regarde NewMailEx...qui ne marche pas vraiment plus

    Donc, moi j'utilise les regles.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 41
    Points
    41
    Par défaut
    Je suis également à la recherche d'un procédé d'enregistrement automatique de fichiers joints dans un dossier bien défini.
    Merci d'avance de vos suggestions. J'ai bien lu la réponse ci-dessus: je ne sais pas comment paramétrer la règle en question

  4. #4
    Expert éminent sénior
    Avatar de Dolphy35
    Homme Profil pro
    Responsable Systemes d'Information
    Inscrit en
    Octobre 2004
    Messages
    4 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable Systemes d'Information
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Points : 11 218
    Points
    11 218
    Par défaut
    BONJOUR,
    Citation Envoyé par sanfric Voir le message
    Je suis également à la recherche d'un procédé d'enregistrement automatique de fichiers joints dans un dossier bien défini.
    Merci d'avance de vos suggestions. J'ai bien lu la réponse ci-dessus: je ne sais pas comment paramétrer la règle en question
    As-tu consulter la FAQ ??

    Comment sauvegarder les pièces jointes d'un message sans ouvrir ce message ?
    Comment enregistrer les pièces jointe d'un mail sur une règle à la réception d'un mail ?


    Dolphy

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    J'ai testé les deux codes présentés dans ces liens

    Le premier fonctionne mais c'est une macro qui n'est pas automatique Et je ne sais pas comment l'intégrer dans une règle.

    Le second code intégré dans une règle avec exécution de script crée un sous-répertoire vide dans le répertoire défini par le code.

    A suivre

  6. #6
    Expert éminent sénior
    Avatar de Dolphy35
    Homme Profil pro
    Responsable Systemes d'Information
    Inscrit en
    Octobre 2004
    Messages
    4 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable Systemes d'Information
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Points : 11 218
    Points
    11 218
    Par défaut
    Bonjour,

    la FAQ ne s'arrête pas à ces deux questions

    Comment créer un script dans une règle d'arrivée d'un message ?

    + il te suffit de modifier le code d'Oliv. Tu connais bien VBA ?


    Dolphy

  7. #7
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 111
    Points : 48
    Points
    48
    Par défaut
    Bonjour,
    J'ai un peu avancé avec le code suivant (les messages sont tansferés par une règle dans le dossier temp et les PJ correspondantes sont alors extraites vers C:\TEST\) :
    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
    Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
        Dim myOlApp As New Outlook.Application
        Dim myNameSpace As Outlook.NameSpace
        Dim myInbox As Outlook.MAPIFolder
        Dim myDestFolder As Outlook.MAPIFolder
        Dim myItems As Outlook.Items
        Dim myItem As Object
        Set myNameSpace = myOlApp.GetNamespace("MAPI")
        Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox)
        Set myItems = myInbox.Items
        Set myDestFolder = myInbox.Folders("temp")
     
        Dim strName As String
     
        For Each myItem In myDestFolder.Items
        '''''''''''''''''''''''''''''''''''''
      Set Mail = myDestFolder.Items(myDestFolder.Items.Count)
        For Each Attachment In Mail.Attachments
        Attachment.SaveAsFile "C:\TEST\" & Attachment.FileName
     
    Next
    myItem.Delete
     
    Next myItem
     
    End Sub
    Mais, bizarrement, lorsque je reçois un lot de messages, toutes les PJ ne sont pas extraites.

    J'ai donc décidé de lancer manuellement une macro après reception des messages sous "temp".
    J'ai récupéré un code proposé par wanou44 sur un autre post et l'ai adapté.
    Ce code marche bien. Je lance ma macro, choisi le dossier de ma boite de reception à traiter puis le répertoire de destination des PJ.

    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
    Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
     'Structure du fichier
    Private Type OPENFILENAME
      lStructSize As Long
      hWndOwner As Long
      hInstance As Long
      lpstrFilter As String
      lpstrCustomFilter As String
      nMaxCustFilter As Long
      nFilterIndex As Long
      lpstrFile As String
      nMaxFile As Long
      lpstrFileTitle As String
      nMaxFileTitle As Long
      lpstrInitialDir As String
      lpstrTitle As String
      Flags As Long
      nFileOffset As Integer
      nFileExtension As Integer
      lpstrDefExt As String
      lCustData As Long
      lpfnHook As Long
      lpTemplateName As String
    End Type
    Function EnregistrerUnFichier(Handle As Long, Titre As String, _
                        NomFichier As String, Chemin As String) As String
     
     'EnregistrerUnFichier est la fonction a utiliser dans votre formulaire pour ouvrir _
    la boîte de dialogue d'enregistrement d'un fichier.
     'Explication des paramètres
        'Handle = le handle de la fenêtre (Me.Hwnd)
        'Titre = Titre de la boîte de dialogue
        'NomFichier = Nom par défaut du fichier à enregistrer
        'Chemin = Chemin par défaut du fichier à enregistrer
     
    Dim structSave As OPENFILENAME
     
    With structSave
        .lStructSize = Len(structSave)
        .hWndOwner = Handle
        .nMaxFile = 255
        .lpstrFile = NomFichier & String$(255 - Len(NomFichier), 0)
        .lpstrInitialDir = Chemin
        .lpstrFilter = "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0) 'Définition du filtre (aucun)
        .Flags = &H4  'Option de la boite de dialogue
    End With
     
    If (GetSaveFileName(structSave)) Then
        EnregistrerUnFichier = Mid$(structSave.lpstrFile, 1, InStr(1, structSave.lpstrFile, vbNullChar) - 1)
    End If
     
    End Function
     
    Sub Extrait_Pieces_Jointes()
    '----------------------------------------------------------------------
    ' Routine :    Extrait_Pieces_Jointes
    '  retour :    Boite de dialogue "Terminé"
    '----------------------------------------------------------------------
     
     
    Dim myNameSpace As NameSpace, fld As MAPIFolder, pfld As MAPIFolder, sfld As MAPIFolder
    Dim myItem As MailItem, Piece As Attachment
    Dim doc As String, rep As String, REP_TOP As String
     
         '-- Récupération de l'espace nommé MAPI
        Set myNameSpace = CreateObject("Outlook.Application").GetNamespace("MAPI")
     
        '-- Choix du dossier à traiter ... c'est un MAPIFolder
        Set pfld = myNameSpace.PickFolder
     
        '-- Si l'utilisateur renonce on s'en va
        If pfld Is Nothing Then Exit Sub
     
        '-- appel de la routine sauvefolder ...
        sauvefolder pfld, ""
     
        MsgBox "terminé"
     
    End Sub
     
     
    Sub sauvefolder(fld As MAPIFolder, ByVal suf As String)
    ' Paramètres :
    '    fld : Le MAPIFolder à traiter
    '    suf : localisation /nomdedossier/nomdedossier2/
    '-- on entretient la localisation sur la base du nom de dossier courant
        suf = suf & fld.Name & "\"
     
        '-- On envoie une info dans la fenêtre debug pour ceux qui aiment voir ce qui se passe
        Debug.Print suf & fld.Items.Count
     
        '-- On tourne sur tous les éléments du dossier courant
        For i = 1 To fld.Items.Count
            '-- Si c'est un élément de type Mail alors on sauvegarde les pièces jointes associées
            If fld.Items(i).Class = olMail Then sauvefichier fld.Items(i), suf
            '-- Pour voir ce qui se passe sans tout faire ... enlever le commentaire ci-dessous
            'If i = 2 Then Exit For
        Next
     
        '-- On tourne sur tous les sous-dossiers du dossier courant
        For i = 1 To fld.Folders.Count
            '-- appel récursif de la fonction sauvefolder
            sauvefolder fld.Folders(i), suf
        Next
     
    End Sub
     
    Sub sauvefichier(myItem As MailItem, ByVal suf As String)
     
    Dim Piece As Attachment
    Dim REP_TOP As String
     
         '-- On boucle sur les pièces jointes du message (si il y en a)
        For j = 1 To myItem.Attachments.Count
            '-- Initialisation de l'objet Pièce Jointe
            Set Piece = myItem.Attachments(j)
            '-- Sauvegarde du fichier correspondant.
           REP_TOP = EnregistrerUnFichier(0, "enregistrer", Piece.FileName, "I:\")
           Piece.SaveAsFile REP_TOP
        Next j
        Set Piece = Nothing
    End Sub
    mon problème est que la boite de dialogue "enregistrer sous" s'ouvre pour chacun des messages, donc l'enregistrement des PJ se fait une par une.
    Est-il possible de n'ouvrir la boite de dialogue une seule fois pour choisir le répertoire de destination des PJ, et de récupérer cette info pour les PJ suivantes ?
    Merci

  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
    Salut à tous,
    Citation Envoyé par antakini Voir le message
    Mais, bizarrement, lorsque je reçois un lot de messages, toutes les PJ ne sont pas extraites.
    c'est à dire ? attention un pj portant le même nom qu'une autre peut effacer la première s'il n'y a pas de controle .

    Citation Envoyé par antakini Voir le message
    J'ai donc décidé de lancer manuellement une macro après reception des messages sous "temp".
    J'ai récupéré un code proposé par wanou44 sur un autre post et l'ai adapté.
    Ce code marche bien. Je lance ma macro, choisi le dossier de ma boite de reception à traiter puis le répertoire de destination des PJ.
    Qu'est ce qui ne convient pas dans mon code ? tu écris qu'il "crée un sous-répertoire vide "?
    http://outlook.developpez.com/faq/in...eceive_Save_PJ

    si tes pj sont des pj incorporées (images par exemple ) il faut désactiver la fonction Isembedded

  9. #9
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 111
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par Oliv- Voir le message
    Salut à tous,

    c'est à dire ? attention un pj portant le même nom qu'une autre peut effacer la première s'il n'y a pas de controle .
    Non, les PJ ont toujours des noms différents.
    Citation Envoyé par Oliv- Voir le message
    tu écris qu'il "crée un sous-répertoire vide "?
    Désolé, je ne vois pas où tu veux en venir ...
    Citation Envoyé par Oliv- Voir le message
    si tes pj sont des pj incorporées (images par exemple ) il faut désactiver la fonction Isembedded
    Non, les PJ sont des pdf.

  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
    Et alors où est le pb ? tu as un message d'erreur ?

    voici un code afin d'executer le script sur une selection de mails

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub TESPJ1()
    Dim strID As Outlook.MailItem
    For Each truc In ActiveExplorer.Selection
    Set strID = truc
    extrait_PJ_vers_rep strID
    Next
    End Sub

  11. #11
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 111
    Points : 48
    Points
    48
    Par défaut
    je n'ai pas de message d'erreur mais lorsque j'ai plusieurs messages, certaines PJ ne sont pas extraites.
    voici un code afin d'executer le script sur une selection de mails
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub TESPJ1()
    Dim strID As Outlook.MailItem
    For Each truc In ActiveExplorer.Selection
    Set strID = truc
    extrait_PJ_vers_rep strID
    Next
    End Sub]
    désolé mais je ne comprend pas comment utiliser ce code...

    Pour revenir sur mon idée de départ et sur le code de wanou44; est-il possible de n'ouvrir la boite de dialogue q'une seule fois pour choisir le répertoire de destination des PJ, et de récupérer cette info pour les PJ suivantes ?

    merci

  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
    Si tu veux rester sur ton idée, qui semble être différente de ton énoncée du départ ..
    il faut sortir la fonction EnregistrerUnFichier de la boucle , mais je ne sais pas si comdlg32.dll peut te donner juste le répertoire il y a peut être une option sinon cherche un code basé sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "shell32" (lpbi As BrowseInfo)
    si c'est tjours le même répertoire tu peux l'inscrire en dur

  13. #13
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 111
    Points : 48
    Points
    48
    Par défaut
    merci oliv pour ton aide.
    En fait, si j'ai changé d'idée c'est qu'avec le premier code j'avais certaines PJ qui n'étaient pas extraites et j'en reçois régulièrement par lots de 40 à 50 messages...

  14. #14
    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,
    Tu es libre de tes choix mais si on parle du même code "extrait_PJ_vers_rep" suis quand même étonné qu'il ne fasse pas le travail correctement!!
    L'exécution pas à pas sur les mails comportant des pj non extraite permettrait peut être de voir où est le pb ?

    et avec le code de wanou44 attention aux doublons !

  15. #15
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 111
    Points : 48
    Points
    48
    Par défaut
    salut oliv,

    Au sujet de ton code, j'ai outlook 2003, mais je ne trouve pas la librairie Microsoft CDO 1.21 ...

  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
    Salut,
    c'est assez étonnant il doit se trouver là
    C:\PROGRA~1\FICHIE~1\SYSTEM\MSMAPI\1036\CDO.DLL

    c'est peut être avec exchange qu'il s'installe :
    http://support.microsoft.com/kb/171440/fr

    as tu essayé sans le référencer , ca doit marcher quand même ?
    Sinon il faut supprimer le contrôle des pj incorporées en commentant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'typeatt = Isembedded(strID, PJ.Index)

  17. #17
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 111
    Points : 48
    Points
    48
    Par défaut
    MERCI OLIV,

    ça marche ...

    bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OL-2007] Réattacher des pièces jointes pour un nouveau mail.
    Par Flodelarab dans le forum VBA Outlook
    Réponses: 5
    Dernier message: 24/04/2015, 12h20
  2. [XL-2010] Automatiser sauvegarde des pièces jointes dans Lotus Notes
    Par Loki83 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 05/03/2014, 09h59
  3. Réponses: 1
    Dernier message: 17/09/2013, 05h10
  4. [Forum] Comment insérer des pièces jointes dans un message ?
    Par nonna dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 21/05/2008, 11h39
  5. Sauvegarde des pièces-Joints automatique
    Par benhamidaa dans le forum Outlook
    Réponses: 1
    Dernier message: 31/12/2007, 08h56

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