Итак, я пишу макрос VBA, который будет подсчитывать количество случаев, когда сотрудник отсутствует по болезни. Случай болезни определяется как период непрерывных рабочих дней, когда работник регистрируется как больной (таким образом, это, очевидно, исключает выходные дни). Вы можете просмотреть мои исходные данные здесь
По какой-то причине во время выполнения логика не работает в этой строке: Do Until Cells(r, c).Value <> "Sick" And (Cells(4, c).Value <> "Sat" Or Cells(4, c).Value <> Sun")
и, следовательно, считает каждую болезнь в понедельник новым экземпляром. Например, в строке 10 «Рота» имеется два случая болезни, но макрос сообщит о четырех случаях.
Любая помощь будет принята с благодарностью.
Option Explicit
Sub AbsenceInstances()
Dim dtToday, dtStart As Date
Dim r, c, dblTodayCol, dblStartCol, dblInstances, dblAgentRow As Double
Dim rngFindRow As Range
Sheets("Rota").Select
' dtToday = Int(Now())
dtToday = "31/12/2019"
' dtStart = dtToday - 364
dtStart = "31/12/2018"
'define upper & lower boundaries of measurement area
On Error GoTo NotFound
dblTodayCol = WorksheetFunction.Match(CLng(CDate(dtToday)), Sheets("Rota").Range("5:5"), 0)
dblStartCol = WorksheetFunction.Match(CLng(CDate(dtStart)), Sheets("Rota").Range("5:5"), 0)
On Error GoTo 0
GoTo ContinueSub
NotFound:
MsgBox "Please check that your data incorporates information back to " & dtStart & ", otherwise this function will not work.", vbCritical
Exit Sub
ContinueSub:
'loop through employee list to determine number of absences
For r = 6 To 34
For c = dblStartCol To dblTodayCol
If Cells(r, c).Value = "Sick" Then
' an instance of sick is defined as contiguous days absence excluding weekends
Do Until Cells(r, c).Value <> "Sick" And (Cells(4, c).Value <> "Sat" Or Cells(4, c).Value <> "Sun")
If Cells(4, c).Value = "Sat" Then c = c + 1
c = c + 1
Loop
dblInstances = dblInstances + 1
End If
Next c
' identify employee's data-row to output result
Set rngFindRow = Sheets("Bradford scale").Range("A:A").Find(What:=Sheets("Rota").Range("B" & r).Value, _
After:=Range("A1"), LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False)
If Not rngFindRow Is Nothing Then
dblAgentRow = rngFindRow.Row
Set rngFindRow = Nothing
End If
' output result for employee
Sheets("Bradford Scale").Cells(dblAgentRow, 5).Value = dblInstances
' reset for next employee
dblInstances = 0
Next r
Sheets("Bradford Scale").Select
End Sub