VB Excel OUTLOOK liste adresses mails

Résolu
Bonjour à tous,

Envoyer par VB Excel, un mail avec une liste d'adresses pré-complétée... Problème assez récurrent. J'ai beaucoup fouillé sur le web à ce sujet, et j'ai trouvé des réponses. mais faut voir les réponses... A croire que certaines personnes s'amusent à faire le plus compliqué possible. Vous allez me dire qu'ils n'ont peut-être pas le choix!
J'ai donc décidé de passer outre les propositions hasardeuses et incompréhensibles proposées à droite et gauche, et de faire mon petit code à moi, simplissime comme tout... Mais voilà, le résultat n'est pas parfait puisqu'il faut que je clique dans l'espace "A:" de Outlook et que je fasse "Entrée" pour pouvoir envoyer le mail!
Alors j'espère que quelqu'un pourra m'aider, parce que je suis incapable de reprendre les codes proposés sur d'autres post. Je n'y comprends pas grand chose.

Voili voilou comment je me suis débrouillée:
dans Excel, j'ai une cellule avec la liste des adresses mails séparées par des point-virgules.
Exemple: cellule J11 du feuillet admin: monsieur.dupont@imaginez.com ; monsieur.dupuis@imaginez.com

Dans VB: voici mon code:

                
                ' Récupérer les mails des destinataires
                Workbooks("test.xls").Activate
                Sheets("admin").Activate
                MailAd = Range("J11").Value
                
                ' Ouvrir une page Outlook pour envoyer le fichier
                Application.Dialogs(xlDialogSendMail).Show MailAd


Qu'en pensez-vous docteurs?
Configuration: Windows XP Internet Explorer 7.0

20 réponses

Résumé de la discussion

Envoyer par VB Excel un mail avec une liste d'adresses pré-complétée présente un problème récurrent lorsque les destinataires doivent être ajoutés automatiquement sans interaction manuelle. Des solutions évoquées incluent la mise en ligne du projet VBA Outlook via ThisOutlookSession et Application_Startup, la vérification des références Outlook et la gestion correcte des paramètres d'envoi. D'autres échanges concernent le découpage de la liste des destinataires par point-virgule avec Split, l'évitement des destinataires vides et l'appel correct des procédures entre Excel et Outlook. En cas d'insuffisance, les réponses suggèrent aussi de vérifier que Outlook est chargé et que les macros sont actives, afin d'éviter les messages de non reconnaissance des adresses.

Bobot (l’IA à votre service)
  1. Salut,

    je reviens vers vous pour savoir si vous avez des news par rapports aux problèmes évoqués.
    Bonne soirée.
    Ludivine
    1. 1- si le destinataire est sous la forme mdupont ou ludivine50, ce nom doit se trouver dans le carnet d'adresses Outlook

      2- l'instruction : destinataires = Split(Mail_liste, ";") suppose que l'ensemble des destinataires soit fourni dans une seule cellule sous la forme : mdupont@gmail.com; Ludivine50@gmail.com .
      Si les destinataires sont mis en colonne, c'est une autre instruction qu'il faut utiliser.

      ci-jointes les modifications à apporter si la liste des destinataires est parv exemple en colonne B

      Sous Excel VBA:
      
      Sub test1()
      
      Workbooks("julieC - Irsem.xls").Activate
      ' Récupérer les mails des destinataires
      Sheets("admin").Activate
      
      'les adresses mail sont en colonne B
      Set début_liste = Range("B1")
      Set fin_liste = Range("B1").End(xlDown)
      MailAd = Range(début_liste, fin_liste).Valuesujet = "Test envoi"
      Message = "coucou, recevez-vous ce message?"
      Call test2(MailAd, sujet, Message, NomFichier)
      
      'choix pièce jointe
      NomFichier = Application.GetOpenFilename
      
      ' appelle une sous-procédure Outlook VBA
      Set appli_Outlook = Outlook.Application
      If appli_Outlook.Explorers.Count > 0 Then
          Call appli_Outlook.test2(MailAd, sujet, Message, NomFichier)
      Else
          MsgBox "erreur envoi e_mail car outlook non chargé"
      End If
      
      End Sub
      
      
      Sous outlook: (ThisOutlookSession)
      
      Private Sub Application_Startup()
      End Sub
      Sub test2(Mail_liste, objet_message, texte_message, nom_pièce_jointe)
      
      ' la variable Mail_liste correspond au premier paramètre du call Call appli_Outlook.test2 (variable MailAd)
      ' la variable objet_message correspond au secon paramètre du call Call appli_Outlook.test2 (variable sujet)
      ' la variable texte_message correspond au troisième paramètre du call Call appli_Outlook.test2 (variable Message)
      ' la variable nom_pièce_jointe correspond au quatrième paramètre du call Call appli_Outlook.test2 (variable NomFichier)
      
      On Error GoTo erreur_création_e_mail
      
      Set appli_Outlook = Outlook.Application
      
      
      ' crée l'objet : e_mail
      Set e_mail = appli_Outlook.CreateItem(olMailItem)
      
      ' ajoute les destinataires
      destinataires = Mail_liste
      For i_destinataire = 1 To UBound(destinataires)
          e_mail.Recipients.Add destinataires(i_destinataire, 1)Next i_destinataire
      
      ' remplit le sujet et le message
      e_mail.Subject = objet_message
      e_mail.Body = texte_message
      
      'Attachement pièce jointe
      If nom_pièce_jointe <> "" Then
          Set pièce_jointe = e_mail.Attachments
          pièce_jointe.Add NomFichier, olByValue, 1, nom_pièce_jointe
      End If
      
      ' envoie l'e-mail
      e_mail.Send
      
      ' fin traitement
      création_mail_exit:
          Exit Sub
      
      ' routine erreur
      erreur_création_e_mail:
          MsgBox "erreur envoi e-mail " & Err.Number & " " & Err.Description
          Resume création_mail_exit
      
      End Sub
      1. merci Thev,

        pour le second point, j'utilisais un contournement pour que ça fonctionne:

        colonne A colonne B colonne C (calculée automatiquement)
        mdupont mdupont@gmail.com 'mdupont@gmail.com'
        Ludivine50 Ludivine50@gmail.com 'mdupont@gmail.com','Ludivine50'@gmail.com'

        et je prenais ma liste d'adresse dans la dernière de la colonne C!!

        C'est un peu du bricolage, mais bon, ça fonctionne alors je vais garder cela pour ce programme. Par contre, la prochaine fois, je testerais celui que tu nous a proposé.
      2. Pour le premier point, je viens de tester. En fait, le problème, c'est quand j'ai une seule adresse. Malheureusement, parfois il y en aura parfois plusieurs, mais aussi parfois une seule.
    2. Bonjour à tous,

      J'ai remis le nez dedans, et effectivement, j'ai eu le même message que Coklin:
      "erreur envoi e-mail -2147467259 Les zones A, CC, cci doivent contenir au moins un nom ou une liste de distribution" .

      Mais je n'ai pas toujours ce message!
      1) Ma liste de destinataires est ainsi constituée:
      colonne A colonne B
      mdupont mdupont@gmail.com
      Ludivine50 Ludivine50@gmail.com


      Hypothèse: Ludivine50 est mon identifiant Windows.

      Si je lance la macro avec cette liste, pas de problème. Mais cette liste est pour les tests.

      2) Si j'enlève Ludivine50 de la liste, la macro ne fonctionne plus! J'ai le message d'erreur.
      colonne A colonne B
      mdupont mdupont@gmail.com


      3) A noter, que je je fais la liste suivante:
      colonne A colonne B
      mdupont Ludivine50@gmail.com

      J'ai aussi le message d'erreur. Il semblerait que le nom de l'identifiant windows doive être dans la liste des utilisateurs. Cocklin, as-tu un problème dans ce genre?
      1. Sous Excel VBA:
        
        Sub test1()
        
        Workbooks("julieC - Irsem.xls").Activate
        ' Récupérer les mails des destinataires
        Sheets("admin").Activate
        MailAd = Range("N50").Value 'la valeur est une adresse mail
        sujet = "Test envoi"
        Message = "coucou, recevez-vous ce message?"
        
        'choix pièce jointe
        'NomFichier = Application.GetOpenFilename
        
        ' appelle une sous-procédure Outlook VBA
        Set appli_Outlook = outlook.Application
        If appli_Outlook.Explorers.Count > 0 Then
            Call appli_Outlook.test2(MailAd, sujet, Message, NomFichier)
        Else
            MsgBox "erreur envoi e_mail car outlook non chargé"
        End If
        
        End Sub
        
        
        Sous outlook: (ThisOutlookSession)
        
        Private Sub Application_Startup()
        End Sub
        Sub test2(Mail_liste, objet_message, texte_message, nom_pièce_jointe)
        
        ' la variable Mail_liste correspond au premier paramètre du call Call appli_Outlook.test2 (variable MailAd)
        ' la variable objet_message correspond au secon paramètre du call Call appli_Outlook.test2 (variable sujet)
        ' la variable texte_message correspond au troisième paramètre du call Call appli_Outlook.test2 (variable Message)
        ' la variable nom_pièce_jointe correspond au quatrième paramètre du call Call appli_Outlook.test2 (variable NomFichier)
        
        On Error GoTo erreur_création_e_mail
        
        ' crée l'objet : e_mail
        Set e_mail = Application.CreateItem(olMailItem)
        
        ' ajoute les destinataires
        destinataires = Split(Mail_liste, ";")
            For i_destinataire = 0 To UBound(destinataires) - 1
            e_mail.Recipients.Add destinataires(i_destinataire)
        Next i_destinataire
        
        ' remplit le sujet et le message
        e_mail.Subject = objet_message
        e_mail.Body = texte_message
        
        'Attachement pièce jointe
        If nom_pièce_jointe <> "" Then
            Set pièce_jointe = e_mail.Attachments
            pièce_jointe.Add NomFichier, olByValue, 1, nom_pièce_jointe
        End If
        
        ' envoie l'e-mail
        e_mail.Send
        
        ' fin traitement
        création_mail_exit:
            Exit Sub
        
        ' routine erreur
        erreur_création_e_mail:
            MsgBox "erreur envoi e-mail " & Err.Number & " " & Err.Description
            Resume création_mail_exit
        
        End Sub
        1. Re Thev,

          J'ai à nouveau suivi tes instructions, mais maintenant il me mets que l'objet n'appartient pas à la sélection.

          Voici mon code pour le moment :

          Sous Excel VBA:

          Sub test1()

          Workbooks("julieC - Irsem.xls").Activate
          ' Récupérer les mails des destinataires
          Sheets("admin").Activate
          MailAd = Range("N50").Value 'la valeur est une adresse mail
          'sujet = "Test envoi"
          'Message = "coucou, recevez-vous ce message?"
          'Nomfichier = "Powerpoint"

          'choix pièce jointe
          NomFichier = Application.GetOpenFilename

          ' appelle une sous-procédure Outlook VBA
          Set appli_Outlook = Outlook.Application
          If appli_Outlook.Explorers.Count > 0 Then
          Call appli_Outlook.test2(MailAd, sujet, Message, NomFichier)
          MailAd = Range("N50").Value
          sujet = "ESSAI"
          Message = "coucou"
          NomFichier = "Powerpoint"
          Else
          MsgBox "erreur envoi e_mail car outlook non chargé"
          End If

          End Sub

          Sous outlook: (ThisOutlookSession)
          Sub test2(MailAd, sujet, Message, NomFichier)
          MailAd = Workbooks("JulieC - irsem.xls").Sheets("Admin").Range("N50").Value
          sujet = "ESSAI"
          Message = "coucou"
          NomFichier = "Powerpoint"

          On Error GoTo erreur_création_e_mail

          ' crée l'objet : e_mail
          Set e_mail = Application.CreateItem(olMailItem)

          ' ajoute les destinataires
          destinataires = Split(Mail_liste, ";")
          For i_destinataire = 0 To UBound(destinataires) - 1
          e_mail.Recipients.Add destinataires(i_destinataire)
          Next i_destinataire

          ' remplit le sujet et le message
          e_mail.Subject = "Essai 1"
          e_mail.Body = "Essai Message"

          ' envoie l'e-mail
          e_mail.Send

          ' fin traitement
          création_mail_exit:
          Exit Sub

          ' routine erreur
          erreur_création_e_mail:
          MsgBox "erreur envoi e-mail " & Err.Number & " " & Err.Description
          Resume création_mail_exit

          'Attachement pièce jointe
          If NomFichier <> "" Then
          Set pièce_jointe = e_mail.Attachments
          pièce_jointe.Add NomFichier, olByValue, 1, NomFichier
          End If

          End Sub

          Private Sub Application_Startup()
          End Sub

          Quel est le pb docteur parce que j'ai du mal à comprendre la différence entre Mail_List, MailAd, etc.

          Peux-tu m'expliquer un peu le pb et ai-je bien respecté ce que tu souhaitais que je fasse.

          Merci d'avance et désolé de ne pas être très doué.

          Coklin
          1. 1 - Les noms de variables ne correspondent pas

            Sub test2(MailAd)

            On Error GoTo erreur_création_e_mail

            ' crée l'objet : e_mail
            Set e_mail = Application.CreateItem(olMailItem)

            ' ajoute les destinataires
            destinataires = Split(mail_liste, ";")

            2- Par ailleurs, le nombre et la position des variables doivent être les mêmes dans la procédure et l'appel de procédure

            Call appli_Outlook.test2(MailAd, sujet, Message, NomFichier) -- appel procédure
            4 variables : variable 1 = liste destinataires, variable2 = objet message, variable 3 = texte message, variable 4 = nom pièce jointe

            Sub test2(MailAd) --- définition procédure
            doit donc avoir 4 variables selon l'ordre ci-dessus
            1. Salut thev,

              J'ai fait ce que tu m'as dit, ça a déjà pas mal avancé. Ce que je ne comprends pas c'est qu'au moment de lancer le programme, j'ai le message suivant qui s'affiche :

              "erreur envoi e-mail -2147467259 Les zones A, CC, cci doivent contenir au moins un nom ou une liste de distribution"

              Pourtant la case sélectionnée au départ est une adresse mail. Comment faire pour l'envoyer à cette adresse?

              Merci encore

              Coklin
              1. Pour que la procédure sous Outlook soit reconnue, il faut que :

                1- elle soit placée sous ThisOutlookSession,
                2- que les macros sous outlook soient activées (voir onglet sécurité),
                3- que outlook soit chargé,
                4- que outlook vba soit chargé : pour cela rajouter sous ThisOutlookSession le code événement :

                Private Sub Application_Startup()
                End Sub

                Par ailleurs, pour tester le chargement de outlook, le code sous excel doit être modifié ainsi :

                ' appelle une sous-procédure Outlook VBA
                Set appli_Outlook = Outlook.Application
                If appli_Outlook.Explorers.Count > 0 Then
                    Call appli_Outlook.test2(MailAd, sujet, Message, NomFichier)
                Else
                    MsgBox "erreur envoi e_mail car outlook non chargé"
                End If
                 
                1. Bonjour,

                  J'ai le même problème que Ludivine sur la même chose concernant le call du test2 en VB Outlook. J'aimerais comprendre surtout que je suis allé dans les références d'Outlook et que j'ai ajouté "MS Office Excel Library" et pareil Sous excel pour la library Outlook.

                  Je m'entraine à ce qu'a fait ludivine, donc j'envoie mon code pour mieux comprendre :

                  Sous VB Excel
                  Sub test1()

                  Workbooks("julieC - Irsem.xls").Activate

                  ' Récupérer les mails des destinataires
                  Sheets("admin").Activate
                  MailAd = Range("N50").Value

                  'choix pièce jointe
                  NomFichier = Application.GetOpenFilename

                  ' appelle une sous-procédure Outlook VBA
                  Set appli_Outlook = Outlook.Application
                  Call appli_Outlook.test2(MailAd, sujet, Message, NomFichier)

                  End Sub

                  Sous Outlook

                  Sub test2(MailAd)

                  On Error GoTo erreur_création_e_mail

                  ' crée l'objet : e_mail
                  Set e_mail = Application.CreateItem(olMailItem)

                  ' ajoute les destinataires
                  destinataires = Split(mail_liste, ";")
                  For i_destinataire = 0 To UBound(destinataires) - 1
                  e_mail.Recipients.Add destinataires(i_destinataire)
                  Next i_destinataire

                  ' remplit le sujet et le message
                  e_mail.Subject = "Essai 1"
                  e_mail.Body = "Essai Message"

                  ' envoie l'e-mail
                  e_mail.Send

                  ' fin traitement
                  création_mail_exit:
                  Exit Sub

                  ' routine erreur
                  erreur_création_e_mail:
                  MsgBox "erreur envoi e-mail " & Err.Number & " " & Err.Description
                  Resume création_mail_exit

                  'Attachement pièce jointe
                  If NomFichier <> "" Then
                  Set pièce_jointe = e_mail.Attachments
                  pièce_jointe.Add NomFichier, olByValue, 1, NomFichier
                  End If

                  End Sub

                  Je suis encore débutant, en espérant que vous pourrez m'aider

                  Bon week end

                  Coklin
                  1. Je viens de rencontrer sous Outlook 2003 (j'avais testé sous Outlook 2007) le même souci de non accès à la procédure VBA Outlook. Cela venait du fait que le projet VBA Outlook n'était pas en ligne même si l'application OutlooK était chargée. Pour forcer la mise en ligne du projet VBA Outlook, ajouter dans VB Outlook / ThisOutlookSession :

                    Private Sub Application_Startup()

                    End Sub

                    pour la pièce jointe :

                    ---- procédure Excel VBA ----------------- 
                    Sub test1 
                    
                    ' Récupérer les mails des destinataires 
                    Workbooks("test.xls").Activate 
                    Sheets("admin").Activate 
                    MailAd = Range("J11").Value 
                    
                    sujet = "test01-sujet" 
                    message = "test01-message" 
                    
                    'choix pièce jointe 
                    NomFichier= Application.GetOpenFilename
                    
                    ' appelle une sous-procédure Outlook VBA 
                    Set appli_Outlook = New Outlook.Application 
                    call appli_Outlook .test2(MailAd,sujet,message,NomFichier) 
                    
                    end Sub 
                    
                    -- procédure Outlook VBA ------ 
                    Sub test2(mail_liste,sujet,Message,NomFichier)
                    
                    If NomFichier Then
                            Set pièce_jointe = e_mail.Attachments
                            pièce_jointe.Add NomFichier, olByValue, 1, NomFichier
                    End If
                    
                     
                    1. Effectivement, en retestant d'exécuter la macro, ça ne fonctionnait plus. L'ajout du code:
                      Private Sub Application_Startup() 
                      End Sub 
                      

                      a résolu le problème.

                      L'ajout du fichier en fichier jointe fonctionne également, j'ai juste relevé une toute petite erreur. Voici le code correct à ajouter dans VB Outlook/ macro test2:
                      If NomFichier <> "" Then
                              Set pièce_jointe = e_mail.Attachments
                              pièce_jointe.Add NomFichier, olByValue, 1, NomFichier
                      End If
                      


                      Tout fonctionne donc parfaitement! :-) Encore une fois, merci thev et bonne journée.
                      Je passe en résolu.
                  2. Je ne pense pas. Vérifie les bibliothèques chargées dans Outlook via l'éditeur VB : outils --> références. peut-être en manque-t-il une.
                    1. Merci thev, effectivement le problème venait des références dans VB outlook. Désormais cela fonctionne! ;-) Je te remercie de ta patience.
                      Je me permets de te poser une autre question: je souhaite envoyer mon fichier Excel en fichier joint. Avant, j'utilisais le code suivant:
                                      
                      ' Récupérer les mails des destinataires
                      Workbooks(FichierSource).Activate
                      Sheets("admin").Activate
                      MailAd = Range("H11").Value
                      
                      ' Aller sur le fichier à transmettre
                      Workbooks(NomFichier).Activate
                                      
                      ' Ouvrir une page Outlook pour envoyer le fichier
                      Application.Dialogs(xlDialogSendMail).Show MailAd
                      


                      Mais je ne sais pas comment adapter la dernière ligne de code par rapport au code que tu m'as proposé?
                  3. Le code est correct mais il convient de modifier :

                    For i_destinataire = 0 To UBound(destinataires)
                    en
                    For i_destinataire = 0 To UBound(destinataires) - 1
                    pour résoudre le premier message d'erreur suivant: "erreur envoi e-mail -2147467259 Impossible de reconnaître un ou plusieurs noms".

                    Pour le message d'erreur :"propriété ou méthode non gérée par cet objet", qui indique qu'il ne trouve pas la procédure test2 dans outlook VBA, cette erreur se produit également si les macros dans l'application Outlook sont désactivées.
                    Il faut donc vérifier dans le menu outils --> macro --> sécurité, l'option retenue.
                    1. Bonjour thev, et merci encore de ton aide.

                      J'ai fait les modifications que tu m'as conseillées. Effectivement je n'avais pas pensé à modifier la sécurité des macros sous Outlook. J'ai mis au niveau faible, mais ça plante toujours. En cherchant, je suis allée dans Outil --> Macro --> Sécurité, onglet "Editeurs approuvés". Le certificat à mon nom y est bien, mais je ne peux pas cocher "Faire confiance au projet Visual Basic", alors que sous Excel il est coché pour pouvoir exécuter certains programmes. Serait-ce la cause du blocage?
                  4. Je crois que le mieux est de reposter le code exact que tu utlises .
                    1. Dans un module de mon fichier .xls
                      Sub test1()
                      
                      ' Récupérer les mails des destinataires
                      Sheets("admin").Activate
                      MailAd = Range("H11").Value
                        
                      ' appelle une sous-procédure Outlook VBA
                      Set appli_Outlook = Outlook.Application
                      Call appli_Outlook.test2(MailAd)
                      
                      End Sub


                      Dans VB Outlook / ThisOutlookSession
                      Sub test2(mail_liste)
                      
                      On Error GoTo erreur_création_e_mail
                      
                      ' crée l'objet : e_mail
                      Set e_mail = Application.CreateItem(olMailItem)
                      
                      ' ajoute les destinataires
                      destinataires = Split(mail_liste, ";")
                      For i_destinataire = 0 To UBound(destinataires)
                      e_mail.Recipients.Add destinataires(i_destinataire)
                      Next i_destinataire
                      
                      ' remplit le sujet et le message
                      e_mail.Subject = sujet
                      e_mail.Body = Message
                      
                      ' envoie l'e-mail
                      e_mail.Send
                      
                      ' fin traitement
                      création_mail_exit:
                      Exit Sub
                      
                      ' routine erreur
                      erreur_création_e_mail:
                      MsgBox "erreur envoi e-mail " & Err.Number & " " & Err.Description
                      Resume création_mail_exit
                      
                      End Sub
                      
                  5. Pour la nouvelle erreur, essayer la modification suivante (suppression paramètre New):

                    ' appelle une sous-procédure Outlook VBA
                    Set appli_Outlook = Outlook.Application
                    Call appli_Outlook.test2(MailAd)

                    Par ailleurs, pour remplir objet et sujet du message apporter les modifications suivantes :

                    ---- procédure Excel VBA -----------------
                    Sub test1

                    ' Récupérer les mails des destinataires
                    Workbooks("test.xls").Activate
                    Sheets("admin").Activate
                    MailAd = Range("J11").Value
                    sujet = "test01-sujet"
                    message = "test01-message"


                    ' appelle une sous-procédure Outlook VBA
                    Set appli_Outlook = New Outlook.Application
                    call appli_Outlook .test2(MailAd,sujet,message)

                    end Sub

                    -- procédure Outlook VBA ------
                    Sub test2(mail_liste,sujet,Message)
                    1. J'ai testé en enlevant le "new", pas de changement.
                      J'ai testé les autres modifications mais je suis bloquée par le bogue.
                      Ce qui est dingue, c'est qu'hier il ne me faisait pas cela. J'ai travaillé sur du code VB, penses-tu que j'ai utilisé une instruction qui pourrait être source de ce problème? (genre Application.ScreenUpdating = false
                      Application.DisplayAlerts = false...)
                  6. Pour le problème de reconnaissance des adresses, après test des 2 procédures, il faut en fait apporter la modification suivante :

                    ' ajoute les destinataires
                    destinataires = Split(mail_liste, ";")
                    For i_destinataire = 0 To UBound(destinataires) - 1
                    e_mail.Recipients.Add destinataires(i_destinataire)
                    Next i_destinataire

                    Il ajoutait en fait un destinataire vide de trop, ce qui provoquait l'erreur.

                    Pour la nouvelle erreur, pour le moment je ne vois pas.
                    1. il ne trouve pas la procédure test2 dans outlook VBA
                      2 raisons :
                      1- l'application Outlook n'est pas démarrée,
                      2- la procédure test2 ne setrouve pas sous ThisOutlookSession
                      1. Merci pour ta réponse thev.

                        Outlook est bien démarré, et la procédure test2 est bien sous ThisOutlookSession. Et j'ai repris exactement ton code pour test1 (j'avais modifié MailAd contre Mail_liste).

                        Sub test1()

                        ' Récupérer les mails des destinataires
                        Sheets("admin").Activate
                        MailAd = Range("H11").Value
                        MsgBox (MailAd)

                        ' appelle une sous-procédure Outlook VBA
                        Set appli_Outlook = New Outlook.Application
                        Call appli_Outlook.test2(MailAd)

                        End Sub

                        Mais il plante toujours. Pourtant hier il fonctionnait. Il plantait juste par rapport au fait qu'il ne reconnaissait pas les adresses.
                    2. réponse : oui et non

                      1) oui si le destinataire fourni est fourni sous la forme d'un nom (par ex robert martin) auquel cas la macro fait appel au carnet d'adresses Outlook pour le traduire sous la forme d'une adresse e-mail

                      2) non si le destinataire fourni est sous la forme d'une adresse e-mail (nnnnnn@ddddddd.ccc ) auquel cas l'accès au carnet d'adresse n'est pas nécessaire.
                      1. Bonjour thev,

                        j'ai un nouveau problème que je n'avais pas hier (sur le même code...j'ai du mal à comprendre!).
                        Sur la ligne
                        Call appli_Outlook.test2(MailAd)


                        J'ai le message "propriété ou méthode non gérée par cet objet". Pourtant les références:
                        Microsoft outlook 11.0 Object LIbrary et
                        OutlookAddin 1.0 TypeLibrary. QUelle référence peut-il bien me manquer? Surtout qu'entre hier et aujourd'hui je n'en ai pas enlevé!

                        Par rapport à ma liste de destinataires, elle est déjà au format nnnnnn@ddddddd.ccc , et nom une liste de noms.
                        Les 2 problèmes sont peut-être liés?
                    3. Le message d'erreur indique qu'il ne trouve pas un ou plusieurs noms dans le carnet d'adresse Outlook.

                      1) Pour visualiser un à un les destinataires placés dans le message envoyé, ajouter l'instruction suivante :
                      'ajoute les destinataires
                      destinataires = Split(mail_liste, ";")
                      For i_destinataire = 0 To UBound(destinataires)
                      MsgBox "destinataire = " & destinataires(i_destinataire)
                      e_mail.Recipients.Add destinataires(i_destinataire)
                      Next i_destinataire

                      2) Pour voir le ou les destinataires qui posent problème, en essayer un seul, puis deux, ....
                      1. RE-bonjour thev, et merci de m'aider

                        Suis-je obligée d'utiliser des adresses mails déjà enregistrées dans Outlook? Y-a-t-il une méthode pour pallier cela?

                        Biz
                    4. la solution ne ne parait pas compliquée. Voici un exemple de code :

                      1- procédure Excel VBA

                      Sub test1

                      ' Récupérer les mails des destinataires
                      Workbooks("test.xls").Activate
                      Sheets("admin").Activate
                      MailAd = Range("J11").Value

                      ' appelle une sous-procédure Outlook VBA
                      Set appli_Outlook = New Outlook.Application
                      call appli_Outlook .test2(MailAd)

                      end Sub

                      2- sous-procédure à mettre sous Thisoutlooksession dans le projet Outlook VBA pour éviter les avertissements de sécurité :

                      Sub test2(mail_liste)

                      On Error GoTo erreur_création_e_mail

                      ' crée l'objet : e_mail
                      Set e_mail = application.CreateItem(olMailItem)

                      ' ajoute les destinataires
                      destinataires = Split(mail_liste, ";")
                      For i_destinataire = 0 To UBound(destinataires)
                      e_mail.Recipients.Add destinataires(i_destinataire)
                      Next i_destinataire

                      ' remplit le sujet et le message
                      e_mail.Subject = sujet
                      e_mail.Body = Message

                      ' envoie l'e-mail
                      e_mail.Send

                      ' fin traitement
                      création_mail_exit:
                      Exit Sub

                      ' routine erreur
                      erreur_création_e_mail:
                      MsgBox "erreur envoi e-mail " & Err.Number & " " & Err.Description
                      Resume création_mail_exit

                      End Sub
                      1. Bonjour thev et merci pour ta réponse.

                        La macro test1 ne s'exécute pas. J'ai le message d'erreur suivant: "erreur envoi e-mail -2147467259 Impossible de reconnaître un ou plusieurs noms".
                        J'ai ajouté la référence: "Microsoft outlook Object Library". Faut-il que j'en ajoute une autre?

                        J'ai aussi tenté de modifier le code car dans test1, on utilise MailAd et dans test2, on utilise mail_liste. Donc j'ai changé test1 en
                        Sub test1()
                            Sheets("admin").Activate
                            mail_liste = Range("H11").Value
                            'MsgBox (mail_liste)
                            
                            ' appelle une sous-procédure Outlook VBA
                            Set appli_Outlook = New Outlook.Application
                            Call appli_Outlook.test2(mail_liste)
                        
                        End Sub

                        Mais toujours bloqué. :-(