Формула ячейки Excel: временная ошибка сравнения вычисленных и введенных вручную значений времени - PullRequest
0 голосов
/ 23 марта 2020

ПРИМЕЧАНИЕ: я несколько раз проверял несколькими различными методами, перечисленными здесь, в StackOverflow, что эти ячейки содержат значения, а не текст!

Я пытаюсь написать рабочую книгу планирования, которая может сказать мне, является ли мое текущее штатное расписание адекватно. Существует один график с указанием часов каждого сотрудника, 1-го, 1-го, обеденного, обеденного, 2-го, 2-го и двух часовых периодов в отдельных рядах и этих восьми (8) столбцах. повторите семь раз (x7), чтобы учесть каждый день недели. Существует еще одна «аналитическая» таблица с 15-минутным шагом в каждой строке, начиная с 6:30 - 6:45 в понедельник до 5:45 - 18:00 в воскресенье.

В В аналитическом листе я пытался использовать разные формулы, чтобы увеличить время начала и окончания блока на 15 минут, а затем заполнить, чтобы учесть каждый блок за эти семь дней. Формулы, которые я помню, были следующими: при условии, что я вручную ввел 6:30 в ячейку B2:

  • =B2+(15/60/24)
  • =TRUNC(B2+TIME(0,15,0),12)

Проблема становится особенно болезненной, когда я пытаюсь сравнить, является ли запланированное время начала персонала больше или равно времени начала блока, а также когда я пытаюсь сравнить, является ли запланированное время окончания персонала больше или равно концу блока время. Я полагаю, что это связано с незначительными различиями в миллисекундах в последовательном значении рассчитанного времени по сравнению с последовательным значением введенного вручную расписания. Однако цель состоит в том, чтобы запустить расписание с помощью формулы = COUNTIFS (), чтобы определить общее количество сотрудников, присутствующих во время этого блока. До сих пор формула, которую я придумал, выглядит следующим образом (пожалуйста, игнорируйте ссылки на столбцы, потому что я скопировал их в несколько столбцов, чтобы иметь возможность попробовать несколько других методов в этих первых столбцах):

=COUNTIFS(OFFSET('Front Desk'!$B$5:$B$24,0,(MATCH(A2,'Front Desk'!$B$3:$BE$3,0)-1)),"<>",OFFSET('Front Desk'!$B$5:$B$24,0,(MATCH(A2,'Front Desk'!$B$3:$BE$3,0)-1)),"<="&'Front Desk Analysis'!H2,OFFSET('Front Desk'!$C$5:$C$24,0,(MATCH(A2,'Front Desk'!$B$3:$BE$3,0)-1)),"<>",OFFSET('Front Desk'!$C$5:$C$24,0,(MATCH(A2,'Front Desk'!$B$3:$BE$3,0)-1)),">="&'Front Desk Analysis'!L2)+COUNTIFS(OFFSET('Front Desk'!$D$5:$D$24,0,(MATCH(A2,'Front Desk'!$B$3:$BE$3,0)-1)),"<>",OFFSET('Front Desk'!$D$5:$D$24,0,(MATCH(A2,'Front Desk'!$B$3:$BE$3,0)-1)),"<="&'Front Desk Analysis'!H2,OFFSET('Front Desk'!$E$5:$E$24,0,(MATCH(A2,'Front Desk'!$B$3:$BE$3,0)-1)),"<>",OFFSET('Front Desk'!$E$5:$E$24,0,(MATCH(A2,'Front Desk'!$B$3:$BE$3,0)-1)),">="&'Front Desk Analysis'!L2)+COUNTIFS(OFFSET('Front Desk'!$F$5:$F$24,0,(MATCH(A2,'Front Desk'!$B$3:$BE$3,0)-1)),"<>",OFFSET('Front Desk'!$F$5:$F$24,0,(MATCH(A2,'Front Desk'!$B$3:$BE$3,0)-1)),"<="&'Front Desk Analysis'!H2,OFFSET('Front Desk'!$G$5:$G$24,0,(MATCH(A2,'Front Desk'!$B$3:$BE$3,0)-1)),"<>",OFFSET('Front Desk'!$G$5:$G$24,0,(MATCH(A2,'Front Desk'!$B$3:$BE$3,0)-1)),">="&'Front Desk Analysis'!L2)

Пожалуйста, помните о длине и некоторой повторяемости, потому что я пытаюсь учесть любой из четырех интервалов (часы - 1-й перерыв, 1-й перерыв - обеденный перерыв, обеденный перерыв - 2-й перерыв и 2-й перерыв - выходной) Я думаю, что необходимо раскрывать длину функции и что она будет увеличиваться, потому что мне нужно учитывать сотрудников, которые могут или не могут делать перерывы и / или обедать в течение всего дня (представьте кого-нибудь с короткой сменой от 2 до 4 часов) будет просто входить и выходить один раз). Я беспокоюсь о достижении предела функции, если я начну добавлять туда целую кучу сложных вложенных функций ROUND ().

Если мне нужно было подвести итог этой проблемы, я думаю, у меня есть четыре вопроса:

  1. Почему пятнадцатое десятичное число git в последовательных представлениях для 9:30 и 10:30 утра отличается на 1 (1) от серийного значения введенного вручную времени, но десятичного расширения разницы между этими двумя нет? (0.395833333333334000000 - 0.395833333333333000000 = 0.000000000000000000000)
  2. Поскольку разница между двумя значениями, по-видимому, равна нулю, почему сравнение оценивается как ложное?
  3. Если вы собираетесь аргументировать, что это является проблемой вычисления с плавающей запятой, почему не будет меньше ИСТИННЫХ сравнений (поскольку каждое из рассчитанных значений рассчитывается на основе предыдущего значения, составляющего разницу для всех последующих значений), что приводит к исключению вместо нормы?
  4. Немного отличается от topi c из последних трех, но похож ли этот подход на метод, который вы использовали бы для решения общей проблемы планирования, или что бы вы предложили для решения проблемы?

Меня одинаково интересуют ответы на каждый из этих вопросов, поэтому, пожалуйста, не стесняйтесь отвечать на один из них или все (просьба указать соответствующий вопрос # в своем ответе). Заранее всем спасибо!

РЕДАКТИРОВАТЬ: я новичок в задании вопросов о переполнении стека, но я считаю, что можно создать минимальный воспроизводимый пример, если вы выполните следующие действия:

  1. Введите «6:30 AM» + введите ключ в ячейку B2.
  2. Введите «= B2 + (15/60/24)» + введите ключ в ячейку B3.
  3. Нажмите Формат Нажмите кнопку «Рисование», затем щелкните ячейку B2, затем щелкните ячейку B3 (если ячейка формулы отформатирована как время, если шаг 1 был выполнен правильно, в противном случае нажмите «Общие» в раскрывающемся списке «Формат», затем нажмите «Время»).
  4. Выберите ячейку B3, затем перетаскивайте вниз до тех пор, пока формула не станет равной 9:30 или более позднему.
  5. Введите «9:30 AM» + введите клавишу в ячейке столбца C рядом с ячейкой столбца B, которая также содержит значение «9: 30 AM "+ ключ ввода (я думаю, это должна быть строка 14).
  6. В ячейке столбца D, расположенной справа от этих ячеек, введите следующую формулу: =B14=C14 + введите ключ, и вы должны получить FALSE оценка.

Block Analysis Sheet Staff Schedule Sheet

1 Ответ

1 голос
/ 25 марта 2020

Вы сталкиваетесь с извечной проблемой системы данных / времени в Excel, которая, как вы знаете, основана на неточной математике с плавающей запятой.

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

=ROUND(B5,7)

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

Теперь использование множества функций ROUND () в формуле снова и снова далеки от идеала.

Есть несколько обходных путей, но ни один из них не идеален.

1.) Есть лист, который дублирует ваши исходные данные, но с помощью функции ROUND () для каждой соответствующей точки данных. В этом сценарии вы нацелите свои формулы COUNTIFS () на этот промежуточный лист. Это избавит вас от необходимости использовать ROUND () миллион раз внутри каждого COUNTIFS (). Это правда, что ROUND () все еще используется в каждой точке данных ... но он используется только ОДИН РАЗ для каждой точки данных.

2.) Используйте VBA для выполнения ваших вычислений и возврата результатов в ваш аналитический лист. Это можно даже настроить как пользовательскую функцию (UDF), которую можно вызывать непосредственно из таблицы анализа в виде формулы.

...