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

PrintOut und Kopf- & Fußzeilen in VBA

Forumthread: PrintOut und Kopf- & Fußzeilen in VBA

PrintOut und Kopf- & Fußzeilen in VBA
bert
Hallo Leute,
ich habe ein etwas eigenartiges Problem.
Ich verändere die Kopf- & Fußzeilen mittels VBA, um diese Daten immer so anzuzeigen.
Im Normalbetrieb (Seitenansicht und Einzelseitendruck) geht es ohne Probleme mit der Sub:
  • 
    Private Sub Workbook_BeforePrint(Cancel As Boolean)
    On Error GoTo fehler:
    Dim wsSheet As Worksheet
    With ActiveSheet.PageSetup
    .LeftHeader = "Text 1…"
    .CenterHeader = "Text 2 …"
    .RightHeader = "&D"   'Datum
    .RightFooter = "Tabelle: &A"
    End With
    Exit Sub
    fehler:
    'für Fehler alter Versionen
    Resume Next
    End Sub
    

  • Nun will ich viele Tabellen drucken (eine Tabelle wird mit Werten gefüllt und soll dann gedruckt werden, wenn der Nutzer will)
    Wenn ich diese Tabelle in einem Makro mit
    Worksheets("Daten").PrintOut
    ausdrucken will, bringt er alles durcheinander: Kopf rechts kommt nach links, Mitte-Kopf kommt nach unten, teilweise wird es durchgestrichen…
    Ich habe auch schon mit Warteschleifen und mit Application.Wait (Now + TimeValue("0:00:05")) alles etwas verlangsamt, aber ohne Erfolg.
    Hat jemand eine Idee, woran das liegen kann oder wie man das umgehen kann?
    Anzeige

    3
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Benutzer
    Anzeige
    AW: PrintOut und Kopf- & Fußzeilen in VBA
    05.05.2010 13:23:18
    fcs
    Hallo bert,
    das Durcheinander der verschiedenen Kopf-/Fusszeilen-Elemente kann ich nicht nachvollziehen.
    Wenn ein/mehrere Blätter per Makro gedruckt werden oder wenn gruppierte Blätter gedruckt werden, dann wird bei deinem Makro nur im aktiven Blatt die Kopf-/Fusszeile angepasst.
    Damit alle Blätter erfasst werden muss du etwas umbauen. Du benötigst eine separate Prozedur zum Einrichten der Seiten. Diese muss dann vor dem Drucken in den Druckmakros aufgerufen werden und in der Before_Print-Prozedur. In der Befor_Print-Prozedur müssen zusätzlich die Namen selektierten Blätter aufbereitet werden, um auch bei gruppierten Blätter alle Kopf-/Fusszeilen zu aktualisieren.
    Gruß
    Franz
    '### Code in einem allgemeinen Modul ###
    'Erstellt unter Excel 2007
    Option Explicit
    Sub aaSeitenvorschau()
    'Seitenvorschau direkt aus Makro - mehrere Blätter
    SeiteEinrichten (Array("Daten", "Tabelle3"))
    Worksheets(Array("Daten", "Tabelle3")).PrintPreview
    End Sub
    Sub aaDrucken()
    'Drucken direkt aus Makro - ein Blatt
    SeiteEinrichten (Array("Daten"))
    Worksheets(Array("Daten")).PrintOut
    End Sub
    Public Sub SeiteEinrichten(arrSheets)
    Dim iSheet As Long
    On Error Resume Next
    For iSheet = LBound(arrSheets) To UBound(arrSheets)
    With Sheets(arrSheets(iSheet)).PageSetup
    .LeftHeader = "Text 1…"
    .CenterHeader = "Text 2 …"
    .RightHeader = "&D"   'Datum
    .RightFooter = "Tabelle: &A"
    End With
    Next
    End Sub
    '### Code in DieseArbeitsmappe   ###
    Option Explicit
    Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Dim arrBlatt(), intI As Long, oSheet As Object
    On Error GoTo fehler:
    'selektierte Blattnamen in einem Array erfassen
    For Each oSheet In ActiveWindow.SelectedSheets
    intI = intI + 1
    ReDim Preserve arrBlatt(1 To intI)
    arrBlatt(intI) = oSheet.Name
    Next
    Call SeiteEinrichten(arrSheets:=arrBlatt)
    Exit Sub
    fehler:
    'für Fehler alter Versionen
    Resume Next
    End Sub
    

    Anzeige
    AW: PrintOut und Kopf- & Fußzeilen in VBA
    06.05.2010 08:25:41
    bert
    Hallo Franz,
    vielen Dank für die Antwort. Ich habe den Code in einer leeren Datei unter Excel 2003 getestet: ohne Probleme. Dann habe ich den Code in meine Anwendung gebracht und der gleiche Fehler tritt wieder auf.
    Dazu muss man sagen: ich arbeite nur mit einer Datenseite (Tabelle), welche aus einer anderen Tabelle die Daten erhält, also immer wieder neu befüllt wird (eigentlich wie eine Datenbank). Diese Datenseite wird eigentlich mit immer einzeln gefüllt - bearbeitet - gespeichert - (gedruckt).
    Wenn alle Daten fertig sind, sollen alle ausgedruckt werden - und das eben mit dem Makro. Und dabei kommen die Angaben durcheinander.
    Ich werde das auch mal unter Version 2007 testen, vielleicht ist es ja auch ein Problem von 2003.
    Vielen Dank
    Gruß bert
    Anzeige
    AW: PrintOut und Kopf- & Fußzeilen in VBA
    06.05.2010 11:05:24
    fcs
    Hallo bert,
    die Tatsache, dass die Prozeduren in einer leeren Datei funktionieren und in deiner Originaldatei nicht, deutet darauf hin, dass während des Druckvorgangs noch irgendwelche anderen Sachen passieren, die den Ablauf stören.
    Ich konnte jetzt unter Excel 2003 übrigens das von dir beobachtete Choas reproduzieren. Bei dem Versuch, das gleiche Blatt in einer For-Next-Schleife mit unterschiedlichen Daten zu drucken, wurden die Kopf-/Fusstexte auf die verschiedensten Arten verunstaltet.
    Ich hab die Makros nochmals umgebaut. So wird beim Drucken per Makro die BeforePrint-Anweisung übersprungen. In jedem Makro in dem die Seitenvorschau oder das Drucken gestartet wird, muss dann eine als Public deklarierte Variable vor dem Drucken gesetzt werden und nach dem Drucken zurückgesetzt werden.
    Gruß
    Franz
    '### Code in einem allgemeinen Modul ###
    Public bolDruckenmakro As Boolean
    Option Explicit
    'Beispielmakros Drucken/Seitenvorschau
    Sub aaSeitenvorschau()
    'Seitenvorschau direkt aus Makro - mehrere Blätter
    bolDruckenmakro = True
    SeiteEinrichten (Array("Daten", "Tabelle3"))
    Worksheets(Array("Daten", "Tabelle3")).PrintPreview
    bolDruckenmakro = False
    End Sub
    Sub aaDrucken()
    'Drucken direkt aus Makro - ein Blatt
    bolDruckenmakro = True
    SeiteEinrichten (Array("Daten"))
    Worksheets(Array("Daten")).PrintOut
    bolDruckenmakro = False
    End Sub
    Sub aaaVorschauTab3()
    'Druckvorschau direkt aus Makro - ein Blatt mehrfach mit unterschiedlichen Daten
    Dim Zeile
    bolDruckenmakro = True
    For Zeile = 2 To 8
    Worksheets("Tabelle3").Cells(1, 2) = Worksheets("Daten").Cells(Zeile, 1)
    SeiteEinrichten (Array("Tabelle3"))
    Worksheets(Array("Tabelle3")).PrintPreview
    Next
    bolDruckenmakro = False
    End Sub
    'Makro zum Einrichten der Seiten vor dem Drucken
    Public Sub SeiteEinrichten(arrSheets)
    Dim iSheet As Long, sFootL As String
    On Error Resume Next
    For iSheet = LBound(arrSheets) To UBound(arrSheets)
    With Sheets(arrSheets(iSheet)).PageSetup
    .LeftHeader = "Text 1…"
    .CenterHeader = "Text 2 …"
    .RightHeader = "&D"   'Datum
    .RightFooter = "Tabelle: &A"
    End With
    Next
    End Sub
    'Prozedur in DieseArbeitsmappe
    Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Dim arrBlatt(), intI As Long, oSheet As Object
    On Error GoTo fehler:
    If bolDruckenmakro = False Then
    'selektierte Blattnamen in einem Array erfassen
    For Each oSheet In ActiveWindow.SelectedSheets
    intI = intI + 1
    ReDim Preserve arrBlatt(1 To intI)
    arrBlatt(intI) = oSheet.Name
    Next
    Call SeiteEinrichten(arrSheets:=arrBlatt)
    End If
    Exit Sub
    fehler:
    'für Fehler alter Versionen
    Resume Next
    End Sub
    

    Anzeige
    ;
    Anzeige
    Anzeige

    Infobox / Tutorial

    PrintOut und Kopf- & Fußzeilen in VBA


    Schritt-für-Schritt-Anleitung

    Um Deine Kopf- und Fußzeilen in Excel mittels VBA anzupassen und den PrintOut-Prozess zu optimieren, folge diesen Schritten:

    1. Öffne den VBA-Editor: Drücke ALT + F11.

    2. Erstelle ein neues Modul: Klicke mit der rechten Maustaste auf "VBAProject (DeinWorkbookName)", wähle "Einfügen" und dann "Modul".

    3. Füge den folgenden Code ein:

      '### Code in einem allgemeinen Modul ###
      Public bolDruckenmakro As Boolean
      Option Explicit
      
      Sub aaDrucken()
         bolDruckenmakro = True
         SeiteEinrichten (Array("Daten"))
         Worksheets(Array("Daten")).PrintOut
         bolDruckenmakro = False
      End Sub
      
      Public Sub SeiteEinrichten(arrSheets)
         Dim iSheet As Long
         On Error Resume Next
         For iSheet = LBound(arrSheets) To UBound(arrSheets)
             With Sheets(arrSheets(iSheet)).PageSetup
                 .LeftHeader = "Text 1…"
                 .CenterHeader = "Text 2 …"
                 .RightHeader = "&D"   'Datum
                 .RightFooter = "Tabelle: &A"
             End With
         Next
      End Sub
      
      Private Sub Workbook_BeforePrint(Cancel As Boolean)
         Dim arrBlatt(), intI As Long, oSheet As Object
         On Error GoTo fehler:
         If bolDruckenmakro = False Then
             For Each oSheet In ActiveWindow.SelectedSheets
                 intI = intI + 1
                 ReDim Preserve arrBlatt(1 To intI)
                 arrBlatt(intI) = oSheet.Name
             Next
             Call SeiteEinrichten(arrSheets:=arrBlatt)
         End If
         Exit Sub
      fehler:
         Resume Next
      End Sub
    4. Passen den Code an: Stelle sicher, dass Du die Blattnamen und Inhalte in den Kopf- und Fußzeilen nach Deinen Bedürfnissen anpasst.

    5. Testen: Führe das Makro aaDrucken aus, um die Druckausgabe zu prüfen.


    Häufige Fehler und Lösungen

    • Problem: Kopf- und Fußzeilen werden beim Drucken durcheinandergebracht.

      • Lösung: Stelle sicher, dass die Workbook_BeforePrint-Prozedur die Kopf- und Fußzeilen für alle ausgewählten Blätter korrekt einrichtet, bevor der Druckvorgang beginnt. Wenn der Fehler weiterhin auftritt, überprüfe, ob andere Makros den Druckprozess stören.
    • Problem: Die Kopfzeilen werden nicht richtig angezeigt.

      • Lösung: Überprüfe den Code in der SeiteEinrichten-Prozedur und stelle sicher, dass die Header und Footer korrekt gesetzt sind.

    Alternative Methoden

    Wenn Du Schwierigkeiten mit dem Standard-PrintOut VBA hast, kannst Du auch die PrintPreview-Methode verwenden, um die Darstellung vor dem Drucken zu überprüfen. Hier ein Beispiel:

    Sub aaSeitenvorschau()
        bolDruckenmakro = True
        SeiteEinrichten (Array("Daten"))
        Worksheets(Array("Daten")).PrintPreview
        bolDruckenmakro = False
    End Sub

    Diese Methode zeigt Dir eine Vorschau, bevor das endgültige PrintOut erfolgt.


    Praktische Beispiele

    1. Drucken mehrerer Blätter:

      Sub aaDruckenMehrere()
         bolDruckenmakro = True
         SeiteEinrichten (Array("Daten", "Tabelle3"))
         Worksheets(Array("Daten", "Tabelle3")).PrintOut
         bolDruckenmakro = False
      End Sub
    2. Drucken mit variierenden Daten:

      Sub aaaVorschauTab3()
         Dim Zeile
         bolDruckenmakro = True
         For Zeile = 2 To 8
             Worksheets("Tabelle3").Cells(1, 2) = Worksheets("Daten").Cells(Zeile, 1)
             SeiteEinrichten (Array("Tabelle3"))
             Worksheets(Array("Tabelle3")).PrintPreview
         Next
         bolDruckenmakro = False
      End Sub

    Tipps für Profis

    • Verwendung von Variablen: Deklariere globale Variablen, um Statusinformationen zwischen den Prozeduren zu übermitteln.
    • Fehlerbehandlung: Implementiere eine robuste Fehlerbehandlung, um Probleme beim Drucken zu identifizieren und zu beheben.
    • Dynamische Anpassungen: Stelle sicher, dass Deine Kopf- und Fußzeilen dynamisch anpassbar sind, je nach den Daten, die Du drucken möchtest.

    FAQ: Häufige Fragen

    1. Was kommt in Kopf und Fußzeile? In der Kopfzeile kannst Du beispielsweise den Titel des Dokuments oder das Datum einfügen. In der Fußzeile bietet sich die Seitennummerierung oder der Name des Arbeitsblatts an.

    2. Wie kann ich mehrere Blätter gleichzeitig drucken? Verwende ein Makro, das alle gewünschten Blätter in einem Array auflistet und die PrintOut-Methode aufruft, um alles gleichzeitig zu drucken. Achte darauf, die Kopf- und Fußzeilen vorher korrekt einzurichten.

    3. Funktioniert das auch in Excel 2003? Ja, der bereitgestellte VBA-Code sollte sowohl in Excel 2003 als auch in späteren Versionen funktionieren. Achte jedoch darauf, dass einige Funktionen möglicherweise leicht variieren können.

    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