Checkboxen abfragen und Ampelsystem

  • Excel

    Checkboxen abfragen und Ampelsystem

    Hallo zusammen,

    vorweg möchte ich sagen, dass ich überhaupt kein VBA-Kenner bin und mir die Programmteile zum grössten Teil zusammensuche und meinen Bedürfnissen anpasse.
    Der Programmcode läuft soweit auch durch, jedoch ist die Schnelligkeit misserabel.

    Im Excel-File gibt es zwei Blätter mit jeweils ca. 150 Checkboxen, welche mit der jeweiligen Zelle verknüpft werden müssen.

    Dies erfolgt beim Öffnen der Datei:

    Visual Basic-Quellcode

    1. For Each WsTab In Worksheets
    2. If WsTab.Name = "HP-Fakturierung" Or WsTab.Name = "Monatsfakturierung" Then
    3. WsTab.Activate
    4. For Each chkElement In ActiveSheet.CheckBoxes
    5. chkElement.LinkedCell = chkElement.TopLeftCell.Address
    6. Next chkElement
    7. End If
    8. Next WsTab


    Beim Aktivieren einer Checkbox wird in der rechten Zelle davon das Datum und der Username angegeben.
    Dieser Code ist in einem Modul.

    Visual Basic-Quellcode

    1. Sub CheckBox_Date_Stamp()
    2. Dim xChk As CheckBox
    3. Set xChk = ActiveSheet.CheckBoxes(Application.Caller)
    4. With xChk.TopLeftCell.Offset(, 1)
    5. If xChk.Value = xlOff Then
    6. .Value = ""
    7. Else
    8. .Value = " " & Date & " " & Application.UserName
    9. End If
    10. End With
    11. End Sub


    Nun wird abgefragt, ob sich in der Zelle rechts von der obigen Checkbox etwas ändert (-> Eingabe von Datum und Username).
    Wenn ja, dann wird folgender Code ausgeführt:
    HIer werden alle Zellen ab Zeile 9 bis unterste Zeile abgefragt und anschliessend wird in Zeile 8 die Ampel aufgrund der erledigten Arbeiten (abgehackte Checkboxen) berechnet und angezeigt.
    Sind 100% erledigt dann ist die Ampel grün ansonsten rot.
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Sub Worksheet_Change(ByVal Target As Excel.Range)
    2. letzteZeile = Cells(Rows.Count, 10).End(xlUp).Row
    3. 'bei einer Änderung in der Spalte "E" wird das Makro Worksheet Activate ausgeführt.
    4. If Not Intersect(Target, Range("E" & ersteZeile & ":E" & letzteZeile)) Is Nothing Then
    5. Application.EnableEvents = False
    6. '*************************************************************************************************
    7. '** 1. FORMATIERUNG SPALTE A
    8. '*************************************************************************************************
    9. ' 1.1 Abfrage der Spalte E -> Funktionen für die Formatierung der Spalte A
    10. For i = ersteZeile To letzteZeile Step 3
    11. For j = 1 To 2 Step 1
    12. If IsEmpty(Cells(i, 5).Value) = True Then
    13. Cells(i, 1).Value = "0"
    14. Else: Cells(i, 1).Value = "1"
    15. End If
    16. i = i + 1
    17. Next j
    18. If j = 2 Then i = i + 3
    19. Next
    20. ' 1.2 Funktion für das Ampelsystem in Spalte A (Kreditoren)
    21. iPend = WorksheetFunction.CountIf(Range("A" & ersteZeile & ":A" & letzteZeile), "0") ' Abfrage Anzahl der pendenten Kreditorenrechnungen
    22. iErl = WorksheetFunction.CountIf(Range("A" & ersteZeile & ":A" & letzteZeile), "1") ' Abfrage Anzahl erledigte Kreditoren
    23. Range("A8").Value = iErl & " / " & iPend + iErl ' Berechnung in % der gesamthaft erledigten Kreditoren -> Ausgabe in Zelle A8
    24. If 100 / (iPend + iErl) * iErl = 100 Then ' wenn 100% erledigt dann...
    25. Range("A7").Interior.Color = RGB(128, 128, 128) ' Färbe Zelle dunkelgrau
    26. Range("A7").Value = "n"
    27. Range("A7").Font.ColorIndex = 4 ' Schriftfarbe grün -> Ampel grün
    28. Else
    29. Range("A7").Value = "n"
    30. Range("A7").Font.ColorIndex = 3 ' Schriftfarbe rot -> Ampel rot
    31. End If
    32. '************************************************************************************************
    33. '** 2. FORMATIERUNG SPALTE B
    34. '************************************************************************************************
    35. ' 2.1 Abfrage der Spalte E -> Funktionen für die Formatierung der Spalte B
    36. For i = (ersteZeile + 2) To letzteZeile Step 3
    37. For j = 1 To 2 Step 1
    38. If IsEmpty(Cells(i, 5).Value) = True Then
    39. Cells(i, 2).Value = "0"
    40. Else: Cells(i, 2).Value = "1"
    41. End If
    42. i = i + 1
    43. Next j
    44. If j = 2 Then i = i + 3
    45. Next
    46. ' 2.2 Funktion für das Ampelsystem in Spalte B (Debitoren)
    47. iPend = WorksheetFunction.CountIf(Range("B" & ersteZeile & ":B" & letzteZeile), "0") ' Abfrage Anzahl der pendenten Kreditorenrechnungen
    48. iErl = WorksheetFunction.CountIf(Range("B" & ersteZeile & ":B" & letzteZeile), "1") ' Abfrage Anzahl erledigte Kreditoren
    49. Range("B8").Value = iErl & " / " & iPend + iErl ' Berechnung in % der gesamthaft erledigten Kreditoren -> Ausgabe in Zelle A8
    50. If 100 / (iPend + iErl) * iErl = 100 Then ' wenn 100% erledigt dann...
    51. Range("B7").Interior.Color = RGB(128, 128, 128) ' Färbe Zelle dunkelgrau
    52. Range("B7").Value = "n"
    53. Range("B7").Font.ColorIndex = 4 ' Schriftfarbe grün -> Ampel grün
    54. Else
    55. Range("B7").Value = "n"
    56. Range("B7").Font.ColorIndex = 3 ' Schriftfarbe rot -> Ampel rot
    57. End If
    58. '************************************************************************************************
    59. '** 3. FORMATIERUNG SPALTE C
    60. '************************************************************************************************
    61. ' 3.1 Abfrage der Spalte E -> Funktionen für die Formatierung der Spalte C
    62. For i = (ersteZeile + 4) To letzteZeile Step 5
    63. If IsEmpty(Cells(i, 5).Value) = True Then
    64. Cells(i, 3).Value = "0"
    65. Else: Cells(i, 3).Value = "1"
    66. End If
    67. Next
    68. ' 5.2 Funktion für das Ampelsystem in Spalte C (Netting)
    69. iPend = WorksheetFunction.CountIf(Range("C" & ersteZeile & ":C" & letzteZeile), "0") ' Abfrage Anzahl der pendenten Kreditorenrechnungen
    70. iErl = WorksheetFunction.CountIf(Range("C" & ersteZeile & ":C" & letzteZeile), "1") ' Abfrage Anzahl erledigte Kreditoren
    71. Range("C8").Value = iErl & " / " & iPend + iErl ' Berechnung in % der gesamthaft erledigten Kreditoren -> Ausgabe in Zelle A8
    72. If 100 / (iPend + iErl) * iErl = 100 Then ' wenn 100% erledigt dann...
    73. Range("C7").Interior.Color = RGB(128, 128, 128) ' Färbe Zelle dunkelgrau
    74. Range("C7").Value = "n"
    75. Range("C7").Font.ColorIndex = 4 ' Schriftfarbe grün -> Ampel grün
    76. Else
    77. Range("C7").Value = "n"
    78. Range("C7").Font.ColorIndex = 3 ' Schriftfarbe rot -> Ampel rot
    79. End If
    80. Application.ScreenUpdating = True
    81. Application.EnableEvents = True
    82. End If
    83. End Sub


    Wie bereits eingangs erwähnt funktioniert es soweit, leider viel zu langsam. Deshalb möchte ich euch fragen, ob man etwas am Code verbessern kann, so dass die Geschwindigkeit massiv erhöht wird.
    Ich bin für jeden Input dankbar.

    Gruss
    Andreas

    CodeTags und Spoiler gesetzt ~VaporiZed

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