2017-05-14 2 views
0

So fand ich ein Makro Exportieren eines Excel-Blatt zu pdf, das Senden dieser PDF an eine E-Mail-Adresse mit Outlook, dann Schließen Outlook (wenn durch das Makro geöffnet) und Löschen der PDF-Datei.nicht verschließbare Fenster beim Senden von Excel pdf zu mail

fand ich den Code, den ich unter rechten here

eingeschlossen
Dim IsCreated As Boolean 
    Dim i As Long 
    Dim PdfFile As String, Title As String 
    Dim OutlApp As Object 

    ' Not sure for what the Title is 
    Title = "DUTY" 

    ' Define PDF filename 
    PdfFile = ActiveWorkbook.FullName 
    i = InStrRev(PdfFile, ".") 
    If i > 1 Then PdfFile = Left(PdfFile, i - 1) 
    PdfFile = PdfFile & ".pdf" 

    ' Export activesheet as PDF 
    With ActiveSheet 
    .ExportAsFixedFormat Type:=xlTypePDF, Filename:=PdfFile, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False 
    End With 

    ' Use already open Outlook if possible 
    On Error Resume Next 
    Set OutlApp = GetObject(, "Outlook.Application") 
    If Err Then 
    Set OutlApp = CreateObject("Outlook.Application") 
    IsCreated = True 
    End If 
    OutlApp.Visible = True 
    On Error GoTo 0 

    ' Prepare e-mail with PDF attachment 
    With OutlApp.CreateItem(0) 

    ' Prepare e-mail 
    .Subject = Title 
    .To = "[email protected]" ' <-- Put email of the recipient here 
    .Body = "Zie bijlage voor de duty report" 
    .Attachments.Add PdfFile 

    ' Try to send 
    On Error Resume Next 
    .Send 
    Application.Visible = True 
    If Err Then 
     MsgBox "E-mail was not sent", vbExclamation 
    Else 
     MsgBox "E-mail successfully sent", vbInformation 
    End If 
    On Error GoTo 0 

    End With 

    ' Delete PDF file 
    Kill PdfFile 

    ' Quit Outlook if it was created by this code 
    If IsCreated Then OutlApp.Quit 

    ' Release the memory of object variable 
    Set OutlApp = Nothing 

Es funktioniert wie ein Charme, außer der Tatsache, dass, wenn Sie fertig sind zwei Excel-Fenster geöffnet (nicht Blätter, nur die Anwendung ohne Blätter öffnen Sie es), dass ich nicht zu schließen scheinen kann.

habe ich versucht, es zu reparieren, indem

Zugabe
ActiveWorkbook.Close True 

Application.Quit 

... am Ende des Codes, aber das scheint nicht den Trick zu tun. Hat jemand Erfahrung damit und hoffentlich wissen, wie man das beheben kann?

Antwort

0

Ich habe Ihren Code getestet und keinen Fehler gefunden. Ich habe jedoch keine Notwendigkeit für Ihre verschiedenen Anrufe gefunden, um Anwendungen sichtbar zu machen. Deshalb habe ich sie weggelassen. Vielleicht waren sie der Grund für deine Erfahrung. Unten ist der Code, den ich getestet habe.

Sub SendPDF() 

    Dim OutApp As Object 
    Dim IsCreated As Boolean 
    Dim PdfFile As String, Fn() As String 
    Dim Title As String 

' ' Define PDF filename 
    Fn = Split(ActiveWorkbook.FullName, ".") 
    Fn(UBound(Fn)) = "pdf" 
    PdfFile = Join(Fn, ".") 

    ' this code will not work if the file name includes a period:- 
' PdfFile = ActiveWorkbook.FullName 
' i = InStrRev(PdfFile, ".") 
' If i > 1 Then PdfFile = Left(PdfFile, i - 1) 
' PdfFile = PdfFile & ".pdf" 

    ' Export activesheet as PDF 
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _ 
            Filename:=PdfFile, _ 
            Quality:=xlQualityStandard, _ 
            IncludeDocProperties:=True, _ 
            IgnorePrintAreas:=False, _ 
            OpenAfterPublish:=False 

    ' Use already open Outlook if possible 
    On Error Resume Next 
    Set OutApp = GetObject(, "Outlook.Application") 
    If Err Then 
     Set OutApp = CreateObject("Outlook.Application") 
     IsCreated = True 
    End If 
' OutApp.Visible = True    ' you don't need this to be visible 
             ' unless you want to edit before sending 
    On Error GoTo 0 

    ' This is the tile of the email 
    Title = "Duty report " & Date 

    ' Prepare e-mail with PDF attachment 
    With OutApp.CreateItem(0) 
     .Subject = Title 
     .To = "[email protected]" ' <-- Put email of the recipient here 
     .Body = "Zie bijlage voor de duty report" 
     .Attachments.Add PdfFile 

     On Error Resume Next 
     .Send       ' try to send 

    ' Application.Visible = True  ' appears not required 

     If Err Then 
      Title = "An error occurred." & vbCr & _ 
        "The email wasn't sent." 
     Else 
      Title = "The mail was prepared successfuly." & vbCr & _ 
        "It is now in your outbox." 
     End If 
     MsgBox Title, vbInformation, "Execution report" 
    End With 
    On Error GoTo 0 

    ' Delete PDF file 
    Kill PdfFile 

    ' Quit Outlook if it was created by this code 
    If IsCreated Then OutApp.Quit 

    ' Release the memory of OutApp object variable 
    Set OutApp = Nothing 
End Sub 

Sie werden feststellen, dass ich ein paar Änderungen vorgenommen, darunter das Datum zu dem Thema Hinzufügen („Title“), die in der Art eines Vorschlages ist, da Sie nicht wissen, was es war für. Bitte lesen Sie die Kommentare, die ich zum Code hinzugefügt habe.

Zu meiner eigenen Überraschung konnte ich Ihre Methode zum Öffnen von Outlook nicht funktionieren. Mein Code ist jedes Mal fehlgeschlagen, wenn ich Outlook noch nicht geöffnet hatte. Ich habe mich auf Ron de Bruin bezogen und keinen Fehler mit Ihrem Code gefunden. Am Ende habe ich es so wie es ist verlassen. Wenn Outlook nicht ausgeführt wurde, konnte das Objekt OutApp in meinen Tests nicht festgelegt werden und führte zu der Benachrichtigung "Outlook versucht, Ihre Informationen wiederherzustellen", gefolgt von Fehler der nächsten Referenz auf OutApp. Wenn diese Funktionalität für Sie wichtig ist, könnte es eine separate Frage wert sein. Andernfalls schlage ich vor, den Code so zu ändern, dass er eine Nachricht ausgibt, wenn Outlook nicht ausgeführt wird, anstatt zu versuchen, das Objekt zu erstellen. FYI, ich habe mit Excel 2010 getestet.

+0

Ich habe versucht, Sie Code, und jetzt bekomme ich nicht die unverschließbaren Fenster. Ich habe deine Kommentare gelesen und diese Zeilen gelöscht. Es ist eigentlich nicht notwendig, Outlook zu öffnen, da es hier permanent geöffnet ist. Vielen Dank! –