VBA Mail automatique, vraiment
Bonjour !
Avant de commencer je voulais d'abord dire que j'ai un niveau très médiocre avec les VBA malgré plusieurs exercices, je n'y arrive vraiment pas et pourtant j'ai bien essayé de m'attarder sur le sujet,
Je rencontre un petit problème avec mon fichier (étant trop volumineux je ne peux l'associer),
J'aimerai que quand une valeur dans la colonne C1 est ajouté ca envoie un mail directement à deux personnes (disons TestA@x.com et TestB@X.com),
mais voila je n'y arrive pas du tout et cela malgré plusieurs tuto, forum etc...,
à savoir que la plateforme de messagerie est Outlook,
Y aurait-il une âme charitable pour m'aider a résoudre ce problème? J'en serai vraiment très reconnaissant...
Par avance, merci beaucoup,
Cordialement,
ma macro :
Je m'excuse par avance de mon niveau médiocre
petite rectification, je voulais dire dans la colonne C
cordialement,
bonjour Dylan,
le problème se situe où ? Si vous remplacer ".Send" par ".display", est-ce que vous achevez le mail sur votre écran ? Si non, ça bloque où ?
bonjour,
J'ai changé .send par .Display mais rien ne se passe et je ne reçois aucun mail je pense donc que ma macro est erroné cependant je ne trouve pas de solution, lorsque je met une valeur dans la colonne C rien ne se passe
Effectivement petite faute de frappe de ma part... en tout cas ça fonctionne super bien c'est parfait merci beaucoup je voulais juste savoir, est ce que c'est possible que le mail s'envoie automatiquement dès lors qu'une valeurs est inscrite dans une colonne spécifique ? Si oui comment je pourrai faire svp,
par avance merci
bonjour,
ce que vous demandez, c'est un petit peu sursauter Microsoft. Ils ne veulent pas envoyer en automate des messages. C'est pourquoi vous obtenez un "popup".
Il y a un détour possible. Au moment ou le message est sur l'ecran, vous faites (vous même en manuel) un "CTRL+Enter" et le message est envoyé. Essayez !
Maintenant, on peut evoquer cela avec "SendKeys", mais savez que ce n'est pas une solution à 100% (mais presque). Il faut donner le système un peu de temps pour preparer tout, c'est tirer à l'aveugle et esperer que tout est prêt. Avec ce 5 et 2 secondes, cela suffit pour 99.99% des cas, on peut même diminuer cela mais alors le risque, que Outlook ne sera pas prêt, augmente.
Donc, quand vous lancez cette macro, Outlook prepare le message sur écran (presque instantanément), on attend 5 secondes, le sytème fait un CTRL+Enter (aveugle) et attend de nouveau 2 secondes. Si c'etait un echec, le message reste ouvert sur l'ecran.
Sub Mail_Outlook_intermédiaire()
Dim OutApp As Object
Dim OutMail As Object
Set OutApp = CreateObject("outlook.application")
With OutApp.createitem(0)
.to = Worksheets("Feuil1").Range("B1").Value 'C'EST FEUILL1 OU FEUIL1 ?????
.CC = Worksheets("Feuil1").Range("B2").Value
.BCC = Worksheets("Feuil1").Range("B3").Value
.Subject = "suject dfqdfqf " & Worksheets("Feuil1").Range("B4").Value
.Body = "fqdfqsfqsf dfssdfdfq qf qdsfq " & vbLf & Worksheets("Feuil1").Range("B5").Value
.Display
DoEvents
Application.Wait (Now + TimeSerial(0, 0, 5)) 'donnez assez de temps à Outlook de préparer l'email
DoEvents
CreateObject("WScript.Shell").SendKeys ("^{Enter}"), True 'evoquer un CTRL+Enter (esperant que outlook le comprend)
'CreateObject("WScript.Shell").SendKeys ("%S"), True 'evoquer un ALT+S (esperant que outlook le comprend)
Application.Wait (Now + TimeSerial(0, 0, 2)) 'donnez assez de temps à Outlook pour reagir
DoEvents
End With
End Subd'accord merci beaucoup pour votre réponse, et pour que quand une valeur est ajoutée en colonne C, un mail s'envoie avec cette dîtes valeurs. Est-ce possible vous pensez?
re,
regardez dans la module de la feuille "Feuil1"
J'ai ajouté quelque messages sur le "statusbar", de manière que vous voyez le progrès de la macro et j'ai diminuer ces 5 secondes à 3 ...
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .Count > 1 Then Exit Sub 'on ne peut changer qu'une cellule à la fois, autrement fini
If Target.Column <> 3 Then Exit Sub 'on n'a pas changé quelque chose dans la colonne C = fini
If Range("C" & Rows.Count).End(xlUp).Row <> .Row Then Exit Sub 'c n'est pas la derniere cellule en colonne C qui est modifiée
Mail_Outlook_intermédiaire
End With
End Sub
Ca fonctionne super bien merci énormément je vais essayer de trouver le moyen pour que la dernière données entrées en colonne C soit dans le corps du mail, Mais en tout cas je vous remercie grandement !
re,
je ne l'ai pas testé, quelque chose comme ca, on peut même agrandir le format si on veut ...
.Body = "les dernières données ...... " & vbLf & Worksheets("Feuil1").Range("C" & rows.count).end(xlup).Value
a condition que cette cellule C est numérique !
Sub Mail_Outlook_intermédiaire()
Dim OutApp As Object
Dim OutMail As Object
Application.StatusBar = "Debut macro": DoEvents
Set OutApp = CreateObject("outlook.application")
tekst0 = "Ici le dernier changement dans colonne C" & vbLf & "Son valeur est <début>" & Format(Range("C" & Rows.Count).End(xlUp).Value, "€ #,##0.00") & "<fin> pour une semaine "
tekst1 = Replace(tekst0, Chr(10), "<br>") 'vervang de linefeeds door <br>
tekst1 = Replace(tekst1, "<début>", "<b><font size=""5"" font face=""calibri"" color=""red"">") 'vervang <begin> door aangepaste font, kleur en grootte
tekst1 = Replace(tekst1, "<fin>", "</font>") 'vervang <einde> door normale font, kleur en grootte
With OutApp.createitem(0)
.to = Worksheets("Feuil1").Range("B1").Value 'C'EST FEUILL1 OU FEUIL1 ?????
.CC = Worksheets("Feuil1").Range("B2").Value
.BCC = Worksheets("Feuil1").Range("B3").Value
.Subject = "suject dfqdfqf " & Worksheets("Feuil1").Range("B4").Value
.htmlBody = tekst1
.Display
Application.StatusBar = "Displayed": DoEvents
DoEvents
Application.Wait (Now + TimeSerial(0, 0, 3)) 'donnez assez de temps à Outlook de préparer l'email
DoEvents
Application.StatusBar = "Sendkeys": DoEvents
CreateObject("WScript.Shell").SendKeys ("^{Enter}"), True 'evoquer un CTRL+Enter (esperant que outlook le comprend)
'CreateObject("WScript.Shell").SendKeys ("%S"), True 'evoquer un ALT+S (esperant que outlook le comprend)
Application.Wait (Now + TimeSerial(0, 0, 1)) 'donnez assez de temps à Outlook pour reagir
Application.StatusBar = "": DoEvents
DoEvents
End With
End SubTout fonctionne à merveille merci d'avoir pris de votre temps c'est super gentil !
Bien cordialement !


