Excel / VBA als pdf speichern?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Da ich nicht weiß, was Du im Detail vor hast folgender Vorschlag weil Du VBA dazu nicht brauchst (je nach Office Version, die ebenfalls unbekannt ist)

Markiere die beschriebenen Zellen als Druckbereich und speichere die Datei einfach als PDF Dokument ab.

Es muss über VBA laufen, da es über einen Button laufen soll.

Sprich die drückst einen erstellten Button, bekommst eine msgBox und durch bestätigen dieser wird eine pdf erstellt.

1
@RobinM66

versuch mal:

Sub save_pdf()
    Const DateiPfad = "c:\"
    Dim DateiName As String
   
    DateiName = DateiPfad & Range("A10") '& ".pdf"  ' Dateiname aus Zellinhalt
    
    ChDir DateiPfad
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        DateiName, Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
        False
End Sub

wenn die Datei nach dem Speichern geöffnet werden soll, setze "openAfterPublish:" auf "True"

1
@Esskah

Der obige Sourcecode druckt lediglich das aktuell ausgewählte Tabellenblatt aus...
Außerdem wird zur Dateibenennung, im Code, die Zelle A10, des aktuelle ausgewählten Tabellenblatts genommen und nicht, wie gewünscht, die Zelle A10 fix vom Tabellenblatt 1

Evtl. kannst du deinen Code ja nochmal fix überarbeiten und dem Fragesteller dann den

MFG xGlumi

1
@Esskah

Er gibt mir hier ein Laufzeitfehler 1004.

Zitat: das Dokument wurde nicht gespeichert. Das Dokument ist möglicherweise geöffnet, oder beim Speichern ist ein Fehler aufgetreten.

Dann kann ich es debuggen. Weiß jetzt nicht genau wo de Fehler ist.

1
@RobinM66

1.) Du musst natürlich die Ursprungsdatei erstmal als *.xlsm Datei speichern nachdem Du den Code eingetragen hast!

2.) unter "Const DateiPfad = "c:\" legst Du den Speicherpfad als Konstante fest, achte aber bitte darauf, dass der Pfad mit einem Backslash endet!

3.) teste diesen Code, der wählt Dir die Tabellenblätter 1 und 3 aus. Sollten sie anders benannt sein, ändere bitte die Namen im Code ab

Sub save_pdf()
    Const DateiPfad = "C:\"
    Dim DateiNameA As String
       
    DateiNameA = DateiPfad & Range("A10") & ".pdf"  ' Dateiname aus Zellinhalt

    Sheets(Array("Tabelle1", "Tabelle3")).Select
    ChDir DateiPfad
    Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        DateiName, Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
        False
       
End Sub
1
@Esskah

Die Speicherung klappt, schon einmal vielen Dank dafür. Leider ist der Dateiname der PDF genau so wie die Ursprungsdatei. Der Zelleninhalt aus der Tabelle 1 Zelle G10 (hatte es geändert weil du A10 genutzt hast) wird nicht aus Dateiname verwendet.

Zudem mal eine dumme Frage. Werden Werte aus Formeln (sverweise oder wennFunktionen) nicht angezeigt? Komischerweise wird die PDF vom Inhalt nur teilweise wiedergegeben.

Es wird lediglich Kopf- und Fußzeile sowie Wasserzeichen in der PDF wiedergegeben. Alles andere nicht.

1
@RobinM66

Das Problem ist, dass mit dem oberen Code nicht alle Zellen jedes einzelnen Tabellenblattes markiert werden, sondern:

Wenn du auf dem aktuellen Tabellenblatt z.B. "Range A1 bis C10" markiert hattest, und dann das Makro von Esskah ausführst, dann bekommst du von allen Tabellenblättern die Range A1 bis C10 ausgedruckt. (So verhält es sich mit jeder Range, die du vorher selbst manuell ausgewählt hast)

Das Problem, dass der Dateiname nicht korrekt übernommen wird liegt daran, dass im Code "DateiNameA" steht, editier das einfach zu "DateiName"

MFG xGlumi

1
@xGlumi

korrekt, habe vor lauter Test nebenbei nicht genau darauf geachtet

Sub save_pdf()

Const DateiPfad = "C:\" ' Dateipfad als Konstante setzen
Dim DateiName As String ' Dateiname als Variable setzen
DateiName = DateiPfad & Sheets("Tabelle1").Range("G10") & ".pdf" ' Dateiname aus Zellinhalt
Sheets(Array("Tabelle1", "Tabelle3")).Select ' wählt zwei Tabellenblätter aus
ChDir _
        DateiPfad
    
Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
  DateiName & ".pdf", Quality:=xlQualityStandard, _
  IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
  True

Sheets("Tabelle1").Select
Range("A1").Select
    
End Sub

Gedruckt wird nur der ausgewählte Bereich und der Zusatz vor "End Sub" stellt sicher, dass die verbundenen Tabellenblätter wieder getrennt und die Zelle A1 auf Tabellenblatt1 ausgewählt wird

2
@xGlumi

Supi, vielen dank. Die Änderung des Dateinamen funktioniert auch einwandfrei.

Kann man es denn schon direkt in VBA schreiben, dass bei Tabelle 1 und Tabelle 3 von A1:G48 gedruckt werden soll? Finde es etwas blöde erst den Druckbereich manuell auswählen zu müssen.

Gruß

1
@RobinM66

klar, einfach ein "Range ("A1:G48") davor setzen. Das könnte man auch noch als Variable definieren

Sub save_pdf()

Const DateiPfad = "C:\" ' Dateipfad als Konstante setzen
Dim DateiName As String ' Dateiname als Variable setzen
DateiName = DateiPfad & Sheets("Tabelle1").Range("G10") & ".pdf" ' Dateiname aus Zellinhalt
Sheets(Array("Tabelle1", "Tabelle3")).Select ' wählt zwei Tabellenblätter aus
ChDir _
        DateiPfad

Range("A1:G48").Select    
Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
  DateiName & ".pdf", Quality:=xlQualityStandard, _
  IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
  True

Sheets("Tabelle1").Select
Range("A1").Select
    
End Sub
1
@Esskah

Ich hatte deine Nachricht zuspät gesehen und selbst geändert. Super, vielen dank euch beiden! Es funktioniert :)

Wünsche euch noch einen schönen Tag :)

1

Hallo Robin,

mit dem folgenden Marko lässt sich das bewerkstelligen.

  • Den Code als Modul einfügen
  • Schaltfläche einfügen und über das Kontextmenü das Makro zuweisen
Sub Save_as_PDF()
pdfName = Range("Tabelle1!G10")

Sheets(Array("Tabelle1", "Tabelle3")).Copy

With ActiveWorkbook
   .ExportAsFixedFormat Type:=xlTypePDF, FileName:=pdfName, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=True
   .Close savechanges:=False
End With

End Sub

Was möchtest Du wissen?