Drucken bestimmter Felder
#1
Hallo zusammen,

Zur Erläuterung:

Ich wollte ein Code erzeugen, mit dem der Benutzer nur die "aktiven" Seiten in der Tabelle "Ausgabe" druckt, die in der gelb markierten Zelle etwas stehen hat ( die rechte Seite mit Nebenwerten gehört immer zur Seite mit den Hauptwerten ). Die zu druckenden Seiten befinden sich in grau eingerahmten Bereichen ( siehe angehängte Datei ).

hier meine Frage:

ich möchte gern die folgende Programmierung dahingehen ändern, dass man dem Benutzer überlässt mit welchem Drucker/PDF er drucken soll und dass ( bei PDF-Druck ) alle "aktiven" Seiten in einer PDF-Datei gedruckt werden. Mit dem momentanen Code werden alle "aktiven" Seiten hintereinander einzeln gedruckt am hinterlegten Drucker, d.h. dass der Benutzer nicht die Wahl hat zu entscheiden wie gedruckt werden soll ( ob auf Papier oder PDF ). Hier der Code:

Sub Drucken()
Dim i As Long
Dim lastRow As Long
Dim myStep As Long
Dim rngGelb As Range
Dim rngPrint1 As Range
Dim rngPrint2 As Range

Application.ScreenUpdating = False

With Worksheets("Ausgabe")
    .Visible = True
    lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
    For i = 1 To lastRow
        myStep = i + 57
        Set rngGelb = .Range("A" & i + 8)
        If rngGelb <> "" Then
            Set rngPrint1 = .Range("A" & i & ":O" & myStep - 1)
            .PageSetup.PrintArea = rngPrint1.Address
            '.PrintPreview
            .PrintOut
            Set rngPrint2 = .Range("Q" & i & ":AE" & myStep - 1)
            .PageSetup.PrintArea = rngPrint2.Address
            '.PrintPreview
            .PrintOut
        End If
        i = myStep
    Next i
    'oder: .Visible = xlVeryHidden
    .Visible = Hide
.DisplayAutomaticPageBreaks = False
End With

Set rngPrint1 = Nothing
Set rngPrint2 = Nothing
Set rngGelb = Nothing

End Sub

Kann mir da jemand behilflich sein?

Danke schon Mal ;)

Gruß

Andy


.xlsm   test.xlsm (Größe: 114,4 KB / Downloads: 5)
Top
#2
Hallo Andy,

setze diese Codezeile nach dem Application.Screenupdating = False ein

If Application.Dialogs(xlDialogPrinterSetup).Show = False then Exit Sub

dann werden als Erstes alle angeschossenen Drucker zur Auswahl angeboten und es wird mit dem ausgewählten gedruckt.
[Bild: attachment-190.gif]
Gruß Günter
aus der Helden-, Messe-, Musik-, Buch-, Universitäts- und Autostadt Leipzig
[-] Folgende(r) 1 Nutzer sagt Danke an Glausius für diesen Beitrag:
  • Andy_Garcia
Top
#3
Hallo Glausius,

danke für deinen Tipp. Das hat mich meinem Ziel schon näher gebracht.

Eine Sache wollte ich noch dem Benutzer ermöglich: Momentan werden alle Seiten einzeln gedruckt, d.h. dass der Benutzer (wenn mehrere Seiten als PDF zu drucken sind) jede einzelne Seite drucken muss. Die Seiten sollen allerdings zusammen in eine PDF-Datei gedruckt werden.

Hast du hierfür auch einen Vorschlag?

Gruß

Andy
Top
#4
Hallo Andy,

so ganz habe ich anhand deiner Datei und deiner Beschreibung nicht verstanden, was du erreichen willst.

Aber vielleicht ist es das - ermittele doch die Bereiche, die jeweils nur gedruckt werden sollen und baue deine beiden Druckbefehle dann zu einem zusammen, so nach diesem Muster:

Range("A6:O57,A64:O115,A122:O173,A180:O231,A238:O289").PrintOut Copies:=1

Das sind jeweils die Bereiche deiner Datei, die ein gelb hinterlegtes Feld in der Spalte A haben. Du musst den Anfang und das Ende des jeweiligen Bereiches, der aktiv ausgedruckt werden soll, ermitteln und als Variable in die obige Zeile einbauen.
[Bild: attachment-190.gif]
Gruß Günter
aus der Helden-, Messe-, Musik-, Buch-, Universitäts- und Autostadt Leipzig
Top
#5
Achso, dann habe ich mich missverständlich ausgedrückt. Folgendes wollte ich erreichen:

wenn Zelle A1 <>"" dann drucke A1:O57 und Q1:AE57
  wenn Zelle A67 <>"" dann drucke A59:O115 und Q59:AE115
    ...

Wenn Blätter diese Bedingungen erfüllen, sollen sie zusammen gedruckt werden in einer PDF.

Falls die entsprechenden Zellen leer sind, sollen die beiden Seiten (links und recht) nicht gedruckt werden.


Hoffe ich habe die Problemstellung besser dargestellt.

Gruß
Top
#6
oder besser ausgedrückt:

wenn Zelle A1 <>"" dann füge  Seite A1:O57 und Seite Q1:AE57 zum Druck hinzu
  wenn Zelle A67 <>"" dann füge Seite A59:O115 und Seite Q59:AE115 zum Druck hinzu
    ...

drucke alle hinzugefügten Seiten
Top
#7
Hallo Andy,

ich habe dich schon verstanden, nur du hast den Lösungsvorschlag nicht verstanden!

Teste einmal diesen Code:

Code:
Option Explicit

Sub Drucken()
   Dim i As Long
   Dim lastRow As Long

   If Application.Dialogs(xlDialogPrinterSetup).Show = False then Exit Sub
   Application.ScreenUpdating = False
   With Worksheets("Ausgabe")
        .Visible = True
        lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
        For i = 1 To lastRow Step 57
            If .Range("A" & i + 8) <> "" Then
                .PageSetup.PrintArea = .Range("A" & i & ":O" & myStep - 1,"Q" & i & ":AE" & myStep - 1)
                '.PrintPreview
                .PrintOut
            End If
        Next i
        'oder: .Visible = xlVeryHidden
        .Visible = Hide
       .DisplayAutomaticPageBreaks = False
   End With
End Sub
oder wenn mehrere Bereiche zusammen ausgedruckt werden sollen, dann muss der Code so aufgebaut werden, dass die entsprechenden entscheidenden Zellen in der For-Next-Schleife abgefragt werden und je nach dem die PrintArea entsprechend erweitert werden.
[Bild: attachment-190.gif]
Gruß Günter
aus der Helden-, Messe-, Musik-, Buch-, Universitäts- und Autostadt Leipzig
Top
#8
Hallo Clausius,

ich habe deinen Code eingesetzt und musste noch mystep als Long dimensionieren. Allerdings wird beim Ausführen folgender Fehler angezeigt: Fehler beim Kompilieren: Variable nicht definiert und es wird folgendes angezeigt :  siehe Attachment.

Habe ich was falsch eingegeben?

Gruß




Angehängte Dateien Thumbnail(s)
   
Top
#9
Hallo,

vielleicht so?

Code:
Sub Drucken()
    Dim i As Long
    Dim lastRow As Long
    Const myStep As Long = 57
    
    If Application.Dialogs(xlDialogPrinterSetup).Show = False Then Exit Sub
    Application.ScreenUpdating = False
    With Worksheets("Ausgabe")
        .Visible = True
        lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
        For i = 1 To lastRow Step myStep
            If .Range("A" & i + 8) <> "" Then
                .PageSetup.PrintArea = .Range("A" & i & ":O" & myStep - 1, "Q" & i & ":AE" & myStep - 1)
                '.PrintPreview
                .PrintOut
            End If
        Next i
        'oder: .Visible = xlVeryHidden
        .Visible = False
        .DisplayAutomaticPageBreaks = False
    End With
End Sub
Gruß Stefan
Win 10 / Office 2016
Top
#10
hmm, leider kommt jetzt ein Laufzeitfehler 1004 und die Zeile mit
                .PageSetup.PrintArea = .Range("A" & i & ":O" & myStep - 1, "Q" & i & ":AE" & myStep - 1)
wird gelb markiert.

Funktioniert es denn bei dir?
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste