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 mail outlook avec plusieurs PJ dans un mail


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Août 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Août 2020
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Macro envoi mail outlook avec plusieurs PJ dans un mail
    Bonjour,

    je n'arrive pas à trouver une solution, j'espere qu'on pourra m'aider ici
    Je veux creer une macro pour envoyer plus simplement des mails avec des PJ, j'ai pu creer un premier code mais avec uniquement la possibilité d'envoyer un fichier à partir d'un lien hypertexte. Je cherche une solution pour envoyer plusieurs PJ dans un meme mail à partir du lien ou en ajoutant d'autres colonnes de lien

    Ci-dessous la macro.

    Merci d'avance pour votre aide


    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
    Public Sub EnvoiAutomatiqueMail()
     
    Dim OutlookApp As Object
    Dim OutlookMail As Object
    Dim adresse As String
    Dim Fact As String
    Dim i As Integer
     
    With Sheets("Listing Envoi Mail")
     
    For i = 8 To .[G65536].End(xlUp).Row ' on passe en revue toutes les lignes de la colonne G
     
      If Range("I" & i) = "Oui" Then 'les mails sont générés uniquement si "oui" dans la colonne I
     
            adresse = .Cells(i, "G") 'adresse mail 
            Fact = Range("J" & i).Value 'rajout des PJ en colonne J en pieces jointes du mail
     
            Set OutlookApp = CreateObject("outlook.application") 'ouvre l'application outlook
            Set OutlookMail = OutlookApp.CreateItem(0) 'prepare le mail outlook
                With OutlookMail
                .Subject = Sheets("Faire modif ici").Range("C5").Value 'va chercher le contenu de la cellule C5 de la feuille Faire modif ici du fichier excel
                .To = adresse 'va rechercher les adresses de chaque ligne pour créer le mail
                .CC = Sheets("Faire modif ici").Range("C7").Value 'va chercher les adresses mail dans la cellule C7 de la feuille Faire modif ici
                .Body = Sheets("Faire modif ici").Range("C11").Value 'va chercher le corps du mail dans la cellule C11 de la feuille Faire modif ici
                .Attachments.Add Fact
     
                .Display 'affiche le mail avant envoi
     
                End With
                End If
     
        Next i 'on passe au mail suivant
     
    End With
    End Sub

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Salut.

    Déjà, c'est du vieux code, ça, avec un sale [G65536] dedans (Je dis tout le mal que je pense de cette façon d'adresser une plage en VBA dans ce billet).

    Normalement, tu devrais utiliser les tableaux structurés qui vont faciliter ton travail et l'écriture de ton code. Tu gagnerais également à utiliser les formules nommées pointant vers des plages ou des cellules. Ca t'éviterait de reprendre tout ton code pour le modifier si tu déplaces tes cellules dans Excel...

    Peux-tu montrer les valeurs en colonne J? Ce sont des chemins vers des pj?


    Sur base du tableau structuré suivant appelé t_Contacts:

    Nom : 2020-08-03_201139.png
Affichages : 796
Taille : 13,7 Ko

    et en nommant tes plages pour le sujet, le corps et les cc du mail:
    • C5 => TitreMailFacture;
    • C7 => TitreMailFacture;
    • C11 => BodyMailFacture.



    Voici un code qui ne se tracasse ni du nom des feuilles ni de l'emplacement du tableau ou des cellules dans ton classeur pour envoyer la facture ET la commande en pdf (nouvelle colonne selon ta suggestion )

    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
    Public Sub EnvoiAutomatiqueMail()
      Dim OutlookApp As Object
      Dim OutlookMail As Object
      Dim i As Long
     
      For i = 1 To Range("t_Contacts").Rows.Count
        If Range("t_Contacts[Envoi]")(i) = "Oui" Then
          Set OutlookApp = CreateObject("outlook.application")
          Set OutlookMail = OutlookApp.CreateItem(0)
          With OutlookMail
            .Subject = Range("TitreMailFacture").Value
            .To = Range("t_Contacts[Email]")(i).Value
            .CC = Range("CCMailFacture").Value
            .Body = Range("BodyMailFacture").Value
            .Attachments.Add Range("t_Contacts[Facture]")(i).Value
            .Attachments.Add Range("t_Contacts[Commande]")(i).Value
            .Display
          End With
        End If
      Next i
    End Sub

    Avec ce code, on balaie le tableau des contacts en commençant à SA ligne 1 et on utilise les références structurées en VBA pour pointer vers les plages correspondantes, l'indice i servant à se positionner sur la bonne ligne, vecteur par vecteur. Ce code travaillant avec les références structurées et les formules nommées pointant vers les plages (improprement appelées plages nommées par abus de langage), tu peux déplacer ton tableau, même sur une autre feuille, insérer ou intervertir des colonnes, renommer ta feuille Faire modif ici, déplacer les cellules dans cette feuille, ton code continue à fonctionner car, en utilisant les références structurées et les alias, tu délègues à Excel le soin de savoir vers quoi pointent tes références.

  3. #3
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Août 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Août 2020
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Salut Pierre,

    Merci pour ton retour et surtout pour ton article sur les tableaux structurés qui est génial (je ne connaissais absolument pas)

    j'ai suivi ton conseil et renommer toutes les plages et ça change vraiment tout

    Pour répondre à ta question, c'est bien des chemins vers des PJ dans la colonne J

    J'ai utilisé du coup le code que tu m'as envoyé... ça marche nickel quand j'ai deux PJ et que les deux colonnes sont remplies mais il arrive qu'il y ait qu'une PJ dans la liste et dans ce cas j'ai une erreur "Impossible d'ajouter la PJ car aucune source de données n'a été fournie"

    Comment je peux contourner ça?

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Il suffit d'ajouter une test sur le fait que les cellules des pièces jointes sont vides ou pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            If Range("t_Contacts[Facture]")(i).Value <> "" Then .Attachments.Add Range("t_Contacts[Facture]")(i).Value
            If Range("t_Contacts[Commande]")(i).Value <> "" Then .Attachments.Add Range("t_Contacts[Commande]")(i).Value
    On pourrait aussi pousser jusqu'à tester que le fichier existe ou pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            If Dir(Range("t_Contacts[Facture]")(i).Value) <> "" Then .Attachments.Add Range("t_Contacts[Facture]")(i).Value
            If Dir(Range("t_Contacts[Commande]")(i).Value) <> "" Then .Attachments.Add Range("t_Contacts[Commande]")(i).Value

  5. #5
    Membre chevronné Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Points : 1 971
    Points
    1 971
    Par défaut
    Édit : Pierre est passé avant (Salut !)

    Bonjour,

    Une simple condition sur la valeur contenue dans la cellule pourrait certaiement faire l'affaire.
    Quelque chose de genre (non testé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If Range("t_Contacts[Facture]")(i).Value <> "" Then .Attachments.Add Range("t_Contacts[Facture]")(i).Value
    Bat,
    MFoxy

  6. #6
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Août 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Août 2020
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    J'ai essayé le test et ça marche que pour les deux PJ, le mail ne se génère pas quand il y a uniquement une PJ dans la colonne J et pas dans la colonne K.
    Par contre il n'y a aucun message d'erreur

    salut mfoxy, merci pour ton intervention!

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Il faudrait donner ton code (le code REEL que tu as utilisé), parce que les lignes fournies avec l'adaptation du test ne sont pas bloquantes pour la génération du mail.

  8. #8
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Août 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Août 2020
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Le voici

    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
    Public Sub EnvoiAutomatiqueMail()
      Dim OutlookApp As Object
      Dim OutlookMail As Object
      Dim i As Long
     
      For i = 1 To Range("t_Contacts").Rows.Count
        If Range("t_Contacts[Envoi]")(i) = "Oui" Then
        If Range("t_Contacts[Facture]")(i).Value <> "" Then
        If Range("t_Contacts[Double facture]")(i).Value <> "" Then
     
     
          Set OutlookApp = CreateObject("outlook.application")
          Set OutlookMail = OutlookApp.CreateItem(0)
          With OutlookMail
     
            .Subject = Range("SujetMail").Value
            .To = Range("t_Contacts[Courriel]")(i).Value
            .CC = Range("CCmailing").Value
            .Body = Range("BodyMail").Value
            .Attachments.Add Range("t_Contacts[Facture]")(i).Value
            .Attachments.Add Range("t_Contacts[Double facture]")(i).Value
            .Display

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Tu n'as pas mis le test sur les noms des fichiers à la bonne place. Là où tu as placé les lignes de test d'existence des pdf, il suffit qu'il manque un pdf pour que le mail ne parte pas. Les lignes que je t'ai fournies doivent se mettre à la place de celles qui ajoutaient les attachements. Avec le code ci-dessous, le mail partira, avec ou sans pièce(s) jointe(s).


    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
    Public Sub EnvoiAutomatiqueMail()
      Dim OutlookApp As Object
      Dim OutlookMail As Object
      Dim i As Long
     
      For i = 1 To Range("t_Contacts").Rows.Count
        If UCase(Range("t_Contacts[Envoi]")(i).Value) = "OUI" Then
          Set OutlookApp = CreateObject("outlook.application")
          Set OutlookMail = OutlookApp.CreateItem(0)
          With OutlookMail
            .Subject = Range("TitreMailFacture").Value
            .To = Range("t_Contacts[Email]")(i).Value
            .CC = Range("CCMailFacture").Value
            .Body = Range("BodyMailFacture").Value
            If Range("t_Contacts[Facture]")(i).Value <> "" Then .Attachments.Add Range("t_Contacts[Facture]")(i).Value
            If Range("t_Contacts[Commande]")(i).Value <> "" Then .Attachments.Add Range("t_Contacts[Commande]")(i).Value
            .Display
          End With
        End If
      Next i
    End Sub
    J'en ai profité pour modifier la ligne de test sur le "Oui" car, par défaut et a contrario d'Excel, VBA est sensible à la casse.


    PS: Pour comprendre pourquoi un code ne fonctionne pas, tu pourrais utilement exécuter ta macro pas-à-pas en plaçant ton curseur dedans puis en pressant F8. Chaque F8 te fera avancer d'une ligne et s'arrêtera sur la ligne en jaune avant exécution. De cette façon, avec quelques lignes de test qui reprennent tes cas, tu peux rapidement voir si et quand tu entres dans le bloc qui exécuter vraiment la commande de création du mail.

  10. #10
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Août 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Août 2020
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    ça marche parfaitement!

    Merci beaucoup Pierre pour ton aide si précieuse

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/08/2019, 17h16
  2. Inclure l'image jpeg de ma signature dans macro envoi mail (Outlook)
    Par mederick dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/05/2014, 16h51
  3. [AC-2010] Générer mail dans Outlook avec plusieurs destinataires
    Par zeuch dans le forum VBA Access
    Réponses: 6
    Dernier message: 14/01/2014, 23h29
  4. Macro envoi mail excel via office outlook web access
    Par tony020422 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 08/07/2009, 09h31
  5. Réponses: 4
    Dernier message: 02/02/2009, 22h40

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