Macro envoi mail

mariedédé

XLDnaute Nouveau
Bonjour,

Malgré beaucoup d'essais, de réponses et d'aide de votre part, je n'arrive toujours pas à faire faire fonctionner la macro pour envoyer un fichier excel( en pièce jointe par mail, dans le module 7), j'ai un message d'erreur: (en pièce jointe).

Merci à tous ceux qui pourront m'aider.
 

Pièces jointes

  • Bon de commande prestation annexe.xls
    128 KB · Affichages: 108
  • erreur 1004.PNG
    erreur 1004.PNG
    20.2 KB · Affichages: 88
  • Bon de commande prestation annexe.xls
    128 KB · Affichages: 89
  • Bon de commande prestation annexe.xls
    128 KB · Affichages: 95
  • erreur 1004.PNG
    erreur 1004.PNG
    20.2 KB · Affichages: 93

Gelinotte

XLDnaute Accro
Re : Macro envoi mail

Allô!

Si j'ai bien compris, tu tentes d'envoyer le classeur qui est présentement ouvert (celui qui sert à envoyer).

On ne peut pas s'auto-envoyer. Il faut créer une copie et c'est cette copie que tu peux envoyer ... avec succès 8 - ))

G
 

mariedédé

XLDnaute Nouveau
Re : Macro envoi mail

Bonjour,

Non je ne veux pas me l'auto envoyer, les adresses mail que j'ai mises sont juste là pour l'essai, si tu préfères, voici les adresses qui seront utilisées:
B43: personne qui fera la demande et qui recevra un accusé de lecture (jamais la même personne).
B46: chef de service ou directeur du demandeur qui devra recevoir le formulaire en copie (jamais la même personne)
G46: personne à qui sera adressée la demande, cette personne ne changera jamais, c'est le responsable du secteur logistique qui sera chargé de traiter la demande
G47: idem que G46, c'est l'adjoint du responsable
G48 : directeur de G46 etG47 devra recevoir le demande en copie.

j'espère que mes explications sont claires?
Merci.
 

JCGL

XLDnaute Barbatruc
Re : Macro envoi mail

Bonjour à tous,

Peux-tu essayer en enlevant le dernier Sep :

Code:
If Sheets("Feuil1").Range("C52") = "OUI" Then
        If Range("G46") <> "" Then A = A & Range("G46") & Sep
        If Range("G47") <> "" Then A = A & Range("G47") & Sep
        If Range("G48") <> "" Then A = A & Range("G48") & Sep
        If Range("B46") <> "" Then A = A & Range("B46")

A + à tous
 

Gelinotte

XLDnaute Accro
Re : Macro envoi mail

Bonsoir,

Après bien des essais, ce code peut envoyer à plusieurs adresses.

Il resterait à trouver si on peut utiliser l'objet C.C. pour l'adresse en G48.

Code:
Sub EnvoiMail()
Dim A$, B$, C$, D$, Sep$
Application.DisplayAlerts = False
Sep = "; "
If Sheets("Feuil1").Range("C52") = "OUI" Then
    If Range("G46") <> "" Then A = A & Range("G46") '& Sep
    If Range("G47") <> "" Then B = B & Range("G47") '& Sep
    If Range("G48") <> "" Then C = C & Range("G48")  '& Sep
    If Range("B46") <> "" Then D = D & Range("B46")  '& Sep
   
    ActiveWorkbook.SendMail Recipients:=Array(A, B, C, D), _
            Subject:="Test envoi classeur", _
            ReturnReceipt:=True

Else
    MsgBox "Formulaire incomplet. Envoi annulé"
End If
End Sub

G
 

mariedédé

XLDnaute Nouveau
Re : Macro envoi mail

Bonjour Gelinotte,

C'est parfait, ça fonctionne.

Une dernière chose, comment et où dois-je rajouter une ligne pour mettre un message dans le corps du texte. ex: "veuillez trouver ci joint une demande de prestation annexe"

Merci d'avance
 

Gelinotte

XLDnaute Accro
Re : Macro envoi mail

Bonjour,

Quand on est dans la fenêtre VBE, on frappe F2 pour avoir l'Explorateur d'objet. Lequel nous mentionne pour SendMail : Sub SendMail(Recipients, [Subject], [ReturnReceipt])
Membre de Excel.Workbook

Il semblerait que SendMail n'ait que 3 arguments : Recipients, Subject et ReturnReceipt.

Google étant mon ami, je l'ai consulté hier. Il semble confirmer que SendMail est très limité.

Pour avoir C.C., C.C.I. et Body, il va peut-être falloir utiliser une autre méthode.

En recherchant sur le forum, il a eu dernièrement un thread sur comment envoyer un fichier attaché via Outlook. La macro fait une copie de notre fichier et l'envoie via une méthode plus versatile, donnant accès à :
Code:
With OutMail
            .To = "ron@debruin.nl"
            .CC = ""
            .BCC = ""
            .Subject = ActiveWorkbook.Name
            .HTMLBody = strbody
            .Display   'or use .Send
        End With

Ce forum est une source incommensurable d'aide indispensable. Ce qui est aussi sa faiblesse. Quand on recherche un vieux thread, on peut chercher longtemps. 8- //

Je vais m'y atteler ce soir après le boulot.

A+

G
 
Dernière édition:

Gelinotte

XLDnaute Accro
Re : Macro envoi mail

Bonsoir,

Code:
Sub EnvoiMail()
Dim A$, B$, C$, D$, Sep$
Dim LaDate As String

Application.DisplayAlerts = False
Sep = "; "
If Sheets("Feuil1").Range("C52") = "OUI" Then
    If Range("G46") <> "" Then A = A & Range("G46") '& Sep
    If Range("G47") <> "" Then B = B & Range("G47") '& Sep
    If Range("G48") <> "" Then C = C & Range("G48")  '& Sep
    If Range("B46") <> "" Then D = D & Range("B46")  '& Sep

    Application.DisplayAlerts = False
    repertoireAppli = ActiveWorkbook.Path & "\"
    ActiveWorkbook.SaveAs repertoireAppli & "Bon de commande prestation annexe_.xlsm"
    Dim olapp As Object 'Outlook.Application
    Set olapp = CreateObject("Outlook.Application")
    Dim msg As Object 'MailItem
    Set msg = olapp.CreateItem(olMailItem)
    With msg
        .To = A & ";" & B
        .CC = C & ";" & D
        .BCC = ""   ' copie conforme invisible
        .Subject = "Test envoi classeur"
        .Body = "Veuillez trouver ci-joint une demande de prestation annexe." & Chr(13)  & Chr(13) &  Sheets("feuil1").Range("B1").Value & Chr(13) & Chr(13) & Sheets("feuil1").Range("B2").Value & Chr(13) & Chr(13)
        .Attachments.Add repertoireAppli & "Bon de commande prestation annexe_.xlsm"
'        .Display  'activer cette ligne afin que le message s'affiche avant de partir
        .ReadReceiptRequested = True
    End With
    msg.Send
    Set msg = Nothing
    Set olapp = Nothing
Else
    MsgBox "Formulaire incomplet. Envoi annulé"
End If
End Sub

Remplacer la macro du module7 par celle-ci.
Dans la ligne Body, j'ai ajouté des champs de la feuille, juste comme démonstration.
Faire attention que le nom de ton fichier soit différent du nom dans la macro. Car, une copie est créée et c'est cette copie qui est envoyée. Si le nom est identique, ça va écraser ton "modèle".
À la rigueur, tu peux utiliser un autre répertoire que celui de ton fichier. Cette macro utilise le même répertoire
Fait des copies pour tester, des tonnes de copies.

G
 

Gelinotte

XLDnaute Accro
Re : Macro envoi mail

Bonjour,


Bonjour Gelinotte,

Je te remercie, ça marche impeccable, j'ai juste été obligé de modifier xlsm en xls.

Merci encore et à +
M:eek:

PS: merci de m'indiquer comment je dois classer ce message en résolu


Désolé, j'étais resté avec l'idée que tu avais office 2010. Je me suis trompé avec un autre thread.

Bien heureux que ça fonctionne à ton goût.

Pour la mention Résolu. Retourne modifier ton premier post de ce thread (fil) et ajoute Résolu devant l'intitulé, tout simplement.


G
 
Dernière édition:

Gelinotte

XLDnaute Accro
Re : Macro envoi mail

Bonsoir.

Dans la macro de ton module7, au lieu d'enregister une copie, on fait référence à ces macros pour obtenir un pdf.

Puis, lors de l'attachement du fichier, on fait simplement référence au fichier.pdf que l'on vient de créer.

Code:
Sub EnvoiMail()
Dim A$, B$, C$, D$, Sep$
Dim LaDate As String

Application.DisplayAlerts = False
Sep = "; "
If Sheets("Feuil1").Range("C52") = "OUI" Then
    If Range("G46") <> "" Then A = A & Range("G46") '& Sep
    If Range("G47") <> "" Then B = B & Range("G47") '& Sep
    If Range("G48") <> "" Then C = C & Range("G48")  '& Sep
    If Range("B46") <> "" Then D = D & Range("B46")  '& Sep

    Application.DisplayAlerts = False
    repertoireAppli = ActiveWorkbook.Path & "\"
    
    Call PrintTest
    Dim olapp As Object 'Outlook.Application
    Set olapp = CreateObject("Outlook.Application")
    Dim msg As Object 'MailItem
    Set msg = olapp.CreateItem(olMailItem)
    With msg
        .To = A & ";" & B
        .CC = C & ";" & D
        .BCC = ""
        .Subject = "Test envoi classeur"
        .Body = Sheets("feuil1").Range("B1").Value & Chr(13) & Chr(13) & Sheets("feuil1").Range("B2").Value & Chr(13) & Chr(13)
        .Attachments.Add repertoireAppli & "Bon de commande prestation annexe.pdf"
'        .Display  'activer cette ligne afin que le message s'affiche avant de partir
        .ReadReceiptRequested = True
    End With
    msg.Send
    Set msg = Nothing
    Set olapp = Nothing
    On Error Resume Next
    Kill repertoireAppli & "Bon de commande prestation annexe.pdf"
Else
    MsgBox "Formulaire incomplet. Envoi annulé"
End If
End Sub

Sub PrintTest()
     Call PrintSheetInPDF(Worksheets("Feuil1"))
 End Sub '~PrintTest
 
Sub PrintSheetInPDF(shSheet As Worksheet)
     Dim pdfjob      As Object
     Dim sPDFName    As String
     Dim sPDFPath    As String
     
    '/// Changer le nom du fichier de sortie sur la ligne ci dessous: ///
     sPDFName = "Bon de commande prestation annexe.pdf"    '  ThisWorkbook.Name & "_" & shSheet.Name & ".pdf"
     sPDFPath = ThisWorkbook.Path
     'Check if worksheet is empty and exit if so
     
    shSheet.Select
     
    If IsEmpty(shSheet.UsedRange) Then Exit Sub
     
    ' ##############################
     ' Pas trés propre, mais je n'ai pas réussi à récupérer l'instance de la classe
     ' PDFCreator.clsPDFCreator avec la fonction GetObject
     ' Remarque : si la tache "PDFCreator.exe" n'existe pas, la fonction KillTask("PDFCreator.exe") ne fait rien
     Call KillTask("PDFCreator.exe")
     ' ##############################
  
     Set pdfjob = CreateObject("PDFCreator.clsPDFCreator")
 
    With pdfjob
         If .cStart("/NoProcessingAtStartup") = False Then
             MsgBox "Can't initialize PDFCreator.", vbCritical + vbOKOnly, "PrtPDFCreator"
             Exit Sub
         End If
         .cOption("UseAutosave") = 1
         .cOption("UseAutosaveDirectory") = 1
         .cOption("AutosaveDirectory") = sPDFPath
         .cOption("AutosaveFilename") = sPDFName
         .cOption("AutosaveFormat") = 0 ' 0 = PDF
         .cClearCache
     End With
     'Imprime le document en PDF
     ActiveSheet.PrintOut copies:=1, ActivePrinter:="PDFCreator"
     'Attend que le document soit entré dans la file d'impression
     Do Until pdfjob.cCountOfPrintjobs = 1
         DoEvents
     Loop
     pdfjob.cPrinterStop = False
     'Attend que l'impression du document soit terminée
     Do Until pdfjob.cCountOfPrintjobs = 0
         DoEvents
     Loop
 
    With pdfjob
         .cDefaultPrinter = DefaultPrinter
         .cClearCache
         Application.Wait (Now + TimeValue("0:00:3"))
         .cClose
     End With
     
    Set pdfjob = Nothing
 End Sub '~PrintSheetInPDF
 

Sub KillTask(sAppName As String)
     Dim oProcList   As Object
     Dim oWMI        As Object
     Dim oProc       As Object
     
    'Create WMI object instance:
     Set oWMI = GetObject("winmgmts:")
     If IsNull(oWMI) = False Then
         'Create object collection of Win32 processes:
         Set oProcList = oWMI.InstancesOf("win32_process")
         'Iterate through the enumerated collection:
         For Each oProc In oProcList
             If UCase(oProc.Name) = UCase(sAppName) Then
                 oProc.Terminate (0)
             End If
         Next oProc
     Else
         'Report Error
         MsgBox "Killing """ & sAppName & """ - Can't create WMI Object.", vbOKOnly + vbCritical, "CloseAPP_B"
     End If
     
    'Clear out the objects:
     Set oProcList = Nothing
     Set oWMI = Nothing
 End Sub '~KillTask

J'ai trouvé le code sur le forum et légèrement adapté pour le nom du fichier.
https://www.excel-downloads.com/threads/edition-pdf.112586/


Examine cela.

G
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 782
Messages
2 092 071
Membres
105 181
dernier inscrit
hugocap