Dynamischer Druckbereich?

  • Excel

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von bandchef.

    Dynamischer Druckbereich?

    Hi Leute!

    Ich möchte in Abhängigkeit von einem Zeichen in der ersten Spalte und letzten Zeile zu einer "festen" letzten Spalte den Druckbereich dynamisch angeben. Ich weiß von dem Event BeforePrint, aber ich kapier nicht so ganz wie das jetzt programmieren soll. Vielleicht kann mir jemand auf die Sprünge helfen?

    Ich hab natürlich auch schon angefangen:

    Visual Basic-Quellcode

    1. Public Sub druckbereich()
    2. Dim pmlist As Worksheet
    3. Set pmlist = "Sheet1"
    4. End Sub


    Nun hab ich aber damit gleich mal das Problem, dass mir der Compiler sagt, dass hier "Typen unverträglich" seien. Ich hab sowas aber schon 100x gemacht und es hat bisher immer funktioniert! Was ist da jetzt falsch?

    Problem gelöst: Ich muss anstatt "Sheet1" einfach Tabelle1 schreiben dann geht das schon mal. Wie aber funktioniert nun diese BeforePrint Methode? pmlist.BeforePrint gibts nicht!

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

    Ich hab jetzt versucht einiges selbst über die Methode rauszufinden. Nun bin ich darauf gestoßen, dass das eigentlich gar keine Methode ist, sondern wie eine vorgegebene Funktion die aufgerufen wird, wenn man drucken will bzw. die Seitenansicht aufrufen will. Das sieht nun so aus:

    Visual Basic-Quellcode

    1. Private Sub Workbook_BeforePrint(Cancel As Boolean)
    2. Application.EnableEvents = False
    3. ActiveWindow.SelectedSheets = PrintOut
    4. 'angeben was gedruckt werden soll!
    5. Cancel = True
    6. Application.EnableEvents = True
    7. End Sub


    Ich hab aber nun das Problem, dass beim Drucken bzw. der Seitenansicht, dieses Makro anscheinend nicht aufgerufen wird, da Haltepunkte ignoriert werden...

    Weiß jemand wie das nun geht?

    bandchef schrieb:

    ActiveWindow.SelectedSheets = PrintOut
    Macht für mich keinen Sinn.
    Entweder

    Visual Basic-Quellcode

    1. ActiveWindow.SelectedSheets.PrintPreview
    oder

    Visual Basic-Quellcode

    1. ActiveWindow.SelectedSheets.PrintOut


    bandchef schrieb:

    Ich hab aber nun das Problem, dass beim Drucken bzw. der Seitenansicht, dieses Makro anscheinend nicht aufgerufen wird
    Es wurde bestimmt einmal aufgerufen und ist dann in voriger Zeile abgestürzt.
    Da du aber vorher die Events disabled hast, kommt nie mehr ein Event.

    So etwas gehört abgefangen:

    Visual Basic-Quellcode

    1. Private Sub Workbook_BeforePrint(Cancel As Boolean)
    2. On Error Goto Done
    3. Application.EnableEvents = False
    4. ... 'hier der eigentliche Code
    5. Done:
    6. If Err.Number <> 0 Then
    7. 'Fehlerbehandlung, z.B.:
    8. MsgBox Err.Description
    9. End If
    10. Application.EnableEvents = True
    11. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich hab nun meinen Code soweit fertig und auch deinen Vorschlag mit dem Fehler abfangen integriert. Nun hab ich ein Klassenmodul erstellt in das ich diese Private-Funktion kopiert habe. Das Problem ist aber nun, dass ich eigentlich der Meinung bin, dass beim Klick auf Drucken/Seitenansicht diese Private-Funktion aufgerufen werden sollte. Was aber nicht der Fall ist. Das Klassenmodul hab ich "Bereich" genannt.

    Hier der Code:

    Visual Basic-Quellcode

    1. Private Sub Workbook_BeforePrint(Cancel As Boolean)
    2. Dim lastRow As Long, lastColumn As Long
    3. 'Fehler abfangen
    4. On Error GoTo Done
    5. Application.EnableEvents = False
    6. 'Eigentlicher Code
    7. With ActiveSheet
    8. 'Druckbereich aufheben
    9. .PageSetup.printArea = ""
    10. 'Feststellen Letzte Benutzte Zeile / Spalte
    11. lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    12. lastColumn = .Cells(lastRow, Columns.Count).End(xlToLeft).Column + 1
    13. 'Druckbereich setzen
    14. .PageSetup.printArea = .Range(.Cells(1, 1), .Cells(lastRow, lastColumn)).Address
    15. End With
    16. Done:
    17. If Err.Number <> 0 Then
    18. 'Fehlerbehandlung, z.B.:
    19. MsgBox Err.Description
    20. End If
    21. Application.EnableEvents = True
    22. End Sub



    Es wäre nett, wenn du mir sagen könntest, warum die Funktion nicht von alleine aufgerufen wird! Danke!
    Hi Leute,

    ich hab nun den Code in "Diese Arbeitsmappe" reinkopiert. Ein Haltepunkt wird auch erkannt. Wenn ich nun den Code ausführen lasse, dann passt mir Excel die Größe automatisch immer auf genau EINE Seite an. Das macht natürlich bei mehreren hunderten Zeilen wenig Sinn. Weiß jemand wie man eine feste Anzahl an Zeilen pro Blatt einstellen kann; welche Methode gibt's da? Das sollte doch über .pageSetup. ... einzustellen sein, oder? Wie aber kommt man an die entsprechende Methode ran? intelliSense gibts da leider keine...


    Ein weiteres Problem ist, dass ich nun so sporadisch Excel-Abstürze bekomme. Allerdings ist der Absturz "komisch". Immer wenn es wieder soweit ist, bekomme ich so ein kleines Windowsfenster in dem in der Titelleiste "Einzelschritt" steht. Es sind dann noch 8 Button angeordnet in dem Weiter, Zurück, Einzelschritt usw. steht. Bewirken tun die Buttons nix und Excel lässt sich nur über den TaskManager beenden!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „bandchef“ ()