Я использую форму для ввода информации о времени в лист (это только один аспект листа, который используется в других вычислениях). У меня есть старые данные о времени из архивного файла, время которого имеет значение продолжительности, т. е. 28:00:00 или 28 часов. Новые вводимые данные используют время начала, время окончания и количество сотрудников для расчета продолжительности, т. е. 8:00:00 – 12:00:00 * 10 = 40:00:00 (40 часов). ) продолжительность. Моя проблема в том, что у меня есть эта формула
=IF(ISBLANK(I2000) + ISBLANK(J2000), N2000 + O2000, SUMPRODUCT((TIMEVALUE(J2000) - TIMEVALUE(I2000)) - IF(AND(TIMEVALUE(I2000) < TIMEVALUE("12:00 PM"), TIMEVALUE(J2000) > TIMEVALUE("12:30 PM")), 1/48, 0), H2000)))
Эта формула работает хорошо и правильно рассчитывает продолжительность в столбцах N + O, если есть ввод продолжительности времени, или рассчитывает продолжительность отработанного времени (включая 30-минутный перерыв, если применимо). Это работает индивидуально для пронумерованных строк. Если я настрою это на диапазон, я получу ошибку «#VALUE error Параметр TIMEVALUE «не может быть проанализирован до даты/времени». Это привело меня к использованию ARRAYFORMULA, но я все еще получаю ту же ошибку. Это текущая формула, которую я Я использую. Есть ли способ заставить это работать правильно? Мне нужно, чтобы эта функция была в массиве, потому что лист, из которого она фильтрует данные, регулярно сортируется по дате производства, и когда сортировка меняется, она не корректируется. формула для этой строки.
=ARRAYFORMULA(IF(ISBLANK(I2:I) + ISBLANK(J2:J), N2:N + O2:O, SUMPRODUCT((TIMEVALUE(J2:J) - TIMEVALUE(I2:I)) - IF(AND(TIMEVALUE(I2:I) < TIMEVALUE("12:00 PM"), TIMEVALUE(J2:J) > TIMEVALUE("12:30 PM")), 1/48, 0), H2:H)))
Это ваша формула, скорректированная для возврата нескольких строк. Он вернет пустое значение для любой строки, где ни один из i,j,n,o
не содержит значения. Вы можете ограничить диапазоны, установив конечную строку.
=LET(h,H2:H, i,I2:I, j,J2:J, n,N2:N, o,O2:O,
ARRAYFORMULA(
IF(LEN(TEXTJOIN(,1, i, j, n, o)),
IF(ISBLANK(i)+ISBLANK(j), n+o,
h*((j*1-i*1)-(i*1<0.5)*(j*1>25/48)*(1/48))),)))
Или эквивалент
=ARRAYFORMULA(
IF(LEN(TEXTJOIN(,1, I2:I, J2:J, N2:N, O2:O)),
IF(ISBLANK(I2:I)+ISBLANK(J2:J), N2:N+O2:O,
H2:H*((J2:J*1-I2:I*1)-(I2:I*1<0.5)*(J2:J*1>25/48)*(1/48))),)))
Или
=ARRAYFORMULA(
IF(LEN(TEXTJOIN(,1, H2:H)),
IF(ISBLANK(I2:I)+ISBLANK(J2:J), N2:N+O2:O,
H2:H*((TIMEVALUE(J2:J)-TIMEVALUE(I2:I))-(TIMEVALUE(I2:I)<0.5)*
(TIMEVALUE(J2:J)>25/48)*(1/48))),)))
Чисто ради интереса я провел несколько сравнений производительности формул, основанных на x*1 vs. TIMEVALUE(x)
, а также с LET и без него. Результаты в таблице ниже являются репрезентативными, хотя фактические цифры различались в зависимости от итерации.
Некоторые выводы:
x*1
работала примерно в 3,5 раза быстрее, чем TIMEVALUE(x)
.x*1
работала примерно в 1,5 раза быстрее, чем TIMEVALUE(x)
.x
раз оказало сопоставимый эффект на время выполнения, которое также увеличилось бы в тот же раз.Набор данных состоял из 3000 заполненных листов из 5000 строк.
«(несколько)» представляет время выполнения относительно самой медленной формулы в этом столбце.
Время форматируется как minutes:seconds.milliseconds
, поэтому даже самая медленная формула (49 миллисекунд) достаточна для ваших нужд, однако для более сложных формул знание того, какие строительные блоки будут работать в 3 раза быстрее, может иметь значительное, а иногда и экспоненциальное влияние.
Все они работают для строк, которые не имеют данных в I или J (время начала и время окончания), но выводят ошибку «#NAME? - неизвестное имя диапазона: H.» в строках с данными в I. Дополнительно для простоты Формула: J никогда не будет иметь данных, если у меня не будет данных, и у меня никогда не будет данных, если данные есть у N. Единственный критерий, по которому необходимо выполнить поиск, — это «есть ли данные в «I»? Если да, используйте первую формулу (N:N+O:O), в противном случае используйте вторую.
Мне удалось исправить проблему, определив диапазон H в первом экземпляре LET. Спасибо за помощь.
Пожалуйста, отредактируйте свой вопрос, включив в него образец ваших данных в текстовом формате уценки.