这让我很紧张。我有一张表,用户可以手动或通过按钮自动输入时间。时间以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:00
到m/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:00
24 24小时,而是将其更改为7/27/2020 0:00
48小时。
进一步信息;此工作表也可以使用旧日期。您可以编辑开始日期(手动输入(和结束日期,而不是使用今天,编辑结束日期使用用户表单中的代码:
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
保存代码已删除。
我希望这能帮助到任何需要它的人。我感谢那些仔细阅读并考虑回应的人。