Beitrag aus SmartTools Excel Weekly
Kopfzeilen beim Ausdruck mehrerer Tabellenblätter dynamisch füllen
Excel 365 2024 2021 2019 2016 2013
FRAGE Ich habe noch eine Frage zu Ihrer Makrolösung, die beim Drucken eines Tabellenblatts den Inhalt einer Tabellenzelle in die Kopfzeile übernimmt: Der Code funktioniert nur beim Drucken des jeweils angegebenen Tabellenblatts. Ich habe aber mehrere Tabellenblätter, die ich gemeinsam drucken möchte. In diesem Fall sollen die Kopfzeilen aller Blätter dynamisch mit Zellinhalten gefüllt werden. Ist das auch möglich?
K. Schütz
ANTWORT Das Makro, das wir seinerzeit vorgestellt hatten, lässt sich problemlos dahingehend erweitern, dass die Kopfzeilen mehrerer Tabellenblätter dynamisch mit Zellinhalten befüllt werden.
Wenn Sie zum Beispiel eine Arbeitsmappe mit den drei Tabellenblättern "Rechnung", "Angebot" und "Lieferschein" haben und möchten, dass im linken Bereich der Kopfzeile der Inhalt aus Zelle C12 des jeweiligen Tabellenblatts steht, passen Sie die Makrolösung folgendermaßen an:
- Wechseln Sie aus Ihrer Excel-Arbeitsmappe mit Alt + F11 in die Entwicklungsumgebung.
- Doppelklicken Sie im Projekt-Explorer auf das Modul "DieseArbeitsmappe" der aktuellen Datei.
- Im zugehörigen Codefenster wählen Sie aus den Dropdownfeldern wieder "Workbook" und "BeforePrint" aus.
- Die entsprechende Ereignisprozedur füllen Sie nun mit folgendem VBA-Code:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim shPrintSheet As Worksheet
Dim objPgSetup As PageSetup
Dim strSheets As String
Dim arrSheetNames() As String
Dim strHdrText As String
Dim i As Long
On Error GoTo Header_End
strSheets = "Rechnung,Angebot,Lieferschein"
arrSheetNames = Split(strSheets, ",")
For i = 0 To 2
Set shPrintSheet = ThisWorkbook.Sheets(arrSheetNames(i))
strHdrText = shPrintSheet.Range("C12").Text
Set objPgSetup = shPrintSheet.PageSetup
objPgSetup.LeftHeader = strHdrText
Next i
Header_End:
Set objPgSetup = Nothing
Set shPrintSheet = Nothing
Exit Sub
End Sub
Die Namen der Tabellenblätter geben Sie als kommagetrennte Liste ein und übergeben sie der Variablen "strSheets". Mit einer Split-Funktion teilen Sie die Liste in die einzelnen Namen auf und erstellen daraus das Array "arrSheetNames", das in diesem Fall aus den drei Tabellennamen besteht.
In der For-Schleife bearbeiten Sie dann jedes Array-Element (Arrays sind Null-basiert, deshalb eine Schleife von 0 bis 2), um die Kopfzeile für jedes Tabellenblatt aus der Namensliste mit dem Inhalt aus Zelle C12 zu befüllen.
So werden die Kopfzeilen der Tabellenblätter bei jedem Druckvorgang automatisch aktualisiert.
Aber vielleicht wollen Sie gar nicht den Zellinhalt aus dem jeweiligen Tabellenblatt in die Kopfzeile übernehmen, sondern nur den Inhalt einer ganz bestimmten Zelle in einem ganz bestimmten Blatt. Womöglich soll im Beispiel der Inhalt aus Zelle C12 des Blatts "Rechnung" in den Kopfzeilen aller Tabellenblätter erscheinen.
Das erreichen Sie mit einer kleinen Anpassung des Makros. Dabei bestimmen Sie den gewünschten Kopfzeilentext, bevor Sie die For-Schleife ausführen:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim shPrintSheet As Worksheet
Dim objPgSetup As PageSetup
Dim strSheets As String
Dim arrSheetNames() As String
Dim strHdrText As String
Dim i As Long
On Error GoTo Header_End
Set shPrintSheet = ThisWorkbook.Sheets("Rechnung")
strHdrText = shPrintSheet.Range("C12").Text
strSheets = "Rechnung,Angebot,Lieferschein"
arrSheetNames = Split(strSheets, ",")
For i = 0 To 2
Set shPrintSheet = ThisWorkbook.Sheets(arrSheetNames(i))
Set objPgSetup = shPrintSheet.PageSetup
objPgSetup.LeftHeader = strHdrText
Next i
Header_End:
Set objPgSetup = Nothing
Set shPrintSheet = Nothing
Exit Sub
End Sub