如何获取开始时间和结束时间的总和值?

问题描述 投票:0回答:2

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 的解决方案。

Dropbox 文件链接

excel

excel vba excel-formula
2个回答
1
投票

我将创建一个 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

结果报告在红色栏中(与您的绿色栏有一些差异,但如果我正确理解您的问题,它应该是正确的)。 enter image description here

为了调用该函数(将其复制到 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
,最后就是函数的返回。


-1
投票

没那么难:答案是 48。

我的意思是,在 Excel 中,一整天是一个单位(例如

01/01/2022 + 1 = 02/01/2022
)。
因此,一小时等于 1/24,半小时(30 分钟)相当于一天的 1/48。

因此,您想向下舍入到 1/48,可以使用这个简单的公式来实现:

=FLOOR(B2*48,1)/48

举一些例子:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.