Vba 如何在excel中进行时间计算,而不指示结束时间在上午而开始时间在晚上的日期?

Vba 如何在excel中进行时间计算,而不指示结束时间在上午而开始时间在晚上的日期?,vba,excel,Vba,Excel,我计划为我的电子表格做的是(结束时间)-(开始时间),但是,问题是,有时员工超过午夜结束,这可能会破坏计算(例如,凌晨2点-晚上10点=负数)。写下每个单元格的日期是非常乏味的,在我们的例子中这是不实际的。此外,这还会导致更高的人为错误发生率,如果忘记输入日期,它将返回错误的值 进一步描绘我的处境。我有两张工作表:一张显示生产开始时间和生产结束时间,另一张显示设置开始时间和设置结束时间。每生产一行可以有多行设置。因此,如果日期值错误,则值将发生显著变化。(例如,12pm的数值可以转换为0.5,但

我计划为我的电子表格做的是(结束时间)-(开始时间),但是,问题是,有时员工超过午夜结束,这可能会破坏计算(例如,凌晨2点-晚上10点=负数)。写下每个单元格的日期是非常乏味的,在我们的例子中这是不实际的。此外,这还会导致更高的人为错误发生率,如果忘记输入日期,它将返回错误的值

进一步描绘我的处境。我有两张工作表:一张显示生产开始时间和生产结束时间,另一张显示设置开始时间和设置结束时间。每生产一行可以有多行设置。因此,如果日期值错误,则值将发生显著变化。(例如,12pm的数值可以转换为0.5,但2017年1月1日12pm的数值可以约为40000。如果进行计算,则会非常错误)。基本上,生产和设置时间的所有4个时间值在计算时必须一致

下面是我将要执行的计算的VBA代码。对于那些认为它有用的人来说

Total_rows_NHI = Worksheets("Non-hourly Input").Range("A" & Rows.count).End(xlUp).Row
Total_rows_Set = Worksheets("Set-up Input").Range("A" & Rows.count).End(xlUp).Row
ReDim u4(2 To Total_rows_NHI) As Long
ReDim Case1(2 To Total_rows_NHI) As Long
ReDim Case2(2 To Total_rows_NHI) As Long
ReDim Case3(2 To Total_rows_NHI) As Long
ReDim Case4(2 To Total_rows_NHI) As Long

For k4 = 2 To Total_rows_NHI
    For g4 = 2 To Total_rows_Set
        Setup_Start = Worksheets("Set-up Input").Cells(g4, 5)
        Setup_End = Worksheets("Set-up Input").Cells(g4, 6)
        Prod_Start = Worksheets("Non-hourly Input").Cells(k4, 7)
        Prod_End = Worksheets("Non-hourly Input").Cells(k4, 8)
        Start_Quant = Worksheets("Non-hourly Input").Cells(k4, 9)
        End_Quant = Worksheets("Non-hourly Input").Cells(k4, 10)
        If Worksheets("Non-hourly Input").Cells(k4, 1) = Worksheets("Set-up Input").Cells(g4, 1) _
        And Worksheets("Non-hourly Input").Cells(k4, 2) = Worksheets("Set-up Input").Cells(g4, 2) _
        And Worksheets("Non-hourly Input").Cells(k4, 4) = Worksheets("Set-up Input").Cells(g4, 3) _
        And Worksheets("Non-hourly Input").Cells(k4, 5) = Worksheets("Set-up Input").Cells(g4, 4) Then
            u4(k4) = u4(k4) + (Setup_End - Setup_Start) * 24
            If Setup_Start < Prod_Start And Setup_Start < Prod_End And Setup_End > Prod_Start And Setup_End < Prod_End Then
                Case1(k4) = Case1(k4) + (Setup_End - Prod_Start) * 24
            End If
            If Setup_Start > Prod_Start And Setup_Start < Prod_End And Setup_End > Prod_Start And Setup_End > Prod_End Then
                Case2(k4) = Case2(k4) + (Prod_End - Setup_Start) * 24
            End If
            If Setup_Start > Prod_Start And Setup_Start < Prod_End And Setup_End > Prod_Start And Setup_End < Prod_End Then
                Case3(k4) = Case3(k4) + (Setup_End - Setup_Start) * 24
            End If
            If Setup_Start < Prod_Start And Setup_Start < Prod_End And Setup_End > Prod_Start And Setup_End > Prod_End Then
                Case4(k4) = Case4(k4) + (Prod_End - Prod_Start) * 24
            End If
        End If
    Next g4
Next k4

For k4 = 2 To Total_rows_NHI
    Start_Quant = Worksheets("Non-hourly Input").Cells(k4, 9)
    End_Quant = Worksheets("Non-hourly Input").Cells(k4, 10)
    Prod_Start = Worksheets("Non-hourly Input").Cells(k4, 7)
    Prod_End = Worksheets("Non-hourly Input").Cells(k4, 8)
    Worksheets("Non-hourly Input").Cells(k4, 12) = u4(k4)
    Worksheets("Non-hourly Input").Cells(k4, 13) = Case1(k4) + Case2(k4) + Case3(k4) + Case4(k4)
    Worksheets("Non-hourly Input").Cells(k4, 11) = (End_Quant - Start_Quant) / ((Prod_End - Prod_Start) * 24 - (Case1(k4) + Case2(k4) + Case3(k4) + Case4(k4)))
Next k4
Total\u rows\u NHI=工作表(“非每小时输入”).Range(“A”和rows.count).End(xlUp).Row
总计行数集合=工作表(“设置输入”)。范围(“A”和行数。计数)。结束(xlUp)。行
重拨u4(2至总行数)
重拨案例1(2至总行数)
重拨案例2(2至总行数)
ReDim案例3(2至总行数)长度为
ReDim案例4(2至总行数)长度相同
对于k4=2的总行数
对于g4=2的总行数
设置\开始=工作表(“设置输入”)。单元格(g4、5)
设置=工作表(“设置输入”)。单元格(g4,6)
生产开始=工作表(“非小时输入”)。单元格(k4,7)
生产结束=工作表(“非小时输入”)。单元格(k4,8)
开始数量=工作表(“非小时输入”)。单元格(k4,9)
结束数量=工作表(“非小时输入”)。单元格(k4,10)
如果工作表(“非小时输入”).单元格(k4,1)=工作表(“设置输入”).单元格(g4,1)_
和工作表(“非小时输入”)。单元格(k4,2)=工作表(“设置输入”)。单元格(g4,2)_
和工作表(“非小时输入”)。单元格(k4,4)=工作表(“设置输入”)。单元格(g4,3)_
和工作表(“非小时输入”)。单元格(k4,5)=工作表(“设置输入”)。单元格(g4,4),然后
u4(k4)=u4(k4)+(设置结束-设置开始)*24
如果设置开始<生产开始和设置开始<生产结束和设置结束>生产开始和设置结束<生产结束,则
案例1(k4)=案例1(k4)+(设置结束-生产开始)*24
如果结束
如果设置开始>生产开始和设置开始<生产结束和设置结束>生产开始和设置结束>生产结束,则
案例2(k4)=案例2(k4)+(产品结束-设置开始)*24
如果结束
如果设置开始>生产开始和设置开始<生产结束和设置结束>生产开始和设置结束<生产结束,则
案例3(k4)=案例3(k4)+(设置结束-设置开始)*24
如果结束
如果设置开始<生产开始和设置开始<生产结束和设置结束>生产开始和设置结束>生产结束,则
案例4(k4)=案例4(k4)+(生产结束-生产开始)*24
如果结束
如果结束
下一届g4
下一个k4
对于k4=2的总行数
开始数量=工作表(“非小时输入”)。单元格(k4,9)
结束数量=工作表(“非小时输入”)。单元格(k4,10)
生产开始=工作表(“非小时输入”)。单元格(k4,7)
生产结束=工作表(“非小时输入”)。单元格(k4,8)
工作表(“非小时输入”)。单元格(k4,12)=u4(k4)
工作表(“非小时输入”)。单元格(k4,13)=案例1(k4)+案例2(k4)+案例3(k4)+案例4(k4)
工作表(“非小时输入”)。单元格(k4,11)=(结束数量-开始数量)/((生产结束-生产开始)*24-(案例1(k4)+案例2(k4)+案例3(k4)+案例4(k4)))
下一个k4
使用


这将把一个(错误的)负数转换成正确的正数。

(结束时间)-(开始时间)+(结束时间)<(开始时间))谢谢这也行。你知道如何将其纳入VBA逻辑运算中吗?你真的要我记录如何从一个数字中减去另一个数字吗?我的意思是,在这种情况下,它似乎不一样:`如果设置开始>生产开始和设置开始<生产结束和设置结束>生产开始和设置结束<生产结束'。无论如何,我想我可以从这里的答案开始工作。对不起。生产指标的时间和日期计算是一个需要解决的新问题。尽管我不太确定如何将其合并到VBA代码的计算中。特别是对于逻辑操作(例如,设置>生产启动),对不起,我以为您需要为工作表设置一个函数
=MOD(EndTime-StartTime,1)