Envoi mail avec une pièce jointe avec emplacements différents (serveur)
Bonjour à tous,
Petite question pour un débutant dans le monde VBA.
Voici un petit code, permettant d'envoyer un mail outlook avec pièce jointe à partir d'un bouton d'une feuille excel. Cette feuille excel sera accessible à un groupe d'utilisateurs.
Mon problème vient du fait que la pièce jointe, stocké sur le serveur de ma boite, n'est pas situé sur le même chemin pour tous les utilisateurs. En effet, la façon dont est monté le serveur de l'entreprise n'est pas la même selon les utilisateurs. De cette manière, le chemin d'accès au fichier diffère. (bon, il n'y a que 2 issues possibles).
Mon idée était définir ces 2 chemins, puis faire appel à un Error GoTo dans le cas où un chemin n'est pas trouvé.
Si je fais cela (code surement mal écrit), le mail Outlook va bien sé générer mais j'aurai tout de même le MsgBox "Le mail n'a pas pu être envoyé" de l'autre situation.
Comment faire les choses proprement / ne pas afficher le MsgBox ?
Private Sub CommandButton2_Click()
Dim MonSujet As String
Dim MonContenu As String
Dim MaPieceJointe1 As String
Dim MaPieceJointe2 As String
MaPieceJointe1 = "chemin1\fichier.xlsx"
MaPieceJointe2 = "chemin2\fichier.xlsx"
MonSujet = "Sujet"
MonContenu = "Bonjour, <br> <br>" & _
"L'équipe"
On Error GoTo Suite1
Call EnvoyerEmail(MonSujet, MonContenu, MaPieceJointe1)
Suite1:
Call EnvoyerEmail(MonSujet, MonContenu, MaPieceJointe2)
End Sub
Si besoin, la fonction EnvoyerEmail (trouvé sur la toile, irréfutable à priori).
Sub EnvoyerEmail(ByVal Sujet As String, ByVal ContenuEmail As String, Optional ByVal PieceJointe As String) On Error GoTo EnvoyerEmailErreur 'définition des variables Dim oOutlook As Outlook.Application Dim WasOutlookOpen As Boolean Dim oMailItem As Outlook.MailItem Dim Body As Variant Body = ContenuEmail 'vérification si le Contenu du mail n'est pas vide. Si oui, email n'est pas envoyé. Si vous voulez pouvoir envoyer les email vides, mettez en commentaire les 4 lignes de code qui suivent. If (Body = False) Then MsgBox "Mail non envoyé car vide", vbOKOnly, "Message" Exit Sub End If 'préparer Outlook PreparerOutlook oOutlook Set oMailItem = oOutlook.CreateItem(0) 'création de l'email With oMailItem '.To = Destinataire .Subject = Sujet 'CHOIX DU FORMAT '---------------------- 'email formaté comme texte '.BodyFormat = olFormatRichText '.Body = Body 'OU 'email formaté comme HTML .BodyFormat = olFormatHTML .HTMLBody = "<html><p>" & Body & "</p></html>" '---------------------- If PieceJointe <> "" Then .Attachments.Add PieceJointe .Display '<- affiche l'email (si vous ne voulez pas l'afficher, mettez cette ligne en commentaire) .Save '<- sauvegarde l'email avant l'envoi (pour ne pas le sauvegarder, mettez cette ligne en commentaire) ' .Send <- envoie l'email (si vous voulez seulement préparer l'email et l'envoyer manuellement, mettez cette ligne en commentaire) End With 'nettoyage... If (Not (oMailItem Is Nothing)) Then Set oMailItem = Nothing If (Not (oOutlook Is Nothing)) Then Set oOutlook = Nothing Exit Sub EnvoyerEmailErreur: If (Not (oMailItem Is Nothing)) Then Set oMailItem = Nothing If (Not (oOutlook Is Nothing)) Then Set oOutlook = Nothing MsgBox "Le mail n'a pas pu être envoyé...", vbCritical, "Erreur" End Sub Private Sub PreparerOutlook(ByRef oOutlook As Object) '------------------------------------------------------------------------------------------------ 'Ce code vérifie si Outlook est prêt à envoyer des emails... Et s'il ne l'est pas, il le prépare. '------------------------------------------------------------------------------------------------ On Error GoTo PreparerOutlookErreur On Error Resume Next 'vérification si Outlook est ouvert Set oOutlook = GetObject(, "Outlook.Application") If (Err.Number <> 0) Then 'si Outlook n'est pas ouvert, une instance est ouverte Err.Clear Set oOutlook = CreateObject("Outlook.Application") Else 'si Outlook est ouvert, l'instance existante est utilisée Set oOutlook = GetObject("Outlook.Application") oOutlook.Visible = True End If Exit Sub PreparerOutlookErreur: MsgBox "Une erreur est survenue lors de l'exécution de PreparerOutlook()..." End Sub
Bonjour,
Pouvez-vous essayer en utilisant la fonction Dir() :
Private Sub CommandButton2_Click()
Dim MonSujet As String
Dim MonContenu As String
Dim MaPJ As String, Rep as string
Rep = SpecificPath("chemin1", "chemin2") 'chemins par variable ou en dur sans antislash de fin
MaPJ = Rep & "\fichier.xlsx"
MonSujet = "Sujet"
MonContenu = "Bonjour, <br> <br>" & _
"L'équipe"
Call EnvoyerEmail(MonSujet, MonContenu, MaPJ)
End Sub
function SpecificPath(Path1$, Path2$) as string
on error resume next
select case true
case dir(Path1) <> "": SpecificPath = Path1
case dir(Path2) <> "": SpecificPath = Path2
end select
end function
Cdlt,