Microsoft office excel VBA Makro zum Drucken versch Druckbereiche?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Druckbereiche können anscheinend nur rechteckig sein und brauchen je eine Seite.

Möglicherweise bleibt nichts anderes übrig, als entweder die gewünschten Bereiche in ein neues Tabellenblatt zu kopieren oder die nicht gewünschten Bereiche temporär zu löschen. (Einzelne Zellen ausblenden geht nicht)

Woher ich das weiß:Berufserfahrung – Software-Entwickler

Joergrambl 
Fragesteller
 29.11.2017, 21:58

die antwort versteh ich nicht ganz.

Es soll ja auch rechteckig sein und eine seite verbrauchen. das ist gewünscht.

Jedoch soll durchs vba eben durch das ankreuzen der versch checkbxoen welche für versch druckbereiche stehen eben jeder druckbereich einzelnt nacheinander gedruckt werden.

0
PWolff  29.11.2017, 22:02
@Joergrambl

Zeichne ein Makro auf, bei dem du mehrere Male "Zu Druckbereich hinzufügen" auswählst. Dann kannst du erkennen, wie mehrere Bereiche zu einem Druckbereich zusammengefasst werden.

Das gibt dann so was wie

ActiveSheet.PageSetup.PrintArea="$A$6:$G$13,$C$17:$E$19,$F$3:$G$12"

d. h. die einzelnen Bereiche werden mit Kommas getrennt.

Diesen String kannst du dir vom Makro zusammensetzen lassen.

0
Joergrambl 
Fragesteller
 29.11.2017, 22:14
@PWolff

Da kommt sowas raus.

Die Frage ist nur wo genau und wie füg ich das jetzt im Code meiner UserForm ein damit es sich auf die checkboxen bezieht?

Also ja die werden wohl addiert.

Aber in meinem userform

steht ja jede check box für eine range.


Jetzt müsste also das programm für jede angeklickte checkbox anschließend die miteinader addieren.

ABER wie geht eine solche formel?


ActiveSheet.PageSetup.PrintArea = "$D$5:$G$12"
Range("D17:G25").Select
ActiveSheet.PageSetup.PrintArea = "$D$5:$G$12,$D$17:$G$25"
Range("D31:G38").Select
ActiveSheet.PageSetup.PrintArea = "$D$5:$G$12,$D$17:$G$25,$D$31:$G$38"
0
Joergrambl 
Fragesteller
 29.11.2017, 22:18
@Joergrambl

noch zur ergänzung, die formeln für die checkboxen sehen so aus:

Die ranges sind natürlich anders hier nur fürs beispiel.

Wenn ich jetzt aber mehrere checkboxen anwähle wird beim drucken eben nur die range vom letzten gedrückten ausgedruckt, jetzt müsste das programm also noch alle gedrückten boxen die ranges addieren.

ABer wie? mit welcher formel bekomm ich das hin

Private Sub CheckBox1_Click()
ActiveSheet.PageSetup.PrintArea = "A12:BU64"
End Sub
Private Sub CheckBox2_Click()
ActiveSheet.PageSetup.PrintArea = "B12:BU64"
End Sub
Private Sub CheckBox3_Click()
ActiveSheet.PageSetup.PrintArea = "D12:BU64"
End Sub
0
PWolff  29.11.2017, 22:19
@Joergrambl

Ich würde den String in einer eigenen Variablen zusammenfassen - was Excel im Hintergrund noch so alles macht, wenn man die PrintArea setzt, weiß man ja nicht so genau.

Also:

Dim PrintAreaString As String
PrintAreaString = ""
If CheckBox1.Value = 1 Then PrintAreaString = PrintAreaString + "$D$5:$G$12" + ","
If CheckBox2.Value = 1 Then PrintAreaString = PrintAreaString + "$D$17:$G$25" + ","
...
If Right$(PrintAreaString, 1) = "," Then PrintAreaString = Left$(PrintAreaString, Len(PrintAreaString) - 1) 'ggf. letztes Komma entfernen
ActiveSheet.PageSetup.PrintArea = PrintAreaString
1
PWolff  29.11.2017, 22:28
@PWolff

Dann schreibst du in alle "Click-Ereignishandler" nur noch den Aufruf dieser Prozedur rein, z. B.:

Private Sub CheckBox2_Click()
PrintAreaZusammenstellen
End Sub

Die Prozedur PrintAreaZusammenstellen sieht dann so aus:

Private Sub PrintAreaZusammenstellen
Dim PrintAreaString As String
PrintAreaString = ""
If CheckBox1.Value = 1 Then PrintAreaString = PrintAreaString + "$D$5:$G$12" + ","
If CheckBox2.Value = 1 Then PrintAreaString = PrintAreaString + "$D$17:$G$25" + ","
...
If Right$(PrintAreaString, 1) = "," Then PrintAreaString = Left$(PrintAreaString, Len(PrintAreaString) - 1) 'ggf. letztes Komma entfernen
ActiveSheet.PageSetup.PrintArea = PrintAreaString
End Sub
1
Joergrambl 
Fragesteller
 29.11.2017, 22:29
@PWolff

und wo genau setzt ich den code ein?

muss ich die codes für die checkboxen dann löschen

der druck button code sieht so aus, kommt das da mit rein?:

Private Sub CommandButton1_Click()
ActiveSheet.Protect UserInterfaceOnly:=True
With ActiveSheet.PageSetup
.Zoom = False
.Orientation = xlPortrait
.FitToPagesWide = 1
.FitToPagesTall = 1
.LeftMargin = Application.InchesToPoints(0#)
.RightMargin = Application.InchesToPoints(0#)
.BottomMargin = Application.InchesToPoints(0#)

End With
Application.Dialogs(xlDialogPrint).Show
End Sub
0
Joergrambl 
Fragesteller
 29.11.2017, 22:40
@Joergrambl

sorry, hab dein kommentar nicht gesehen. Das kommentar oben also ignorerien.

Habs jetzt so gemacht, funktioniert jedoch leider nicht, egal was man anklickt es wird einfach der komplette druckbereich ausgedruckt. Der fertige code sieht jetz so aus:

Private Sub CheckBox1_Click()
PrintAreaZusammenstellen
End Sub

Private Sub CheckBox2_Click()
PrintAreaZusammenstellen
End Sub

Private Sub CheckBox3_Click()
PrintAreaZusammenstellen
End Sub

Private Sub PrintAreaZusammenstellen()
Dim PrintAreaString As String
PrintAreaString = ""
If CheckBox1.Value = 1 Then PrintAreaString = PrintAreaString + "$A$1:$C$5" + ","
If CheckBox2.Value = 1 Then PrintAreaString = PrintAreaString + "$A$11:$C$14" + ","
If CheckBox3.Value = 1 Then PrintAreaString = PrintAreaString + "$A$18:$C$22"
If Right$(PrintAreaString, 1) = "," Then PrintAreaString = Left$(PrintAreaString, Len(PrintAreaString) - 1) 'ggf. letztes Komma entfernen
ActiveSheet.PageSetup.PrintArea = PrintAreaString
End Sub

Private Sub CommandButton1_Click()
ActiveSheet.Protect UserInterfaceOnly:=True
With ActiveSheet.PageSetup
.Zoom = False
.Orientation = xlPortrait
.FitToPagesWide = 1
.FitToPagesTall = 1
.LeftMargin = Application.InchesToPoints(0#)
.RightMargin = Application.InchesToPoints(0#)
.BottomMargin = Application.InchesToPoints(0#)

End With
Application.Dialogs(xlDialogPrint).Show
End Sub
0
PWolff  29.11.2017, 23:54
@Joergrambl

Hab's noch mal ausprobiert: VBA ist hier etwas anders als VB.

1. Statt 

CheckBox1_Click()
CheckBox1_Change()

(möglicherweise)

2 Statt

If CheckBox1.Value = 1 
If CheckBox1.Value 

(das muss sein - Value ist hier ein Boolean)

0

@PWolff: Mit einer derart umfangreichen und spezifischen AW hättest du Dir wahrlich eine Hilfreichste verdient! (ausserdem gehört das zum guten Ton, auch wenn der leider durchwegs ausser Mode gekommen ist!)

Deshalb diese Zweitantwort.


Joergrambl 
Fragesteller
 04.12.2017, 19:57

hat er erhalten ;) wollte ihm sie schon am nächsten Tag geben, jedoch muss man 24h warten und hab es dann vergessen.

0