A、B 和 C 列分别有开始时间、持续时间和数据值。
如何捕获开始时间和结束时间期间的数据,并将这些数据的总和插入到 30 分钟周期(例如 09:00、09:30、10:00、10:30 等)中“输出”栏?
例如,如果Data_A的开始时间为09:15,结束时间为10:15,则其值将在09:00、09:30和10:00返回。
如果在同一个 30 分钟周期内收到超过 1 个数据值,则会对这些值进行求和。 例如,Data_A 的值为 0.1,Data_B 的值为 0.2。 Data_B 的开始时间为 09:50,结束时间为 10:10。 09:00、09:30 和 10:00 的总和值分别为 0.1、0.3 和 0.3。
如果在任何 30 分钟周期内未收到数据,则仅返回零。
以下
SUMIFS
函数可用于对开始时间的值求和,但我无法修改它以考虑持续时间和结束时间。
=SUMIFS($C$2:$C$10,$A$2:$A$10,">="&G2,$A$2:$A$10,"<"&G2+TIME(0,29,59))
我拥有的数据集超过一年的价值,我愿意接受使用单元方程或 VBA 的解决方案。
我将创建一个 VBA 函数
SumBetweenDateTimeLoop
,输入开始日期时间的单元格、开始时间范围、结束时间范围、要添加的值范围和循环分钟(在本例中固定为 30
) .
Public Function SumBetweenDateTimeLoop(this_date As Range, dt_start As Range, dt_end As Range, values As Range, min_loop As Integer)
Dim i As Integer
Dim v As Double
Dim d1 As Date, d2 As Date
Dim v1 As Date, v2 As Date
If dt_start.Count <> dt_end.Count Or values.Count <> dt_end.Count Or dt_start.Count <> values.Count Then
Call MsgBox("Length of ranges have to be the same.")
Exit Function
End If
v = 0
For i = 1 To dt_start.Count
d1 = CDate(dt_start(i))
d2 = CDate(dt_end(i))
v1 = CDate(this_date)
v2 = DateAdd("n", min_loop, v1)
If Not ((d1 < v1 And d2 < v1) Or (d1 > v2 And d2 > v2)) Then
v = v + CDbl(values(i))
End If
Next i
SumBetweenDateTimeLoop = v
End Function
结果报告在红色栏中(与您的绿色栏有一些差异,但如果我正确理解您的问题,它应该是正确的)。
为了调用该函数(将其复制到 VBA 中的模块后),请在所需的 Excel 单元格中键入以下请求。
=SumBetweenDateTimeLoop(G2;A$2:A$10;E$2:E$10;C$2:C$10;30)
这个想法是定义周期的极值,因此将
v1
定义为列 G
和 v2 = v1+min_loop
中的日期时间。
然后对范围的单元格(Excel 列
A
、E
和 C
)进行循环,定义日期时间的极值(d1
开始日期时间位于列 A
中,d2
结束日期时间位于列E
)并检查d1
和d2
是否都小于v1
或大于v2
。
如果不满足这个条件,则说明至少有一部分时间在期望的周期内,然后将相对值添加到增量参数v
,最后就是函数的返回。