Проверьте наличие повторяющихся значений в столбце, а затем добавьте условное форматирование, когда SUM> 8 в соответствующих строках. - PullRequest
0 голосов
/ 22 января 2020

Я не знаю, правильно ли я сформулировал свой вопрос, похоже, я не могу сам разобраться в логике c для этой проблемы. Я работаю над Планировщиком ресурсов в Excel

Лучший способ, которым я знаю, как объяснить, это показать его со скриншотом:

  1. Проверьте, отработали ли часы в день > 8, затем примените условное форматирование к последнему добавленному номеру NA

  2. Проверьте, отработано ли количество часов в неделю,> 40, затем примените условное форматирование к последнему добавленное число для обозначения превышения часов

NA

Таким образом, в основном, я думал об этом: сначала я должен проверить для повторяющихся значений в столбце «Ресурс». Затем я должен сопоставить эти строки с фактическим столбцом DAY (например, понедельник), а затем суммировать общее количество часов каждый раз. Если сумма превышает 8, примените условное форматирование, чтобы указать на ошибку.

А затем делайте то же самое в течение целой недели, когда она превышает 40 часов.

Я не так хорош в Excel или формулах, поэтому я не могу придумать, как объединить несколько формул для достижения моей цели. Я думал о комбинации формулы Array с, возможно, несколькими операторами IF? Но я не знаю, где и как вообще начать.

Чтобы найти дубликаты, я мог бы использовать эту формулу? = COUNTIF (A: A, A2)> 1

Но тогда как мне убедиться, что соответствующие строки знают, какие ячейки использовать при проверке на SUM> 8 в день? И затем, кроме того, как мне добавить соответствующие ячейки для проверки SUM> 40 в неделю?

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Для дневного лимита вы можете попробовать следующую формулу:

=ADDRESS(ROW($E4),COLUMN(E$4),4)=ADDRESS(IF(SUMPRODUCT(($A4=$A$4:$A$14)*E$4:E$14)>8,MAX(IF(($A4=$A$1:$A$14),ROW(($A$1:$A$14))-MIN(ROW($A$1:$A$14))+1)),1),COLUMN(E4),4)

Это именно то, что вы просили.

enter image description here

Но недельная проблема сложнее, я могу предложить решение только с выделенной последней строкой, если рабочее время превышает 40.

=ADDRESS(ROW($E4),COLUMN(E$4),4)=ADDRESS(IF(SUMPRODUCT(($A4=$A$4:$A$14)*INDIRECT(ADDRESS(4,5+(7*FLOOR.MATH(MAX(COLUMN(E1)-4)/7.000001)))&":" & ADDRESS(14,11+(7*FLOOR.MATH(MAX(COLUMN(E1)-4)/7.000001)))))>40,MAX(IF(($A4=$A$1:$A$14),ROW(($A$1:$A$14))-MIN(ROW($A$1:$A$14))+1)),1),COLUMN(E4),4)

enter image description here

0 голосов
/ 23 января 2020

Возможно, используйте событие Worksheet_Change для запуска вычисления с использованием SUMIF для столбца, идентифицируемого параметром Target. Для расчета недели установите диапазон, чтобы использовать 7 столбцов с начала недели. Это усложняется, если, например, вы вводите 7 в одной строке, 2 в другой (которая подсвечивается), а затем go назад и меняете 7 на 6. Вот демонстрация, чтобы объяснить подробнее


     Private Sub Worksheet_Change(ByVal Target As Range)
       Dim iCol, iRow As Long
       Dim dDate As Date, sPerson As String
       Dim sumDay

       ' determine person, week
       ' abort if outside data sheet
       iCol = Target.Column
       iRow = Target.Row
       If iRow < 5 Or iCol < 3 Then Exit Sub

       ' determine date, person , hours
       dDate = Cells(2, iRow)
       sPerson = Cells(iRow, 2).Value ' person in col B
       sumDay = Application.WorksheetFunction.SumIf(Columns(2).EntireColumn, Range("B" & iRow), Target.EntireColumn)

       ' summate
       MsgBox sPerson & vbCr & dDate & vbCr & "Hours = " & Target.Value & vbCr & "Total = " & sumDay

       ' colour check
       If sumDay > 8 Then
         Target.Interior.Color = vbYellow
       Else
         Target.Interior.Color = vbWhite
       End If

     End Sub

     Sub createTest()
        Dim cell As Range, i As Integer, dDate As Date
        dDate = "2020-01-06"

        With ThisWorkbook.Sheets(1)
          .Cells.Clear
          For Each cell In Range("C2:L2")
             cell.Value = dDate
             cell.Offset(1, 0) = "=TEXT(" & cell.Address & ",""ddd"")"
             dDate = dDate + 1
             .Range("B4") = "Resource"

             ' records
             For i = 5 To 25
               Cells(i, 2) = "Person " & Int(5 * Rnd + 1)
             Next
          Next
        End With
        Columns("A:L").HorizontalAlignment = xlCenter
        Rows("3:3").Font.Bold = True
     End Sub
...