Envoi mail avec sélection de cellule
Bonjour à tous,
Grand lecteur de l'ombre de ce forum depuis plusieurs mois, j'ai réussi à accomplir beaucoup de choses déjà grâce aux informations en or que l'on trouve ici!
Néanmoins, je me lance désormais dans la création de ce sujet pour solliciter un peu de votre aide car je n'ai pas trouver solution à mon problème.
Mon problème est le suivant et est fort semblable à celui de ce monsieur sur ce topic (https://forum.excel-pratique.com/excel/envoyer-un-mail-avec-une-selection-de-cellules-t81065.html). Comme lui j'ai un fichier avec des lignes de commandes. J'aimerais contacter par mail via outlook chaque client (colonne C) avec son adresse mail correspondante (colonne N) et dans le corps du mail lui mettre la liste des lignes qui correspondent à son cas.
La macro crée dans l'ancien sujet correspond parfaitement à mes besoins mais je n'arrive pas à l'adapter à mon cas personnel.
J'imagine que cela est possible et surement très simple d'adapter la macro à mon cas c'est pourquoi je sollicite votre aide!
Ci joint mon fichier et le code de la personne précédente :
Sub filtre()
Dim plg As Range
Dim strbody As String
Dim fich As Variant
Dim ShT As Worksheet
fich = Application.GetOpenFilename("Tous les fichiers (*.xlsx),*.xlsx")
If fich = False Then Exit Sub
Workbooks.Open fich
Application.ScreenUpdating = False
With Sheets(1)
Sheets.Add
Set ShT = ActiveSheet
'définition de la plage de données initiale
Set plg = .Range("A4:H" & .Cells(Rows.Count, 1).End(xlUp).Row)
'copie dans une colonne provisoire le nom des mails qu'il faudra creer/filtrer
.[D:D].Copy .[O1]
'supprime doublons
.[O:O].RemoveDuplicates Columns:=Array(1), Header:=xlYes
'utilisation de deux cellules provisoires une pour l'entete de recherche
.[P1] = .[D4]
'on passe en revu tous les job différents
For i = 4 To .[O65536].End(xlUp).Row
ShT.[A1].CurrentRegion.Delete
'l'autre le job a rechercher
.[p2] = .Range("O" & i)
'filtre avancé avec copie immédiate
plg.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.[P1:P2], CopyToRange:=ShT.[A1]
ShT.Range("A:H").EntireColumn.AutoFit
ShT.Rows(1).Insert
ShT.[A1] = "Bonjour, voici les projets a suivre. Merci"
strbody = RangetoHTML(ShT.Range("A1:G" & ShT.Cells(Rows.Count, 1).End(xlUp).Row))
EnvoiAutomatiqueMail strbody, .[p2]
Next i
End With
ActiveWorkbook.Close False
End Sub
Public Sub EnvoiAutomatiqueMail(strbody As String, adresse As String)
Dim OutlookApp As Object
Dim OutlookMail As Object
'Dim adresse As String
Dim message As String
Dim sujet As String
Dim i As Integer
sujet = "PROJETS A SUIVRE"
Set OutlookApp = CreateObject("outlook.application")
Set OutlookMail = OutlookApp.createitem(0)
With OutlookMail
.Subject = sujet 'sujet du mail
.To = adresse 'adresse mail destinataire
.HTMLBody = strbody
.Display 'affiche le mail
'.send 'on envoie le mail créé
End With
End Sub
Function RangetoHTML(rng As Range)
' Working in Office 2000-2007
Dim fso As Object
Dim ts As Object
Dim TempFile As String
Dim TempWB As Workbook
TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
'Copy the range and create a new workbook to past the data in
rng.Copy
Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)
.Cells(1).PasteSpecial Paste:=8
.Cells(1).PasteSpecial xlPasteValues, , False, False
.Cells(1).PasteSpecial xlPasteFormats, , False, False
.Cells(1).Select
Application.CutCopyMode = False
On Error Resume Next
.DrawingObjects.Visible = True
.DrawingObjects.Delete
On Error GoTo 0
End With
'Publish the sheet to a htm file
With TempWB.PublishObjects.Add( _
SourceType:=xlSourceRange, _
Filename:=TempFile, _
Sheet:=TempWB.Sheets(1).Name, _
Source:=TempWB.Sheets(1).UsedRange.Address, _
HtmlType:=xlHtmlStatic)
.Publish (True)
End With
'Read all data from the htm file into RangetoHTML
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
RangetoHTML = ts.readall
ts.Close
RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
"align=left x:publishsource=")
'Close TempWB
TempWB.Close savechanges:=False
'Delete the htm file we used in this function
Kill TempFile
Set ts = Nothing
Set fso = Nothing
Set TempWB = Nothing
End Function
Bien cordialement,
Bonjour Edouard
Essaie quelque chose comme cela
Bien sûr, il ne faut sûrement pas inclure le nom du client dans le contenu et peut-être voudras-tu mettre un nom parlant devant chaque champ
Je ne peux pas tester...
bon courage
Désolée...mais contente que cela te convienne
Supprime : MsgBox Contenu
Je l'avais mis pour tester et ai oublié de le retirer...
Bye
Encore merci, c'est vraiment parfait !
Bien cordialement,
Bonjour
Pense à marquer ton sujet comme résolu si cela marche comme tu veux.
Bonne journée
Bonjour,
Petite mise à jour sur mon sujet, la commande macro marchait très bien mais je me suis aperçu qu'une bonne moitié des mails ne s'étaient pas générés et en regardant le code je n'ai aucune idée du pourquoi
Je vous remets le fichier avec des lignes qui ne fonctionnent pas sans que je ne comprenne pourquoi...
J'ai également très légèrement modifié le code pour qu'il s'adapte à mon corps de mail mais rien qui ne touche à la sélection des lignes à envoyer.
Private Sub CommandButton1_Click()
Dim messagerie As Variant
Set messagerie = CreateObject("Outlook.Application")
DLig = Range("A65536").End(xlUp).Row
Client = ""
For lig = 2 To DLig
If Range("A" & lig) <> Client Then
If Client <> "" Then
With messagerie.CreateItem(olMailItem)
.To = MailCli
.Subject = "Retrait"
.Body = Contenu
.Display
End With
End If
suit:
Contenu = Range("L15") & Chr(13) & Chr(10) & Chr(13) & Chr(10) & Range("L16") & Chr(13) & Chr(10) & Chr(13) & Chr(10) & Range("L17") & Chr(13) & Chr(10) & Chr(13) & Chr(10) & Range("L18") & Chr(13) & Chr(10) & Chr(13) & Chr(10) & Range("L19") & Chr(13) & Chr(10) & Chr(13) & Chr(10) & Range("L20") & Chr(13) & Chr(10) & Chr(13) & Chr(10) & Range("A" & lig) & " / " & Range("B" & lig) & " / " & Range("C" & lig) & " / " & Range("D" & lig) & " / " & Range("E" & lig) & " " & Range("F" & lig) & " / " & Range("G" & lig)
MailCli = Range("H" & lig)
Client = Range("A" & lig)
Else
Contenu = Contenu & vbCrLf & Range("A" & lig) & " / " & Range("B" & lig) & " / " & Range("C" & lig) & " / " & Range("D" & lig) & " / " & Range("E" & lig) & " / " & Range("F" & lig) & " / " & _
Range("G" & lig) & " / " & Range("H" & lig)
End If
Next
With messagerie.CreateItem(olMailItem)
.To = MailCli
.Subject = "Retrait"
.Body = Contenu
.Display
End With
End Sub
Bien cordialement,
- Messages
- 1'025
- Excel
- 2016 FR // 365
- Inscrit
- 19/04/2019
- Emploi
- Étudiant en 5e année d'école d'Ingénieur
Bonjour à tous,
Sinon autre manière de faire :
Lance la macro, tu peux voir à quoi ressemble les mails dans tes mails envoyés
Je pense que tu pourrai même styliser le tableau en css si le cœur t'en dit !
Bonne journée,
Baboutz
Edit : L'avantage, c'est que tu peux choisir les données que tu veux placer, mettre le corps de texte que tu veux dans ton mail. Le seul inconvénient, c'est qu'on est obligé de "construire" la signature du mail pour que ce soit automatique.
Bonjour Babtouz,
Le code que tu proposes est vraiment très poussé et très bien expliqué dans son détail. Il résout tous mes problèmes en plus !
Je me demande comment c'est possible d'acquérir un tel niveau en VBA c'est vraiment impressionnant ^^
Merci beaucoup pour ton temps
Bien cordialement,
- Messages
- 1'025
- Excel
- 2016 FR // 365
- Inscrit
- 19/04/2019
- Emploi
- Étudiant en 5e année d'école d'Ingénieur
Re,
Merci ! C'est une macro que j'ai déjà eu à faire pour le boulot, je l'ai juste adapté à ton cas
N'oublie pas d'utiliser des tableaux structurés, c'est un outil hyper efficace et qui fait gagner du temps...
Je me suis lancé dedans il y a 3ans, j'étais très nul mais en pratiquant on s'améliore !
Bonne journée,
Baboutz
- Messages
- 3'581
- Excel
- 2013, 2019, 365
- Inscrit
- 11/04/2020
- Emploi
- Formateur bureautique, dvpt fichiers
Bonjour,
@Baboutz, Si tu actives ton .display en début de code (là où tu l'as bien mis), la signature se met automatiquement et tu n'as pas à la construire, non ?
- Messages
- 1'025
- Excel
- 2016 FR // 365
- Inscrit
- 19/04/2019
- Emploi
- Étudiant en 5e année d'école d'Ingénieur
Salut @JoyeuxNoel,
Oui tu as raison, l'inconvénient c'est que tu es obligé de valider à la main, et si tu as plusieurs mails, un peu pénible, non ?
Ou alors, c'était pour éviter les "flashs" sur l'écran, je ne sais plus, mais je m'étais dit que c'est la méthode la plus pratique sur le long terme !