Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1048to1052
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

Code langsamer nach printpreview

Code langsamer nach printpreview
17.02.2009 12:13:00
Klaus
Moin VBAler!,
aus einer langen Mitarbeiterliste hole ich mir einzelne Datensätze nach gewissen Suchkriterien in ein Array, um dieses Array dann in der Ausgabeliste zu schreiben. Das geht super schnell!
Ein anderes Makro öffnet die Druckvorschau, diese schließe ich per Hand. Danach ist mein erstes Makro kriechend langsam!
Woran kann das liegen? Anbei mal der komplette Code

Option Explicit
Type Suchkriterium
xName As String
xPersonalNummer As String
Kostenstelle As String
Chef As String
Abteilung As String
End Type
Sub Eintragen()
Dim aSearch() As Suchkriterium
Dim lRow As Long
Dim myKostenstelle As String
Dim myChef As String
Dim myAbteilung As String
Dim ManCounter As Long
Dim lPpl As Long
lRow = Sheets("Datenblatt").Range("A65536").End(xlUp).Row
ReDim aSearch(0 To lRow)
With ActiveSheet
If IsEmpty(.Range("F2")) Then .Range("F2") = "#"
myKostenstelle = .Range("F2")
If IsEmpty(.Range("G2")) Then .Range("G2") = "#"
myChef = .Range("G2")
If IsEmpty(.Range("H2")) Then .Range("H2") = "#"
myAbteilung = .Range("H2")
End With
With Sheets("Datenblatt")
For ManCounter = 2 To lRow
If (InStr(1, .Range("E" & ManCounter), myAbteilung) > 0) Or (InStr(1, .Range("C" &  _
ManCounter), myKostenstelle) > 0) Or (InStr(1, .Range("D" & ManCounter), myChef) > 0) Then
aSearch(lPpl).xName = .Range("A" & ManCounter)
aSearch(lPpl).xPersonalNummer = .Range("B" & ManCounter)
aSearch(lPpl).Kostenstelle = .Range("C" & ManCounter)
aSearch(lPpl).Chef = .Range("D" & ManCounter)
aSearch(lPpl).Abteilung = .Range("E" & ManCounter)
lPpl = lPpl + 1
End If
Next ManCounter
End With
With ActiveSheet
.Range("D8:Q500").ClearContents
.Range("D8:Q500").EntireRow.Hidden = False
For ManCounter = 8 To lPpl + 8
Range("D" & ManCounter) = aSearch(ManCounter - 7).xPersonalNummer
Range("E" & ManCounter) = aSearch(ManCounter - 7).xName
Range("F" & ManCounter) = aSearch(ManCounter - 7).Kostenstelle
Range("G" & ManCounter) = aSearch(ManCounter - 7).Chef
Range("H" & ManCounter) = aSearch(ManCounter - 7).Abteilung
Next ManCounter
.Range("D" & lPpl + 12 & ":D500").EntireRow.Hidden = True
.Range("E504") = Date
.Range("E507") = Environ("username")
End With
End Sub
Sub ausdrucken()
Dim lRow As Long
Dim r As Range
Application.ScreenUpdating = False
With ActiveSheet
lRow = .Range("E500").End(xlUp).Row + 1
For Each r In .Range("I8:I" & lRow)
If r.Value = "x" Then
Else
r.EntireRow.Hidden = True
End If
Next r
.PrintPreview
End With
Application.ScreenUpdating = True
End Sub


Grüße,
Klaus M.vdT.

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code langsamer nach printpreview
17.02.2009 12:54:00
Luschi
Hallo Klaus,
ich wundere mich, daß beim 1. mal das Makro 'Eintragen' noch schnell ist; Fakt ist, daß Du mit dem Makro 'ausdrucken'
die Bildschirmaktualisierung wieder einschaltest und damit dem Makro 'Eintragen' einen _ Bremsfallschirm umlegst. Wenn man in einer Tabelle größere Datenmengen per Vba verändert, Zeilen ein- bzw. ausblendet, dann sollte man 3 Excel-Bremsklötze zu Beginn ausschalten und am Schluß wieder aktivieren:

Sub macheWas
getMoreSpeed True
'hier der weitere Vba-Code
getMoreSpeed False
End sub
Sub getMoreSpeed(Optional ByVal Modus As Boolean = True)
With Application
.ScreenUpdating = Not Modus
.EnableEvents = Not Modus
.Calculation = IIf(Modus, xlCalculationManual, xlCalculationAutomatic)
.Cursor = IIf(Modus, 2, -4143)
End With
End Sub

Gruß von luschi
aus klein-Paris

Anzeige
AW: Code langsamer nach printpreview
17.02.2009 13:40:00
Klaus
Hi Luschi,
am screenupdating liegt es nicht. Ich werd die Datei mal anonymisieren und hochladen.
noch offen
17.02.2009 13:49:00
Klaus
sorry, Haken vergessen: Frage noch offen.
AW: Code langsamer nach printpreview
17.02.2009 16:06:00
D.Saster
Hallo Klaus,
warum die Preformance derartig einbricht, kann ich dir auch nicht sagen. Von superschnell ist dein Code aber weit entfernt. Ich hab mal ein wenig gebastelt.

Sub Eintragen()
Dim lRow As Long
Dim myKostenstelle As String
Dim myChef As String
Dim myAbteilung As String
Dim ManCounter As Long
Dim lPpl As Long
Dim vntDaten(), n As Integer
Application.ScreenUpdating = False
lRow = Sheets("Datenblatt").Range("A65536").End(xlUp).Row
ReDim vntDaten(1 To 5, 1 To lRow)
With ActiveSheet
If IsEmpty(.Range("F2")) Then .Range("F2") = "#"
myKostenstelle = .Range("F2")
If IsEmpty(.Range("G2")) Then .Range("G2") = "#"
myChef = .Range("G2")
If IsEmpty(.Range("H2")) Then .Range("H2") = "#"
myAbteilung = .Range("H2")
End With
lPpl = 1
With Sheets("Datenblatt")
For ManCounter = 2 To lRow
If (InStr(1, .Range("E" & ManCounter), myAbteilung) > 0) _
Or (InStr(1, .Range("C" & ManCounter), myKostenstelle) > 0) _
Or (InStr(1, .Range("D" & ManCounter), myChef) > 0) Then
For n = 1 To 5
vntDaten(n, lPpl) = .Cells(ManCounter, n)
Next n
lPpl = lPpl + 1
End If
Next ManCounter
End With
ReDim Preserve vntDaten(1 To 5, 1 To lPpl)
vntDaten = WorksheetFunction.Transpose(vntDaten)
With ActiveSheet
.Range("D8:Q500").EntireRow.Hidden = False
.Range("D8:Q500").ClearContents
.Range("D8").Resize(lPpl, 5) = vntDaten
.Range("D" & lPpl + 12 & ":D500").EntireRow.Hidden = True
.Range("E504") = Date
.Range("E507") = Environ("username")
End With
Application.ScreenUpdating = True
End Sub



Sub ausdrucken()
Application.ScreenUpdating = False
With ActiveSheet
.Range("I8:I500").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
.PrintPreview
End With
Application.ScreenUpdating = True
End Sub


Das wird nach .Printpreview zwar auch langsamer, aber nicht so krass.
Gruß
Dierk

Anzeige
AW: Code langsamer nach printpreview
17.02.2009 16:16:00
Klaus
Hi,
vielen Dank für die Optimierung! Schau ich mir in Ruhe an, um noch was zu lernen.
Für mich ist der Code schon "rasend" gewesen, weil ich das erste mal Arrays eingesetzt habe - bisher immer alles mit schleifen und IF abgefragt und geschrieben :-)
Mich würd nur eher das warum interessieren. Wenn ich das "drucken" Makro nicht starte, sondern per Hand in die PrintPreview gehe - auch dann wird der Code kriechend langsam. Ich will das Problem nicht umgehen, sondern vom Tisch haben ....
Nachtrag: nicht nur der Code, sondern die ganze Datei (scrollen etc) wird langsamer! Reproduzierbar, immer mit dieser Datei. Ich schreib die spasseshalber mal ganz neu ...
Grüße,
Klaus M.vdT.
Anzeige
Druckbereich?
17.02.2009 16:26:00
Klaus
"Seltsam und immer seltsamer", sprach Alice im Excelland.
Wenn ich die "Druckbereiche" der Arbeitsblätter aufhebe, wird es spontan wieder schnell und die performance bricht nicht mehr ein.
OK, mein Problem ist gelöst (und mein Code nebenher optimiert worden *freu*)
...... aber wenn mir jemand den kausalen Zusammenhang zwischen Druckbereich, printpreview und Performance erklären könnte währ ich nen gutes Stück weiter.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige