![]() |
Betrifft: Excel sehr langsam
von: stef26
Geschrieben am: 30.08.2014 21:23:00
Hallo liebe Excelprofis,
ich habe mit Hilfe dieses Forums ein Tool erstellt, was dem Anwender ermöglichen soll eine Skizze zu erstellen. Habe eigentlich nur noch ein Problem, dass das Tool sehr langsam geworden ist.
Vor allem bei der Erstellung der Stückliste aus dem skizzierten Equipment zeigt sich dies. Habe am Anfang gedacht, dass es an der Anzahl der Shapes ca, 700Stück liegt, dem ist aber nicht so. Dann dachte ich, dass es mit dem
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
liegt. Nehme ich das aber aus dem Tool raus bringt es leider auch nichts.
Nehme ich es beim Auflisten(nur der Teil Stücklistenerstellung) mit auf, so wird es auch langsam ????
Ich habe mal 2 Varianten erstellt.
A) Auflisten - des zeigt einen 700 Shapes mit dem Macro.
Das Macro listet innerhalb weniger Sekunden alle Materialien unter dem Tabellenblatt Materialliste auf.
B) Im Orginal dauert die Bearbeitung (Macro in Zelle P15 BillOfMaterial) ca.5Minuten.
Im Tool gibt es keine Berechnungen (Indirekt) oder so, die Excel langsam machen.
Leider kann ich das Tool wg. der Größe nicht ins Forum stellen. Und bei den Teil nur mit dem Macro funktioniert der Code ja fehlerfrei. So hab ich einen Link auf mein OneDrive mal hier reingestellt.
https://onedrive.live.com/redir?resid=FFA421954C49778A!260&authkey=!APajuhA0SmO9tN8&ithint=folder%2cxlsm
Ich hoffe das dies erlaubt ist, da ich sonst keine andere Möglichkeit sehe das Problem euch zu zeigen.
Wer kann mir Tipps geben, an was dies liegt, dann werde ich versuchen dies anders zu lösen. Am Macro welches der BOM hinterlegt ist liegt es auf jeden Fall nicht.
Ich hoffe das einer von euch mir hier helfen kann, da ich bis auf dieses Geschwindigkeitsproblem mit dem Tool so gut wie fertig wäre...
Liebe Grüße
Stefan
![]() ![]() |
Betrifft: AW: Excel sehr langsam
von: fcs
Geschrieben am: 31.08.2014 16:16:35
Hallo Stefan,
ich hab mir mal das per "BOM"-Button gestartete Makro angesehen.
Zwei wesentliche Änderungen hab ich eingebaut:
1. Ereignismakros werden vorrübergehend deaktiviert und der Berechnungsmodus vorübergehend auf manuell gesetzt. Danach lag die Makro-Laufzeit bei 15 bis 20 Sekunden.
Grund für die Beschleunigung: Im Blatt "Zusammenfassung" gibt es viele Formeln, die auf die Daten in Spalte A und/oder F der Materialliste zugreifen. Der manuelle Berechnungsmodus verhindert ständiges Neuberechnen.
2. Die Daten der vom Makro erzeugten Listen für Spalte A und F der Materialliste werden nicht mehr Zelle für Zelle eingetragen, sondern in 2 Arrays gesammelt und dann in 2 Blöcken im Blatt eingetragen.
Makrolaufzeit jetzt bei 7 bis 8 Sekunden.
Zusätzlich hab ich die If-Prüfungen etwas optimiert. Die If-Prüfungen mit mehreren And hab in einzelne If-Prüfungen aufgelöst. Dadurch sind insgesamt weniger Vergleichsrechnngen erforderlich und das Makro wird geringfügig schneller - bei 800 Schleifen-Durchläufen ist dieser Effekt aber nur minimal.
Bei den angegeben Laufzeiten des Makros ist zu berücksichtigen, dass mein Notebook mit WindowsVista und Office 2010, auf dem ich getestet hab, schon ein paar Jahre auf dem Buckel hat.
Die anderen Makros hab ich mal grob überflogen. In diesen Makros werden nicht in großem Umfang Werte in Zellen geändert. Trotzdem macht es wahrscheinlich Sinn die Bildschirm-Aktualisierung bei vielen Makros während der Makroausführung zu deaktivieren.
Gruß
Franz
Sub Rohre_Auflisten() Dim wksMat As Worksheet Dim Rohr As Shape Dim arrA(), arrF(), intA As Integer, intF As Integer Dim Länge As Double Dim StatusCalc As Long With Application .ScreenUpdating = False StatusCalc = .Calculation .Calculation = xlCalculationManual .EnableEvents = False End With With Sheets("Skizze") ReDim arrA(1 To 1, 1 To .Shapes.Count) ReDim arrF(1 To 1, 1 To .Shapes.Count) intA = 0: intF = 0 End With For Each Rohr In Sheets("Skizze").Shapes If Rohr.Left < 400 Then If Rohr.Left > 100 Then If Rohr.Top < 325 Then If Rohr.Visible = True Then If Rohr.Name Like "*Rohr*" Then intA = intA + 1 arrA(1, intA) = Rohr.Name Else If Not Rohr.Name Like "Mess*" And Not Rohr.Name Like "Graf*" _ And Not Rohr.Name Like "Pict*" And Not Rohr.Name Like "Nullp*" Then MengeMat = 1 intF = intF + 1 arrF(1, intF) = Rohr.Name End If End If End If End If End If End If Next ReDim Preserve arrA(1 To 1, 1 To intA) ReDim Preserve arrF(1 To 1, 1 To intF) With Sheets("Materialliste") .Range("A3:A1000").ClearContents .Range("F3:F1000").ClearContents .Range("A3").Resize(UBound(arrA, 2), 1).Value = Application.WorksheetFunction.Transpose( _ arrA) .Range("F3").Resize(UBound(arrF, 2), 1).Value = Application.WorksheetFunction.Transpose( _ arrF) End With Erase arrA, arrF With Application .ScreenUpdating = True .Calculation = StatusCalc .EnableEvents = True End With End Sub
![]() ![]() |
Betrifft: AW: Excel sehr langsam
von: stef26
Geschrieben am: 31.08.2014 17:24:25
Hallo Franz,
du bist meine Rettung. Läuft nun wirklich 1000 mal besser.
Super wie du das umgesetzt hast. Ich hatte schon die Befürchtung das es hierzu keine Lösung gibt.
Vielen vielen Dank für deine Unterstützung!!!!!!!!!!!!
DANKE
Stefan
![]() |