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

Macros et VBA Excel Discussion :

Macro envoi d'un mail outlook via liste excel avec pièce jointe différente pour chaque destinataire [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2020
    Messages : 10
    Par défaut Macro envoi d'un mail outlook via liste excel avec pièce jointe différente pour chaque destinataire
    Bonjour,

    Je cherche à savoir comment automatiser l'envoi de mails via une liste de contacts Excel (comportant plusieurs colonnes dont le nom, le prénom, l'adresse et surtout le mail) avec l'envoi d'une pièce jointe différente pour chaque destinataire. Toutes ces pièces jointes seraient stockées dans un dossier spécial.

    Après quelques recherches j'ai réussi à trouver cette macro et la modifier pour qu'elle corresponde à mes besoins. Grâce à elle j'arrive à envoyer un mail à tous les destinataires de ma liste, en y ajoutant une pièce jointe spécifique mais cependant unique et non différente comme je le voudrais.

    Je voudrais donc savoir comment modifier mon code pour que la macro modifie la pièce jointe pour chaque destinataire. Une des façons de faire à laquelle je pensais c'est puiser le Nom et Prénom du destinataire dans la liste Excel des contacts et les utiliser pour retrouver la pièce jointe correspondante (qui comportera en intitulé le Nom et Prénom du destinataire), mais je n'ai aucune idée de comment le mettre en oeuvre, parce que je n'ai que très peu de connaissances en code vu que ce n'est pas mon métier, même si j'arrive à me débrouiller.

    Sur ce forum j'ai trouvé une discussion qui parle de ça et où un utilisateur spécifie qu'il utilise une boîte de dialogue lui permettant de choisir la pièce jointe avant l'envoi du mail, ça pourrait être une solution mais moins pratique que la sélection automatique. (lien de la discussion : https://www.developpez.net/forums/d1...er-envoyer-pj/)
    Cependant je ne sais pas comment intégrer ce module à ma macro.

    Voici donc le code la macro que j'utilise pour l'instant, en attendant de la modifier pour qu'elle réponde à mes besoins :

    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
    Sub Sample()
       'Setting up the Excel variables.
       Dim olApp As Object
       Dim olMailItm As Object
       Dim iCounter As Integer
       Dim Dest As Variant
       Dim SDest As String
     
       'Create the Outlook application and the empty email.
       Set olApp = CreateObject("Outlook.Application")
       Set olMailItm = olApp.CreateItem(0)
     
       'Using the email, add multiple recipients, using a list of addresses in column A.
       With olMailItm
           SDest = ""
           For iCounter = 1 To WorksheetFunction.CountA(Columns(1))
               If SDest = "" Then
                   SDest = Cells(iCounter, 1).Value
               Else
                   SDest = SDest & ";" & Cells(iCounter, 1).Value
               End If
           Next iCounter
     
        'Do additional formatting on the BCC and Subject lines, add the body text from the spreadsheet, and send.
           .BCC = SDest
           .Subject = "Sujet"
           .Body = ActiveSheet.TextBoxes(1).Text
            .Importance = olImportanceHigh
           .Attachments.Add "Chemin du fichier"
           .Send
       End With
     
       'Clean up the Outlook application.
       Set olMailItm = Nothing
       Set olApp = Nothing
    End Sub
    Je vous remercie d'avance pour vos réponses, je vais continuer de chercher en attendant !

    Bonne journée,

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Bonjour,

    Ci-dessous un macro qui envoie des mails avec pj différente a chaque fois
    Se base sur un tableau avec en colonne A le sujet du mail, en B le corps du mail, en C l'adresse mail du destinataire, et en D le nom de la PJ(avec l'adresse complète: d:\chemin\monpdf.pdf par exemple)

    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
    sub mail
    Dim ObjOutlook As Object, txt As String, cel As Range
    Set ObjOutlook = CreateObject("outlook.application")
    For i = 2 To 1001
     
        Set oBjMail = ObjOutlook.CreateItem(olMailItem)
            With oBjMail
                .Display
                .To = cells(i,3).value
                .CC = "" 'copie
                .Subject = cells(i,1).value 'titre
                .Body =cells(i,2).value 'message
                'pièces jointes
                .Attachments.Add cells(i,4).value
     
                'au choix l'une des trois lignes suivantes
                .Display 'pour afficher le message dans outlook
                '.Save 'pour le sauver dans les brouillons
                '.send 'pour l'envoyer
     
            End With
     
    Next i
    End Sub

  3. #3
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous, Bonjour au Forum,

    Voir cette contribution.

  4. #4
    Membre habitué
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2020
    Messages : 10
    Par défaut
    Bonjour, merci pour vos réponses,

    J'ai utilisé le code de halaster08 que j'ai modifié pour convenir à mes besoins et ça fonctionne, cependant ce code fait des itérations des cases à 2 a 1001 et j'aimerais pouvoir mettre une condition permettant d'ajuster automatiquement ce nombre d'itérations au nombre de lignes du tableau, comment-faire ?

    Je passerai ensuite le sujet en résolu.

    Merci beaucoup

    Pour info pour ceux qui tomberaient sur ce sujet plus tard voici le code modifié, permettant d'écrire le corps du mail dans une zone de texte placée dans la feuille 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
     
    Sub test()
    Dim ObjOutlook As Object, txt As String, cel As Range
    Set ObjOutlook = CreateObject("outlook.application")
    For i = 2 To 1001
     
        Set oBjMail = ObjOutlook.CreateItem(olMailItem)
            With oBjMail
                .Display
                .To = Cells(i, 3).Value
                .CC = "" 'copie
                .Subject = "Sujet du mail" 'titre
                .Body = ActiveSheet.TextBoxes(1).Text 'message
                'pièces jointes
                .Attachments.Add Cells(i, 4).Value
     
                'au choix l'une des trois lignes suivantes
                .Display 'pour afficher le message dans outlook
                '.Save 'pour le sauver dans les brouillons
                '.send 'pour l'envoyer
     
            End With
     
    Next i
    End Sub

  5. #5
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    tu travailles dangereusement en ne rattachant pas Cells() à la feuille parente. De ce fait, si la feuille n'est pas la feuille active, gare aux dégâts


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row

  6. #6
    Membre habitué
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Octobre 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Octobre 2020
    Messages : 10
    Par défaut
    Merci de ta réponse Joe !

    Je pense avoir compris ton message, tu veux dire que lorsque je lance la macro, ça peut la lancer sur une autre feuille et vu que Cells n'est pas rattachée à la feuille parente, ça créerait un grand nombre d'itérations qui ferait tout buguer ?

    Si c'est le cas je ne sais absolument pas comment faire mais je vais chercher ça sur internet, merci de l'info

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    tu travailles dangereusement en ne rattachant pas Cells() à la feuille parente. De ce fait, si la feuille n'est pas la feuille active, gare aux dégâts
    Tu as bien raison, c'est une mauvaise habitude de ma part, souvent j'attache ce genre de macro a un bouton, qui se trouve sur la bonne feuille, pour des utilisateurs qui ne savent utiliser les macros autrement donc je ne me fait pas de soucis sur le lancement depuis une mauvaise feuille

    Citation Envoyé par Canian
    Je pense avoir compris ton message, tu veux dire que lorsque je lance la macro, ça peut la lancer sur une autre feuille et vu que Cells n'est pas rattachée à la feuille parente, ça créerait un grand nombre d'itérations qui ferait tout buguer ?
    Sans faire un grand nombre d'itération, rien qu'a la première, si tu n'es pas sur la bonne feuille tu vas forcément avoir des données qui ne correspondent pas
    Il est donc généralement plus prudent de précéder chaque cellule par sa feuille parente (et éventuellement le classeur aussi si besoin) et donc remplacer cells() par worksheet().cells()

  8. #8
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Etant donné que tu travailles déjà avec un bloc With/End With sur le mailitem, tu places la feuille dans une variable Worksheet et tu préfixes tes Ranges/Cells par cette variable

    Par ailleurs, tu mélanges le Late/Early Binding, en utilisant une variable Objet pour désigner Outlook (Late), mais tu utilises la constante olMailItem qui est propre à la bibliothèque Outlook (Early)

    J'ai remplacé la constante par son équivalent numérique.

    Ainsi, en late binding, il n'y a plus à se soucier des versions du pack offices si c'est une procédure susceptible d'être utilisées dans des écosystèmes différents du tiens

    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
    Sub test()
    Dim ObjOutlook As Object, MaFeuille As Worksheet
    Set ObjOutlook = CreateObject("outlook.application")
    Set MaFeuille = ThisWorkbook.Worksheets("MaFeuille")
        For i = 2 To MaFeuille.Cells(MaFeuille.Rows.Count, 1).End(xlUp).Row
            With ObjOutlook.CreateItem(0) 'olMailItem
                .To = MaFeuille.Cells(i, 3).Value
                .Subject = "Sujet du mail"
                .Body = MaFeuille.TextBoxes(1).Text
                .Attachments.Add MaFeuille.Cells(i, 4).Value
                .Display
            End With
        Next i
    Set ObjOutlook = Nothing
    End Sub

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

Discussions similaires

  1. envoi de mail avec ACCESS via gmail => erreur avec pièce jointe
    Par bartimeus35 dans le forum VBA Access
    Réponses: 5
    Dernier message: 22/03/2020, 18h49
  2. [XL-2016] Macro envoi par e-mail de la liste des modifications
    Par MPackers dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/01/2019, 16h33
  3. Envoi mail lotus via excel avec pièce jointe
    Par Mokia34 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 19/01/2016, 22h02
  4. Envoie mal outlook avec pièce jointe différente tous les jours
    Par snico78 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/10/2014, 18h41
  5. [XL-2003] Envoi mail Outlook via VBA Excel erreur
    Par altra dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/08/2009, 16h50

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