2

Я использую формулу NETWORKDAYS для подсчета дней между 2 днями для ряда различных дат транзакций. Я хочу, чтобы подсчет исключал выходные и праздничные дни для каждой даты транзакции. Тем не менее, результат не выходит, как я ожидал.

Например, транзакция между 1/26 и 1/27 должна была длиться 1 день, но она считается 2 днями. Есть ли простой способ считать дни? Я попытался использовать простую формулу, такую как =C9-C8 , которая дала бы мне 1 день. Поскольку у меня есть большой объем данных для работы, было бы очень сложно использовать этот подход, исключая выходные и праздничные дни.

=NETWORKDAYS(C8,C9,holiday!$A$106:$A$117)

Пример:

Date on Column C    Result on Column F   Row 7: 1/20/10 12:00 AM           
Row 8: 1/26/10 12:00 AM          5       Row 9: 1/27/10 12:00 AM             2
Row10: 1/28/10 12:00 AM          2

6 ответов6

4

Я думаю, что это потому, что он включает в себя как начальную, так и конечную дату в расчете. Так что я думаю, что вы действительно близки, и просто нужно взять свой счет и минус 1 из него. Что-то вроде этого -

=(NETWORKDAYS(C8,C9,holiday!$A$106:$A$117)) - 1

Имеет ли это смысл?

1

Это старый вопрос, который продолжает собирать ответы на протяжении многих лет. Существующие ответы могут дать правильный результат в некоторых случаях, но проблема не так проста, как описывают эти ответы.

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

Если целью является не количество рабочих дней, содержащихся в диапазоне дат, вот некоторые из вариантов, которые необходимо обработать:

  • Начало и конец в один и тот же день. NETWORKDAYS выдает результат 1 если этот день является рабочим, или 0 если это не рабочий день. Как правило, это был бы желаемый результат, но некоторые варианты говорят, что если это рабочий день, результат в этом случае должен быть либо 0 либо долей дня (см. Следующий пункт).

  • Для планирования работ дни начала и окончания могут иметь особое значение. Работу можно назначить или начать в день начала, но этот день не считается ресурсом для выполнения задачи. В этом случае начальный день вычитается из пула ресурсных дней.

    С другой стороны, конечную дату можно рассматривать как дату завершения, а результаты должны быть получены в начале дня. В этом случае дата окончания вычитается из пула.

    Еще один сценарий рассматривает "средние дни". Работа над заданием начинается где-то в течение начального дня и завершается где-то в последний день. Таким образом, задача, выполняемая в понедельник и вторник, рассматривается как полдня в понедельник и полдня во вторник при общем ресурсе в один день. Корректировка будет вычитать полдня из даты начала и окончания.

  • Однако все это зависит от того, являются ли даты начала и окончания рабочими днями. Если период начинается в воскресенье и заканчивается в субботу, доступна полная неделя рабочих дней. Там не будет никакой корректировки.

    Если период начинается или заканчивается в нерабочий день, а другой конец периода является рабочим днем, корректировка будет зависеть от того, как рассматриваются дни начала и окончания (см. Предыдущий пункт).

Поэтому, если вы хотите использовать NETWORKDAYS для целей, отличных от предполагаемых, вам нужно создать формулу, которая будет правильно отражать то, как вы хотите просмотреть начальный и конечный дни для своих целей. Вы можете упростить эту задачу, снова используя NETWORKDAYS для корректировок.

Если вы используете начальную или конечную дату для представления диапазона дат, NETWORKDAYS вернет 0 если этот день не рабочий день, или 1 если это рабочий день. Например:

NETWORKDAYS(C8,C8,holiday!$A$106:$A$117)

вернет 0 или 1 значение для даты начала. Вы можете использовать это, чтобы создать корректировку, которая автоматически корректирует, является ли эта дата рабочим днем. Примеры:

  • Исключить дату начала, если это рабочий день:

    =NETWORKDAYS(C8,C9,holiday!$A$106:$A$117)-NETWORKDAYS(C8,C8,holiday!$A$106:$A$117)
    
  • Исключить дату окончания, если это рабочий день:

    =NETWORKDAYS(C8,C9,holiday!$A$106:$A$117)-NETWORKDAYS(C9,C9,holiday!$A$106:$A$117)
    
  • Исключите полдня из дат начала и окончания, если они являются рабочими днями:

    =NETWORKDAYS(C8,C9,holiday!$A$106:$A$117)-(NETWORKDAYS(C8,C8,holiday!$A$106:$A$117)+NETWORKDAYS(C9,C9,holiday!$A$106:$A$117))/2
    

    Обратите внимание, что если один из первого или последнего дня является нерабочим днем, вы получите значение, содержащее полдня. Для этого сценария, если вас интересуют только целые дни, вам необходимо добавить округление в нужном направлении.

Если у вас могут быть периоды одного дня, вам нужно решить, как обращаться с этим в рамках ваших правил; это может быть исключением из того, как вы определяете рабочие дни. Если вы всегда хотите считать, что это один полный рабочий день, вы можете встроить тест IF, чтобы увидеть, равен ли результат NETWORKDAYS 1 , и назначить результат 1 вместо вашей корректировки.

Если у вас могут быть периоды одного дня, которые потенциально могут приходиться на нерабочий день, вы можете использовать тест IF, чтобы проверить, что NETWORKDAYS равен 0 , и в этом случае вы можете вернуть текстовое предупреждение или вызвать состояние ошибки.

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

0

Как и выше, я согласен, что проблема заключается в том, что учитываются как начальная, так и конечная дата, и я думаю, что ответ не в том, чтобы подсчитывать вашу конечную дату.

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

Итак, если ваша начальная дата - C8, а ваша конечная дата - C9, вы хотите

= NETWORKDAYS(С8,(C9-1), праздник!$ A $ 106:$ A $ 117)

Просто, и это работает для меня по крайней мере!

0

Networkdays не учитывает субботы и воскресенья, например, начальный день: пятница. Конечный день: понедельник (networkdays-1 приведет к «1», что именно вам нужно), но когда начальный день: суббота или воскресенье, конечный день: понедельник (networkdays-1 приведет к '0', что не является правильным ответом) мы должны настроить эти выходные самостоятельно, используя функцию дня недели.

0

NETWORKDAYS считает оба дня, так как оба рабочих дня. Думайте об этом как о функции «сколько рабочих дней между 1/26 00:00 и 1/27 00:00».

Чтобы достичь того, чего вы хотите, вы можете смешать это с функцией IF.

IF(NETWORKDAYS(C8,C9,holiday!$A$106:$A$117)>1;NETWORKDAYS(C8,C9,holiday!$A$106:$A$117)-1;1)

Хотя может быть более элегантный способ сделать это.

-1

Мне нужно что-то подобное и использовал формулу ниже. Возможно, вы сможете адаптировать его к тому, что вам нужно.

= IF(ЧИСТРАБДНИ ((C2+1), D2, праздники!A1:A8)<0,0, ЧИСТРАБДНИ ((С2+1), D2, праздники!A1:A8))

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .