Это должно получить нужные результаты. With ... End With block используется для сохранения необходимости писать Worksheets("Raw Data")
все время. Все, что находится внутри блока, которое начинается с .
, относится к Worksheets("Raw Data")
Формула была адаптирована от this answer, но была изменена, чтобы обеспечить более 31 дня. Затем мы используем FillDown method, чтобы скопировать формулу в ячейку М2 вниз к той же строке, что и последней использованной ячейки в столбце К. ссылки в формуле автоматически подстраиваться, чтобы указать на правильную строку
редактировать: обновляется для расчета среднее истекшее время для каждого имени, указанного в столбце A. Это сложнее, потому что мы не можем напрямую усреднять значения, которые мы помещаем в столбец M, потому что мы преобразовали их в текстовый формат. Я решил использовать столбец Z для хранения значений времени, которые нам нужны. Вы можете выбрать любой другой неиспользуемый столбец, и вы можете скрыть столбец, чтобы он не отображался.
Последняя используемая строка хранится в переменной, потому что нам нужно использовать ее в нескольких разных местах. Числовое различие между столбцами K и J сохраняется в столбце Z. Затем текстовое значение в столбце M вычисляется из значения в столбце Z.
Наконец, среднее значение в столбце N рассчитывается с использованием AVERAGEIF function. Это просматривает все используемые строки в столбце A, находит те с тем же именем, что и текущая строка, а затем усредняет все значения из столбца Z для любых соответствующих строк.
Следует отметить один важный момент: все формулы в столбце N должны быть переписаны, если любые строки добавлены или удалены. Это связано с тем, что последнее значение строки, сохраненное в этих формулах, станет неправильным, если строки добавлены или удалены.
With Worksheets("Raw Data")
Dim lngLastUsedRow As Long
lngLastUsedRow = .Cells(.Rows.Count, "K").End(xlUp).Row
.Range("Z2").Formula = "=K2-J2"
.Range("Z2:Z" & lngLastUsedRow).FillDown
.Range("M2").Formula = "=FLOOR(Z2,1)&"":""&TEXT(Z2,""hh:mm"")"
.Range("M2:M" & lngLastUsedRow).FillDown
.Range("N2").Formula = "=AVERAGEIF(A$2:A$" & lngLastUsedRow & ",A2,Z$2:Z$" & lngLastUsedRow &")"
.Range("N2:N" & lngLastUsedRow).FillDown
End With
Это сработало, однако оно не адресует вторую часть о среднем количестве времени, если имена совпадают в столбце A и это время вводится в столбце N – Lilly
. Требуется дополнительная информация о «если имена совпадают в столбце A». Вы имеете в виду одно и то же имя, отображаемое в разных строках столбца A, или вы имеете в виду имя в столбце A, соответствующее имени в другом столбце? – barrowc
Прошу прощения. Я имею в виду то же имя, которое появляется в разных строках столбца A. – Lilly