Discussion:
unterschiedliche Kopfzeilen auf gedruckten Seiten
(zu alt für eine Antwort)
Marcus Himsel
2004-01-07 14:58:53 UTC
Permalink
Hallo,

ist es möglich, die Kopfzeile im Ausdruck abhängig von einer oder mehreren bestimmten Zelle(n) auf jeder Seite erstellen zu lassen?

Ich will hier ein Dokument mit ca. 120 Seiten drucken und ähnlich einem Lexikon eine "von - bis"-Angabe in die Kopfzeile schreiben lassen, damit man sich in dem großen Ausdruck besser zurecht findet. Die Informationen, die dann in der Kopfzeile stehen sollen, befinden sich untereinander in den Zellen D2-D9009.

Danke für Hilfe, Marcus.
Michael Schüller
2004-01-07 18:50:03 UTC
Permalink
Hallo Marcus,
Post by Marcus Himsel
ist es möglich, die Kopfzeile im Ausdruck abhängig von einer oder
mehreren bestimmten Zelle(n) auf jeder Seite erstellen zu lassen?
Ich will hier ein Dokument mit ca. 120 Seiten drucken und ähnlich
einem Lexikon eine "von - bis"-Angabe in die Kopfzeile schreiben
lassen, damit man sich in dem großen Ausdruck besser zurecht findet.
Die Informationen, die dann in der Kopfzeile stehen sollen, befinden
sich untereinander in den Zellen D2-D9009.
Kannst Du IMHO nur per VBA lösen, indem der Code jede Seite einzeln ausdruckt und vorher eine entsprechende Anpassung der Kopfzeile
vornimmt.

Wenn Du daran interessiert bist, sag nochmal Bescheid. Schreib dann bitte auch, welche Zellen z.B. für die Kopfzeile der Seite 1
genutzt werden sollen.


Schönen Gruß
--
Michael
***@gmx.de
Marcus Himsel
2004-01-08 08:00:37 UTC
Permalink
Post by Michael Schüller
Post by Marcus Himsel
ist es möglich, die Kopfzeile im Ausdruck abhängig von einer oder
mehreren bestimmten Zelle(n) auf jeder Seite erstellen zu lassen?
Kannst Du IMHO nur per VBA lösen, indem der Code jede Seite einzeln ausdruckt und vorher eine entsprechende Anpassung der Kopfzeile
vornimmt.
Wenn Du daran interessiert bist, sag nochmal Bescheid. Schreib dann bitte auch, welche Zellen z.B. für die Kopfzeile der Seite 1
genutzt werden sollen.
Ich bin zwar mit VBA nicht firm, aber das würde ich schon hinbekommen. Es sollen auf jeder Seite, also auch auf der ersten, der Inhalt der jeweils ersten und letzten Zelle in Spalte D ausgegeben werden. Allerdings habe ich jetzt noch die erste Zeile als Wiederholungszeile eingerichtet. Das ist aber keine Bedingung; ich könte mir vorstellen, dass das ganze dann noch etwas schwieriger werden könnte.
Post by Michael Schüller
Schönen Gruß
--
Michael
Danke schon mal und sorry für den katastrophalen Zeilenumbruch --> ***@work ist Schuld...
Marcus.
Michael Schüller
2004-01-09 19:25:26 UTC
Permalink
Hallo Marcus,
Post by Marcus Himsel
Ich bin zwar mit VBA nicht firm, aber das würde ich schon
hinbekommen. Es sollen auf jeder Seite, also auch auf der ersten, der
Inhalt der jeweils ersten und letzten Zelle in Spalte D ausgegeben
werden. Allerdings habe ich jetzt noch die erste Zeile als
Wiederholungszeile eingerichtet. Das ist aber keine Bedingung; ich
könte mir vorstellen, dass das ganze dann noch etwas schwieriger
werden könnte.
Nö, unwesentlich. Im folgenden Code wird die Zeile für die Kopfzeile der ersten Seite vorbelegt. Normalerweise wäre das 1, in Deinem
Szenario ist es halt 2. Hast Du zwei Wiederholungszeilen, änderst Du's einfach in 3 ab, usw. usf.

Füge den folgenden Code in ein Modul ein.


Option Explicit

Sub sPrint()
Dim vRow As Long
Dim vPages As Integer
Dim vCounter As Integer
Dim vHeader As String


'vorbelegen
vRow = 2 'nicht 1, da erste Zeile = Wiederholungszeile

With ThisWorkbook.Sheets(1)

'Anzahl der Seiten ermitteln
'= Anzahl Seitenumbrüche + 1
vPages = .HPageBreaks.Count + 1

'letzte Zeile aktivieren (sonst sind nicht alle HPageBreaks ansteuerbar)
.Range("A" & .UsedRange.Rows.Count).Select

'Seiten schleifenweise abarbeiten
For vCounter = 1 To vPages

'Zelle "erste Zeile in Spalte D" der aktuellen Seite auslesen
vHeader = .Cells(vRow, 4)

If vCounter < vPages Then
vRow = .HPageBreaks(vCounter).Location 'nächsten Seitenumbruch ermitteln
Else
vRow = .UsedRange.Rows.Count + 1 'letzte genutzte Zeile auslesen, falls letzte Seite
End If

'Zelle "letzte Zeile in Spalte D" der aktuellen Seite auslesen
vHeader = vHeader & " - " & .Cells(vRow - 1, 4)

'"linke" Kopfzeile festlegen, mittlere und rechte löschen
With .PageSetup
.LeftHeader = vHeader
.CenterHeader = ""
.RightHeader = ""
End With

'aktuelle Seite ausdrucken
.PrintOut From:=vCounter, To:=vCounter

Next vCounter

End With

MsgBox "Ausdruck fertig"

End Sub


Allerdings ist mir unerklärlich, warum die Zeile
.Range("A" & .UsedRange.Rows.Count).Select
nötig ist.

Ich werde dazu mal einen neuen NG-Beitrag aufmachen.


Hoffe, ich konnte Dir helfen.

Schönen Gruß
--
Michael
***@gmx.de
Marcus Himsel
2004-01-12 07:16:53 UTC
Permalink
Post by Michael Schüller
Füge den folgenden Code in ein Modul ein.
[..]
Allerdings ist mir unerklärlich, warum die Zeile
.Range("A" & .UsedRange.Rows.Count).Select
nötig ist.
Genau in der Zeile bekomme ich dann auch die Meldung: "Laufzeitfehler '1004': Die Select-Methode des Range-Objektes ist fehlerhaft." - no idea...
Post by Michael Schüller
Ich werde dazu mal einen neuen NG-Beitrag aufmachen.
...zu dem ja bisher leider noch keine Antworten gekommen sind!
Post by Michael Schüller
Hoffe, ich konnte Dir helfen.
Vielen Dank trotzdem erstmal, vielleicht kann man mir ja noch weiterhelfen, Gruß vom Marcus.
Michael Schüller
2004-01-12 20:52:38 UTC
Permalink
Hallo Marcus,
Post by Marcus Himsel
Post by Michael Schüller
Allerdings ist mir unerklärlich, warum die Zeile
.Range("A" & .UsedRange.Rows.Count).Select
nötig ist.
Genau in der Zeile bekomme ich dann auch die Meldung: "Laufzeitfehler
'1004': Die Select-Methode des Range-Objektes ist fehlerhaft." - no
idea...
a) der Code steuert das _erste_ Sheet an. Stehen da auch Deine Daten drin? Oder ist das erste Tabellenblatt bei Dir eventuell leer?

b) lass die Zeile spaßeshalber mal weg

c) wenn der Fehler auftritt
- wähle "Debuggen"
- markiere .UsedRange.Rows.Count
- drücke Shift + F9
Was wird bei Dir unter "Wert" zurückgegeben?


Schönen Gruß
--
Michael
***@gmx.de
Marcus Himsel
2004-01-13 06:58:02 UTC
Permalink
Post by Michael Schüller
a) der Code steuert das _erste_ Sheet an. Stehen da auch Deine Daten drin? Oder ist das erste Tabellenblatt bei Dir eventuell leer?
Ok, das war mein Fehler; ich war im zweiten Sheet. Allerdings hab ich jetzt das Problem, dass sofort eine Seite ausgedruckt wird - leider aber _nur_ die erste Seite, auf der in der Kopfzeile links "D1 - D11931" angezeigt wird. Also der Inhalt der ersten Zelle in der Spalte D (wie gewünscht) und der allerletzten beschriebene Zelle in dieser Spalte (das ist D11931).

Ich wage ja kaum zu fragen: ist da noch was zu machen?!
Post by Michael Schüller
Schönen Gruß
--
Michael
Schon mal vielen Dank vom Marcus.
Michael Schüller
2004-01-15 17:22:11 UTC
Permalink
Hallo Marcus,
Post by Marcus Himsel
Ok, das war mein Fehler; ich war im zweiten Sheet. Allerdings hab ich
jetzt das Problem, dass sofort eine Seite ausgedruckt wird - leider
aber _nur_ die erste Seite, auf der in der Kopfzeile links "D1 -
D11931" angezeigt wird. Also der Inhalt der ersten Zelle in der
Spalte D (wie gewünscht) und der allerletzten beschriebene Zelle in
dieser Spalte (das ist D11931).
Ist im Prinzip das gleiche Problem in Grün. Der Code findet hier überhaupt keine Seitenumbrüche.
Post by Marcus Himsel
Ich wage ja kaum zu fragen: ist da noch was zu machen?!
Schaumama und versuchen's mal anders. Der folgende Code verlässt sich nicht auf die HPageBreaks-Auflistung, sondern geht alle Zeilen
durch und prüft selber, ob die Zeile einen Seitenumbruch enthält.

Funktioniert aber nur, wenn Deine Tabelle keine _vertikalen_ Seitenumbrüche enthält, also von der Breite her auf eine Seite passt.
Ist das bei Dir nicht der Fall, sag nochmal Bescheid. Das müsste auch machbar sein.


Sub sPrint2()
Const cFirstRow As Byte = 2 'nicht 1, da erste Zeile = Wiederholungszeile
Dim vRow As Long
Dim vUsedRows As Long
Dim vPage As Integer
Dim vHeader As String


With ThisWorkbook.Sheets(1)

'vorbelegen
vHeader = .Cells(cFirstRow, 4)

vUsedRows = .UsedRange.Rows.Count

'alle Zeilen schleifenweise prüfen
For vRow = cFirstRow To vUsedRows

'nächsten Seitenumbruch finden
Do While .Rows(vRow).PageBreak = xlPageBreakNone And vRow <= vUsedRows
vRow = vRow + 1
Loop

'nächste auszudruckende Seite festlegen
vPage = vPage + 1

'Spalte D in Zeile vor aktuellem Seitenumbruch auslesen
vHeader = vHeader & " - " & .Cells(vRow - 1, 4)

'"linke" Kopfzeile festlegen, mittlere und rechte löschen
With .PageSetup
.LeftHeader = vHeader
.CenterHeader = ""
.RightHeader = ""
End With

'aktuelle Seite ausdrucken
.PrintOut From:=vPage, To:=vPage

'Spalte D in aktueller Zeile für nächsten Headeranfang auslesen
vHeader = .Cells(vRow, 4)

Next vRow

End With

MsgBox "Ausdruck fertig"

End Sub


Hoffe, das funktioniert besser.

Schönen Gruß
--
Michael
***@gmx.de
Loading...