Makro läuft langsam

  • Excel

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von kriisz.

    Makro läuft langsam

    Ich benutuze das folgende Makro, um ein Diagramm darzustellen. Aber es läuft sehr langsam ab. Ich habe große Intervallen angegeben, weil die Daten sind immer unterschiedlich. Manchmal laufen sie bis 1200 und manchmal bis 2000.
    Wie könnte ich das Makro optimieren?

    Vielen Dank im Voraus.

    Lg
    Christian

    Quellcode

    1. Private Sub CommandButton1_Click()
    2. Dim r As Range, c As Range
    3. Set r = Range("a1:a6000")
    4. Application.ScreenUpdating = False
    5. For Each c In r
    6. If Len(c.Text) = 0 Then
    7. c.EntireRow.Hidden = True
    8. Else
    9. c.EntireRow.Hidden = False
    10. End If
    11. Next c
    12. Application.ScreenUpdating = True
    13. Worksheets("Tabelle1").Rows(2).Hidden = True
    14. Dim myChtObj As ChartObject
    15. Dim rngChtData As Range
    16. Dim rngChtXVal As Range
    17. Dim iColumn As Long
    18. ' define chart data
    19. Set rngChtData = Range("'Tabelle1'!$a$1:$i$6000")
    20. ' define chart's X values
    21. With rngChtData
    22. Set rngChtXVal = .Columns(1).Offset(1).Resize(.Rows.Count - 2)
    23. End With
    24. ' add the chart
    25. Set myChtObj = ActiveSheet.ChartObjects.Add _
    26. (Left:=500, Width:=750, Top:=150, Height:=450)
    27. With myChtObj.Chart
    28. ' make an XY chart
    29. .ChartType = xlLine
    30. ' remove extra series
    31. Do Until .SeriesCollection.Count = 0
    32. .SeriesCollection(1).Delete
    33. Loop
    34. ' add series from selected range, column by column
    35. For iColumn = 2 To rngChtData.Columns.Count
    36. With .SeriesCollection.NewSeries
    37. .Values = rngChtXVal.Offset(, iColumn - 1)
    38. .XValues = rngChtXVal
    39. .Name = rngChtData(1, iColumn)
    40. End With
    41. Next
    42. End With
    43. End Sub
    Bei rechenintensiven Makros ist es immer von Vorteil, wenn man die Bildaktualisierung und die Berechnungen solange abschaltet.


    Quellcode

    1. Dim r As Range, c As Range
    2. Set r = Range("a1:a6000")
    3. Application.ScreenUpdating = False
    4. Application.Calculation = xlCalculationManual
    5. For Each c In r
    6. If Len(c.Text) = 0 Then
    7. c.EntireRow.Hidden = True
    8. Else
    9. c.EntireRow.Hidden = False
    10. End If
    11. Next c
    12. Worksheets("Tabelle1").Rows(2).Hidden = True
    13. Dim myChtObj As ChartObject
    14. Dim rngChtData As Range
    15. Dim rngChtXVal As Range
    16. Dim iColumn As Long
    17. ' define chart data
    18. Set rngChtData = Range("'Tabelle1'!$a$1:$i$6000")
    19. ' define chart's X values
    20. With rngChtData
    21. Set rngChtXVal = .Columns(1).Offset(1).Resize(.Rows.Count - 2)
    22. End With
    23. ' add the chart
    24. Set myChtObj = ActiveSheet.ChartObjects.Add _
    25. (Left:=500, Width:=750, Top:=150, Height:=450)
    26. With myChtObj.Chart
    27. ' make an XY chart
    28. .ChartType = xlLine
    29. ' remove extra series
    30. Do Until .SeriesCollection.Count = 0
    31. .SeriesCollection(1).Delete
    32. Loop
    33. ' add series from selected range, column by column
    34. For iColumn = 2 To rngChtData.Columns.Count
    35. With .SeriesCollection.NewSeries
    36. .Values = rngChtXVal.Offset(, iColumn - 1)
    37. .XValues = rngChtXVal
    38. .Name = rngChtData(1, iColumn)
    39. End With
    40. Next
    41. End With
    42. Application.ScreenUpdating = True
    43. Application.Calculation = xlCalculationAutomatic


    Edit:
    Leerzeichen / Tabs sind weg. Überlasse ich Dir :D

    Edit:
    Wenn der Code auf Fehler läuft, dann bleiben die beiden Dinge aus. Also Fehler abfangen und dann wieder einschalten.

    Quellcode

    1. Dim r As Range, c As Range
    2. err.clear
    3. On Error GoTo Fehler
    4. Set r = Range("a1:a6000")
    5. Application.ScreenUpdating = False
    6. Application.Calculation = xlCalculationManual
    7. For Each c In r
    8. If Len(c.Text) = 0 Then
    9. c.EntireRow.Hidden = True
    10. Else
    11. c.EntireRow.Hidden = False
    12. End If
    13. Next c
    14. Worksheets("Tabelle1").Rows(2).Hidden = True
    15. Dim myChtObj As ChartObject
    16. Dim rngChtData As Range
    17. Dim rngChtXVal As Range
    18. Dim iColumn As Long
    19. ' define chart data
    20. Set rngChtData = Range("'Tabelle1'!$a$1:$i$6000")
    21. ' define chart's X values
    22. With rngChtData
    23. Set rngChtXVal = .Columns(1).Offset(1).Resize(.Rows.Count - 2)
    24. End With
    25. ' add the chart
    26. Set myChtObj = ActiveSheet.ChartObjects.Add _
    27. (Left:=500, Width:=750, Top:=150, Height:=450)
    28. With myChtObj.Chart
    29. ' make an XY chart
    30. .ChartType = xlLine
    31. ' remove extra series
    32. Do Until .SeriesCollection.Count = 0
    33. .SeriesCollection(1).Delete
    34. Loop
    35. ' add series from selected range, column by column
    36. For iColumn = 2 To rngChtData.Columns.Count
    37. With .SeriesCollection.NewSeries
    38. .Values = rngChtXVal.Offset(, iColumn - 1)
    39. .XValues = rngChtXVal
    40. .Name = rngChtData(1, iColumn)
    41. End With
    42. Next
    43. End With
    44. Fehler:
    45. If Err.Number <> 0 Then
    46. MsgBox Err.Description, vbCritical + vbOKOnly, "Fehler: " & Err.Number
    47. Err.Clear
    48. End If
    49. On Error GoTo 0
    50. Application.ScreenUpdating = True
    51. Application.Calculation = xlCalculationAutomatic


    Gruß
    Peterfido

    Keine Unterstützung per PN!