Microsoft 365 MsgBoxPerso et envoi de mail auto

ExcLnoob

XLDnaute Occasionnel
Bonjour le Forum,

Bon j'ai encore fait n'importe quoi je crois...
J'ai un fichier avec des prestations et des dates d'échéance pour chaque prestations. J'ai implémenté une macro qui m'ouvre 2 MsgBoxPerso quand :
1/ Les dates arrivent à échéance
2/ Les dates sont échues
J'ai essayé d'intégrer une macro d'envoi de mail sur le bouton valider des 2 MsgBoxPerso.

Cela fonctionne mais je rencontre 2 erreurs :
1/ Quand les dates sont échues (MsgBoxPerso((txt), "Alerte", vbCritical, "xxxx", "xxxxx") pour l'exemple) le mail s'ouvre bien mais le texte de la MsgBox lui ne remonte pas, ou plutôt je le vois furtivement mais il disparait
Le message pour les dates échues ne s'affiche que si les 2 MsgBoxPerso sont activées (cad uniquement s'il y a des dates échues ET qui arrivent à échéance)

2/Quand il y a des dates échues ET qui arrivent à échéance et que j'envoi un mail un chaque fois, tout va bien. Mais si je choisi de ne pas envoyer le premier mail la deuxième MsgBoxPerso s'affiche comme une MsgBox normale (et fais quand même l'action demandé).

A mon avis je place mal mes bouts de code dans la deuxième partie de celui-ci mais ça n'engage que moi. N'est pas Harry Potter qui veut... #apprentisorcierpastrèsdoué :rolleyes:

Si vous pouviez me dire où j'ai fauté....
Merci pour vos explications !!

Le code en question :
Private Sub Worksheet_Activate()
Dim c As Range
Dim OutlookApp As Object
Dim OutlookMail As Object
Set OutlookApp = CreateObject("outlook.application")
Set OutlookMail = OutlookApp.createitem(0)
txt = ""
txt1 = ""
With Sheets("Feuil1")
For Each c In Range(.[P3], [P65536].End(xlUp))
If c <> "" Then
If c.Value < Date Then
If txt = "" Then txt = "Les dates ci-dessous sont échues :" & vbCrLf & vbCrLf
txt = txt & c.Offset(, -12) & " - Terminée le : " & c.Offset(, 0) & vbCrLf
ElseIf c.Value < Date + 30 Then
If txt1 = "" Then txt1 = "Les dates ci-dessous arrivent à échéance dans 1 mois ou moins :" & vbCrLf & vbCrLf
txt1 = txt1 & c.Offset(, -12) & " - Arrive à écheance le : " & c.Offset(, 0) & vbCrLf
End If
End If
Next c
If txt <> "" Then Rep = MsgBoxPerso((txt), "Alerte", vbCritical, "Envoi Mail", "Ne rien faire")
Select Case Rep
Case 1
With OutlookMail
.Subject = "Des prestations nécessitent votre attention"
.To = Sheets("Feuil2").Range("F7")
.Body = "Bonjour," & vbCrLf & vbCrLf & MsgBoxPerso & vbCrLf & "Merci de renouveler vos prestations ci-dessous svp." & vbCrLf & vbCrLf & "Cordialement,"
.Display
End With
End Select
If txt1 <> "" Then Rep = MsgBoxPerso((txt1), "Information", vbInformation, "Envoi Mail", "Ne rien faire")
Select Case Rep
Case 1
With OutlookMail
.Subject = "Des prestations nécessitent votre attention"
.To = Sheets("Infos Utiles Mali").Range("F10")
.Body = "Bonjour," & vbCrLf & vbCrLf & MsgBoxPerso & vbCrLf & "Merci de renouveler Merci de renouveler vos prestations ci-dessous svp." & vbCrLf & vbCrLf & "Cordialement,"
.Display
End With
End Select
End With
End Sub
 
Dernière édition:
Solution
Euhhh Non ! pas de ce pas :)
Certes il faut agir mais je te donne la méthode.
Insérer un .Attachments.Add dans le module ?
Comme j'ai interfacé l'accès aux objets OutLook, il faut passer par cette interface.
Vois dans le nouveau fichier joint (à utiliser) la ligne mise en commentaire permettant d'ajouter 1 attachment.
VB:
 'OutlookInterface.Attachments(1) = <chemin complet de l'attachement>

et mon adresse dans le code de la feuille ?
Avec OutLook tu ne spécifies pas ton adresse. Tu utilises un compte dont le numéro d'ordre (1, 2, 3, ...) est utilisé dans le SendUsingAccount.
Si tu veux que l'interface te présente la liste des comptes Outlook utilisables avec la possibilité de choisir, il faut que tu remplaces 1...

Dudu2

XLDnaute Barbatruc
Il y a 2 problèmes dans ton problème.
Le 1er est que tu passes dans la 2ème séquence d'envoi de mail même s'il n'y a pas eu de MsgBox car les séquences d'envoi de mail ne sont pas dans les blocs iF adéquats.

Le 2ème problème est dans la manipulation de l'Objet OutLookMail car les 2 séquences s'enchainant, il devrait y avoir 2 panneaux OutLook du ".Display" du mail. Or il n'y en a qu'un (ce qui n'est d'ailleurs pas normal) et tu crois que la valeur n'apparait que furtivement mais en fait c'est le 2ème panneau OutLook ".Display" qui écrase le premier.
Car attention, le ".Display" n'est pas une action bloquante, la macro continue de s'exécuter et tu peux comme ça avoir tous tes panneaux OutLook ".Display" cumulés en affichage.

Donc soit tu changes de méthode (.Send au lieu de .Display) soit tu arrêtes le traitement après chaque .Display (pour Send manuel) et tu le reprends par un moyen à déterminer qui n'est pas si simple, soit tu laisses tous tes panneaux OutLook ".Display" affichés mais si il y en a beaucoup ça va faire désordre.

J'avais fait autrefois des macros d'envoi de mails, dont OutLook de manière un peu plus structurée, que j'ai ajouté dans ton code (ModuleEnvoiMailOutlook). Cette macro utilise une structure d'interface plus facile à manipuler que les éléments OutLook directement.
Et corrigé la cause du 1er problème.

Edit: Tu peux essayer de ré-utiliser tes MsgBoxPerso si ça te plait davantage que les MsgBox natifs car, dans un contexte mieux stabilisé, les risques sont moins importants.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Euhhh Non ! pas de ce pas :)
Certes il faut agir mais je te donne la méthode.
Insérer un .Attachments.Add dans le module ?
Comme j'ai interfacé l'accès aux objets OutLook, il faut passer par cette interface.
Vois dans le nouveau fichier joint (à utiliser) la ligne mise en commentaire permettant d'ajouter 1 attachment.
VB:
 'OutlookInterface.Attachments(1) = <chemin complet de l'attachement>

et mon adresse dans le code de la feuille ?
Avec OutLook tu ne spécifies pas ton adresse. Tu utilises un compte dont le numéro d'ordre (1, 2, 3, ...) est utilisé dans le SendUsingAccount.
Si tu veux que l'interface te présente la liste des comptes Outlook utilisables avec la possibilité de choisir, il faut que tu remplaces 1 par 0 dans cette instruction.
Code:
OutlookInterface.SendUsingAccount = 1

Ensuite, si c'est toujours le même, remplace 1 par le numéro de compte OutLook à utiliser.
 

Pièces jointes

  • Copie de Classeur1-1.xlsm
    24.7 KB · Affichages: 9

Discussions similaires

Réponses
6
Affichages
293

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 813
dernier inscrit
kaiyi