Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
868to872
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
868to872
868to872
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Zeilen Drucken

Zeilen Drucken
14.05.2007 13:07:47
Roger

Hallo Zusammen,
ich habe eine Frage zu dem Tabellen - Ausschnitt:
Userbild
Mit diesem Makro ist es möglich das die Tabelle beim Ausdruck immer zentriert ist und pro Blatt jeweils die Erste Zeile wiederholt.


Sub drucker()
With ActiveSheet.PageSetup
.PrintTitleRows = "$1:$1"
.PrintTitleColumns = ""
End With
ActiveSheet.PageSetup.PrintArea = ""
With ActiveSheet.PageSetup
.CenterHorizontally = True
.CenterVertically = True
End With
End Sub


Wie ist es nun aber möglich das nur die Zeillen gedruckt werden die in Spalte B, C und D beschrieben sind.
In dem Fall also die Zeile 4, 8 und 9 nicht. Was an dieser Stelle auch zu erwähnen ist, dass die Tabelle einen Rahmen hat.
Zudem sollen nicht mehr als 50 Zeilen pro Blatt ausgedruckt werden.
Ist das überhaupt mit einem Makro lösbar?
Im Archiv habe ich leider nichts gefunden.
Wenn jemand eine Idee hat,wäre ich dankbar.
Gruss Roger

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeilen Drucken
14.05.2007 13:11:16
CB
if-schleife um den druck "wenn b <> "" dann los sonst zeile = zeile + 1" oder so...

AW: Zeilen Drucken
14.05.2007 20:25:41
Roger
Hallo,
soetwas habe ich mir bereits gedacht.
Leider bekomme ich aber die Schleife alleine nicht richtig hin
und ich weiss auch nicht mehr weiter.
Wäre toll wenn jemand noch etwas mehr helfen könnte.
Gruss Roger

AW: Zeilen Drucken
14.05.2007 23:44:26
Kai Win
Hallo Roger,
per Makro ließe sich das lösen, klar. Das einfachste wäre aber in meinen Augen einfach einen Autofilter einzufügen, in Spalte B dann 'nicht leere' zu wählen, und ab mit dem Druckauftrag.
Selbes kann natürlich auch ein Makro machen, wenn es dir lieber ist.


Sub Makro1()
' Makro1 Makro
' 'Für Roger
' Tastenkombination: Strg+Umschalt+B
Columns("B:B").Select
Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:="<>"
ActiveWindow.SelectedSheets.PrintPreview
Selection.AutoFilter
Range("B1").Select
End Sub


Ist nix besonderes, ich hab's schlicht aufgezeichnet. Müsste aber für das, was du suchst genau richtig sein.
Grüße,
Kai

Anzeige
Zeilen Drucken
15.05.2007 05:47:48
Roger
Herzlichen Dank Kai Win,
das mit dem Autofilter ist auch eine Methode!
Jedoch bin ich auf der Suche nach der Schleifen Methode ;O)
Das muss doch irgendwie gehen ohne das auf dem Monitor etwas von dem ganzen zu sehen ist,
auf dem Drucker reicht es voll kommen.
Ich Versuche es heute noch einmal selber, aber wenn jemand helfen kann wäre ich auch dankbar!
Gruss Roger

AW: Zeilen Drucken
15.05.2007 08:40:26
fcs
Hallo Roger,
so könnte eine Schleifen-Lösung aussehen. Evtl. müsste für Formatierung des Rahmens auch noch etwas eingebaut werden.
Gruß
Franz


Sub drucker()
Dim wks As Worksheet
Set wks = ActiveSheet
Application.ScreenUpdating = False
With wks
.Cells.PageBreak = xlPageBreakNone
For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
If Application.WorksheetFunction.CountA(.Rows(i)) = 1 Then
.Rows(i).Hidden = True
Else
Anzahl% = Anzahl% + 1
If Anzahl = 49 Then
.Cells(i + 1).PageBreak = xlPageBreakManual
Anzahl = 0
End If
End If
Next
With .PageSetup
.PrintTitleRows = "$1:$1"
.PrintTitleColumns = ""
End With
.PageSetup.PrintArea = ""
With .PageSetup
.CenterHorizontally = True
.CenterVertically = True
End With
End With
Application.ScreenUpdating = True
End Sub
Sub druckerzuruecksetzen()
'Alle Zeilen einblenden, Seitenumbrüche entfernen
Dim wks As Worksheet
Set wks = ActiveSheet
With wks
.Cells.PageBreak = xlPageBreakNone
.Rows.Hidden = False
End With
End Sub


Anzeige
Interpretation....
15.05.2007 21:52:00
Roger
Hallo Franz,
genau das ist es! Nur möchte ich es auch noch verstehen und das gelingt mir momentan nicht ganz.
Wenn die Tabelle in dem angegeben Bereich ist geht es wunderbar.
Welche Eigenschaften muss ich verstellen wenn die Tabelle erst im Bereich E:100 anfängt?
Kannst Du mir das sagen?
Gruss Roger

AW: Interpretation....
15.05.2007 21:58:17
Roger
Oder Vielleicht noch einfacher!
Wie kann ich es anstellen das nur der Bereich E:100 bis H:1000 kontrolliert wird?

AW: Interpretation....
15.05.2007 23:41:16
fcs
Hi Roger,
ich hab die Prozedur jetzt mal entsprechend deinen Wünschen angepasst.
Gruß
Franz


Sub drucker()
Dim wks As Worksheet, i%, Anzahl%
Set wks = ActiveSheet
Application.ScreenUpdating = False
With wks
.Cells.PageBreak = xlPageBreakNone
.Cells(100, 1).PageBreak = xlPageBreakManual ' ????? damit Seitenwechsel stimmt
'Schleife von Zeile 100 bis zur letzten ausgefüllten Zeile in Spalte 5 (E)
'den To-Wert kanst du natürlich auch fest auf einen Wert setzen
For i = 100 To .Cells(.Rows.Count, 5).End(xlUp).Row
'    For i = 100 To 1000
'Prüfen, ob in der jeweiligen Zeile in Spalte 5 bis 8 (E bis H) _
nur eine Zelle Inhalt hat (E ausgefüllt, F bis H nicht)
'Die Funktion CountA entspricht der Tabellenfunktion ANZAHL2
If Application.WorksheetFunction.CountA(.Range(.Cells(i, 5), .Cells(i, 8))) = 1 Then
.Rows(i).Hidden = True
Else
Anzahl% = Anzahl% + 1
If Anzahl = 49 Then
.Cells(i + 1, 1).PageBreak = xlPageBreakManual
Anzahl = 0
End If
End If
Next
With .PageSetup
.PrintTitleRows = "$1:$1"
.PrintTitleColumns = ""
End With
.PageSetup.PrintArea = ""
With .PageSetup
.CenterHorizontally = True
.CenterVertically = True
End With
End With
Application.ScreenUpdating = True
End Sub


Anzeige
Danke Franz
16.05.2007 23:02:09
Roger
Hallo Franz,
finde es ganz toll das Du Dir Zeit genommen hast um mir bei meinem Problem zu helfen.
Bin jetzt ein bisschen am testen.
Danke auch für die Kommentare. Jetzt kann ich es viel besser nachvollziehen.
Etwas ist mir aufgefallen:
Bei einem Start dauert das Ausblenden der unbenutzten Zeilen fast eine Minuten, wenn es sich um 1000 Einträge handelt.
Die letzte Frage:
Kann man das beschleunigen, und was muss ich tun wenn ich nur Einträge sehen möchte die in jeder Spalte einen Eingabe besitzen (Spalte F:G:H)?
Wenn Du dass auch noch weisst, komme ich aus dem staunen nicht mehr heraus :O)
Gruss Roger

Anzeige
AW: Danke Franz
17.05.2007 07:24:20
schauan
Hallo Roger,
eine Ursache ist der wiederholte Zugriff auf das Tabellenblatt. Du könntest besser die Zeilen in einer Variable sammeln und dann zusammen ausblenden. ImPrinzip so:


Sub Makro1()
Dim strHiddenRows$, iCounter%
For iCounter = 1 To 5
strHiddenRows = strHiddenRows & iCounter & ":" & iCounter & ","
Next
strHiddenRows = Left(strHiddenRows, Len(strHiddenRows) - 1)
Range(strHiddenRows).EntireRow.Hidden = True
End Sub


oder eingepasst in Deinen code:
If Application.WorksheetFunction.CountA(.Range(.Cells(i, 5), .Cells(i, 8))) = 1 Then
strHiddenRows = strHiddenRows & i & ":" & i & ","
Else
Anzahl% = Anzahl% + 1
If Anzahl = 49 Then
.Cells(i + 1, 1).PageBreak = xlPageBreakManual
Anzahl = 0
End If
End If
Next
strHiddenRows = Left(strHiddenRows, Len(strHiddenRows) - 1)
Range(strHiddenRows).EntireRow.Hidden = True
... und m Anfang die neue Variable dimmen ...
Hoffe geholfen zu haben Grüße von André aus Gera - Stadt der Buga 2007 - Excel-97-2003



Anzeige
Integration
17.05.2007 08:34:42
Roger
Guten Morgen Schauan,
Danke für Deinen Input, aber leider kann ich Dein Teilmakro nicht integrieren.
Es erscheint immer die Fehlermeldung:
Unzulässiger oder nicht ausreichend definierter Verweis.

AW: Integration
17.05.2007 09:08:30
schauan
Hallo Roger,
poste nochmal den gesamten code und kommentiere die Zeile, wo der Fehler kommt.
Hoffe geholfen zu haben Grüße von André aus Gera - Stadt der Buga 2007 - Excel-97-2003

??
17.05.2007 10:37:04
Roger
Hallo nochmal, hier nun den Code,


Sub drucker()
Dim wks As Worksheet, i%, Anzahl%
Set wks = ActiveSheet
Application.ScreenUpdating = False
With wks
.Cells.PageBreak = xlPageBreakNone
.Cells(100, 1).PageBreak = xlPageBreakManual
For i = 100 To .Cells(.Rows.Count, 5).End(xlUp).Row
If Application.WorksheetFunction.CountA(.range(.Cells(i, 5), .Cells(i, 8))) = 1 Then
strhiddenrows = strhiddenrows & i & ":" & i & ","
Else
Anzahl% = Anzahl% + 1
If Anzahl = 49 Then
.Cells(i + 1, 1).PageBreak = xlPageBreakManual
Anzahl = 0
End If
End If
Next
strhiddenrows = Left(strhiddenrows, Len(strhiddenrows) - 1)
range(strhiddenrows).EntireRow.Hidden = True
End With
Application.ScreenUpdating = True
End Sub


Jetzt kommt Laufzeitfehler 1004
Wenn ich einen Haltepunkt setze dann sehe ich, wenn ich mit der Maus auf das Wort Range fahre, folgendes:
Die Methode Range für das Objekt Worksheet ist....
Mehr sehe ich dann nicht, leider!

Anzeige
AW: ??
17.05.2007 12:30:45
schauan
Hallo Roger,
da fehlt ein Punkt vor Range.
Der Ordnung halber oben in die Zeile wo Dim steht noch ", strHiddenRows$" dazu, ohne die Anführungszeichen.
Hoffe geholfen zu haben Grüße von André aus Gera - Stadt der Buga 2007 - Excel-97-2003

AW: ??
17.05.2007 13:16:44
fcs
Hallo Roger,
bei dem Lösungsvorschlag von Andre wird scheinbar der erzeugte Textstring zulang, in den die Adressen der auszublendenden Zeilen geschrieben werden. oder die Anzahl der durch Komma getrennten Bereiche
in Range(100:100,105:105, usw.) ist begrenzt.
Bei mir hat sich Excel95 direkt ins Nirwana verabschiedet, sobald code auf die Range.... Zeile trifft.
Folgende Modifikation läuft und ist deutlich schneller sein als meine Ursprungsversion.
Dein 2. Problemchen: F,G,H müssen alle 3 ausgefüllt sein:


For i = 100 To .Cells(.Rows.Count, 6).End(xlUp).Row
If Application.WorksheetFunction.CountA(.Range(.Cells(i,6), .Cells(i, 8))) = 3 Then

Gruß
Franz


Sub drucker()
Dim wks As Worksheet, i%, Anzahl%, Anzahl2%, strhiddenrows As String
Set wks = ActiveSheet
Application.ScreenUpdating = False
With wks
.Cells.PageBreak = xlPageBreakNone
.Cells(100, 1).PageBreak = xlPageBreakManual
For i = 100 To .Cells(.Rows.Count, 5).End(xlUp).Row
If Application.WorksheetFunction.CountA(.Range(.Cells(i, 5), .Cells(i, 8))) = 1 Then
strhiddenrows = strhiddenrows & i & ":" & i & ","
Anzahl2% = Anzahl2% + 1
If Anzahl2% = 35 Then 'ab 36 stürzt EXCEL97 ab
strhiddenrows = Left(strhiddenrows, Len(strhiddenrows) - 1)
.Range(strhiddenrows).EntireRow.Hidden = True
strhiddenrows = ""
Anzahl2% = 0
End If
Else
Anzahl% = Anzahl% + 1
If Anzahl = 49 Then
.Cells(i + 1, 1).PageBreak = xlPageBreakManual
Anzahl = 0
End If
End If
Next
End With
Application.ScreenUpdating = True
End Sub


Anzeige
AW: ??
18.05.2007 06:47:47
schauan
Hallöchen,
so, jetzt kann ich wieder. Ich hatte es ja gestern auch schon vermutet und jetzt mal getestet. Die Länge vom String ist begrenzt auf die berühmten 255 Zeichen.
Beim Ausblenden der ersten 100 Zeilen komme ich nur bis zur 45. dort ist der String 251 Zeichen lang. Mit der Zeile 46 wäre er um 6 Zeichen länger, -- Fehler
Beim Ausblenden ab der Zeile 1000 komme ich nur bis zur 1031. dort ist der String 255 Zeichen lang. In der nächsten Zeile -- Fehler
Man müsste es also nicht auf 35 Zeilen begrenzen - das könnte bei den größeren Nummern auchzu viel sein - sondern auf die Länge achten. Sollten theoretisch alle Zeilen im 10000er Bereich sein kommen pro Zeile 11 Zeichen dazu. Also prüfen, ob der Strin länger als 244 Zeichen ist und wenn ja, dann ausblenden und zurücksetzen. Man kann es natürlich auch flexibler gestalten und prüfen, ob der gesamte String mit dem String für die nächste Zeile länger als 255 wird ...
Unter 2007 könnten es 1.048.576 Zeilen betreffen, wenn da was ganz unten steht müsste man zum einen lange suchen, zum anderen die Länge der Prüfung für den Zeilenstring auf 240 Zeichen verringern.
Also, statt
If Anzahl2% = 35 Then 'ab 36 stürzt EXCEL97 ab
dann
If Len(strHiddenRows) > 244 Then 'max 255 Zeichen möglich
Hoffe geholfen zu haben Grüße von André aus Gera - Stadt der Buga 2007 - Excel-97-2003

Anzeige
Keine Veränderung
17.05.2007 13:07:01
Roger
Hallo Schauan,
hier nun noch einmal den ganzen Code. Jedoch habe ich immer noch den selben Fehler.


Sub drucker()
Dim wks As Worksheet, i%, Anzahl%, strHiddenRows$
Set wks = ActiveSheet
Application.ScreenUpdating = False
With wks
.Cells.PageBreak = xlPageBreakNone
.Cells(100, 1).PageBreak = xlPageBreakManual
For i = 100 To .Cells(.Rows.Count, 5).End(xlUp).Row
If Application.WorksheetFunction.CountA(.range(.Cells(i, 5), .Cells(i, 8))) = 1 Then
strHiddenRows = strHiddenRows & i & ":" & i & ","
Else
Anzahl% = Anzahl% + 1
If Anzahl = 49 Then
.Cells(i + 1, 1).PageBreak = xlPageBreakManual
Anzahl = 0
End If
End If
Next
strHiddenRows = Left(strHiddenRows, Len(strHiddenRows) - 1)
.range(strHiddenRows).EntireRow.Hidden = True
End With
Application.ScreenUpdating = True
End Sub


In dieser Line
.range(strHiddenRows).EntireRow.Hidden = True
scheint irgendetwas nicht zu stimmen.
Ich blicke nicht mehr durch...
Hast Du den Durchblick nocht?

Anzeige
AW: Keine Veränderung
17.05.2007 13:18:03
schauan
Hallo Roger,
überprüfe mal bitte den Inhalt der Variable strHiddenRows.
Im Prinzip sollte es so aussehen:
"4:4,7:7,11:11"
ohne Leerzeichen dazwischen, nur mit einigen Zeilen mehr.
Eventuell ist Excel die Liste zu lang, da müssten wir zwischendurch schon mal ausblenden.
Bin aber jetzt erst mal auf Achse ;-)
Hoffe geholfen zu haben Grüße von André aus Gera - Stadt der Buga 2007 - Excel-97-2003

Variable hat zuwenig Kapazität :O)
17.05.2007 13:30:16
Roger
Hallo Schauan,
ich habe es soeben ausprobiert. Es liegt an der grösse.
Im Maximum überwache ich einen Bereich von etwa 1500 Zeilen, es kann aber gut sein das nur 10 befüllte sind. Das heisst es müssen 1490 Zeilen ausgeblendet werden. Eine extreme variable. ;O)
20 Zeilen sind das Maximum.

Danke @ Franz / Andre
18.05.2007 14:03:57
Roger
Hallo Franz, Hallo Andre
herzlichen Dank für Eure super Unterstützung und Hilfe, sowie Geduld.
Der Code klappt nun beinahe perfekt.
Ich musste den Wert von 35 auf 25 hinunter setzen.
Etwas funktioniert jedoch noch nicht.
Wenn am Schluss die 1. Variable die 25 noch nicht erreicht hat wird der aktuelle Inhalt nicht mehr ausgeblendet. Wie ist es also möglich am Ende der Variablen noch zu sagen das auch der Rest des Inhaltes ausgeblendet werden muss?
Ich weiss nicht ob ich mich verständlich ausgedrückt habe.
Gruss Roger

AW: Danke @ Franz / Andre
18.05.2007 14:56:03
schauan
Hallo Roger,
füge nach Next noch ein:
if strhiddenrows <> "" then .range(strhiddenrows).entirerow.hidden=true
Übrigens hatte ich was erläutert und eine alte naive aufgezeigt zu den 35 oder 25 oder wieviel auch immer ;-)
Hoffe geholfen zu haben Grüße von André aus Gera - Stadt der Buga 2007 - Excel-97-2003

Danke @ Franz / Andre
18.05.2007 15:25:27
Roger
Andre du bist der Beste :O)
Hier nun die Delux Variante!!!!


Sub drucker()
Dim wks As Worksheet, i%, Anzahl%, Anzahl2%, strhiddenrows As String
Set wks = ActiveSheet
Application.ScreenUpdating = False
With wks
.Cells.PageBreak = xlPageBreakNone
.Cells(100, 1).PageBreak = xlPageBreakManual
For i = 100 To .Cells(.Rows.Count, 5).End(xlUp).Row
If Application.WorksheetFunction.CountA(.range(.Cells(i, 5), .Cells(i, 8))) = 1 Then
strhiddenrows = strhiddenrows & i & ":" & i & ","
Anzahl2% = Anzahl2% + 1
If Len(strhiddenrows) > 244 Then 'max 255 Zeichen möglich
strhiddenrows = Left(strhiddenrows, Len(strhiddenrows) - 1)
.range(strhiddenrows).EntireRow.Hidden = True
strhiddenrows = ""
Anzahl2% = 0
End If
Else
Anzahl% = Anzahl% + 1
If Anzahl = 49 Then
.Cells(i + 1, 1).PageBreak = xlPageBreakManual
Anzahl = 0
End If
End If
Next
If strhiddenrows <> "" Then
strhiddenrows = Left(strhiddenrows, Len(strhiddenrows) - 1)
.range(strhiddenrows).EntireRow.Hidden = True
End If
End With
Application.ScreenUpdating = True
End Sub


Besten Dank für alles !!!
Gruss Roger

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige