Macro création feuille de calcul + formatage corps mail envoyé par macro
Bonjour,
Je suis TRES novice en macro et en bidouillant un peu, j'ai réussi à faire ce que je voulais. Mais le résultat n'est pas optimum pour ma première macro ni super esthétique pour la seconde... d'où mon appel à l'aide.
Description du fichier et de son utilisation :
Le fichier me sert à gérer les absences en formation de mes stagiaires.
J'ai une première feuille appelée "Liste des Stagiaires" dans laquelle je rentre en ligne un certain nombre d'informations à propos de chaque stagiaire (Nom, Prénom, Formation, Date de début Formation, Date de fin formation...) : 1 ligne = 1 stagiaire, 1 colonne = 1 info le concernant.
Pour chaque nouveau stagiaire saisi, une première macro me permet de générer la fiche de suivi de l'assiduité du stagiaire dans une nouvelle feuille de calcul qui porte le nom du stagiaire, selon un modèle prédéfini qui comporte :
- un entête récapitulant les informations administratives du stagiaires et les coordonnées des personnes à qui je dois envoyer un mail en cas d'absence / retard,
- une ligne pour chaque date allant du début de la formation à la fin de la formation (le remplissage se fait en excluant les week-ends et les jours de fermeture du centre, définis dans une liste séparée).
Quand un stagiaire est absent, ou en retard ou part avant la fin du cours pour une journée donnée, je saisis les infos sur la ligne correspondant à la journée concernée. Chaque jour ou semaine, la seconde macro me permet d'envoyer un mail récapitulatif au contact dont les coordonnées figurent sur la feuille de suivi d'assiduité, avec le stagiaire et la coordonnatrice de l'action en CC.
Première macro
J'ai visé "très large" pour le nombre de lignes, pour être sûre d'en avoir assez, mais certaines formations peuvent être :
- bien plus courtes donc, plein de lignes vides à supprimer,
- je n'exclus pas que certaines durent plus longtemps (ce qui obligerait à rajouter des lignes "à la main").
Comment puis-je optimiser mon code (ou mon modèle ?) pour n'avoir QUE le bon nombre de lignes ? (1 date par jour de formation (du lundi au vendredi), entre les dates de début et de fin de formation, en excluant les jours de fermeture) ?
Sub CréationFeuilleStagiaire()
Dim NbFeuille As Double
Dim MonNomStagiaire As String
MonNomStagiaire = ActiveCell
Sheets("Modèle stagiaire").Visible = True
NbFeuille = ThisWorkbook.Worksheets.Count
Sheets("Modèle stagiaire").Copy After:=Sheets(NbFeuille)
Sheets(NbFeuille + 1).Name = MonNomStagiaire
Sheets(MonNomStagiaire).Cells(1, 2).Value = MonNomStagiaire
Sheets(MonNomStagiaire).Visible = True
Sheets("Modèle stagiaire").Visible = False
End SubSeconde Macro
C'est celle qui envoie le mail.
Elle fait bien ce que je veux à savoir => quand il y a des heures d'absence ET que la colonne G est vide, ou quand il y a retard ET que la colonne G est vide ou quand il y a départ anticipé ET que la colonne G est vide, le bouton envoyer un mail :
- fait partir un mail qui récapitule les éléments relatifs aux absences / retard / départ avec en destinataire l'adresse de la cellule A6, en CC les cellules B2 et E6,
- ajoute la date du jour d'envoi dans la colonne G
Mon problème est que le mail est super "moche" et j'ai essayé de le formater en utilisant des balises HTML mais sans succès. J'aurais aimé par exemple que la police du mail soit calibri, que le fond de l'entête du tableau soit bleu et le texte en gras et idem pour la ligne qui récapitule le total. De même j'aimerais que certains éléments du corps du texte soient en gras (le nom du stagiaire par exemple).
Sub EnvoiMailTuteur()
Dim MesInvités(40) As String
Dim MonObjet As String
Dim MonCorps As String
MonObjet = Range("MailObjet").Value
MonCorps = "<!DOCTYPE html><body>" & Range("MailPhrase1").Value & "<p>"
MonCorps = MonCorps & Range("MailPhrase2").Value & ActiveSheet.Cells(1, 2) & ", "
MonCorps = MonCorps & ActiveSheet.Cells(1, 16) & ", "
MonCorps = MonCorps & Range("MailPhrase3").Value & ActiveSheet.Cells(1, 6) & " "
MonCorps = MonCorps & Range("MailPhrase4").Value & ":<p>"
'Début du tableau des absences
MonCorps = MonCorps & "<table border>"
MonCorps = MonCorps & "<tr> <th> Date </th> <th> H.Planifiées </th> <th> Période absence </th><th> H.Absence </th><th>Cumul Retards (hh:mm)</th><th>Cumul Départs anticipés (hh:mm)</th><th>A prévenu ?</th><th>Justificatif</th></tr>"
For i = 12 To 500
If ActiveSheet.Cells(i, 5).Value > 0 And IsEmpty(ActiveSheet.Cells(i, 17)) And Not IsEmpty(ActiveSheet.Cells(i, 1)) Then
ActiveSheet.Cells(i, 17).Value = Date
MonCorps = MonCorps & "<tr> <td align=""center"">" & Format(ActiveSheet.Cells(i, 2).Value, "dd/mm/yyyy") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 3).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 6).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 5).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 9).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 12).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(i, 13) & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(i, 14) & "</td></tr>"
ElseIf ActiveSheet.Cells(i, 9).Value > 0 And IsEmpty(ActiveSheet.Cells(i, 17)) And Not IsEmpty(ActiveSheet.Cells(i, 1)) Then
ActiveSheet.Cells(i, 17).Value = Date
MonCorps = MonCorps & "<tr> <td align=""center"">" & Format(ActiveSheet.Cells(i, 2).Value, "dd/mm/yyyy") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 3).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 6).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 5).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 9).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 12).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(i, 13) & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(i, 14) & "</td></tr>"
ElseIf ActiveSheet.Cells(i, 12).Value > 0 And IsEmpty(ActiveSheet.Cells(i, 17)) And Not IsEmpty(ActiveSheet.Cells(i, 1)) Then
ActiveSheet.Cells(i, 17).Value = Date
MonCorps = MonCorps & "<tr> <td align=""center"">" & Format(ActiveSheet.Cells(i, 2).Value, "dd/mm/yyyy") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 3).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 6).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 5).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 9).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 12).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(i, 13) & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(i, 14) & "</td></tr>"
End If
Next
'Fin du tableau des absences
MonCorps = MonCorps & "<TR background-color=""blue""> <td align=""center"">" & "CUMUL DEPUIS LE " & Format(ActiveSheet.Cells(2, 6).Value, "dd/mm/yyyy") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & " </td>"
MonCorps = MonCorps & "<td align=""center"">" & " </td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(10, 5) & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(10, 9).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(10, 12).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & " </td>"
MonCorps = MonCorps & "<td align=""center"">" & " </td></tr>"
MonCorps = MonCorps & "</table>"
MonCorps = MonCorps & Range("MailPhrase5").Value & "</br>"
'Début du tableau des horaires
MonCorps = MonCorps & "<table border>"
MonCorps = MonCorps & "<tr> <th> </th> <th> Début des cours</th> <th> Fin des cours</th></tr>"
MonCorps = MonCorps & "<TR> <td align=""center"">" & ActiveSheet.Cells(3, 10) & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(3, 11).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(3, 12) & "</td></TR>"
MonCorps = MonCorps & "<TR> <td align=""center"">" & ActiveSheet.Cells(4, 10) & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(4, 11) & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(4, 12).Value, "hh:mm") & "</td></TR>"
'Fin du tableau des horaires
MonCorps = MonCorps & "</table>"
MonCorps = MonCorps & Range("MailPhrase6").Value & "<p>"
MonCorps = MonCorps & Range("MailPhrase7").Value & ActiveSheet.Cells(1, 2) & ".<p>"
MonCorps = MonCorps & Range("MailPhrase8").Value & "</FONT>" & "<br>"
MonCorps = MonCorps & "<FONT color=""blue"">" & Range("MailPhrase9").Value & "</FONT><br>"
MonCorps = MonCorps & Range("MailPhrase10").Value & "<br>"
MonCorps = MonCorps & Range("MailPhrase11").Value & "<br>"
MonCorps = MonCorps & Range("MailPhrase12").Value & "<br>"
MonCorps = MonCorps & Range("MailPhrase13").Value & "<br>"
MonCorps = MonCorps & "<FONT color=""steelblue"">" & Range("MailPhrase14").Value & "</FONT>"
MonCorps = MonCorps & "</body><HTML>"
Call MonEnvoiMail(ActiveSheet.Cells(6, 1).Value, ActiveSheet.Cells(2, 2).Value & ";" & ActiveSheet.Cells(6, 5).Value, "", MonObjet, MonCorps, False)
End Sub
Sub MonEnvoiMail(ByVal MesDestinataires As String, ByVal MesDestinatairesCopie As String, _
ByVal MesDestinatairesCopieCachée As Variant, ByVal MonObjet As String, _
ByVal MonCorps As String, ByVal MonChoixPièceAttachée As Boolean)
Dim i As Integer
Dim MaMessagerie As Object
Dim MonMail As Object
Dim MaSignature As String
Set MaMessagerie = CreateObject("Outlook.Application")
If Not (MaMessagerie Is Nothing) Then
Set MonMail = MaMessagerie.CreateItem(0)
With MonMail
.BCC = MesDestinatairesCopieCachée
.CC = MesDestinatairesCopie
.Subject = MonObjet
.BodyFormat = 2
.HTMLBody = MonCorps
.To = MesDestinataires
.Display
End With
Set MonMail = Nothing
Set MaMessagerie = Nothing
End If
End SubUn immense merci d'avance de vos retours !!
bonjour
hoh purée j'ai mis plus d'une heure a trouver et comprendre
non c'est tout simplement pas possible
on ne travaille pas le html comme ça en string
purré j'en ai encore les larmes de douleur
je t'ai fait ça tu changera les couleur comme tu souhaite
Option Explicit
Sub EnvoiMailTuteur()
Dim MesInvités(40) As String
Dim MonObjet$, MonCorps$, a, HtmlDOC As Object, table, table2, trs, Text1, I&, TH, TD, EleM
a = Array("Date", "Heures<br>Planifiées", "Période<br>absence", "H.Absence", "Cumul Retards<br>hh:mm)", "Cumul Départs anticipés (hh:mm)", "A prévenu", "Justificatif")
Text1 = Range("MailPhrase1").Value & "<p>" & Range("MailPhrase2").Value & "<FONT COLOR=BLUE><b>" & ActiveSheet.Cells(1, 2) & "</b></font>, " & ActiveSheet.Cells(1, 16) & ", " & _
Range("MailPhrase3").Value & ActiveSheet.Cells(1, 6) & " " & Range("MailPhrase4").Value & ":<p>"
MonObjet = Range("MailObjet").Value
Set HtmlDOC = CreateObject("htmlfile")
With HtmlDOC
.body.innerhtml = Text1 & "<table><tr></tr><tr></tr></table>" 'une table html avec 2 ligne vides
With .getelementsbytagname("table")(0)
.Style.Fontfamily = "calibri" ' font name pour toute la table et ses descendants
.Style.bordercollapse = "collapse" 'bordures collées
End With
Set trs = .getelementsbytagname("TR")
For I = 0 To UBound(a)
Set TH = trs(0).appendchild(.createelement("th")): TH.innerhtml = a(I) ' création des entêtes de la table html
TH.Style.Border = "2.5pt solid rgb(255,200,0)" ' bordure entêtes (dim , style du trait , couleur)
TH.Style.backgroundcolor = "rgb(0,200,50)" 'interior cellule entêtes
TH.Style.Width = "100pt" 'largeur cellule
TH.Style.Color = "black" 'couleur du texte
Set TD = trs(1).appendchild(.createelement("td"))
TD.Style.Border = "0.5pt solid black" 'idem
TD.Style.Height = "25pt" 'hauteur de cellules html
TD.Style.TextAlign = "center" 'alignement du text
TD.Style.backgroundcolor = "rgb(220,22,50)" 'interior color des cellules html
TD.Style.Color = "white" 'couleur du texte
Next
'Fin du tableau des absences
trs(1).ChildNodes(0).innerhtml = "CUMUL DEPUIS LE<br>" & Format(ActiveSheet.Cells(2, 6).Value, "dd/mm/yyyy") & "</td>"
'trs(1).ChildNodes(1).innerhtml = ""
'trs(1).ChildNodes(2).innerhtml = ""
trs(1).ChildNodes(3).innerhtml = ActiveSheet.Cells(10, 5)
trs(1).ChildNodes(4).innerhtml = Format(ActiveSheet.Cells(10, 9).Value, "hh:mm") & "</td>"
trs(1).ChildNodes(5).innerhtml = Format(ActiveSheet.Cells(10, 12).Value, "hh:mm") & "</td>"
trs(1).ChildNodes(6).innerhtml = ""
trs(1).ChildNodes(7).innerhtml = ""
HtmlDOC.body.innerhtml = HtmlDOC.body.innerhtml & "<br>" & Range("MailPhrase5").Value
'Début du tableau des horaires(création)
.body.innerhtml = .body.innerhtml & "<table>" & _
"<tr><th></th><th></th><th></th></tr>" & _
"<tr><td></td><td></td><td></td></tr>" & _
"<tr><td></td><td></td><td></td></tr></table>"
Set table2 = .getelementsbytagname("table")(1) 'on la pointe en tant qu'object
With table2 'on va la styler
.Style.bordercollapse = "collapse" 'bordure collées
.Style.TextAlign = "center" 'texte aligné au centre
.Style.Fontfamily = "calibri" ' le font name pour toute la table et ses descendants
End With
Set trs = table2.getelementsbytagname("TR")
trs(0).ChildNodes(1).innerhtml = "Début des cours"
trs(0).ChildNodes(2).innerhtml = "Fin des cours"
trs(1).ChildNodes(0).innerhtml = "MATIN"
trs(2).ChildNodes(0).innerhtml = "A M"
trs(1).ChildNodes(1).innerhtml = ActiveSheet.Cells(3, "k").Text
trs(2).ChildNodes(1).innerhtml = ActiveSheet.Cells(4, "k").Text
trs(1).ChildNodes(2).innerhtml = ActiveSheet.Cells(3, "l").Text
trs(2).ChildNodes(2).innerhtml = ActiveSheet.Cells(4, "l").Text
'un peu de style maintenant pour les cellules html
For Each EleM In table2.all
With EleM
Select Case EleM.tagname
Case "TH" ' les cellules entêtes html
.Style.Border = "1pt solid black" 'bordure 1 point d'epaisseur trait plein noir
.Style.backgroundcolor = "rgb(0,50,220)" 'interior de l'entête du tableau html
.Style.Color = "yellow" 'couleur du texte
.Style.Fontfamily = "calibri" 'font name du texte
.Style.Width = "100pt" 'largeur des cellule
Case "TD" 'les cellules html
.Style.Border = "1pt solid black" 'idem
.Style.Color = "red"
.Style.backgroundcolor = "rgb(0,255,255)"
End Select
End With
Next
.body.innerhtml = .body.innerhtml & "</br>" & Range("MailPhrase6").Value & "<p>" & _
Range("MailPhrase7").Value & ActiveSheet.Cells(1, 2) & ".<p>" & _
Range("MailPhrase8").Value & "</FONT>" & "<br>" & _
"<FONT color=""blue"">" & Range("MailPhrase9").Value & "</FONT><br>" & _
Range("MailPhrase10").Value & "<br>" & _
Range("MailPhrase11").Value & "<br>" & _
Range("MailPhrase12").Value & "<br>" & _
Range("MailPhrase13").Value & "<br>" & _
"<FONT color=""steelblue"">" & Range("MailPhrase14").Value & "</FONT>"
End With
MonCorps = HtmlDOC.body.innerhtml
Call MonEnvoiMail(ActiveSheet.Cells(6, 1).Value, ActiveSheet.Cells(2, 2).Value & ";" & ActiveSheet.Cells(6, 5).Value, "", MonObjet, MonCorps, False)
End SubBonsoir Patrick,
Merci beaucoup d'avoir pris le temps de me répondre !! Désolée pour les larmes de douleur... Je me suis basée sur un code récupéré sur le net, comme quoi, on trouve à boire et à manger et comme j'avais réussi à faire fonctionner, ma foi :)
J'ai remplacé par le code que tu m'as donné et quand je lance la macro, j'ai ce message d'erreur :
Je suis malheureusement incapable de voir où se situe le problème.
re
remplace tout les mot ChildNodes par Children peut être que tes librairie html sont tellement tronqué car je suppose que tu travaille sur W 11 et off 365
pour info vola ce que ca donne chez moi
Je ne peux pas voir que ce ça donne chez toi, le fichier a été retiré avant que je puisse y accéder.
Néanmoins, en remplaçant les Childnodes par Children, le mail se génère bien (W11 et Off 2023, j'aurais sans doute du préciser, en effet), youpi !
Je vais essayer de modifier cette partie de mon code qui faisait pleurer les yeux :
For i = 12 To 500
If ActiveSheet.Cells(i, 5).Value > 0 And IsEmpty(ActiveSheet.Cells(i, 17)) And Not IsEmpty(ActiveSheet.Cells(i, 1)) Then
ActiveSheet.Cells(i, 17).Value = Date
MonCorps = MonCorps & "<tr> <td align=""center"">" & Format(ActiveSheet.Cells(i, 2).Value, "dd/mm/yyyy") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 3).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 6).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 5).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 9).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 12).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(i, 13) & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(i, 14) & "</td></tr>"
ElseIf ActiveSheet.Cells(i, 9).Value > 0 And IsEmpty(ActiveSheet.Cells(i, 17)) And Not IsEmpty(ActiveSheet.Cells(i, 1)) Then
ActiveSheet.Cells(i, 17).Value = Date
MonCorps = MonCorps & "<tr> <td align=""center"">" & Format(ActiveSheet.Cells(i, 2).Value, "dd/mm/yyyy") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 3).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 6).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 5).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 9).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 12).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(i, 13) & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(i, 14) & "</td></tr>"
ElseIf ActiveSheet.Cells(i, 12).Value > 0 And IsEmpty(ActiveSheet.Cells(i, 17)) And Not IsEmpty(ActiveSheet.Cells(i, 1)) Then
ActiveSheet.Cells(i, 17).Value = Date
MonCorps = MonCorps & "<tr> <td align=""center"">" & Format(ActiveSheet.Cells(i, 2).Value, "dd/mm/yyyy") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 3).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 6).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 5).Value, "0.0") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 9).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & Format(ActiveSheet.Cells(i, 12).Value, "hh:mm") & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(i, 13) & "</td>"
MonCorps = MonCorps & "<td align=""center"">" & ActiveSheet.Cells(i, 14) & "</td></tr>"
End If
Nexten essayant de comprendre comment fonctionne celui que tu m'as écrit, parce que l'objectif du tableau, c'est quand même de fournir un récapitulatif des absences / retards / départs anticipés pour lesquels on n'a pas déjà alerté le responsable** avec en dernière ligne, le cumul depuis le début de la formation.
** C'est à dire
- chaque ligne du fichier de suivi d'assiduité pour laquelle :
ou il y a des heures d'absence (col E > 0) ET que la colonne G est vide,
ou il y a retard (col I >0) ET que la colonne G est vide,
ou il y a départ anticipé (col L >0) ET que la colonne G est vide
+ il faut donc que la macro ajoute la date du jour d'envoi du mail dans la colonne G aux bons endroits, pour que lors de l'envoi suivant, seules les nouvelles lignes d'absence etc. figurent au récapitulatif.
Si je n'y arrive pas, je reviendrais demander de l'aide.
Merci beaucoup en tous cas !!!
P.S. le fichier fourni contenait des données qui apparaissaient comme personnelles mais qui étaient fictives
le mieux c'est que tu me montre u tableau même avec excel
qui representerait le tableau dans le mail
donc oui tu confirme
comme avec w11 IE a été supprimé, il ne reste plus que la librairie de base microsoft de IE 8/9 XHTML
je m'en doutait fortement à l'avenir je travaillerais dans ce sens
j'attend un exemple de tableau
fait moi plaisir
colle ça dans un module vierge(ajoute en un si il faut)
et lance la sub test
tu devrait avoir dans le dossier ou se trouve le classeur un fichier html
dis moi si c'est ça que tu veux
Sub test()
Set f = ActiveSheet
Set doc = CreateObject("htmlfile")
doc.body.innerhtml = "<table><tr></tr></table>"
Set table = doc.getelementsbytagname("table")(0)
table.Style.fontFamily = "calibri"
table.cellspacing = 0
Set capt = table.appendchild(doc.createelement("caption"))
capt.innerhtml = "<b>Récapitulatif des retards et départs anticipés non pointés à ce jour </b>"
capt.Style.backgroundcolor = "blue"
capt.Style.Color = "white"
'l'entete
Set tr = table.appendchild(doc.createelement("TR"))
tr.Style.backgroundcolor = "rgb(255,150,0)"
tr.Style.Color = "blue"
For Each cel In f.Range("A9").Resize(, 14).Cells
Set TH = tr.appendchild(doc.createelement("th"))
TH.innerhtml = cel
TH.Style.Border = "2pt solid green"
Next
'les lignes des reards et depart naticipés
For I = 12 To 500
If f.Cells(I, 1) <> "" And Cells(I, "Q") = "" Then
If f.Range("A" & I).Resize(, 13).DisplayFormat.Interior.Color <> vbWhite Then
Set tr = table.appendchild(doc.createelement("tr"))
For c = 1 To 14
Set TD = tr.appendchild(doc.createelement("td"))
TD.innerhtml = f.Cells(I, c).Text
With TD.Style
.Width = Round(f.Cells(I, c).Width) & "pt"
.Border = "0.5pt solid rgb(220,220,220)"
.TextAlign = "center"
If f.Cells(I, c).DisplayFormat.Interior.Color <> vbWhite Then
.backgroundcolor = "rgb(255,255,0)"
.Color = "red"
TD.innerhtml = "<B<<i>" & f.Cells(I, c).Text & "</i></B>"
End If
End With
Next
End If
Else: Exit For
End If
Next
Debug.Print doc.body.innerhtml
'ecriture du fichier html exemple
q = FreeFile: Open ThisWorkbook.Path & "\test de tableau recap.html" For Output As #q: Print #q, doc.body.innerhtml: Close #q
End Sub
Waow, je rallume mon mon ordi ce soir pensant me plonger dans le code que tu as donné initialement pour essayer de le bidouiller.... mais je vois le mail auquel tu arrives et c'est EXACTEMENT ça que je voulais arriver à faire (pas les couleurs
C'est fantastique !
Du coup, le code final, ça serait quoi ?
Merci beaucoup.
re
alors pour te simplifier la tâche
j'ai séparé les code tableau html en fonction comme ca il sera plus facile d'intervenir dessus au moindre besoins de changement
alors c'est pas parfait mais ca match bien
si tu veux modifier les style c'est dans les blocs With /end with
je ne sais pas si ca march<e bien le principe de déjà fait( c'est à dire uniquement ce qui n'ont pas la date en "Q"
ou pas tu me diras
alors voila le module "Fonction_Mail_Outlook"
Option Explicit
Sub EnvoiMailTuteur()
'Dim MesInvités(40) As String'?????
Dim MonObjet$, MonCorps$, a, TextHtml
a = Array("Date", "Heures<br>Planifiées", "Période<br>absence", "H.Absence", "Cumul Retards<br>hh:mm)", "Cumul Départs anticipés (hh:mm)", "A prévenu", "Justificatif")
TextHtml = Range("MailPhrase1").Value & "<p>" & Range("MailPhrase2").Value & "<FONT COLOR=BLUE><b>" & ActiveSheet.Cells(1, 2) & "</b></font>, <br>" & ActiveSheet.Cells(1, 16) & ", " & _
Range("MailPhrase3").Value & ActiveSheet.Cells(1, 6) & " " & Range("MailPhrase4").Value & ":<p>"
MonObjet = Range("MailObjet").Value
TextHtml = TextHtml & TableauRecapHtmL
TextHtml = TextHtml & "<br><table><tr><th style=""background-color:#0000FF;color:#FFFFFF;"">Les horaires de la formation sont les suivants :</th></tr></table>"
TextHtml = TextHtml & TableauHoraireHtmL
TextHtml = TextHtml & "</br>" & Range("MailPhrase6").Value & "<p>" & _
Range("MailPhrase7").Value & ActiveSheet.Cells(1, 2) & ".<p>" & _
Range("MailPhrase8").Value & "</FONT>" & "<br>" & _
"<FONT color=""blue"">" & Range("MailPhrase9").Value & "</FONT><br>" & _
Range("MailPhrase10").Value & "<br>" & _
Range("MailPhrase11").Value & "<br>" & _
Range("MailPhrase12").Value & "<br>" & _
Range("MailPhrase13").Value & "<br>" & _
"<FONT color=""steelblue"">" & Range("MailPhrase14").Value & "</FONT>"
MonCorps = TextHtml
Call MonEnvoiMail(ActiveSheet.Cells(6, 1).Value, ActiveSheet.Cells(2, 2).Value & ";" & ActiveSheet.Cells(6, 5).Value, "", MonObjet, MonCorps, False)
End Sub
Sub MonEnvoiMail(ByVal MesDestinataires As String, ByVal MesDestinatairesCopie As String, ByVal MesDestinatairesCopieCachée As Variant, ByVal MonObjet As String, ByVal MonCorps As String, ByVal MonChoixPièceAttachée As Boolean)
Dim I As Integer, MaMessagerie As Object, MonMail As Object, MaSignature As String
Set MaMessagerie = CreateObject("Outlook.Application")
If Not (MaMessagerie Is Nothing) Then
Set MonMail = MaMessagerie.CreateItem(0)
With MonMail
.BCC = MesDestinatairesCopieCachée
.CC = MesDestinatairesCopie
.Subject = MonObjet
.BodyFormat = 2
.HTMLBody = MonCorps
.To = MesDestinataires
.Display
End With
Set MonMail = Nothing
Set MaMessagerie = Nothing
End If
End Subensuite voila le module "fonctions_Tableau_html"
Option Explicit
Function TableauRecapHtmL()
Dim F As Worksheet, Capt, TrH, TH, TR, TD, I&, Text1$, Col, c
Dim MonObjet$, a, HtmlDoC As Object, Table
Set F = ActiveSheet
a = Array("Date", "Heures<br>Planifiées", "Période<br>absence", "H.Absence", "Cumul Retards<br>hh:mm)", "Cumul Départs anticipés (hh:mm)", "A prévenu", "Justificatif")
Set HtmlDoC = CreateObject("htmlfile")
With HtmlDoC
.body.innerhtml = Text1 & "<table></table>" 'une table html avec 2 lignes vides
Set Table = .getelementsbytagname("table")(0)
'style general de la table
With Table
.Style.fontfamily = "calibri" 'font name pour toute la table et ses descendants
.Style.bordercollapse = "collapse" 'bordures collées
.Style.TextAlign = "center" 'alignement du texte dans pour toute la table html
.Style.fontfamily = "calibri" 'font name pour toute la table html
End With
'création de la barre de titre du tableau
Set Capt = Table.appendchild(HtmlDoC.createelement("caption"))
With Capt
.innerhtml = UCase("<b>Récapitulatif des retards et départs anticipés</b>")
With .Style 'style de la bare de titre du tableau
.backgroundcolor = "blue"
.Color = "white"
.Border = "1pt solid green"
End With
End With
'creation de la ligne d'entête
Set TrH = Table.appendchild(.createelement("TR"))
'style de l'entête
With TrH.Style
.backgroundcolor = "rgb(255,255,200)"
End With
'ajout des cellules de l'entête
For I = LBound(a) To UBound(a)
Set TH = TrH.appendchild(.createelement("TH"))
TH.innerhtml = a(I)
'style des cellules de l'entête
With TH.Style
.Border = "1pt solid blue"
.Width = "120pt"
.Height = "40pt"
End With
Next
Col = Array(2, 3, 6, 5, 9, 12, 13, 14) 'les colonnes du tableau excel à récupérer
For I = 12 To 500
If F.Cells(I, 1) <> "" And F.Cells(I, "Q") = "" Then
If F.Range("A" & I).Resize(, 14).DisplayFormat.Interior.Color <> vbWhite Then
Set TR = Table.appendchild(.createelement("tr"))
For c = 0 To UBound(Col)
Set TD = TR.appendchild(.createelement("td"))
TD.innerhtml = F.Cells(I, Col(c)).Text
With TD.Style 'style des cellules du tableau
.Border = "1px solid rgb(230,230,230)"
.Width = "120pt"
Select Case Col(c)
Case 5, 9, 12: If F.Cells(I, Col(c)) > 0 Then .backgroundcolor = "rgb(255,180,230)"
End Select
End With
Next
F.Cells(I, 17) = Date
End If
Else
Exit For
End If
Next
'LIGNE TOTAUX
Set TR = Table.appendchild(.createelement("tr"))
With TR.Style 'style de la ligne des totaux
.backgroundcolor = "rgb(230,230,230)"
End With
'inscription des donnée de la ligne des totaux
For c = 0 To UBound(Col)
Set TD = TR.appendchild(.createelement("td"))
TD.innerhtml = "<b>" & F.Cells(10, Col(c)).Text & "</B>"
With TD.Style 'style des cellules de la ligne des totaux
.Border = "1px solid rgb(230,230,23)"
End With
Next
TR.Children(0).innerhtml = "<b>cumul depuis le<br>" & F.Cells(12, 2) & "</B>"
TableauRecapHtmL = .body.innerhtml
End With
End Function
Sub test()
With CreateObject("internetexplorer.application")
.navigate "about:blank"
.document.write TableauHoraireHtmL
.Visible = True
End With
End Sub
Function TableauHoraireHtmL()
Dim HtmlDoC, Table, TrH, TR, TD, Lig&, c, TH
Set HtmlDoC = CreateObject("htmlfile")
HtmlDoC.body.innerhtml = "<table></table>" 'une table html avec 2 ligne vides
Set Table = HtmlDoC.getelementsbytagname("table")(0)
'style general de la table
With Table.Style
.fontfamily = "calibri" ' font name pour toute la table et ses descendants
.bordercollapse = "collapse" 'bordures collées
.TextAlign = "center"
.fontfamily = "calibri"
.Border = "2px solid red"
End With
With Range("J2:L4")
''entête
Set TrH = Table.appendchild(HtmlDoC.createelement("TR"))
With TrH.Style 'style le la ligne d' entêtes
.backgroundcolor = "rgb(255,255,200)"
End With
For c = 1 To .Columns.Count
Set TH = TrH.appendchild(HtmlDoC.createelement("TH"))
TH.innerhtml = .Cells(1, c).Text
With TH.Style ' style des cellules du tableau html
.Border = "1px solid blue"
.Width = "100pt"
End With
Next
For Lig = 2 To .Rows.Count
Set TR = Table.appendchild(HtmlDoC.createelement("tr"))
For c = 1 To .Columns.Count
Set TD = TR.appendchild(HtmlDoC.createelement("td"))
TD.innerhtml = "<B><I>" & .Cells(Lig, c).Text & "</I></B>"
With TD.Style
.Border = "1px solid rgb(230,230,230)"
.Color = "blue"
End With
Next
Next
End With
TableauHoraireHtmL = HtmlDoC.body.innerhtml
End Functionet du coup le fichier dans son état actuel
Je viens de faire quelques tests, ça semble marcher nickel
Je n'ai pas testé toutes les configurations, je ferai ça demain et je passerai en résolu.
Un immense merci à nouveau !!!
de rien
n'hésite pas si soucis ou que tu comprends pas quelque chose
La grippe est passée par là et m'a ralentie... je reviens pour clôre le sujet qui est résolu. Encore mille mercis pour la solution clé en main, moi qui pensais qu'il y aurait juste à remanier un peu le code de départ, oops...
re
Bonsoir pheeebzzz
ravi pour toi

