Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
860to864
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
860to864
860to864
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

860to864: Code wird langsamer

Code wird langsamer
13.04.2007 19:37:22
Andreas

Hallo Excelprofis!
Mit dem nachfolgendem Code blende ich, über eine Userform-Schaltfläche, bestimmte Zeilen und Spalten aus, drucke dann und blende alles wieder ein. Beim ersten Aufruf geht das relativ schnell (ca. 2 sek bis Druckanfang). Klicke ich nach dem drucken erneut auf die Schaltfläche dauerts ca. 6 sek - 8 sek bis Druckanfang, auch weitere Druckfunktionen (andere Zeilen und Spalten) dauern dann solange.
Kann mir Jemand sagen warum das so ist. Und kann man das irgendwie ändern.


Private Sub CommandButtonDruck1_Click()
Dim lZeile  As Long
'zur Auswertung wechseln
Sheets("Auswertung").Select
'With Sheets("Auswertung")
'For i = 1 To 5
'.Cells(i, 2) = "Besucher Tag " & i & ": " & worksheetsfunction.Sum(.Range(.Cells(5, i + 28),    _
_
_
Cells(1000, i + 28)))
'Next i
'End With
Application.ScreenUpdating = False
With Sheets("Auswertung")
.Rows("8:1001").Hidden = False
For lZeile = 8 To 1000
If .Cells(lZeile, 29) = "" Then
.Rows(lZeile).Hidden = True
End If
Next
End With
'Sortieren nach Firma
Range("A8:AF1500").Select
Selection.Sort Key1:=Range("B8"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
'Spalten ausblenden
Range("A:A,C:C,E:E,F:F,G:G,H:H,I:I,L:AF").EntireColumn.Hidden = True
Application.ScreenUpdating = True
With ActiveSheet.PageSetup
.PrintTitleRows = ""
.PrintTitleColumns = ""
End With
ActiveSheet.PageSetup.PrintArea = ""
With ActiveSheet.PageSetup
'.LeftHeader = ""
'.CenterHeader = ""
'.RightHeader = ""
'.LeftFooter = ""
'.CenterFooter = ""
'.RightFooter = ""
.LeftMargin = Application.InchesToPoints(0.78740157480315)
.RightMargin = Application.InchesToPoints(0.78740157480315)
.TopMargin = Application.InchesToPoints(0.78740157480315)
.BottomMargin = Application.InchesToPoints(0.590551181102362)
.HeaderMargin = Application.InchesToPoints(0)
.FooterMargin = Application.InchesToPoints(0)
.PrintHeadings = False
.PrintGridlines = True
'.PrintComments = xlPrintNoComments
'.PrintQuality = -3
'.CenterHorizontally = False
'.CenterVertically = False
.Orientation = xlPortrait
.Draft = False
.PaperSize = xlPaperA4
.FirstPageNumber = xlAutomatic
'.Order = xlDownThenOver
'.BlackAndWhite = False
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 999
End With
Unload UserFormAuswertung
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
With Sheets("Auswertung")
Sheets("Auswertung").Unprotect "xyz"
Rows.EntireRow.Hidden = False
Columns.EntireColumn.Hidden = False
'nach Nummern sortieren
Range("A8:AF1500").Select
Selection.Sort Key1:=Range("A8"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Sheets("Auswertung").Protect "xyz"
End With
Load UserFormAuswertung
UserFormAuswertung.Show
Sheets("Auswertung").Range("B1").Select
End Sub


Danke für die Hilfe!
mfg, Andreas

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code wird langsamer
13.04.2007 19:56:23
Erich G.
Hallo Andreas,
ein Tipp:
Warum bestimmst du die Seiteneinrichtung (alles, was mit PageSetup zu tun hat) im Druckmakro?
Die Seiteneinrichtung dauert oft lange. Da sie sich von einem Ausdruck zum nächsten nicht ändert,
könntest du sie besser vorher (mit eigenem Button und Makro) erledigen.
Alternative: Die Seiteneinrichtung der Tabelle einmalig per Hand vornehmen.
Wenn es jeweils um ein neu erstelltes Tabellenblatt geht, könntest du die Seiteneinrichtung
an einem Musterblatt vornhemen und dieses bei der Neuerstellung verwenden.
Noch eine Bemerkung:
Statt
Range("A8:AF1500").Select
Selection.Sort Key1:=...
geht einfacher und kürzer:
Range("A8:AF1500").Sort Key1:=
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Code wird langsamer
13.04.2007 20:04:36
Andreas
Hallo Erich!
Danke für den Tipp (Range).
Das Problem ist, daß ich die Mappe selbst nicht verwende sondern Jemand der sich im Excel gar nicht auskennt. Deshalb muß alles auf einen "Knopfdruck" funktionieren.
Beim ersten "Knopfdruck" geht alles auch super schnell, nur bei jedem nächsten Mal wirds langsam.
Wird die Datei geschlossen und wieder geöffnet gehts wieder flott.
mfg, Andreas

AW: Code wird langsamer
14.04.2007 09:53:40
fcs
Hallo Andreas,
ich hab deinen Code mal bei mir unter Excel97/Win98 getestet. Es tritt das gleiche Phänomen auf.
Nach dem Öffnen läuft der Code super, danach bei jedem Aufruf langsamer. Bei mir stürtzt spätestens beim 4. mal Excel oder auch Windows komplett ab.
Ich hab dann verschiedene Sachen probiert, insbesondere die Unload- und Show-Anweisungen für das Userform rausgeschnissen. Half alles nichts. Das Problemkind ist die Schleife mit der die Zeile ausgeblendet wird, wenn der Zellinhalt in Spalte 29 verschieden von "" ist. Diese Schleife wird nach jedem Neustart des Druckmakros langsamer. Ursache ?????
Ich hab das Ausblenden jetzt mal durch die Autofilter-Funktion realisiert. Damit scheint es reibungslos zu funktionieren. Der Autofilter wird vor dem Sortieren/Drucken gesetzt und nach dem Drucken wieder entfernt.
Außerdem sollte man nicht innerhalb einer Formular-Prozedur das Formular mit .Show nochmals anzeigen. Excel schachtelt dann die Formularaufrufe und das kann dann auch wieder Probleme machen. Falls du nach dem Drucken die Inhalte von Formularelementen zurücksetzen möchtest, dann solltest du diese Elemente am Ende der Prozedur auf die gewünschen Werte setzen.
Wenn du tatsächlich das Formular mit Unload aus dem Speicher entfernen möchtest und dann neu anzeigen, dann muss man an den Prozeduren für die Buttons noch etwas feilen und die Prozedur modifizieren, die das UserForm das 1. mal aufruft.
Gruß
Franz


Private Sub CommandButtonDruck1_Click()
Dim lZeile  As Long
'zur Auswertung wechseln
Sheets("Auswertung").Select
With Sheets("Auswertung")
.Unprotect "xyz"
'For i = 1 To 5
'.Cells(i, 2) = "Besucher Tag " & i & ": " & worksheetsfunction.Sum(.Range(.Cells(5, _
i + 28), Cells(1000, i + 28)))
'Next i
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'per Autofilter Zeilen ausblenden
.Range("AC7:AC65536").AutoFilter Field:=1, Criteria1:="<>", Operator:=xlAnd
Application.Calculation = xlCalculationAutomatic
'Sortieren nach Firma
.Range("A8:AF1500").Sort Key1:=Range("B8"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
'Spalten ausblenden
.Range("A:A,C:C,E:E,F:F,G:G,H:H,I:I,L:AF").EntireColumn.Hidden = True
With .PageSetup
.PrintTitleRows = ""
.PrintTitleColumns = ""
End With
.PageSetup.PrintArea = ""
With .PageSetup
'.LeftHeader = ""
'.CenterHeader = ""
'.RightHeader = ""
'.LeftFooter = ""
'.CenterFooter = ""
'.RightFooter = ""
.LeftMargin = Application.InchesToPoints(0.78740157480315)
.RightMargin = Application.InchesToPoints(0.78740157480315)
.TopMargin = Application.InchesToPoints(0.78740157480315)
.BottomMargin = Application.InchesToPoints(0.590551181102362)
.HeaderMargin = Application.InchesToPoints(0)
.FooterMargin = Application.InchesToPoints(0)
.PrintHeadings = False
.PrintGridlines = True
'.PrintComments = xlPrintNoComments
'.PrintQuality = -3
'.CenterHorizontally = False
'.CenterVertically = False
.Orientation = xlPortrait
.Draft = False
.PaperSize = xlPaperA4
.FirstPageNumber = xlAutomatic
'.Order = xlDownThenOver
'.BlackAndWhite = False
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 999
End With
Application.ScreenUpdating = True
'MsgBox "Test" 'Testzeile
'ActiveWindow.SelectedSheets.PrintPreview 'Testzeile Seitenvorschau nit ESC-Taste abbrechen
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
Selection.AutoFilter 'Autofilter wieder abschalten
.Columns.EntireColumn.Hidden = False
'nach Nummern sortieren
.Range("A8:AF1500").Sort Key1:=Range("A8"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
.Protect "xyz"
.Range("B1").Select
'Hier ggf. Code einfügen um Fomular-Steuerelemente auf gewünschte Werte zurückzusetzen
End With
End Sub


Anzeige
AW: Code wird langsamer
14.04.2007 14:04:23
Andreas
Hallo Franz!
Danke für die Hilfe! Läuft wesentlich schneller, Super!
Noch 2 Fragen:
Wie muß der Code für den Autofilter aussehen wenn alle Zeilen angezeigt werden sollen bei denen in den Zellen AC bis AF eine 1 steht.
Ich habe noch 5 Buttons bei denen ich genau das gleiche mache wie bei den Druckbuttons nur Ohne Druck und ohne ausblenden der Spalten. Also einfach nur die jeweiligen Zeilen ausblenden. Kann ich da deinen Code übernehmen und wie und wo muß ich da den Autofilter von einer vorherigen "Ausblendung" rausnehmen.
Danke noch mal für die Hilfe und Mühe!!
mfg Andreas

Anzeige
AW: Code wird langsamer
14.04.2007 15:42:24
fcs
Hallo Andreas,
nachfolgend ein Beispiel für das Deaktivieren eines aktiven Autofilters und setzen des neuen Filters.
Gruß
Franz


Sub Autofilter_setzen()
Dim wks As Worksheet, Bereich As Range
Set wks = Worksheets("Eintragungen")
Set Bereich = wks.Range("AC7:AF65536")
'prüfen, ob Autofilter aktiv und ggf. deaktivieren
If wks.AutoFilterMode = True Then wks.AutoFilterMode = False
'Filter für Bereich setzen
With Bereich
.Autofilter Field:=1, Criteria1:="=1" 'Filter 1. Spalte von Bereich
.Autofilter Field:=2, Criteria1:="=1" 'Filter 2. Spalte von Bereich
.Autofilter Field:=3, Criteria1:="=1" 'Filter 3. Spalte von Bereich
.Autofilter Field:=4, Criteria1:="=1" 'Filter 4. Spalte von Bereich
End With
End Sub


Anzeige
AW: Code wird langsamer
14.04.2007 15:53:38
Andreas
Hallo Franz!
Danke für die Hilfe! Ich denke mal, für meine "ausblendenButtons" bekomme ich das hin. Wie und wo muß ich aber diesen Code in meinen "Druckablauf" eintragen.
Sorry für die Mühe!
mfg, Andreas

Danke, ist erledigt!!
14.04.2007 16:14:38
Andreas
Danke für die Hilfe, es geht alles.

AW: Code wird langsamer
14.04.2007 16:16:08
fcs
Hallo Andreas,
hier der Anfang des Druckmakros, so dass du siehst, wo/wie der Autofilter gesetzt wird
Gruß
Franz


Private Sub CommandButtonDruck1_Click()
Dim lZeile  As Long
Dim wks As Worksheet
Set wks = Worksheets("Auswertung")
'zur Auswertung wechseln
wks.Select
With wks
.Unprotect "xyz"
'For i = 1 To 5
'.Cells(i, 2) = "Besucher Tag " & i & ": " & worksheetsfunction.Sum(.Range(.Cells(5, _
i + 28), Cells(1000, i + 28)))
'Next i
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'per Autofilter Zeilen ausblenden
'prüfen, ob Autofilter aktiv und ggf. deaktivieren
If .AutoFilterMode = True Then .AutoFilterMode = False
'Filter für Bereich setzen
With .Range("AG7:AG65536")
.Autofilter Field:=1, Criteria1:=">=1" 'Filter 1. Spalte von Bereich
End With
Application.Calculation = xlCalculationAutomatic


Anzeige
Ich bedanke mich für die Hilfe, jetzt geht alles!
14.04.2007 17:58:25
Andreas
Vielen, vielen Dank für die Hilfe! Jetzt geht alles super!
mfg, Andreas

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige