Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Excelsheet in PDF speichern

Excelsheet in PDF speichern
16.10.2016 21:28:07
Jens
Hallo Leute,
nach gefühlten 1000 gelesenen google-Lösungen möchte ich nun hier doch mal nachfragen.
Ich möchte doch weiter nichts wie ein Tabellenblatt in ein PDF abspeichern
Aber zu meinen Bedingungen, die da wären:
- Der Name soll sich aus dem Datum von Zelle "K12" im Format YYYYMMDD ergeben
> hierzu muss also das Datumsformat dd.mm.yyy aus "K12" umgewandelt werden.
- Die Ordnerstruktur ist Jahr\(Janur, Februar, ...,Dezember)
(diese könnte ja zu Jahresbeginn angelegt werden - ist wohl das einfachste)
> Nun muss das Datum aus "K12" mit der Ordnerstruktur geprüft werden
um das Dokument auch im richtigen Jahr und Monat abzulegen.
Bisher hatte ich den Druckbereich in Excel festgelegt
(sonst werden mehrere unbrauchbare Blätter gedruckt!)
Muss das so sein oder kann ich den Bereich Range("A6:AX60")
auch im Code festlegen und dafür sind die Exceleinstellungen schnuppe
Danke für Eure Hilfe
Bisher benutzt:

'   IncludeDocProperties = True  >> Dokumenteigenschaften werden eingeschlossen
'   IgnorePrintAreas = False     >> festgelegte Druckbereiche werden übernommen
'   OpenAfterPublish = True      >> Dokument wird nach dem speichern nochmal angezeigt
Private Sub CmdPDF_Click()  ' Dateiname ist Datum aus "K12"
'   MsgBox ist eine optionale Komponente
'   Rückfragen, ob Datei nach dem Erstellen geöffnet werden soll
If MsgBox("Soll die PDF-Datei nach dem Erstellen angezeigt werden?" _
, vbYesNo, "PDF anzeigen? _
_
_
") _
= vbYes Then pdfOpenAfterPublish = True
'   Vorgaben zum speichern des Dokuments
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
("C:\Testdatei\Monat") _
& "\" & Range("K12").Value & ".pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=IIf(pdfOpenAfterPublish, True, False)     '(in Kombination mit MsgBox)
'   OpenAfterPublish = True  (wenn keine MsgBox gewünscht ist)
End Sub

als Beispielmappe
https://www.herber.de/bbs/user/108816.xlsm
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Excelsheet in PDF speichern
16.10.2016 22:30:50
fcs
Hallo Jens,
mit den folgenden Ergänzungen/Anpassungen
Wird ein PDF des Zellbereiches erstellt. Fehlende Unterverzeichnisse für Jahr und/oder Monat werden automatisch angelegt.
Gruß
Franz
Private Sub CmdPDF_Click()  ' Dateiname ist Datum aus "K12"
Dim pdfOpenAfterPublish As Boolean
Dim strFile As String
Dim strPfad As String
'   MsgBox ist eine optionale Komponente
'   Rückfragen, ob Datei nach dem Erstellen geöffnet werden soll
If MsgBox("Soll die PDF-Datei nach dem Erstellen angezeigt werden?", vbYesNo, _
"PDF anzeigen?")  = vbYes Then pdfOpenAfterPublish = True
'   Vorgaben zum speichern des Dokuments
strPfad = "C:\Testdatei\" 'Basis-Verzeichnis in dem die Dateien gespeichert werden sollen
'    strPfad = "C:\Users\Public\Test\PDF\"
With ActiveSheet.Range("K12")
'Jahres-Unter-Verzeichnis aus Datum generieren
strPfad = strPfad & VBA.Format(.Value, "YYYY")
Call prcMakeDir(strPfad)
'Monats-Unter-Verzeichnis aus Datum generieren
strPfad = strPfad & Application.PathSeparator & VBA.Format(.Value, "MMMM")
Call prcMakeDir(strPfad)
'Name PDF-Datei aus Datum generieren
strFile = strPfad & "\" & VBA.Format(.Value, "YYYYMMDD") & ".pdf"
End With
'PDF erstellen
ActiveSheet.Range("A6:AX60").ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=strFile, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=IIf(pdfOpenAfterPublish, True, False)     '(in Kombination mit MsgBox) _
'   OpenAfterPublish = True  (wenn keine MsgBox gewünscht ist)
End Sub
Sub prcMakeDir(ByVal Verzeichnis)
'Erstellt Verzeichnis, wenn noch nicht vorhanden
If Dir(Verzeichnis, vbDirectory) = "" Then
VBA.MkDir Verzeichnis
End If
End Sub

Anzeige
AW: Excelsheet in PDF speichern
18.10.2016 00:01:07
Jens
Hallo Franz,
DANKE +++ für deine schnelle Hilfe.
Dein Code hat auf Anhieb sauber funktioniert und was mir noch sehr gut gefallen hat:
einfach, übersichtlich,- und beschriftet.
Super, da hat das Testen wirklich Spaß gemacht.
Nun hätte ich noch eine Bitte;
kann man in den Code mit einbinden das die gesamte Excel Arbeitsmappe .xlsm
mit abgespeichert werden soll?
Wenn das geht, hat man dann am Monatsende recht viele (gemischte .pdf & .xlsm)
Dateien im Ordner liegen - was die Übersicht auch nicht besser macht.
Die .pdf müssen 15 Jahre archiviert werden und die Exceldateien sind nur aufgeblasene
Arbeitsmappen mit teilweise nicht archivierungspflichtigem Inhalt.
Nun hab ich mir überlegt das man nur die letzten 7 Exceldadeien vorhält
und alle anderen löscht.
Dies könnte beispielsweise automatisch geschehen - Nur wie?
Habt ihr vielleicht Ideen zum Thema?
Notfalls müsste halt händisch gelöscht werden ;)
Danke und spätabendliche Grüße,
Jens
Anzeige
AW: Excelsheet in PDF speichern
18.10.2016 05:52:41
fcs
Hallo Jens,
das Erstellen einer Kopie der Exceldatei mit dem gleichen Namne wie die PDF ist kein Problem.
Das löschen älterer xlsm-Dateien ist schon etwas aufwendiger
In der folgenden Version bleiben in jedem Monat 7 Excel-Dateien übrig.
Wenn man die dies noch monatsübergreifend weiter treiben will, dann wird es deutlich kompliierter.
Gruß
Franz

Private Sub CmdPDF_Click()  ' Dateiname ist Datum aus "K12"
Dim pdfOpenAfterPublish As Boolean
Dim strFile As String
Dim strPfad As String
Dim strExcel As String
'   MsgBox ist eine optionale Komponente
'   Rückfragen, ob Datei nach dem Erstellen geöffnet werden soll
If MsgBox("Soll die PDF-Datei nach dem Erstellen angezeigt werden?", vbYesNo, "PDF anzeigen? _
") _
= vbYes Then pdfOpenAfterPublish = True
'   Vorgaben zum speichern des Dokuments
strPfad = "C:\Testdatei\" 'Basis-Verzeichnis in dem die Dateien gespeichert werden sollen
strPfad = "C:\Users\Public\Test\PDF\"
With ActiveSheet.Range("K12")
'Jahres-Unter-Verzeichnis aus Datum generieren
strPfad = strPfad & VBA.Format(.Value, "YYYY")
Call prcMakeDir(strPfad)
'Monats-Unter-Verzeichnis aus Datum generieren
strPfad = strPfad & Application.PathSeparator & VBA.Format(.Value, "MMMM")
Call prcMakeDir(strPfad)
'Name PDF-Datei aus Datum generieren
strFile = strPfad & "\" & VBA.Format(.Value, "YYYYMMDD") & ".pdf"
strExcel = strPfad & "\" & VBA.Format(.Value, "YYYYMMDD") & ".xlsm"
End With
'PDF erstellen
ActiveSheet.Range("A6:AX60").ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=strFile, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=IIf(pdfOpenAfterPublish, True, False)     '(in Kombination mit MsgBox) _
'   OpenAfterPublish = True  (wenn keine MsgBox gewünscht ist)
'Excel-Kopie erstellen
ActiveWorkbook.SaveCopyAs strExcel
Call prcDeleteOldFiles(Verzeichnis:=strPfad, Filter:="*.xlsm", NumFiles:=7)
End Sub
Sub prcMakeDir(ByVal Verzeichnis)
'Erstellt Verzeichnis, wenn noch nicht vorhanden
If Dir(Verzeichnis, vbDirectory) = "" Then
VBA.MkDir Verzeichnis
End If
End Sub
Sub prcDeleteOldFiles(byvalVerzeichnis As String, ByVal Filter As String, _
Optional ByVal NumFiles As Integer = 1)
Dim fsO As Object, fsFolder As Object, fsFile
Dim arrFiles() As String, intCount As Integer
'Makro geeignet für Dateien, deren Name mit dem Datum im Format JJJJ-MM-DD beginnt oder _
anderem Wert am Begin des Dateinamens der für neuere Dateien aufsteigend ist.
'Verzeichnis = Dateiverzeichnis in dem Dateien gelöscht werden sollen
'Filter = Filter für die Dateisuche
'NumFiles = Anzahl der neuesten Dateien, die nicht gelöscht werden sollen
If Filter = "*.*" Then
MsgBox "Als Filter wurde ""*.*"" gewählt, " _
& "Dieser Filter würde alle Dateien im Ordner löschen!" _
& vbLf & "Makro wird abgebrochen", _
vbOKOnly + vbInformation, "Makro: prcDeleteOldFiles"
Exit Sub
End If
Set fsO = CreateObject("Scripting.FileSystemObject")
Set fsFolder = fsO.GetFolder(Verzeichnis)
For Each fsFile In fsFolder.Files
If fsFile.Name Like Filter Then
intCount = intCount + 1
ReDim Preserve arrFiles(1 To intCount)
arrFiles(intCount) = fsFile.Name
End If
Next
If intCount > NumFiles Then
If intCount > 1 Then
Call Quicksort(arrFiles, LBound(arrFiles), UBound(arrFiles))
End If
For intCount = 1 To UBound(arrFiles) - NumFiles
Kill pathname:=Verzeichnis & "\" & arrFiles(intCount)
Next
End If
Set fsO = Nothing
Set fsFolder = Nothing
End Sub
'######   Quicksort - Sortiert eine einspaltige Datenliste aufsteigend   ######
Public Function Quicksort(Data, links, rechts)
'Sortieren einer einspaltigen Datenliste
'links und rechts geben die Nummern der der Elemente an, die sortiert werden sollen
'normalerweise nimmt man das 1. und letzte Element
Dim Teiler As Long
If rechts > links Then
Teiler = Teile(Data, links, rechts)
Call Quicksort(Data, links, Teiler - 1)
Call Quicksort(Data, Teiler + 1, rechts)
End If
End Function
Private Function Teile(Data, links, rechts)
Dim Index As Long
Dim i As Long
Index = links
For i = links To rechts - 1
If Data(i) 

Anzeige
Fehlermeldung beim speichern
19.10.2016 15:53:38
Jens
Hallo Franz,
vielen lieben Dank für deine Mühe und Hilfe.
Ich bin gerade dabei den Code auszuprobieren.
Leider bekomme ich erstmal eine Fehlermeldung
"Fehler beim Kompilieren. Benanntes Argument nicht gefunden"
Fehlerzeile:
Call prcDeleteOldFiles(Verzeichnis:=strPfad, Filter:="*.xlsm", NumFiles:=7)
gelb eingefärbt ist "Verzeichnis:"
Kannst Du mir da weiterhelfen?
Gruß, Jens
Anzeige
AW: Fehlermeldung beim speichern
19.10.2016 18:39:44
fcs
Hallo Jens,
da ist mir irgendwo ein Leerzeichen verloren gegangen.
Die Zeile
Sub prcDeleteOldFiles(byvalVerzeichnis As String, ByVal Filter As String, _
Optional ByVal NumFiles As Integer = 1)

ändern in
Sub prcDeleteOldFiles(ByVal Verzeichnis As String, ByVal Filter As String, _
Optional ByVal NumFiles As Integer = 1)
LG
Franz
Anzeige
AW: Fehlermeldung beim speichern
19.10.2016 18:53:32
Jens
Hallo Franz,
habs grad getestet.
Jetzt funktioniert es tadellos.
Ich werde zukünftig Datei speichern zu meinem Hobby machen :-)))))))
Vielen, vielen Dank für deine großartige Hilfe.
Gruß, Jens
P.S. Ich brauch noch viel Hilfe bis ich mein Vorhaben in die Tat umgesetzt habe ;)
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Excelsheet in PDF speichern


Schritt-für-Schritt-Anleitung

Um ein Excel-Sheet als PDF zu speichern, kannst du ein Makro verwenden. Hier ist eine Schritt-für-Schritt-Anleitung, die dir hilft, dein Excel-Dokument in ein PDF zu exportieren:

  1. Öffne Excel und gehe zu dem Arbeitsblatt, das du als PDF speichern möchtest.

  2. Drücke ALT + F11, um den VBA-Editor zu öffnen.

  3. Erstelle ein neues Modul: Rechtsklicke im Projektfenster auf „VBAProject (deineDatei)“ und wähle „Einfügen“ > „Modul“.

  4. Füge den folgenden Code ein:

    Private Sub CmdPDF_Click()
       Dim pdfOpenAfterPublish As Boolean
       Dim strFile As String
       Dim strPfad As String
    
       If MsgBox("Soll die PDF-Datei nach dem Erstellen angezeigt werden?", vbYesNo, "PDF anzeigen?") = vbYes Then
           pdfOpenAfterPublish = True
       End If
    
       strPfad = "C:\Testdatei\"  'Basis-Verzeichnis
    
       'Hier wird der Dateiname generiert
       strFile = strPfad & Format(Range("K12").Value, "YYYYMMDD") & ".pdf"
    
       'Exportiere das aktive Blatt als PDF
       ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=strFile, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=pdfOpenAfterPublish
    End Sub
  5. Schließe den VBA-Editor und kehre zu Excel zurück.

  6. Führe das Makro aus: Gehe zu „Entwicklertools“ > „Makros“ und wähle das Makro „CmdPDF_Click“ aus.

Mit diesem Makro kannst du dein Excel-Blatt einfach als PDF speichern.


Häufige Fehler und Lösungen

  • Fehlermeldung: "Fehler beim Kompilieren. Benanntes Argument nicht gefunden"

    • Stelle sicher, dass alle Variablen im Code korrekt definiert sind. Achte besonders auf Leerzeichen in den Parametern. Der Code sollte wie folgt aussehen:
    Sub prcDeleteOldFiles(ByVal Verzeichnis As String, ByVal Filter As String, Optional ByVal NumFiles As Integer = 1)
  • Fehler beim Speichern des PDFs

    • Überprüfe, ob der angegebene Speicherort existiert. Erstelle gegebenenfalls das Verzeichnis manuell oder erweitere dein Makro um eine Funktion, die fehlende Ordner automatisch anlegt.

Alternative Methoden

Falls du keine VBA-Makros verwenden möchtest, kannst du die folgende Methode ausprobieren:

  1. Excel als PDF speichern über das Menü:

    • Klicke auf „Datei“ > „Speichern unter“.
    • Wähle als Dateiformat „PDF“ aus.
    • Stelle sicher, dass die gewünschten Druckbereiche korrekt eingestellt sind, um die Formatierungen zu erhalten.
  2. Druckbereich festlegen:

    • Gehe zu „Seitenlayout“ > „Druckbereich“ > „Druckbereich festlegen“, bevor du das Dokument speicherst.

Praktische Beispiele

  • Exportiere nur einen bestimmten Bereich: Um nur einen bestimmten Bereich deiner Excel-Tabelle als PDF zu speichern, kannst du den folgenden Code verwenden:

    ActiveSheet.Range("A1:D10").ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Testdatei\Bereich.pdf"
  • PDF der gesamten Arbeitsmappe speichern: Um die gesamte Excel-Arbeitsmappe als PDF zu speichern, kannst du den Code anpassen:

    ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Testdatei\GesamteArbeitsmappe.pdf"

Tipps für Profis

  • Automatisierung verbessern: Nutze VBA, um fehlende Ordnerstrukturen für Jahr und Monat automatisch zu erstellen, bevor du deine PDF-Dateien speicherst.
  • Fehlerberichte: Implementiere Fehlermeldungen in deinem Makro, um zu erkennen, wenn etwas schiefgeht, z.B. wenn der Speicherort nicht vorhanden ist.
  • Versionskontrolle: Füge Zeitstempel in die Dateinamen ein, um ältere Versionen zu verfolgen.

FAQ: Häufige Fragen

1. Wie speichere ich ein Excel-Dokument als PDF, ohne Makros zu verwenden? Du kannst einfach über „Datei“ > „Speichern unter“ das Format auf „PDF“ ändern und speichern.

2. Was ist der Unterschied zwischen „ExportAsFixedFormat“ und „SaveAs“? „ExportAsFixedFormat“ wird verwendet, um das Excel-Dokument in ein PDF zu exportieren, während „SaveAs“ das Excel-Dokument in einem anderen Format speichert.

3. Kann ich mehrere Blätter auf einmal als PDF speichern? Ja, du kannst alle Blätter in deiner Arbeitsmappe in eine einzige PDF-Datei exportieren, indem du ThisWorkbook.ExportAsFixedFormat verwendest.

4. Wie kann ich sicherstellen, dass die Formatierung beim Speichern als PDF erhalten bleibt? Achte darauf, dass du die Druckbereiche korrekt festlegst und die Option „IncludeDocProperties“ auf „True“ setzt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige