Insérer des tableaux automatiquement dans un mail

Bonjour à tous,

Je ne sais pas si il y a une solution à ce problème, mais je pense que ça doit bien se trouver avec votre aide.

J'exporte un tableau excel depuis un logiciel interne de mon entreprise et celui-ci me permets de faire des relances. Plus exactement, une ligne contient un prix, une référence, un montant, le nom du client ainsi que d'autres infos comme la date de l'opération...

Pour le moment ma macro me permets d'envoyer un mail à chaque client (chaque ligne), un mail disant

Bonjour, veuillez noter que nous n'avons toujours pas reçu le règlement pour cette opération

prix = A1,

quantité = B1

Cependant, il est possible que plusieurs lignes soient destinées à la même personne.

Et j'aimerais si le cas se présente, avoir directement un extrait du tableau avec les informations utiles.

"Bonjour, veuillez noter que nous n'avons pas reçu le règlement pour ces opérations:

extrait du tableau avec chacune des lignes du client

Je suis débutant en VBA et je n'ai pas d'idée même en ce qui concerne le test des différentes lignes afin de regrouper celles qui auraient la même valeur dans la colonne "client".

Je continue afin de commencer à constuire un bout de code.

Merci à vous.

Bonjour,

Pour la sélection de tes cellules, tu peux faire une boucle sur celles-ci avec un For ... Next ou bien faire un filtre avancé en VBA.

Pour envoyer le tableau de résultat par message, je peux te proposer une fonction personnalisée que j'avais créé pour un sujet où la personne avait également besoin d'envoyer un tableau:

Private Function tableHTML(plage As Range) As String
tableHTML = "<head> <style> table, th, td {border: 1px solid black; border-collapse:collapse;}</style> </head><TABLE width=" & plage.Columns.width & ">" & Chr(10) & "<TR>"

For Each col In plage.Columns
    tableHTML = tableHTML & "<TH width=" & col.width & ">" & plage.Cells(1, col.Column)
Next col

If plage.Rows.Count > 1 Then
    For i = 2 To plage.Rows.Count
        tableHTML = tableHTML & "<TR>"
        For j = 1 To plage.Columns.Count
            tableHTML = tableHTML & "<TD bgcolor=" & DecVersHexa(plage.Cells(i, j).Interior.Color) & ">" & plage.Cells(i, j)
        Next j
    Next i
End If

tableHTML = tableHTML & "</TABLE>"
End Function

Private Function DecVersHexa(ByVal valeur As Long) As String
rouge = Left(Hex(Int(valeur Mod 256)) & "00", 2)
vert = Left(Hex(Int((valeur Mod 65536) / 256)) & "00", 2)
bleu = Left(Hex(Int(valeur / 65536)) & "00", 2)
DecVersHexa = rouge & vert & bleu
End Function

La première fonction crée un code HTML représentant un tableau, la deuxième permet de convertir les couleurs d'Excel en quelque choe d'utilisable en HTML. Pour utiliser cette fonction, il faudra par exemple mettre dans le corps de ton message:

tableHTML(Range("A1:H8"))

Merci beaucoup pour ta réponse, pour les boucles je sais m'y prendre

Si je comprends bien, il faut passer par un code "HTML" pour exporter, manipuler, des données un peu plus complexes que des valeurs de cellules de VBA à un mail.

Merci encore une fois pour ces fonctions, je vais voir pour les adapter et ainsi résoudre mon problème.

Je reviendrai par ici pour te tenir au courant.

Hello,

Ta fonction est très simple à utiliser, c'est top.

Le problème étant que j'écris cela:

Sub Mail()

Dim tableau As Variant

'Derlig = [A10000].End(xlUp).Row
'DerCol = [Xfd1].End(xlToLeft).Column
'tableau = Cells(1, 1).Address & ":" & Cells(Derlig, DerCol).Address
'tableau = Cells(1, 1).Address & ":" & Cells(3, 9).Address

Dim ol As Object, mymail As Object
Set ol = CreateObject("outlook.application")
Set mymail = ol.CreateItem(olMailItem)

mymail.To = "middleoffice@toto.com"

mymail.cc = "service_middle_obligations@toto.com"

mymail.Subject = "UNMATCHED AND SHORT POSITIONS"

mymail.Body = "Hello," & Chr(13) & Chr(13) _
                & "Could you please advise regarding the below trades:" & Chr(13) & Chr(13) _
                & tableHTML(Range("A1:I3")) & Chr(13) & Chr(13) _
                & "Please check and revert to us."

mymail.display

End Sub

et j'obtiens cela dans mon corps de mail, je dois avoir fais une fausse manip

Hello, 
Could you please advise regarding the below trades: 
<head> <style> table, th, td {border: 1px solid black; border-collapse:collapse;}</style> </head><TABLE width=745.5> 
<TR><TH width=60>TD<TH width=60>VD<TH width=78>ISIN<TH width=60>Quantity<TH width=60>Price <TH width=60.75>Net amount<TH width=139.5>Our SSI <TH width=167.25>Your SSI<TH width=60>State<TR><TD bgcolor=FFFFFF>08/11/2079<TD bgcolor=FFFFFF>08/11/2079<TD bgcolor=FFFFFF>........<TD bgcolor=FFFFFF>19,000<TD bgcolor=FFFFFF>102.39<TD bgcolor=FFFFFF>19,558.57<TD bgcolor=FFFFFF>EC <TD bgcolor=FFFFFF>CEDEL<TD bgcolor=FFFFFF>Short<TR><TD bgcolor=FFFFFF>08/11/2079<TD bgcolor=FFFFFF>08/11/2079<TD bgcolor=FFFFFF>.......<TD bgcolor=FFFFFF>40,000<TD bgcolor=FFFFFF>99.35<TD bgcolor=FFFFFF>42,110.41<TD bgcolor=FFFFFF>German Domestic <TD bgcolor=FFFFFF>German Domestic <TD bgcolor=FFFFFF>Short</TABLE>
Please check and revert to us. 

Re!

content de voir que tu apprécies la fonction que j'ai créé

Pour ta question, il faut commencer ton message par : "<HTML><BODY>" et finir par "</BODY></HTML>"

ce qui donnerait:

mymail.Body = "<HTML><BODY>Hello," & Chr(13) & Chr(13) _
                & "Could you please advise regarding the below trades:" & Chr(13) & Chr(13) _
                & tableHTML(Range("A1:I3")) & Chr(13) & Chr(13) _
                & "Please check and revert to us.</BODY></HTML>"

Je te joins le fichier que j'avais utilisé pour tester la fonction HTML si ça peut t'aider, ainsi que le sujet:

https://forum.excel-pratique.com/viewtopic.php?f=2&t=127947

Il faut lancer la macro manuellement, tu peux regarder de plus près le code si ça peut t'aider

Elle est géniale ta fonction Ausecour, mais il me semble qu'il manque la fermeture des balises th, tr et td

</th>

</tr>

</td>

J'i un doute sur " & Car(10) & ", j'aurais mis <BR/>

Je suis étonné que cela fonctionne !

Mais ta fonction est géniale (j'ai la même mais en noir et blanc, c'est cela la différence !)

rien n'y faire,

voici le mail:

<HTML><BODY>Hello, 
Could you please advise regarding the below trades: 
<head> <style> table, th, td {border: 1px solid black; border-collapse:collapse;}</style> </head><TABLE width=745.5> 
<TR><TH width=60>TD<TH width=60>VD<TH width=78>ISIN<TH width=60>Quantity<TH width=60>Price <TH width=60.75>Net amount<TH width=139.5>Our SSI <TH width=167.25>Your SSI<TH width=60>State<TR><TD bgcolor=FFFFFF>08/11/2079<TD bgcolor=FFFFFF>08/11/2079<TD bgcolor=FFFFFF>KO19<TD bgcolor=FFFFFF>19,000<TD bgcolor=FFFFFF>102.39<TD bgcolor=FFFFFF>19,558.57<TD bgcolor=FFFFFF>EC <TD bgcolor=FFFFFF>CEDEL<TD bgcolor=FFFFFF>Short<TR><TD bgcolor=FFFFFF>08/11/2079<TD bgcolor=FFFFFF>08/11/2079<TD bgcolor=FFFFFF>KOKOKOKOK<TD bgcolor=FFFFFF>40,000<TD bgcolor=FFFFFF>99.35<TD bgcolor=FFFFFF>42,110.41<TD bgcolor=FFFFFF>German Domestic <TD bgcolor=FFFFFF>German Domestic <TD bgcolor=FFFFFF>Short</TABLE>
Please check and revert to us.</BODY></HTML> 

Merci pour cette remarque Steelson!

Je ne sais pas non plus par quel miracle ça marche!

J'ai tâché de revoir la fonction pour ajouter ce qu'il faut:

Private Function tableHTML(plage As Range) As String
tableHTML = "<head> <style> table, th, td {border: 1px solid black; border-collapse:collapse;}</style> </head><TABLE width=" & plage.Columns.width & ">" & Chr(10) & "<TR>"

For Each col In plage.Columns
    tableHTML = tableHTML & "<TH width=" & col.width & ">" & plage.Cells(1, col.Column) & "</TH>"
Next col

If plage.Rows.Count > 1 Then
    For i = 2 To plage.Rows.Count
        tableHTML = tableHTML & "<TR>"
        For j = 1 To plage.Columns.Count
            tableHTML = tableHTML & "<TD bgcolor=" & DecVersHexa(plage.Cells(i, j).Interior.Color) & ">" & plage.Cells(i, j) & "</TD>"
        Next j
        tableHTML = tableHTML & "</TR>"
    Next i
End If

tableHTML = tableHTML & "</TABLE>"
End Function

Private Function DecVersHexa(ByVal valeur As Long) As String
rouge = Left(Hex(Int(valeur Mod 256)) & "00", 2)
vert = Left(Hex(Int((valeur Mod 65536) / 256)) & "00", 2)
bleu = Left(Hex(Int(valeur / 65536)) & "00", 2)
DecVersHexa = rouge & vert & bleu
End Function

Maintenant il y a les fins de balises

@kizobar , Tu dois déclarer email.htmlBODY et non email.BODY

rien n'y faire,

Ah oui pardon, je n'avais pas vu que tu avais écris mymail.Body, il faut mettre mymail.HTMLBody

EDIT: ah ben Steelson on s'est croisé de peu encore une fois

Alleluiah, ça ressemble à quelque chose merci à vous

De rien

merci à Steelson pour sa participation, et à toi d'avoir passé le sujet en résolu

Yes

Pour le coup, les espaces ne fonctionnent plus : "Chr(13)"

Vous auriez pas une solution?

tes espaces sont des sauts de ligne? si c'est ça il faut mettre Chr(10)

Oui, ce sont des sauts de lignes, j'ai essayé avec Chr(10) mais ça ne fonctionne pas non plus.

et si je peux me permettre une dernière question, est il possible d'insérer une variable dans ta fonction?

Un peu comme cela

Sub Mail()

Dim tableau As Range

Derlig = [A10000].End(xlUp).Row
DerCol = [Xfd1].End(xlToLeft).Column
tableau = Cells(1, 1).Address & ":" & Cells(Derlig, DerCol).Address

Dim ol As Object, mymail As Object
Set ol = CreateObject("outlook.application")
Set mymail = ol.CreateItem(olMailItem)

mymail.To = "middleoffice@toto.com"

mymail.cc = "service_middle_obligations@toto.com"

mymail.Subject = "UNMATCHED AND SHORT POSITIONS"

mymail.HTMLBody = "<HTML><BODY>Hello," & Chr(10) & Chr(10) _
                & "Could you please advise regarding the below trades:" & Chr(10) & Chr(10) _
                & tableHTML(tableau) & Chr(10) & Chr(10) _
                & "Please check and revert to us.</BODY></HTML>"

mymail.display

End Sub

Re, pour les sauts de ligne je crois qu'il faut utiliser <br /> en fait, à tester!

Pour la variable, c'est possible, mais pas de cette façon, il faut un Range pour ma fonction, soit une plage de cellules, tableau dans ton cas c'est du texte qui représente une adresse, il faudrait donc écrire: Range(tableau) pour passer la plage de cellules à la fonction

ton HTMLBody donnerait:

mymail.HTMLBody = "<HTML><BODY>Hello,<br /><br />Could you please advise regarding the below trades:<br /><br />" & _
tableHTML(Range(tableau)) & "<br /><br />Please check and revert to us.</BODY></HTML>"

Ok juste magnifique, un petit problème que j'ai réussi à résoudre.

Merci pour le temps que tu m'as accordé.

De rien

Rechercher des sujets similaires à "inserer tableaux automatiquement mail"