Ajouter automatiquement la signature Outlook à un e-mail généré par VBA
Bonjour à tous,
Je travaille sur une macro VBA qui capture des plages de cellules Excel sous forme d’images, puis les insère dans un e-mail Outlook généré automatiquement. L’e-mail contient du texte introductif, les images, et je voudrais que la signature Outlook de l’expéditeur soit ajoutée automatiquement à la fin du message.
J'ai essayé avec une ia de le rajouter mais ca ne marche pas.
Mon code ci-dessous :
Sub CaptureEtInsererDeuxImages()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim Plage1 As Range, Plage2 As Range
Dim ChartTemp1 As ChartObject, ChartTemp2 As ChartObject
Dim objOutlook As Object ' Utilisation de Late Binding
Dim objMail As Object ' Utilisation de Late Binding
Dim objInspector As Object
Dim objDoc As Object
Dim objRange As Object
Dim objSelection As Object
Dim objShape As Object ' Remplace InlineShape pour éviter l'erreur
Dim imgPath1 As String, imgPath2 As String
Dim TexteIntro As String, TexteIntermediaire As String, ObjetMail As String
Dim DateReference As Date, DateFormattee As String
' Déterminer la date de référence
If Weekday(Date, vbMonday) = 1 Then ' Si aujourd'hui est lundi
DateReference = Date - 2 ' Prendre la date du samedi précédent
Else
DateReference = Date - 1 ' Sinon, prendre la date d'hier
End If
' Formater la date en "JJ/MM/AA"
DateFormattee = Format(DateReference, "dd/mm/yy")
' Définir les textes
TexteIntro = "Bonjour," & vbNewLine & vbNewLine & _
"Ci-dessous les anomalies Méca par ligne d'injection du " & DateFormattee & ":" & vbNewLine & vbNewLine
TexteIntermediaire = "Ci-dessous le détail des pertes tracking par heure et par cellule :" & vbNewLine & vbNewLine
' Définir l'objet du mail
ObjetMail = "FRAIS - Anomalie Méca par ligne d'injection du " & DateFormattee
' Définir les feuilles et plages à capturer
Set ws1 = ThisWorkbook.Sheets("TCD")
Set Plage1 = ws1.Range("A1:S30")
Set ws2 = ThisWorkbook.Sheets("Cellules")
Set Plage2 = ws2.Range("A1:Y30")
' Définir les chemins des images temporaires
imgPath1 = Environ("TEMP") & "\Capture1.png"
imgPath2 = Environ("TEMP") & "\Capture2.png"
' Supprimer les images temporaires précédentes si elles existent
If Dir(imgPath1) <> "" Then Kill imgPath1
If Dir(imgPath2) <> "" Then Kill imgPath2
' Capture et enregistrement des images
ws1.Activate
Set ChartTemp1 = ws1.ChartObjects.Add(Left:=0, Width:=Plage1.Width, Top:=1000, Height:=Plage1.Height)
Plage1.CopyPicture Appearance:=xlScreen, Format:=xlPicture
ChartTemp1.Activate
Application.Wait Now + TimeValue("00:00:01")
ChartTemp1.Chart.Paste
ChartTemp1.Chart.Export Filename:=imgPath1, FilterName:="PNG"
ChartTemp1.Delete
ws2.Activate
Set ChartTemp2 = ws2.ChartObjects.Add(Left:=0, Width:=Plage2.Width, Top:=1000, Height:=Plage2.Height)
Plage2.CopyPicture Appearance:=xlScreen, Format:=xlPicture
ChartTemp2.Activate
Application.Wait Now + TimeValue("00:00:01")
ChartTemp2.Chart.Paste
ChartTemp2.Chart.Export Filename:=imgPath2, FilterName:="PNG"
ChartTemp2.Delete
' Vérifier si les images ont bien été générées
If Dir(imgPath1) = "" Or Dir(imgPath2) = "" Then
MsgBox "Erreur : Une ou plusieurs images n'ont pas été créées.", vbCritical
Exit Sub
End If
' Créer un nouvel e-mail Outlook avec Late Binding
Set objOutlook = CreateObject("Outlook.Application")
Set objMail = objOutlook.CreateItem(0)
' Définir l'objet et les destinataires du mail
objMail.Subject = ObjetMail
objMail.To = "x"
objMail.CC = "x"
objMail.Display
' Insérer le texte et les images dans le bon ordre
Set objInspector = objMail.GetInspector
Set objDoc = objInspector.WordEditor
Set objRange = objDoc.Range
' Insérer le texte d'introduction
objRange.Text = TexteIntro
objRange.Collapse 0
objRange.Text = vbNewLine & vbNewLine ' Ajout de saut de ligne avant l'image
' Insérer la première image juste après le texte d'introduction
Set objShape = objRange.InlineShapes.AddPicture(imgPath1, False, True)
objShape.LockAspectRatio = False
objShape.Width = 800 ' Ajuster selon besoin
objShape.Height = 500 ' Ajuster selon besoin
' Ajouter un saut de ligne après l'image 1
objRange.Collapse 0
objRange.Text = vbNewLine & vbNewLine
' Insérer le texte intermédiaire après l'image 1
objRange.Collapse 0
objRange.Text = TexteIntermediaire
objRange.Collapse 0
objRange.Text = vbNewLine & vbNewLine ' Ajout de saut de ligne avant l'image 2
' Insérer la deuxième image après le texte intermédiaire
Set objShape = objRange.InlineShapes.AddPicture(imgPath2, False, True)
objShape.LockAspectRatio = False
objShape.Width = 800 ' Ajuster selon besoin
objShape.Height = 500 ' Ajuster selon besoin
' Ajouter un saut de ligne après l'image 2
objRange.Collapse 0
objRange.Text = vbNewLine & vbNewLine
' Insérer la signature automatique d'Outlook
On Error Resume Next
Set objSelection = objDoc.Application.Selection
objSelection.EndKey Unit:=6 ' Aller à la fin du document
objSelection.TypeParagraph ' Ajouter un saut de ligne
objSelection.InsertParagraphAfter
objSelection.MoveDown Unit:=5, Count:=1 ' Déplacer le curseur
objSelection.InsertParagraphAfter
objSelection.MoveDown Unit:=5, Count:=1
objSelection.InsertAutoText
On Error GoTo 0
' Nettoyage des objets
Set objRange = Nothing
Set objDoc = Nothing
Set objInspector = Nothing
Set objMail = Nothing
Set objOutlook = Nothing
Set ChartTemp1 = Nothing
Set ChartTemp2 = Nothing
Set ws1 = Nothing
Set ws2 = Nothing
Set Plage1 = Nothing
Set Plage2 = Nothing
Set objSelection = Nothing
End Sub.
En vous souhaitant bonne réception et merci d'avance :)
Bonjour Nicotine31
Je pense que vous êtes passé à côté de l'excellent site de Ron de Bruin
Vous devriez trouver votre bonheur ICI
A+
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Tout d'abord un rappel. Pour l'insertion de code, utiliser la balise :</>
ci-dessous code avec insertion de signature
Sub CaptureEtInsererDeuxImages()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim Plage1 As Range, Plage2 As Range
Dim ChartTemp1 As ChartObject, ChartTemp2 As ChartObject
Dim objOutlook As Object ' Utilisation de Late Binding
Dim objMail As Object ' Utilisation de Late Binding
Dim objInspector As Object
Dim objDoc As Object
Dim objRange As Object
Dim objSelection As Object
Dim objShape As Object ' Remplace InlineShape pour éviter l'erreur
Dim imgPath1 As String, imgPath2 As String
Dim TexteIntro As String, TexteIntermediaire As String, ObjetMail As String
Dim DateReference As Date, DateFormattee As String
Dim position_sig As Long, position_fin As Long
Dim rng As Object
' Déterminer la date de référence
If Weekday(Date, vbMonday) = 1 Then ' Si aujourd'hui est lundi
DateReference = Date - 2 ' Prendre la date du samedi précédent
Else
DateReference = Date - 1 ' Sinon, prendre la date d'hier
End If
' Formater la date en "JJ/MM/AA"
DateFormattee = Format(DateReference, "dd/mm/yy")
' Définir les textes
TexteIntro = "Bonjour," & vbNewLine & vbNewLine & _
"Ci-dessous les anomalies Méca par ligne d'injection du " & DateFormattee & ":" & vbNewLine & vbNewLine
TexteIntermediaire = "Ci-dessous le détail des pertes tracking par heure et par cellule :" & vbNewLine & vbNewLine
' Définir l'objet du mail
ObjetMail = "FRAIS - Anomalie Méca par ligne d'injection du " & DateFormattee
' Définir les feuilles et plages à capturer
Set ws1 = ThisWorkbook.Sheets("TCD")
Set Plage1 = ws1.Range("A1:S30")
Set ws2 = ThisWorkbook.Sheets("Cellules")
Set Plage2 = ws2.Range("A1:Y30")
' Définir les chemins des images temporaires
imgPath1 = Environ("TEMP") & "\Capture1.png"
imgPath2 = Environ("TEMP") & "\Capture2.png"
' Supprimer les images temporaires précédentes si elles existent
If Dir(imgPath1) <> "" Then Kill imgPath1
If Dir(imgPath2) <> "" Then Kill imgPath2
' Capture et enregistrement des images
ws1.Activate
Set ChartTemp1 = ws1.ChartObjects.Add(Left:=0, Width:=Plage1.Width, Top:=1000, Height:=Plage1.Height)
Plage1.CopyPicture Appearance:=xlScreen, Format:=xlPicture
ChartTemp1.Activate
Application.Wait Now + TimeValue("00:00:01")
ChartTemp1.Chart.Paste
ChartTemp1.Chart.Export Filename:=imgPath1, FilterName:="PNG"
ChartTemp1.Delete
ws2.Activate
Set ChartTemp2 = ws2.ChartObjects.Add(Left:=0, Width:=Plage2.Width, Top:=1000, Height:=Plage2.Height)
Plage2.CopyPicture Appearance:=xlScreen, Format:=xlPicture
ChartTemp2.Activate
Application.Wait Now + TimeValue("00:00:01")
ChartTemp2.Chart.Paste
ChartTemp2.Chart.Export Filename:=imgPath2, FilterName:="PNG"
ChartTemp2.Delete
' Vérifier si les images ont bien été générées
If Dir(imgPath1) = "" Or Dir(imgPath2) = "" Then
MsgBox "Erreur : Une ou plusieurs images n'ont pas été créées.", vbCritical
Exit Sub
End If
' Créer un nouvel e-mail Outlook avec Late Binding
Set objOutlook = CreateObject("Outlook.Application")
Set objMail = objOutlook.CreateItem(0)
' Définir l'objet et les destinataires du mail
objMail.Subject = ObjetMail
objMail.To = "x"
objMail.CC = "x"
objMail.Display 'insertion de la signature
' Insérer le texte et les images dans le bon ordre
Set objInspector = objMail.GetInspector
Set objDoc = objInspector.WordEditor
Set objRange = objDoc.Range
position_sig = objRange.End 'position de fin avec la signature
' Insérer le texte d'introduction
position_fin = objRange.End
Set rng = objDoc.Range(position_fin - position_sig, position_fin - position_sig)
rng.InsertAfter TexteIntro & vbNewLine & vbNewLine
' Insérer la première image juste après le texte d'introduction
position_fin = objRange.End
Set rng = objDoc.Range(position_fin - position_sig, position_fin - position_sig)
Set objShape = rng.InlineShapes.AddPicture(imgPath1, False, True)
objShape.LockAspectRatio = False
objShape.Width = 800 ' Ajuster selon besoin
objShape.Height = 500 ' Ajuster selon besoin
' Insérer le texte intermédiaire après l'image 1
position_fin = objRange.End
Set rng = objDoc.Range(position_fin - position_sig, position_fin - position_sig)
rng.InsertAfter vbNewLine & vbNewLine & TexteIntermediaire & vbNewLine & vbNewLine
' Insérer la deuxième image après le texte intermédiaire
position_fin = objRange.End
Set rng = objDoc.Range(position_fin - position_sig, position_fin - position_sig)
Set objShape = rng.InlineShapes.AddPicture(imgPath2, False, True)
objShape.LockAspectRatio = False
objShape.Width = 800 ' Ajuster selon besoin
objShape.Height = 500 ' Ajuster selon besoin
' Ajouter un saut de ligne après l'image 2
position_fin = objRange.End
Set rng = objDoc.Range(position_fin - position_sig, position_fin - position_sig)
rng.InsertAfter vbNewLine & vbNewLine
On Error Resume Next
Set objSelection = objDoc.Application.Selection
objSelection.EndKey Unit:=6 ' Aller à la fin du document
objSelection.TypeParagraph ' Ajouter un saut de ligne
objSelection.InsertParagraphAfter
objSelection.MoveDown Unit:=5, Count:=1 ' Déplacer le curseur
objSelection.InsertParagraphAfter
objSelection.MoveDown Unit:=5, Count:=1
objSelection.InsertAutoText
On Error GoTo 0
' Nettoyage des objets
Set objRange = Nothing
Set objDoc = Nothing
Set objInspector = Nothing
Set objMail = Nothing
Set objOutlook = Nothing
Set ChartTemp1 = Nothing
Set ChartTemp2 = Nothing
Set ws1 = Nothing
Set ws2 = Nothing
Set Plage1 = Nothing
Set Plage2 = Nothing
Set objSelection = Nothing
End Sub