Microsoft Excel

Herbers Excel/VBA-Archiv

Excel sehr langsam

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


 

Beiträge aus den Excel-Beispielen zum Thema "Excel sehr langsam"