Application Outlook dans Excel [Résolu]

MEUCORACAO 32 Messages postés jeudi 30 juin 2011Date d'inscription 6 juillet 2015 Dernière intervention - 13 janv. 2014 à 09:56 - Dernière réponse : cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention
- 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
Afficher la suite 

Votre réponse

11 réponses

cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 13 janv. 2014 à 11:13
0
Merci
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

Commenter la réponse de cs_Jack
MEUCORACAO 32 Messages postés jeudi 30 juin 2011Date d'inscription 6 juillet 2015 Dernière intervention - 13 janv. 2014 à 12:46
0
Merci
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.
Commenter la réponse de MEUCORACAO
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 13 janv. 2014 à 13:06
0
Merci
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.
Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 13 janv. 2014 à 13:15
0
Merci
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
Commenter la réponse de cs_Jack
MEUCORACAO 32 Messages postés jeudi 30 juin 2011Date d'inscription 6 juillet 2015 Dernière intervention - 13 janv. 2014 à 13:50
0
Merci
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 !
Commenter la réponse de MEUCORACAO
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 13 janv. 2014 à 15:17
0
Merci
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
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 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)
Commenter la réponse de cs_Jack
MEUCORACAO 32 Messages postés jeudi 30 juin 2011Date d'inscription 6 juillet 2015 Dernière intervention - 13 janv. 2014 à 16:31
0
Merci
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,
Commenter la réponse de MEUCORACAO
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 14 janv. 2014 à 01:23
0
Merci
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.
MEUCORACAO 32 Messages postés jeudi 30 juin 2011Date d'inscription 6 juillet 2015 Dernière intervention - 14 janv. 2014 à 09:35
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.
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 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.
Commenter la réponse de cs_Jack

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.