应计时间计算为48小时,而不是24小时的EXCEL VBA



这让我很紧张。我有一张表,用户可以手动或通过按钮自动输入时间。时间以24小时格式输入在B列中。

按钮代码为:

Sub TimeStamp()
If ActiveCell.Column = 2 Then
ActiveSheet.Unprotect Password:="80286"
With Selection
.Value = VBA.DateTime.Now
.NumberFormat = "hh:mm"
End With
ActiveSheet.Protect Password:="80286"
End If
End Sub

工作表上的公式如下:

START TIME V16=CEILING(IF(TIMEVALUE(TEXT(B16,"hh:mm"))=B16, O9 + B16, B16),0.5/24)获取通过按钮或手动输入的时间。其格式为custom (m/d/yyyy h:mm AM/PM)

CURRENT ENTERED TIME V17=IF('TR2'!B10='TR2'!B11,'TR2'!B11,'TR2'!B10)从公式=IFERROR(LOOKUP(2,1/(B16:B63<>""),B16:B63),"0:00")中获取B列中的最后一个条目,其格式为custom (hh:mm)

END TIME V18=CEILING(IF(TIMEVALUE(TEXT(IF('TR2'!B10='TR2'!B11,'TR2'!B11,'TR2'!B10),"hh:mm"))=IF('TR2'!B10='TR2'!B11,'TR2'!B11,'TR2'!B10), TODAY() + V17, IF('TR2'!B10='TR2'!B11,'TR2'!B11,'TR2'!B10)),0.5/24)获取通过按钮或手动输入的时间。其格式为custom (m/d/yyyy h:mm AM/PM)

累计时间V20=IF(V19>0,MAX(0,(V19-V16)*24),MAX(0,(V18-V16)*24))。格式为general

这一切都很好,我的问题是当时间从m/d/yyyy 0:00m/d/yyyy 23:59时保存工作簿时,这会将结束日期切换到第二天,这很好,因为我对累计时间的所有计算都是24。(7/25/2020 0:00-7/26/20202 0:00(

工作簿将来会打开,所以我必须尝试从单元格V18中删除Today()函数。因此,当保存时,它会使用VBA更改这些值:

Worksheets("TR").Range("V21").Value = Format(CDate(Worksheets("TR").Range("O10").Value), "mm/dd/yyyy")
Worksheets("TR").Range("V19").Formula = "=CEILING(V21 + TIMEVALUE(TEXT(V17,""hh:mm"")),0.5/24)"

O10的公式是CCD_ 15并且被格式化为CCD_。

V19=CEILING(V21 + TIMEVALUE(TEXT(V17,"hh:mm")),0.5/24),显示为CCD_。格式为custom (m/d/yyyy h:mm AM/PM)V20的公式=IF(V19>0,MAX(0,(V19-V16)*24),MAX(0,(V18-V16)*24))将显示48。V21将显示2020-07-26。格式为Date

现在,这就是我的悲伤所在。Excel没有使用7/26/2020 0:0024 24小时,而是将其更改为7/27/2020 0:0048小时。

进一步信息;此工作表也可以使用旧日期。您可以编辑开始日期(手动输入(和结束日期,而不是使用今天,编辑结束日期使用用户表单中的代码:

Private Sub CommandButton1_Click()
If IsDate(Edit_Date.TextBox2.Value) = False Then
MsgBox "Date entered is not valid." & vbNewLine & "Enter date as ""MONTH - END DAY - YEAR.""", , "DATE ERROR"
Exit Sub
End If
ask = Format(CDate(TextBox2.Text), "mmmm/dd/yyyy")
If MsgBox("Change end date to " & ask & "?", vbYesNo, "EDIT END DATE") = vbNo Then Exit Sub
Worksheets("TR").Unprotect Password:="80286"
Worksheets("TR").Range("V21").Value = Edit_Date.TextBox2.Value
Worksheets("TR").Range("V19").Formula = "=CEILING(V21 + TIMEVALUE(TEXT(V17,""hh:mm"")),0.5/24)"
Worksheets("TR").Protect Password:="80286"
Unload Me
End Sub

当我试图修复其中一个以显示正确的累计时间时,另一个函数会中断。有没有更好、更有效的方法来做到这一点?谢谢你抽出时间,我为文字墙道歉,我想尽我所能展示。

我的女朋友给了我一个天才的一击,我不必要地把这个问题复杂化了。她说,如果Today()造成了这个问题,就把它删除,我照做了。

公式和VBA的更改如下,以防有人对解决方案感到好奇。

输入时间按钮:

Sub TimeStamp()
If ActiveCell.Column = 2 Then
ActiveSheet.Unprotect Password:="80286"
With Selection
.Value = Time
.NumberFormat = "h:mm"
End With
ActiveSheet.Protect Password:="80286"
End If
End Sub

开始日期V16=CEILING(IF(TIMEVALUE(TEXT(B16,"h:mm"))=B16, O9 + B16, B16),0.5/24)仍然确定时间是手动输入的还是用按钮输入的,并四舍五入到最接近的半小时。

当前时间V17=CEILING(IF('TR2'!B10='TR2'!B11,'TR2'!B11,'TR2'!B10),0.5/24),从单元格中提取以确定最后一个条目B15=IFERROR(LOOKUP(2,1/(B16:B63<>""),B16:B63),"0:00"),并四舍五入到最接近的半小时。

END DATE V18=V19+V17组合了V19中的日期和V17中的时间。

从开始日期V19=INT(V16)开始的日期。

累计时间V20=MAX(0,(V18-V16)*24)

更改用户表单以更改结束日期:

Private Sub CommandButton1_Click()
If IsDate(Edit_Date.TextBox2.Value) = False Then
MsgBox "Date entered is not valid." & vbNewLine & "Enter date as ""MONTH - END DAY - YEAR.""", , "DATE ERROR"
Exit Sub
End If
ask = Format(CDate(TextBox2.Text), "mmmm/dd/yyyy")
If MsgBox("Change end date to " & ask & "?", vbYesNo, "EDIT END DATE") = vbNo Then Exit Sub
Worksheets("TR").Unprotect Password:="80286"
Worksheets("TR").Range("V19").Value = Edit_Date.TextBox2.Value
Worksheets("TR").Protect Password:="80286"
Unload Me
End Sub

保存代码已删除。

我希望这能帮助到任何需要它的人。我感谢那些仔细阅读并考虑回应的人。

最新更新