HERBERS Excel-Forum - das Archiv

Thema: VBA: Blatt als pdf per Mail. Blatt mit anderen pdfs vereinen

VBA: Blatt als pdf per Mail. Blatt mit anderen pdfs vereinen
Jörg Bergmann
Hallo! Ich habe mir mit Chatgpt ein Makro erstellen lassen, welches ein Blatt speichert und dann in eine Mail packt. Nun wollte ich, dass der erstellen pdf noch Anhänge als Seiten beigefügt werden und bekomme immer eine Fehlermeldung: "Fehler beim Ausführen des Ghostscript Befehls, Ungültiger Prozeduraufruf oder ungültiges Argument"

Den Pfad habe ich korrekt angegeben: W:\Anhang WB\

Sub SUK_Rechnung_Speichern_Und_Versenden()

On Error GoTo ErrorHandler ' Fehlerbehandlung aktivieren

Dim ws As Worksheet
Dim savePath As String
Dim fileName As String
Dim outlookApp As Object
Dim outlookMail As Object
Dim emailRecipient As String
Dim emailSubject As String
Dim emailBody As String
Dim subjectCell As Range ' Variable für Betreffzeile
Dim attachmentPath As String ' Pfad zu den Anhängen
Dim command As String ' Befehlszeile für Ghostscript

' Arbeitsblatt mit den Daten
Set ws = ThisWorkbook.Sheets("SUK Rechnung")

' Pfad zum Speichern des PDFs
savePath = "W:\"

' Dateiname aus Zelle K11 auslesen
fileName = ws.Range("K11").Value

' PDF speichern
ws.ExportAsFixedFormat Type:=xlTypePDF, fileName:=savePath & "\" & fileName & ".pdf", Quality:=xlQualityStandard

' Betreffzeile auslesen
Set subjectCell = ws.Range("K12") ' Annahme: Betreff ist in Zelle K12
emailSubject = subjectCell.Value ' Wert der Betreffzeile zuweisen

' Outlook-Instanz erstellen
Set outlookApp = CreateObject("Outlook.Application")
Set outlookMail = outlookApp.CreateItem(0)

' Empfänger der E-Mail
emailRecipient = "michael.dedes@sanha.com"

' Text der E-Mail
emailBody = "Hallo Michael," & vbCrLf & _
vbCrLf & _
"anbei die Rechnungen." & vbCrLf & _
vbCrLf & _
"Viele Grüße," & vbCrLf & _
"Heike" & vbCrLf & _
"Accountant" & vbCrLf & _
"T +49 2054 925132" & vbCrLf & _
vbCrLf & _
"mailto:heike.ausderfuenten@sanha.com"

' Pfad zu den Anhängen
attachmentPath = "D:\Pfad\Zu\Deinem\Anhang\Ordner\"

' Befehlszeile für Ghostscript
command = "cmd /c gswin64c -q -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=""" & savePath & "\" & fileName & "_with_attachments.pdf"" """ & savePath & "\" & fileName & ".pdf"" "

' Alle PDF-Dateien im Anhangordner durchlaufen und zur Befehlszeile hinzufügen
Dim attachmentFileName As String
attachmentFileName = Dir(attachmentPath & "*.pdf") ' Alle PDF-Dateien im Ordner abrufen
Do While attachmentFileName <> "" ' Solange es Dateien gibt
command = command & """" & attachmentPath & attachmentFileName & """ "
attachmentFileName = Dir ' Nächste Datei abrufen
Loop

' Ghostscript-Befehl ausführen, um PDFs zu kombinieren
Shell command, vbHide

' E-Mail zusammenstellen
With outlookMail
.To = emailRecipient
.Subject = emailSubject
.Body = emailBody

' Anhang hinzufügen (die kombinierte PDF-Datei)
.Attachments.Add savePath & "\" & fileName & "_with_attachments.pdf"

.Display ' E-Mail anzeigen
End With

Exit Sub ' Bei erfolgreicher Ausführung den Fehlerhandler überspringen

ErrorHandler: ' Fehlerbehandlungsroutine
MsgBox "Fehler beim Ausführen des Ghostscript-Befehls: " & Err.Description, vbCritical
Exit Sub
End Sub
AW: VBA: Blatt als pdf per Mail. Blatt mit anderen pdfs vereinen
volti
Hallo Jörg,

ein ungetestete Beispiel....

Ich habe kein gswin64. Ist es bei Dir vorhanden?

Sub Teilcode()

' Befehlszeile für Ghostscript
sCommand = "cmd /c gswin64c -q -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=" _
& Chr$(34) & savePath & "\" & filename & "_with_attachments.pdf" & Chr$(34) _
& " " & Chr$(34) & savePath & "\" & filename & ".pdf" & Chr$(34)

' Alle PDF-Dateien im Anhangordner durchlaufen und zur Befehlszeile hinzufügen
attachmentFileName = Dir(attachmentPath & "*.pdf") ' Alle PDF-Dateien im Ordner abrufen
Do While attachmentFileName <> "" ' Solange es Dateien gibt
sCommand = sCommand & " " & Chr$(34) & attachmentPath & attachmentFileName & Chr$(34)
attachmentFileName = Dir ' Nächste Datei abrufen
Loop

' Ghostscript-Befehl ausführen, um PDFs zu kombinieren
Shell sCommand, vbHide
End Sub



PS: Ich würde Command nicht als Variable verwenden, das ist ein reserviertes Wort. Nimm sCommand anstatt.
Gruß
Karl-Heinz
AW: VBA: Blatt als pdf per Mail. Blatt mit anderen pdfs vereinen
Jörg Bergmann
Hallo Karl-Heinz,

danke, aber läuft auf den selben Fehler. gswin64 habe ich auch nicht. Dann ist das das Problem?!

Sub SUK_Rechnung_Speichern_Und_Versenden()

On Error GoTo ErrorHandler ' Fehlerbehandlung aktivieren

Dim ws As Worksheet
Dim savePath As String
Dim fileName As String
Dim outlookApp As Object
Dim outlookMail As Object
Dim emailRecipient As String
Dim emailSubject As String
Dim emailBody As String
Dim subjectCell As Range ' Variable für Betreffzeile
Dim attachmentPath As String ' Pfad zu den Anhängen
Dim command As String ' Befehlszeile für Ghostscript

' Arbeitsblatt mit den Daten
Set ws = ThisWorkbook.Sheets("SUK Rechnung")

' Pfad zum Speichern des PDFs
savePath = "W:\"

' Dateiname aus Zelle K11 auslesen
fileName = ws.Range("K11").Value

' PDF speichern
ws.ExportAsFixedFormat Type:=xlTypePDF, fileName:=savePath & "\" & fileName & ".pdf", Quality:=xlQualityStandard

' Betreffzeile auslesen
Set subjectCell = ws.Range("K12") ' Annahme: Betreff ist in Zelle K12
emailSubject = subjectCell.Value ' Wert der Betreffzeile zuweisen

' Outlook-Instanz erstellen
Set outlookApp = CreateObject("Outlook.Application")
Set outlookMail = outlookApp.CreateItem(0)

' Empfänger der E-Mail
emailRecipient = "michael.dedes@sanha.com"

' Text der E-Mail
emailBody = "Hallo Michael," & vbCrLf & _
vbCrLf & _
"anbei die Rechnungen." & vbCrLf & _
vbCrLf & _
"Viele Grüße," & vbCrLf & _
"Heike" & vbCrLf & _
"Accountant" & vbCrLf & _
"T +49 2054 925132" & vbCrLf & _
vbCrLf & _
"mailto:heike.ausderfuenten@sanha.com"

' Pfad zu den Anhängen
attachmentPath = "W:\Anhang WB\"

' Befehlszeile für Ghostscript
sCommand = "cmd /c gswin64c -q -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=" _
& Chr$(34) & savePath & "\" & fileName & "_with_attachments.pdf" & Chr$(34) _
& " " & Chr$(34) & savePath & "\" & fileName & ".pdf" & Chr$(34)

' Alle PDF-Dateien im Anhangordner durchlaufen und zur Befehlszeile hinzufügen
attachmentFileName = Dir(attachmentPath & "*.pdf") ' Alle PDF-Dateien im Ordner abrufen
Do While attachmentFileName <> "" ' Solange es Dateien gibt
sCommand = sCommand & " " & Chr$(34) & attachmentPath & attachmentFileName & Chr$(34)
attachmentFileName = Dir ' Nächste Datei abrufen
Loop

' Ghostscript-Befehl ausführen, um PDFs zu kombinieren
Shell sCommand, vbHide

' E-Mail zusammenstellen
With outlookMail
.To = emailRecipient
.Subject = emailSubject
.Body = emailBody

' Anhang hinzufügen (die kombinierte PDF-Datei)
.Attachments.Add savePath & "\" & fileName & "_with_attachments.pdf"

.Display ' E-Mail anzeigen
End With

Exit Sub ' Bei erfolgreicher Ausführung den Fehlerhandler überspringen
AW: VBA: Blatt als pdf per Mail. Blatt mit anderen pdfs vereinen
volti
Hallo,

cmd (command) ruft mittels des angegebenen Codes aus der DOS-Ebene ein Programm auf. Hier also gswin64c.exe.
Das muss natürlich auf dem Rechner vorhanden und beim Betriebssystem angemeldet sein, um wie hier ohne Pfadangabe gefunden zu werden.

Hier ist was zum Lesen (habe ich aber auch noch nicht gelesen).
https://ghostscript.com/docs/9.54.0/Use.htm

Gruß
KH
AW: VBA: Blatt als pdf per Mail. Blatt mit anderen pdfs vereinen
Jörg Bergmann
Dann ist das schon mal gelöst, danke! ;)

Für den Rest fehlt mir leider absolut das Wissen. Ich versuche lediglich die Makros etwas zu verstehen, um Anpassungen vornehmen zu können. Aber generell habe ich das nie gelernt. Die Motivation steigt, aber bis dato nutze ich nur ChatGPT und dieses tolle Forum. ;)

VG
Jörg