在Excel中平均动态范围

时间:2019-04-25 19:14:25

标签: excel excel-formula

我有一个看起来像这样的值列表。每隔30分钟,我数据的第一行就会下移并插入一个新的最新值。我希望能够将模型列中所有值的平均值从每天18:30到最顶部的单元格(因此,将最新的具有18:30值的单元格设置为最顶部的单元格)< / p>

任何帮助将不胜感激

[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 个答案:

答案 0 :(得分:2)

=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)))

答案 1 :(得分:0)

这很丑陋,而且是一种绕行的方式,但是您可以首先使用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时间的最大可能行

答案 2 :(得分:0)

这是使用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到现在)计算平均值。

答案 3 :(得分:0)

AVERAGEIF / AVERAGEIFS可以解决您的问题,但我至少看到三个有问题的领域。

  1. 您要停止的18:30:00时间可能与预测区域列顶部的同一天。这意味着您不能从AF列顶部的日期开始构造限制日期时间,并添加TIME(18, 30, 0)。如果AF列的顶部在午夜之后和18:30:00之前,则可能需要减去一天。在工作表公式中将TRUE视为1,将FALSE视为零,因此将日期放在AF列的顶部并减去

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

    将根据AF47中的时间作为今天或昨天的决定日期。

  2. 您的程序在列表顶部插入了预测区域日期时间和 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. 时间值通常解析为伪无理数(也称为*重复小数),这在Excel的15个有效数字浮点数学中是无法依赖的。因此,您应该使用00:30:00间隔,通过避免>=<=偏爱时间值偏移><来确保真正的可比性一秒。 IOW,18:30:00不等于18:29:59.99918:30:00.001

因此,如果您的日期时间(例如04/25/2019 15:00)从AF47开始并且每30分钟递增一次,则您需要检查的最远的单元格是AF95(47 + 24 * 2)。

使用AF46中的预测区域和AG46中的 Model ,这是我的努力。

'           |<----------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函数,因此,如果没有流氓值可能会在所引用的范围之上或之下产生误报,则可以将全列引用用于 average_range < / em>和 criteria1_range 单元格范围引用。完整的列引用将不受行/数据插入的影响。