Envoi de mail via Excel

Résolu
cs_louisdo Messages postés 4 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 20 janvier 2006 - 16 janv. 2006 à 10:30
dardeviIIe Messages postés 1 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 22 février 2007 - 22 févr. 2007 à 16:01
bonjour,
je cherche à envoyer des mails automatiquement à partir d'Excel,
mais je n'arrive qu'a envoyé le fichier actif,
merci pour l'aide
LsDx
A voir également:

19 réponses

cs_jordinette Messages postés 134 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 5 avril 2007
16 janv. 2006 à 11:41
Moi je code ces ligne là das le VBA de excel

Dim MonOutlook As Object
Dim MonMessage As Object
Dim attach As Attachments
Dim MonFichierjoint As Attachment

Set MonOutlook = CreateObject("Outlook.Application")
Set MonMessage = MonOutlook.CreateItem(0)
Set attach = MonMessage.Attachments

' Préparation du message :
MonMessage.To = dest

' Récupération du corps de l'E-mail :
MonMessage.bcc = '"destinataires en copie"

MonMessage.Subject = " Demande quelconque "
MonMessage.body = " Corps de ton message "

fichier = Chemin & "\nomdufichierexcel.xls"
MonMessage.Attachments.Add fichier

' C'est parti :
If Not Error Then
MonMessage.Send
End If

Pour utiliser se code il faut avoir enregistré le classeur excel que tu ve envoyé. oubli pas de rajouter la référence outlook dans ta fenetre de vba outils/références/Microsoft Outlook x.0 Object library (x correspondant à la verion de ton outlook, expl 9 pour office 2000).
Voilà si tu as besoin d'info....
Jordinette
3
cs_jordinette Messages postés 134 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 5 avril 2007
16 janv. 2006 à 10:52
Bonjour moi j'ai réussi, mais faudrais que tu me donne plus d'info pour que je te renseigne.
jordinette
0
cs_louisdo Messages postés 4 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 20 janvier 2006
16 janv. 2006 à 11:28
voila la fonction que j'utilise,

Dim dest As String
dest = InputBox("Mail du dest ?")


ActiveWorkbook.SendMail Recipients:=dest
ActiveWorkbook.SendMail Subject = "Demande quelconque"
ActiveWorkbook.SendMail ReturnReceipt = True

le problème est qu'il ne tient pas compte des deux dernieres lignes et qu'il envoi simplement le fichier actif.
Merci pour ton aide
0
cs_louisdo Messages postés 4 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 20 janvier 2006
16 janv. 2006 à 11:59
merci pour ton aide Jordinette, ça marche super bien


par contre j'ai retiré le test if de la fin, il déboguais dessus


Louisdo
0

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

Posez votre question
cs_jordinette Messages postés 134 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 5 avril 2007
16 janv. 2006 à 12:01
Cool si ça ta bien aidé ;@)
Bonne continuation.
Jordinette
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
16 janv. 2006 à 17:00
Oui mais sinon, plus simplement, as-tu essayé d'inverser les lignes et de mettre la première à la fin ???

ActiveWorkbook.SendMail Subject = "Demande quelconque"
ActiveWorkbook.SendMail ReturnReceipt = True

ActiveWorkbook.SendMail Recipients:=dest


Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
0
marinolive Messages postés 13 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 3 janvier 2011
21 mars 2006 à 09:32
Bonjour Jordinette,

Je te remercie d'abord pour ton code qui m'a beaucoup aidé. Il me reste 2 ou 3 petits problèmes :
- une fenêtre Outlook me prévient que mon ordinateur va envoyer un mail et me demande de valider or j'aimerais ne pas avoir à valider
- je ne sais pas comment gérer les retours à la ligne, police et mise en forme du texte dans le corps du message
- j'aimerais pouvoir attacher au message toutes les pièces jointe qui commence par une séquence de lettre (plutôt qu'une seule pièce jointe)

Si tu avais des idées sur la façon de résoudre ces points je t'en serai super reconnaissant !

Merci
0
cs_jordinette Messages postés 134 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 5 avril 2007
21 mars 2006 à 10:27
Bonjour
Concernant la fenêtre outlook qui te prévient pour l'envoi du mail et l'obligation de validé pour que cela soit fait, c'est une sécurité d'outlook je ne crois pas que tu puisses faire une validation par le code ou encore que cette fenetre ne s'affiche pas.
Si tu veux faire de la mise en page de ton mail autre que changer de ligne, je te suggère de crée un nouveau mail directement dans outlook avec la mise en forme que tu souhaites et enregistrer se mail en "modèle outlook" et d'y faire appel dans ton code au lieu de créer un mail par le code. Car par le code tu peux seulement faire des retour à la ligne (vbcrlf) ou sauter une ligne (vbcrlf & vbcrlf).
Pour joindre tes élements en fonction du début de leur nom, je dois dire que ton information est un peu vague, et pour ce que j'ai compris je ne suis pas sure que cela soit possible.
J'espère que cela t'as aidé. Je peux te donner un exemple de code d'appel de modèle de mail si tu as besoin.
bonne journée
Jordinette
0
marinolive Messages postés 13 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 3 janvier 2011
21 mars 2006 à 16:34
Bonjour Jordinette,
Et merci pour la rapidité de ta réponse. Pour la sécu. d'Outlook, tant pis ... Pour le mail à créer en "modèle" c'est parfait car je ne savais pas comment faire, mais depuis le début c'était en fait mon objectif plus souple que le corps du message dans une cellule Excel, notamment en terme de signature. Mais je ne sais ni comment enrg. le mail en "modèle Outlook" (mais ça je devrais pouvoir trouver avec l'aide) ni comment l'appeler depuis Excel (ta proposition de code d'appel de mail est donc bienvenue !). Au sujet de mes pièces jointes multiples, voici un peu plus d'explication :
Dans ton code tu proposais d'identifier le fichier et son chemin et cela marche très bien. Maintenant j'ai un nombre variable de pièces jointes qui commence toutes, pour un même destinataire, par son nom. Je voudrais pouvoir insérer dans le code un moyen de faire attacher au mail toutes les pièces jointes qui commence par exemple par "michel". J'ai essayée de prendre le nom (commun à toutes les pièces jointes) et de faire une commande du type : chemin\michel.*.xls en espérant que comme dans une recherche l'étoile prendrait tout, mais ça marche pas ... tes suggestions sont les bienvenues.
Merci encore
Olivier
0
cs_jordinette Messages postés 134 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 5 avril 2007
22 mars 2006 à 08:49
Bonjour,
pour créer un mail modèle dans outlook, c'est simple tu créer un mail avec le bouton Nouveau, tu rédige ton mail et au lieux d'envoyer tu choisir Ficher/Enregistrer Sous, tu lui donne un nom, tu choisis le type de ficher "Modèle outlook", puis le répertoir où tu veux le sauvegarder. Attention si tu choisis le répertoire avant le type de fichier il te remettra le répertoire "Modèle" par défaut.

'Appel du mail modèle
'envoie du mail
'Initialisation:
Dim MonOutlook As Object
Dim MonMessage As Object

Set MonOutlook = CreateObject("Outlook.Application")

Set MonMessage = MonOutlook.CreateItemFromTemplate(chemin & "\mail.oft")

Set attach = MonMessage.Attachments

MonMessage.Subject = "Objet du mail"

fichier = ' là je sais pas encore comment joindre tous les fichiers qui commencent pareil mais je cherche

MonMessage.Attachments.Add fichier

' enregistrement dans Brouillon, mettre Monmessage.send pour un envoi direct (moi je préfère un envoi grouper et pouvoir vérifier depuis la boite brouillon d'outlook)

MonMessage.Save

'Fermeture de la session Outlook :
Set MonOutlook = Nothing

'effacer le contenu
MsgBox " Le mail a été généré dans le dossier Brouillons d'Outlook ! ", vbInformation

Voilà pour l'exemple, si j'ai 5 minute je vais essayé de trouver comment joindre une plage de fichier commencant par les mm lettres.
Bon courage
Jordinette
0
marinolive Messages postés 13 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 3 janvier 2011
22 mars 2006 à 09:51
Bonjour et merci encore ...
J'avais fini par trouver pour le modèle dans Outlook, mais pas pour le code d'appel du modèle dans Excel !
En ce qui concerne mon problème de plage de pièces jointes, j'ai un début de piste un peu compliqué mais qui bugue à un endroit :
code :
For Each C In Selection

'J'ai "ROBERT" en Cellule c et mon chemin en (0,4)
MyPath = Range(C.Offset(0, 4).Address)

'je fais copier en cellule (0,5) la premières pièce jointe qui commence par "PC ROBERT"
Range(C.Offset(0, 5).Address) = Dir(Range(C.Offset(0, 4).Address) & "PC " & Range(C.Address) & "*")

'je fais une boucle pour que soient copiés successivement tous les fichiers commençant par "PC ROBERT"
'dans les 15 cellules adjacentes
For i = 6 To 15
Range(C.Offset(0, i).Address) = Dir
Next i
'ça marche, mais le problème c'est que le nbre de pièces jointes est variable et que s'il est inférieur
'à 15, Excel se met en débogage, or j'ai du code derrière à exécuter ...

Next C

Saurais-tu comment introduire un élément dans la boucle pour dire à excel que s'il ne trouve plus de pièces jointes commençant par "PC ROBERT", il arrête la boucle et passe au reste du code ?

Evidemment si tu as une solution plus simple pour gérer le groupe de pièces jointes tu es bienvenue !


Si je peux me permettre d'abuser de ton temps, j'ai une autre question : quand sous vba je convertis des doc excel en pdf en passant par l'impression sur acrobat distiller, je dois systématiquement valider l'enregistrement du fichier sous Adobe en cliquant sur oui, saurais-tu comment automatiser cette valisation ?

Et vraiment merci !
0
cs_jordinette Messages postés 134 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 5 avril 2007
22 mars 2006 à 11:36
Re,
J'ai trouvé plus simple, je planche dessus pour l'adapter au morceau de code que je t'ai donné précédement... Tu sais dans quels dossiers tes fichiers a joindre se trouvent? où tu veux qu'il cherche sur tout les disque durs? et tout type de fichier? ou seulement .xls?
j'espère te donner la soluce dans l'après midi ;o)
Jordinette
0
marinolive Messages postés 13 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 3 janvier 2011
22 mars 2006 à 11:48
Bravo ! car je progresse mais il me reste juste cet obstacle ...
Pour te répondre, je sais dans quel dossier sont les fichiers, et je cherche tout type de fichier car j'ai du .xls., du .pdf et éventuellement du .doc

Merci beaucoup !
Olivier (et je guette ta réponse ;-))
0
cs_jordinette Messages postés 134 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 5 avril 2007
22 mars 2006 à 13:48
Ayé j'y arrive!
Parcontre pour cà:
"Si je peux me permettre d'abuser de ton temps, j'ai une autre question : quand sous vba je convertis des doc excel en pdf en passant par l'impression sur acrobat distiller, je dois systématiquement valider l'enregistrement du fichier sous Adobe en cliquant sur oui, saurais-tu comment automatiser cette valisation ?" Je ne sais pas du tout, mais je dirai que c'est du même ordre que pour la sécurité outlook précédement évoqué. ou tu as peut etre une solution du genre Monapp.Mondocument.save. Car sur Excel si tu veux évité qu'il te demande de sauvegarder ton classeur quand tu le fermes, si tu mets dans ton code juste avant le MonExcel.close une ligne MonExcel.activeworkbook.save la confirmation de sauvegarde n'est pas demandé.

Pour la solution voici le code dont je me suis servi:

Private Sub CommandButton1_Click()


chemin = "C:\Documents and Settings\user\Mes documents" 'chemin du dossier contenant le modèle de mail

'Appel du mail modèle
'envoie du mail
'Initialisation:
Dim MonOutlook As Object
Dim MonMessage As Object

Set MonOutlook = CreateObject("Outlook.Application")

Set MonMessage = MonOutlook.CreateItemFromTemplate(chemin & "\mail.oft")

Set attach = MonMessage.Attachments

MonMessage.Subject = "Objet du mail"

CheminEtNomDuFichierTrouver = ""

'trouve tous les fichiers commencant par "test"
With Application.FileSearch
.NewSearch
.LookIn = "C:" 'séparer par des ; si plusieurs répertoires
.Filename = "test*.*" 'séparer par des ; si plusieurs références de recherche
.FileType = msoFileTypeAllFiles
.LastModified = msoLastModifiedAnyTime
.SearchSubFolders = True
'C'est parti :
.Execute

If .FoundFiles.Count <> 0 Then 'boucle qui permet si il y a un ou plusieurs fichier de les ajouter au mail
For Ctr = 1 To .FoundFiles.Count

CheminEtNomDuFichierTrouver = .FoundFiles(Ctr)

MonMessage.Attachments.Add CheminEtNomDuFichierTrouver 'ajout du fichier trouvé

Next
Else
'mettre un appel vers la procédure suivante ou un exit sub
End If

End With


' enregistrement dans Brouillon, mettre Monmessage.send pour un envoi direct (moi je préfère un envoi grouper et
'pouvoir vérifier depuis la boite brouillon d'outlook)

MonMessage.Save

'Fermeture de la session Outlook :
Set MonOutlook = Nothing

'effacer le contenu
MsgBox " Le mail a été généré dans le dossier Brouillons d'Outlook ! ", vbInformation
End Sub


Attention: si tu demande au programme de chercher dans tout C:/, ça va mouliner un max, donc il se peut qi tu a beaucoup de fichiers qu'il mette jusqu'à 5 min ou plus pour te généré le mail et y coller les pièches jointes!

voilà bon courage et hésite pas à redemander si les choses ne sont pas assez claire ;o)
Jordinette
0
marinolive Messages postés 13 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 3 janvier 2011
22 mars 2006 à 14:13
Génial !!

Merci encore pour tout le temps passé et la rapidité de tes réponses, ça va me permettre de bien rationnaliser les choses car je dois régulièrement faire ce type d'envoi pour une centaine de personnes, or à la main c'était vraiment fastidieux !

Peut-être à bientôt ;-)
Olivier
0
marinolive Messages postés 13 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 3 janvier 2011
22 mars 2006 à 18:52
Bonsoir Jordinette,
J'ai un dernier petit souci ... en effet tu as vu que j'avais fait un "For each c in selection" pour pouvoir faire une boucle. Or tout fonctionne impeccable sauf que dans mes brouillons, au lieu de mettre tous les mails les uns après les autres, il les écrase. Quand je sélectionne plusieurs c, je n'ai donc en brouillon que le dernier (mais j'ai pu voir défiler tous les autres en me mettant sur Outlook pendant la macro.

Saurais-tu comment faire pour éviter l'écrasement ? et que j'ai bien mes 10 mails plutôt que seulement le dernier quand je sélectionne 10 personnes ?

A tout hasard je te mets mon code complet pour que tu aies une vue d'ensemble :
Sub Envoi

Dim MonOutlook As Object
Dim MonMessage As Object

Set MonOutlook = CreateObject("Outlook.Application")
Set MonMessage = MonOutlook.CreateItemFromTemplate("P:\1-Gestion\Modèles mails" & Range("C1"))
Set attach = MonMessage.Attachments


For Each c In Selection
MonMessage.To = Range(c.Offset(0, 1).Address)

'TROUVE LES FICHIERS COMMENCANT PAR LA MEME SERIE DE LETTRES
CheminEtNomDuFichierTrouver = ""
With Application.FileSearch
.NewSearch
.LookIn = (Range("C2"))
.Filename = "PC " & Range(c.Address) & "*" '"test*.*" 'séparer par des ; si plusieurs références de recherche
.FileType = msoFileTypeAllFiles
.LastModified = msoLastModifiedAnyTime
.SearchSubFolders = True
.Execute

If .FoundFiles.Count <> 0 Then 'boucle qui permet si il y a un ou plusieurs fichier de les ajouter au mail
For Ctr = 1 To .FoundFiles.Count
CheminEtNomDuFichierTrouver = .FoundFiles(Ctr)
MonMessage.Attachments.Add CheminEtNomDuFichierTrouver 'ajout du fichier trouvé
Next
Else
MsgBox " Il n'y a pas de pièce jointe correspondant à cet auditeur ! ", vbInformation
Exit Sub
End If
End With

MonMessage.Save
'Monmessage.send pour un envoi direct

'Fermeture de la session Outlook :
Set MonOutlook = Nothing


'effacer le contenu
'MsgBox " Le mail a été généré dans le dossier Brouillons d'Outlook ! ", vbInformation

Next c


End Sub
0
marinolive Messages postés 13 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 3 janvier 2011
23 mars 2006 à 08:10
Bonjour Jordinette,

Je viens de m'apercevoir que mon problème était juste liée à la position du "For each c in selection", ne tiens donc pas compte de mon message précédent.

Merci pour tout !
Olivier
0
marinolive Messages postés 13 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 3 janvier 2011
27 avril 2006 à 18:34
Bonsoir Jordinette,

N'ayant pas trouvé la solution sur internet, je me tourne une nouvelle fois vers toi ! Voici mon problème :
J'ai un fichier excel dont le nombre d'onglet est variable. Et je souhaite sélectionner plusieurs onglets : du 7° au dernier.  Or soit je peux utiliser un sheets(array(... mais il faut fournir la liste exacte des onglets (que je n'ai aps puisqu'elle varie) soit je fais un sheets.select mais il me les sélectionne tous ...

Aurais-tu une idée ? merci !
0
dardeviIIe Messages postés 1 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 22 février 2007
22 févr. 2007 à 16:01
Bonjour, a tous je ne comprend pas pour quoi mon
code ci-dessous ne fonctionne pas ou ci que l'envois du mail pas le
déclenchement à heure fixe.

merci pour votre aide....

Sub SendPlng()

' lance la macro SendParMail à 09:00:00 heures

Application.OnTime TimeValue("15:51:00"), ("SendParMail"), True

End Sub

Sub SendParMail()

'cette macro envois par mail la feuille excel active

ThisWorkbook.Sheets("Fev").Copy

ActiveWorkbook.SendMail ("dardeviIIe@msn.com")

ActiveSheet.Copy

End Sub
0
Rejoignez-nous