Application Outlook dans Excel

Résolu
MEUCORACAO Messages postés 35 Date d'inscription jeudi 30 juin 2011 Statut Membre Dernière intervention 23 octobre 2018 - 13 janv. 2014 à 09:56
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 14 janv. 2014 à 13:10
Bonjour à tous,

Je souhaiterais sous votre aide envoyer un mail enregistré à tous les membres de mon association. De ce fait, j'ai dans une colonne excel tous les mails des adhérents et je voudrais via vba charger le mail enregistrer et l'envoyer à tous mes destinataires, en envoyant un mail par personne pour diminuer les risques de rejet de spam par les serveurs messagerie.

J'ai commancé à écrire ça mais cela m'implique une erreur :


Sub Send_Mail_Outlook()

'Il faut activer la référence "Microsoft Outlook Library" Avant de lancer cette macro,
' Dans l'éditeur VBA: Faire Menu / Tools / Reference / Cocher "Microsoft Outlook Library"

Dim ObjOutlook As New Outlook.Application
Dim ObjOutlookmail As MailItem
Dim NomFichier As String

Dim i As Integer

For i = 0 To 5000 Step 1

Set ObjOutlook = New Outlook.Application
Set oBjMail = ObjOutlook.GetOpenFilename("C:\Users\Anthony\Desktop\CXN n82 + Fiche Adhésion 2014.msg")

With oBjMail

.To = Cells(i, 1) ' le destinataire
.Send ' '.Send' pour envoyer sans vérification

End With
Next

End Sub

Je n'arrive pas à trouver la procédure pour ouvrir un mail préenregistré. Je vous remercie par avance pour votre aide,

Bien cordialement,

Anthony

8 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 janv. 2014 à 11:13
Bonjour

Si tu as une erreur, il serait bon de nous laquelle et sur quelle ligne ...

Voilà un exemple d'envoi simple (Outlook 2010 = Office 14) :
Public Sub TestMail()
    Dim oOoA As Outlook.Application
    Dim oOoItem As Outlook.MailItem
    Dim oOoRcp As Outlook.Recipient
    Dim aTemp() As Byte
    Dim ff As Integer
    
    Set oOoA = New Outlook.Application
    Set oOoItem = oOoA.CreateItem(olMailItem)
    With oOoItem
        ' Destinataire(s)
        Set oOoRcp = .Recipients.Add("toto@serveur.fr")
        oOoRcp.Type = olTo
        
        ' Sujet du mail
        .Subject = "Coucou Subject"
        
        ' Formattage du message préparé dans un fichier RTF
        ff = FreeFile
        Open ActiveWorkbook.Path & "\Bonjour.rtf" For Binary Access Read As #ff
            ReDim aTemp(0 To LOF(ff) - 1)
            Get #ff, , aTemp
        Close #ff
        .BodyFormat = olFormatRichText
        .RTFBody = aTemp
        
        ' Fichier joint
        .Attachments.Add ActiveWorkbook.Path & "\Fichier test.pdf", OlAttachmentType.olEmbeddeditem
        .Send
    End With
End Sub

0
MEUCORACAO Messages postés 35 Date d'inscription jeudi 30 juin 2011 Statut Membre Dernière intervention 23 octobre 2018
13 janv. 2014 à 12:46
En effet, désolé pour cet oubli. L'erreur est une "erreur d'exécution 438 : méthode ou propriété non gérée par cet objet". Il s'agit de la ligne

Set oBjMail = ObjOutlook.GetOpenFilename("C:\Users\Anthony\Desktop\CXN n82 + Fiche Adhésion 2014.msg")

Je pense que Outlook ne sait pas gérer Getopenfilename mais je ne vois pas quoi mettre à la place, et vous?

Je vous remercie encore pour votre aide.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 janv. 2014 à 13:06
Je t'ai donné la solution : Il te suffit de l'expérimenter.
Si tu remplaces ton message préparé (que je ne sais pas comment ouvrir) par un fichier RTF (nommé "Bonjour.rtf" sur le même répertoire que le casseur dans mon exemple) que tu peux préparer dans Word, tu pourras faire la même chose.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 janv. 2014 à 13:15
Bien entendu, tu auras ajouté une référence à Outlook dans le menu "Outils" + "Référence" dans l'éditeur VBA.
Appuis sur la touche F2 qui t'ouvrira l'explorateur d'objets.
Dans la ComboBox de choix, sélectionne "Outlook" et dans les objets présents, recherche et clique sur "Application" qui correspond à ton objet "ObjOutlook"
Tu remarqueras que "GetOpenFilename" ne fait pas partie de ses fonctions. Donc oui, c'est normal d'avoir une erreur.

Peut-être que
Set oBjMail = Application.GetOpenFilename(...
résoudra ton problème puisqu'il s'agit d'une fonction Excel et pas Outlook
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MEUCORACAO Messages postés 35 Date d'inscription jeudi 30 juin 2011 Statut Membre Dernière intervention 23 octobre 2018
13 janv. 2014 à 13:50
Salut cs_Jack, merci pour ton aide,

Je viens de réussir à la faire. Mon code est le suivant :


Sub Send_Mail_Outlook()

'Il faut activer la référence "Microsoft Outlook Library" Avant de lancer cette macro,
'Dans l 'éditeur VBA: Faire Menu / Tools / Reference / Cocher "Microsoft Outlook Library"

Dim i As Integer

'For i = 1 To 5000 Step 1

Set oBjMail = GetObject(, "Outlook.Application")
If oBjMail Is Nothing Then Err.Raise ERR_OUTLOOK_NOT_OPEN

Set Eml = oBjMail.CreateItemFromTemplate("C:\Users\Anthony\Desktop\CXN n82 + Fiche Adhésion 2014.msg")

With Eml

.To = Range("A" & i).Value ' le destinataire
.Send ' Ici on peut mettre '.Send' pour l'envoyer sans vérification

End With
'Next

End Sub


Cependant, mon problème se situe au niveau de .To. En effet, en mettant "mail@mail.fr", cela fonctionne parfaitement. Cependant, je souhaiterai mettre une fonction incrémentielle pour chaque mail qui se situe dans la colonne A mais j'ai une "erreur d'exécution 1004 : la méthode 'range' de l'objet '_global' a échoué ". connais-tu ce problème? Je te remercie par avance pour ton aide.

Bien cordialement !
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 janv. 2014 à 15:17
C'est dommage d'avoir supprimé les objets typés et les avoir remplacés par des "Object" en lien tardif (GetObject)
Du coup, tu perds l'intellisence (proposition des noms de fonction ou autres quand tu tapes le . derrière le nom d'un objet).

De quel type est "Eml" ?
Supposons qu'il s'agisse d'un MailItem.

Si tu lances ton programme tel qu'il apparait dans ton dernier collage, 'i' vaut 0 --> Range de A0 donne une erreur, c'est clair.

Apprends à déboguer pour suivre ce que ton programme fait :
- F9 sur une ligne de code; elle change de couleur
Le programme s'y arrêtera au prochain passage.

Lors de l'arrêt, survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
- F8 (VB6/VBA) ou F10 (.Net) pour avancer d'une ligne de code
- F5 pour continuer normalement
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 janv. 2014 à 15:20
PS : Si tu expédies 5000 mails les uns derrière les autres, tu risques le black-listage de ton IP.
--> Vérifie que tu as bien 5000 données dans ta colonne A
--> Ajoute une tempo après chaque envoi (parcoure le foum pour trouver comment faire)
0
MEUCORACAO Messages postés 35 Date d'inscription jeudi 30 juin 2011 Statut Membre Dernière intervention 23 octobre 2018
13 janv. 2014 à 16:31
Re,

Merci encore pour ta réponse. Bon la méthode de débogage je connaissais mais j'avais juste pas pour le 0 car au début j'avais mis la méthode cells(). Cela fonctionne bien.

Merci pour la tempo, je viens de regarder, dis moi si cela convient :


Sub Send_Mail_Outlook()

'Il faut activer la référence "Microsoft Outlook Library" Avant de lancer cette macro,
'Dans l 'éditeur VBA: Faire Menu / Tools / Reference / Cocher "Microsoft Outlook Library"

Dim i, n As Integer
Dim Destinataire As String
Dim Eml As MailItem

'Calcul du nombre de mails
n = 0
For Each Cell In Sheets(1).Columns(1).Cells
If IsEmpty(Cell) = False Then n = n + 1
Next Cell

For i = 1 To n Step 1

Set oBjMail = GetObject(, "Outlook.Application")
If oBjMail Is Nothing Then Err.Raise ERR_OUTLOOK_NOT_OPEN
Set Eml = oBjMail.CreateItemFromTemplate("C:\Users\Anthony\Desktop\CXN n82 + Fiche Adhésion 2014.msg")

With Eml
.To = Range("A" & i).Value ' le destinataire
.Send ' Ici on peut mettre '.Send' pour l'envoyer sans vérification
End With

Application.StatusBar = "Merci de patienter"
Application.Wait Now + TimeValue("00:00:10")
Application.StatusBar = False

Next

End Sub

Merci encore et bonne fin de journée,

cordialement,
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
14 janv. 2014 à 01:23
Ca me semble pas mal.
Juste une anomalie :
Tu fais une jolie boucle For-Each pour énumérer les cellules non vides de la colonne.
Cela te donnera un chiffre du nombre de données, mais cela ne garantira pas qu'elles soient continues --> Le For-Next qui suit va commencer à 1 et finir à 55 (supposition) parce qu'il a vu 55 données, mais s'il y a une cellule vide en 10, l'instruction .To = va planter.
Si tu pars de l'hypothèse que la boucle doit s'arrêter dès qu'elle rencontre une cellule vide dans la liste, tu peux simplfier :
' Ces lignes n'ont rien à faire DANS la boucle
Set oBjMail = GetObject(, "Outlook.Application")
If oBjMail Is Nothing Then
Err.Raise ERR_OUTLOOK_NOT_OPEN
Else
For Each maCell In Sheets(1).Columns(1).Cells
If IsEmpty(maCell) = True Then Exit For
Set Eml = oBjMail.CreateItemFromTemplate(" ...
Eml.To = maCell.Value ' le destinataire
Eml.Send
' ici la tempo
Next maCell
End If
PS : "Cell" ressemble trop à un mot clé du langage : attention aux erreurs de compilation difficiles à trouver en pareil cas.
0
MEUCORACAO Messages postés 35 Date d'inscription jeudi 30 juin 2011 Statut Membre Dernière intervention 23 octobre 2018
Modifié par MEUCORACAO le 14/01/2014 à 09:40
Merci Jack pour ces super conseils. Je vais en tenir compte dans mon programme.
Par compte, si je sors les lignes que tu dis de la boucle, j'ai une erreur "l'objet a été déplacé ou supprimé". Je pense qu'il est préférable de les laisser dedans.

Merci,

Bonne journée à toi.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
14 janv. 2014 à 13:10
Bizarre cette erreur.
Cela venir de ta structure de Sub qu'il faudrait voir dans son ensemble.
Du moment que objMail est dimensionné dans la Sub, son existance devrait persister jusu'à la sortie de cette Sub.
En laissant la création dans la boucle, tu oblige le programme à rechercher une instance qu'il a déjà recherché avant.
Ce n'est pas bien grave, mais juste pas logique.
0
Rejoignez-nous