Création de mail outlook avec VBA

Bonjour,

J'aimerai savoir s'il est possible sous Excel 2013 à partir d'une macro d'accéder à Outlook, d'ouvrir un nouveau message et d'y intégrer :

  • un message type (ex: "Bonjour, Veuillez trouver ci-joints les tableaux...")
  • une ou plusieurs pièces jointes (PDF) provenant d'un dossier bien précis
  • mettre l'adresse mail du destinataire
  • conserver ma signature pré enregistrée dans chacun de mes mails

Mais ne pas envoyer le mail car il peut y avoir des modifications du type une personne supplémentaire dans les destinataires...

Merci pour vos réponses.

Bonjour,

La réponse est ... Oui ...

Tu peux, au bas de cette page, trouver des sujets identiques au tien ...

James a raison , James a toujours raison

Une petite recherche doit te donner la réponse.

J'ajoute que, si tu veux conserver la signature, cela se gâte (sauf si quelqu'un a une réponse plus élégante), il faudra donc insérer un message dans.HTMLBody !

Mon astuce est de faire un copier/coller en envoyant de excel vers outlook des touches clavier (sendkeys).

Cherche un peu, en parallèle je vais sortir de mon chapeau un petit essai ...

maquette

Steelson a écrit :

James a raison , James a toujours raison

Une petite recherche doit te donner la réponse.

Salut Michel

Tu es toujours prêt ...à

Je sais qu' Emmanuelle ... t'inspire ...

Steelson a écrit :

maquette

La ligne ci-dessous bloque quand je lance la macro de ta maquette :

.To = Range("destinataire")

Après plusieurs essais j'ai réussi à partir de votre code à ouvrir un mail vierge en y insérant le destinataire, la PJ, le texte et le titre.

Il me reste deux problèmes à résoudre:

  • conserver ma signature auto d'outlook
  • avoir un texte dans le mail mise en forme (saut de ligne, police...) et pas brute comme je l'ai actuellement.

Des idées?

Pour la mise en forme du texte c'est bon j'ai trouvé.

Mais je n'ai pas de solution pour ma signature auto outlook...

emmanuelle.b a écrit :
Steelson a écrit :

maquette

La ligne ci-dessous bloque quand je lance la macro de ta maquette :

.To = Range("destinataire")

ah bon ! il me semblait avoir défini une zone comme "destinataire", regarde le fichier

si tu as recopié le code seulement, il s'appuie sur 3 zones : destinataire, titre et texte


emmanuelle.b a écrit :

Après plusieurs essais j'ai réussi à partir de votre code à ouvrir un mail vierge en y insérant le destinataire, la PJ, le texte et le titre.

Il me reste deux problèmes à résoudre:

  • conserver ma signature auto d'outlook
  • avoir un texte dans le mail mise en forme (saut de ligne, police...) et pas brute comme je l'ai actuellement.

Des idées?

OUI, il ne faut pas utiliser .body, mais .htmlbody

et même ne pas l'utiliser du tout : il faut faire un copier depuis excel d'une zone, créer l'instance mail, l'afficher (.display), attendre 1 à 2 secondes, et envoyer sendkeys le Ctrl V comme sur le fichier joint

Tu conserveras ta signature auto + le texte sera inséré au-dessus au format html

Re,

Pour conserver la signature html standard dans Outlook, il existe la fonction GetBoiler() mise au point par Dick Kusleika ...

Function GetBoiler(ByVal sFile As String) As String
    Dim fso As Object
    Dim ts As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
    GetBoiler = ts.readall
    ts.Close
End Function

Dans le code qui envoie le courrier, il faut reprendre la signature ...

Dim MaSignature As String
   If Dir(MaSignature) <> "" Then
        Signature = GetBoiler(MaSignature)
    Else
        Signature = ""
    End If

ok j'ai changé et en effet je récupère ma signature auto.

Mais le dernier soucis que j'ai c'est que le copier coller de mon corps de texte ne fonctionne pas. Voir mon code ci-dessous :

Sub Création_email()

Dim messagerie As Object
Dim courriel As Object
Dim PDF As String
Dim Semaine As Integer
Dim Mois As String
Sheets("bla_bla").Select
Semaine = Range("Semaine")
Mois = Range("Mois")
Range("texte").Copy

PDF = "C:\Users\Utilisateur\Desktop\Pilotage d'activité hebdo\PDF Agence Hebdo\" & Mois & "\Sem " & Semaine & "\Tableau de pilotage_Région_Sem_" & Semaine & ".pdf"

Set messagerie = CreateObject("outlook.application")
Set courriel = messagerie.CreateItem(0)

If PDF = "Faux" Then Exit Sub
If VarType(PDF) = vbBoolean Then Exit Sub

With courriel
    .to = "a@aaa.fr"
    .cc = "b@bbb.fr"
    .Subject = "Tableau de pilotage Sem " & Semaine
    .Attachments.Add ("C:\Users\Utilisateur\Desktop\Pilotage d'activité hebdo\PDF Agence Hebdo\" & Mois & "\Sem " & Semaine & "\Tableau de pilotage_Région_Sem_" & Semaine & ".pdf")
    .display
End With

    Application.Wait (Now + TimeValue("0:00:02"))
    SendKeys "^v", True
    Application.CutCopyMode = False

Set courriel = Nothing
Set messagerie = Nothing

End Sub

Il peut y avoir plusieurs causes :

  • surtout ne pas intervenir sur le presse-papier qui contient texte tant qu'il n'a pas été copié
  • l'ordinateur a-t-il le temps suffisant ? essaie d'augmenter le TimeValue("0:00:02") à 5a aqu lieu de 2

Après je ne vois pas trop, j'ai déployé cette solution avec quelques difficultés certes mais avec un taux d'échec inférieur à 5%

Maintenant, en effet le copier/coller peut mal se passer; essaie aussi de réduire le nombre de fenêtres ouvertes bien que cela n'ait pas d'influence et surtout ouvre ta messagerie outlook auparavant !

Après je te laisse entre les mains de James


Merci James pour le coup de la signature ... on doit donc pouvoir se passer du copier/coller, je vois cela demain (je n'ai pas outlook ici).

Je regarderai ça demain matin, je ne suis plus au boulot.

Steelson a écrit :

Merci James pour le coup de la signature ... on doit donc pouvoir se passer du copier/coller, je vois cela demain (je n'ai pas outlook ici).

@ Michel

Cà fait toujours plaisir de filer un coup de pouce ... à un copain ... ... tu sais celui qui aime me charrier ...

James007 a écrit :

Re,

Pour conserver la signature html standard dans Outlook, il existe la fonction GetBoiler() mise au point par Dick Kusleika ...

Function GetBoiler(ByVal sFile As String) As String
    Dim fso As Object
    Dim ts As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
    GetBoiler = ts.readall
    ts.Close
End Function

Dans le code qui envoie le courrier, il faut reprendre la signature ...

Dim MaSignature As String
   If Dir(MaSignature) <> "" Then
        Signature = GetBoiler(MaSignature)
    Else
        Signature = ""
    End If

J'ai un peu de mal à voir ou je dois caler ces deux codes dans mon code et quoi enlever dans le mien.

Un bout de code que j'ai fait ce matin pour tester ... cela peut t'aider

Option Explicit
Sub envoi_email()

Dim messagerie As Object
Dim courriel As Object
Dim nompdf As String
Dim FichierSignature As String
Dim Signature As String

    FichierSignature = Environ("appdata") & "\Microsoft\Signatures\sign.htm"
    If Dir(FichierSignature) <> "" Then
        Signature = GetBoiler(FichierSignature)
    Else
        Signature = ""
    End If

    Sheets("doc_pdf").Select
    nompdf = Environ("Temp") & "\" & "pièce_jointe"
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=nompdf & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False

    Set messagerie = CreateObject("Outlook.Application")
    Set courriel = messagerie.CreateItem(0)
    With courriel
        .To = Range("destinataire")
        .Subject = Range("titre")
        .Attachments.Add nompdf & ".pdf"
        .HTMLBody = "<H3><B>Dear Customer</B></H3>" & _
                "Please visit this website to download the new version.<br>" & _
                "Let me know if you have problems.<br><br>" & _
                Signature
        .display
    End With
    Set courriel = Nothing
    Set messagerie = Nothing

    Kill nompdf & ".pdf"

    Sheets("bla_bla").Select

End Sub
Function GetBoiler(ByVal sFile As String) As String
    Dim fso As Object
    Dim ts As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
    GetBoiler = ts.readall
    ts.Close
End Function

MAIS,

1- le texte doit donc être indiqué en code html avec les balises propres à ce langage

2- et en ce qui me concerne, j'ai une image dans ma signature qui n'est pas importée !!

j'en reste donc pour ma part à la version copier/coller !

De ton côté Emmanuelle, as-tu réussi un copier/coller ?

Non le copier / coller ne fonctionne toujours pas...

J'ai essayé de le mettre à différent endroit de mon code mais toujours rien. Je n'ai que la signature auto et pas de corps de texte.

Je suis en congés pour 1 semaine. Je ne répondrai probablement pas pendant ce laps de temps .

Mais si vous trouvez la solution pendant mon absence, merci d'avance ^^.

Si le copier/coller ne fonctionne pas

SI ta signature comporte un logo ou image

oublie GetBoiler

et recrée dans le code VBA ta signature en html, donc avec balises <table><tr><td>.... et <img src="...."> comme pour le texte que tu veux insérer

Plus simple = s'en tenir à du texte brut.

Ici un article intéressant sur le transfert excel > html

http://dailydoseofexcel.com/archives/2015/02/13/converting-an-excel-range-to-html-the-hard-way/

ou bien

en prémaché

de quoi parfaire son anglais

Mais aussi une remarque que je partage !! à moitié quand même sur la "copie comme image"

Randy says:

February 17, 2015 at 9:25 pm

I had often tried to copy ranges into Outlook email bodies with very mixed results. It rarely produced a result that resembled the original range. Then I came up with a much better and simpler way.

Using a macro I would simply copy the desired range, then using various Sendkeys I basically copy as picture within the email body. Works every time, perfectly, and it’s an exact match of the original range.

Rechercher des sujets similaires à "creation mail outlook vba"