【问题标题】:Is there a VBA function that allows me to set the number of hours in a day to less than 24 hrs?是否有允许我将一天中的小时数设置为少于 24 小时的 VBA 功能?
【发布时间】:2019-05-29 16:27:05
【问题描述】:

我正在尝试创建一个将通过一组订单运行的 VBA 循环。对于每个订单,我都有一个以小时为单位的持续时间。对于每条记录,它将持续时间添加到开始日期时间并创建结束日期时间。结束日期时间将是下一条记录的开始日期时间等。

我使用 dateadd 函数进行这项工作,但假设生产每天 24 小时进行。

例如,我如何指定我们每天只工作 12 小时,所以任何超过晚上 7 点的工作都会延续到第二天?

我尝试在循环中使用dateadd,它可以工作,但我无法指定一天 12 小时

Set rs = db.OpenRecordset("Select * from Combined_Prod_PO_2_T ORDER BY SEQ")

'Define Changeover master as RefChangeover recordset
Dim EffStart_DateTime As Date
Dim EffEnd_DateTime As Date
Dim FamFrom As String
Dim FamTo As String
Dim changeover As Double
Dim RefChangeover As Recordset

'rs.OpenRecordset
rs.MoveFirst
Do Until rs.EOF
    EffEnd_DateTime = rs.Fields("EFFEND_DATETIME")
    FamFrom = rs.Fields("PRODUCT_FAMILY")
    Debug.Print FamFrom

    rs.MoveNext
    If Not rs.EOF Then        ' making sure that the "next" line exists i.e. stop at the second last line
        FamTo = rs.Fields("PRODUCT_FAMILY")
        Debug.Print FamTo
        Duration = rs.Fields("DURATION")

        Dim sqlcmd As String
        sqlcmd = "select sum(hrs) from (SELECT hrs from AP_Changeover_Master where [FROM] = '" & FamFrom & "'" & " and [TO] = '" & FamTo & "'" & " union select distinct 0 from AP_Changeover_Master) "

        Debug.Print sqlcmd
        Set RefChangeover = db.OpenRecordset(sqlcmd)
        changeover = RefChangeover.Fields(0).Value
        Debug.Print changeover

        'If Not rs.EOF Then

        rs.Edit
        rs("Effstart_datetime") = EffEnd_DateTime
        rs("EffEnd_DateTime") = DateAdd("n", (Duration + changeover) * 60, EffEnd_DateTime)
        rs("changeover") = changeover
        rs.Update
    End If
Loop
rs.Close
Set rs = Nothing

【问题讨论】:

    标签: vba ms-access dateadd


    【解决方案1】:

    当您的 DateTime 值超过 12 小时时,您可以将该值除以 2。

    开始时间 = 2019 年 5 月 1 日上午 8:00 结束时间 = 2019 年 5 月 2 日上午 8:00

    这里花费的总时间是 24 小时。但是由于您每天只工作 12 小时,除以 2 将给您 12 小时。

    如果你每天工作 8 小时,你可以除以 3 只返回 8 小时等等。

    请记住,此解决方案的值将采用十进制格式,而不是时间格式

    Dim ActualTimeTaken as Decimal
    
    rs.Edit
    
    If rs.("YourTimeTaken").value > 12 Then
    
        ActualTimeTaken = rs.("YourTimeTaken").Value / 2
        'Do whatever you need here.
    
    
    End If
    
    rs.Update
    

    【讨论】:

    • 我有一个类似的生产过程,我按照@ChanceFinley 的建议进行操作,我将生产活动的持续时间存储为小数而不是小时数。我的代码会跟踪任何持续时间小于 1 的活动的运行总计,并在运行总计超过 1 时移动到新的一天,然后我从运行总计中减去 1 并继续添加。
    • 作为进一步的建议,您可能会发现@Gustav WorkDayAdd 代码比 DateAdd 更有帮助。他的代码允许调整周末、节假日等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2020-06-29
    • 2010-12-14
    相关资源
    最近更新 更多