Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1596to1600
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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
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
    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

    17 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige