Copier le résultat d'un filtre TCD et coller dans Outlook et envoyer
Bonjour chers tous.
S'il vous plaît, après avoir parcouru ce post sous le thème FILTRER UN TCD je souhaiterais que vous m'aider à envoyer le résultat du filtre via Outlook à l'adresse se trouvant dans une cellule quelconque.
Merci d'avance pour le temps et la considération que vous aurez pour mon besoin.
Bonjour,
Pas sur de bien comprendre, vous voulez envoyer 1 mail par ligne du TCD, aux adresses indiquées ? Auquel cas on envoie le TCD complet à chaque adresse ou sa ligne seulement ?
Ou bien envoyer l'ensemble du TCD à 1 adresse mail unique, auquel cas dans quelle cellule est-elle indiquée (S1 par exemple) ?
Bonsoir SABOH
Désolée du retard.
En fait je voudrais envoyer le TCD de chacune des entreprise à partir du tcd Général
Sorte de boucle sur chaque entreprise, Filtre le TCD des valeur correspondant a l'entreprise et envoi du résultat filtré à l'entreprise
Ex :
For each Rg dans la plage qui contient la liste des entreprise
Si rg = Entreprise 1, alors, je filtre les données d'entreprise 1 et je les lui envoie par Outlook.Je ne sais pas si c'est assez détaillé.
D'accord, j'ai compris le principe. Mais si vous parlez de la liste des entreprises en feuille "SAISIES", il me semble que passer par le TCD est superflu ? On peut directement utiliser le tableau de la feuille SAISIES pour envoyer les mails non ?
Bonjour.
Merci pour le temps que tu mets sur ma préoccupation.
Je suis d'accord pour qu'on le fasse directement à partir du tableau source.
Merci.
Ok. Ci-joint une proposition qui génère 1 mail/ligne. Le code VBA se trouve dans le module1. Pour tester, les mails ne sont pas envoyés mais juste "préparés". Il faut changer la ligne du code :
countMail = countMail + SendMail(mailApp, msgList(i), False)
Par
countMail = countMail + SendMail(mailApp, msgList(i), True)
Pour les envoyer automatiquement.
Ci-après le code utilisé.
Option Explicit
' signature du mail
Const SIGNATURE As String = "Nathalie Charette"
' contenu utile a la creation d'un mail
Private Type Msg
company As String
expDate As Date
remDays As String
alert As String
com As String
mailAdr As String
End Type
' definir les numeros de colonne ici
Private Enum columnsIndex
company = 1
expDate = 6
remDays = 7
alert = 8
com = 9
mailAdr = 10
End Enum
' extraction d'un message depuis une ligne du tableau
Private Function MsgFromRow(ByRef tbl As Variant, rowI As Long) As Msg
Dim newMsg As Msg
With newMsg
.company = CStr(tbl(rowI, columnsIndex.company))
.expDate = CDate(tbl(rowI, columnsIndex.expDate))
.remDays = CStr(tbl(rowI, columnsIndex.remDays))
.alert = CStr(tbl(rowI, columnsIndex.alert))
.com = CStr(tbl(rowI, columnsIndex.com))
.mailAdr = CStr(tbl(rowI, columnsIndex.mailAdr))
End With
MsgFromRow = newMsg
End Function
Private Function SendMail(mailApp As Object, message As Msg, Optional ByVal envoiAuto As Boolean = False) As Long
On Error Resume Next
With mailApp.CreateItem(0)
.To = message.mailAdr
.Subject = message.alert
.Body = "Bonjour " & message.company & "," & vbCrLf & vbCrLf _
& "Vous avez " & message.remDays & " jours restants avant le " & Format$(message.expDate, "dd/mm/yyyy") & "." & vbCrLf _
& message.com & vbCrLf & vbCrLf _
& SIGNATURE
If envoiAuto Then
' pour envoyer le mail
.Send
Else
' pour afficher le mail
.Display
End If
End With
' verification qu'aucune erreur ne s'est produite
If Err.Number Then
SendMail = 0
Err.Clear
Else
SendMail = 1
End If
On Error GoTo 0
End Function
Public Sub EnvoyerMails()
' lecture du tableau
Dim tblEntreprises As Variant
tblEntreprises = ThisWorkbook.Worksheets("SAISIES").ListObjects("Tableau1").DataBodyRange.Value
' creation de la liste des messages
Dim i As Long, msgList() As Msg
ReDim msgList(LBound(tblEntreprises, 1) To UBound(tblEntreprises, 1))
For i = LBound(msgList) To UBound(msgList)
msgList(i) = MsgFromRow(tblEntreprises, i)
Next i
' envoi sur outlook
Dim mailApp As Object
Set mailApp = CreateObject("Outlook.Application")
Dim countMail As Long
For i = LBound(msgList) To UBound(msgList)
' pour envoyer le mail automatiquement, remplacer False par True dans la ligne suivante :
countMail = countMail + SendMail(mailApp, msgList(i), False)
Next i
' recap
MsgBox countMail & "/" & UBound(msgList) & " mails ont été correctement envoyés.", vbInformation, "Récap"
End Sub
Merci énormément pour ce que tu as fait.
C'est déjà une très belle ébauche.
en fait, quand je copie manuellement une plage de TCD et que je colle dans Outlook, le tableau se colle net.
Je voudrais savoir, est ce que tu peux m'aider à écrire une code qui copie une plage dynamique (nombre de ligne variable) et fixe en colonne ?
peux tu écrire le code qui permettrait plutôt de mettre un coller comme valeur de .Body dans le mail? le corps du mail soit une plage ?
Il peut arriver que société x aie 3 ou 4 lignes de données en fait, je voudrais une disposition en tableau.
STP, je ne sais pas si j'explique bien.
Bonjour,
Non vous n'expliquez pas très bien. Jusqu'à présent vous n'aviez pas précisé le "détail" qu'une même entreprise puisse apparaitre plusieurs fois dans votre liste. J'aurais dû m'en douter c'est vrai, car sinon l'utilisation du TCD est complètement superflue (ce que je disais plus haut), mais vous auriez pu mettre 2 lignes avec la même entreprise dans l'exemple histoire qu'il soit réaliste. C'est très important ce genre de choses…
S'il vous plait, pour que je puisse vous aider il me faut :
- Un tableau source représentatif de vos valeurs (donc de même taille, mêmes colonnes, et s'il y a des doublons/des caractéristiques, les mettre en évidence)
- Un exemple concret du mail à envoyer. Vous pouvez joindre un .msg de outlook avec un mail que vous avez préparé manuellement par exemple, ou un Word.
Merci.
Bonjour SABOH et merci.
En effet, c'est un tableau de relance client.
Avec une base de données des clients, une feuille de saisies des factures et règlements, un TCD qui récapitule le compte en affichant que les factures non réglées ou partiellement réglées.
Voici le modèle d'email préparé directement par macro, c'est-à-dire copier la plage TCD correspondant au filtre des données d'un client (entreprise), coller dans Outlook et envoyer le mail suivant au client :
NB : Ce filtre de la colonne client a été fait manuellement, et j'ai une cinquantaine de clients, d'où mon obstination à l'idée d'automatiser ce travail.