winget
Goto Top

Leere Zeilen beim Drucken automatisch ausblenden - mit VBA Code Excel

Hallo zusammen,
folgendes Szenario:

z.B. im Bereich A1:Z2 sind feste Daten (Kopfzeilen bzw. Kopfbereich)
Im Bereich A3:Z100 sind variable Daten. Zeile 101 sind die Summen. Es kann passieren, dass z.B. zwischen Zeile 50 und 100 keine Daten vorkommen. Natürlich kann man diese Daten mit dem Filter ausblenden - aber leider gibt es manchmal Fälle (Hektik, Stress etc), wo man vergisst, diese Zeilen auszublenden und man hat schnell auf dem Druckknopf gedruckt und dann kommen schon ein paar mehr Blätter raus, die man nicht wollte (einfache Papierverschwendung).

Hat jemand eine Idee, wie so eine Tabellenblatt-Code aussehen kann. Ich habe im Netz Macros gefunden, aber die Voraussetzung dafür ist, dass dieser Markro auch gestartet wird (das kann man aber direkt mit dem Filter machen).

Vielen Dank im Voraus

Content-ID: 228794

Url: https://administrator.de/contentid/228794

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

colinardo
colinardo 05.02.2014 aktualisiert um 12:42:36 Uhr
Goto Top
Hallo winget,
folgenden Code im VBA-Editor in DieseArbeitsmappe einfügen:
(In Zeile 8 musst du den Namen des ListObjects also den Namen deiner Tabelle angeben [dies ist nicht der Name des Sheets !!])
Der Code benutzt als Referenz ob eine Zeile leer ist die erste Spalte der Tabelle. Dies lässt sich mit dem Parameter Field in Zeile 9 steuern. Die Filterung der Tabelle wird immer automatisch vor dem Drucken durchgeführt. Lass dich von der Druckvorschau nicht täuschen, die Filterung wird erst gemacht wenn du auf Drucken klickst.
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    FilterEmpty
End Sub

Sub FilterEmpty()
    Dim ws As Worksheet, dt As ListObject
    Set ws = Worksheets(1)
    Set dt = ws.ListObjects("MeineTabelle")  
    dt.Range.AutoFilter Field:=1, Criteria1:="<>"  
End Sub
Grüße Uwe
winget
winget 05.02.2014 aktualisiert um 14:35:00 Uhr
Goto Top
Hi Uwe,
ich bekomme immer die Meldung "Index außerhalb des gültigen Bereichs" - genau in der Zeile 8.
So ich habe folgendes gemacht. > z.B. meine Tabelle heißt "2014.xls" mein Arbeitsblatt (Worksheet1) heißt "Januar".
Ich habe dein Code wie du mir gesagt hast bei VBAProject>Microsoft Excel Objekte>DieseArbeismappe eingefügt. Der Code sieht wie folgt aus:

Private Sub Workbook_BeforePrint(Cancel As Boolean)
    FilterEmpty
End Sub

Sub FilterEmpty()
    Dim ws As Worksheet, dt As ListObject
    Set ws = Worksheets(1)
    Set dt = ws.ListObjects("2014")  
    dt.Range.AutoFilter Field:=1, Criteria1:="<>"  
End Sub

Spaßeshalber habe ich in der Zeile 8 auch mit 2014.xls und auch Januar versucht. So:
    Set dt = ws.ListObjects("2014.xls")  

und so:
    Set dt = ws.ListObjects("Januar")  

Ich bekomme immer wieder die Meldung "Index außerhalb des gültigen Bereichs"!

Beim Dubuggen wird immer die Zeile 8 markiert!

Gruß
Paul
colinardo
colinardo 05.02.2014 aktualisiert um 14:38:20 Uhr
Goto Top
Das sind die falschen Namen!!, ich meinte diesen, wenn deine Tabelle markiert ist:

0e4d62fb94a518eef81fc5f369798496
winget
winget 05.02.2014 um 15:23:32 Uhr
Goto Top
Ich habe leider immer noch Excel2003. Deswegen habe ich dir auch einen Screenshot von meiner Tabelleneigenschaften.
Vielleicht kommen wir so auf dem gleichen Nenner:

2a2ca98ad64eeade3090dcceeb4ba1de
colinardo
colinardo 05.02.2014 aktualisiert um 19:35:15 Uhr
Goto Top
Du verstehst noch nicht was ein ListObject ist, das sind Tabellen mit Spaltenfiltern und Sonderfunktionen. Der Name solch eines ListObject ist in Excel 2003 noch nicht so einfach erreichbar. Wenn du den Namen nicht kennst und es das einzigste ListObject im Sheet ist geht auch folgende Variante:
Set dt = ws.ListObjects(1) 
Eine Liste erzeugt man indem man einen Bereich in einerm Sheet markiert und dann über Rechtsklick > Liste erstellen aus einem normalen Bereich eine Liste erstellt.

Hier ein Sheet als Demo dazu: Demo-Sheet

Grüße Uwe
winget
winget 05.02.2014 um 16:20:42 Uhr
Goto Top
Ok....Jetzt habe ich endlich kappiert was du meinst und es funktioniert auch. Super..Danke!!!
winget
winget 21.02.2014 um 16:25:49 Uhr
Goto Top
Hi Uwe,
ich hatte diese Sache bereits als gelöst markiert und es funktioniert soweit wunderbar.
Leider funktioniert der Code nur für ein Worksheet. Ich habe mehrere Möglichkeiten probiert, aber leider funktioniert nur für ein Worksheet.

Gibt es eine Möglichkeit, wenn man mehrere Sheets (Arbeitsblätter) hat? Wie gesagt ich arbeite noch mit Excel2003. Wahrscheinlich ist einfacher als ich mir vorstelle.

Viele Dank im Voraus
colinardo
colinardo 21.02.2014 aktualisiert um 16:33:41 Uhr
Goto Top
Mach in allen Tabellenblättern die du filtern willst jeweils aus den Bereichen ein Liste wie oben bereits mehrfach geschrieben
dann nehme folgenden Code um z.B die Sheets 1-3 zu filtern (lässt sich in Zeile 7 festlegen)
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    FilterEmpty
End Sub

Sub FilterEmpty()
  Dim ws As Worksheet, dt As ListObject  
  for i = 1 to 3
    Set ws = Worksheets(i)
    Set dt = ws.ListObjects(1)
    dt.Range.AutoFilter Field:=1, Criteria1:="<>"  
  Next
End Sub
Grüße Uwe
winget
winget 21.02.2014 um 16:40:52 Uhr
Goto Top
Super!
einfacher als ich dachte!
Vielen Dank!