Excel Tabelle als Pdf per Email senden mit beliebigen Email-Programm

  • Excel

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Excel Tabelle als Pdf per Email senden mit beliebigen Email-Programm

    Hallo zusammen,
    ich komme bei folgendem Problem nicht weiter und würde mich freuen, wenn mir da jemand weiter helfen könnte.
    Ich möchte einen Button erstellen, mit dem ich eine bestimmten Bereich von einem Arbeitsblatt als Pdf per Email über das Standard-Emailprogramm senden kann. Dabei sollte, wenn möglich ein fester Emailempfänger vorgegeben werden. Ein Betreff und Text ist nicht ganz so wichtig, wäre aber gut wenn es geht.
    Ich habe mir folgendes zusammen gebastelt, bei dem der Versand aber nur über Outlook geht. Das würde ich gerne ändern. Vielen Dank im Voraus.

    Visual Basic-Quellcode

    1. Private Sub PdfPerMail_Click()
    2. Range("a1:z44").Select
    3. strFileName = "C:\Temp\Testdatei.pdf"
    4. ActiveSheet.ExportAsFixedFormat _
    5. Type:=xlTypePDF, _
    6. Filename:=strFileName, _
    7. Quality:=xlQualityStandard, _
    8. IncludeDocProperties:=True, _
    9. IgnorePrintAreas:=False, _
    10. OpenAfterPublish:=False
    11. Dim Nachricht As Object, OutApp As Object
    12. Dim AWS As String
    13. Set OutApp = CreateObject("Outlook.Application")
    14. AWS = strFileName
    15. 'InitializeOutlook = True
    16. Set Nachricht = OutApp.CreateItem(0)
    17. With Nachricht
    18. .To = "aaa@aa.de"
    19. 'Empfänger
    20. .Bcc = "bbb@bb.de"
    21. 'Blindempfänger
    22. .Subject = "Test " & "- " & Range("C6") & " - " & Range("V6")
    23. 'Betreff, Name, Datum
    24. .Attachments.Add AWS
    25. .HTMLBody = "Hallo ..., " & "<p>" & "Im Dateianhang findest Du meine ..." & "<p>" & "Danke und viele Grüße " & "<p>" & Range("C6")
    26. 'Hier wird die HTML Mail erstellt
    27. .Display
    28. 'Hier wird die Mail nochmals angezeigt
    29. End With
    30. Set OutApp = Nothing
    31. Set Nachricht = Nothing
    32. Kill strFileName
    33. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „yatomaha“ ()

    yatomaha schrieb:

    ...bei dem der Versand aber nur über Outlook geht. Das würde ich gerne ändern.
    1) Über SMTP Dafür benötigst du aber einen offenen SMTP-Server oder du musst die Zugangsdaten im Programm hinterlegen (oder eingeben lassen).
    2) "mailto:" aufrufen per Process.Start. Dann nimmt er denn Standard-Mailclient des Benutzers.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    2) "mailto:" aufrufen per Process.Start. Dann nimmt er denn Standard-Mailclient des Benutzers.

    Das hatte ich gesucht, nur bekomme ich es leider nicht eingebunden in meinen Quellcode. Könntest Du mir bitte noch schreiben, wie der geänderte Quellcode dann aussehen muss?
    Vielen Dank schon mal für den bisherigen Tipp.

    Visual Basic-Quellcode

    1. Dim Prc as New System.Diagnostics.Process
    2. Prc.Start ("mailto:a@bc.de?subject=Hallo&body=see attachment&attachment=C:\Temp\Att.txt")
    Unschönheit an dem Verfahren:
    Die Parameter werden vom Standard-Mail-Client ausgewertet.
    'subject' und 'body' sind Standard, aber nicht alle Clients werden den Parameter 'attachment' aus.
    Ein berühmtes Beispiel: Outlook ab 2007 unterstützt 'attachment' nicht mehr.
    Außerdem muss der Send-Klick immer manuell vom Benutzer abgefeuert werden, weil mailto die Mail nur vorbereitet, aber nicht abschickt.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @yatomaha

    Mach es über PHP...
    Da haste viel mehr Möglichkeiten als mit Outlook...
    Zudem finde ich das persönlich übersichtlicher, als im Parameter von Start der Process-Klasse so viel aneinander zu kleben.

    PHP-Quellcode

    1. <?php
    2. $empfaenger = $_GET["empfang"];
    3. $betreff = $_GET["subject"];
    4. $nachricht = $_GET["text"];
    5. mail($empfaenger, $betreff, $nachricht);
    6. ?>


    Zum Beispiel über URL, indem du daraus eine index.php machst. Geht also mit localhost in der Adresszeile deines Browsers...
    Nur musst du hier halt die PDF-Datei anhängen...
    Dazu kannst du den Teil vom Codeschnippsel hier füt den Dateiupload hernehmen:
    php-einfach.de/codeschnipsel_1114.php
    Zum Erstellen der PHP-Datei kannst du Notepad++ nehmen.

    Einfach per Code einen neuen Prozess starten lassen mit Argument localhost/index.php im Parameter...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „programmer71“ () aus folgendem Grund: Rechtschreibfehler und zusätzliche Information

    xtts02 schrieb:

    dass die ganze Aktion aus Excel ausgelöst werden soll
    habe ich auch übersehen.
    In dem Fall muss der mailto-Code natürlich über Shell gestartet werden:

    Visual Basic-Quellcode

    1. Shell "mailto:a@bc.de?subject=Hallo&body=see attachment&attachment=C:\Temp\Att.txt"
    Die oben genannten Einschränkungen gelten natürlich trotzdem.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Nochmals vielen Dank für die bisherige Hilfe, aber irgendwas mache ich noch falsch...

    Visual Basic-Quellcode

    1. Private Sub PdfPerMail_Click()
    2. Range("a1:z44").Select
    3. strFileName = "C:\Temp\Abrechnung.pdf"
    4. ActiveSheet.ExportAsFixedFormat _
    5. Type:=xlTypePDF, _
    6. Filename:=strFileName, _
    7. Quality:=xlQualityStandard, _
    8. IncludeDocProperties:=True, _
    9. IgnorePrintAreas:=False, _
    10. OpenAfterPublish:=False
    11. Shell ("mailto:a@bc.de?subject=Hallo&body=see attachment&attachment=C:\Temp\Abrechnung.pdf")
    12. Kill strFileName
    13. End Sub

    yatomaha schrieb:

    irgendwas mache ich noch falsch
    Stimmt. Zum Beispiel Copy&Paste. ;)

    Eine minimal exaktere Fehlermeldung wäre möglicherweise hilfreich, um dem Problem etwas näher zu kommen.
    Geht das Mailprogramm auf? Gibt es Syntaxfehler? Verschickt er die Mail, aber ohne Attachment? ????

    P.S.: Wenn du die Datei killst, solltest du wenigstens warten, bis die Mail abgeschickt ist.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    yatomaha schrieb:

    Datei nicht gefunden
    Falls dein Dateipfad Leerzeichen beinhaltet, solltest du ihn in Anführungzeichen setzen.

    erscheint direkt nach dem Anklicken des Buttons
    Debuggen sollte man mit Breakpoint und/oder im Single-Step-Modus und nicht einfach nur durch Button-Click.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --