Excel 2010 Zeilen per Makro markieren und drucken lassen

Hallo,

ich möchte per Makro eine Tabelle durchlaufen lassen, bei der nach einer Vertragsnummer Beträge sortiert sind. Diese sollen je Vertragsnummer markiert und dann jeweils gedruckt werden.

Ich habe schon Makros geschrieben, aber ich komme nicht drauf, wie ich die Markierung hinbekommen.

Beispieltabelle mit meinem angefangenen Makro, welches nicht läuft, unter folgendem Link:

Danke für eure Mithilfe!

Hallo Steffen

Du sprichst von einer

Beispieltabelle mit meinem angefangenen Makro, welches nicht läuft

Du hast aber eine xlsx-Tabelle ohne Makro hochgeladen. Kannst Du Dein angefangenes Makro hier zeigen – zur Befriedigung meiner Neugier!

Ich habe die beiden angehängten Makros geschrieben. Das grosse macht folgendes:

Es werden alle Zeilen ausgeblendet. Dann werden nacheinander die Zeilen mit der gleichen Vertragsnummer eingeblendet und gedruckt. – Wichtig ist:

Die Vertragsnummern müssen der Reihe nach in Spalte A aufgeführt sein – so wie Du es in der Spalte A Deiner hochgeladenen Tabelle gemacht hast. Sie sind also nicht „kunterbunt“ in der Spalte A aufgeführt.

Du hast Deine Tabelle gegliedert. Das Makro muss diese Gliederung aufheben. Es fragt, ob das ok ist oder nicht. – Die Datei sollte also vorher gespeichert sein!

Als Drucker habe ich zwei Varianten:

Die Erstellung von PDFs in einem Ordner, den Du eröffnen und im Makro ganz oben eintragen musst. Die einzelnen PDFs werden unter den jeweiligen Vertragsnummern gespeichert. – Jetzt ist als Ordner eingetragen: " C:\Kassen_PDF". Das musst Du anpassen.

Variante 2: Der Druck auf Deinen Standarddrucker.

Ganz oben im Makro musst Du das bestimmen: Drucker = 1 oder Drucker = 2

Nach jedem Druckvorgang habe ich eine Msgbox eingefügt für eine kurze Pause, damit der PC nicht durcheinander gerät vor lauter Druckaufträgen. Wahrscheinlich geht es auch ohne diese Pause.

Mit dem kleinen Makro werden alle Zeilen eingeblendet. Das kannst Du auch benutzen, wenn mal was daneben gehen sollte. Was ich natürlich nicht hoffe!

Alles Nötige sollte nun gesagt sein. Grüsse Niclaus

Sub AlleZeilenEinblenden()
    Cells.EntireRow.Hidden = False
    Range("A1").Select
End Sub

Sub test()
drucker = 1   ' AUSWAHL:  1 = PDF erstellen  /  2 = Druck auf Standard-Drucker
PDFOrdner = "C:\Kassen_PDF"

mgb = MsgBox("Achtung: Die Gliederung wird entfernt!" & Chr(13) & _
        "Weitermachen? Ja oder Nein", 20, Environ("UserName"))
    If mgb = 7 Then Exit Sub
        Selection.ClearOutline

lz = Cells(Rows.Count, 1).End(xlUp).Row
For j = 2 To lz - 1
    Range(Rows(2), Rows(lz)).EntireRow.Hidden = True
    For i = j To lz - 1
        vnr1 = Cells(i, 1)
        vnr2 = Cells(i + 1, 1)
        If vnr1 <> vnr2 Then
            Range(Rows(j), Rows(i)).EntireRow.Hidden = False
            Exit For
        End If
    Next i
    If drucker = 1 Then   ' PDF ERSTELLEN
        PDFName = vnr1
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
            PDFOrdner & "\" & PDFName _
            , Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
            :=False, OpenAfterPublish:=False
    End If
    
    If drucker = 2 Then   ' Druck auf Standard-Drucker
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
            IgnorePrintAreas:=False
    End If
    
    MsgBox "Eine kurze Pause", 48, Environ("UserName")
    j = i
Next j

Call AlleZeilenEinblenden
End Sub

Hallo Niclaus,

vielen, lieben Dank für deine schnelle Antwort.

Ich kann dir mein Makro leider nicht zur Verfügung stellen, da, wie du schon bemerkt hast, ich meine Datei als .xlsx gespeichert hatte, und dadurch die VBA-Teile rausgeflogen sind (wie ich heute morgen feststellen musste…).
Mein Ansatz entspricht dem, den du gemacht hast, allerdings habe ich versucht, über eine Do-While Schleife einen Start-und-Ende Zähler mitlaufen zu lassen, der, sobald der aktuelle Vertrag nicht dem in der nächsten Zeile entspricht, daraus den Druckbereich (Range(„A“ & start & „:I“ & ende)) erstellen sollte. Leider bekam ich die Schleife schon nicht ans laufen.

Ich probiere deine Makros gleich mal aus, der Ansatz, die einzelnen Zeilen aus- und einzublenden ist ein echt einfacher Weg, ich habe vielleicht zu kompliziert gedacht.

Vielen Dank noch einmal!

Grüezi Steffen

Deine Bemerkung „Druckbereich … erstellen“ hat mir offenbart: Meine zwei Makros sind eine Art höherer Blödsinn. Sie funktionieren zwar, aber man kann das Ganze viel einfacher machen. Und zwar, indem man Zeilenumbrüche einfügt! - Dazu genügt dann auch ein Makro. Die Gliederung der Tabelle muss nicht aufgehoben werden.

Sub test2()
ActiveSheet.ResetAllPageBreaks
With ActiveSheet.PageSetup
    .PrintTitleRows = "$1:$1"
    .Order = xlOverThenDown
'    Seitenreihenfolge: nach rechts, dann nach unten
End With
lz = Cells(Rows.Count, 1).End(xlUp).Row
For i = 3 To lz
    vnr1 = Cells(i, 1)
    vnr2 = Cells(i - 1, 1)
    If vnr1 <> vnr2 Then
        ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=Cells(i, 1)
    End If
Next i
End Sub

Die Zeile " .Order = xlOverThenDown" ist vor allem dann zu empfehlen, wenn die Tabelle mehr Spalten enthält, als auf einer Seite gedruckt werden können. Sie „stört“ aber nicht, wenn die Spalten auf einer Seite Platz haben.

Die letzte Zeile Deiner Tabelle (Gesamttotal) wird auf einer eigenen Seite ausgegeben. Wenn Du diese Total-Zeile auf der Seite mit den letzten Vertragsnummern gedruckt haben willst, dann musst Du folgende kleine Aenderung machen. Die Zeile

For i = 3 To lz 
     muss dann heissen:
For i = 3 To lz - 1

Ich hoffe, das hilft Dir, und grüsse Dich. Niclaus