Envoi de mail via Excel [Résolu]

cs_louisdo 4 Messages postés lundi 16 janvier 2006Date d'inscription 20 janvier 2006 Dernière intervention - 16 janv. 2006 à 10:30 - Dernière réponse : dardeviIIe 1 Messages postés mercredi 22 décembre 2004Date d'inscription 22 février 2007 Dernière intervention
- 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
Afficher la suite 

19 réponses

cs_jordinette 134 Messages postés mercredi 2 mars 2005Date d'inscription 5 avril 2007 Dernière intervention - 16 janv. 2006 à 11:41
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
cs_jordinette 134 Messages postés mercredi 2 mars 2005Date d'inscription 5 avril 2007 Dernière intervention - 16 janv. 2006 à 10:52
0
Utile
Bonjour moi j'ai réussi, mais faudrais que tu me donne plus d'info pour que je te renseigne.
jordinette
cs_louisdo 4 Messages postés lundi 16 janvier 2006Date d'inscription 20 janvier 2006 Dernière intervention - 16 janv. 2006 à 11:28
0
Utile
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
cs_louisdo 4 Messages postés lundi 16 janvier 2006Date d'inscription 20 janvier 2006 Dernière intervention - 16 janv. 2006 à 11:59
0
Utile
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
cs_jordinette 134 Messages postés mercredi 2 mars 2005Date d'inscription 5 avril 2007 Dernière intervention - 16 janv. 2006 à 12:01
0
Utile
Cool si ça ta bien aidé ;@)
Bonne continuation.
Jordinette
ScSami 1490 Messages postés mercredi 5 février 2003Date d'inscription 3 décembre 2007 Dernière intervention - 16 janv. 2006 à 17:00
0
Utile
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". )
marinolive 13 Messages postés mardi 21 mars 2006Date d'inscription 3 janvier 2011 Dernière intervention - 21 mars 2006 à 09:32
0
Utile
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
cs_jordinette 134 Messages postés mercredi 2 mars 2005Date d'inscription 5 avril 2007 Dernière intervention - 21 mars 2006 à 10:27
0
Utile
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
marinolive 13 Messages postés mardi 21 mars 2006Date d'inscription 3 janvier 2011 Dernière intervention - 21 mars 2006 à 16:34
0
Utile
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
cs_jordinette 134 Messages postés mercredi 2 mars 2005Date d'inscription 5 avril 2007 Dernière intervention - 22 mars 2006 à 08:49
0
Utile
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
marinolive 13 Messages postés mardi 21 mars 2006Date d'inscription 3 janvier 2011 Dernière intervention - 22 mars 2006 à 09:51
0
Utile
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 !
cs_jordinette 134 Messages postés mercredi 2 mars 2005Date d'inscription 5 avril 2007 Dernière intervention - 22 mars 2006 à 11:36
0
Utile
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
marinolive 13 Messages postés mardi 21 mars 2006Date d'inscription 3 janvier 2011 Dernière intervention - 22 mars 2006 à 11:48
0
Utile
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 ;-))
cs_jordinette 134 Messages postés mercredi 2 mars 2005Date d'inscription 5 avril 2007 Dernière intervention - 22 mars 2006 à 13:48
0
Utile
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
marinolive 13 Messages postés mardi 21 mars 2006Date d'inscription 3 janvier 2011 Dernière intervention - 22 mars 2006 à 14:13
0
Utile
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
marinolive 13 Messages postés mardi 21 mars 2006Date d'inscription 3 janvier 2011 Dernière intervention - 22 mars 2006 à 18:52
0
Utile
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
marinolive 13 Messages postés mardi 21 mars 2006Date d'inscription 3 janvier 2011 Dernière intervention - 23 mars 2006 à 08:10
0
Utile
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
marinolive 13 Messages postés mardi 21 mars 2006Date d'inscription 3 janvier 2011 Dernière intervention - 27 avril 2006 à 18:34
0
Utile
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 !
dardeviIIe 1 Messages postés mercredi 22 décembre 2004Date d'inscription 22 février 2007 Dernière intervention - 22 févr. 2007 à 16:01
0
Utile
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

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.