我有一个看起来像这样的值列表。每隔30分钟,我数据的第一行就会下移并插入一个新的最新值。我希望能够将模型列中所有值的平均值从每天18:30到最顶部的单元格(因此,将最新的具有18:30值的单元格设置为最顶部的单元格)< / p>
任何帮助将不胜感激
使用此命令,我已经能够找到包含所需日期的行:
=MATCH(DATE(YEAR(TODAY()),MONTH(TODAY()),DAY(TODAY()-1))+TIME(18,30,0),AF47:AF4595,0)
所以现在我只需要平均从第1行到该公式的输出即可。我已经尝试过Index(NamedRange,1:3,0),但是没有用
答案 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可以解决您的问题,但我至少看到三个有问题的领域。
您要停止的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中的时间作为今天或昨天的决定日期。
您的程序在列表顶部插入了预测区域日期时间和 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)
时间值通常解析为伪无理数(也称为*重复小数),这在Excel的15个有效数字浮点数学中是无法依赖的。因此,您应该使用00:30:00间隔,通过避免>=
和<=
偏爱时间值偏移>
和<
来确保真正的可比性一秒。 IOW,18:30:00
不等于18:29:59.999
或18: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 单元格范围引用。完整的列引用将不受行/数据插入的影响。