Усреднение динамического диапазона в Excel - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть список значений, который выглядит следующим образом.Каждые 30 минут верхняя строка в моих данных сдвигается вниз и вставляется новое последнее значение.Я хотел бы иметь возможность получить среднее значение всех значений в столбце модели с 18:30 до самой верхней ячейки каждый день (так что просто самая последняя ячейка, имеющая значение 18:30, для самой верхней ячейки)

Любая помощь будет принята с благодарностью

[1]: https://i.stack.imgur.com/H2pNc.png

Я смог найти строку, содержащую нужную мне дату, используя это:

=MATCH(DATE(YEAR(TODAY()),MONTH(TODAY()),DAY(TODAY()-1))+TIME(18,30,0),AF47:AF4595,0)

Так что теперь мне просто нужно иметь возможность усреднить от строки 1 до выхода этой формулы.Я пробовал Index (NamedRange, 1: 3,0), но это не сработало

Ответы [ 4 ]

2 голосов
/ 25 апреля 2019
=INDEX(AF:AF,1):INDEX(AF:AF,MATCH(DATE(YEAR(TODAY()),MONTH(TODAY()),DAY(TODAY()-1))+TIME(18,30,0),AF47:AF4595,0))

Хотя я бы изменил вашу формулу, просто чтобы сократить ее ... ваша формула более читабельна. Я бы изменил вашу формулу на:

MATCH(INT(TODAY())-1+TIME(18,30,0),AF:AF,0)

Я предполагал, что все ваши данные были в AF, основываясь на вашей формуле. Настройте АФ в соответствии со столбцом ваших потребностей.

Поскольку INDEX возвращает адрес ячейки, вам просто нужно обернуть диапазон, определенный двумя индексами в функции AVERAGE:

=AVERAGE(INDEX(AF:AF,1):INDEX(AF:AF,MATCH(DATE(YEAR(TODAY()),MONTH(TODAY()),DAY(TODAY()-1))+TIME(18,30,0),AF47:AF4595,0)))
0 голосов
/ 26 апреля 2019

AVERAGEIF / AVERAGEIFS может решить вашу проблему, но я вижу по крайней мере три проблемных области.

  1. Время 18:30:00, на котором вы хотите остановиться, может совпадать или не совпадатьдень как день в верхней части столбца Область прогнозирования .Это означает, что вы не можете построить ограничивающую дату и время дня в верхней части столбца AF и добавить TIME(18, 30, 0).Возможно, вам придется вычесть день, если верхняя часть колонки AF - после полуночи и до 18:30:00.ИСТИНА считается 1 в формуле листа, а ЛОЖЬ считается нулем, поэтому взятие даты в верхней части столбца AF и вычитание

    'Is the time of the datetime in AF47 less than 18:30:00?
    (MOD(AF47, 1)<TIME(18, 30, 0))
    

    сделает решающую дату сегодня или вчера, в зависимости от времени в AF47.

  2. Ваша программа вставляет Область прогнозирования datetime и Model номера вверху списка.В зависимости от метода это может нарушить обычную адресацию диапазона формулы, даже при использовании абсолютных ссылок на строки.Хотя INDIRECT можно использовать для «блокировки» адреса ячейки путем преобразования из текстовой строки, INDEX является более эффективным методом.

    'cell address with 'absolute' row (will change with inserted rows)
    AF$47
    'INDIRECT method (will not change with inserted rows)
    INDIRECT("AF47")
    'better INDEX method (will not change with inserted rows)
    INDEX(AF:AF, 47)
    'range of datetimes in column AF
    INDEX(AF:AF, 47):INDEX(AF:AF, 95)   
    
  3. Значения времени обычно преобразуются в псевдорациональные числа(или * повторяющиеся десятичные дроби '), на которые нельзя полагаться в 15-значной математике Excel с плавающей запятой.По этой причине вы должны использовать интервал 00:30:00, чтобы обеспечить истинное сравнение, избегая >= и <= в пользу > и < против значения времени, смещенного на секунду.IOW, 18:30:00 не равно 18:29:59.999 или 18:30:00.001.

Так что если ваши даты (например, 04/25/2019 15:00) начинаются с AF47 и увеличиваются каждые тридцать минут, тогдаСамая дальняя ячейка, которую вам нужно исследовать, это AF95 (47 + 24 * 2).

с областью прогнозирования в AF46 и Model в AG46 - это мое усилие.

'           |<----------AG47:AG95---------->|  |<----------AF47:AF95---------->|          |<----AF47---->|                        |<----AF47---->|
=AVERAGEIFS(INDEX(AG:AG, 47):INDEX(AG:AG, 95), INDEX(AF:AF, 47):INDEX(AF:AF, 95), ">"&INT(INDEX(AF:AF, 47))+TIME(18, 29, 59)-(MOD(INDEX(AF:AF, 47), 1)<TIME(18, 30, 1)))

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

0 голосов
/ 26 апреля 2019

Вот еще один способ использования AVERAGEIF:

=IF(NOW()-TODAY()<5.5/24,AVERAGEIF(A:A,">" & (TODAY()-5.5/24),B:B),AVERAGEIF(A:A,">" & (TODAY()+18.5/24),B:B))

Сначала он проверяет, наступило ли текущее время до 18:30, а затем вычисляет среднее значение, как описано (с последних 18:30 до настоящего времени)

0 голосов
/ 25 апреля 2019

Это довольно уродливый и окольный способ сделать это, но вы можете сначала определить последний ряд, о котором вы заботитесь, используя sumproduct() и некоторую подлость.А затем добавьте это в свою формулу =Average(), используя Indirect:

=AVERAGE(INDIRECT("B1:B" & SUMPRODUCT((HOUR(A:A)=18)*(MINUTE(A:A)=30)*ROW(A:A))))

Это будет медленным, хотя и охватит все A:A, так что, возможно, сузьте этот диапазон до A1:A1000 или любого другого рядаскорее всего, будет максимально возможная строка для хранения этого 18:30 времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...