Discussion:
printarea aus zwei Bereichen erzeugen
(zu alt für eine Antwort)
Hans Alborg
2014-08-17 10:50:41 UTC
Permalink
Hallo Gruppe,

<Excel 07>
für meine Printroutine markiere ich den Bereich einer großen Tabelle und
drücke dann einen Button.
Das erstellt ein Printarea des selektierten Bereichs und startet die
Druckvorschau.
Daraus starte ich dann den Ausdruck.

Alles prima soweit.

Nun fehlt mir aber der Tabellenkopf.
Daher habe ich in der Breite des selektierten Zellbereichs die Spalten
übernommen und möchte die Zeilen 1-8 davon mitdrucken.

Auch das klappt noch, aber!

Statt einer Seite (ist so eingestellt) werden zwei gedruckt. Sofern zwischen
Kopf und Selektion nicht mitgedruckte Bereiche liegen.

Ich hab die 2 Bereiche mit Union() verbunden.

Workaround wäre es, die beiden Bereiche auf ein Hilfsblatt untereinander zu
kopieren und dann erst als Printarea zu erfassen.
Najaaa.

Hier mal der komplette Code:
' -----------------------------------------------------
Sub Druckbereich_wahl()
Dim rngKopf As Range
If Len(Selection.Address) < 6 Then Exit Sub

Set rngKopf = Range(Cells(1, Selection.Cells(Selection.Rows.Count, 1). _
End(xlUp).Column), Cells(8, Selection.Cells(Selection.Rows.Count, 1). _
End(xlUp).Column + Selection.Columns.Count - 1))

Set rngKopf = Union(rngKopf, Selection.Cells)
rngKopf.Select
With ActiveSheet.PageSetup
.PrintArea = Selection.Address
.Orientation = IIf(Selection.Width > Selection.Height, _
xlLandscape, xlPortrait)
.Zoom = False
.FitToPagesTall = 1
.FitToPagesWide = 1
.BlackAndWhite = True
End With
ActiveSheet.Range("B32").Select
ActiveWindow.SelectedSheets.PrintPreview
End Sub
' -----------------------------------------------------
Geht das eleganter?

Auch meine Erfassung des Teils des Tabellenkopfes mit Gewinnung der Daten
aus dem selektierten Bereich kann sicher verbessert werden.

Hans
Claus Busch
2014-08-17 11:17:50 UTC
Permalink
Hallo Hans,
Post by Hans Alborg
Statt einer Seite (ist so eingestellt) werden zwei gedruckt. Sofern zwischen
Kopf und Selektion nicht mitgedruckte Bereiche liegen.
das wirst du mit zwei Bereichen auch nicht ändern können. Da du aber
immer die oberen 8 Zeilen zusätzlich haben möchtest, erkläre diese doch
zum Drucktitel (PrintTitleRows). Dann klappt es auch mit einer Seite:

Sub Druckbereich_wahl()

If Len(Selection.Address) < 6 Then Exit Sub

With ActiveSheet.PageSetup
.PrintTitleRows = "$1:$8"
.PrintArea = Selection.Address
.Orientation = IIf(Selection.Width > Selection.Height, _
xlLandscape, xlPortrait)
.Zoom = False
.FitToPagesTall = 1
.FitToPagesWide = 1
.BlackAndWhite = True
End With
ActiveWindow.SelectedSheets.PrintPreview
End Sub

Was willst du mit Len(Selection.Address)<6 errreichen?
Das geht auch mit
Selection.cells.count = 1 then exit sub


Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Hans Alborg
2014-08-17 12:32:27 UTC
Permalink
Hallo Claus,

"Claus Busch" schrieb...
Da du aber immer die oberen 8 Zeilen zusätzlich haben möchtest, erkläre
diese doch zum Drucktitel (PrintTitleRows). Dann klappt es auch mit einer
Das klappt ja bestens! Kommt demnach mit
< .PrintTitleRows = "$1:$8" >
die Breite je Selektion automatisch zustande?
Was willst du mit Len(Selection.Address)<6 errreichen?
Das geht auch mit
Selection.cells.count = 1 then exit sub
Das tut es. Sollte nur verhindern daß bei einer einzelnen gewählten Zelle
(aus Versehen) die Routine abläuft. Da kommt ja auch diese
Sicherheitsabfrage "Sie haben nur eine Zelle ausgewählt...".

Hans
Claus Busch
2014-08-17 12:45:28 UTC
Permalink
Hallo Hans,
Post by Hans Alborg
Das klappt ja bestens! Kommt demnach mit
< .PrintTitleRows = "$1:$8" >
die Breite je Selektion automatisch zustande?
PrintTitleRows wird immer in kompletten Zeilen angegeben. Die Breite
passt sich dem Druckbereich an.


Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Claus Busch
2014-08-17 12:53:28 UTC
Permalink
Hallo Hans,
Post by Hans Alborg
Das tut es. Sollte nur verhindern daß bei einer einzelnen gewählten Zelle
(aus Versehen) die Routine abläuft. Da kommt ja auch diese
Sicherheitsabfrage "Sie haben nur eine Zelle ausgewählt...".
du gibst Address ohne weitere Argumente an, d.h. es wird die abslute
Adresse genommen. Bei einer Selection im 3-stelligen Zeilenbereich hast
du dann aber auch mit einer Zelle die Länge 6 erfüllt:
$A$100


Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Hans Alborg
2014-08-17 18:45:58 UTC
Permalink
"Claus Busch" schrieb...
Post by Claus Busch
du gibst Address ohne weitere Argumente an, d.h. es wird die abslute
Adresse genommen. Bei einer Selection im 3-stelligen Zeilenbereich hast
du dann aber auch mit einer Zelle die Länge 6 erfüllt: $A$100

Das stimmt, meine Tabelle geht sogar bis Zeile 152...
Na, hätte ich es mit "If Len(Selection.Address) < 7..." probiert.

Deine Methode mit "Selection.cells.count = 1" gefällt mir aber besser.
Post by Claus Busch
PrintTitleRows wird immer in kompletten Zeilen angegeben. Die Breite passt
sich dem Druckbereich an.
Na gottseidank!

Die ganze Routine ist schön universell nutzbar. Einfach markieren was
interessiert, eine Seitenvorschau bekommen und drucken.
Ich hab's bereits in zwei meiner Mappen eingebaut :-)

Hans
Claus Busch
2014-08-17 18:53:33 UTC
Permalink
Hallo Hans,
Post by Hans Alborg
Die ganze Routine ist schön universell nutzbar. Einfach markieren was
interessiert, eine Seitenvorschau bekommen und drucken.
Ich hab's bereits in zwei meiner Mappen eingebaut :-)
danke für die Rückmeldung. Bin immer froh, wenn ich helfen konnte.


Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Lesen Sie weiter auf narkive:
Loading...