Microsoft office excel VBA Makro zum Drucken versch Druckbereiche?
Hallo,
ich schreibe gerade an einem Drucker Makro mit UserForm.
Auf der UserForm sind mehrere CheckBoxen, und ein Durck-Button.
Das Ziel ist es: Z.b. dass man CheckBox1 und CheckBox3 anklickt und so die beiden Druckbereiche ausgewählt werden. Beim drücken des "Drucken" Buttons sollen dann die beiden druckbereiche jeweils auf eine seite gedruckt werden.
Ich habs soweit hinbekommen, dass sich über die checkboxen die richtigen druckbereiche auswählen lassen. JEDOCH lassen sich zwar mehrere checkboxen ankreuzen, jedoch druckt es letzendlich immer nur eine seite mit dem Druckbereich des letzt gedrückten checkbox.
Also prinzipiell könnte man wenn man z.b. Checkbox1 und checkbox 3 gedruckt haben will. Nacheinander die 1 anwählen drucken drücken und dann die 3 anwählen drucken drücken.
Das Ziel ist es aber dass beide gleichzeitig angewählt sein können und dann auch beide gedruckt werden auf jeweils eine seite.
Welchen code muss ich ergänzen? und vorallem wo?
Vielen dank
2 Antworten
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)
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.
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"
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
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
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
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
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
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)
@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.
hat er erhalten ;) wollte ihm sie schon am nächsten Tag geben, jedoch muss man 24h warten und hab es dann vergessen.
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.