Office VBA - сбой в логических критериях цикла «До» - PullRequest
0 голосов
/ 02 октября 2019

Итак, я пишу макрос 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

1 Ответ

1 голос
/ 02 октября 2019

Измените ваши критерии на:

Do Until Cells(r, c).Value <> "Sick" And Cells(4, c).Value <> "Sat" And Cells(4, c).Value <> "Sun"

Вы не можете использовать Or в сочетании с Not (в данном случае <>) таким образом. Значение никогда не может быть Not (Sat) ИЛИ Not (Sun) одновременно. Но это может быть Не (Сб) И НЕ (Солнце) - это то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...