Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: dynamischer Druckbereich VBA

dynamischer Druckbereich VBA
02.01.2018 20:36:49
Jürgen
Hallo Herber Gemeinde
Ich brauche eure Hilfe!
Ich versuche in meiner Tabelle per Button einen dynamischen Druckbereich zu verwirklichen.
Der Variable Druckbereich liegt von A107:U1000
Nun soll allerdings nur die Zeile ausgedruckt werden in der die Zell A nicht leer ist.
In Zelle A ist eine Wenn Dann Formel hinterlegt welche entweder 1 oder "" ausgibt!
Gedruckt soll nur die Zeile mit (jeweilige Zelle A = Wert 1).
Das Makro würde so aussehen.

Sub Drucken() 'makro zum Drucken inkl. Druckbereichsanpassung
Dim Zeile As Long, wks As Worksheet
Set wks = ActiveSheet
With wks
Zeile = .Cells(.Rows.Count, 1).End(xlUp).Row 'Letzte Zeile mit Daten in Spalte A
'Letzte Zeile mit nummerischem Wert finden
Do Until IsNumeric(.Cells(Zeile, 1).Text) Or Zeile = 1000
Zeile = Zeile - 1
Loop
.PageSetup.PrintArea = .Range(.Cells(107, 1), .Cells(Zeile, 21)).Address(ReferenceStyle:= _
xlA1)
.PrintOut Preview:=True
End With
End Sub

Das Makro markiert aber immer A107:U1000 auch wenn in Zelle A "" ausgegeben wird.
Nur wenn die Zelle komplett leer ist, also auch ohne Formel ist, wird der Druckbereich richtig eingegrenzt.
Ich finde den Fehler nicht!
p.S. dieses Makro habe ich hier in diesem Forum entdeckt.
Ich habe es momentan per "Druckbutton" verknüpft, toll wäre es auch wenn das Makro Automatisch vor dem Drucken ausgeführt werden würde, aber da habe ich schon gar keine Ahnung für die Umsetzung.
Es wäre toll wenn Ihr mir helfen könntet.
Beste Grüße Jürgen
Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: dynamischer Druckbereich VBA
02.01.2018 21:19:02
Werner
Hallo Jürgen,
warum filterst du nicht einfach die Tabelle nach Spalte A = 1 und druckst dann aus?
Kannst du ja mit dem Rekorder aufzeichnen.
Gruß Werner
AW: dynamischer Druckbereich VBA
03.01.2018 08:22:33
Jürgen
Hallo Werner
Das ist leider nicht so einfach.
1. Es ist gart keine Tabelle die gedruckt werden soll (die Daten werden über Formeln aus einer Tabelle in eine "Liste" kopiert, somit werden aus 1 Tabellenzeile 6 Listenzeilen.
2. Die Tabelle muss ich so unkompliziert und bedienerfreundlich wie möglich halten.
Gruß Jürgen
Anzeige
Beispielmappe bitte
03.01.2018 13:11:32
Werner
Hallo Jürgen,
mach doch mal eine Beispielmappe und lade sie hoch.
Gruß Werner
Dateilink
03.01.2018 17:16:08
Jürgen
Hallo Werner
Anbei der Link zur Datei:
https://www.herber.de/bbs/user/118656.xlsm
Mittlerweile habe ich mir mit einem Cobybefehl/Umweg beholfen, leider ohne Erfolg.
Wenn Das Sheet irgendwann einmal funktionieren sollte, werden noch einige Sheets der geleichen Form dazukommen.
Gruß Jürgen
Anzeige
AW: Dateilink
03.01.2018 18:10:45
Werner
Hallo Jürgen,
teste mal:
Sub Drucken() 'makro zum Drucken inkl. Druckbereichsanpassung
Dim loLetzte As Long, loLetzte1 As Long, raDruckbereich As Range
With Worksheets("Haus")
If WorksheetFunction.CountA(.Range(.Cells(5, 2), .Cells(104, 2))) _
 WorksheetFunction.CountA(.Range(.Cells(5, 15), .Cells(104, 15))) Then
MsgBox "Wohnbereich muss belegt sein."
Exit Sub
End If
loLetzte = .Columns(2).Find("*", LookIn:=xlValues, SearchDirection:=xlPrevious).Row
Set raDruckbereich = .Range(.Cells(113, 1), .Cells(loLetzte + 1, 21))
.PageSetup.PrintArea = ""
.PageSetup.PrintArea = raDruckbereich.Address
.PrintPreview
End With
End Sub
Ich ermittle die letzte belegte Zelle für den Druckbereich in Spalte B. Was es mit deinen 1 ern in Spalte A auf sich hat ist mir allerdings unklar.
Gruß Werner
Anzeige
AW: Hat geklappt
03.01.2018 20:32:01
Jürgen
Hallo Werner
Super, vielen Dank du bist mein Held!
Ich musste den Code ein wenig abändern, da der WB eine variable ist und nicht immer ausgefüllt ist wenn ein Name in Range B steht.
  • 
    Sub Drucken() 'makro zum Drucken inkl. Druckbereichsanpassung
    Dim loLetzte As Long, loLetzte1 As Long, raDruckbereich As Range
    With Worksheets("Neumarkt Haus Wolfstein")
    If WorksheetFunction.CountA(.Range(.Cells(5, 2), .Cells(104, 2))) _
     WorksheetFunction.CountA(.Range(.Cells(5, 2), .Cells(104, 2))) Then
    MsgBox "Wohnbereich muss belegt sein."
    Exit Sub
    End If
    loLetzte = .Columns(2).Find("*", LookIn:=xlValues, SearchDirection:=xlPrevious).Row
    Set raDruckbereich = .Range(.Cells(113, 1), .Cells(loLetzte + 3, 21))
    .PageSetup.PrintArea = ""
    .PageSetup.PrintArea = raDruckbereich.Address
    .PrintPreview
    End With
    End Sub
    

  • So klappt der Code schon wunderbar. Nun muss ich in den neuen Listen nur den Worksheet anpassen, oder kann ich das irgendwie verallgemeinern wie z.B. in aktivesheet oder so ähnlich.
    So das alle Worksheets mit dem Druckmakro arbeiten oder soll ich dann für jedes Worksheet das Makro ergänzen?
    Also ich meine wenn ich das Makro nicht in der jeweiligen Tabelle (Tabelle5 (Haus))stehen habe sondern unter "dieseArbeitsmappe"
    Anzeige
    AW: Hat geklappt
    03.01.2018 21:33:15
    Werner
    Hallo Jürgen,
    das hier
    If WorksheetFunction.CountA(.Range(.Cells(5, 2), .Cells(104, 2))) _
     WorksheetFunction.CountA(.Range(.Cells(5, 2), .Cells(104, 2))) Then
    MsgBox "Wohnbereich muss belegt sein."
    Exit Sub
    End If
    

    ist Quatsch. So wird zweimal im gleichen Bereich gezählt wieviele nichtleere Zellen vorhanden sind und verglichen, ob das Erbebnis unterschiedlich ist. Das kann ja nie der Fall sein, weil du zweimal den gleichen Bereich prüfst.
    Ich musste noch was ändern. Ansonsten wäre es so gewesen, dass du nur die erste Zeile des jeweiligen Druckbereichs angezeigt/gedruckt bekommen hättest, sobald das Feld für den Wohnbereich leer gewesen wäre. Kannst es ja mit dem alten Code mal testen. Leg im oberen Bereich mal einen Datensatz an, ohne den entsprechenden Wohnbereich zu belegen und geh per Makro in die Druckvorschau, dann siehst du was ich meine.
    Das habe ich jetzt mit der If Abfrage und der entsprechenden Belegung des Druckbereichs geregelt.
    Weiter ist der Code jetzt für das jeweils aktive Tabellenblatt.
    Sub Drucken() 'makro zum Drucken inkl. Druckbereichsanpassung
    Dim loLetzte As Long, raDruckbereich As Range
    With ActiveSheet
    If WorksheetFunction.CountA(.Range(.Cells(5, 2), .Cells(104, 2))) = 0 Then
    MsgBox "Es sind keine Druckdaten vorhanden."
    Exit Sub
    End If
    loLetzte = .Columns(2).Find("*", LookIn:=xlValues, SearchDirection:=xlPrevious).Row
    If .Cells(loLetzte, 2).Offset(-2, 0) = "" Then
    Set raDruckbereich = .Range(.Cells(113, 1), .Cells(loLetzte + 3, 21))
    Else
    Set raDruckbereich = .Range(.Cells(113, 1), .Cells(loLetzte + 1, 21))
    End If
    .PageSetup.PrintArea = ""
    .PageSetup.PrintArea = raDruckbereich.Address
    .PrintPreview
    End With
    Set raDruckbereich = Nothing
    End Sub
    

    Gruß Werner
    Anzeige
    AW: Hat geklappt
    03.01.2018 21:36:59
    Werner
    Hallo Jürgen,
    übrigens ist dein unterer Bereich des Blattes, der Bereich für die Druckausgabe, viel zu lang. Im Oberen Bereich kannst du maximal 100 verschiedene Datensätze erfassen, dann würde der Druckbereich bis maximal Zeile 711 gehen.
    Füll mal im oberen Bereich alle Datensätze in Spalte B aus und schau dir deinen unteren Bereich an.
    Gruß Werner
    Anzeige
    Danke
    05.01.2018 22:26:01
    Jürgen
    Hallo Werner
    Das Makro funktioniert astrein!
    Ich hatte wochenlang nach einer Lösung gesucht
    und nichts gefunden!
    Danke dir vielmals
    Gerne u. Danke für die Rückmeldung. o.w.T.
    05.01.2018 23:11:49
    Werner
    AW: Gerne u. Danke für die Rückmeldung. o.w.T.
    06.01.2018 08:45:57
    Jürgen
    Kein Thema,
    Solltest du nochmals 2 Minuten über haben,
    würdest du mir mal hinter die einzelnen
    Befehle die genau Funktion schreiben?
    Vielleicht erweitert es mein Wissen von „Makro funktioniert„
    auf „Makro funktioniert weil....“
    Einige Befehle kann ich zwar nachvollziehen aber zum
    „Ganzen“ fehlt einiges.
    Danke nochmal und beste Grüße Jürgen
    Anzeige
    AW: Gerne u. Danke für die Rückmeldung. o.w.T.
    06.01.2018 13:59:27
    Werner
    Hallo Jürgen,
    Sub Drucken() 'makro zum Drucken inkl. Druckbereichsanpassung
    Dim loLetzte As Long, raDruckbereich As Range
    'auf das gerade aktive Blatt referenzeiren
    With ActiveSheet
    'zählt die nichtleeren Zellen im Bereich Cells(Zeilenwert, Spaltenwert)
    'da innerhalb einer With Klammer mus vor die Range Objekte (Range, Cells) ein
    'Punkt geschrieben werden. Dadurch wird auf des im With angegebene Blatt referenziert
    'Hier im kontreten Fall: Wenn Anzahl nichtleerer Zellen im Bereich B5:B104 = 0
    'dann Meldung ausgeben und die Sub verlassen
    If WorksheetFunction.CountA(.Range(.Cells(5, 2), .Cells(104, 2))) = 0 Then
    MsgBox "Es sind keine Druckdaten vorhanden."
    Exit Sub
    End If
    'Ermitteln der letzten Zelle mit Inhalt in Spalte B (.Columns(2)) hier auch wieder
    'der Punkt vor Columns weil With Klammer
    'Find("*" = Joker Zellinhalt egal, sobald irgendein Inhalt in der Zelle
    'LookIn:=Values = nach Zellwerten schauen, Formeln die ein "" ausgeben werden
    'dadurch nicht als belegte Zelle gewertet
    'SearchDirection:=xlPrevious = von unten nach oben suchen
    loLetzte = .Columns(2).Find("*", LookIn:=xlValues, SearchDirection:=xlPrevious).Row
    'Prüfen ob zwei Zeilen oberhalb der ermittelten letzten belegten Zelle
    'Zelle (.Offset(-2, 0) erster Wert in der Klammer = Zeilenwert, zweiter
    'Wert in der Klammer = Spaltenwert, positive Werte nach unten bzw. nach rechts,
    'negative Werte nach oben bzw. nach links) leer ist
    If .Cells(loLetzte, 2).Offset(-2, 0) = "" Then
    'wenn ja raDruckbereich auf Zelle(Zeile 113, Spalte 1) bis
    'Zelle(letzte belegte Zeile + 3, Spalte 21) festlegen
    Set raDruckbereich = .Range(.Cells(113, 1), .Cells(loLetzte + 3, 21))
    Else
    'wenn nein raDruckbereich auf Zelle(Zeile 113, Spalte 1) bis
    'Zelle(Zeile(letzte belegte Zeile + 1, Spalte 21) festlegen
    Set raDruckbereich = .Range(.Cells(113, 1), .Cells(loLetzte + 1, 21))
    End If
    'eventuell vorhandene Druckbereiche leeren
    .PageSetup.PrintArea = ""
    'Druckbereich festlegen durch Übergabe der Variablen
    .PageSetup.PrintArea = raDruckbereich.Address
    'Druckvorschau anzeigen
    .PrintPreview
    End With
    'Rangevariable wieder leeren
    Set raDruckbereich = Nothing
    End Sub
    
    Gruß Werner
    Anzeige
    ;

    Forumthreads zu verwandten Themen

    Anzeige
    Anzeige
    Anzeige

    Infobox / Tutorial

    Dynamischer Druckbereich in Excel mit VBA erstellen


    Schritt-für-Schritt-Anleitung

    Um den dynamischen Druckbereich in Excel mittels VBA festzulegen, kannst du die folgenden Schritte befolgen:

    1. Öffne den Visual Basic for Applications (VBA) Editor:

      • Drücke ALT + F11 in Excel, um den VBA-Editor zu öffnen.
    2. Ein neues Modul erstellen:

      • Klicke auf Einfügen und wähle Modul.
    3. Füge den folgenden Code ein:

      Sub Drucken()
         Dim loLetzte As Long, raDruckbereich As Range
         With ActiveSheet
             If WorksheetFunction.CountA(.Range(.Cells(5, 2), .Cells(104, 2))) = 0 Then
                 MsgBox "Es sind keine Druckdaten vorhanden."
                 Exit Sub
             End If
             loLetzte = .Columns(2).Find("*", LookIn:=xlValues, SearchDirection:=xlPrevious).Row
             If .Cells(loLetzte, 2).Offset(-2, 0) = "" Then
                 Set raDruckbereich = .Range(.Cells(113, 1), .Cells(loLetzte + 3, 21))
             Else
                 Set raDruckbereich = .Range(.Cells(113, 1), .Cells(loLetzte + 1, 21))
             End If
             .PageSetup.PrintArea = raDruckbereich.Address
             .PrintPreview
         End With
         Set raDruckbereich = Nothing
      End Sub
    4. Makro ausführen:

      • Du kannst das Makro direkt aus dem VBA-Editor ausführen oder es einem Button in deiner Excel-Tabelle zuweisen.

    Häufige Fehler und Lösungen

    • Druckbereich wird nicht dynamisch angepasst:

      • Stelle sicher, dass die Zellen im Bereich wirklich Daten enthalten und nicht nur Formeln, die einen leeren String zurückgeben. Verwende IsNumeric oder CountA, um sicherzustellen, dass tatsächlich Werte vorhanden sind.
    • Druckbereich grau hinterlegt:

      • Wenn der Druckbereich grau hinterlegt ist, könnte dies daran liegen, dass er außerhalb des druckbaren Bereichs liegt. Überprüfe die Einstellungen für die Seitenränder und den Papierformat.
    • Makro wird nicht ausgeführt:

      • Überprüfe, ob das Makro in der richtigen Arbeitsmappe gespeichert ist und dass die Makros in deinen Excel-Optionen aktiviert sind.

    Alternative Methoden

    Falls du den dynamischen Druckbereich ohne VBA festlegen möchtest, kannst du folgende Methode verwenden:

    1. Tabelle filtern:

      • Filtere die Daten in deiner Tabelle so, dass nur die relevanten Zeilen angezeigt werden.
    2. Druckbereich manuell anpassen:

      • Markiere den gewünschten Bereich und gehe zu Seitenlayout > Druckbereich > Druckbereich festlegen.

    Praktische Beispiele

    Wenn du eine Excel-Tabelle hast, in der du nur die Zeilen drucken möchtest, in denen Spalte A nicht leer ist, kannst du den folgenden Code verwenden:

    Sub Drucken()
        Dim Zeile As Long
        With ActiveSheet
            Zeile = .Cells(.Rows.Count, 1).End(xlUp).Row
            .PageSetup.PrintArea = .Range(.Cells(107, 1), .Cells(Zeile, 21)).Address
            .PrintPreview
        End With
    End Sub

    Dieser Code sucht die letzte Zeile mit Daten in Spalte A und passt den Druckbereich entsprechend an.


    Tipps für Profis

    • Automatisierung des Druckens:

      • Du kannst das Makro so modifizieren, dass es vor dem Drucken automatisch ausgeführt wird. Dies kannst du durch das Hinzufügen des Codes in das Workbook_BeforePrint-Ereignis erreichen.
    • Dynamische Anpassung erweitern:

      • Du kannst den Druckbereich dynamisch anpassen, indem du zusätzliche Bedingungen hinzufügst, die die Druckdaten noch spezifischer filtern.

    FAQ: Häufige Fragen

    1. Wie kann ich den Druckbereich automatisch anpassen? Um den Druckbereich automatisch anzupassen, kannst du VBA verwenden. Der Code sucht die letzte Zeile mit Daten und passt den Druckbereich entsprechend an.

    2. Ist es möglich, den Druckbereich ohne VBA festzulegen? Ja, du kannst den Druckbereich manuell festlegen, indem du die relevanten Zellen auswählst und unter Seitenlayout den Druckbereich festlegst.

    3. Warum wird mein Druckbereich nicht korrekt angezeigt? Das kann daran liegen, dass die Zellen im Druckbereich leer sind oder nur Formeln enthalten, die leere Strings zurückgeben. Stelle sicher, dass die Zellen tatsächlich Werte enthalten.

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Entdecke mehr
    Finde genau, was du suchst

    Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

    Suche nach den besten Antworten
    Unsere beliebtesten Threads

    Entdecke unsere meistgeklickten Beiträge in der Google Suche

    Top 100 Threads jetzt ansehen
    Anzeige