Сумма по каждой второй ячейке, если соседняя ячейка не пуста

2

Я создал расписание в Excel, чтобы отслеживать мое рабочее время. Все работает довольно хорошо, но у меня есть одна маленькая проблема.

Мой лист имеет следующий макет ( In= начал работать, Out= перестал работать):

A          | B     | C     | D     | E     | F     | G
-----------+-------+-------+-------+-------+-------+------
Date       | In    | Out   | In    | Out   | In    | Out
01.03.2014 |       |       |       |       |       |       (weekend)
02.03.2014 |       |       |       |       |       |       (weekend)
03.03.2014 | 08:00 | 12:00 | 12:45 | 17:00 |       |
04.03.2014 | 08:45 | 13:30 | 13:45 | 17:45 |       |
05.03.2014 | 08:15 | 12:30 | 13:00 | 18:00 |       |
06.03.2014 | 08:00 | 12:30 | 13:00 | 17:30 |       |
...

Теперь я хотел бы рассчитать время, которое я работал каждый день. Это легко:

= SUM($C2; $E2; $G2) - SUM($B2; $D2; $F2)

Это даже сработает, если я пропущу ланч иногда так:

A          | B     | C     | D     | E     | F     | G
-----------+-------+-------+-------+-------+-------+------
Date       | In    | Out   | In    | Out   | In    | Out
01.03.2014 |       |       |       |       |       |       (weekend)
02.03.2014 |       |       |       |       |       |       (weekend)
03.03.2014 | 08:00 | 12:00 | 12:45 | 17:00 |       |
04.03.2014 | 08:45 |       |       | 17:45 |       |
05.03.2014 | 08:15 | 12:30 | 13:00 | 18:00 |       |
06.03.2014 | 08:00 | 12:30 | 13:00 | 17:30 |       |
...

Но он не работает в течение дня, когда я ввел время, когда я начал работать ( In), но не ввел время, когда я перестал работать ( Out):

A          | B     | C     | D     | E     | F     | G
-----------+-------+-------+-------+-------+-------+------
Date       | In    | Out   | In    | Out   | In    | Out
01.03.2014 |       |       |       |       |       |       (weekend)
02.03.2014 |       |       |       |       |       |       (weekend)
03.03.2014 | 08:00 | 12:00 | 12:45 | 17:00 |       |
04.03.2014 | 08:45 |       |       | 17:45 |       |
05.03.2014 | 08:15 | 12:30 | 13:00 | 18:00 |       |
06.03.2014 | 08:00 | 12:30 | 13:00 |       |       |
...

К 06.03.2014этому приведет отрицательное время.

То , что я хотел бы иметь время , что я на самом деле работал утром, то есть 04:30на 06.03.2014. Это означает, что мне нужно включить только те столбцы во вторую (отрицательную) сумму, где соседний столбец не пустой. Как я могу сделать это общим способом, который все еще поддерживает пропуск обеда? Под «общим способом» я подразумеваю формулу, которая также будет работать для столбцов F, G и, возможно, H, I ... Так что это не должно быть простой формулировкой IFутверждений.

Я хотел использовать функцию SUMIFили SUMIFS, но, насколько я понял, он принимает только диапазоны как B1:G1, но не принимает что-то вроде B1;D1;F1, то есть пропускает каждый второй столбец. Я понятия не имею, как я могу это сделать, потому что я вообще не эксперт по Excel ... Это то, что я пробовал до сих пор, но это не работает, это только дает мне #VALUE:

= SUM($C2; $E2; $G2) - SUMIF(($C2; $E2; $G2); "<>"; ($B2; $D2; $F2))

Это должно означать: суммировать по C, E и G и вычитать сумму B, D и F, если соответствующие ячейки в C, E и G не пусты. Однако круглые скобки вокруг диапазонов, похоже, не работают. Или проблема в другом?

gehho
источник
Попробуйте использовать дополнительные скрытые столбцы для суммирования результатов. Например, в R1 есть «= IF (B1, B1,0)», в S1 есть «= IF (D1, D1,0)», а затем в U1 есть = сумма (R1: S1) и использовать это для табулирования результатов ,
ScottAndrewRogers
@ScottAndrewRogers Спасибо за ваше предложение. Это может привести к решению. Однако, в конце концов, это просто разделение большой формулы на несколько столбцов. Это не то, что я хочу. Там должно быть аккуратное решение этой проблемы. По крайней мере, я надеюсь ... :)
Gehho

Ответы:

2

Я черпал вдохновение из подхода Мэдбола, но без необходимости в дополнительном ряду. Используйте это для строки 2, скопированной вниз

=C2+E2+G2-B2-D2-F2+MOD(COUNT(B2:G2),2)*MAX(B2:G2)

Это добавление лет / вычитает раз , сколько необходимо , но добавляет назад в последний раз (игнорируя его) , когда есть нечетное число раз , вставленные.

Барри Гудини
источник
Большой! И так просто! Кажется, работает для всех случаев, которые мне нужны. Большое спасибо!
Gehho
На самом деле, я немного изменил его, чтобы было легче понять. Я заменил MODс , ISODDпотому что это то , что мы проверяем:=C2+E2+G2 - B2-D2-F2 + IF(ISODD(COUNT(B2:G2)), MAX(B2:G2), 0)
gehho
@gehho, я полагаю, я застрял в прошлом! - Я всегда избегал ISODD, потому что в Excel 2003 и более ранних версиях это была надстройка (Analysis ToolPak). В 2010, тем не менее, нет никаких проблем
Барри Гудини
2

Вот что я бы сделал. Если вставить дополнительные столбцы, формула легко корректируется:

  1. Добавьте в первой строке серию 1, -1,1, -1 ... Это используется, чтобы мы знали, является ли это сложением или вычитанием.
  2. Справа (H в вашем примере) используйте эту формулу: =IF(ISODD(COUNT(B3:G3)),SUMPRODUCT($B$1:$G$1,B3:G3)+MAX(B3:G3),SUMPRODUCT($B$1:$G$1,B3:G3))

Это работает в вашем примере для каждого случая (кроме странных вещей, таких как два раза подряд): введите описание изображения здесь

Объяснение: SUMPRODUCT умножает каждую ячейку в массиве на своего партнера в другом массиве, а затем складывает все вместе. Так, 3/6, это делает 8 * -1 + 12: 30 * 1 + 13: 00 * -1 + 17: 30 * 1 + 0 * -1 + 0 * 1.

Если есть нечетное количество входов / выходов / это добавляет последний (самый высокий) раз, чтобы нейтрализовать его.

Madball73
источник
+1 за хорошее решение! Однако я принял ответ Барри Гудини, потому что он намного проще и даже работает без дополнительного ряда - что мне не понравилось в вашем подходе. В любом случае, большое спасибо, потому что ваше решение привело к принятому ответу!
Gehho
1

Я не уверен, что полностью понимаю ваш вопрос, но это работает

введите описание изображения здесь

Я использовал простое утверждение if

=SUM(IF(C2<>"",C2-B2,0),IF(E2<>"",E2-D2,0))

Это будет даже неполный рабочий день (например, строка 4, где работал только полдень).

Если вам нужно добавить третий набор входов / выходов, обновите формулу в соответствии с

=SUM(IF(C2<>"",C2-B2,0),IF(E2<>"",E2-D2,0),IF(G2<>"",G2-F2,0))
Дейв
источник
Прямо извините, был только один, когда я написал комментарий.
Дамир Касипович
Спасибо за ваше предложение! У меня было похожее решение в начале. Однако это не относится к случаю, когда я пропускаю обеденный перерыв, то есть столбцы B и E заполнены, а C и D - нет. Смотрите мой пример в вопросе.
gehho
Понятно ... Но почему бы вам просто не поместить время в камеру, чтобы она работала? Ваш ОП не утверждает, что одним из вариантов является обеденный перерыв, и, как таковой, не подразумевает, что он необходим? Что бы произошло, если бы вы пообедали, а после обеда пошли к врачу? Значит ли это, что вам нужен еще один набор входов / выходов?
Дэйв
Я также вычисляю среднее время входа и выхода. Так что, если я войду 18:00в столбец C, это приведет к неправильному среднему значению для столбцов Cи Eпотому что Cна самом деле это мой столбец для "на обед". (Тем не менее, вы правы насчет визита к врачу ... Возможно, мне следует добавить еще десять столбцов для непредвиденных перерывов.;)) Мне это не очень нужно, но я бы хотел, чтобы это было. И я решил найти решение, которое может справиться со всеми этими случаями.
gehho
1
@DaveRook Вы видели смайлик за моим предложением о дополнительных десяти столбцах? Это была шутка, но мне бы очень хотелось разобраться с (относительно распространенным) случаем с пропущенным перерывом на обед.
gehho
1

Попробуйте это VBa

Это результат

введите описание изображения здесь

Это не полностью проверено (кроме того, что показано на снимке экрана) ...

Sub Button1_Click()

    startingRow = 2' UPDATE THIS FOR THE STARTING ROW (in this example, I started on row 2 since row 1 is titles)
    numberOfRows = 6 ' UPDATE THIS FOR YOUR NUMBER OF ROWS

    For rowNumber = startingRow To numberOfRows

        Dim isContinuous As Boolean

        isContinuous = True

        Dim inCols(0 To 2) As Integer

        '65 is A, '66 is B etc

        inCols(0) = 66
        inCols(1) = 68
        inCols(2) = 70

        For Each inElement In inCols

            Dim totalTime As Integer

            If (Range(Chr(inElement) & rowNumber).Value <> "") Then
                Dim inDate As Date
                inDate = Range(Chr(inElement) & rowNumber).Value

                Dim outCols(0 To 2) As Integer

                outCols(0) = 67
                outCols(1) = 69
                outCols(2) = 71

                Dim hasOutValue As Boolean

                hasOutValue = False

                For Each outElement In outCols
                    If (inElement < outElement) Then
                        If (Range(Chr(outElement) & rowNumber).Value <> "") Then
                            Dim outDate As Date
                            outDate = Range(Chr(outElement) & rowNumber).Value
                            If (isContinuous = True) Then
                                totalTime = totalTime + DateDiff("h", inDate, outDate)
                            Else
                                totalTime = DateDiff("h", inDate, outDate)
                            End If

                            hasOutValue = True
                            Exit For
                        Else
                            isContinuous = False
                        End If

                    End If
                Next
                If hasOutValue = False Then
                    totalTime = 0
                End If

            End If

        Next
        Range("H" & rowNumber).Value = CStr(totalTime)
    Next rowNumber

End Sub
Дейв
источник
-1

Как насчет того, чтобы попытаться заменить это:

= SUM($C2; $E2; $G2)

с этим:

= SUM(IF($C2="";TEXT(NOW(); "hh:mm");$C2); IF($E2="";TEXT(NOW(); "hh:mm");$E2); IF($G2="";TEXT(NOW(); "hh:mm");$G2))

Эта формула должна помещать текущее время в пустые ячейки ($ C2, $ E2, $ G2), что должно дать вам больше реального рабочего времени. В конце концов, вы работаете до сих пор, не так ли?

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