I'd probably start with something like this
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rEmployees As Range, rRow As Range
Dim iCol As Long, iMaxCol As Long
Dim iRest As Long, iHoliday As Long, iEmergency As Long
Dim sMsg As String
Set rEmployees = Me.Cells(1, 1).CurrentRegion
iMaxCol = rEmployees.Columns.Count
If Intersect(rEmployees, Target) Is Nothing Then Exit Sub
Set rEmployees = Intersect(rEmployees, Target)
For Each rRow In rEmployees.Rows
With rRow.EntireRow
iRest = 0
iHoliday = 0
iEmergency = 0
For iCol = 2 To iMaxCol
If .Cells(iCol).Value Like "RD" Then
iRest = iRest + 1
ElseIf Right(.Cells(iCol).Value, 1) Like "E" Then
iEmergency = iEmergency + 1
ElseIf .Cells(iCol).Value = 1 Or .Cells(iCol).Value = 0.5 Then
iHoliday = iHoliday + 1
End If
Next iCol
If iRest > 1 Then
sMsg = "Rest Days:" & vbCrLf & vbCrLf
sMsg = sMsg & " " & iRest & " Employees have Rest Days on the " & .Cells(1).Value
Call MsgBox(sMsg, vbCritical + vbOKOnly, "Day Checker")
End If
If iHoliday > 1 Then
sMsg = "Holidays:" & vbCrLf & vbCrLf
sMsg = sMsg & " " & iHoliday & " Employees have Holidays on the " & .Cells(1).Value
Call MsgBox(sMsg, vbCritical + vbOKOnly, "Day Checker")
End If
If iEmergency > 1 Then
sMsg = "Emergency Days:" & vbCrLf & vbCrLf
sMsg = sMsg & " " & iEmergency & " Employees have Emergency Days on the " & .Cells(1).Value
Call MsgBox(sMsg, vbCritical + vbOKOnly, "Day Checker")
End If
End With
Next
End Sub