Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Save as XLSX und PDF

Save as XLSX und PDF
02.09.2017 16:48:39
Knauer
Als Resultat meiner letzten Anfrage und der erhaltenen Lösung laufen meine Objekte aus einem Array zusammen mit einem zweiten Macro, indem letztlich einzelne, gefilterte Excelsheets erzeugt werden.
Das Ergebnis soll nun gesichert werden als *.xlsx und auch als PDF, das zur Anzeige benutzt wird. Meine Lösung ist sehr mechanisch (kann es leider noch nicht besser) für beide Fälle. Außerdem ist das Problem, dass bei einem zweiten Durchlauf (nach einer Änderung im Hauptfile) die Einzelfiles schon existieren und daher erst gelöscht werden müssen. Meine Lösung ist ein Macro mit einer delete-Funktion. Damit könnte ich leben.
Die Frage ist aber, wie könnte eine elegantere Lösung aussehen, die die ganze Prozedur automatisch ohne Rückfrage ablaufen läßt – auch beim ersten und zweiten Mal. Meine Lösung sieht momentan so aus:

Option Explicit
Public Sub DeleteSheets()
'Raumpatchlisten selektieren
Sheets(Array("301", "302", "303", "304")).Select
Sheets("301").Activate
'Aktive Tabellen löschen
ActiveWindow.SelectedSheets.Delete
Sheets("3.OG").Select
'Folgemacro aufrufen
'Call RaumArray     - momentan nicht aktiviert
End Sub


Public Sub RaumArray()
Dim r As Variant
'Array mit den Raumnummern für die Raumpatchlisten
For Each r In Array("301", "302", "303", "304")
Call Tabelle(r)
Next
End Sub

Private Sub Tabelle(ByVal r As Variant)
'neue Tabelle aus Tab 300 erzeugen und ans Ende stellen
Worksheets("300").Copy After:=Sheets(Sheets.Count)
'Tabelle umbenennen
ActiveSheet.Name = r
'Tabelleninhalt löschen
Range("A2:T55").ClearContents
With Worksheets("3.OG")
'Haupttabelle 3.OG Raumspalte filtern
.Range("$A$1:$T$346").AutoFilter Field:=1, Criteria1:="=" & r
'Ergebnis kopieren zur neu erzeugten Tabelle
.UsedRange.Copy Range("A1")
'Filter deaktivieren
Call .ShowAllData
End With
Worksheets("3.OG").Select
End Sub
Public Sub SAVEasXLSX()
' SAVEasXLSX Makro
Sheets("301").Select
Sheets("301").Copy
ChDir "F:\Patchlisten"
ActiveWorkbook.SaveAs Filename:= _
"F:\Patchlisten\301_it_nw_pl_lanpatchliste.xlsx", FileFormat _
:=xlOpenXMLWorkbook, CreateBackup:=False
ActiveWindow.Close
Sheets("3.OG").Select
Sheets("302").Select
Sheets("302").Copy
ChDir "F:\Patchlisten"
ActiveWorkbook.SaveAs Filename:= _
"F:\Patchlisten\302_it_nw_pl_lanpatchliste.xlsx", FileFormat _
:=xlOpenXMLWorkbook, CreateBackup:=False
ActiveWindow.Close
Sheets("3.OG").Select
Sheets("303").Select
Sheets("303").Copy
ChDir "F:\Patchlisten"
ActiveWorkbook.SaveAs Filename:= _
"F:\Patchlisten\303_it_nw_pl_lanpatchliste.xlsx", FileFormat _
:=xlOpenXMLWorkbook, CreateBackup:=False
ActiveWindow.Close
Sheets("3.OG").Select
Sheets("304").Select
Sheets("304").Copy
ChDir "F:\Patchlisten"
ActiveWorkbook.SaveAs Filename:= _
"F:\Patchlisten\304_it_nw_pl_lanpatchliste.xlsx", FileFormat _
:=xlOpenXMLWorkbook, CreateBackup:=False
ActiveWindow.Close
Sheets("3.OG").Select
Call createPDF
End Sub

Public Sub createPDF()
' createPDF Makro
Sheets("301").Select
ChDir "F:\Patchlisten"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"F:\Patchlisten\301_it_nw_pl_lanpatchliste.pdf", Quality:= _
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
OpenAfterPublish:=False
Sheets("302").Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"F:\Patchlisten\302_it_nw_pl_lanpatchliste.pdf", Quality:= _
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
OpenAfterPublish:=False
Sheets("303").Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"F:\Patchlisten\303_it_nw_pl_lanpatchliste.pdf", Quality:= _
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
OpenAfterPublish:=False
Sheets("304").Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"F:\Patchlisten\304_it_nw_pl_lanpatchliste.pdf", Quality:= _
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
OpenAfterPublish:=False
Worksheets("3.OG").Select
End Sub

Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Save as XLSX und PDF
02.09.2017 18:04:09
onur
Versuch das mal:
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs .......
Application.DisplayAlerts = True
AW: Save as XLSX und PDF
02.09.2017 18:58:51
Knauer
Ja, das funktioniert. Danke. Ich habe bei den Makros DeleteSheets, SaveAsXLSX, und createPDF einfach
die Zeile Application.DisplayAlerts = False eingefügt und damit ändert sich die Standardantwort auf ja und es kommen keine Rückfragen mehr. Jetzt könnte ich alle Makros zusammenhängen.
Es bleibt noch das Problem bei den Makros SaveAsXLSX und createPDF. Hier wollte ich eigentlich die Werte aus dem Array übergeben (so wie beim Makro Tabelle mit freundlicher Unterstützung von Nepomuk) und jedes Excelfile speichern und jeweils als PDF erzeugen. Gibt es dafür noch eine Lösung? Beim Versuch das Prinzip aus dem Makro Tabelle zu übernehmen, komme ich nicht weiter.
Anzeige
AW: Save as XLSX und PDF
02.09.2017 19:17:30
Nepumuk
Hallo Knauer,
dann so:
Option Explicit

Public Sub RaumArray()
    Dim r As Variant
    
    With Application
        .Calculation = xlCalculationManual
        .DisplayAlerts = False
        .EnableEvents = False
        .ScreenUpdating = False
    End With
    
    'Array mit den Raumnummern für die Raumpatchlisten
    For Each r In Array("301", "302", "303", "304")
        Call Tabelle(r)
        Call SAVEasXLSX(r)
        Call createPDF(r)
    Next
    
    With Application
        .Calculation = xlCalculationAutomatic
        .DisplayAlerts = True
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub

Private Sub Tabelle(ByVal r As Variant)
    'neue Tabelle aus Tab 300 erzeugen und ans Ende stellen
    Worksheets("300").Copy After:=Sheets(Sheets.Count)
    'Tabelle umbenennen
    ActiveSheet.Name = r
    'Tabelleninhalt löschen
    Range("A2:T55").ClearContents
    With Worksheets("3.OG")
        'Haupttabelle 3.OG Raumspalte filtern
        .Range("$A$1:$T$346").AutoFilter Field:=1, Criteria1:="=" & r
        'Ergebnis kopieren zur neu erzeugten Tabelle
        .UsedRange.Copy Range("A1")
        'Filter deaktivieren
        Call .ShowAllData
    End With
    Worksheets("3.OG").Select
End Sub

Private Sub SAVEasXLSX(ByVal r As Variant)
    '
    ' SAVEasXLSX Makro
    '
    Worksheets(r).Copy
    With ActiveWorkbook
        .SaveAs Filename:= _
            "F:\Patchlisten\" & r & "_it_nw_pl_lanpatchliste.xlsx", _
            FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        .Close
    End With
    
End Sub

Private Sub createPDF(ByVal r As Variant)
    '
    ' createPDF Makro
    '
    Worksheets(r).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        "F:\Patchlisten\" & r & "_it_nw_pl_lanpatchliste.pdf", Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=False
    
End Sub

Gruß
Nepumuk
Anzeige
AW: Save as XLSX und PDF
02.09.2017 19:50:33
Knauer
Sorry ich bin nicht so schnell, aber ich habe jetzt deinen Code ausprobiert und fast wie nicht anders zu erwarten - es funktioniert so, wie ich es mir geahnt habe. Es geht jetzt auch wesentlich schneller, Dank effektiven Code. Problem gelöst - vielen Dank.
Dann kann man ja zum nächsten Problem in der Pipeline übergehen. Ich hätte da noch so einige :)
Die muss ich aber erstmal aufbereiten.
Viele Grüße
Dieter
Anzeige
AW: Save as XLSX und PDF
02.09.2017 18:44:26
Nepumuk
Hallo Knauer,
teste mal:
Public Sub SAVEasXLSX()
    '
    ' SAVEasXLSX Makro
    '
    With Application
        .Calculation = xlCalculationManual
        .DisplayAlerts = False
        .EnableEvents = False
        .ScreenUpdating = False
    End With
    
    Worksheets("301").Copy
    With ActiveWorkbook
        .SaveAs Filename:= _
            "F:\Patchlisten\301_it_nw_pl_lanpatchliste.xlsx", _
            FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        .Close
    End With
    
    Worksheets("302").Copy
    With ActiveWorkbook
        .SaveAs Filename:= _
            "F:\Patchlisten\302_it_nw_pl_lanpatchliste.xlsx", _
            FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        .Close
    End With
    
    Worksheets("303").Copy
    With ActiveWorkbook
        .SaveAs Filename:= _
            "F:\Patchlisten\303_it_nw_pl_lanpatchliste.xlsx", _
            FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        .Close
    End With
    
    Worksheets("304").Copy
    With ActiveWorkbook
        .SaveAs Filename:= _
            "F:\Patchlisten\304_it_nw_pl_lanpatchliste.xlsx", _
            FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        .Close
    End With
    
    With Application
        .Calculation = xlCalculationAutomatic
        .DisplayAlerts = True
        .EnableEvents = True
        .ScreenUpdating = True
    End With
    
    Call createPDF
    
End Sub

Public Sub createPDF()
    '
    ' createPDF Makro
    '
    Worksheets("301").ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        "F:\Patchlisten\301_it_nw_pl_lanpatchliste.pdf", Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=False
    
    Worksheets("302").ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        "F:\Patchlisten\302_it_nw_pl_lanpatchliste.pdf", Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=False
    
    Worksheets("303").ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        "F:\Patchlisten\303_it_nw_pl_lanpatchliste.pdf", Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=False
    
    Worksheets("304").ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        "F:\Patchlisten\304_it_nw_pl_lanpatchliste.pdf", Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=False
    
End Sub

Gruß
Nepumuk
Anzeige
AW: Save as XLSX und PDF
02.09.2017 19:20:40
Knauer
Ja das funktioniert auch wunderbar. Danke.
Nochmal meine Frage zur Übergabe der Arraywerte für jede Aktion. Dafür müsste jede Raumnr. jeweils 2 mal in Sheets("301").Select und im Dateinamen übergeben werden. Dann wäre auch der Code sehr übersichtlich. Das scheint mir eine zentrale Funktionsweise zu sein, die man immer wieder braucht. Vermute ich mal.
Ich sehe nur diese Wiederholungen und das schaut doch nach einer Schleifenlösung aus?
Anzeige
AW: Save as XLSX und PDF
02.09.2017 19:22:42
onur
Ja sicher, du kannst nicht alle Dateien gleichzeitig speichern.
AW: Save as XLSX und PDF
02.09.2017 19:56:08
Knauer
Der Code von Nepomuk hat das Problem elegant gelöst, direkt in der Schleife. Auch Dir vielen Dank.
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Speichern als XLSX und PDF in Excel VBA


Schritt-für-Schritt-Anleitung

Um Excel-Daten als XLSX und PDF zu speichern, kannst du die folgenden VBA-Makros verwenden. Diese Anleitung zeigt dir, wie du die Dateien effizient speicherst, ohne Rückfragen zu erhalten.

  1. Makro zum Löschen bestehender Sheets:

    Public Sub DeleteSheets()
       Sheets(Array("301", "302", "303", "304")).Select
       ActiveWindow.SelectedSheets.Delete
    End Sub
  2. Makro zur Erstellung neuer Sheets aus einem Array:

    Public Sub RaumArray()
       Dim r As Variant
       For Each r In Array("301", "302", "303", "304")
           Call Tabelle(r)
       Next
    End Sub
    
    Private Sub Tabelle(ByVal r As Variant)
       Worksheets("300").Copy After:=Sheets(Sheets.Count)
       ActiveSheet.Name = r
       Range("A2:T55").ClearContents
       With Worksheets("3.OG")
           .Range("$A$1:$T$346").AutoFilter Field:=1, Criteria1:="=" & r
           .UsedRange.Copy Range("A1")
           Call .ShowAllData
       End With
    End Sub
  3. Makro zum Speichern als XLSX:

    Public Sub SAVEasXLSX()
       Dim sheetName As Variant
       For Each sheetName In Array("301", "302", "303", "304")
           Worksheets(sheetName).Copy
           ActiveWorkbook.SaveAs Filename:="F:\Patchlisten\" & sheetName & "_it_nw_pl_lanpatchliste.xlsx", _
                                FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
           ActiveWindow.Close
       Next sheetName
    End Sub
  4. Makro zum Erstellen von PDF-Dateien:

    Public Sub createPDF()
       Dim sheetName As Variant
       For Each sheetName In Array("301", "302", "303", "304")
           Worksheets(sheetName).ExportAsFixedFormat Type:=xlTypePDF, _
           Filename:="F:\Patchlisten\" & sheetName & "_it_nw_pl_lanpatchliste.pdf", _
           Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
           OpenAfterPublish:=False
       Next sheetName
    End Sub
  5. Zusammenführen der Makros:

    Public Sub RunAll()
       Application.DisplayAlerts = False
       Call DeleteSheets
       Call RaumArray
       Call SAVEasXLSX
       Call createPDF
       Application.DisplayAlerts = True
    End Sub

Häufige Fehler und Lösungen

  • Fehler: "Datei existiert bereits."
    Lösung: Stelle sicher, dass du vor dem Speichern die bestehenden Sheets löschst. Verwende das DeleteSheets-Makro.

  • Fehler: "Das Arbeitsblatt kann nicht gefunden werden."
    Lösung: Überprüfe, ob die Namen der Blätter korrekt sind und existieren, bevor du das Makro ausführst.


Alternative Methoden

Eine alternative Methode zum Speichern könnte sein, die Excel-Optionen direkt zu verwenden, anstatt VBA. Du kannst auch die ActiveWorkbook.SaveAs-Methode verwenden, um die Datei im gewünschten Format zu speichern:

ActiveWorkbook.SaveAs Filename:="F:\Patchlisten\deine_datei.xlsx", FileFormat:=xlOpenXMLWorkbook

Praktische Beispiele

Hier sind einige praktische Beispiele, wie die oben genannten Makros in der Praxis funktionieren:

  • Speichern eines Arbeitsblatts als PDF:

    Worksheets("301").ExportAsFixedFormat Type:=xlTypePDF, Filename:="F:\Patchlisten\301.pdf"
  • Speichern aller Arbeitsblätter in einem bestimmten Verzeichnis:

    For Each sheet In ThisWorkbook.Sheets
      sheet.SaveAs Filename:="F:\Patchlisten\" & sheet.Name & ".xlsx", FileFormat:=xlOpenXMLWorkbook
    Next sheet

Tipps für Profis

  1. Verwende Application.DisplayAlerts = False: Dadurch werden Rückfragen beim Speichern unterdrückt.

  2. Nutze Schleifen: Vermeide redundante Codezeilen, indem du Schleifen für wiederkehrende Aufgaben einsetzt.

  3. Fehlerbehandlung: Implementiere Fehlerbehandlungsroutinen, um sicherzustellen, dass dein Makro auch bei unerwarteten Problemen stabil bleibt.


FAQ: Häufige Fragen

1. Wie speichere ich ein Arbeitsblatt als PDF?
Verwende die ExportAsFixedFormat-Methode, um ein Arbeitsblatt in PDF zu exportieren.

2. Was mache ich, wenn ich eine Fehlermeldung beim Speichern erhalte?
Überprüfe, ob die Datei bereits existiert oder ob der Dateipfad korrekt ist.

3. Wie kann ich die Dateiformate ändern?
Wenn du ein anderes Format benötigst, ändere einfach das FileFormat-Argument in den SaveAs-Methoden.

4. Ist es möglich, alle Blätter gleichzeitig zu speichern?
Ja, du kannst eine Schleife verwenden, um alle Blätter nacheinander zu speichern, was den Prozess automatisiert.

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