Excel soll bestimmte Tabellenblätter als PDF exportieren

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Excel soll bestimmte Tabellenblätter als PDF exportieren

    Hallo! Ich ersuche eure Hilfe: Ich möchte aus einer Excel Datei mit den Blättern
    1, 2, Beginn, 3, 4, 5, Ende
    genau die Blätter zwischen Beginn und Ende per Makro als einzelne PDFs exportieren.

    Folgenden Makro habe ich zusammengestellt, aber es klappt noch nicht. Excel sagt, dass ein Objekt fehlt. Weiß jemand, wie ich das zum Laufen bringe?

    VB.NET-Quellcode

    1. Sub ExportAlsPDF()
    2. Dim Beginn, Ende, Bereich As Integer
    3. Beginn = Sheets("Beginn").Index + 1
    4. Ende = Sheets("Ende").Index - 1
    5. For Bereich = Beginn To Ende
    6. Sheets(Bereich).Activate
    7. Worksheet.ExportAsFixedFormat _
    8. Type:=xlTypePDF, _
    9. Filename:=ActiveWorkbook.Path & "\" & Sheet.Name & "XYZ", _
    10. Quality:=xlQualityStandard, _
    11. IncludeDocProperties:=True, _
    12. IgnorePrintAreas:=False, _
    13. OpenAfterPublish:=False
    14. Next
    15. End Sub
    Du kannst das ganze auch abkürzen in dem du eine Sheets als Array machst

    VB.NET-Quellcode

    1. Sub ExportAlsPDF()
    2. Sheets(Array(" 1", "2", "3", "4","5")) .Select
    3. Worksheet.ExportAsFixedFormat _
    4. Type:=xlTypePDF, _
    5. Filename:=ActiveWorkbook.Path & "\" & Sheet.Name & "XYZ", _
    6. Quality:=xlQualityStandard, _
    7. IncludeDocProperties:=True, _
    8. IgnorePrintAreas:=False, _
    9. OpenAfterPublish:=False
    10. Next


    Wenn sich die Namen deiner Sheets nicht ändern klappt das so perfekt
    Hallo Gockel,

    Worksheet. und Sheet. gibt es in VBA nicht.

    Da müsstest Du schon ActiveSheet. nehmen, dann sollte es klappen.

    VB.NET-Quellcode

    1. Sub ExportAlsPDF()
    2. Dim Beginn, Ende, Bereich As Integer
    3. Beginn = Sheets("Beginn").Index + 1
    4. Ende = Sheets("Ende").Index - 1
    5. For Bereich = Beginn To Ende
    6. Sheets(Bereich).Activate
    7. ActiveSheet.ExportAsFixedFormat _
    8. Type:=xlTypePDF, _
    9. Filename:=ActiveWorkbook.Path & "\" & ActiveSheet.Name & "XYZ", _
    10. Quality:=xlQualityStandard, _
    11. IncludeDocProperties:=True, _
    12. IgnorePrintAreas:=False, _
    13. OpenAfterPublish:=False
    14. Next
    15. End Sub


    viele Grüße
    Karl-Heinz

    Visual Basic-Quellcode

    1. For Bereich = Beginn To Ende
    2. Sheets(Bereich).ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\" & Sheets(Bereich).Name & "XYZ.pdf"
    3. Next


    Nebenbei:

    Gockel schrieb:

    Dim Beginn, Ende, Bereich As Integer
    ist nicht wirklich das, was du tatsächlich willst.
    Hier werden Beginn und Ende als Variant deklariert und Bereich als Integer.
    Unter VB.Net würde das funktionieren, in VBA muss es heissen:

    Visual Basic-Quellcode

    1. Dim Beginn As Integer, Ende As Integer, Bereich As Integer

    De facto ist es in deinem Fall egal, weil du durch setzen von Beginn und Ende aus dem Variant ein Integer machst.
    Aber du solltest zumindest wissen, dass in VBA bei der Deklaration für jede Variable der Typ angegeben werden muss.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Hallo petaod,

    das sehe ich nicht so, dass man das angeben muss. Gibt man keinen Typ an, wird m.E. die Variable als Variant verwendet und das bleibt dann auch so.

    Aber das ist schlechter Programmierstil und daher bin ich bei Dir mit den korrekten und vollständigen Typ-Zuweisungen.
    Und es soll ja auch Leute geben, die überhaupt keine Variablendimensionierungen vornehmen. :(

    viele Grüße
    Karl-Heinz
    @Animal2k: In dem Fall müsste ich allerdings die Nummern der Tabellenblätter wissen und die Funktion wäre starr, würde also nicht automatisch neue Tabellenblätter im relevanten Bereich mit abdecken.
    @petaod, @volti: Klasse, da habt ihr mir sehr gut geholfen! Es funktioniert jetzt mit euren Änderungen. Hier nochmal der fertige Code, falls ein anderer dasselbe mit Excel anstellen möchte und genauso wenig Ahnung hat wie ich ;) :

    Visual Basic-Quellcode

    1. ​Sub ExportAlsPDF()
    2. Dim Beginn As Integer
    3. Dim Ende As Integer
    4. Dim Bereich As Integer
    5. Beginn = Sheets("Beginn").Index + 1
    6. Ende = Sheets("Ende").Index - 1
    7. For Bereich = Beginn To Ende
    8. Sheets(Bereich).Activate
    9. ActiveSheet.ExportAsFixedFormat _
    10. Type:=xlTypePDF, _
    11. Filename:=ActiveWorkbook.Path & "\" & ActiveSheet.Name & "XYZ", _
    12. Quality:=xlQualityStandard, _
    13. IncludeDocProperties:=True, _
    14. IgnorePrintAreas:=False, _
    15. OpenAfterPublish:=False
    16. Next
    17. End Sub
    Und noch ein Tipp.

    Nimm petaod's Vorschlag noch dazu (wenn Du den Fortschritt nicht unbegingt verfolgen willst :-)), denn man muss die Blätter ja nicht unbedingt aktivieren.

    Visual Basic-Quellcode

    1. ​Sub ExportAlsPDF()
    2. Dim Beginn As Integer
    3. Dim Ende As Integer
    4. Dim Bereich As Integer
    5. Beginn = Sheets("Beginn").Index + 1
    6. Ende = Sheets("Ende").Index - 1
    7. For Bereich = Beginn To Ende
    8. Sheets(Bereich).ExportAsFixedFormat _
    9. Type:=xlTypePDF, _
    10. Filename:=ActiveWorkbook.Path & "\" & Sheets(Bereich).Name & "XYZ", _
    11. Quality:=xlQualityStandard, _
    12. IncludeDocProperties:=True, _
    13. IgnorePrintAreas:=False, _
    14. OpenAfterPublish:=False
    15. Next
    16. End Sub

    volti schrieb:

    Gibt man keinen Typ an, wird m.E. die Variable als Variant verwendet und das bleibt dann auch so.
    Ganz so tief wollte ich nicht einsteigen.
    Ja, die Variable bleibt ein Variant.
    Wenn man einen Integer-Wert zuweist wird sie zum Variant/Integer und wird während dieser Zeit auch als Integer verwertet.
    Aber man kann sie später durch Zuweisung eines Strings zu einem Variant/String machen.
    Wenn du im Debugger einen Watch auf die Variable setzt, kannst du das in der Datentyp-Spalte ganz gut beobachten.

    Ich bin ein Freund der typsicheren Programmierung und verwende Variant ganz selten.
    Eine Ausnahme bildet der For Each-Iterator. Da will der Compiler ein Variant.

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub Test()
    3. Dim s As Variant 'String wird hier nicht anerkannt
    4. For Each s In Split("abc,def,xyz", ",")
    5. Debug.Print s
    6. Next
    7. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()