PDA

Vollständige Version anzeigen : PDF aus Excel direkt versenden


alexhe
30.08.2017, 10:34
Hallo zusammen,

ich verzweifle gerade an einem VBA-Code.

Ich möchte aus einem bestimmten Tabellenblatt ein PDF erstellen und dieses dann direkt per Mail versenden, hinterher soll dieses PDF wieder gelöscht werden.
Dazu erstelle ich mir in dem unten eingebetteten Code eine Excel-Hilfsdatei, bei der ich erst einmal das nicht benötigte Tabellenblatt lösche.
Daraufhin exportiere ich mir aus dieser Datei ein PDF.
Auch diese Excel-Hilfsdatei soll am Ende wieder gelöscht werden.

Die Schwierigkeit hierbei ist jetzt für mich, dass ich den Druckbereich auf eine Tabelle, die je nach Anwendungsfall in der Zeilenanzahl variabel ist, begrenzen will. (Tabellenbereich B1:K"XY")

Dieser Druckbereich soll dann auf einer einzelnen Seite im PDF-Dokument angezeigt werden.

Und on-top wäre es noch super, wenn mein PDF so heißen würde, wie die vorher erstellte Excel-Hilfsdatei.

Note: VBA-Neuling! Ich weiß, das geht mit Sicherheit um einiges eleganter, aber das sind so meine ersten eigenen Schritte... :redface:

Sub Mail_Abteilungsbriefkasten()

'** Dimensionierung der Variablen
Dim strPDF As String, strXL As String
Dim OutlookApp As Object, strEmail As Object

'** Excel Hilfsdatei zum Tabellenblatt loeschen

strXL = ThisWorkbook.Path & "" & ActiveSheet.Name & ".xlsm"

Call ThisWorkbook.SaveCopyAs(Filename:=strXL)

Call Maildatei_nurTTNR

'** Vorgaben definieren
Set OutlookApp = CreateObject("Outlook.Application")
Set strEmail = OutlookApp.CreateItem(0)

'** PDF erzeugen
ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
ThisWorkbook.Path & "Excel-File.pdf", Quality:=xlQualityStandard _
, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish _
:=False

'** E-Mail versenden
strPDF = ThisWorkbook.Path & "Excel-File.pdf"
With strEmail


.To = "empfaenger@domain.de"

.Subject = "Gewichtsdifferenz WAH - Packrechner anpassen"
.Body = "Als Anlage die PDF-Datei"
.Attachments.Add strPDF
.Send
Kill strPDF
Workbooks(strXL).Close
Kill strXL

End With

'** Objektvariablen wieder löschen
Set OutlookApp = Nothing
Set strEmail = Nothing
End Sub

Heidjer
30.08.2017, 12:12
Die Schwierigkeit hierbei ist jetzt für mich, dass ich den Druckbereich auf eine Tabelle, die je nach Anwendungsfall in der Zeilenanzahl variabel ist, begrenzen will. (Tabellenbereich B1:K"XY")

Dieser Druckbereich soll dann auf einer einzelnen Seite im PDF-Dokument angezeigt werden.

Und on-top wäre es noch super, wenn mein PDF so heißen würde, wie die vorher erstellte Excel-Hilfsdatei.


Das könnte wie folgt funktionierten (Abänderung deines "PDF-Erzeugen"-Codes):



With ActiveSheet.PageSetup
.PrintArea = "B1:K" & i
.Zoom = False
.Orientation = xlPortrait
.FitToPagesWide = 1
.FitToPagesTall = 1
End With

ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
Left(ThisWorkbook.name, Len(ThisWorkbook.name) - 5), Quality:=xlQualityStandard _
, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish _
:=False


Annahmen, die bei Erstellung des Codes getroffen wurden:
- Die Dateiendung besteht aus insgesamt fünf Zeichen inklusive des Punktes (bspw. ".xlsm").
- Deine "variable Zeilenanzahl" ist in der Variable "i" gespeichert.


Für detailliertere Hilfe wäre eine Beispieldatei hilfreich, aber vielleicht reicht dir das ja schon.

alexhe
30.08.2017, 12:42
Danke, das sieht schon mal ganz gut aus soweit.

Ich bräuchte nur noch eine Info, wie ich für i die variable Zeilenanzahl definiere...

Ich würde mir da jetzt helfen mit folgendem Code-Anfang:

Worksheets("Gewichtsaufnahme Drittländer").Range("B65536").End(xlUp).Rows.Activate

Danach weiß ich allerdings nicht weiter. So springt er ja in die letzte Zeile. Von da aus dann nach oben markieren? :confused:

Heidjer
30.08.2017, 12:49
With ActiveSheet.PageSetup
.PrintArea = "B1:K" & Worksheets("Gewichtsaufnahme Drittländer").Range("B65536").End(xlUp).Row
.Zoom = False
.Orientation = xlPortrait
.FitToPagesWide = 1
.FitToPagesTall = 1
End With

ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
Left(ThisWorkbook.name, Len(ThisWorkbook.name) - 5), Quality:=xlQualityStandard _
, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish _
:=False

alexhe
30.08.2017, 13:24
Perfekt! Vielen lieben Dank! :top:

hobelschieber
22.12.2017, 09:35
Moin,
zu dem o.g. Thema gibt es im Internet sowie auch in diesem Forum viele Diskusionen bzw. auch VB Codes.
Leider finde ich aber nicht die richtige variante für meine Bedürfnisse.

Ich absoluter Neuling im Thema Makros und möchte wie im Titel beschrieben eine Button erstellen der per Click eine PDF erzeugt (PDF Creator) von Tabellenblatt 1 was dann automatisch per Email an eine (im Code integrierte) Adresse gesendet wird. Das Sendefenster muss aber noch einmal auftauchen um einen Betreff zu definieren. Zu guter letzt darf das ganze nicht im Outlook starten sonder in TobitDavid Emailprogramm.

Dieser Code zum Emailsenden der Excelmappe funktioniert sehr gut mit unserem Emailprogramm:

Private Sub CommandButton1_Click()
Application.Dialogs(xlDialog********).Show _
"xxx@gmx.de", ""
End Sub

wie kann kann ich die PDF Erzeugung jetzt noch daran hängen?
Vielen Dank.