Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 根据要减去的分钟数,检查给定时间的上一个时间间隔_Excel_Vba - Fatal编程技术网

Excel 根据要减去的分钟数,检查给定时间的上一个时间间隔

Excel 根据要减去的分钟数,检查给定时间的上一个时间间隔,excel,vba,Excel,Vba,我正在尝试编写一个程序,该程序将获得一个时间,并需要根据需要检查的时间(5分钟、10分钟、30分钟……)输出上一个间隔,但我无法理解逻辑 我想知道一个人在给定的时间表中,每段时间间隔(可以是5分钟或30分钟的时间间隔)工作多少分钟 所以如果有人从17:06工作到00:06。我需要填写从17:05到00:05的每段时间的工作时间。我显示的宏仅在签入/签出与0或乘法器不同时计算,这意味着时间间隔 Private Sub CalculaDesfase(Hora As Date, Inicio As B

我正在尝试编写一个程序,该程序将获得一个时间,并需要根据需要检查的时间(5分钟、10分钟、30分钟……)输出上一个间隔,但我无法理解逻辑

我想知道一个人在给定的时间表中,每段时间间隔(可以是5分钟或30分钟的时间间隔)工作多少分钟

所以如果有人从17:06工作到00:06。我需要填写从17:05到00:05的每段时间的工作时间。我显示的宏仅在签入/签出与0或
乘法器不同时计算,这意味着时间间隔

Private Sub CalculaDesfase(Hora As Date, Inicio As Boolean, Desfase As Byte, Desfasado As Boolean, Multiplicador As Byte)

    Dim HoraFinal As Date
    If Inicio Then
        If Not Minute(Hora) Like "*" & Multiplicador And Not Minute(Hora) Like "*0" Then
            HoraFinal = Hora - TimeSerial(0, Minute(Hora), 0)
            Desfase = Multiplicador - Minute(Hora)
            Desfasado = True
            Hora = HoraFinal
        End If
    Else
        If Not Minute(Hora) Like "*" & Multiplicador And Not Minute(Hora) Like "*0" Then

            Desfase = Multiplicador - Minute(Hora)
            Desfasado = True
            Hora = HoraFinal
        End If
    End If

End Sub
为了便于练习,让我们只关注If的第一部分。我可以在以后推断出
其他

我给你:

Hora=09:02
Inicio=True
Desfase=0
Desfasado=False
multipador=5

这会起作用,会给我:

Hora=09:00
Desfase=3
Desfasado=True


我的问题来了,如果我给任何时间比这更高。我不知道如何给时间,如何得到上一个时间间隔。以前有人遇到过这个问题吗?我在网上搜索过,但很难找到这个特殊情况。

不确定VBA中发生的一切,但您能在VBA中包含这样一个公式吗
=MROUND(G1,“0:05”)
(显然是这个公式思想的VBA实现)

编辑: 我使用VBA的
mod
函数实现了一个VBA版本,该函数进行楼层划分,即--它得到剩余部分:

HoraFinalTemp = Minute(Hora) Mod 5 'This does floor division on 5 to get the REMAINDER
If HoraFinalTemp >= 2.5 Then 'Implement If Else logic on rounding up versus rounding down.
    HoraFinal = Minute(Hora) + 5 - HoraFinalTemp
Else
    HoraFinal = Minute(Hora) - HoraFinalTemp
完整代码:

Private Sub CalculaDesfase(Hora As Date, Inicio As Boolean, Desfase As Byte, 
Desfasado As Boolean, Multiplicador As Byte)

Dim HoraFinal As Date, HoraFinalTemp as Long
If Inicio Then
    If Not Minute(Hora) Like "*" & Multiplicador And Not Minute(Hora) Like "*0" Then
        If HoraFinalTemp >= 2.5 Then 'Implement If Else logic on rounding up versus rounding down.
            HoraFinal = Minute(Hora) + 5 - HoraFinalTemp
        Else
            HoraFinal = Minute(Hora) - HoraFinalTemp
        End If
        Desfase = Multiplicador - Minute(Hora)
        Desfasado = True
        Hora = HoraFinal
    End If
End If
End Sub

经过深思熟虑,我终于找到了答案。如果它能帮助某人:

Private Sub CalculaDesfase(Hora As Date, Inicio As Boolean, Desfase As Byte, Desfasado As Boolean, Multiplicador As Byte)

    Dim HoraFinal As Date
    Dim SiguienteTramo As Date
    HoraFinal = TimeSerial(Hour(Hora), Int(Minute(Hora) / Multiplicador) * Multiplicador, 0)
    Desfase = 0
    If Inicio Then
        If Not Minute(Hora) Like "*" & Multiplicador And Not Minute(Hora) Like "*0" Then
            SiguienteTramo = TimeSerial(Hour(Hora), Application.RoundUp(Minute(Hora) / Multiplicador, 0) * Multiplicador, 0)
            Desfase = Minute(SiguienteTramo) - Minute(Hora)
            Desfasado = True
            Hora = HoraFinal
        End If
    Else
        If Not Minute(Hora) Like "*" & Multiplicador And Not Minute(Hora) Like "*0" Then
            Desfase = Minute(Hora) - Minute(HoraFinal)
            Desfasado = True
            Hora = HoraFinal
        End If
    End If

End Sub

老实说,我不知道你在问什么,你想把时间凑到最近的给定单位吗?因此,你可以问9.02最近的前5分钟=9.00,但9.07会给出9.05?正是@jamHeadart这似乎很棘手是的,尝试使用excel表示时间和舍入将有助于给出更多所需输入/输出的示例。所有这些其他参数意味着什么
Inicio=True Desfase=0 Desfasado=False multipador=True
Sorry@Nick.McDermaid
multipador=True
应该改为
5
。我试图在给定的规则中,使每段时间的分钟数都有效。编辑我的问题并添加更多信息(如果有帮助)。我需要上一个间隔,如H2。H2的公式是什么?如果是相同的,很遗憾的是,我们不会这样做:(为什么不使用
=If(MROUND(G1,0:05)>G1,MROUND(G1,0:05)-“0:05”,MROUND(G1,0:05))
并且您可以使用
Application.WorksheetFunction.MROUND
在VBA中实现,用正确的变量代替范围地址和“0:05”我已经尝试了一段时间了,这个方法很有效:
HoraFinal=TimeSerial(Hour(Hora),Int(Minute(Hora)/multipador)*multipador,0)
@Damian很好地解决了这个问题!你也可以在VBA中使用
mod
函数。请参阅我上面修改的答案。