1k Aufrufe
Gefragt in Tabellenkalkulation von hakmatata Einsteiger_in (62 Punkte)

Liebe Leute,

ich habe es gestern schon den ganzen Tag versucht, aber nicht hinbekommen.

Ich habe eine Tabelle, wo in Spalte C die Namen von Mitarbeitern stehen.

In den jeweiligen Zeilen zum Mitarbeiter werden dann die An- und Abenwesenheiten gepflegt. Jedes Monat bzw. jeder Tag befindet sich als Spaltenüberschrift in weiteren Spalten rechts vom MA.

Hier ein Beispiel:

MA 1.1. 2.1 3.1 4.1 5.1 61.
Mayer FT 8 8 8 KR FT
Schuster FT UR UR UR UR FT
Mustermann FT 8 8 8 8 FT

Die Zahlen geben die Arbeitsstunden an, FT steht für Feiertag, KR für Krank, UR für Urlaub.

Ich benötige nun eine Formel oder wahrscheinlich viel eher ein Makro, welches mir pro MA die Anzahl von KR, UR und FT ausgibt.

Herausforderung: Als Makro Eingabe möchte ich das Monat eingeben und danach sollte sich dieses starten.

Also müsste das Makro zB. bei Eingabe "Jänner" wissen, dass es nur von 1.1. - 31.1. "sucht" und zählt.

Hat jemand evtl. soetwas schon mal benötigt und könnte mir da mit einem Code aushelfen?

DANKE

36 Antworten

0 Punkte
Beantwortet von hakmatata Einsteiger_in (62 Punkte)
Hi M.O.,

das ist echt beneidenswert, aber gut zu wissen, dass du dass schon so lange machst und das nicht von irgendwo kommt. Ich glaube immer, ich muss alles sofort verstehen und können.

ICh werde mir dann mal deinen Code ansehen und versuchen es nachzuprogrammieren. Damit werde ich wahrscheinlich erstmal Wochen beschäftigt sein, aber wie du schon schreibst: Learning by doing und von nix kommt nix ;)

Ja das wäre toll - Ich habe dir mal die aktuelle Beispieldatei mit deinem letzten Code hochgeladen.

https://filehorst.de/d/cgGFJDdD
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)

Hallo,

probier mal die folgende Formel für deinen Mitarbeiter 13:

=SUMME(I34:AM34)+SUMMENPRODUKT((I34:AM34 = "KH")*(WOCHENTAG(Ressourcenplan!I3:AM3;11)<5))*8,5+SUMMENPRODUKT((I34:AM34 = "KH")*(WOCHENTAG(Ressourcenplan!I3:AM3;11)=5))*5

Die Formel kannst du nach oben bzw. unten ziehen.

Hier werden die Stunden der Krankheitstage zu den Ist-Stunden (für Januar) addiert.

2.1. - 12. 1 Krank: 9 Tage (= 7 Tage mit 8,5h und 2 Tage mit 5h)

Das heißt die Stundenanzahl auf der PErsonalliste (Makro) sollte hier lauten:

47,5 + (8,5*7 + 5*2)= 117

Nach deiner Beispieldatei war der Mitarbeiter 13 zwischen dem 2.1. und 12.1 in Urlaub und nicht krank. Wenn du die Urlaubstage auch mit in die Ist-Stunden aufnehmen willst, kannst du die obige Formel entsprechend erweitern.

Gruß

M.O.

0 Punkte
Beantwortet von hakmatata Einsteiger_in (62 Punkte)

Guten Morgen M.O.!

Danke neuerlich!

Ich habe die Formel soeben getestet und sie funktioniert auch grundsätzlich, denn sie zählt genau die Krankheitstage zB im Falle von MA13 hinzu.

MA13 war im Jänner 7 Tage krank (6*8,5 + 1*5=56)

MA13 hat lt. Ressourcenplan im Jänner 47,5 verplanbare Stunden + 56 = 103,5

Allerdings darf ich die Stundenanzahl am Ressourcenplan nicht verändern, diese werden dann später für die Arbeitseinteilungsliste weiterverarbeitet und für diese stimmen sie.
Ich benötige die 103,5 (also + Stunden KH) lediglich auf der Reg. Karte der Personalliste, daher vermute ich, dass es nur funktioniert, wenn man diese Formel wahrscheinlich ins Makro bringt, oder?
Die FOrmel hat bei mir aber im Test nur für MA 13 funktioniert, beim übernehmen auf die anderen MA kam entweder Bezug bzw. rechnete er nicht mehr korrekt die KH Stunden hinzu, wenn ich diese dann testweise beim MA auf KH gesetzt habe....
Aber für MA 13 wie gesagt OK!
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)

Hallo,

hier das überarbeitete Makro, mit dem die Krankheitstage zu den Ist-Stunden addiert werden:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lngMonat As Long
Dim lngLSpalte As Long
Dim lngLZeile As Long
Dim arrMitarbeiter()
Dim lngZeile As Long
Dim lngSpalte As Long
Dim lngAnzahl As Long
Dim lngZaehler As Long
 
'Falls keine Eingabe in C2 erfolgt dann Makro verlassen
If Target.Address <> "$C$2" Then Exit Sub
 
'Meldungen ausschalten
Application.EnableEvents = False
'Bildschirmaktualisierung ausschalten:
Application.ScreenUpdating = False

'Inhalte Blatt Personalliste löschen
With Worksheets("Personalliste").Range("A7", Cells(Application.Max(7, Cells(Rows.Count, 1).End(xlUp).Row), 1)).Resize(, 8)
 .ClearContents 'Inhalte löschen
 .ClearComments 'Kommentar löschen
End With
 
With Worksheets("Ressourcenplan")
    'letzte Spalte in Zeile 3 des Arbeitsblatts Ressourcenplan ermitteln ermitteln
    lngLSpalte = .Cells(3, Columns.Count).End(xlToLeft).Column
    'Letzte Zeile in Spalte C ermitteln
    lngLZeile = .Cells(Rows.Count, 3).End(xlUp).Row

   'Monat zur Auswertung bestimmen
  Select Case Range("C2").Value
   Case Is = "Jänner"
     lngMonat = 1
   Case Is = "Februar"
     lngMonat = 2
   Case Is = "März"
     lngMonat = 3
   Case Is = "April"
     lngMonat = 4
   Case Is = "Mai"
     lngMonat = 5
   Case Is = "Juni"
     lngMonat = 5
   Case Is = "Juli"
     lngMonat = 6
   Case Is = "August"
     lngMonat = 8
   Case Is = "September"
     lngMonat = 9
   Case Is = "Oktober"
     lngMonat = 10
   Case Is = "November"
     lngMonat = 11
   Case Is = "Dezember"
     lngMonat = 12
  End Select
 
   'nun nach aktiven Mitarbeitern filtern
   With .Range(.Cells(20, 1), .Cells(lngLZeile, lngLSpalte))
    .AutoFilter Field:=4, Criteria1:="=aktiv"
   End With
     
   'Anzahl der gefilterten Datensätze ermitteln
   For lngZeile = 21 To lngLZeile
     If .Cells(lngZeile, 4).Value = "aktiv" Then lngAnzahl = lngAnzahl + 1
   Next lngZeile
   
   'Feld für Auswertung Redimensionieren
   ReDim arrMitarbeiter(lngAnzahl, 8)
 
   'nun gefilterte Zeilen durchlaufen und Daten in Feld einlesen
   For lngZeile = 21 To lngLZeile
    If .Rows(lngZeile).Hidden = False Then
      lngZaehler = lngZaehler + 1
      arrMitarbeiter(lngZaehler, 0) = .Cells(lngZeile, 2) 'Nummer des Mitarbeiters
      arrMitarbeiter(lngZaehler, 1) = .Cells(lngZeile, 3) 'Name des Mitarbeiters
      'Stunden des jeweiligen Monats suchen
      For lngSpalte = 5 To lngLSpalte
       If .Cells(20, lngSpalte) = Worksheets("Personalliste").Range("C2").Value Then
         arrMitarbeiter(lngZaehler, 2) = .Cells(lngZeile, lngSpalte) 'Arbeitsstunden im Monat
         Exit For
       End If
      Next lngSpalte
      'nun Feiertage, Urlaub und Krank des Monats zählen
      'dazu wieder alles Spalten durchlaufen
      'zuerst wird geprüft, ob in Zeile 3 ein Datum stehn
      For lngSpalte = 5 To lngLSpalte
        If IsDate(.Cells(3, lngSpalte)) = True Then
          'nun prüfen, ob Datum in dem gesuchten Monat liegt
          If Month(.Cells(3, lngSpalte)) = lngMonat Then
           'falls ja, dann prüfen, ob etwas in der betreffenden Spalte steht und entsprechenden Zähler erhöhen
            If .Cells(lngZeile, lngSpalte).Value = "FT" Then
                arrMitarbeiter(lngZaehler, 3) = arrMitarbeiter(lngZaehler, 3) + 1  'Feiertag
                arrMitarbeiter(lngZaehler, 6) = arrMitarbeiter(lngZaehler, 6) & Chr(10) & .Cells(3, lngSpalte) 'Datum des Feiertages
            End If
            If .Cells(lngZeile, lngSpalte).Value = "UR" Then
              arrMitarbeiter(lngZaehler, 4) = arrMitarbeiter(lngZaehler, 4) + 1  'Urlaub
              arrMitarbeiter(lngZaehler, 7) = arrMitarbeiter(lngZaehler, 7) & Chr(10) & .Cells(3, lngSpalte)
            End If
            If .Cells(lngZeile, lngSpalte).Value = "KH" Then
              arrMitarbeiter(lngZaehler, 5) = arrMitarbeiter(lngZaehler, 5) + 1  'Krank
              arrMitarbeiter(lngZaehler, 8) = arrMitarbeiter(lngZaehler, 8) & Chr(10) & .Cells(3, lngSpalte)
              'hier werden noch die Soll-Stunden für die Krankheitstage zu den Ist-Stunden addiert, Montag - Donnerstag je 8,5 Std. und Freitag 5 Stunden
              If Weekday(.Cells(3, lngSpalte), vbMonday) < 5 Then arrMitarbeiter(lngZaehler, 2) = arrMitarbeiter(lngZaehler, 2) + 8.5
              If Weekday(.Cells(3, lngSpalte), vbMonday) = 5 Then arrMitarbeiter(lngZaehler, 2) = arrMitarbeiter(lngZaehler, 2) + 5
             End If
          End If
        End If
      Next lngSpalte
    End If
   Next lngZeile
   
    'Filter wieder aufheben
   With .Range(.Cells(20, 1), .Cells(lngLZeile, lngLSpalte))
    .AutoFilter
   End With
    
  End With
 
 'Nun Daten in Personalliste übertragen
 With Worksheets("Personalliste")
  For lngZeile = 1 To lngZaehler
   For lngSpalte = 0 To 5
     With .Cells(lngZeile + 6, lngSpalte + 1)
      .Value = arrMitarbeiter(lngZeile, lngSpalte)
      'Daten der Fehlzeiten als Kommentar einfügen
      If lngSpalte > 2 And arrMitarbeiter(lngZeile, lngSpalte + 3) <> "" Then
        .AddComment
        .Comment.Visible = False
        .Comment.Text Text:=arrMitarbeiter(lngZeile, 1) & Chr(10) & Right(arrMitarbeiter(lngZeile, lngSpalte + 3), Len(arrMitarbeiter(lngZeile, lngSpalte + 3)) - 1) 'Daten als Kommentar ausgeben
        With .Comment.Shape.TextFrame
            .AutoSize = True
        End With
      End If
     End With
   Next lngSpalte
   
  Next lngZeile
 End With
 
'Bildschirmaktualisierung einschalten:
Application.ScreenUpdating = True
'Meldungen wieder anzeigen
Application.EnableEvents = True

End Sub

Gruß

M.O.

0 Punkte
Beantwortet von hakmatata Einsteiger_in (62 Punkte)

Hi M.O.,

du hast mir vor 1 Monat sehr weitergeholfen mit deinem Makro, welches die Urlaubs- und Krankheitstage der MA auswertet. Es erleichtert bislang den Alltag erheblich - Nun musste ich ein paar Spalten einfügen und hab dadurch das Makro in die Knie gezwungen - Irgendwas taugt im nicht beim AutoFilter und ich spiele mich schon den halben Tag herum und finde es nicht raus - Wäre es möglich, dass du mal kurz drüber siehst?

Das ist nicht das original, sondern ein anonymisierter "Clone", aber der Fehler bleibt der gleiche wenn man die Struktur nicht ändert.

https://filehorst.de/d/cAFxpjFn

Beim Makro zählen auf RegKarte Personalliste benötige ich noch eine Möglichkeit, wie man die Gesamtstunden des jeweiligen Monats zählen kann.
Ein Wochentag MO-DO sollte dabei mit 8,5 gerechnet werden und ein Freitag mit 5, Feiertag sollen unberücksichtigt bleiben.
Diesen Wert würde ich in Zelle C3 benötigen.
Bsp. Jänner 2018: 19x8.5 + 4*5 = 181,5
BITTE BITTE das wäär echt super, wenn du mich hier noch mal unterstützen könntest ;)
DANKE
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Bearbeitet von m-o

Hallo,

ich habe das Makro angepasst:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lngMonat As Long
Dim lngLSpalte As Long
Dim lngLZeile As Long
Dim arrMitarbeiter()
Dim lngZeile As Long
Dim lngSpalte As Long
Dim lngAnzahl As Long
Dim lngZaehler As Long
 
'Falls keine Eingabe in C2 erfolgt dann Makro verlassen
If Target.Address <> "$C$2" Then Exit Sub
 
'Meldungen ausschalten
Application.EnableEvents = False
'Bildschirmaktualisierung ausschalten:
Application.ScreenUpdating = False

'Inhalte Blatt Personalliste löschen
With Worksheets("Personalliste").Range("A7", Cells(Application.Max(7, Cells(Rows.Count, 1).End(xlUp).Row), 1)).Resize(, 8)
 .ClearContents 'Inhalte löschen
 .ClearComments 'Kommentar löschen
End With
 
With Worksheets("Ressourcenplan")
    'letzte Spalte in Zeile 3 des Arbeitsblatts Ressourcenplan ermitteln ermitteln
    lngLSpalte = .Cells(3, Columns.Count).End(xlToLeft).Column
    'Letzte Zeile in Spalte C ermitteln
    lngLZeile = .Cells(Rows.Count, 3).End(xlUp).Row

   'Monat zur Auswertung bestimmen
  Select Case Range("C2").Value
   Case Is = "Jänner"
     lngMonat = 1
   Case Is = "Februar"
     lngMonat = 2
   Case Is = "März"
     lngMonat = 3
   Case Is = "April"
     lngMonat = 4
   Case Is = "Mai"
     lngMonat = 5
   Case Is = "Juni"
     lngMonat = 5
   Case Is = "Juli"
     lngMonat = 6
   Case Is = "August"
     lngMonat = 8
   Case Is = "September"
     lngMonat = 9
   Case Is = "Oktober"
     lngMonat = 10
   Case Is = "November"
     lngMonat = 11
   Case Is = "Dezember"
     lngMonat = 12
  End Select
 
 
  'ggf im Arbeitsblatt vorhandene Filter aufheben
  If .FilterMode Then .ShowAllData
 
   'nun nach aktiven Mitarbeitern in Spalte C filtern
   With .Range(.Cells(20, 3), .Cells(lngLZeile, 3))
      .AutoFilter Field:=1, Criteria1:="=aktiv"
   End With
     
   'Anzahl der gefilterten Datensätze ermitteln
   For lngZeile = 21 To lngLZeile
     If .Cells(lngZeile, 3).Value = "aktiv" Then lngAnzahl = lngAnzahl + 1
   Next lngZeile
   
   'Feld für Auswertung Redimensionieren
   ReDim arrMitarbeiter(lngAnzahl, 8)
 
   'nun gefilterte Zeilen durchlaufen und Daten in Feld einlesen
   For lngZeile = 21 To lngLZeile
    If .Rows(lngZeile).Hidden = False Then
      lngZaehler = lngZaehler + 1
      arrMitarbeiter(lngZaehler, 0) = .Cells(lngZeile, 1) 'Nummer des Mitarbeiters - Spalte A
      arrMitarbeiter(lngZaehler, 1) = .Cells(lngZeile, 2) 'Name des Mitarbeiters - Spalte B
      'Stunden des jeweiligen Monats suchen
      For lngSpalte = 5 To lngLSpalte
       If .Cells(20, lngSpalte) = Worksheets("Personalliste").Range("C2").Value Then
         arrMitarbeiter(lngZaehler, 2) = .Cells(lngZeile, lngSpalte) 'Arbeitsstunden im Monat
         Exit For
       End If
      Next lngSpalte
      'nun Feiertage, Urlaub und Krank des Monats zählen
      'dazu wieder alles Spalten durchlaufen
      'zuerst wird geprüft, ob in Zeile 3 ein Datum stehn
      For lngSpalte = 5 To lngLSpalte
        If IsDate(.Cells(3, lngSpalte)) = True Then
          'nun prüfen, ob Datum in dem gesuchten Monat liegt
          If Month(.Cells(3, lngSpalte)) = lngMonat Then
           'falls ja, dann prüfen, ob etwas in der betreffenden Spalte steht und entsprechenden Zähler erhöhen
            If .Cells(lngZeile, lngSpalte).Value = "FT" Then
                arrMitarbeiter(lngZaehler, 3) = arrMitarbeiter(lngZaehler, 3) + 1  'Feiertag
                arrMitarbeiter(lngZaehler, 6) = arrMitarbeiter(lngZaehler, 6) & Chr(10) & .Cells(3, lngSpalte) 'Datum des Feiertages
            End If
            If .Cells(lngZeile, lngSpalte).Value = "UR" Then
              arrMitarbeiter(lngZaehler, 4) = arrMitarbeiter(lngZaehler, 4) + 1  'Urlaub
              arrMitarbeiter(lngZaehler, 7) = arrMitarbeiter(lngZaehler, 7) & Chr(10) & .Cells(3, lngSpalte)
            End If
            If .Cells(lngZeile, lngSpalte).Value = "KH" Then
              arrMitarbeiter(lngZaehler, 5) = arrMitarbeiter(lngZaehler, 5) + 1  'Krank
              arrMitarbeiter(lngZaehler, 8) = arrMitarbeiter(lngZaehler, 8) & Chr(10) & .Cells(3, lngSpalte)
              'hier werden noch die Soll-Stunden für die Krankheitstage zu den Ist-Stunden addiert, Montag - Donnerstag je 8,5 Std. und Freitag 5 Stunden
              If Weekday(.Cells(3, lngSpalte), vbMonday) < 5 Then arrMitarbeiter(lngZaehler, 2) = arrMitarbeiter(lngZaehler, 2) + 8.5
              If Weekday(.Cells(3, lngSpalte), vbMonday) = 5 Then arrMitarbeiter(lngZaehler, 2) = arrMitarbeiter(lngZaehler, 2) + 5
             End If
          End If
        End If
      Next lngSpalte
    End If
   Next lngZeile
   
    'Filter wieder aufheben
   With .Range(.Cells(20, 3), .Cells(lngLZeile, lngLSpalte))
    .AutoFilter
   End With
    
  End With
 
 'Nun Daten in Personalliste übertragen
 With Worksheets("Personalliste")
  For lngZeile = 1 To lngZaehler
   For lngSpalte = 0 To 5
     With .Cells(lngZeile + 6, lngSpalte + 1)
      .Value = arrMitarbeiter(lngZeile, lngSpalte)
      'Daten der Fehlzeiten als Kommentar einfügen
      If lngSpalte > 2 And arrMitarbeiter(lngZeile, lngSpalte + 3) <> "" Then
        .AddComment
        .Comment.Visible = False
        .Comment.Text Text:=arrMitarbeiter(lngZeile, 1) & Chr(10) & Right(arrMitarbeiter(lngZeile, lngSpalte + 3), Len(arrMitarbeiter(lngZeile, lngSpalte + 3)) - 1) 'Daten als Kommentar ausgeben
        With .Comment.Shape.TextFrame
            .AutoSize = True
        End With
      End If
     End With
   Next lngSpalte
   
  Next lngZeile
 End With
 
'Bildschirmaktualisierung einschalten:
Application.ScreenUpdating = True
'Meldungen wieder anzeigen
Application.EnableEvents = True

End Sub

In deiner Testdatei funktioniert es so jedenfalls.

In C3 werden ja schon die Stunden aus dem Ressourcenplan ausgegeben. Wird diese Zahl dann nicht mehr benötigt? Wenn du die Soll-Arbeitsstunden per Makro zählen willst, ist das etwas aufwendig, da du ja für jedes Jahr die beweglichen Feiertage berechnen musst.Und auch die festen Feiertage müssen natürlich entsprechend hinterlegt werden. Das ist im Prinzip alles machbar, aber dann muss ich erst mal überlegen, wie man das am Besten löst.

Gruß

M.O.

0 Punkte
Beantwortet von hakmatata Einsteiger_in (62 Punkte)
DANKE für die rasche Antwort M.O.!

In der abgespeckten Version hat es jetzt funktioniert, in der "großen" Datei leider noch nicht. - Der Laufzeitfehler tritt jetzt an folgender Stelle auf:

'Filter wieder aufheben
   With .Range(.Cells(20, 3), .Cells(lngLZeile, lngLSpalte))
    .AutoFilter

Hier kannst du es nachvollziehen, wieder die anonymisierte Variante: (Probier es mal mit der September Auswertung)

https://filehorst.de/d/cIgiwfry

@Soll Arbeitsstunden: In C3 wird bei mir bislang noch kein Wert ausgegeben? Hier steht bei mir (auch in den funktionierenden Versionen des Makro) nur "Berechnung durch Makro"

Im Prinzip sollen hier die Maximal Möglichen Stunden pro Monat gezählt werden - Also jeder MO-DO mit 8,5 und jeder Freitag mit 5h. Auch Feiertage sollen mitgezählt werden, das meine ich mit "Feiertage bleiben unberücksichtigt". Da hätten wir das Problem mit den verschiebendenden Feiertagen theoretisch "entschärft"....

Im Prinzip müsste man die Anzahl der Wochentage pro Monat auswerten und wie geschrieben MO-DO mit je 8,5 rechnen und die Freitage mit 5h um die maximalen Stunden/Monat zu bekommen. Dieser Wert sollte dann in C3 stehen wo aktuell noch steht "Berechnung durch Makro"

DANKE!!
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)

Hallo,

probier mal, ob das so jetzt besser klappt:

 'Filter wieder aufheben
   With .Range(.Cells(20, 3), .Cells(lngLZeile, 3))
    .AutoFilter
   End With

Bei deiner hochgeladenen (ersten) Datei hat das Makro aber so wie gepostet geklappt. Wolltest du noch eine weitere Datei hochladen?

Mit den Feiertagen hatte ich zu kompliziert gedacht, du hast ja im Blatt "Ressourcenplanung" die Feiertage eingetragen. Über dieses Blatt kann man ja die Soll-Stunden pro Monat berechnen. Ich habe auch schon eine Idee, wie man das umsetzen kann.

Gruß

M.O.

0 Punkte
Beantwortet von hakmatata Einsteiger_in (62 Punkte)
Bearbeitet von hakmatata

Hi,

ich hab den Post vorhin abgesendet und erst dann den Link hinzugefügt - Das hat sich vermutlich gerade überschnitten.

Hier ist die Letztversion mit der es auch mit deinem letzten Vorschlag nicht klappt:

https://filehorst.de/d/cIgiwfry

Variante 2: With .Range(.Cells(20, 3), .Cells(lngLZeile, 3))

Wenn ich es mit Variante 2 versuche dann bekomme ich zwar keinen Laufzeitfehler, aber dann springt das Makro irgendwie erst gar nicht an, zumindest stellt er sich dann "tot";(

@Feiertage: Das gute ist, dass ich diese nicht berücksichtigen muss also abziehen muss von den SollStunden. Diese können wie normale Tage behandelt werden - Also so, wie vorhin geschrieben:

"Im Prinzip müsste man die Anzahl der Wochentage pro Monat auswerten und wie geschrieben MO-DO mit je 8,5 rechnen und die Freitage mit 5h um die maximalen Stunden/Monat zu bekommen. Dieser Wert sollte dann in C3 stehen wo aktuell noch steht "Berechnung durch Makro""

0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Bearbeitet von m-o

Hallo,

ich habe das Makro jetzt an deine neue Beispieltabelle angepasst. Außerdem werden die Soll-Stunden - ohne Berücksichtigung von Feiertagen - ermittelt und dann in Zelle C3 geschrieben:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lngMonat As Long
Dim lngLSpalte As Long
Dim lngLZeile As Long
Dim arrMitarbeiter()
Dim lngZeile As Long
Dim lngSpalte As Long
Dim lngAnzahl As Long
Dim lngZaehler As Long
Dim sinSollstunden As Single
 
'Falls keine Eingabe in C2 erfolgt dann Makro verlassen
If Target.Address <> "$C$2" Then Exit Sub
 
'Meldungen ausschalten
Application.EnableEvents = False
'Bildschirmaktualisierung ausschalten:
Application.ScreenUpdating = False

'Inhalte Blatt Personalliste löschen
With Worksheets("Personalliste").Range("A7", Cells(Application.Max(7, Cells(Rows.Count, 1).End(xlUp).Row), 1)).Resize(, 8)
 .ClearContents 'Inhalte löschen
 .ClearComments 'Kommentar löschen
End With
 
With Worksheets("Ressourcenplan")
    'letzte Spalte in Zeile 3 des Arbeitsblatts Ressourcenplan ermitteln ermitteln
    lngLSpalte = .Cells(3, Columns.Count).End(xlToLeft).Column
    'Letzte Zeile in Spalte C ermitteln
    lngLZeile = .Cells(Rows.Count, 3).End(xlUp).Row

   'Monat zur Auswertung bestimmen
  Select Case Range("C2").Value
   Case Is = "Jänner"
     lngMonat = 1
   Case Is = "Februar"
     lngMonat = 2
   Case Is = "März"
     lngMonat = 3
   Case Is = "April"
     lngMonat = 4
   Case Is = "Mai"
     lngMonat = 5
   Case Is = "Juni"
     lngMonat = 6
   Case Is = "Juli"
     lngMonat = 7
   Case Is = "August"
     lngMonat = 8
   Case Is = "September"
     lngMonat = 9
   Case Is = "Oktober"
     lngMonat = 10
   Case Is = "November"
     lngMonat = 11
   Case Is = "Dezember"
     lngMonat = 12
  End Select
 
 
  'ggf im Arbeitsblatt vorhandene Filter aufheben
  If .FilterMode Then .ShowAllData
 
   'nun nach aktiven Mitarbeitern in Spalte C filtern
   With .Range(.Cells(20, 4), .Cells(lngLZeile, 4))
      .AutoFilter Field:=1, Criteria1:="=aktiv"
   End With
     
   'Anzahl der gefilterten Datensätze ermitteln
   For lngZeile = 21 To lngLZeile
     If .Cells(lngZeile, 4).Value = "aktiv" Then lngAnzahl = lngAnzahl + 1
   Next lngZeile
   
   'Feld für Auswertung Redimensionieren
   ReDim arrMitarbeiter(lngAnzahl, 8)
 
   'nun gefilterte Zeilen durchlaufen und Daten in Feld einlesen
   For lngZeile = 21 To lngLZeile
    If .Rows(lngZeile).Hidden = False Then
      lngZaehler = lngZaehler + 1
      arrMitarbeiter(lngZaehler, 0) = .Cells(lngZeile, 2) 'Nummer des Mitarbeiters - Spalte B
      arrMitarbeiter(lngZaehler, 1) = .Cells(lngZeile, 3) 'Name des Mitarbeiters - Spalte 3
      'Stunden des jeweiligen Monats suchen
      For lngSpalte = 5 To lngLSpalte
       If .Cells(20, lngSpalte) = Worksheets("Personalliste").Range("C2").Value Then
         arrMitarbeiter(lngZaehler, 2) = .Cells(lngZeile, lngSpalte) 'Arbeitsstunden im Monat
         Exit For
       End If
      Next lngSpalte
      'nun Feiertage, Urlaub und Krank des Monats zählen
      'dazu wieder alles Spalten durchlaufen
      'zuerst wird geprüft, ob in Zeile 3 ein Datum stehn
      For lngSpalte = 5 To lngLSpalte
        If IsDate(.Cells(3, lngSpalte)) = True Then
          'nun prüfen, ob Datum in dem gesuchten Monat liegt
          If Month(.Cells(3, lngSpalte)) = lngMonat Then
           'falls ja, dann prüfen, ob etwas in der betreffenden Spalte steht und entsprechenden Zähler erhöhen
            If .Cells(lngZeile, lngSpalte).Value = "FT" Then
                arrMitarbeiter(lngZaehler, 3) = arrMitarbeiter(lngZaehler, 3) + 1  'Feiertag
                arrMitarbeiter(lngZaehler, 6) = arrMitarbeiter(lngZaehler, 6) & Chr(10) & .Cells(3, lngSpalte) 'Datum des Feiertages
            End If
            If .Cells(lngZeile, lngSpalte).Value = "UR" Then
              arrMitarbeiter(lngZaehler, 4) = arrMitarbeiter(lngZaehler, 4) + 1  'Urlaub
              arrMitarbeiter(lngZaehler, 7) = arrMitarbeiter(lngZaehler, 7) & Chr(10) & .Cells(3, lngSpalte)
            End If
            If .Cells(lngZeile, lngSpalte).Value = "KH" Then
              arrMitarbeiter(lngZaehler, 5) = arrMitarbeiter(lngZaehler, 5) + 1  'Krank
              arrMitarbeiter(lngZaehler, 8) = arrMitarbeiter(lngZaehler, 8) & Chr(10) & .Cells(3, lngSpalte)
              'hier werden noch die Soll-Stunden für die Krankheitstage zu den Ist-Stunden addiert, Montag - Donnerstag je 8,5 Std. und Freitag 5 Stunden
              If Weekday(.Cells(3, lngSpalte), vbMonday) < 5 Then arrMitarbeiter(lngZaehler, 2) = arrMitarbeiter(lngZaehler, 2) + 8.5
              If Weekday(.Cells(3, lngSpalte), vbMonday) = 5 Then arrMitarbeiter(lngZaehler, 2) = arrMitarbeiter(lngZaehler, 2) + 5
            End If
              
              'Soll-Stunden ermitteln - ohne Berücksichtigung von Feiertagen
              If lngZaehler = 1 Then
              If Weekday(.Cells(3, lngSpalte), vbMonday) < 5 Then sinSollstunden = sinSollstunden + 8.5
              If Weekday(.Cells(3, lngSpalte), vbMonday) = 5 Then sinSollstunden = sinSollstunden + 5
                           
             End If
          End If
        End If
      Next lngSpalte
    End If
   Next lngZeile
   
    'Filter wieder aufheben
   With .Range(.Cells(20, 4), .Cells(lngLZeile, 4))
    .AutoFilter
   End With
    
  End With
 
 'Nun Daten in Personalliste übertragen
 With Worksheets("Personalliste")
  'Sollstunden in Zelle C3 schreiben
  .Range("C3") = sinSollstunden
  For lngZeile = 1 To lngZaehler
   For lngSpalte = 0 To 5
     With .Cells(lngZeile + 6, lngSpalte + 1)
      .Value = arrMitarbeiter(lngZeile, lngSpalte)
      'Daten der Fehlzeiten als Kommentar einfügen
      If lngSpalte > 2 And arrMitarbeiter(lngZeile, lngSpalte + 3) <> "" Then
        .AddComment
        .Comment.Visible = False
        .Comment.Text Text:=arrMitarbeiter(lngZeile, 1) & Chr(10) & Right(arrMitarbeiter(lngZeile, lngSpalte + 3), Len(arrMitarbeiter(lngZeile, lngSpalte + 3)) - 1) 'Daten als Kommentar ausgeben
        With .Comment.Shape.TextFrame
            .AutoSize = True
        End With
      End If
     End With
   Next lngSpalte
   
  Next lngZeile
 End With
 
'Bildschirmaktualisierung einschalten:
Application.ScreenUpdating = True
'Meldungen wieder anzeigen
Application.EnableEvents = True

End Sub

Gruß

M.O.

...