wir langsam beim kopieren vieler blätter

  • Excel

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    wir langsam beim kopieren vieler blätter

    mein kleines programm erstellt aus einer großen tabelle (1000zeilen/300spalten)
    rund 200 einzelne blätter
    es werden auf dem kopierten blatt 2 werte aus der tabelle eingefügt und alle zeilen die die 2 werte beinhalten werden auf dem neuen blatt verlinkt

    die ersten 10 blätter werden in 2 sekunden kopiert und ausgefüllt und dann wird er immer langsamer und langsamer und langsamer
    für alle 200 blätter läuft das programm dann 20minuten :(
    die datei hat dann 28MB aber braucht 3GB ram 8|

    kann man das iwie beschleunigen?

    automatisch berechnen und bildschirmaktualisierung hab ich schon aus gemacht hilft aber nichts da nur das kopieren so lange dauert...
    Hi,
    das klingt so, als ob du für jeden Ablauf neuen Speicher reservierst und dies führt schlussendlich dazu, dass dein Speicher irgendwann voll wird.

    Man kann es beschleunigen, indem man nach Speicher, den man nicht mehr benötigt wieder freigibt bzw. ersetzt.

    Wo genau der Fehler liegt können wir dir auf jeden Fall sagen, wenn du deinen Code mit uns teilst :)

    GLG, Milaim

    Edit: LaMiy war 'ne halbe Minute schneller ;)
    "Wenn jemand in einem Betrieb unverzichtbar ist, dann ist dieser Betrieb falsch organisiert." - Roberto Niederer
    hier bitte sehr
    ist mein erstes projekt geht sicher alles iwie elleganter, aber solange es läuft :)

    falls ihr sonst verbesserungsvorschläge habt, bin für alles offen

    seltsames detail am rande; wenn ich die variable zeilenges zu den anderen integer schreibe bekomm ich ne fehlermeldung

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim WS As Worksheet
    3. Dim kg, i, vorkommen, EZ, zeile, ZeilenEZ, iZeile, iZeilen, ZeileEZ, KGvorher, EZvorher As Integer
    4. Dim zeilenges As Integer
    5. Dim adrKG, adrEZ As Range
    6. Private Sub Blättererstellen_Click()
    7. KGvorher = 1
    8. 'Application.ScreenUpdating = False 'Bildschirmaktualisierung aus
    9. Call Sortieren(zeilenges) 'sortieren und zeilen ermitteln
    10. 'eine der beiden Zeilen muss auskommentiert werden
    11. For zeile = 6 To zeilenges Step 1 'läuft durch ganzes Projekt
    12. 'For zeile = 6 To 10 Step 1 'nur die ersten 10 zeilen zum testen
    13. kg = Range("B" & zeile)
    14. 'KG Blätter erstellen
    15. If kg <> 0 And KGvorher <> kg Then
    16. KGvorher = kg
    17. Sheets("KG").Select
    18. ActiveSheet.Copy After:=Sheets(Sheets.Count) 'kopiert das blatt kg
    19. ActiveSheet.Name = "KG " & kg 'bennent das neue blatt nach der KG
    20. Call SchutzAus
    21. Worksheets("KG " & kg).Range("E3").Value = kg 'schreibt kg nummer auf das blatt
    22. Set adrKG = Worksheets("Gesamt").Range("B6:B" & zeilenges)
    23. vorkommen = Application.WorksheetFunction.CountIf(adrKG, kg) + 5 'zählt im Gesamt die zeilen mit der KG
    24. If vorkommen <> 6 Then 'wenn 6 ist braucht er nichts kopieren weil die Formel ja schon in der Zelle steht
    25. ActiveSheet.Range("A6").Autofill Destination:=ActiveSheet.Range("A6:A" & vorkommen) 'füllt spalte A mit formel und formatierung
    26. End If
    27. ActiveSheet.Range("B6:JY" & vorkommen).Formula = ActiveSheet.Range("B6").Formula 'füllt nur mit formeln
    28. ZeilenEZ = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row 'wieviele zeilen in der KG
    29. ActiveSheet.PageSetup.PrintArea = "A6:JY" & vorkommen 'druckbereich anpassen
    30. Call SchutzAn
    31. 'EZ Blätter erstellen
    32. Call EZerstellen(kg, ZeilenEZ)
    33. End If
    34. Next zeile
    35. 'Application.ScreenUpdating = True
    36. End Sub
    37. Sub SchutzAus()
    38. ActiveSheet.Unprotect Password:="DHK"
    39. End Sub
    40. Sub SchutzAn()
    41. ActiveSheet.Protect Password:="DHK", UserInterfaceOnly:=True, DrawingObjects:=True, Contents:=True, Scenarios:=True
    42. End Sub
    43. Sub EZerstellen(kg, ZeilenEZ)
    44. EZvorher = 1
    45. For ZeileEZ = 6 To ZeilenEZ Step 1 'für jede EZ einmal durchlaufen
    46. If IsNumeric(Worksheets("KG " & kg).Range("E" & ZeileEZ)) Then
    47. EZ = Worksheets("KG " & kg).Range("E" & ZeileEZ)
    48. If EZ <> 0 And EZvorher <> EZ Then '0 wegen leeren zeilen, EZvorher->wenn ez und ezvorher gleich ist muss er ja kein neues ez blatt erstellen
    49. EZvorher = EZ
    50. Sheets("EZ").Select
    51. ActiveSheet.Copy After:=Sheets(Sheets.Count) 'an letzte stelle kopieren
    52. ActiveSheet.Name = kg & " EZ " & EZ
    53. Call SchutzAus
    54. ActiveSheet.Range("E3").Value = kg 'kg auf neuen blatt eintragen
    55. ActiveSheet.Range("L3").Value = EZ 'ez auf neuen blatt eintragen
    56. Set adrEZ = Worksheets("KG " & kg).Range("E6:E" & ZeilenEZ)
    57. vorkommen = Application.WorksheetFunction.CountIf(adrEZ, EZ) + 5 'zählt auf dem KG-sheet die zeilen mit der EZ
    58. If vorkommen <> 6 Then 'wenn 6 ist braucht er nichts kopieren weil die Formel ja schon in der Zelle steht
    59. ActiveSheet.Range("A6").Autofill Destination:=ActiveSheet.Range("A6:A" & vorkommen) 'füllt spalte A mit formel und formatierung
    60. End If
    61. ActiveSheet.Range("B6:JY" & vorkommen).Formula = ActiveSheet.Range("B6").Formula 'füllt nur mit formeln
    62. ActiveSheet.PageSetup.PrintArea = "A6:JY" & vorkommen 'druckbereich anpassen
    63. Call SchutzAn
    64. End If
    65. End If
    66. Next ZeileEZ
    67. End Sub
    68. Private Sub Sortieren(ByRef iZeile As Integer)
    69. 'sortiert nach KG -> EZ -> Grundstück
    70. iZeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row 'ermittelt die beschriebenen zeilen
    71. ActiveSheet.Range("A5:JZ" & iZeile).Sort Key1:=Range("B6"), Order1:=xlAscending, Key2:= _
    72. Range("E6"), Order2:=xlAscending, Key3:=Range("C6"), Order3:=xlAscending _
    73. , Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
    74. xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, _
    75. DataOption3:=xlSortNormal
    76. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Pingg“ ()

    seltsames detail am rande; wenn ich die variable zeilenges zu den anderen integer schreibe bekomm ich ne fehlermeldung


    Weil Variant wohl der falsche Typ ist.

    Nur EZvorher und zeilenges sind als Integer geDIMmt.

    kg, i, vorkommen, EZ, zeile, ZeilenEZ, iZeile, iZeilen, ZeileEZ, KGvorher, adrKG sind Variant
    Überprüfe mal bei den zu kopierenden Sheets den tatsächlich verwendeten Range und gleiche ab mit dem, was du tatsächlich an benutzten Daten drin siehst.
    ​Debug.Print UsedRange.Address
    Wenn das nicht übereinstimmt, hast du einen Overhead, den du rauslöschen solltest.
    Und zwar mit "Zeilen löschen" und "Spalten löschen", jeweils mit "nach oben verschieben" bzw. "nach links verschieben".
    Danach speichern.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --