Live-Forum - Die aktuellen Beiträge
Datum
Titel
16.10.2025 17:40:39
16.10.2025 17:25:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 2 Makros zum speichern und drucken mit Vorgaben

2 Makros zum speichern und drucken mit Vorgaben
08.08.2023 14:25:46
aXCell
Hallo zusammen,

ich bin noch echt unerfahren, was VBA und Makros angeht, daher scheitere ich wahrscheinlich an Kleinigkeiten.
Ich mache meine Stundenzettel digital und möchte diese gerne beim klick auf "speichern" mit einigen Vorgaben aus dem Arbeitsblatt in enem bestimmten Dateinamen Format ablegen und zusätzlich für die Buchhaltung in dem gleichen Dateinamenformat, allerdings als PDF zur Verfügung stellen.

Bisher habe ich alles nur per Try and Error mit Copy und paste zusammenge"schustert"

Das Makro auf dem Textfeld "speichern" sieht folgendermaßen aus:

Sub Speichern_unter()
Dim Datei As String
Dim Verzeichnis As String
Dim SaveDummy As Variant
Verzeichnis = "C:\Users\arohrmann\Documents\1. Stundenzettel\" 'Verzeichnis-Vorschlag
Datei = Range("G2") & "" & Range("H2") & " - " & Range("D11") & " - " & Range("D7") & ", " & Range("D9") & ".xlsm" 'Datei-Vorschlag
SaveDummy = SpeichernUnter(Verzeichnis & Datei)
If SaveDummy > False Then ActiveWorkbook.SaveAs SaveDummy, FileFormat:=51 'Es wurde im Dialog auf Speichern gedrückt
End Sub
Function SpeichernUnter(VorgabeName As String) As Variant
SpeichernUnter = Application.GetSaveAsFilename(InitialFileName:=VorgabeName, _
Filefilter:="Excel Dateien (*.xlsx),*.xlsx", _
FilterIndex:=1, Title:="Speichern unter...", ButtonText:="speichern")
End Function


Das Makro hinter dem Textfeld "Drucken" sieht so aus:

Sub DruckenInPDF()
Call PDF_Speichern
End Sub

Function PDF_Speichern() As Boolean ' Kopiert Blätter in eine neue PDF-Datei für den E-Mail-Versand
Dim DiesesBlatt As String, DieseDatei As String, PfadName As String
Dim SpeichernAls As String

Application.ScreenUpdating = False

' Dateinamen zum Speichern abrufen
DiesesBlatt = ActiveSheet.Name
DieseDatei = ActiveWorkbook.Name
PfadName = ActiveWorkbook.Path
SpeichernAls = PfadName & "\" & DiesesBlatt & ".pdf"

'Druckqualität einstellen
On Error Resume Next
ActiveSheet.PageSetup.PrintQuality = 600
Err.Clear
On Error GoTo 0

' Benutzer anweisen, wie er senden soll
On Error GoTo RefLibFehler
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=SpeichernAls, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=True
On Error GoTo 0

NurSpeichern:
MsgBox "Eine Kopie dieses Blattes wurde erfolgreich als .pdf-Datei gespeichert: " & vbCrLf & vbCrLf & SpeichernAls & _
"Überprüfen Sie das .pdf-Dokument. Wenn das Dokument NICHT gut aussieht, passen Sie Ihre Druckparameter an und versuchen Sie es erneut."

PDF_Speichern = True
GoTo EndMacro

RefLibFehler:
MsgBox "Kann nicht als PDF gespeichert werden. Referenzbibliothek nicht gefunden."
PDF_Speichern = False
EndMacro:
End Function

Beim erstellen der PDF möchte ich aber gerne das gleiche Format für den Dateinamen aus der Tabelle nutzen, wie beim normalen speichern auch.

Beim Makro "speichern" bekomme ich Fehler 400 und die Datei wird nicht gespeichert, er meckert über das Makro, das ja als xlsm gespeichert werden soll, aber die Vorgabe der Dateieerweiterung ist doch integriert?
Beim Makro "Drucken" haut er einfach die PDF mit Standard Dateinamen raus, das speichern als solches funktioniert, aber wo baue ich die Dateinamen vorgabe ein? (und der blöde Hinweis, dass es gespeichert wurde nervt auch etwas)

P.S. Die code > Tags scheinen irgendwie nicht zu funktionieren, ich markiere den Code, klicke auf den Button über dem Beitragsfeld, aber es passiert nichts. .

Vielen Dank für eure Hilfe und Grüße aus Flensburg, Alex
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 2 Makros zum speichern und drucken mit Vorgaben
08.08.2023 23:43:35
ralf_b
Willst du die Mappe mit dem Code ohne Code speichern?
So ein Stundenzettel ist doch nur ein Arbeitsblatt und nicht die ganze Datei oder ?
Beim Pdf wird nur das Blatt exportiert. Du könntest auch nur das entsprechende Blatt als neue Datei ".xlsx" speichern.
Da du schreibst das beide Dateien xlsx und pdf den gleichen Dateinamen haben sollen. Warum erstellst du den Namen zweimal?
Ich würde dazu raten beide Speichervorgänge zusammenzufassen. Damit wird sichergestellt das du auch beide Dateien erstellt werden und nicht, aus Versehen, einmal ein Button vergessen wird.

schau mal hier https://www.herber.de/forum/archiv/1504to1508/1504655_Vba_speichern_ohne_Makros.html
dort wird der Ordnerauswahldialog verwendet.

hier mal ein Versuch der Umsetzung. ungetestet

Option Explicit



Function getFolder(VorgabeName As String)

Dim strOrdner As String
With Application.FileDialog(msoFileDialogFolderPicker) '--- Ordner wählen
.InitialFileName = VorgabeName
.Title = "Ordnerauswahl"
.ButtonName = "Auswahl..."
.InitialView = msoFileDialogViewList
If .Show = -1 Then
If Right(.SelectedItems(1), 1) > "\" Then
getFolder = .SelectedItems(1) & "\"
Else
getFolder = .SelectedItems(1)
End If
Else
getFolder = ""
End If
End With

End Function


Sub Drucken()

Dim sDatei$, sVerzeichnis$
sVerzeichnis = getFolder("C:\Users\arohrmann\Documents\1. Stundenzettel\") 'Verzeichnis-Vorschlag
sDatei = Range("G2") & "" & _
Range("H2") & " - " & _
Range("D11") & " - " & _
Range("D7") & ", " & _
Range("D9") & ".xlsx" 'Datei-Vorschlag

Call xlsx_Speichern(sVerzeichnis, sDatei)

If PDF_Speichern(sVerzeichnis, sDatei) =true Then
MsgBox "Eine Kopie dieses Blattes wurde erfolgreich als .pdf-Datei gespeichert: " & vbCrLf & vbCrLf & Verzeichnis & Datei & _
"Überprüfen Sie das .pdf-Dokument. Wenn das Dokument NICHT gut aussieht, passen Sie Ihre Druckparameter an und versuchen Sie es erneut."
Else
MsgBox "Fehler bei pdf Erstellung. Datei prüfen"
End If
End Sub

Function PDF_Speichern(Verzeichnis As String, Datei As String) As Boolean ' Kopiert Blätter in eine neue PDF-Datei für den E-Mail-Versand
PDF_Speichern = True

Application.ScreenUpdating = False
'Druckqualität einstellen
On Local Error Resume Next
ActiveSheet.PageSetup.PrintQuality = 600
Err.Clear
On Error GoTo 0

On Local Error Resume Next
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=Verzeichnis & Datei, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=False, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
If Err > 0 Then
PDF_Speichern = False
Err.Clear
On Error GoTo 0
End If
End Function


Sub xlsx_Speichern(Verzeichnis As String, Datei As String)
Application.DisplayAlerts = False
ActiveSheet.SaveAs Filename:=Verzeichnis & Datei, FileFormat:=51 'Es wurde im Dialog auf Speichern gedrückt
Application.DisplayAlerts = True
End Sub
Anzeige
2 Makros zum speichern und drucken mit Vorgaben
09.08.2023 12:05:58
aXCell
  • Willst du die Mappe mit dem Code ohne Code speichern?

  • Ich würde die Mappe gerne inklusive dem Makro speichern, da ich das dann auch meinen Kollegen zur Verfügung stellen möchte, um so eine einheitliche Dateinamensvergabe mit dem Büro etablieren könnte.

  • So ein Stundenzettel ist doch nur ein Arbeitsblatt und nicht die ganze Datei oder ?

  • Der Stundenzettel ist tatsächlich eine Datei, eine Arbeitsmappe, bestehend aus nur einer Tabelle.
    Ich führe sie quasi als "Template" wenn man das so sagen kann, als Vorlage, die ich mit den entsrechenden Daten befülle und aus der ich dann pro Kunde / Tag / Baustelle immer eine separate Datei erstelle mit entsprechend zugeordnetem Dateinamen (siehe Vorgabe).

  • Beim Pdf wird nur das Blatt exportiert. Du könntest auch nur das entsprechende Blatt als neue Datei ".xlsx" speichern.

  • Das neue Blatt als .xlsx beinhaltet dann aber nicht das Makro, korrekt?

  • Da du schreibst das beide Dateien xlsx und pdf den gleichen Dateinamen haben sollen. Warum erstellst du den Namen zweimal?

  • Die "Rohdatei" .xlsx/.xlsm schreibe und verändere ich im Laufe der Woche, Anpassungen von Stunden und / oder Material usw., auch im nachhinein noch innerhalb der Arbeitswoche. Das PDF erstelle ich am Ende der Woche von jeder Kunden spezifischen Datei, um sie dann in PDF Form an unsere Buchhaltung zu übergeben / zu senden.

  • Ich würde dazu raten beide Speichervorgänge zusammenzufassen. Damit wird sichergestellt das du auch beide Dateien erstellt werden und nicht, aus Versehen, einmal ein Button vergessen wird.

  • Kann man sicher machen, wenn dann die entsprechenden Ursprungsdateien überschrieben werden, was ja logischerweise dann auch passiert.

    Dein Code funktioniert leider nicht, da er beim speichern meckert, "Variable nicht definiert" mit hinweis auf das Wort "Verzeichnis"im Absatz "Sub Drucken()":
    If PDF_Speichern(sVerzeichnis, sDatei) = True Then
    
    MsgBox "Eine Kopie dieses Blattes wurde erfolgreich als .pdf-Datei gespeichert: " & vbCrLf & vbCrLf & Verzeichnis & Datei & _
    "Überprüfen Sie das .pdf-Dokument. Wenn das Dokument NICHT gut aussieht, passen Sie Ihre Druckparameter an und versuchen Sie es erneut."
    Else
    Anzeige
    2 Makros zum speichern und drucken mit Vorgaben
    09.08.2023 13:16:54
    Pierre
    Hi, nur zu deiner letzten Frage:

    "sVerzeichnis" dürfte richtig sein, sprich, das "s" voran fehlt dort, wo der Fehler auftritt.
    2 Makros zum speichern und drucken mit Vorgaben
    09.08.2023 13:34:36
    aXCell
    Danke Pierre, das war es, es fehlte auch ein "s" vor Datei.
    Das speichern als .xlsx & .pdf funktioniert, soweit also schon mal richtig geil,

    Danke an alle Beteiligten, aber:

    Der Dateiname der PDF beinhaltet auch noch zusätzlich das .xlsx (Mein Monk spielt da nur etwas verrückt, ist nicht entscheidend)
    Wo im Code wird das denn definiert? Reicht es da irgendwo eine Vorgabe zu entfernen oder ist das umsändlicher?

    Userbild
    Anzeige
    2 Makros zum speichern und drucken mit Vorgaben
    09.08.2023 14:00:01
    Pierre
    Hier:
        sDatei = Range("G2") & "" & _
    
    Range("H2") & " - " & _
    Range("D11") & " - " & _
    Range("D7") & ", " & _
    Range("D9") & ".xlsx" 'Datei-Vorschlag


    wird jedenfalls das .xlsx mit angegeben.

    Versuch mal, alles hinter "("D9") zu löschen, ob es dann korrekt ist.
    Anzeige
    ;

    Forumthreads zu verwandten Themen

    Anzeige
    Entdecke relevante Threads

    Schau dir verwandte Threads basierend auf dem aktuellen Thema an

    Alle relevanten Threads mit Inhaltsvorschau entdecken
    Anzeige
    Anzeige

    Infobox / Tutorial

    Makros zum Speichern und Drucken von Stundenzetteln in Excel


    Schritt-für-Schritt-Anleitung

    1. Makro zum Speichern erstellen
      Erstelle ein neues Makro in Excel, um deine Stundenzettel im gewünschten Format zu speichern. Das folgende Beispiel zeigt, wie du den Dateinamen dynamisch basierend auf Zellwerten generierst:

      Sub Speichern_unter()
         Dim Datei As String
         Dim Verzeichnis As String
         Dim SaveDummy As Variant
         Verzeichnis = "C:\Users\arohrmann\Documents\1. Stundenzettel\" 'Verzeichnis-Vorschlag
         Datei = Range("G2") & Range("H2") & " - " & Range("D11") & " - " & Range("D7") & ", " & Range("D9") & ".xlsm"
         SaveDummy = SpeichernUnter(Verzeichnis & Datei)
         If SaveDummy > False Then ActiveWorkbook.SaveAs SaveDummy, FileFormat:=51
      End Sub
      
      Function SpeichernUnter(VorgabeName As String) As Variant
         SpeichernUnter = Application.GetSaveAsFilename(InitialFileName:=VorgabeName, Filefilter:="Excel Dateien (*.xlsx),*.xlsx", FilterIndex:=1, Title:="Speichern unter...", ButtonText:="speichern")
      End Function
    2. Makro zum Drucken als PDF erstellen
      Setze ein weiteres Makro auf, um das Arbeitsblatt als PDF zu speichern:

      Sub DruckenInPDF()
         Call PDF_Speichern
      End Sub
      
      Function PDF_Speichern() As Boolean
         Dim DiesesBlatt As String, DieseDatei As String, PfadName As String
         Dim SpeichernAls As String
      
         Application.ScreenUpdating = False
         DiesesBlatt = ActiveSheet.Name
         DieseDatei = ActiveWorkbook.Name
         PfadName = ActiveWorkbook.Path
         SpeichernAls = PfadName & "\" & DiesesBlatt & ".pdf"
      
         ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=SpeichernAls, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=True
         PDF_Speichern = True
      End Function
    3. Beide Makros kombinieren
      Um sicherzustellen, dass beide Dateien (Excel und PDF) gleichzeitig gespeichert werden, kombiniere die Speichervorgänge in ein einziges Makro:

      Sub Drucken()
         Dim sDatei As String, sVerzeichnis As String
         sVerzeichnis = "C:\Users\arohrmann\Documents\1. Stundenzettel\" 'Verzeichnis-Vorschlag
         sDatei = Range("G2") & Range("H2") & " - " & Range("D11") & " - " & Range("D7") & ", " & Range("D9") & ".xlsx"
      
         xlsx_Speichern(sVerzeichnis, sDatei)
         If PDF_Speichern(sVerzeichnis, sDatei) Then
             MsgBox "Beide Dateien wurden erfolgreich gespeichert."
         Else
             MsgBox "Fehler bei der PDF-Erstellung."
         End If
      End Sub

    Häufige Fehler und Lösungen

    • Fehler 400 beim Speichern: Dieser Fehler tritt häufig auf, wenn du versuchst, eine Datei im falschen Format zu speichern. Stelle sicher, dass der Dateiname die richtige Erweiterung hat (z. B. .xlsm für Makros).

    • PDF wird mit Standarddateiname gespeichert: Achte darauf, dass der Dateiname im PDF-Speichermakro korrekt gesetzt wird. In der Funktion PDF_Speichern kannst du den Dateinamen anpassen, wie im Schritt-für-Schritt-Abschnitt beschrieben.


    Alternative Methoden

    • Excel mehrere Tabellenblätter drucken als PDF: Du kannst auch mehrere Arbeitsblätter in einer einzigen PDF-Datei zusammenfassen. Dies erreichst du durch die Anpassung der ExportAsFixedFormat-Funktion, um mehrere Blätter auszuwählen.

    • Excel VBA PDF erstellen: Verwende die ExportAsFixedFormat-Methode, um nicht nur das aktuelle Blatt, sondern auch alle relevanten Arbeitsblätter als PDF zu speichern.


    Praktische Beispiele

    • Stundenzettel drucken: Erstelle einen Stundenzettel, der automatisch die Stunden summiert und beim Speichern den Namen des Mitarbeiters sowie das Datum einfügt.

    • PDF Dateinamen in Excel kopieren: Verwende die Funktion =ZELLE("Dateiname"), um den aktuellen Dateinamen abzurufen und in die Zelle einzufügen.


    Tipps für Profis

    • Makros speichern für alle Excel-Dateien: Wenn du häufig dieselben Makros verwendest, speichere sie in deiner persönlichen Makroarbeitsmappe (PERSONAL.XLSB).

    • Excel schließen ohne speichern Nachfrage: Verwende Application.DisplayAlerts = False, um Warnmeldungen beim Schließen der Datei zu unterdrücken.


    FAQ: Häufige Fragen

    1. Wie kann ich den Dateinamen für die PDF-Datei anpassen?
    Du kannst den Dateinamen in der PDF_Speichern-Funktion anpassen, indem du die Zeile, die das .pdf hinzufügt, änderst.

    2. Kann ich mehrere Tabellenblätter gleichzeitig drucken?
    Ja, du kannst die ExportAsFixedFormat-Methode so anpassen, dass sie mehrere Arbeitsblätter in einer einzigen PDF-Datei speichert.

    3. Wie speichere ich Makros in einer Excel-Datei?
    Stelle sicher, dass du die Datei im .xlsm-Format speicherst, um die Makros zu behalten.

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Entdecke mehr
    Finde genau, was du suchst

    Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

    Suche nach den besten Antworten
    Unsere beliebtesten Threads

    Entdecke unsere meistgeklickten Beiträge in der Google Suche

    Top 100 Threads jetzt ansehen
    Anzeige