Suite à plusieurs recherches infructueuses je me permet de vous demandez comment associer ma macro d'envoi de mail à ma fonction Si.
le contexte est le suivant: Lorsque une date arrive à échéance un envoi de mail est envoyé par ma fonction SI.
Function Mail_Workbook_1()
Dim OutApp As Object
Dim OutMail As Object
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next
With OutMail
.To = "<mon adresse"
.CC = ""
.BCC = ""
.Subject = "Fin de validité"
.Body = "Bonjour La date de validité du controle technique arrive à terme, n'oubliez pas de l'actualiser"
.Send
End With
On Error GoTo 0
Set OutMail = Nothing
Set OutApp = Nothing
End Function
Je voudrais l'associer à :
=SI(G4>=AUJOURDHUI()-7;"attention:arrive à échéance";"ok") et donc remplacer attention:arrive à échéance à un envoi de mail
sylvain974
Faut pas être susceptible...
Tu n'as pas vu les emoticones qui parsèment mes messages... alors cool, raoul , tranquille, émile
J'essaie juste de t’expliquer qu'un syntaxe de ce type : Function nommacro()(dans une macro) n'est pas correcte.
Pour t'en convaincre, essaie lancer la macro mB
Puis lances la macro mA NB: Ce ne sont que des macros d'illustrations et pas des solutions/améliorations à ta question.
Code:
Sub mA()
envoiemail
End Sub
Sub mB()
Function envoiemail()
End Sub
Private Function envoiemail()
MsgBox "Bonjour " & Application.UserName & ", il est " & Time, vbInformation, "Tic,tac,tic,tac"
End Function
Ci-dessous, une autre macro (juste à titre d'illustration) pour voir les différents moyens de lancer une macro dans VBA. NB: Pour tester:
1) dans un classeur vierge, insères un module standard (donc Module1) 2) copies-y le code dans un module standard (donc Module1) 3) enregistre ce classeur sous le nom sylvain974bis.xlsm 4) enfin lance la macro nommée: SyntaxesAppelsMacro
VB:
Sub SyntaxesAppelsMacro()
'//////| syntaxes OK |\\\\\
Application.Run "'sylvain974bis.xlsm'!Module1.envoiemail"
Application.Run "'sylvain974bis.xlsm'!envoiemail"
Application.Run "envoiemail"
Call envoiemail
envoiemail
'//////| syntaxes PAS OK |\\\\\
'Pour génerer l'erreur:
'Supprimes le guillemet devant cette ligne: 'Function envoiemail()
'puis relances la macro nommée : SyntaxesAppelsMacro
'Function envoiemail()
End Sub
Private Function envoiemail()
MsgBox _
"Il est " & Time, 64, _
"Bonjour," & Application.UserName
End Function
NB: Ce matin ,je testerai au boulot avec Outlook, le vrai envoi d'un mail avec la function Semd_Mail
et je te redis ce qu'il en sera en fin d’après-midi. (car à domicile, je n'utilise pas Outlook comme client de messagerie)
NB: Ce matin ,je testerai au boulot avec Outlook, le vrai envoi d'un mail avec la function Semd_Mail
et je te redis ce qu'il en sera en fin d’après-midi. (car à domicile, je n'utilise pas Outlook comme client de messagerie)
Donc comme promis, j'ai testé la function Send_MAIL et cela fonctionne comme le montre la copie d'écran ci-dessous. Regarde la pièce jointe 937959
Ci-dessous le code tel que je l'ai testé au boulot. NB: Il faut juste avant de tester remplacer "monadresse" par une adresse mail valide. (PS: j'ai testé en ayant une session Oulook ouverte sur mon poste avant de lancer la macro depuis Excel)
VB:
Sub TestduIF()
Dim datesTest, i As Byte
datesTest = Array(1, 3, 7, 9, 11)
For i = LBound(datesTest) To UBound(datesTest)
Range("G4") = _
DateAdd("d", CDbl(datesTest(i)), Date - 15)
AlerteECHEANCE
Next
End Sub
Public Sub AlerteECHEANCE()
If Range("G4") > Date - 7 Then
MsgBox "Arrive à échéance.", 16, "Attention!"
Send_Mail
Else
MsgBox "ok"
End If
End Sub
Public Function Send_Mail()
Dim Message As String
Message = "Bonjour," & vbCr
Message = Message & "La date de validité de contôle technique arrive à terme." & vbCr
Message = Message & "N'oubliez pas de l'actualiser."
On Error Resume Next
With CreateObject("Outlook.Application").CreateItem(0)
.To = "mon adresse"
.Subject = "Fin de validité": .Body = Message: .Display: .Send
End With
MsgBox Message
On Error GoTo 0
End Function
Voila j'ai tout fait dans les normes je t'envoi la pièce jointe (en jaune les dates arrivée à échéance) .
Peux-tu me faire ton retour?
Pour ma part il envoi un mail alors qu'il devrait me mettre ok. est-ce ton cas aussi ?
sylvain974 Voici le code présent dans Feuil1 tel qu'il est dans ton dernier fichier joint
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("G4") > Date - 7 Then
MsgBox "attention:arrive à échéance", vbCritical
Function Send_Mail()
Else
MsgBox "ok"
End If
End Sub
Donc je t'invite à relire les messages #14 et #16 pour voir ce qui cloche...
NB: Il serait sans doute utile que tu sois plus attentif à ce que j'écris dans mes messages, sinon à chaque nouveau post de ta part, je risque de te renvoyer dans mes précédents messages parce que tu auras zappé certaines de mes précédentes explications.
Donc je t'invite à regarder ton message #2 ou il est écrit :
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("G4") > Date - 7 Then
MsgBox "attention:arrive à échéance", vbCritical
Function Send_Mail
Else
MsgBox "ok"
End If
End Sub
Si je relis tous t'es messages il manque dans ton code End Function non ?
Ensuite j'ai essayé avec Private et Public mais aucun changement de toute façon je peut essayé n'importe quoi je retourne toujours sur ma question #22 ...
PS: J'ai beau être attentif si je te pose la question c'est que je ne m'en sort pas :/ , mais merci de me faire réfléchir ...
Re sylvain974
J'essaie juste de t’expliquer qu'un syntaxe de ce type : Function nommacro()(dans une macro) n'est pas correcte.
Pour t'en convaincre, essaie lancer la macro mB
Puis lances la macro mA NB: Ce ne sont que des macros d'illustrations et pas des solutions/améliorations à ta question.
Cela semble explicite, non ?
Or dans le code, de ta dernière PJ, ta syntaxe ne tient pas compte de ce que je t’expliquais (exemples à l'appui)
Nouvelle exemple avec en 1) la bonne syntaxe et en 2) une syntaxe qui génére une erreur .
C'est le pourquoi de mon précédent message) (celle précédemment évoquée ... dans mes précédents messages)
1) La syntaxe correcte
Code:
Sub testSyntaxeLeRetour()
toto
End Sub
Code:
Function toto()
MsgBox Now
End Function
2) La syntaxe erronée (que tu utilises malgré tout )
Code:
Sub testSyntaxeLeRetour()
Function toto() 'ici VBA n'aime pas et le signale
End Sub
Code:
Function toto()
MsgBox Now
End Function
[digression mais pas que]
Si j'étais moi, je te conseillerai de relire posément tous mes messages depuis le but du fil en présence d'une tasse de café, avec à droite de ta soucoupe, deux, trois carrés d'un chocolat de grande qualité.
La nicotine qu'elle soit fumée, vapotée ou gommée peut être un plus.
On veillera également à avoir en fond sonore, un peu de musique.
Tout ceci évidemment doit permettre une concentration et un esprit des plus affuté pour naviguer dans le monde de VBA
Pour ce qui me concerne, mon environnement actuel est le suivant:
vapoteuse au bec, tasse fumante de rooibos, une pleine coupelle de palets au chocolat et entre les oreilles FIP. [/digression mais pas que]
Ah !!!!! j'ai enfin compris Send_mail= Function Send_mail dans le module il va le chercher en-faite !
Donc voila le rectifié après temps de tentatives :
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("H4") > Date - 7 Then
MsgBox "attention:arrive à échéance", vbCritical
Send_Mail
Else
MsgBox "ok"
End If
End Sub
sylvain974
Pour ce soir, je ne peux guère t'aider
(cf le NB: dans le message #18)
Ou juste ceci simplement pour tester le If/Else/End If
(J'ai ajouté un test pour que la macro ne s'exécute qui si la cellule active est H4, donc ma macro ne lance au moindre changement sur la feuille)
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$H$4" Then
If Range("H4") > Date - 7 Then
MsgBox "attention:arrive à échéance", vbCritical
'Send_Mail
Else
MsgBox "ok"
End If
End If
Pour ce qui est de l'envoi du mail, espérions que d'autres membres du forum utilisant Outlook viennent faire un tout dans ton fil pour te filer un coup de main
C'est bien la date d'aujourd'hui -7 jours ? car à chaque activation la macro devrait me dire OK , or il m'envoi le mail et me dit arriver à échéance ...